JamfSync
Utilitário para transferir arquivos entre pastas de arquivos, pontos de distribuição de compartilhamento de arquivos Jamf Pro e pontos de distribuição Jamf Pro JDCS2 e atualizar os pacotes em servidores Jamf Pro.
Instruções
Consulte JamfSync/Resources/Jamf Sync User Guide.pdf para obter ajuda para executar o Jamf Sync ou, ao executar "Jamf Sync.app", clique em Help / Jamf Sync User Guide.
Características
- Lida com vários servidores Jamf Pro, permitindo mover pacotes de um servidor de teste para um servidor de produção ou vice-versa.
- Pode copiar arquivos entre um Cloud DP, um DP de compartilhamento de arquivos ou uma pasta de arquivos local.
- Opcionalmente, pode excluir arquivos do DP de destino que não estão no DP de origem.
- Opcionalmente, pode excluir pacotes no servidor Jamf Pro que não estão no DP de origem.
- Pode tratar uma pasta de arquivos local como um ponto de distribuição, permitindo upload e download de vários pacotes.
- Lida com a criação automática de somas de verificação para pacotes.
- Os parâmetros de linha de comando permitem sincronizações de script.
Descrição
Configurações
- Adicione servidores e/ou pastas Jamf Pro.
- As pastas são tratadas como pontos de distribuição, permitindo a sincronização entre outros pontos de distribuição ou pastas.
- Ao clicar em fechar, se forem feitas alterações, ele entrará em contato com cada servidor Jamf Pro para obter os pontos de distribuição e os usará para preencher as listas de seleção de origem e destino.
Adicionar servidor Jamf Pro
- O usuário pode fornecer a URL do Jamf Pro Server e o ID do usuário e a senha ou o ID do cliente e o segredo do cliente, dependendo se a autenticação padrão ou OAuth (funções de API e clientes) for usada.
- Pode clicar no botão "Testar" para verificar se o servidor Jamf Pro está acessível com as configurações.
- Isso adicionará automaticamente um servidor DP em nuvem e todos os DPs de compartilhamento de arquivos que estão no Jamf Pro Server.
- As configurações são armazenadas localmente. As credenciais do Jamf Pro e dos pontos de distribuição de compartilhamento de arquivos serão armazenadas com segurança nas chaves.
Adicionar pasta local
- Permite adicionar uma pasta local, que será apresentada ao usuário como uma opção para utilizar como origem ou destino. As pastas são tratadas como pontos de distribuição, permitindo a sincronização entre outros pontos de distribuição ou pastas. Ele conterá um nome e um local de diretório. O nome será padronizado como o nome do diretório.
Editar
- Permite editar qualquer item selecionado. Se nada estiver selecionado, o botão de edição será desativado.
Excluir
- Permite excluir qualquer item selecionado. Ele solicitará confirmação antes de excluir. Se nada for selecionado, o botão excluir será desativado.
Vista principal
- O botão Sincronização ficará esmaecido até que a origem e o destino sejam selecionados e a origem e o destino sejam diferentes. Isso sincronizará da origem ao destino.
- A caixa de seleção Forçar sincronização fará com que todos os itens de origem sejam copiados, mesmo que a soma de verificação no destino corresponda. Quando não estiver marcada, apenas os itens adicionados ou alterados serão sincronizados.
- Há um seletor para a origem e para o destino, cada um contendo uma lista de todas as pastas e pontos de distribuição. Inicialmente "--" é selecionado, o que indica que não há seleção.
- Uma lista de arquivos no ponto de distribuição de origem selecionado está à esquerda e a lista de arquivos no ponto de distribuição de destino está à direita.
- Quando um ponto de distribuição de origem e de destino são selecionados, a coluna Sincronização mostrará um ícone indicando o que acontecerá durante uma sincronização. Quando o ícone de sincronização tiver uma cor, significa que ele participará de uma sincronização. Se for preto e branco, não será. O ícone de sincronização terá um + se for adicionado, uma marca de seleção se for atualizado, um X se for excluído do destino (se eles decidirem depois de clicar em Sincronizar) e um = se o arquivo em ambos os correspondência de origem e destino.
- Os itens na lista de fontes podem ser selecionados. Se houver itens selecionados, apenas esses arquivos serão sincronizados e nenhum arquivo será removido do destino. Se nenhum arquivo for selecionado, quando o botão Sincronizar for pressionado, você será questionado sobre se deseja excluir itens que não estão na origem. Se você escolher Sim, todos os arquivos no destino que mostrarem um símbolo x vermelho serão removidos do destino e da lista de pacotes no Jamf Pro.
Parâmetros de linha de comando
NOTA: Execute JamfSync sem parâmetros primeiro para adicionar servidores e/ou pastas Jamf Pro. As senhas para servidores Jamf Pro e pontos de distribuição devem ser armazenadas nas chaves para sincronizar por meio de argumentos de linha de comando.
Uso: JamfSync [(-s | --srcDp) ] [(-d | --dstDp) ] [(-f | --forceSync)] [(-r | --removeFilesNotOnSource)] [(-rp | -- removePackagesNotOnSource)] [-p | --progresso] JamfSync [-h | --help] JamfSync [-v | --versão]
-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.
NOTA: Se o nome de um ponto de distribuição for o mesmo em várias instâncias do Jamf Pro, use "dpName:jamfProName" como nome.
Exemplos: "/Applications/Jamf Sync.app/Contents/MacOS/Jamf Sync" -srcDp localSourceName -dstDp destinationSourceName --removeFilesNotOnSource --progress "/Applications/Jamf Sync.app/Contents/MacOS/Jamf Sync" -s "JCDS :Estágio" -d "JCDS:Prod" -r -rp -p "/Applications/Jamf Sync.app/Contents/MacOS/Jamf Sync" -s localSourceName -d destinationSourceName
Visão geral do código-fonte
O código-fonte está localizado em vários grupos.
- O modelo contém classes que não estão diretamente relacionadas à IU.
- Dentro do grupo Modelo está ViewModels, que está mais intimamente relacionado à IU, mas não está especificamente vinculado a ela. Normalmente, quando os campos em um modelo de visualização são alterados, a UI associada será redesenhada automaticamente.
- Recursos contém imagens e outros arquivos que são usados pelo programa.
- UI contém os arquivos SwiftUI para todas as visualizações que aparecem no programa, bem como JamfSyncApp, que é onde começa a execução do programa.
- O utilitário contém classes que executam tarefas mais gerais.
Modelo
Os arquivos do grupo Modelo são usados para controlar e processar os dados usados.
DataModel: representa o estado de quase tudo e contém dados e funções que atuam sobre esses dados. Ele é responsável por carregar dados do armazenamento principal e também carregar dados para os pontos de distribuição. Possui variáveis publicadas que são usadas para controlar a IU.
SavableItem: a classe base para qualquer coisa que possa ser salva (JamfProInstance e FolderInstance). Esses itens são armazenados em Core Data. As senhas não são armazenadas nos dados principais, mas sim nas chaves, desde que o usuário permita. A função loadDps é substituída pela classe filha específica e é responsável por carregar todos os pontos de distribuição associados a esse item. A função getDps retorna os pontos de distribuição associados a esse item.
- JamfProInstance - representa uma instância do Jamf Pro e é responsável por carregar os dados necessários e se comunicar com as APIs do Jamf Pro. Ele também cria e carrega dados para os pontos de distribuição associados ao servidor Jamf Pro. Ele também carrega e armazena informações de pacotes do servidor Jamf Pro.
- FolderInstance - Representa um diretório local no computador. Ele cria um único FolderDp que atua como um ponto de distribuição durante a sincronização.
DistributionPoint: A classe base para todos os objetos DistributionPoint (FileShareDp, Jcds2Dp e FolderDp) A função copyFiles é a função principal para sincronização. Ele chama outras funções que são substituídas pelos objetos de ponto de distribuição específicos.
- FileShareDp – O objeto de ponto de distribuição específico para pontos de distribuição de compartilhamento de arquivos.
- Jcds2Dp – O objeto de ponto de distribuição específico para pontos de distribuição em nuvem.
- FolderDp – O objeto de ponto de distribuição específico para pontos de distribuição de pasta (representando uma pasta de arquivo local).
Outros objetos:
- DpFile – Armazena informações de um único arquivo. Ele também contém funções para manter e comparar suas somas de verificação.
- DpFiles – Armazena uma lista de arquivos. Possui funções para ajudar a encontrar um arquivo específico, atualizar somas de verificação dos arquivos e atualizar o estado de cada arquivo que indica o estado dos arquivos.
- Checksum - Representa uma soma de verificação de qualquer tipo (geralmente SHA-512)
- Checksums - Um objeto que contém uma lista de objetos Checksum e possui funções para usar na coleção de checksums.
VerModelos
Os arquivos do grupo ViewModels são usados para controlar e processar os dados usados. Variáveis publicadas farão com que as visualizações associadas sejam redesenhadas. * LogViewModel - Usado para a visualização do log e a mensagem exibida na parte inferior da tela. * SetupViewModel - Usado para a visualização de configuração. * PackageListViewModel – Usado para as listas de arquivos de origem e destino na visualização principal. * DpFileViewModel – Usado para cada arquivo no PackageListViewModel. Ele possui um ponteiro para uma instância específica do DpFile e possui campos específicos da UI. * DpFilesViewModel - Possui uma matriz de objetos DpFileViewModel e é usado para armazenar os arquivos em um objeto PackageListViewModel.
IU
Os arquivos no grupo UI são os arquivos SwiftUI da interface do usuário. Os dados no DataModel são usados para controlar a visualização. Sempre que uma propriedade com @Published for alterada, todas as visualizações que usam esses campos serão redesenhadas.
- AboutView: uma visualização que mostra a versão e outras informações.
- ChecksumView: mostra quais somas de verificação foram calculadas para um arquivo e apresenta uma string com as somas de verificação reais quando você passa o mouse sobre ele.
- ConfirmationView: a visualização usada para confirmar várias coisas
- ContentView: a visualização principal que orienta tudo.
- FileSharePasswordView: usado para solicitar uma senha de compartilhamento de arquivo quando ela não foi armazenada nas chaves.
- FolderView: a visualização ao adicionar ou editar uma pasta
- HeaderView: a parte superior do ContentView que contém o botão Sincronização e a caixa de seleção Forçar sincronização.
- JamfProPasswordView: usado para solicitar a senha do Jamf Pro quando ela não foi armazenada nas chaves.
- JamfProServerView: a visualização ao adicionar ou editar um servidor Jamf Pro
- JamfSyncApp: aplicativo principal que contém o ContentView
- LogMessageView: A visualização que mostra brevemente a mensagem de log na parte inferior da visualização principal.
- LogView: a visualização que mostra mensagens de log
- PackageAnimationView: a visualização que mostra a animação durante a sincronização.
- PackageListView: a visualização da lista de pacotes na visualização principal.
- SavableItemListView: a visualização da lista na visualização Configuração
- SetupView: A visualização principal do Setup
- SourceDestinationView: a parte do MainView com os seletores de origem e destino e listas de arquivos.
- SynchronizationProgressView: a visualização de sincronização que mostra o progresso de uma sincronização em andamento. Isso também inicia a sincronização em onAppear .
Utilitário
Os arquivos do grupo Utilitário são classes auxiliares para processamento de dados e não possuem conexão direta com a UI.
- ArgumentParser: analisa os argumentos da linha de comando, se houver algum.
- CloudSessionDelegate: lida com as funções URLSessionTaskDelegate e URLSessionDownloadDelegatedelegate quando os arquivos são transferidos de e para a nuvem.
- FileHash: Cria valores de hash de arquivo. Esta é uma classe de ator, portanto uma função processará apenas um arquivo por vez para evitar conflitos.
- FileShare: controla a montagem e desmontagem de um compartilhamento de arquivos. Esta é uma classe de atores para evitar conflitos.
- FileShares: monta compartilhamentos ou retorna um compartilhamento de arquivo já montado. E desmonta todos os compartilhamentos de arquivos montados. Esta é uma classe de atores para evitar conflitos.
- KeychainHelper: auxilia no armazenamento e recuperação de itens de chaveiro.
- View+NSWindow: Usado para exibir uma visualização como sua própria janela.
- UserSettings: lê, salva e controla os dados gravados nas configurações do usuário.
Expandindo os tipos de pontos de distribuição suportados pelo JamfSync
Seria útil adicionar pontos de distribuição para conexões diretas na nuvem, como Rackspace, Amazon Web Services, Akamai. O seguinte precisaria ser feito para apoiar um deles:
- Crie um objeto que herde SavableItem (como FolderInstance) e adicione variáveis de membro para cada informação que precisará ser fornecida.
- Crie um objeto que herde de DistributionPoint. Consulte Jcds2Dp para obter um exemplo disso. Consulte FolderItem para ver como isso deve ser criado e retornado (como FolderDp).
- Crie uma entidade em StoredSettings.xcdatamodeld e defina o pai como SavableItemData.
- Modifique SetupView para poder criar, editar e excluir o novo item.
- Adicione um novo objeto como JamfProServerView para que o usuário possa inserir qualquer informação necessária.
- Use o KeychainHelper para salvar credenciais nas chaves e adicionar nomes de serviços adicionais (como fileShareServiceName), se necessário.
- Certifique-se de que os testes de unidade existentes sejam aprovados e adicione testes de unidade adicionais para cobrir as alterações feitas.
Melhorias ainda necessárias
- Crie suporte para pontos adicionais de distribuição em nuvem, como Rackspace, Amazon Web Services, Akamai, conforme descrito acima.
- A ação de cancelamento precisa ser melhorada. Para FileShareDps e FolderDps, ele não cancela o arquivo atual que está sendo transferido, portanto pode demorar um pouco para ser cancelado.
- Torne as listas classificáveis por qualquer coluna.
- Torne as colunas da lista dimensionáveis.
- Adicione mais cobertura de teste de unidade (especialmente conclua Jcds2DpTests e adicione testes de unidade para CommandLineProcessing).
- Melhorias poderiam ser feitas para torná-lo mais acessível.
- Seria bom torná-lo localizável e começar a adicionar algumas localizações.
Contribuindo
Para configurar o desenvolvimento local, faça um fork deste repositório, crie um branch em seu fork com o nome do problema ou fluxo de trabalho que você está melhorando, faça check-out de seu branch e abra a pasta no Xcode.
Este repositório requer commits assinados verificados. Você pode descobrir mais sobre como assinar commits no GitHub Docs.
Solicitações pull
Antes de enviar sua solicitação pull, faça o seguinte:
- Se você estiver adicionando novos comandos ou recursos, eles deverão incluir testes de unidade. Se você estiver alterando a funcionalidade, atualize os testes ou adicione novos testes conforme necessário.
- Verifique se todos os testes de unidade foram aprovados.
- Adicione uma nota ao CHANGELOG descrevendo o que você alterou.
- Se sua solicitação pull estiver relacionada a um problema, adicione um link para o problema na descrição.
Colaboradores
- Harry Strand
- Leslie Helou