Journal Synctrex: outil de synchronisation

12
10
mai
2016

Bonjour nal',

Ces derniers temps j'ai travaillé à une petite solution en console de synchronisation de fichiers en Python qui permet d'utiliser différents utilitaires et supportant différents protocoles. L'idée derrière ce programme est de fournir un moyen rapide pour effectuer une ou plusieurs synchronisations, avec une interface standardifiée.

Ces synchronisations sont déclarées dans un fichier YAML (ce qui permet d'en utiliser toute la puissance également), peuvent être importées d'autres fichiers, de les personnaliser, de les regrouper dans un ou plusieurs groupes. Malgré que ça soit une couche supplémentaire, il reste possible de garder un certain contrôle sur le processus, avec d'une part un système d'event (qui exécute du Python ou du Bash), d'autre part la possibilité de spécifier des options supplémentaires aux synchronisations.

Synctrex détecte également quand la source pointe sur un device de block et vérifie qu'il soit bien monté avant de lancer la synchronisation.

    syncs:
        base:
            events:
                pre_sync: "`echo start synchronizing {sync.name}`"
                fail: "`echo that failed`"
                success: print('that succeed for ', sync.name)
            dest: /dev/disk/by-label/backup
            files:
                - .config

       srv_to_hdd:
            groups: base
            source: user@server.net:

       local_to_hdd:
            groups: base
            source: /home/local_user

Je voulais revenir sur une autre feature également celle des Groupes. Une synchronisation peut avoir un ou plusieurs Groupes, qui remplissent deux rôles, pouvoir lancer la synchronisation des tous les enfants d'un même groupe et faire une sorte d'héritage d'attributs. Cet héritage est effectué juste avant la synchronisation, de la même façon que les classes en Python (de gauche à droite, on remplit que les attributs vides), avec une petite exception: le premier groupe dont hérite la synchronisation peut changer quand elle est effectué suite à la synchronisation d'un parent. Cela permet par exemple de pouvoir spécifier une source différente alors que toutes les autres options sont les mêmes.

    # synctrex -c test.yaml child       -> child.dest = '/tmp/a'
    # synctrex -c test.yaml base        -> child.dest = '/tmp/a'
    # synctrex -c test.yaml other_dest  -> child.dest = '/tmp/b'
    syncs:
        base:
            events:
                pre_sync: print('start', sync.name)
                success: print('YOLOOO l\\'elfe dans la place!')
            dest: /tmp/a
            options:
                - verbose
                - progress
                - update
                - preserve

        other_dest:
            dest: /tmp/b

        child:
            groups: [base, other_dest]
            source: /proc
            files:
                - cmdline

Alors pour le moment, il n'y a que la synchronisation de fichiers locaux, via ssh, ou rsync qui est supporté. Je veux par la suite utiliser aussi lftp pour les différents protocoles qu'il supporte, mais aussi d'autres protocoles comme IMAP par exemple.

Voilà, ça n'est pas grand chose pour le moment, je dois encore bosser dessus d'ici les semaines qui viennent, mais c'est déjà utilisable. Je suis en train de voir aussi pour faire un logo un peu moche mais mignon (j'en avais un sur papier mais je l'ai perdu après une longue absence), ça viendra quand la motivation me prendra dans ses bras.

https://github.com/bkfox/synctrex

  • # GC

    Posté par . Évalué à 0.

    j'ai un travaillé à une petite solution en console de synchronisation de fichiers en Python

    Et tu as eu des problèmes avec le garbage collector ref counting ? :)

    Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

  • # Renommage

    Posté par . Évalué à 1.

    Gère-t-il le renommage de fichiers ou de répertoires (comme git sait le faire mais pas rsync) ?
    En tout cas, je garde un œil sur ce projet qui pourrait, à vue de nez, parfaitement s'intégrer à Ansible (et compléter son module synchronize qui ne me convient pas toujours).

    • [^] # Re: Renommage

      Posté par . Évalué à 1.

      En fait ça dépend du backend, pour le moment il n'y a que rsync qui fonctionne. Je pensais ptet plus tard implémenter du git aussi tant qu'à faire.

      Je ne connais pas Ansible, je regarde :)

  • # differences avec les autres?

    Posté par (page perso) . Évalué à 2.

    Salut, quel est la différence avec les autres outils de synchronisation tels que unison, syncthing, git-annex, lsyncd, et autres que j'oublie ?

    • [^] # Re: differences avec les autres?

      Posté par . Évalué à 1.

      À la base c'est parce que je n'avais pas trouvé de solution satisfaisante pour gérer les backups sur différentes machines chez différentes personnes, et que j'utilisais des vieux scripts un peu dégueux. Je voulais surtout pouvoir fonctionner par fichier de config avec une gestion par groupes etc. des backups, utilisant différents protocols.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.