]> git.ipfire.org Git - people/ms/libloc.git/blob - src/python/location-query
python: Add script to lookup database from command line
[people/ms/libloc.git] / src / python / location-query
1 #!/usr/bin/python3
2 ###############################################################################
3 # #
4 # libloc - A library to determine the location of someone on the Internet #
5 # #
6 # Copyright (C) 2017 IPFire Development Team <info@ipfire.org> #
7 # #
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. #
12 # #
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. #
17 # #
18 ###############################################################################
19
20 import argparse
21 import sys
22 import syslog
23
24 # Load our location module
25 import location
26
27 # i18n
28 _ = lambda x: x
29
30 class CLI(object):
31 def __init__(self):
32 # Open database
33 self.db = location.Database("test.db")
34
35 def parse_cli(self):
36 parser = argparse.ArgumentParser(
37 description=_("Location Database Command Line Interface"),
38 )
39 subparsers = parser.add_subparsers()
40
41 # Global configuration flags
42 parser.add_argument("--debug", action="store_true",
43 help=_("Enable debug output"))
44
45 # lookup an IP address
46 lookup = subparsers.add_parser("lookup",
47 help=_("Lookup one or multiple IP addresses"),
48 )
49 lookup.add_argument("address", nargs="+")
50 lookup.set_defaults(func=self.handle_lookup)
51
52 return parser.parse_args()
53
54 def run(self):
55 # Parse command line arguments
56 args = self.parse_cli()
57
58 # Callback function must be defined
59 assert args.func, "Callback function not defined"
60
61 # Call function
62 ret = args.func(args)
63
64 # Return with exit code
65 if ret:
66 sys.exit(ret)
67
68 # Otherwise just exit
69 sys.exit(0)
70
71 def handle_lookup(self, ns):
72 ret = 0
73
74 for address in ns.address:
75 try:
76 n = self.db.lookup(address)
77 except ValueError:
78 sys.stderr.write(_("Invalid IP address: %s") % address)
79
80 args = {
81 "address" : address,
82 "network" : n,
83 }
84
85 # Nothing found?
86 if not n:
87 print(_("Nothing found for %(address)s") % args)
88 ret = 1
89 continue
90
91 # Try to retrieve the AS if we have an AS number
92 if n.asn:
93 a = self.db.get_as(n.asn)
94
95 # If we have found an AS we will print it in the message
96 if a:
97 args.update({
98 "as" : a,
99 })
100
101 print(_("%(address)s belongs to %(network)s which is a part of %(as)s") % args)
102 continue
103
104 print(_("%(address)s belongs to %(network)s") % args)
105
106 return ret
107
108
109 def main():
110 # Run the command line interface
111 c = CLI()
112 c.run()
113
114 main()