def start(self): from twisted.internet.defer import Deferred from logs import lg from main import events from storage import index_synchronizer from storage import keys_synchronizer keys_synchronizer.A('init') self.starting_deferred = Deferred() self.starting_deferred.addErrback( lambda err: lg.warn('service %r was not started: %r' % (self.service_name, err.getErrorMessage() if err else 'unknown reason'))) events.add_subscriber(self._on_identity_url_changed, 'identity-url-changed') events.add_subscriber(self._on_key_generated, 'key-generated') events.add_subscriber(self._on_key_registered, 'key-registered') events.add_subscriber(self._on_key_erased, 'key-erased') events.add_subscriber(self._on_my_backup_index_synchronized, 'my-backup-index-synchronized') events.add_subscriber(self._on_my_backup_index_out_of_sync, 'my-backup-index-out-of-sync') if index_synchronizer.A() and index_synchronizer.A( ).state == 'NO_INFO': # it seems I am offline... must start here, but expect to be online soon and sync keys later return True if index_synchronizer.A() and index_synchronizer.A( ).state == 'IN_SYNC!': # if I am already online and backup index in sync - refresh keys ASAP self._do_synchronize_keys() return self.starting_deferred
def health_check(self): from storage import index_synchronizer return index_synchronizer.A().state in [ 'IN_SYNC!', 'SENDING', 'REQUEST?', ]
def stop(self): from main import events from storage import index_synchronizer from storage import keys_synchronizer if index_synchronizer.A(): index_synchronizer.A().removeStateChangedCallback( self._on_index_synchronizer_state_changed) events.remove_subscriber(self._on_my_backup_index_out_of_sync, 'my-backup-index-out-of-sync') events.remove_subscriber(self._on_my_backup_index_synchronized, 'my-backup-index-synchronized') events.remove_subscriber(self._on_key_erased, 'key-erased') events.remove_subscriber(self._on_key_registered, 'key-registered') events.remove_subscriber(self._on_key_generated, 'key-generated') events.remove_subscriber(self._on_identity_url_changed, 'identity-url-changed') if keys_synchronizer.A(): keys_synchronizer.A('shutdown') return True
def Save(filepath=None): """ Save index data base to local file ( call ``WriteIndex()`` ) and notify "index_synchronizer()" state machine. """ global _LoadingFlag if _LoadingFlag: return False commit() WriteIndex(filepath) if driver.is_on('service_backup_db'): from storage import index_synchronizer index_synchronizer.A('push')
def IncomingSupplierBackupIndex(newpacket): """ Called by ``p2p.p2p_service`` when a remote copy of our local index data base ( in the "Data" packet ) is received from one of our suppliers. The index is also stored on suppliers to be able to restore it. """ b = encrypted.Unserialize(newpacket.Payload) if b is None: lg.out(2, 'backup_control.IncomingSupplierBackupIndex ERROR reading data from %s' % newpacket.RemoteID) return try: session_key = key.DecryptLocalPrivateKey(b.EncryptedSessionKey) padded_data = key.DecryptWithSessionKey(session_key, b.EncryptedData) inpt = cStringIO.StringIO(padded_data[:int(b.Length)]) supplier_revision = inpt.readline().rstrip('\n') if supplier_revision: supplier_revision = int(supplier_revision) else: supplier_revision = -1 # inpt.seek(0) except: lg.out(2, 'backup_control.IncomingSupplierBackupIndex ERROR reading data from %s' % newpacket.RemoteID) lg.out(2, '\n' + padded_data) lg.exc() try: inpt.close() except: pass return if driver.is_on('service_backup_db'): from storage import index_synchronizer index_synchronizer.A('index-file-received', (newpacket, supplier_revision)) if revision() >= supplier_revision: inpt.close() lg.out(4, 'backup_control.IncomingSupplierBackupIndex SKIP, supplier %s revision=%d, local revision=%d' % ( newpacket.RemoteID, supplier_revision, revision(), )) return raw_data = inpt.read() inpt.close() if ReadIndex(raw_data): commit(supplier_revision) backup_fs.Scan() backup_fs.Calculate() WriteIndex() control.request_update() lg.out(4, 'backup_control.IncomingSupplierBackupIndex updated to revision %d from %s' % ( revision(), newpacket.RemoteID)) else: lg.warn('failed to read catalog index from supplier')
def stop(self): from storage import index_synchronizer index_synchronizer.A('shutdown') return True
def start(self): from storage import index_synchronizer index_synchronizer.A('init') return True
def A(self, event, *args, **kwargs): from customer import fire_hire from customer import data_sender from customer import list_files_orator from storage import backup_rebuilder from storage import index_synchronizer #---READY--- if self.state == 'READY': if event == 'timer-5sec': self.doOverallCheckUp(*args, **kwargs) elif event == 'restart' or event == 'suppliers-changed' or ( event == 'instant' and self.RestartAgain): self.state = 'FIRE_HIRE' self.RestartAgain = False self.doRememberSuppliers(*args, **kwargs) fire_hire.A('restart') #---LIST_FILES--- elif self.state == 'LIST_FILES': if (event == 'list_files_orator.state' and args[0] == 'NO_FILES'): self.state = 'READY' elif (event == 'list_files_orator.state' and args[0] == 'SAW_FILES'): self.state = 'LIST_BACKUPS' index_synchronizer.A('pull') data_sender.A('restart') self.doPrepareListBackups(*args, **kwargs) elif event == 'restart': self.RestartAgain = True elif event == 'suppliers-changed': self.state = 'READY' self.RestartAgain = True #---LIST_BACKUPS--- elif self.state == 'LIST_BACKUPS': if event == 'list-backups-done': self.state = 'REBUILDING' backup_rebuilder.A('start') elif event == 'restart': self.RestartAgain = True elif event == 'suppliers-changed': self.state = 'READY' self.RestartAgain = True elif event == 'restart': self.state = 'FIRE_HIRE' fire_hire.A('restart') #---REBUILDING--- elif self.state == 'REBUILDING': if (event == 'backup_rebuilder.state' and args[0] in ['DONE', 'STOPPED']): self.state = 'READY' self.doCleanUpBackups(*args, **kwargs) data_sender.A('restart') elif event == 'restart' or event == 'suppliers-changed': self.state = 'FIRE_HIRE' backup_rebuilder.SetStoppedFlag() fire_hire.A('restart') #---FIRE_HIRE--- elif self.state == 'FIRE_HIRE': if event == 'suppliers-changed' and self.isSuppliersNumberChanged( *args, **kwargs): self.state = 'LIST_FILES' self.doDeleteAllBackups(*args, **kwargs) self.doRememberSuppliers(*args, **kwargs) list_files_orator.A('need-files') elif event == 'fire-hire-finished': self.state = 'LIST_FILES' list_files_orator.A('need-files') elif event == 'suppliers-changed' and not self.isSuppliersNumberChanged( *args, **kwargs): self.state = 'LIST_FILES' self.doUpdateSuppliers(*args, **kwargs) self.doRememberSuppliers(*args, **kwargs) list_files_orator.A('need-files') elif event == 'restart': self.RestartAgain = True #---AT_STARTUP--- elif self.state == 'AT_STARTUP': if event == 'init': self.state = 'READY' self.RestartAgain = False return None