def deleteslice(): url = "http://%s/stats/disableinsert" %\ settings.properties['sdncontroller'] r_ = requests.get(url=url) if r_.status_code != requests.codes.ok: logger.error(r_.text) else: logger.debug("Disable insert body: %s" % (r_.json())) url = "http://%s/stats/flowentry/delete" %\ settings.properties['sdncontroller'] logger.debug("Flows to be deleted: %s" % delflows.flows) for f in delflows.flows: logger.info("post %s: %s" % ( url, f, )) r_ = requests.post(url=url, headers={'content-type': 'application/json'}, data=json.dumps(f)) if r_.status_code != requests.codes.ok: logger.error("Error in the response: %s" % r_) bottle.abort(500, r_) return bottle.HTTPResponse(body=[], status=201)
def smosfile(name): logger.info("get-smosfile: %s" % (name)) body = {'status': "ko"} if name in sample_files(settings.properties['samples']): body['status'] = "ok" return bottle.HTTPResponse(body=pretty_dumps(body), status=200)
def main(argv=None): if not argv: argv = sys.argv try: parser_ = argparse.ArgumentParser( description='Data Preprocessing on Demand COLLECTOR-server', epilog='Report bugs to ' + '<*****@*****.**>', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser_.add_argument('-a', '--address', default='0.0.0.0', help='server address') parser_.add_argument('-p', '--port', default=9000, help='server port') parser_.add_argument('-r', '--reload', default=False, action="store_true", help='reload the web-server') args_ = parser_.parse_args() except Exception as e: logger.error("Got an Exception parsing flags/options: %s" % (e, )) return False logger.debug("%s" % (args_, )) # verify the provided settings ret, error = verify_settings() if not ret: logger.error("Settings failure: %s" % (error, )) return False try: RTTMANAGER.start() logger.info("Starting COLLECTOR-server main cycle on %s:%s" % ( args_.address, args_.port, )) bottle.run(host=args_.address, port=args_.port, debug=True, server='paste', reloader=args_.reload) except KeyboardInterrupt: logger.warning("User interruption!") except Exception as ex: logger.error("Exception: %s" % (ex, )) return False RTTMANAGER.stop() logger.warning("Bye Bye...") return True
def smosfiles(): logger.info("get-smosfiles") body = {'smosfiles': []} test = { 'id': settings.properties['name'], 'data': sample_files(settings.properties['samples']) } body['smosfiles'].append(test) return bottle.HTTPResponse(body=pretty_dumps(body), status=200)
def stop(self): timeout = 5 # do not block for a long time! logger.debug("Stopping the rtt-manager service") self.__close() try: if self.is_alive(): logger.debug("Joining %dsecs" % (timeout,)) self.join(timeout=timeout) logger.info("rtt-manager service successfully stopped!") except Exception as e: logger.error("RunTime error: %s" % (str(e),))
def main(argv=None): if not argv: argv = sys.argv try: parser_ = argparse.ArgumentParser( description='Data Preprocessing on Demand COLLECTOR-server', epilog='Report bugs to ' + '<*****@*****.**>', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser_.add_argument( '-a', '--address', default='0.0.0.0', help='server address') parser_.add_argument( '-p', '--port', default=9000, help='server port') parser_.add_argument( '-r', '--reload', default=False, action="store_true", help='reload the web-server') args_ = parser_.parse_args() except Exception as e: logger.error("Got an Exception parsing flags/options: %s" % (e,)) return False logger.debug("%s" % (args_,)) # verify the provided settings ret, error = verify_settings() if not ret: logger.error("Settings failure: %s" % (error,)) return False try: RTTMANAGER.start() logger.info("Starting COLLECTOR-server main cycle on %s:%s" % (args_.address, args_.port,)) bottle.run(host=args_.address, port=args_.port, debug=True, server='paste', reloader=args_.reload) except KeyboardInterrupt: logger.warning("User interruption!") except Exception as ex: logger.error("Exception: %s" % (ex,)) return False RTTMANAGER.stop() logger.warning("Bye Bye...") return True
def scp(): logger.debug("post-scp") if bottle.request.headers['content-type'] != 'application/json': bottle.abort(500, "Application Type must be json!") logger.info("Body: %s" % (bottle.request.json)) # We assume that only the 1 file should be transmitted! if len(bottle.request.json.get('data')) != 1: bottle.abort(500, "Unsupported data length!") data = bottle.request.json.get('data')[0] user = bottle.request.json.get('username') pswd = bottle.request.json.get('password') host = bottle.request.json.get('host') dest = bottle.request.json.get('destination') source = samples_dir(settings.properties['samples']) + '/' + data destination = dest + '/' + data logger.debug("Source: %s, Destination: %s" % (source, destination)) body = { 'scp': { 'uid': data + "__" + str(time.time()), 'starttime': time.time(), 'endtime': None, } } # Create a connection to the server ssh = None try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.WarningPolicy()) ssh.connect(host, username=user, password=pswd, timeout=10) sftp = ssh.open_sftp() ret = sftp.put(source, destination) body['scp']['endtime'] = time.time() logger.debug("Result: %s" % (ret)) except Exception as e: bottle.abort(500, str(e)) finally: if ssh: ssh.close() return bottle.HTTPResponse(body=pretty_dumps(body), status=200)
def submit(): if 'application/json' not in bottle.request.headers['content-type']: bottle.abort(500, "Application Type must be json!") logger.info("post-submit: %s" % (bottle.request.json)) owners = localize_file(bottle.request.json.get('file')) logger.debug("Owners: %s" % (owners, )) # path is a list of tuple, in which each element is a # source/destination value path = path_min_rtt(owners, bottle.request.json.get('host')) logger.debug("Path with minimum RTT: %s" % (path)) body = [] for p in path: # call the agent to make the copy url = "http://%s/scp" % p[0] payload = { "data": [bottle.request.json.get('file')], "username": bottle.request.json.get('username'), "password": bottle.request.json.get('password'), "host": p[1], "destination": bottle.request.json.get('destination') } logger.debug("post %s: %s" % ( url, payload, )) r_ = requests.post(url=url, headers={'content-type': 'application/json'}, data=json.dumps(payload)) if r_.status_code != requests.codes.ok: logger.error(r_.text) bottle.abort(500, r_.text) else: logger.debug("Response %s body: %s" % (x, r_.json())) test = { "source": p[0], "destination": p[1], "value": r_.json().get('scp') } body.append(test) return bottle.HTTPResponse(body=pretty_dumps(body), status=201)
def submit(): if 'application/json' not in bottle.request.headers['content-type']: bottle.abort(500, "Application Type must be json!") logger.info("post-submit: %s" % (bottle.request.json)) owners = localize_file(bottle.request.json.get('file')) logger.debug("Owners: %s" % (owners,)) # path is a list of tuple, in which each element is a # source/destination value path = path_min_rtt(owners, bottle.request.json.get('host')) logger.debug("Path with minimum RTT: %s" % (path)) body = [] for p in path: # call the agent to make the copy url = "http://%s/scp" % p[0] payload = { "data": [bottle.request.json.get('file')], "username": bottle.request.json.get('username'), "password": bottle.request.json.get('password'), "host": p[1], "destination": bottle.request.json.get('destination') } logger.debug("post %s: %s" % (url, payload,)) r_ = requests.post( url=url, headers={'content-type': 'application/json'}, data=json.dumps(payload)) if r_.status_code != requests.codes.ok: logger.error(r_.text) bottle.abort(500, r_.text) else: logger.debug("Response %s body: %s" % (x, r_.json())) test = { "source": p[0], "destination": p[1], "value": r_.json().get('scp') } body.append(test) return bottle.HTTPResponse(body=pretty_dumps(body), status=201)
def smosfiles(): logger.info("get-smosfiles") body = {'smosfiles': []} for k, v in settings.properties['peers'].items(): logger.debug("Testbed: %s" % (k,)) for x in v: r_ = requests.get(url="http://%s/smosfiles" % x) logger.debug("Response body: %s" % r_.json()) test = { 'testbed': k, 'address': x.split(':')[0], 'port': x.split(':')[1] } for data in r_.json()['smosfiles']: test['id'] = data['id'] test['data'] = data['data'] body['smosfiles'].append(test) return bottle.HTTPResponse(body=pretty_dumps(body), status=200)
def smosfiles(): logger.info("get-smosfiles") body = {'smosfiles': []} for k, v in settings.properties['peers'].items(): logger.debug("Testbed: %s" % (k, )) for x in v: r_ = requests.get(url="http://%s/smosfiles" % x) logger.debug("Response body: %s" % r_.json()) test = { 'testbed': k, 'address': x.split(':')[0], 'port': x.split(':')[1] } for data in r_.json()['smosfiles']: test['id'] = data['id'] test['data'] = data['data'] body['smosfiles'].append(test) return bottle.HTTPResponse(body=pretty_dumps(body), status=200)
def deleteslice(): url = "http://%s/stats/disableinsert" %\ settings.properties['sdncontroller'] r_ = requests.get(url=url) if r_.status_code != requests.codes.ok: logger.error(r_.text) else: logger.debug("Disable insert body: %s" % (r_.json())) url = "http://%s/stats/flowentry/delete" %\ settings.properties['sdncontroller'] logger.debug("Flows to be deleted: %s" % delflows.flows) for f in delflows.flows: logger.info("post %s: %s" % (url, f,)) r_ = requests.post( url=url, headers={'content-type': 'application/json'}, data=json.dumps(f)) if r_.status_code != requests.codes.ok: logger.error("Error in the response: %s" % r_) bottle.abort(500, r_) return bottle.HTTPResponse(body=[], status=201)
def ping(host): logger.info("get-ping: %s" % (host)) body = {'rtt': 0} try: cmd = "ping -c 1 -W 3 " + host ret = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT) ret = ret.split('\n')[-3:] xstats, tstats = ret[0].split(","), ret[1].split("=")[1].split("/") loss, pmin, avg, pmax =\ float(xstats[2].split("%")[0]), float(tstats[0]),\ float(tstats[1]), float(tstats[2]) logger.debug("packet-loss=%s, min=%s, avg=%s, max=%s" % (loss, pmin, avg, pmax)) body['rtt'] = avg except Exception as e: bottle.abort(500, str(e)) return bottle.HTTPResponse(body=pretty_dumps(body), status=200)