Exemple #1
0
 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
Exemple #2
0
 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
Exemple #4
0
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')
Exemple #5
0
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')
Exemple #6
0
 def stop(self):
     from storage import index_synchronizer
     index_synchronizer.A('shutdown')
     return True
Exemple #7
0
 def start(self):
     from storage import index_synchronizer
     index_synchronizer.A('init')
     return True
Exemple #8
0
 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