@@ -58,8 +58,12 @@ struct Plist2Profile: ParsableCommand {
5858 help: " sets the scope for the profile to 'User' (otherwise scope is 'System') "
5959 )
6060 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
6367
6468 // MARK: variables
6569
@@ -121,26 +125,36 @@ struct Plist2Profile: ParsableCommand {
121125 }
122126 }
123127
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
133130 // 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
139136
140137 if !organization. isEmpty {
141- payload [ " PayloadOrganization " ] = organization
138+ mutablePayload [ " PayloadOrganization " ] = organization
142139 }
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
144158 }
145159
146160 // MARK: run
@@ -167,9 +181,19 @@ struct Plist2Profile: ParsableCommand {
167181 let payloads = NSMutableArray ( )
168182
169183 for plistPath in plistPaths {
170- let payload = try createModernPayload ( plistPath: plistPath)
171- payloads. add ( payload)
172184
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)
173197 }
174198
175199 // insert payloads array
0 commit comments