From bbdb2e0a88ad19c10a8ab5928a05738ab35e6bb7 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Fri, 15 Nov 2019 15:58:59 +0000 Subject: [PATCH] location-query: Add listing networks by flags Signed-off-by: Michael Tremer --- man/location-query.txt | 6 ++++++ src/python/database.c | 15 +++++++++++++-- src/python/location-query.in | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/man/location-query.txt b/man/location-query.txt index ad129ed..957dc01 100644 --- a/man/location-query.txt +++ b/man/location-query.txt @@ -10,6 +10,7 @@ location-query - Query the location database `location-query search-as STRING` `location-query list-networks-by-as ASN` `location-query list-networks-by-cc COUNTRY_CODE` +`location-query list-networks-by-flags [--anonymous-proxy|--satellite-provider|--anycast]` == DESCRIPTION The `location-query` retrieves information from the location database. @@ -62,6 +63,11 @@ or countries. + See above for usage of the '--output-format' parameter. +'list-networks-by-flags [--output-format FORMAT] [--anonymous-proxy|--satellite-provider|--anycast]':: + Lists all networks that have a certain flag. + + + See above for usage of the '--output-format' parameter. + '--help':: Shows a short help text on using this program. diff --git a/src/python/database.c b/src/python/database.c index 2210666..c31f8cf 100644 --- a/src/python/database.c +++ b/src/python/database.c @@ -203,11 +203,12 @@ static PyObject* Database_search_as(DatabaseObject* self, PyObject* args) { } static PyObject* Database_search_networks(DatabaseObject* self, PyObject* args, PyObject* kwargs) { - char* kwlist[] = { "country_code", "asn", NULL }; + char* kwlist[] = { "country_code", "asn", "flags", NULL }; const char* country_code = NULL; unsigned int asn = 0; + int flags = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|si", kwlist, &country_code, &asn)) + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|sii", kwlist, &country_code, &asn, &flags)) return NULL; struct loc_database_enumerator* enumerator; @@ -237,6 +238,16 @@ static PyObject* Database_search_networks(DatabaseObject* self, PyObject* args, } } + // Set the flags we are searching for + if (flags) { + r = loc_database_enumerator_set_flag(enumerator, flags); + + if (r) { + PyErr_SetFromErrno(PyExc_SystemError); + return NULL; + } + } + PyObject* obj = new_database_enumerator(&DatabaseEnumeratorType, enumerator); loc_database_enumerator_unref(enumerator); diff --git a/src/python/location-query.in b/src/python/location-query.in index 72b7c25..e047e03 100644 --- a/src/python/location-query.in +++ b/src/python/location-query.in @@ -177,6 +177,23 @@ class CLI(object): choices=self.output_formats.keys(), default="list") list_networks_by_cc.set_defaults(func=self.handle_list_networks_by_cc) + # List all networks with flags + list_networks_by_flags = subparsers.add_parser("list-networks-by-flags", + help=_("Lists all networks with flags"), + ) + list_networks_by_flags.add_argument("--anonymous-proxy", + action="store_true", help=_("Anonymous Proxies"), + ) + list_networks_by_flags.add_argument("--satellite-provider", + action="store_true", help=_("Satellite Providers"), + ) + list_networks_by_flags.add_argument("--anycast", + action="store_true", help=_("Anycasts"), + ) + list_networks_by_flags.add_argument("--output-format", + choices=self.output_formats.keys(), default="list") + list_networks_by_flags.set_defaults(func=self.handle_list_networks_by_flags) + args = parser.parse_args() # Print usage if no action was given @@ -300,6 +317,22 @@ class CLI(object): for n in db.search_networks(country_code=country_code): f.network(n) + def handle_list_networks_by_flags(self, db, ns): + flags = 0 + + if ns.anonymous_proxy: + flags |= location.NETWORK_FLAG_ANONYMOUS_PROXY + + if ns.satellite_provider: + flags |= location.NETWORK_FLAG_SATELLITE_PROVIDER + + if ns.anycast: + flags |= location.NETWORK_FLAG_ANYCAST + + with self.__get_output_formatter(ns) as f: + for n in db.search_networks(flags=flags): + f.network(n) + def main(): # Run the command line interface -- 2.39.2