#!/usr/bin/python3 ############################################################################### # # # libloc - A library to determine the location of someone on the Internet # # # # Copyright (C) 2017 IPFire Development Team # # # # This library is free software; you can redistribute it and/or # # modify it under the terms of the GNU Lesser General Public # # License as published by the Free Software Foundation; either # # version 2.1 of the License, or (at your option) any later version. # # # # This library is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # # Lesser General Public License for more details. # # # ############################################################################### import argparse import gettext import sys import syslog # Load our location module import location # i18n def _(singular, plural=None, n=None): if plural: return gettext.dngettext("libloc", singular, plural, n) return gettext.dgettext("libloc", singular) class CLI(object): def __init__(self): # Open database self.db = location.Database("@databasedir@/database.db") def parse_cli(self): parser = argparse.ArgumentParser( description=_("Location Database Command Line Interface"), ) subparsers = parser.add_subparsers() # Global configuration flags parser.add_argument("--debug", action="store_true", help=_("Enable debug output")) # version parser.add_argument("--version", action="version", version="%%(prog)s %s" % location.__version__) # lookup an IP address lookup = subparsers.add_parser("lookup", help=_("Lookup one or multiple IP addresses"), ) lookup.add_argument("address", nargs="+") lookup.set_defaults(func=self.handle_lookup) # Get AS get_as = subparsers.add_parser("get-as", help=_("Get information about one or multiple Autonomous Systems"), ) get_as.add_argument("asn", nargs="+") get_as.set_defaults(func=self.handle_get_as) # Search for AS search_as = subparsers.add_parser("search-as", help=_("Search for Autonomous Systems that match the string"), ) search_as.add_argument("query", nargs=1) search_as.set_defaults(func=self.handle_search_as) return parser.parse_args() def run(self): # Parse command line arguments args = self.parse_cli() # Callback function must be defined assert args.func, "Callback function not defined" # Call function ret = args.func(args) # Return with exit code if ret: sys.exit(ret) # Otherwise just exit sys.exit(0) def handle_lookup(self, ns): ret = 0 for address in ns.address: try: n = self.db.lookup(address) except ValueError: print(_("Invalid IP address: %s") % address, file=sys.stderr) args = { "address" : address, "network" : n, } # Nothing found? if not n: print(_("Nothing found for %(address)s") % args, file=sys.stderr) ret = 1 continue # Try to retrieve the AS if we have an AS number if n.asn: a = self.db.get_as(n.asn) # If we have found an AS we will print it in the message if a: args.update({ "as" : a, }) print(_("%(address)s belongs to %(network)s which is a part of %(as)s") % args) continue print(_("%(address)s belongs to %(network)s") % args) return ret def handle_get_as(self, ns): """ Gets information about Autonomous Systems """ ret = 0 for asn in ns.asn: try: asn = int(asn) except ValueError: print(_("Invalid ASN: %s") % asn, file=sys.stderr) ret = 1 continue # Fetch AS from database a = self.db.get_as(asn) # Nothing found if not a: print(_("Could not find AS%s") % asn, file=sys.stderr) ret = 1 continue print(_("AS%(asn)s belongs to %(name)s") % { "asn" : a.number, "name" : a.name }) return ret def handle_search_as(self, ns): for query in ns.query: # Print all matches ASes for a in self.db.search_as(query): print(a) def main(): # Run the command line interface c = CLI() c.run() main()