def cmdline(cmdarg): route = ''.join(cmdarg.payload).replace(' ', '') if not is_bgp(route): # parser.print_usage() sys.stdout.write('Environment values are:\n%s\n\n' % '\n'.join(' - %s' % _ for _ in Env.default())) sys.stdout.write('The BGP message must be an hexadecimal string.\n\n') sys.stdout.write('All colons or spaces are ignored, for example:\n\n') sys.stdout.write(' 001E0200000007900F0003000101\n') sys.stdout.write(' 001E:02:0000:0007:900F:0003:0001:01\n') sys.stdout.write( ' FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF001E0200000007900F0003000101\n') sys.stdout.write( ' FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:001E:02:0000:0007:900F:0003:0001:01\n' ) sys.stdout.write( " FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 001E02 00000007900F0003000101\n" ) sys.stdout.flush() sys.exit(1) env = getenv() env.bgp.passive = True env.log.parser = True env.tcp.bind = '' if cmdarg.debug: env.log.all = True env.log.level = 'DEBUG' if cmdarg.pdb: env.debug.pdb = True log.init(env) trace_interceptor(env.debug.pdb) sanitized = ''.join(cmdarg.payload).replace(':', '').replace(' ', '') if cmdarg.configuration: configuration = Configuration([getconf(cmdarg.configuration)]) elif cmdarg.family: families = cmdarg.family.split() if len(families) % 2: sys.stdout.write('families provided are invalid') sys.stdout.flush() sys.exit(1) families_pair = [families[n:n + 2] for n in range(0, len(families), 2)] families_text = ';'.join([f'{a} {s}' for a, s in families_pair]) conf = conf_none.replace('[families]', families_text) configuration = Configuration([conf], text=True) else: configuration = Configuration([conf_all], text=True) valid_nlri = Reactor(configuration).check(sanitized, cmdarg.nlri) if valid_nlri: return 0 return 1
def cmdline(cmdarg): env = getenv() # Must be done before setting the logger as it modify its behaviour if cmdarg.verbose: env.log.all = True env.log.level = syslog.LOG_DEBUG log.init() if cmdarg.pdb: env.debug.pdb = True if cmdarg.verbose: env.log.parser = True for configuration in cmdarg.configuration: log.notice(f'loading {configuration}', 'configuration') location = getconf(configuration) if not location: log.critical(f'{configuration} is not an exabgp config file', 'configuration') sys.exit(1) config = Reactor([location]).configuration if not config.reload(): log.critical(f'{configuration} is not a valid config file', 'configuration') sys.exit(1) log.info(f'\u2713 loading', 'configuration') if cmdarg.neighbor: log.notice(f'checking neighbors', 'configuration') for name, neighbor in config.neighbors.items(): reparsed = neighbor.string() for line in reparsed.split('\n'): log.debug(line, configuration) log.info(f'\u2713 neighbor {name.split()[1]}', 'configuration') if cmdarg.route: log.notice(f'checking routes', 'configuration') if not check_generation(config.neighbors): log.critical(f'{configuration} has an invalid route', 'configuration') sys.exit(1) log.info(f'\u2713 routes', 'configuration')
def cmdline(cmdarg): route = ''.join(cmdarg.payload).replace(' ', '') if not is_bgp(route): # parser.print_usage() sys.stdout.write('Environment values are:\n%s\n\n' % '\n'.join(' - %s' % _ for _ in Env.default())) sys.stdout.write('The BGP message must be an hexadecimal string.\n\n') sys.stdout.write('All colons or spaces are ignored, for example:\n\n') sys.stdout.write(' 001E0200000007900F0003000101\n') sys.stdout.write(' 001E:02:0000:0007:900F:0003:0001:01\n') sys.stdout.write( ' FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF001E0200000007900F0003000101\n') sys.stdout.write( ' FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:001E:02:0000:0007:900F:0003:0001:01\n' ) sys.stdout.write( " FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 001E02 00000007900F0003000101\n" ) sys.stdout.flush() sys.exit(1) env = getenv() env.bgp.passive = True env.log.parser = True env.tcp.bind = '' if cmdarg.debug: env.log.all = True env.log.level = 'DEBUG' if cmdarg.pdb: env.debug.pdb = True log.init(env) trace_interceptor(env.debug.pdb) sanitized = ''.join(cmdarg.payload).replace(':', '').replace(' ', '') Reactor([getconf(cmdarg.configuration)]).check(sanitized)
def cmdline(cmdarg): if not os.path.isfile(ENVFILE): comment = 'environment file missing\ngenerate it using "exabgp env --fi > %s"' % ENVFILE else: comment = '' env = getenv() # Must be done before setting the logger as it modify its behaviour if cmdarg.debug: env.log.all = True env.log.level = syslog.LOG_DEBUG log.init() if cmdarg.profile: env.profile.enable = True env.profile.file = cmdarg.profile if cmdarg.once: env.tcp.once = True if cmdarg.pdb: env.debug.pdb = True if cmdarg.test: env.log.parser = True if cmdarg.memory: env.debug.memory = True if env.cache.attributes: Attribute.caching = env.cache.attributes configurations = [] for configuration in cmdarg.configuration: location = getconf(configuration) if not location: log.critical(f'{configuration} is not an exabgp config file', 'configuration') sys.exit(1) configurations.append(configuration) delay = cmdarg.signal _delayed_signal(delay, signal.SIGUSR1) if env.debug.rotate or len(configurations) == 1: run(comment, configurations, cmdarg.validate) if not (env.log.destination in ('syslog', 'stdout', 'stderr') or env.log.destination.startswith('host:')): log.error('can not log to files when running multiple configuration (as we fork)', 'configuration') sys.exit(1) try: # run each configuration in its own process pids = [] for configuration in configurations: pid = os.fork() if pid == 0: run(comment, [configuration], cmdarg.validate, os.getpid()) else: pids.append(pid) # If we get a ^C / SIGTERM, ignore just continue waiting for our child process signal.signal(signal.SIGINT, signal.SIG_IGN) # wait for the forked processes for pid in pids: os.waitpid(pid, 0) except OSError as exc: log.critical('can not fork, errno %d : %s' % (exc.errno, exc.strerror), 'reactor') sys.exit(1)