果酱同步
用于在文件夹、Jamf Pro 文件共享分发点和 Jamf Pro JDCS2 分发点之间传输文件以及更新 Jamf Pro 服务器上的包的实用程序。
指示
有关运行 Jamf Sync 的帮助,请参阅 JamfSync/Resources/Jamf Sync User Guide.pdf,或者在运行“Jamf Sync.app”时,单击“帮助”/“Jamf Sync 用户指南”。
特征
- 处理多个 Jamf Pro 服务器,允许将包从测试服务器移动到生产服务器,反之亦然。
- 可以在 Cloud DP、文件共享 DP 或本地文件夹之间复制文件。
- 可以选择从目标 DP 中删除源 DP 上不存在的文件。
- 可以选择删除 Jamf Pro 服务器上不在源 DP 上的包。
- 可以将本地文件夹视为分发点,允许上传和下载多个包。
- 处理自动为包创建校验和。
- 命令行参数允许脚本同步。
描述
设置
- 添加 Jamf Pro 服务器和/或文件夹。
- 文件夹被视为分发点,允许在其他分发点或文件夹之间进行同步。
- 单击关闭时,如果进行了更改,它将联系每个 Jamf Pro 服务器以获取分发点,并使用它们来填充源和目标选择列表。
添加 Jamf Pro 服务器
- 用户可以提供 Jamf Pro 服务器 URL 以及用户 ID 和密码或客户端 ID 和客户端密码,具体取决于是否使用标准身份验证或 OAuth(API 角色和客户端)。
- 可以点击“测试”按钮来验证 Jamf Pro 服务器是否可以通过设置进行访问。
- 这将自动添加云 DP 服务器以及 Jamf Pro 服务器中的所有文件共享 DP。
- 设置存储在本地。 Jamf Pro 和文件共享分发点的凭据将安全地存储在钥匙串中。
添加本地文件夹
- 允许添加本地文件夹,该文件夹将作为源或目标的选项呈现给用户。文件夹被视为分发点,允许其他分发点或文件夹之间的同步。它将包含名称和目录位置。该名称将默认为目录名称。
编辑
- 允许您编辑选定的任何项目。如果未选择任何内容,则编辑按钮将被禁用。
删除
- 允许您删除选定的任何项目。删除前会提示确认。如果未选择任何内容,则删除按钮将被禁用。
主视图
- 在选择源和目标并且源和目标不同之前,“同步”按钮将呈灰色显示。这将从源到目的地同步。
- 即使目标上的校验和匹配,“强制同步”复选框也会导致复制所有源项目。如果未选中,则仅同步添加或更改的项目。
- 有一个源选择器和目标选择器,每个选择器都包含所有文件夹和分发点的列表。最初选择“--”,表示没有选择。
- 所选源分发点上的文件列表位于左侧,目标分发点上的文件列表位于右侧。
- 当同时选择源和目标分发点时,“同步”列将显示一个图标,指示同步期间将发生的情况。当同步图标有颜色时,表示将参与同步。如果是黑白的就不会了。如果要添加,则同步图标将有一个 +;如果要更新,则有一个复选标记;如果将从目标中删除(如果他们在单击“同步”后选择这样做),则有一个 X;如果文件同时存在,则有一个 =。源和目标匹配。
- 可以选择源列表中的项目。如果有选定的项目,则仅同步这些文件,并且不会从目标中删除任何文件。如果未选择任何文件,则按下“同步”按钮时,系统将提示您是否删除不在源上的项目。如果您选择“是”,则目标上显示红色 x 符号的任何文件都将从 Jamf Pro 的目标和包列表中删除。
命令行参数
注意:首先运行不带参数的 JamfSync 以添加 Jamf Pro 服务器和/或文件夹。 Jamf Pro 服务器和分发点的密码必须存储在钥匙串中,以便通过命令行参数进行同步。
用法: JamfSync [(-s | --srcDp) ] [(-d | --dstDp) ] [(-f | --forceSync)] [(-r | --removeFilesNotOnSource)] [(-rp | --删除PackagesNotOnSource)] [-p | --progress] JamfSync [-h | --progress] JamfSync --help] JamfSync [-v | --help] JamfSync - 版本]
-s --srcDp: The name of the source distribution point or folder.
-d --dstDp: The name of the destination distribution point or folder.
-f --forceSync: Force synchronization of all files even if they appear to match on both the source and destination.
-r --removeFilesNotOnSource: Delete files on the destination that are not on the source. No delete is done if ommitted.
-rp --removePackagesNotOnSource: Delete packages on the destination's Jamf Pro instance that are not on the source. No delete is done if ommitted.
-p --progress: Show the progress of files being copied.
-v --version: Display the version number and build number.
-h --help: Shows this help text.
注意:如果多个 Jamf Pro 实例上的分发点名称相同,请使用“dpName:jamfProName”作为名称。
示例: "/Applications/Jamf Sync.app/Contents/MacOS/Jamf Sync" -srcDp localSourceName -dstDp targetSourceName --removeFilesNotOnSource --progress "/Applications/Jamf Sync.app/Contents/MacOS/Jamf Sync" -s "JCDS :阶段”-d“JCDS:Prod”-r -rp -p“/Applications/Jamf Sync.app/Contents/MacOS/Jamf Sync" -s localSourceName -d destinationSourceName
源代码概述
源代码位于几个组中。
- 模型包含与 UI 不直接相关的类。
- Model 组内部是 ViewModels,它与 UI 关系更密切,但与 UI 没有明确的联系。通常,当视图模型中的字段发生更改时,关联的 UI 将自动重新绘制。
- 资源包含程序使用的图像和其他文件。
- UI 包含程序中显示的所有视图的 SwiftUI 文件,以及 JamfSyncApp(程序执行开始的地方)。
- 实用程序包含执行更一般任务的类。
模型
模型组中的文件用于跟踪和处理所使用的数据。
数据模型:这代表了几乎所有事物的状态,并包含数据和作用于该数据的函数。它负责从核心存储加载数据并加载分发点的数据。它已发布用于控制 UI 的变量。
SavableItem:可保存的任何内容的基类(JamfProInstance 和FolderInstance)。这些项目存储在核心数据中。只要用户允许,密码不会存储在核心数据中,而是存储在钥匙串中。 loadDps 函数由特定子类重写,负责加载与该项目关联的所有分发点。 getDps 函数返回与该项目关联的分发点。
- JamfProInstance - 这代表 Jamf Pro 实例,负责加载必要的数据并与 Jamf Pro API 进行通信。它还为与 Jamf Pro 服务器关联的分发点创建并加载数据。它还从 Jamf Pro 服务器加载和存储包信息。
- FolderInstance - 这代表计算机上的本地目录。它创建一个单个FolderDp,在同步期间充当分发点。
DistributionPoint:所有DistributionPoint 对象(FileShareDp、Jcds2Dp 和FolderDp)的基类 copyFiles 函数是同步的主要函数。它调用由特定分发点对象覆盖的其他函数。
- FileShareDp - 文件共享分发点的特定分发点对象。
- Jcds2Dp - 云分发点的特定分发点对象。
- FolderDp - 文件夹分发点(表示本地文件夹)的特定分发点对象。
其他对象:
- DpFile - 存储单个文件的信息。它还包含维护和比较其校验和的函数。
- DpFiles - 存储文件列表。它具有帮助查找特定文件、更新文件的校验和以及更新指示文件状态的每个文件的状态的功能。
- 校验和 - 表示任何类型的校验和(通常为 SHA-512)
- 校验和 - 保存校验和对象列表的对象,并具有可用于校验和集合的函数。
视图模型
ViewModels 组中的文件用于跟踪和处理所使用的数据。发布的变量将导致关联的视图重绘。 * LogViewModel - 用于日志视图和屏幕底部显示的消息。 * SetupViewModel - 用于设置视图。 * PackageListViewModel - 用于主视图上的源文件和目标文件列表。 * DpFileViewModel - 用于 PackageListViewModel 中的每个文件。它有一个指向特定 DpFile 实例的指针,并具有 UI 特定字段。 * DpFilesViewModel - 具有 DpFileViewModel 对象数组,用于将文件存储在 PackageListViewModel 对象中。
用户界面
UI 组中的文件是用户界面的 SwiftUI 文件。 DataModel 中的数据用于控制视图。每当带有 @Published 的属性发生更改时,都会导致使用这些字段的任何视图重新绘制。
- AboutView:显示版本和其他信息的视图。
- ChecksumView:显示为文件计算的校验和,并在鼠标悬停时显示带有实际校验和的字符串。
- ConfirmationView:用于确认各种事情的视图
- ContentView:驱动一切的主视图。
- FileSharePasswordView:用于在文件共享密码尚未存储在钥匙串中时提示输入文件共享密码。
- FolderView:添加或编辑文件夹时的视图
- HeaderView:ContentView 的顶部,包含“同步”按钮和“强制同步”复选框。
- JamfProPasswordView:当 Jamf Pro 密码尚未存储在钥匙串中时,用于提示输入 Jamf Pro 密码。
- JamfProServerView:添加或编辑 Jamf Pro 服务器时的视图
- JamfSyncApp:保存 ContentView 的主应用程序
- LogMessageView:在主视图底部简要显示日志消息的视图。
- LogView:显示日志消息的视图
- PackageAnimationView:同步期间显示动画的视图。
- PackageListView:主视图上包列表的视图。
- SavableItemListView:“设置”视图上的列表视图
- SetupView:设置的主视图
- SourceDestinationView:MainView 的一部分,包含源和目标选择器以及文件列表。
- SynchronizationProgressView:显示正在进行的同步进度的同步视图。这也会在onAppear中启动同步。
公用事业
实用程序组中的文件是用于处理数据的帮助程序类,与 UI 没有直接连接。
- ArgumentParser:解析命令行参数(如果有)。
- CloudSessionDelegate:当文件传入和传出云时,处理 URLSessionTaskDelegate 和 URLSessionDownloadDeleatedelegate 函数。
- FileHash:创建文件哈希值。这是一个参与者类,因此一个函数一次只会处理一个文件,以防止冲突。
- 文件共享:处理文件共享的安装和卸载。这是一个演员类,以避免冲突。
- FileShares:安装共享或返回已安装的文件共享。并卸载所有已安装的文件共享。这是一个演员类,以避免冲突。
- KeychainHelper:协助存储和检索钥匙串项目。
- View+NSWindow:用于将视图显示为其自己的窗口。
- UserSettings:读取、保存和跟踪写入用户设置的数据。
扩展 JamfSync 支持的分发点类型
添加直接云连接的分发点会很方便,例如 Rackspace、Amazon Web Services、Akamai。为了支持其中一项,需要执行以下操作:
- 创建一个继承SavableItem(如FolderInstance)的对象,并为需要提供的每条信息添加成员变量。
- 创建一个继承自 DistributionPoint 的对象。有关此示例,请参阅 Jcds2Dp。请参阅FolderItem 以了解应如何创建和返回它(如FolderDp 一样)。
- 在 StoredSettings.xcdatamodeld 中创建一个实体并将父级设置为 SavableItemData。
- 修改SetupView以能够创建、编辑和删除新项目。
- 添加一个新对象(例如 JamfProServerView),以便用户可以输入任何必要的信息。
- 使用 KeychainHelper 将凭据保存到钥匙串并根据需要添加其他服务名称(如 fileShareServiceName)。
- 确保现有单元测试通过并添加其他单元测试以覆盖您所做的更改。
尚需改进
- 如上所述,创建对其他云分发点(如 Rackspace、Amazon Web Services、Akamai)的支持。
- 取消动作需要改进。对于FileShareDps 和FolderDps,它不会取消当前正在传输的文件,因此可能需要相当长的时间才能取消。
- 使列表可按任何列排序。
- 使列表列足够大。
- 添加更多单元测试覆盖范围(特别是完成 Jcds2DpTests 并为 CommandLineProcessing 添加单元测试)。
- 可以进行改进以使其更易于访问。
- 最好使其可本地化并开始添加一些本地化内容。
贡献
要进行本地开发,请为此存储库创建一个分支,在您的分支上创建一个以您正在改进的问题或工作流程命名的分支,签出您的分支,然后在 Xcode 中打开该文件夹。
该存储库需要经过验证的签名提交。您可以在 GitHub Docs 上找到有关签署提交的更多信息。
拉取请求
在提交拉取请求之前,请执行以下操作:
- 如果您要添加新命令或功能,它们应该包括单元测试。如果您要更改功能,请根据需要更新测试或添加新测试。
- 验证所有单元测试都通过。
- 在变更日志中添加注释,描述您所做的更改。
- 如果您的拉取请求与某个问题相关,请在描述中添加指向该问题的链接。
贡献者