def __init__(self, work_dir, config, curses_screen=None, **kwargs): """ Main class for the Web-Interface. It takes care of setting up the database, managing the users, etc. :param work_dir: The working directory (usually the current working directory). :param config_arg: Beeswarm configuration dictionary, None if not configuration was supplied. :param curses_screen: This parameter is to maintain a similar interface for all the modes. It is ignored for the Server. """ customize = kwargs['customize'] if config is None: Server.prepare_environment(work_dir, customize) with open(os.path.join(work_dir, 'beeswarmcfg.json'), 'r') as config_file: config = json.load(config_file, object_hook=asciify) self.work_dir = work_dir self.config = config self.config_file = 'beeswarmcfg.json' self.actors = [] config_actor = ConfigActor('beeswarmcfg.json', work_dir) config_actor.start() self.actors.append(config_actor) self.workers = {} self.greenlets = [] self.started = False database_setup.setup_db(os.path.join(self.config['sql']['connection_string'])) self.app = app.app self.app.config['CERT_PATH'] = self.config['ssl']['certpath'] self.app.config['SERVER_CONFIG'] = 'beeswarmcfg.json' self.authenticator = Authenticator() self.authenticator.ensure_default_user() gevent.spawn(self.message_proxy, work_dir) persistanceWorker = PersistanceWorker() gevent.spawn(persistanceWorker.start) gevent.sleep()
def prepare_environment(work_dir, customize): package_directory = os.path.dirname(os.path.abspath(beeswarm.__file__)) config_file = os.path.join(work_dir, 'beeswarmcfg.json') if not os.path.isfile(config_file): print '*** Please answer a few configuration options ***' if customize: logging.info('Copying configuration file to workdir.') print '' print '* Certificate Information *' print 'IMPORTANT: Please make sure that "Common Name" is the IP address or fully qualified host name ' \ ' that you want to use for the server API.' cert_cn = raw_input('Common Name: ') cert_country = raw_input('Country: ') cert_state = raw_input('State: ') cert_locality = raw_input('Locality/City: ') cert_org = raw_input('Organization: ') cert_org_unit = raw_input('Organizational unit: ') print '' print '* Network *' web_port = raw_input('Port for UI (default: 5000): ') if web_port: web_port = int(web_port) else: web_port = 5000 else: logging.warn('Beeswarm server will be configured using default ssl parameters and network ' 'configuration, this could be used to fingerprint the beeswarm server. If you want to ' 'customize these options please use the --customize options on first startup.') cert_cn = '*' cert_country = 'US' cert_state = 'None' cert_locality = 'None' cert_org = 'None' cert_org_unit = '' web_port = 5000 cert, priv_key = create_self_signed_cert(cert_country, cert_state, cert_org, cert_locality, cert_org_unit, cert_cn) cert_path = os.path.join(work_dir, 'server.crt') key_path = os.path.join(work_dir, 'server.key') with open(cert_path, 'w') as certfile: certfile.write(cert) with open(key_path, 'w') as keyfile: keyfile.write(priv_key) shutil.copyfile(os.path.join(package_directory, 'server/beeswarmcfg.json.dist'), config_file) print '' print '* Communication between drones (honeypots and clients) and server *' print '* Please make sure that drones can always contact the Beeswarm server using the information that' \ ' you are about to enter. *' zmq_port = 5712 zmq_command_port = 5713 zmq_host = raw_input('IP or hostname of server: ') if customize: zmq_port = raw_input('TCP port for session data (default: 5712) : ') if zmq_port != '': zmq_port = int(zmq_port) zmq_command_port = raw_input('TCP port for drone commands(default: 5713) : ') if zmq_command_port != '': zmq_command_port = int(zmq_port) #tmp actor while initializing config_actor = ConfigActor('beeswarmcfg.json', work_dir) config_actor.start() context = zmq.Context() socket = context.socket(zmq.REQ) socket.connect('ipc://configCommands') socket.send('{0} {1}'.format(Messages.GEN_ZMQ_KEYS, 'beeswarm_server')) result = socket.recv() if result.split(' ', 1)[0] == Messages.OK: result = json.loads(result.split(' ', 1)[1]) zmq_public, zmq_private = (result['public_key'], result['private_key']) else: assert False socket.send('{0} {1}'.format(Messages.SET, json.dumps({'network': {'zmq_server_public_key': zmq_public, 'web_port': web_port, 'zmq_port': zmq_port, 'zmq_command_port': zmq_command_port, 'zmq_host': zmq_host}}))) socket.recv() config_actor.close()