├── .gitignore ├── ChangeLog.md ├── LICENSE ├── README.md ├── Replicator.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ ├── leslie.xcuserdatad │ │ └── IDEFindNavigatorScopes.plist │ │ └── lesliehelou.xcuserdatad │ │ └── IDEFindNavigatorScopes.plist ├── xcshareddata │ └── xcschemes │ │ └── jamf-migrator.xcscheme └── xcuserdata │ ├── ladmin.xcuserdatad │ └── xcschemes │ │ ├── jamf-migrator.xcscheme │ │ └── xcschememanagement.plist │ ├── leslie.xcuserdatad │ └── xcschemes │ │ ├── jamf-migrator - backup mode.xcscheme │ │ ├── jamf-migrator debug.xcscheme │ │ ├── jamf-migrator headless migrate.xcscheme │ │ ├── jamf-migrator help.xcscheme │ │ ├── jamf-migrator ldap.xcscheme │ │ └── xcschememanagement.plist │ └── lesliehelou.xcuserdatad │ └── xcschemes │ ├── Jamf Migrator.xcscheme │ ├── jamf-migrator.xcscheme │ └── xcschememanagement.plist └── Replicator ├── Alert.swift ├── AppDelegate.swift ├── Assets.xcassets ├── AppIcon.appiconset │ ├── Contents.json │ ├── icon_128x128.png │ ├── icon_128x128@2x.png │ ├── icon_16x16.png │ ├── icon_16x16@2x.png │ ├── icon_256x256.png │ ├── icon_256x256@2x.png │ ├── icon_32x32.png │ ├── icon_32x32@2x.png │ ├── icon_512x512.png │ └── icon_512x512@2x.png ├── Contents.json ├── computer64.imageset │ ├── Contents.json │ └── computer64.png ├── password64.imageset │ ├── Contents.json │ └── password64.png └── siteIcon.imageset │ ├── Contents.json │ └── siteIcon.png ├── Awake.swift ├── Base.lproj ├── Main.storyboard └── Preferences.storyboard ├── Cleanup.swift ├── CreateEndpoints.swift ├── Credentials.swift ├── CustomSeparator.swift ├── EndpointXml.swift ├── ExistingObjects.swift ├── ExportItem.swift ├── Globals.swift ├── Headless.swift ├── HelpViewController.swift ├── IconDelegate.swift ├── Info.plist ├── JamfPro.swift ├── Jpapi.swift ├── Json.swift ├── JsonObjects.swift ├── LastUser.swift ├── LoggerExtension.swift ├── ObjectDelegate.swift ├── Package.swift ├── PackagesDelegate.swift ├── PatchDelegate.swift ├── PatchManagementApi.swift ├── Preferences └── PreferencesViewController.swift ├── PrefsWindowController.swift ├── RemoveData.swift ├── RemoveObjects.swift ├── Replicator.entitlements ├── SaveDelegate.swift ├── SecurityScopedBookmarks.swift ├── Sites.swift ├── SourceDestVC.swift ├── SummaryViewController.swift ├── TimeDelegate.swift ├── Utilities.swift ├── VersionCheck.swift ├── ViewController.swift ├── WriteToLog.swift ├── XmlDelegate.swift ├── app.png ├── copy.png ├── export.png ├── images ├── Screenshot 2024-11-18 at 12.35.39 PM.png ├── Screenshot 2024-11-18 at 12.36.14 PM.png ├── allowAccess.png ├── appPrefs.png ├── computerPrefs.png ├── copyPrefs.png ├── exportDeleted.png ├── exportPrefs.png ├── exportTo.png ├── migrator2.1-old.png ├── migrator2.1.png ├── migrator2.5a.png ├── migrator2.5b.png ├── migrator2.png ├── migrator3.png ├── migrator3Policies.png ├── open.png ├── passwordPrefs.png ├── removeServer.png ├── selectiveFilter.png ├── sitePrefs.png ├── summary1.png └── summary2.png ├── index.html ├── settings.plist └── siteIcon.png /.gitignore: -------------------------------------------------------------------------------- 1 | **/Notes/ 2 | Notes 3 | Bookmarks.* 4 | **/.DS_Store 5 | *.xcuserstate 6 | *.xcbkptlist 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Jamf Professional Services 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Replicator (formerly known as Jamf Migrator) 3 | 4 | ![GitHub release (latest by date)](https://img.shields.io/github/v/release/jamf/Replicator?display_name=tag) ![GitHub all releases](https://img.shields.io/github/downloads/jamf/Replicator/total) ![GitHub latest](https://img.shields.io/github/downloads/jamf/Replicator/latest/total) 5 | ![GitHub issues](https://img.shields.io/github/issues-raw/jamf/Replicator) ![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/jamf/Replicator) ![GitHub pull requests](https://img.shields.io/github/issues-pr-raw/jamf/Replicator) ![GitHub closed pull requests](https://img.shields.io/github/issues-pr-closed-raw/jamf/JamfMigrator) 6 | 7 | 8 | Download [Replicator](https://github.com/jamf/Replicator/releases/latest/download/Replicator.zip)
9 | 10 | A tool to synchronize configurations between Jamf Pro servers. Export configurations and save locally, then upload them to another Jamf Pro server. You can also use the tool to delete configurations from a server. 11 | 12 | ![image](./Replicator/images/migrator2.png "Replicator") 13 | 14 | Migrate items from one Jamf server, or XML file(s), to another. If an item (based on name) within a category exists on both source and destination, the destination item will be updated with values from the source server. 15 |

16 | 17 | Username and password fields can be hidden/shown using the disclosure tringle on the left. 18 | 19 | ![alt text](./Replicator/images/migrator2.1.png "Replicator") 20 | 21 | When replicating files be sure to open the 'raw' folder. 22 | ![alt text](./Replicator/images/migrator2.5a.png "Files") 23 | 24 | Devices (computers and iOS), Groups, Policies, and Configuration Profiles can be targeted to a particular site.
25 | ![alt text](./Replicator/images/migrator2.5b.png "Files") 26 |

27 | 28 | Servers can be removed from the (source/destination) list by holding down the option key while selecting the server. A warning will be presented to verify the removal.
29 | ![alt text](./Replicator/images/removeServer.png "Files") 30 |

31 | 32 | **Limitations/requirements to be aware of:** 33 | 34 | * Passwords can not be extracted through the API which impacts replicating distribution points, computer management account, account used for LDAP. A password can be supplied for each service account, but credentials may need to be reset on the destination server for more complex configurations. 35 | * Certificate used for LDAPS does not replicate. 36 | * Icons associated with Mac App Store apps are not replicated as the API does not support it. 37 | * Only AFP and SMB shares can be replicated. 38 | * Patch management is not available through the API impacting smart groups dependent on patch management extension attributes. 39 | * If endpoints (computers, policies, configuration profiles...) have duplicate names on the source server issues will arise if the app is used to update those items from the source to destination server. As each item is migrited it will overwrite the previous item with the same name. 40 | * Replicating smart/static groups with criteria containing groups will fail if the parent group tries to replicate before the group in the criteria. Replicating groups several times should allow all the nested groups to replicate before the parent group. 41 | * Institutional disk encryptions that contain the private key cannot be replicated. 42 | * Approved System/Kernel Extension payloads do not replicate properly. Display names are dropped and additional keys/values are added by the Jamf API that results in a corrupt profile and failure in profile deployment. 43 | * Policies - The Software Update payload does not replicate. Also, within the packages payload, setting for the distribution point will not replicate. 44 | * Objects with trailing spaces in the name will replicate once but the process of uploading through the API removes those spaces. This causes issues re-replicating those objects as the names no longer match. 45 | * Users and usergroups used in policy limitations/exclusions do not replicate as the API does not provide that information. 46 | * Packages 50 | * Saving of objects whos name contains a : (colon) will be saved using a ; (semi-colon). 51 | * Enabled state of mobile device applications is not handled in the API, as a result all replicated mobile device applications will be enabled on the destination server whether it is enabled or disabled on the source. 52 | * Configuration Profiles -> Applications & Custom Settings -> External Applications settings will not replicate/export properly. The form generated by the custom schema is not replicated/exported, rather the current settings from the form are replicated/exported. The replicated profile will show the current setting for the external applicaton under the 'Upload' section within Application & Custom Settings. 53 | * Apps from the Jamf App Catalog are not listed under the macapplications (classic API) endpoint. This may cause issues with other objects, like smart computer groups. 54 | * __Patch Management:__ When replicating packages and patch policies may still be replicating after patch policy software titles are shown to have been completed. Better monitoring will appear in later updates. 55 | 56 |
57 | 58 | The Selective tab provides the ability to select a subset of (or all) items within a collection of objects. For example you might only want to transfer 4 scripts from a larger pool of existing scripts. 59 | ![alt text](./Replicator/images/migrator3.png "Selective") 60 | 61 | 62 | Also, policies may have their dependencies checked/replicated using the Include Dependencies button. Only 'top-level' dependencies are checked. i.e. if the scope is being replicated and contains nested computer groups or groups assigned to a site that doesn't exist on the destination server the policy replication will likely fail. 63 | ![alt text](./Replicator/images/migrator3Policies.png "Selective") 64 | Note: The ID of any object can be seen my hovering the mouse over the object. 65 | 66 | 67 | Files exported using Replicator can be imported into another Jamf Pro server. Be sure to open the 'raw' folder when importing. 68 | 69 | ![alt text](./Replicator/images/open.png "Open") 70 |

71 | **Important:** Trimmed XML files cannot be used as they are missing data required for the replication. 72 |

73 | 74 | **Preferences:** 75 | 76 | * macOS Configuration Profiles 77 | * macOS Applications 78 | * Restrictions 79 | * Policies 80 | * Mobile Device Configuration Profiles 81 | * Mobile Device Applications 82 | * Static Computer Groups 83 | * Static Mobile Device Groups 84 | * Static User Groups 85 | 86 | In addition to scoping options the following are available: 87 | * Policies can be copied in a disabled state 88 | * Able to copy only items missing from the destination server - create only 89 | * Able to copy only items currently on the destination server - update only
90 | 91 | ** object name is used to determine whether or not it is on the destination server ** 92 | 93 | ![](./Replicator/images/copyPrefs.png) 94 |

95 | Options to export XML from the source server are also available. 96 | 97 | ![](./Replicator/images/exportPrefs.png) 98 |

99 | * Raw Source XML gives you the XML from the source server before any modifications, like removing the id tag(s) and value(s). 100 | * Trimmed Source XML give you the XML that is sent to the destination server. 101 | * Save only saves the XML files and does not send them to the destination server. 102 | * Save the object XML either with or without its scope. Unchecked removes the scope. 103 | * Note Save only and Raw Source XML options should not be selected when File Import is being used. 104 | 105 | Options for replicating object(s) (groups, policies, and configuration profiles) to a particular site can be set. 106 | 107 | ![](./Replicator/images/sitePrefs.png) 108 |

109 | * When copying an object to a site, the site name is appended to the object name. 110 | * Groups with groups as a criteria will not copy properly, moving them should be fine. 111 | 112 | The number of concurrent API operations (from 1 to 5), sticky sessions (when available), forcing basic authentication, color scheme, number of log files to retain, and number of servers can be remembered. 113 | 114 | ![](./Replicator/images/appPrefs.png) 115 |

116 | Migrated computers can show as managed by setting the management account. 117 | 118 | ![](./Replicator/images/computerPrefs.png) 119 |

120 | Set a password for following replicated service accounts; bind, ldap, file share Read/Write, and file share Read-only. 121 | 122 | ![](./Replicator/images/passwordPrefs.png) 123 | 124 | Note, the same password will be applied if you have multiple binds, or ldap servers, or file shares coonfigured. 125 |

126 | **Migration Summary:** 127 | 128 | * To get details on how many items were created/updated or failed to replicate type ⌘S, or select Show Summary under the File menu. 129 | 130 | ![alt text](./Replicator/images/summary1.png "Summary") 131 | 132 | * Additional information about each count can be obtained by clicking on the number. For example, if we want to see a list of the 28 failed scripts, click on the 28. 133 | 134 | ![alt text](./Replicator/images/summary2.png "Summary Details") 135 | 136 | 137 | Information about successes/failures can be found in the log, located in 138 | 139 | ``` 140 | ~/Library/Containers/com.jamf.Replicator/Data/Library/Logs/Replicator/_