def main(args): CONFIG.register_descriptions({ "rendezvous.server.address": "Set rendezvous server address", "rendezvous.server.daemonize": "Enable daemon behavior", "rendezvous.server.ports": "List of rendezvous server ports", "rendezvous.server.update_uri": "Where to download updates from", "rendezvous.server.update_version": "Update Neubot version number", "rendezvous.geoip_wrapper.country_database": "Path of the GeoIP country database", "rendezvous.server.default": "Default test server to use", }) common.main("rendezvous.server", "Rendezvous server", args) conf = CONFIG.copy() HTTP_SERVER.configure(conf) for port in conf["rendezvous.server.ports"].split(","): HTTP_SERVER.listen((conf["rendezvous.server.address"], int(port))) # Really start this module run(POLLER, conf) if conf["rendezvous.server.daemonize"]: system.change_dir() system.go_background() LOG.redirect() system.drop_privileges(LOG.error) POLLER.loop()
def run(poller, conf): ''' Start the server-side of the speedtest module ''' HTTP_SERVER.register_child(SPEEDTEST_WRAPPER, '/speedtest/negotiate') HTTP_SERVER.register_child(SPEEDTEST_WRAPPER, '/speedtest/collect') HTTP_SERVER.register_child(SPEEDTEST_SERVER, '/speedtest/latency') HTTP_SERVER.register_child(SPEEDTEST_SERVER, '/speedtest/download') HTTP_SERVER.register_child(SPEEDTEST_SERVER, '/speedtest/upload')
def run(): """ Load MaxMind database and register our child server """ GEOLOCATOR.open_or_die() logging.info("This product includes GeoLite data created by MaxMind, " "available from <http://www.maxmind.com/>.") server = ServerRendezvous(None) server.configure(CONFIG) HTTP_SERVER.register_child(server, "/rendezvous")
def run(poller, conf): """ Start the client or server-side of the negotiate module """ if not "negotiate.listen" in conf: LOG.oops("Thou shall pass 'negotiate.listen' to negotiate") _SERVER = _ServerNegotiate(None) HTTP_SERVER.register_child(_SERVER, "/negotiate/") HTTP_SERVER.register_child(_SERVER, "/collect/")
def run(poller, conf): ''' Start the negotiate server ''' NEGOTIATE_SERVER.register_module('speedtest', NEGOTIATE_SERVER_SPEEDTEST) NEGOTIATE_SERVER.register_module('bittorrent', NEGOTIATE_SERVER_BITTORRENT) HTTP_SERVER.register_child(NEGOTIATE_SERVER, '/negotiate/') HTTP_SERVER.register_child(NEGOTIATE_SERVER, '/collect/') CONFIG.register_descriptions({ 'negotiate.parallelism': 'Number of parallel tests', 'negotiate.min_thresh': 'Minimum trehshold for RED', 'negotiate.max_thresh': 'Maximum trehshold for RED', })
def main(args): config.register_descriptions() common.main("bittorrent", "Neubot BitTorrent module", args) conf = CONFIG.copy() config.finalize_conf(conf) if conf["bittorrent.listen"]: # # If we need to negotiate and we're runing # standalone we also need to bring up the # global HTTP server. # if conf["bittorrent.negotiate"]: HTTP_SERVER.configure(conf) HTTP_SERVER.listen((conf["bittorrent.address"], conf["bittorrent.negotiate.port"])) conf["negotiate.listen"] = True negotiate.run(POLLER, conf) # # Drop privileges after listen() so we can # bind() to privileged ports # if conf["bittorrent.daemonize"]: system.change_dir() system.go_background() LOG.redirect() system.drop_privileges(LOG.error) else: # # When we're connecting to a remote host to perform a test # we want Neubot to quit at the end of the test. When this # happens the test code publishes the "testdone" event, so # here we prepare to intercept the event and break our main # loop. # NOTIFIER.subscribe("testdone", lambda event, ctx: POLLER.break_loop()) run(POLLER, conf) POLLER.loop()
def run(poller, conf): """ Start the negotiate server """ NEGOTIATE_SERVER.register_module("speedtest", NEGOTIATE_SERVER_SPEEDTEST) NEGOTIATE_SERVER.register_module("bittorrent", NEGOTIATE_SERVER_BITTORRENT) NEGOTIATE_SERVER.register_module("raw", NEGOTIATE_SERVER_RAW) NEGOTIATE_SERVER.register_module("skype", NEGOTIATE_SERVER_SKYPE) HTTP_SERVER.register_child(NEGOTIATE_SERVER, "/negotiate/") HTTP_SERVER.register_child(NEGOTIATE_SERVER, "/collect/") CONFIG.register_descriptions( { "negotiate.parallelism": "Number of parallel tests", "negotiate.min_thresh": "Minimum trehshold for RED", "negotiate.max_thresh": "Maximum trehshold for RED", } )
def start_api(address=None, port=None): ''' Starts API for background module ''' logging.debug('background_api: starting API server...') # Honor /etc/neubot/api settings = utils_rc.parse_safe(utils_hier.APIFILEPATH) if not address: address = settings.get('address', '::1 127.0.0.1') if not port: port = settings.get('port', '9774') # Configure HTTP server conf = CONFIG.copy() logging.debug('background_api: API server rootdir: %s', utils_hier.WWWDIR) conf['http.server.rootdir'] = utils_hier.WWWDIR conf['http.server.ssi'] = True conf['http.server.bind_or_die'] = True HTTP_SERVER.configure(conf) # Bind HTTP server to API server HTTP_SERVER.register_child(API_SERVER, '/api') # Bind HTTP server to address and port HTTP_SERVER.listen((address, port)) logging.debug('background_api: starting API server... done')
def main(args): ''' Main function ''' CONFIG.register_descriptions({ "rendezvous.server.address": "Set rendezvous server address", "rendezvous.server.ports": "List of rendezvous server ports", "rendezvous.server.update_version": "Update Neubot version number", "rendezvous.geoip_wrapper.country_database": \ "Path of the GeoIP country database", "rendezvous.server.default": "Default test server to use", }) common.main("rendezvous.server", "Rendezvous server", args) conf = CONFIG.copy() HTTP_SERVER.configure(conf) for port in conf["rendezvous.server.ports"].split(","): HTTP_SERVER.listen((conf["rendezvous.server.address"], int(port))) # Really start this module run() POLLER.loop()
def main(args): common.main("show_database", "Show a database in the Web GUI", args) HTTP_SERVER.configure({ "http.server.rootdir": WWW, "http.server.ssi": True, "http.server.bind_or_die": True }) HTTP_SERVER.register_child(ServerAPI(POLLER), "/api") HTTP_SERVER.listen(("127.0.0.1", 8080)) browser.open_patient("127.0.0.1", "8080", True) POLLER.loop()
def main(args): """ Starts the server module """ if not system.has_enough_privs(): sys.exit('FATAL: you must be root') try: options, arguments = getopt.getopt(args[1:], 'A:b:D:dv') except getopt.error: sys.exit(USAGE) if arguments: sys.exit(USAGE) address = ':: 0.0.0.0' backend = 'mlab' for name, value in options: if name == '-A': address = value elif name == '-b': backend = value elif name == '-D': name, value = value.split('=', 1) if name not in VALID_MACROS: sys.exit(USAGE) if name != 'server.datadir': # XXX value = int(value) SETTINGS[name] = value elif name == '-d': SETTINGS['server.daemonize'] = 0 elif name == '-v': CONFIG['verbose'] = 1 logging.debug('server: using backend: %s... in progress', backend) if backend == 'mlab': BACKEND.datadir_init(None, SETTINGS['server.datadir']) BACKEND.use_backend('mlab') elif backend == 'neubot': DATABASE.connect() BACKEND.use_backend('neubot') elif backend == 'volatile': BACKEND.use_backend('volatile') else: BACKEND.use_backend('null') logging.debug('server: using backend: %s... complete', backend) for name, value in SETTINGS.items(): CONFIG[name] = value conf = CONFIG.copy() # # Configure our global HTTP server and make # sure that we don't provide filesystem access # even by mistake. # conf["http.server.rootdir"] = "" HTTP_SERVER.configure(conf) # # New-new style: don't bother with abstraction and start the f*****g # server by invoking its listen() method. # if CONFIG['server.raw']: logging.debug('server: starting raw server... in progress') RAW_SERVER_EX.listen((address, 12345), CONFIG['prefer_ipv6'], 0, '') logging.debug('server: starting raw server... complete') if conf['server.skype']: logging.debug('server: starting skype server... in progress') SKYPE_SERVER_EX.listen((":: 0.0.0.0", 45678), CONFIG['prefer_ipv6'], 0, '') logging.debug('server: starting skype server... complete') # # New-style modules are started just setting a # bunch of conf[] variables and then invoking # their run() method in order to kick them off. # This is now depricated in favor of the new- # new style described above. # if conf["server.negotiate"]: negotiate.run(POLLER, conf) if conf["server.bittorrent"]: conf["bittorrent.address"] = address conf["bittorrent.listen"] = True conf["bittorrent.negotiate"] = True bittorrent.run(POLLER, conf) if conf['server.speedtest']: #conf['speedtest.listen'] = 1 # Not yet #conf['speedtest.negotiate'] = 1 # Not yet neubot.speedtest.wrapper.run(POLLER, conf) # Migrating from old style to new style if conf["server.rendezvous"]: #conf["rendezvous.listen"] = True # Not yet neubot.rendezvous.server.run() # # Historically Neubot runs on port 9773 and # 8080 but we would like to switch to port 80 # in the long term period, because it's rare # that they filter it. # OTOH it looks like it's not possible to # do that easily w/ M-Lab because the port # is already taken. # ports = (80, 8080, 9773) for port in ports: HTTP_SERVER.listen((address, port)) # # Start server-side API for Nagios plugin # to query the state of the server. # functionalities. # if conf["server.sapi"]: server = ServerSideAPI(POLLER) server.configure(conf) HTTP_SERVER.register_child(server, "/sapi") # # Create localhost-only debug server # if CONFIG['server.debug']: logging.info('server: Starting debug server at {127.0.0.1,::1}:9774') server = DebugAPI(POLLER) server.configure(conf) server.listen(('127.0.0.1 ::1', 9774)) # Probe existing modules and ask them to attach to us utils_modules.modprobe(None, "server", { "http_server": HTTP_SERVER, "negotiate_server": NEGOTIATE_SERVER, }) # # Go background and drop privileges, # then enter into the main loop. # if conf["server.daemonize"]: LOG.redirect() system.go_background() sigterm_handler = lambda signo, frame: POLLER.break_loop() signal.signal(signal.SIGTERM, sigterm_handler) logging.info('Neubot server -- starting up') system.drop_privileges() POLLER.loop() logging.info('Neubot server -- shutting down') utils_posix.remove_pidfile('/var/run/neubot.pid')
def main(args): config.register_descriptions() common.main("bittorrent", "Neubot BitTorrent module", args) conf = CONFIG.copy() config.finalize_conf(conf) if conf["bittorrent.listen"]: # # If we need to negotiate and we're runing # standalone we also need to bring up the # global HTTP server. # if conf["bittorrent.negotiate"]: HTTP_SERVER.configure(conf) HTTP_SERVER.listen((conf["bittorrent.address"], conf["bittorrent.negotiate.port"])) conf["negotiate.listen"] = True negotiate.run(POLLER, conf) # # Drop privileges after listen() so we can # bind() to privileged ports # if conf["bittorrent.daemonize"]: system.change_dir() system.go_background() LOG.redirect() system.drop_privileges(LOG.error) else: # # If possible use the runner, which will execute the # test in the context of the neubot daemon. Then exit # to bypass the run() invokation that is below here. # If the runner fails, fallback to the usual code path, # which executes the test in the context of the local # process. # Set 'runned.enabled' to 0 to bypass the runner and # run the test locally. # if (utils.intify(conf['runner.enabled']) and runner_clnt.runner_client(conf["agent.api.address"], conf["agent.api.port"], LOG.noisy, "bittorrent")): sys.exit(0) LOG.info('Will run the test in the local context...') # # When we're connecting to a remote host to perform a test # we want Neubot to quit at the end of the test. When this # happens the test code publishes the "testdone" event, so # here we prepare to intercept the event and break our main # loop. # NOTIFIER.subscribe("testdone", lambda event, ctx: POLLER.break_loop()) run(POLLER, conf) POLLER.loop()
def main(args): """ Starts the server module """ # # Register descriptions in main() only so that # we don't advertise the name of knobs that aren't # relevant in the current context. # CONFIG.register_descriptions({ "server.bittorrent": "Start up BitTorrent test and negotiate server", "server.daemonize": "Become a daemon and run in background", 'server.debug': 'Run the localhost-only debug server', "server.negotiate": "Turn on negotiation infrastructure", "server.rendezvous": "Start up rendezvous server", "server.sapi": "Turn on Server-side API", "server.speedtest": "Start up Speedtest test and negotiate server", }) common.main("server", "Neubot server-side component", args) conf = CONFIG.copy() # # Configure our global HTTP server and make # sure that we don't provide filesystem access # even by mistake. # conf["http.server.rootdir"] = "" HTTP_SERVER.configure(conf) # # New-style modules are started just setting a # bunch of conf[] variables and then invoking # their run() method in order to kick them off. # if conf["server.negotiate"]: negotiate.run(POLLER, conf) if conf["server.bittorrent"]: conf["bittorrent.listen"] = True conf["bittorrent.negotiate"] = True bittorrent.run(POLLER, conf) if conf['server.speedtest']: #conf['speedtest.listen'] = 1 # Not yet #conf['speedtest.negotiate'] = 1 # Not yet neubot.speedtest.wrapper.run(POLLER, conf) # Migrating from old style to new style if conf["server.rendezvous"]: #conf["rendezvous.listen"] = True # Not yet neubot.rendezvous.server.run(POLLER, conf) # # Historically Neubot runs on port 9773 and # 8080 but we would like to switch to port 80 # in the long term period, because it's rare # that they filter it. # OTOH it looks like it's not possible to # do that easily w/ M-Lab because the port # is already taken. # address = "0.0.0.0" ports = (80, 8080, 9773) for port in ports: HTTP_SERVER.listen((address, port)) # # Start server-side API for Nagios plugin # to query the state of the server. # functionalities. # if conf["server.sapi"]: server = ServerSideAPI(POLLER) server.configure(conf) HTTP_SERVER.register_child(server, "/sapi") # # Create localhost-only debug server # if CONFIG['server.debug']: LOG.info('server: Starting debug server at 127.0.0.1:9774') server = DebugAPI(POLLER) server.configure(conf) server.listen(('127.0.0.1', 9774)) # # Go background and drop privileges, # then enter into the main loop. # if conf["server.daemonize"]: system.change_dir() system.go_background() system.write_pidfile() LOG.redirect() system.drop_privileges(LOG.error) POLLER.loop()
def main(args): """ Starts the server module """ # # Register descriptions in main() only so that # we don't advertise the name of knobs that aren't # relevant in the current context. # CONFIG.register_descriptions({ "server.bittorrent": "Start up BitTorrent test and negotiate server", "server.daemonize": "Become a daemon and run in background", "server.negotiate": "Turn on negotiation infrastructure", "server.rendezvous": "Start up rendezvous server", "server.sapi": "Turn on Server-side API", "server.speedtest": "Start up Speedtest test and negotiate server", }) common.main("server", "Neubot server-side component", args) conf = CONFIG.copy() # # Configure our global HTTP server and make # sure that we don't provide filesystem access # even by mistake. # conf["http.server.rootdir"] = "" HTTP_SERVER.configure(conf) # # New-style modules are started just setting a # bunch of conf[] variables and then invoking # their run() method in order to kick them off. # if conf["server.negotiate"]: conf["negotiate.listen"] = True negotiate.run(POLLER, conf) if conf["server.bittorrent"]: conf["bittorrent.listen"] = True conf["bittorrent.negotiate"] = True bittorrent.run(POLLER, conf) # Migrating from old style to new style if conf["server.rendezvous"]: #conf["rendezvous.listen"] = True # Not yet neubot.rendezvous.server.run(POLLER, conf) # # Old-style modules are less engineered and so # they're a bit more painful to start up. This # August maybe I will have time to migrate 'em # to run() interface. # if conf["server.speedtest"]: server = ServerSpeedtest(None) server.configure(conf) HTTP_SERVER.register_child(server, "/speedtest") # # Historically Neubot runs on port 9773 and # 8080 but we would like to switch to port 80 # in the long term period, because it's rare # that they filter it. # address = "0.0.0.0" ports = (80, 8080, 9773) for port in ports: HTTP_SERVER.listen((address, port)) # # Start server-side API for Nagios plugin # to query the state of the server. # functionalities. # if conf["server.sapi"]: server = ServerSideAPI(POLLER) server.configure(conf) HTTP_SERVER.register_child(server, "/sapi") # # Go background and drop privileges, # then enter into the main loop. # if conf["server.daemonize"]: system.change_dir() system.go_background() LOG.redirect() system.drop_privileges(LOG.error) POLLER.loop()
def main(args): """ Starts the server module """ if not system.has_enough_privs(): sys.exit("FATAL: you must be root") try: options, arguments = getopt.getopt(args[1:], "b:D:dv") except getopt.error: sys.exit(USAGE) if arguments: sys.exit(USAGE) backend = "mlab" for name, value in options: if name == "-b": backend = value elif name == "-D": name, value = value.split("=", 1) if name not in VALID_MACROS: sys.exit(USAGE) SETTINGS[name] = int(value) elif name == "-d": SETTINGS["server.daemonize"] = 0 elif name == "-v": CONFIG["verbose"] = 1 logging.debug("server: using backend: %s... in progress", backend) if backend == "mlab": FILESYS.datadir_init() BACKEND.use_backend("mlab") elif backend == "neubot": DATABASE.connect() BACKEND.use_backend("neubot") else: BACKEND.use_backend("null") logging.debug("server: using backend: %s... complete", backend) for name, value in SETTINGS.items(): CONFIG[name] = value conf = CONFIG.copy() # # Configure our global HTTP server and make # sure that we don't provide filesystem access # even by mistake. # conf["http.server.rootdir"] = "" HTTP_SERVER.configure(conf) # # New-new style: don't bother with abstraction and start the f*****g # server by invoking its listen() method. # if CONFIG["server.raw"]: logging.debug("server: starting raw server... in progress") RAW_SERVER_EX.listen((":: 0.0.0.0", 12345), CONFIG["prefer_ipv6"], 0, "") logging.debug("server: starting raw server... complete") # # New-style modules are started just setting a # bunch of conf[] variables and then invoking # their run() method in order to kick them off. # if conf["server.negotiate"]: negotiate.run(POLLER, conf) if conf["server.bittorrent"]: conf["bittorrent.listen"] = True conf["bittorrent.negotiate"] = True bittorrent.run(POLLER, conf) if conf["server.speedtest"]: # conf['speedtest.listen'] = 1 # Not yet # conf['speedtest.negotiate'] = 1 # Not yet neubot.speedtest.wrapper.run(POLLER, conf) # Migrating from old style to new style if conf["server.rendezvous"]: # conf["rendezvous.listen"] = True # Not yet neubot.rendezvous.server.run() # # Historically Neubot runs on port 9773 and # 8080 but we would like to switch to port 80 # in the long term period, because it's rare # that they filter it. # OTOH it looks like it's not possible to # do that easily w/ M-Lab because the port # is already taken. # address = ":: 0.0.0.0" ports = (80, 8080, 9773) for port in ports: HTTP_SERVER.listen((address, port)) # # Start server-side API for Nagios plugin # to query the state of the server. # functionalities. # if conf["server.sapi"]: server = ServerSideAPI(POLLER) server.configure(conf) HTTP_SERVER.register_child(server, "/sapi") # # Create localhost-only debug server # if CONFIG["server.debug"]: logging.info("server: Starting debug server at {127.0.0.1,::1}:9774") server = DebugAPI(POLLER) server.configure(conf) server.listen(("127.0.0.1 ::1", 9774)) # # Go background and drop privileges, # then enter into the main loop. # if conf["server.daemonize"]: LOG.redirect() system.go_background() system.drop_privileges() POLLER.loop()