@@ -58,8 +58,12 @@ struct Plist2Profile: ParsableCommand {
58
58
help: " sets the scope for the profile to 'User' (otherwise scope is 'System') "
59
59
)
60
60
var userScope = false
61
-
62
- // TODO: option to create a modern or mcx profile
61
+
62
+ @Flag (
63
+ name: . customLong( " mcx " ) ,
64
+ help: " creates the profile in macx format (default: modern) "
65
+ )
66
+ var mcx = false
63
67
64
68
// MARK: variables
65
69
@@ -121,26 +125,36 @@ struct Plist2Profile: ParsableCommand {
121
125
}
122
126
}
123
127
124
- func createModernPayload( plistPath: String ) throws -> NSDictionary {
125
- let payloadUUID = UUID ( )
126
- // determine filename from path
127
- let plistURL = URL ( fileURLWithPath: plistPath)
128
- let plistname = plistURL. deletingPathExtension ( ) . lastPathComponent
129
- guard let payload = try ? NSMutableDictionary ( contentsOf: plistURL, error: ( ) )
130
- else {
131
- try exit ( " file at ' \( plistPath) ' might not be a plist! " , code: 65 )
132
- }
128
+ func createModernPayload( name: String , plist: NSDictionary ) throws -> NSDictionary {
129
+ let mutablePayload = plist. mutableCopy ( ) as! NSMutableDictionary
133
130
// payload keys
134
- payload [ " PayloadIdentifier " ] = plistname
135
- payload [ " PayloadType " ] = plistname
136
- payload [ " PayloadDisplayName " ] = displayName
137
- payload [ " PayloadUUID " ] = payloadUUID . uuidString
138
- payload [ " PayloadVersion " ] = payloadVersion
131
+ mutablePayload [ " PayloadIdentifier " ] = name
132
+ mutablePayload [ " PayloadType " ] = name
133
+ mutablePayload [ " PayloadDisplayName " ] = displayName
134
+ mutablePayload [ " PayloadUUID " ] = UUID ( ) . uuidString
135
+ mutablePayload [ " PayloadVersion " ] = payloadVersion
139
136
140
137
if !organization. isEmpty {
141
- payload [ " PayloadOrganization " ] = organization
138
+ mutablePayload [ " PayloadOrganization " ] = organization
142
139
}
143
- return payload
140
+ return mutablePayload
141
+ }
142
+
143
+ func createMCXPayload( name: String , plist: NSDictionary ) throws -> NSDictionary {
144
+ let mcxPayload = NSMutableDictionary ( )
145
+ mcxPayload [ " PayloadIdentifier " ] = name
146
+ mcxPayload [ " PayloadType " ] = " com.apple.ManagedClient.preferences "
147
+ mcxPayload [ " PayloadDisplayName " ] = displayName
148
+ mcxPayload [ " PayloadUUID " ] = UUID ( ) . uuidString
149
+ mcxPayload [ " PayloadVersion " ] = payloadVersion
150
+
151
+ let prefSettings = NSDictionary ( object: plist, forKey: " mcx_preference_settings " as NSString )
152
+ let prefArray = NSArray ( object: prefSettings)
153
+ let forcedDict = NSDictionary ( object: prefArray, forKey: " Forced " as NSString )
154
+ let domainDict = NSDictionary ( object: forcedDict, forKey: name as NSString )
155
+ mcxPayload [ " PayloadContent " ] = domainDict
156
+
157
+ return mcxPayload
144
158
}
145
159
146
160
// MARK: run
@@ -167,9 +181,19 @@ struct Plist2Profile: ParsableCommand {
167
181
let payloads = NSMutableArray ( )
168
182
169
183
for plistPath in plistPaths {
170
- let payload = try createModernPayload ( plistPath: plistPath)
171
- payloads. add ( payload)
172
184
185
+ // determine filename from path
186
+ let plistURL = URL ( fileURLWithPath: plistPath)
187
+ let plistname = plistURL. deletingPathExtension ( ) . lastPathComponent
188
+ guard let plistdict = try ? NSDictionary ( contentsOf: plistURL, error: ( ) )
189
+ else {
190
+ try exit ( " file at ' \( plistPath) ' might not be a plist! " , code: 65 )
191
+ }
192
+
193
+ let payload = mcx ? try createMCXPayload ( name: plistname, plist: plistdict)
194
+ : try createModernPayload ( name: plistname, plist: plistdict)
195
+
196
+ payloads. add ( payload)
173
197
}
174
198
175
199
// insert payloads array
0 commit comments