Exemple #1
0
class BackupServer(object):
    def __init__(self, ip='0.0.0.0', port=8123):
        self.port = port
        self.clients = {}
        self.storage = Storage(settings.BACKTRAC_BACKUP_ROOT)

        realm = BackupRealm()
        realm.server = self
        checker = BackupClientAuthChecker()
        self.portal = portal.Portal(realm, [checker])
        self.factory = PBServerFactory(self.portal)
        context = ssl.DefaultOpenSSLContextFactory("server.key", "server.crt")
        self.service = SSLServer(self.port, self.factory, context, interface=ip)
        self.restore_loop = LoopingCall(self.execute_pending_restores)
        self.restore_loop.start(5)
        self.server_loop = LoopingCall(self.update_server_status)
        self.server_loop.start(5)
        self.catalog_backup_loop = LoopingCall(self.backup_catalog)
        deferLater(reactor, get_seconds_till_midnight(),
                   self._start_catalog_backup_loop)

    def update_server_status(self):
        cache.set(SERVER_STATUS_CACHE_KEY, True, timeout=10)

    def execute_pending_restores(self):
        for hostname, client in self.clients.items():
            client.execute_pending_restores()

    def _start_catalog_backup_loop(self):
        self.catalog_backup_loop.start(86400)

    def backup_catalog(self):
        reactor.callInThread(self._perform_catalog_backup)

    def _perform_catalog_backup(self):
        old_stdout = sys.stdout
        sys.stdout = open(settings.BACKTRAC_CATALOG_BACKUP, 'w')
        management.call_command('dumpdata', indent=2)
        sys.stdout.close()
        sys.stdout = old_stdout


    def start(self):
        self.service.startService()