From 5b8b19fe19264c61f74dd88dc3ac6a9a2bca81d3 Mon Sep 17 00:00:00 2001 From: Charlie Jacomme Date: Sun, 23 Apr 2017 18:26:28 +0200 Subject: [PATCH 1/2] [server] Ajout d'une fonction de restoration des fichiers corrompus --- server.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/server.py b/server.py index 0ec29d6..a9740f4 100755 --- a/server.py +++ b/server.py @@ -157,6 +157,37 @@ def listfiles(): files[fname] = file_dict["roles"] return files +@server_command('restorefiles') +def restorefiles(): + """Si un fichier a été corrompu, on restore son dernier backup valide""" + os.chdir(serverconfig.STORE) + + filenames = glob.glob('*.json') + files = {} + for filename in filenames: + file_dict = json.loads(open(filename).read()) + if not ('-----BEGIN PGP MESSAGE-----' in file_dict["contents"]): + fname = filename[:-5].decode('utf-8') + with open(fname+'.bak') as f: + line = f.readline() + backup = '' + while not (line==''): + try: + line_dict = json.loads(line) + if ('-----BEGIN PGP MESSAGE-----' in line_dict["contents"]): + backup = line + except: + pass + line = f.readline() + if not (backup == ''): + files[fname] = 'restored' + with open(fname+'.json','w') as f2: + f2.write(backup) + else: + files[fname] = 'not restored' + return files + + @server_command('getfile') def getfile(filename): """Récupère le fichier ``filename``""" From 83a489fa9d2963586d9d5feffc64b7afb92616b4 Mon Sep 17 00:00:00 2001 From: Charlie Jacomme Date: Sun, 23 Apr 2017 18:33:16 +0200 Subject: [PATCH 2/2] [client] Fonctions de restaurations de fichiers corrompues --- client.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/client.py b/client.py index 51e8f28..5cc60ae 100755 --- a/client.py +++ b/client.py @@ -365,6 +365,12 @@ def all_files(options): """Récupère les fichiers du serveur distant""" return remote_command(options, "listfiles") +@simple_memoize +def restore_all_files(options): + """Récupère les fichiers du serveur distant""" + return remote_command(options, "restorefiles") + + def get_files(options, filenames): """Récupère le contenu des fichiers distants""" return remote_command(options, "getfiles", stdin_contents=filenames) @@ -602,6 +608,16 @@ def show_files(options): print((u" %s %s (%s)" % ((access and '+' or '-'), fname, ", ".join(froles))).encode("utf-8")) print((u"""--Mes roles: %s""" % (", ".join(my_roles),)).encode("utf-8")) +def restore_files(options): + """Restore les fichiers corrompues sur le serveur distant""" + print(u"Fichier corrompus :".encode("utf-8")) + files = restore_all_files(options) + keys = files.keys() + keys.sort() + for fname in keys: + print((u" %s (%s)" % ( fname, files[fname])).encode("utf-8")) + + def show_roles(options): """Affiche la liste des roles existants""" print(u"Liste des roles disponibles".encode("utf-8")) @@ -985,6 +1001,9 @@ if __name__ == "__main__": action_grp.add_argument('-l', '--list', action='store_const', dest='action', default=show_file, const=show_files, help="Lister les fichiers") + action_grp.add_argument('-r', '--restore', action='store_const', dest='action', + default=show_file, const=restore_files, + help="Restorer les fichiers corrompues") action_grp.add_argument('--check-keys', action='store_const', dest='action', default=show_file, const=my_check_keys, help="Vérifier les clés")