def create_server(identifier: str, host: str, port: int = 9394) -> Server: """ Create Local Server """ identifier = g_facebook.identifier(identifier) server = Server(identifier=identifier, host=host, port=port) g_facebook.cache_user(user=server) Log.info('local station created: %s' % server) return server
def load_station(identifier: str) -> Station: """ Load station info from 'etc' directory :param identifier - station ID :return station with info from 'dims/etc/{address}/*' """ identifier = g_facebook.identifier(identifier) # check meta meta = g_facebook.meta(identifier=identifier) if meta is None: # load from 'etc' directory meta = Meta( load_station_info(identifier=identifier, filename='meta.js')) if meta is None: raise LookupError('failed to get meta for station: %s' % identifier) elif not g_facebook.save_meta(meta=meta, identifier=identifier): raise ValueError('meta error: %s' % meta) # check private key private_key = g_facebook.private_key_for_signature(identifier=identifier) if private_key is None: # load from 'etc' directory private_key = PrivateKey( load_station_info(identifier=identifier, filename='secret.js')) if private_key is None: pass elif not g_facebook.save_private_key(key=private_key, identifier=identifier): raise AssertionError('failed to save private key for ID: %s, %s' % (identifier, private_key)) # check profile profile = load_station_info(identifier=identifier, filename='profile.js') if profile is None: raise LookupError('failed to get profile for station: %s' % identifier) Log.info('station profile: %s' % profile) name = profile.get('name') host = profile.get('host') port = profile.get('port') # create station if private_key is None: # remote station station = Station(identifier=identifier, host=host, port=port) else: # create profile profile = Profile.new(identifier=identifier) profile.set_property('name', name) profile.set_property('host', host) profile.set_property('port', port) profile.sign(private_key=private_key) if not g_facebook.save_profile(profile=profile): raise AssertionError('failed to save profile: %s' % profile) # local station station = Server(identifier=identifier, host=host, port=port) g_facebook.cache_user(user=station) Log.info('station loaded: %s' % station) return station
def load_user(identifier: str) -> User: identifier = g_facebook.identifier(identifier) # check meta meta = g_facebook.meta(identifier=identifier) if meta is None: # load from 'etc' directory meta = Meta(load_robot_info(identifier=identifier, filename='meta.js')) if meta is None: raise LookupError('failed to get meta for robot: %s' % identifier) elif not g_facebook.save_meta(meta=meta, identifier=identifier): raise ValueError('meta error: %s' % meta) # check private key private_key = g_facebook.private_key_for_signature(identifier=identifier) if private_key is None: # load from 'etc' directory private_key = PrivateKey( load_robot_info(identifier=identifier, filename='secret.js')) if private_key is None: pass elif not g_facebook.save_private_key(key=private_key, identifier=identifier): raise AssertionError('failed to save private key for ID: %s, %s' % (identifier, private_key)) if private_key is None: raise AssertionError('private key not found for ID: %s' % identifier) # check profile profile = load_robot_info(identifier=identifier, filename='profile.js') if profile is None: raise LookupError('failed to get profile for robot: %s' % identifier) Log.info('robot profile: %s' % profile) name = profile.get('name') avatar = profile.get('avatar') # create profile profile = Profile.new(identifier=identifier) profile.set_property('name', name) profile.set_property('avatar', avatar) profile.sign(private_key=private_key) if not g_facebook.save_profile(profile): raise AssertionError('failed to save profile: %s' % profile) # create local user return g_facebook.user(identifier=identifier)
def info(self, msg: str): Log.info('%s:\t%s' % (self.__class__.__name__, msg))
curPath = os.path.abspath(os.path.dirname(__file__)) rootPath = os.path.split(curPath)[0] sys.path.append(rootPath) sys.path.append(os.path.join(rootPath, 'libs')) from libs.common import Log from station.handler import RequestHandler from station.config import g_receptionist, current_station if __name__ == '__main__': current_station.running = True g_receptionist.start() # start TCP Server try: TCPServer.allow_reuse_address = True server = ThreadingTCPServer(server_address=(current_station.host, current_station.port), RequestHandlerClass=RequestHandler) Log.info('server (%s:%s) is listening...' % (current_station.host, current_station.port)) server.serve_forever() except KeyboardInterrupt as ex: Log.info('~~~~~~~~ %s' % ex) finally: current_station.running = False Log.info('======== station shutdown!')
""" Key Store ~~~~~~~~~ Memory cache for reused passwords (symmetric key) """ g_keystore = KeyStore() """ Database ~~~~~~~~ for cached messages, profile manage(Barrack), reused symmetric keys(KeyStore) """ g_database = Database() g_database.base_dir = base_dir Log.info("database directory: %s" % g_database.base_dir) """ Address Name Service ~~~~~~~~~~~~~~~~~~~~ A map for short name to ID, just like DNS """ g_ans = AddressNameService() g_ans.database = g_database """ Facebook ~~~~~~~~ Barrack for cache entities """ g_facebook = Facebook()
""" Key Store ~~~~~~~~~ Memory cache for reused passwords (symmetric key) """ g_keystore = KeyStore() """ Database ~~~~~~~~ for cached messages, profile manage(Barrack), reused symmetric keys(KeyStore) """ g_database = Database() g_database.base_dir = base_dir Log.info("database directory: %s" % g_database.base_dir) """ Address Name Service ~~~~~~~~~~~~~~~~~~~~ A map for short name to ID, just like DNS """ g_ans = AddressNameServer() g_ans.database = g_database """ Facebook ~~~~~~~~ Barrack for cache entities """ g_facebook = Facebook()
def load_naruto(): gid = g_facebook.identifier(group_naruto) Log.info('naruto group: %s' % gid) meta = Meta(load_robot_info(gid, 'meta.js')) g_facebook.save_meta(identifier=gid, meta=meta)
~~~~~~~~~ Memory cache for reused passwords (symmetric key) """ g_keystore = KeyStore() """ Database ~~~~~~~~ for cached messages, profile manage(Barrack), reused symmetric keys(KeyStore) """ g_database = Database() g_database.base_dir = base_dir Log.info("database directory: %s" % g_database.base_dir) """ Address Name Service ~~~~~~~~~~~~~~~~~~~~ A map for short name to ID, just like DNS """ g_ans = AddressNameService() g_ans.database = g_database """ Facebook ~~~~~~~~