From 10117a698e5ffb1f74017129824b4c1b6a4ec73e Mon Sep 17 00:00:00 2001 From: Folker Bernitt Date: Mon, 25 Jan 2016 10:27:39 +0100 Subject: Add integrity-check maintenance command --- service/pixelated/maintenance.py | 45 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) (limited to 'service/pixelated/maintenance.py') diff --git a/service/pixelated/maintenance.py b/service/pixelated/maintenance.py index 5e1edac3..693e4075 100644 --- a/service/pixelated/maintenance.py +++ b/service/pixelated/maintenance.py @@ -17,6 +17,8 @@ from os.path import isfile from mailbox import Maildir, mbox, MaildirMessage import random + +from leap.mail.adaptors.soledad import MetaMsgDocWrapper from twisted.internet import reactor, defer from twisted.internet.threads import deferToThread from pixelated.adapter.mailstore.maintenance import SoledadMaintenance @@ -28,6 +30,8 @@ from leap.mail.constants import MessageFlags from pixelated.support.mail_generator import MailGenerator REPAIR_COMMAND = 'repair' +INTEGRITY_CHECK_COMMAND = 'integrity-check' + log = logging.getLogger(__name__) @@ -54,13 +58,17 @@ def initialize(): def _do_initial_sync(args): - return not _is_repair_command(args) + return (not _is_repair_command(args)) and (not _is_integrity_check_command(args)) def _is_repair_command(args): return args.command == REPAIR_COMMAND +def _is_integrity_check_command(args): + return args.command == INTEGRITY_CHECK_COMMAND + + def execute_command(args, leap_session): def init_soledad(): @@ -110,6 +118,9 @@ def add_command_callback(args, prepareDeferred, finalizeDeferred): elif args.command == 'sync': # nothing to do here, sync is already part of the chain prepareDeferred.chainDeferred(finalizeDeferred) + elif args.command == INTEGRITY_CHECK_COMMAND: + prepareDeferred.addCallback(integrity_check) + prepareDeferred.chainDeferred(finalizeDeferred) elif args.command == REPAIR_COMMAND: prepareDeferred.addCallback(repair) prepareDeferred.chainDeferred(finalizeDeferred) @@ -257,6 +268,38 @@ def dump_soledad(args): defer.returnValue(args) +@defer.inlineCallbacks +def integrity_check(args): + leap_session, soledad = args + + generation, docs = yield soledad.get_all_docs() + + known_docs = {} + + print 'Analysing %d docs\n' % len(docs) + + # learn about all docs + for doc in docs: + known_docs[doc.doc_id] = doc + + for doc in docs: + if doc.doc_id.startswith('M-'): + meta = MetaMsgDocWrapper(doc_id=doc.doc_id, **doc.content) + + # validate header doc + if meta.hdoc not in known_docs: + print 'Error: Could not find header doc %s for meta %s' % (meta.hdoc, doc.doc_id) + + if meta.fdoc not in known_docs: + print 'Error: Could not find flags doc %s for meta %s' % (meta.fdoc, doc.doc_id) + + for cdoc in meta.cdocs: + if cdoc not in known_docs: + print 'Error: Could not find content doc %s for meta %s' % (cdoc, meta.doc_id) + + defer.returnValue(args) + + @defer.inlineCallbacks def repair(args): leap_session, soledad = args -- cgit v1.2.3