diff --git a/Pipfile b/Pipfile index 881b15d..1eabae8 100644 --- a/Pipfile +++ b/Pipfile @@ -7,6 +7,7 @@ verify_ssl = true [packages] librouteros = "==2.*" +progress = "*" [requires] python_version = "3.8" diff --git a/automonty b/automonty new file mode 100755 index 0000000..c84b726 --- /dev/null +++ b/automonty @@ -0,0 +1,60 @@ +#!/usr/bin/python3 + +import argparse +import librouteros +import progress.bar +import ssl +import os + +def connection( host, username = None, password = None, port = 8729 ): + if ':' in host: + ( host, port ) = host.split( ":", 1 ) + port = int( port ) + kwargs = { 'username': username or os.environ.get( 'AUTOMONTY_USERNAME', None ), + 'password': password or os.environ.get( 'AUTOMONTY_PASSWORD', None ), + 'host': host, + 'port': port, + } + kwargs[ 'ssl' ] = True + ssl_ctx = ssl.create_default_context() + ssl_ctx.check_hostname = False # XXX figure out how + ssl_option = 'CERT_REQUIRED' + ssl_ctx.verify_mode = getattr( ssl, ssl_option, ssl.CERT_REQUIRED ) + ssl_ctx.set_ciphers( 'DHE-RSA-AES256-GCM-SHA384' ) + kwargs[ 'ssl_wrapper' ] = ssl_ctx.wrap_socket + return librouteros.connect( **kwargs ) + +def connect_routers( routers ): + rval = {} + with progress.bar.PixelBar( 'Connecting', max = len( routers ) ) as bar: + for router in routers: + rval[ router ] = connection( router ) + bar.next() + return rval + +def monty_check( args ): + for addr in args.addr: + for name, api in args.router.items(): + for item in api( cmd ="/ip/address/print", detail = True ): + if item[ 'network' ] == addr: + print( name, ":", 'ENABLED' if not item[ 'disabled' ] else 'disabled', item[ 'interface' ], '#', item[ 'comment' ] ) + +def main(): + parser = argparse.ArgumentParser( prog = "automonty", + description = 'AutoMonty (re-)configures routers', + ) + subparsers = parser.add_subparsers() + + parser.add_argument( '--router', action = 'append' ) + + parser_check = subparsers.add_parser( 'check' ) + parser_check.add_argument( 'addr', action = 'append' ) + parser_check.set_defaults( func = monty_check ) + + args = parser.parse_args() + args.router = connect_routers( args.router ) + + args.func( args ) + +if __name__ == '__main__': + main()