From 74ee60e86cd6d9a6746658e267f29d3d25277789 Mon Sep 17 00:00:00 2001 From: Daniel STAN Date: Wed, 3 Jun 2015 19:52:02 +0200 Subject: [PATCH] =?UTF-8?q?d=C3=A9but=20de=20r=C3=A9plication?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cpasswords/clientlib.py | 25 +++++++++++++++++++++++++ server.py | 28 ++++++++++++++++++++++++++-- serverconfigs/tudor/serverconfig.py | 12 ++++++++++++ 3 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 cpasswords/clientlib.py diff --git a/cpasswords/clientlib.py b/cpasswords/clientlib.py new file mode 100644 index 0000000..247df05 --- /dev/null +++ b/cpasswords/clientlib.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +"""Client class definition for cpasswords protocol. + +(WIP) +""" + +from cpasswords import client as _old_client + +class Client(object): + """A client connection.""" + + verbose = False + + def __init__(self, serverdata): + """ + serverdata should be a classic dict object (from eg a clientconfig + module) + """ + self.serverdata = serverdata + + def put_file(self, data): + """Send file to server""" + # TODO put code here + _old_client.put_files(self, [data]) diff --git a/server.py b/server.py index a26c2fd..27db200 100755 --- a/server.py +++ b/server.py @@ -17,10 +17,19 @@ import itertools from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart +try: + from cpasswords import clientlib +except ImportError: + print("Couldn't import clientlib. Remote sync may not work") + # Même problème que pour le client, il faut bootstraper le nom de la commande # Pour accéder à la config -cmd_name = os.path.split(sys.argv[0])[1].replace("-server", "") -sys.path.append("/etc/%s/" % (cmd_name,)) +conf_path = os.getenv('CRANSPASSWORDS_SERVER_CONFIG_DIR', None) +if not conf_path: + cmd_name = os.path.split(sys.argv[0])[1].replace("-server", "") + conf_path = "/etc/%s/" % (cmd_name,) + +sys.path.append(conf_path) import serverconfig MYUID = pwd.getpwuid(os.getuid())[0] @@ -190,6 +199,11 @@ def _putfile(filename, roles, contents): # Or fuck yourself writefile(filepath, json.dumps({'roles': roles, 'contents': contents})) + + data = {'filename': filename, 'roles': roles, 'contents': contents} + for client in _list_to_replicate(data): + client.put_file(data) + return [True, u"Modification effectuée."] @server_command('putfile', stdin_input=True, write=True) @@ -245,6 +259,16 @@ def backup(corps, fname, old): back.write((u'* %s: %s\n' % (str(datetime.datetime.now()), corps)).encode("utf-8")) back.close() +def _list_to_replicate(data): + """Renvoie une liste d'options clients sur lesquels appliquer relancer + la procédure (pour réplication auto)""" + roles = data.get('roles', []) + backups = getattr(serverconfig, 'BACKUP_ROLES', {}) + servers = getattr(serverconfig, 'BACKUP_SERVERS', {}) + + configs = set(name for role in roles for name in backups.get(role, [])) + return [ clientlib.Client(servers[name]) for name in configs ] + _notif_todo = [] def notification(action, fname, actor): """Enregistre une notification""" diff --git a/serverconfigs/tudor/serverconfig.py b/serverconfigs/tudor/serverconfig.py index 6e136c5..7c4e714 100755 --- a/serverconfigs/tudor/serverconfig.py +++ b/serverconfigs/tudor/serverconfig.py @@ -37,3 +37,15 @@ ROLES = { 'moi': _ME, 'moi-w': _ME, } + +BACKUP_SERVERS = { + 'gladys': { + 'server_cmd': ['/usr/bin/ssh', 'home.b2moo.fr', '/home/dstan/cranspasswords/serverconfigs/tudor/cpasswords-server', ], + 'keep-alive': True, + }, +} + + +BACKUP_ROLES = { + 'moi': ['gladys'], +}