2 ###############################################################################
4 # libloc - A library to determine the location of someone on the Internet #
6 # Copyright (C) 2017 IPFire Development Team <info@ipfire.org> #
8 # This library is free software; you can redistribute it and/or #
9 # modify it under the terms of the GNU Lesser General Public #
10 # License as published by the Free Software Foundation; either #
11 # version 2.1 of the License, or (at your option) any later version. #
13 # This library is distributed in the hope that it will be useful, #
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU #
16 # Lesser General Public License for more details. #
18 ###############################################################################
25 # Load our location module
29 def _(singular
, plural
=None, n
=None):
31 return gettext
.dngettext("libloc", singular
, plural
, n
)
33 return gettext
.dgettext("libloc", singular
)
37 parser
= argparse
.ArgumentParser(
38 description
=_("Location Database Command Line Interface"),
40 subparsers
= parser
.add_subparsers()
42 # Global configuration flags
43 parser
.add_argument("--debug", action
="store_true",
44 help=_("Enable debug output"))
47 parser
.add_argument("--version", action
="version",
48 version
="%%(prog)s %s" % location
.__version
__)
51 parser
.add_argument("--database", "-d",
52 default
="@databasedir@/database.db", help=_("Path to database"),
55 # lookup an IP address
56 lookup
= subparsers
.add_parser("lookup",
57 help=_("Lookup one or multiple IP addresses"),
59 lookup
.add_argument("address", nargs
="+")
60 lookup
.set_defaults(func
=self
.handle_lookup
)
63 get_as
= subparsers
.add_parser("get-as",
64 help=_("Get information about one or multiple Autonomous Systems"),
66 get_as
.add_argument("asn", nargs
="+")
67 get_as
.set_defaults(func
=self
.handle_get_as
)
70 search_as
= subparsers
.add_parser("search-as",
71 help=_("Search for Autonomous Systems that match the string"),
73 search_as
.add_argument("query", nargs
=1)
74 search_as
.set_defaults(func
=self
.handle_search_as
)
76 # List all networks in a country
77 search_as
= subparsers
.add_parser("list-networks-by-cc",
78 help=_("Lists all networks in a country"),
80 search_as
.add_argument("country_code", nargs
=1)
81 search_as
.set_defaults(func
=self
.handle_list_networks_by_cc
)
83 args
= parser
.parse_args()
85 # Print usage if no action was given
86 if not "func" in args
:
93 # Parse command line arguments
94 args
= self
.parse_cli()
98 db
= location
.Database(args
.database
)
99 except FileNotFoundError
as e
:
100 sys
.stderr
.write("location-query: Could not open database %s: %s\n" \
101 % (args
.database
, e
))
105 ret
= args
.func(db
, args
)
107 # Return with exit code
111 # Otherwise just exit
114 def handle_lookup(self
, db
, ns
):
117 for address
in ns
.address
:
119 n
= db
.lookup(address
)
121 print(_("Invalid IP address: %s") % address
, file=sys
.stderr
)
130 print(_("Nothing found for %(address)s") % args
, file=sys
.stderr
)
134 # Try to retrieve the AS if we have an AS number
138 # If we have found an AS we will print it in the message
144 print(_("%(address)s belongs to %(network)s which is a part of %(as)s") % args
)
147 print(_("%(address)s belongs to %(network)s") % args
)
151 def handle_get_as(self
, db
, ns
):
153 Gets information about Autonomous Systems
161 print(_("Invalid ASN: %s") % asn
, file=sys
.stderr
)
165 # Fetch AS from database
170 print(_("Could not find AS%s") % asn
, file=sys
.stderr
)
174 print(_("AS%(asn)s belongs to %(name)s") % { "asn" : a
.number
, "name" : a
.name
})
178 def handle_search_as(self
, db
, ns
):
179 for query
in ns
.query
:
180 # Print all matches ASes
181 for a
in db
.search_as(query
):
184 def handle_list_networks_by_cc(self
, db
, ns
):
185 for country_code
in ns
.country_code
:
186 # Print all matching networks
187 for n
in db
.search_networks(country_code
=country_code
):
191 # Run the command line interface