def get_server_ip_list(): ip_list = [] with open(get_topo_file('servers'), 'r') as serversfile: for line in strip_comments(serversfile): ip_list.append(line.strip()) serversfile.closed return ip_list
def install_filters(links_file): with open(links_file, 'r') as linksf: for line in strip_comments(linksf): elems = line.split(' ') check_output('%s update %s %s -c %i'\ % (TC_SETUP, elems[0], elems[2], int(elems[1].split('link')[1]))) linksf.closed
def run_events(): # Remove existing log file if args.log and os.path.isfile(args.log): os.remove(args.log) # Read event list events = [] with open(get_topo_file('events'), 'r') as eventsf: for line in strip_comments(eventsf): events.append(line.split(' ')) eventsf.closed # Run events logging.getLogger(__name__).info('Running link events...') for event in events: # decide when to execute this event if event[0] is '*': raw_input('Press enter to run event: %s' % ' '.join(event)) else: try: time.sleep(float(event[0])) except: logging.getLogger(__name__).warning('Skipping invalid event: %s' % ' '.join(event)) continue execute_event(event) logging.getLogger(__name__).info('Done running events.')
def run_events(): # Remove existing log file if args.log and os.path.isfile(args.log): os.remove(args.log) # Read event list events = [] with open(get_topo_file('events'), 'r') as eventsf: for line in strip_comments(eventsf): events.append(line.split(' ')) eventsf.closed # Run events logging.getLogger(__name__).info('Running link events...') for event in events: # decide when to execute this event if event[0] == '*': input('Press enter to run event: %s' % ' '.join(event)) else: try: time.sleep(float(event[0])) except: logging.getLogger(__name__).warning( 'Skipping invalid event: %s' % ' '.join(event)) continue execute_event(event) logging.getLogger(__name__).info('Done running events.')
def run_events(): # Remove existing log file if args.log and os.path.isfile(args.log): os.remove(args.log) # Read event list events = [] with open(args.events) as events_file: for line in strip_comments(events_file): events.append(line.split(' ')) events_file.closed # Open control socket logging.getLogger(__name__).info("Establish control connection") s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("127.0.0.1", 7777)) logging.getLogger(__name__).info(s.recv(BUF_SIZE)) # Run events logging.getLogger(__name__).info('Running link events...') for event in events: # decide when to execute this event if event[0] is '*': raw_input('Press enter to run event: %s' % ' '.join(event)) else: try: time.sleep(float(event[0])) except: logging.getLogger(__name__).warning( 'Skipping invalid event: %s' % ' '.join(event)) continue execute_event(s, event) s.close() logging.getLogger(__name__).info('Done running events.')
def parse_cli(self, args=None): # explicitly set cmd-line options, parsed according to default parser super(FrameworkCLIHandler, self).parse_cli(args) cli_opts = self.config # default values only, from running default parser on empty input defaults = vars(self.parser.parse_args([])) chained_dict_list = [cli_opts, defaults] # deal with options set in user-specified file, if present config_path = cli_opts.get('config_file', None) file_str = '' if config_path: try: with open(config_path, 'r') as f: file_str = f.read() except Exception: print( "ERROR: Can't read config file at {}.".format(config_path)) if file_str: try: file_opts = util.parse_json(file_str) # overwrite default case_list and pod_list, if given if 'case_list' in file_opts: self.case_list = file_opts.pop('case_list') if 'pod_list' in file_opts: self.pod_list = file_opts.pop('pod_list') if 'argument_groups' in file_opts or 'arguments' in file_opts: # assume config_file is a modified copy of the defaults, # with options to define parser. Set up the parser and run # CLI arguments through it (instead of default). # Don't error on unrecognized args here, since those will be # caught by the default parser. custom_parser = self.make_parser(file_opts) chained_dict_list = [ # CLI parsed with config_file's parser vars(custom_parser.parse_known_args()[0]), # defaults set in config_file's parser vars(custom_parser.parse_known_args([])[0]) ] + chained_dict_list else: # assume config_file a JSON dict of option:value pairs. file_opts = { self.canonical_arg_name(k): v for k, v in file_opts.iteritems() } chained_dict_list = [cli_opts, file_opts, defaults] except Exception: if 'json' in os.path.splitext('config_path')[1].lower(): print("ERROR: Couldn't parse JSON in {}.".format( config_path)) raise # assume config_file is a plain text file containing flags, etc. # as they would be passed on the command line. file_str = util.strip_comments(file_str, '#') file_opts = vars(self.parser.parse_args(shlex.split(file_str))) chained_dict_list = [cli_opts, file_opts, defaults] # CLI opts override options set from file, which override defaults self.config = dict(ChainMap(*chained_dict_list))
def autogen_click_conf(servers_file, clients_file, dns_file): logging.getLogger(__name__).debug("Autogenerating %s from %s and %s" % (CLICK_CONF, servers_file, clients_file)) with open(CLICK_CONF, "w") as clickfile: clickfile.write("// This file is autogenerated. Do not hand edit.\n\n") with open(servers_file, "r") as serversfile: for line in strip_comments(serversfile): clickfile.write("KernelTun(%s/8) -> Discard;\n" % (line.strip())) serversfile.closed with open(clients_file, "r") as clientsfile: for line in strip_comments(clientsfile): clickfile.write("KernelTun(%s/8) -> Discard;\n" % (line.strip())) clientsfile.closed with open(dns_file, "r") as dnsfile: for line in strip_comments(dnsfile): clickfile.write("KernelTun(%s/8) -> Discard;\n" % (line.strip())) dnsfile.closed clickfile.closed
def main(): terminate_counters() with open(args.servers) as servers_file: for line in strip_comments(servers_file): server_ports.append(int(line)) servers_file.closed start_counters() signal.signal(signal.SIGINT, sig_terminal_handler)
def autogen_click_conf(servers_file, clients_file, dns_file): logging.getLogger(__name__).debug('Autogenerating %s from %s and %s'\ % (CLICK_CONF, servers_file, clients_file)) with open(CLICK_CONF, 'w') as clickfile: clickfile.write('// This file is autogenerated. Do not hand edit.\n\n') with open(servers_file, 'r') as serversfile: for line in strip_comments(serversfile): clickfile.write('KernelTun(%s/8) -> Discard;\n' % (line.strip())) serversfile.closed with open(clients_file, 'r') as clientsfile: for line in strip_comments(clientsfile): clickfile.write('KernelTun(%s/8) -> Discard;\n' % (line.strip())) clientsfile.closed with open(dns_file, 'r') as dnsfile: for line in strip_comments(dnsfile): clickfile.write('KernelTun(%s/8) -> Discard;\n' % (line.strip())) dnsfile.closed clickfile.closed
def parse_cli(self, args=None): # explicitly set cmd-line options, parsed according to default parser; # result stored in self.config self.preparse_cli(args) # handle positionals here because we need to find input_file self.parse_positionals('input_file') self.parse_positionals('root_dir') # deal with options set in user-specified defaults file, if present config_path = self.config.get('INPUT_FILE', None) config_str = '' if config_path: try: with open(config_path, 'r') as f: config_str = f.read() except Exception: print( "ERROR: Can't read input file at {}.".format(config_path)) if config_str: try: file_input = util.parse_json(config_str) # overwrite default case_list and pod_list, if given if 'case_list' in file_input: self.case_list = file_input.pop('case_list') if 'pod_list' in file_input: self.pod_list = file_input.pop('pod_list') # assume config_file a JSON dict of option:value pairs. self.partial_defaults = [{ self.canonical_arg_name(k): v for k, v in file_input.iteritems() }] except Exception: if 'json' in os.path.splitext('config_path')[1].lower(): print("ERROR: Couldn't parse JSON in {}.".format( config_path)) raise # assume config_file is a plain text file containing flags, etc. # as they would be passed on the command line. config_str = util.strip_comments(config_str, '#') self.partial_defaults = [ vars(self.parser.parse_args(shlex.split(config_str))) ] # CLI opts override options set from file, which override defaults super(FrameworkCLIHandler, self).parse_cli(args)
def start_servers(): if servers_running(): logging.getLogger(__name__).info('Some components already running...') stop_servers() logging.getLogger(__name__).info('Starting servers...') # Launch apache instances logging.getLogger(__name__).info('Configuring apache...') if args.topology == 'servers': with open(args.servers) as servers_file: for line in strip_comments(servers_file): servers.append('127.0.0.1:%d' % int(line)) servers_port.append(int(line)) servers_file.closed try: configure_apache(servers) restart_apache() except Exception as e: logging.getLogger(__name__).error(e) else: if args.topology == 'onelink': try: configure_apache(['127.0.0.1:8080']) restart_apache() except Exception as e: logging.getLogger(__name__).error(e) else: try: configure_apache(['127.0.0.1:8080', '127.0.0.1:8081']) restart_apache() except Exception as e: logging.getLogger(__name__).error(e) # Create click bandwidth shaper logging.getLogger(__name__).info('Creating bandwidth shaper...') autogen_click() run_bg('click %s.click' % args.topology) logging.getLogger(__name__).info('Network started.')
def stop_servers(): logging.getLogger(__name__).info('Stopping simulated network...') # stop apache instances logging.getLogger(__name__).info('Stopping apache...') if args.topology == 'servers': servers = [] with open(args.servers) as servers_file: for line in strip_comments(servers_file): servers.append(int(line)) servers_file.closed try: reset_apache(servers) restart_apache() except Exception as e: logging.getLogger(__name__).error(e) else: if args.topology == 'onelink': try: reset_apache(['127.0.0.1:8080']) restart_apache() except Exception as e: logging.getLogger(__name__).error(e) else: try: reset_apache(['127.0.0.1:8080', '127.0.0.1:8081']) restart_apache() except Exception as e: logging.getLogger(__name__).error(e) # Destroy fake NICs logging.getLogger(__name__).info('Destroying bandwidth shaper...') try: check_both('killall -9 click', shouldPrint=False) time.sleep(0.1) except: pass logging.getLogger(__name__).info('Network stopped.')
# set up logging if args.verbose: level = logging.DEBUG else: level = logging.INFO logging.basicConfig( format = "%(levelname) -10s %(asctime)s %(module)s:%(lineno) -7s %(message)s", level = level ) # Read event list events = [] with open(args.events) as events_file: for i, line in enumerate(strip_comments(events_file)): arguments = line.split(' ') events.append(Thread(target=execute_event, args=(i, float(arguments[0]), int(arguments[1]), int(arguments[2]), float(arguments[3]), int(arguments[4]), int(arguments[5])))) events_file.closed for event in events: event.start() for event in events: event.join() logging.getLogger(__name__).info('Events finished')
def install_filters(links_file): with open(links_file, "r") as linksf: for line in strip_comments(linksf): elems = line.split(" ") check_output("%s update %s %s -c %i" % (TC_SETUP, elems[0], elems[2], int(elems[1].split("link")[1]))) linksf.closed