# Copyright (C) 2018 Avatao.com Innovative Learning Kft. # All Rights Reserved. See LICENSE file for details. from os.path import join as joinpath from os.path import basename from os import makedirs from dateutil import parser as dateparser from tfw.event_handler_base import EventHandlerBase from tfw.components.snapshot_provider import SnapshotProvider from tfw.config import TFWENV from tfw.config.logs import logging LOG = logging.getLogger(__name__) class DirectorySnapshottingEventHandler(EventHandlerBase): def __init__(self, key, directories): super().__init__(key) self.snapshot_providers = {} self.init_snapshot_providers(directories) self.command_handlers = { 'take_snapshot': self.handle_take_snapshot, 'restore_snapshot': self.handle_restore_snapshot } def init_snapshot_providers(self, directories): for index, directory in enumerate(directories): git_dir = self.init_git_dir(index, directory) self.snapshot_providers[directory] = SnapshotProvider(directory, git_dir) @staticmethod def init_git_dir(index, directory): git_dir = joinpath( TFWENV.SNAPSHOTS_DIR, f'{basename(directory)}-{index}' ) makedirs(git_dir, exist_ok=True) return git_dir def handle_event(self, message): try: data = message['data'] message['data'] = self.command_handlers[data['command']](data) return message except KeyError: LOG.error('IGNORING MESSAGE: Invalid message received: %s', message) def handle_take_snapshot(self, data): LOG.debug('Taking snapshots of directories %s', self.snapshot_providers.keys()) for provider in self.snapshot_providers.values(): provider.take_snapshot() return data def handle_restore_snapshot(self, data): date = dateparser.parse(data['value']) LOG.debug( 'Restoring snapshots (@ %s) of directories %s', date, self.snapshot_providers.keys() ) for provider in self.snapshot_providers.values(): provider.restore_snapshot(date) return data