+
The search will be performed case-insensitively.
-'list-networks-by-as [--output-format FORMAT] ASN'::
+'list-networks-by-as [--family=[ipv6|ipv4]] [--output-format FORMAT] ASN'::
Lists all networks which belong to this Autonomous System.
+
+ The '--family' parameter can be used to filter output to only IPv6 or
+ IPv4 addresses.
+ +
The '--output-format' parameter can change the output so that it can be
directly loaded into other software. The following options are available:
+
* 'xt_geoip': Returns a list of networks to be loaded into the xt_geoip
kernel module
-'list-networks-by-cc [--output-format FORMAT] COUNTRY_CODE'::
+'list-networks-by-cc [--family=[ipv6|ipv4]] [--output-format FORMAT] COUNTRY_CODE'::
Lists all networks that belong to a country.
+
The country has to be encoded in ISO3166 Alpha-2 notation.
+
- See above for usage of the '--output-format' parameter.
+ See above for usage of the '--family' and '--output-format' parameters.
-'list-networks-by-flags [--output-format FORMAT] [--anonymous-proxy|--satellite-provider|--anycast]'::
+'list-networks-by-flags [--family=[ipv6|ipv4]] [--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.
+ See above for usage of the '--family' and '--output-format' parameters.
'--help'::
Shows a short help text on using this program.
char country_code[3];
uint32_t asn;
enum loc_network_flags flags;
+ int family;
// Index of the AS we are looking at
unsigned int as_index;
return 0;
}
+LOC_EXPORT int loc_database_enumerator_set_family(
+ struct loc_database_enumerator* enumerator, int family) {
+ enumerator->family = family;
+
+ return 0;
+}
+
LOC_EXPORT int loc_database_enumerator_next_as(
struct loc_database_enumerator* enumerator, struct loc_as** as) {
*as = NULL;
// Check if we are interested in this network
+ // Skip if the family does not match
+ if (enumerator->family && loc_network_address_family(*network) != enumerator->family) {
+ loc_network_unref(*network);
+ *network = NULL;
+
+ continue;
+ }
+
// Skip if the country code does not match
if (*enumerator->country_code &&
!loc_network_match_country_code(*network, enumerator->country_code)) {
loc_database_enumerator_ref;
loc_database_enumerator_set_asn;
loc_database_enumerator_set_country_code;
+ loc_database_enumerator_set_family;
loc_database_enumerator_set_flag;
loc_database_enumerator_set_string;
loc_database_enumerator_unref;
# Network
+ loc_network_address_family;
loc_network_get_asn;
loc_network_get_country_code;
loc_network_has_flag;
int loc_database_enumerator_set_country_code(struct loc_database_enumerator* enumerator, const char* country_code);
int loc_database_enumerator_set_asn(struct loc_database_enumerator* enumerator, unsigned int asn);
int loc_database_enumerator_set_flag(struct loc_database_enumerator* enumerator, enum loc_network_flags flag);
+int loc_database_enumerator_set_family(struct loc_database_enumerator* enumerator, int family);
int loc_database_enumerator_next_as(
struct loc_database_enumerator* enumerator, struct loc_as** as);
int loc_database_enumerator_next_network(
struct loc_network* loc_network_ref(struct loc_network* network);
struct loc_network* loc_network_unref(struct loc_network* network);
char* loc_network_str(struct loc_network* network);
+int loc_network_address_family(struct loc_network* network);
int loc_network_match_address(struct loc_network* network, const struct in6_addr* address);
const char* loc_network_get_country_code(struct loc_network* network);
return 0;
}
-static int loc_network_address_family(struct loc_network* network) {
- if (IN6_IS_ADDR_V4MAPPED(&network->start_address))
- return AF_INET;
-
- return AF_INET6;
-}
-
LOC_EXPORT int loc_network_new_from_string(struct loc_ctx* ctx, struct loc_network** network,
const char* address_string) {
struct in6_addr start_address;
return string;
}
+LOC_EXPORT int loc_network_address_family(struct loc_network* network) {
+ if (IN6_IS_ADDR_V4MAPPED(&network->start_address))
+ return AF_INET;
+
+ return AF_INET6;
+}
+
LOC_EXPORT int loc_network_match_address(struct loc_network* network, const struct in6_addr* address) {
// Address must be larger than the start address
if (in6_addr_cmp(&network->start_address, address) > 0)
}
static PyObject* Database_search_networks(DatabaseObject* self, PyObject* args, PyObject* kwargs) {
- char* kwlist[] = { "country_code", "asn", "flags", NULL };
+ char* kwlist[] = { "country_code", "asn", "flags", "family", NULL };
const char* country_code = NULL;
unsigned int asn = 0;
int flags = 0;
+ int family = 0;
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|sii", kwlist, &country_code, &asn, &flags))
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|siii", kwlist, &country_code, &asn, &flags, &family))
return NULL;
struct loc_database_enumerator* enumerator;
}
}
+ // Set the family we are searching for
+ if (family) {
+ r = loc_database_enumerator_set_family(enumerator, family);
+
+ if (r) {
+ PyErr_SetFromErrno(PyExc_SystemError);
+ return NULL;
+ }
+ }
+
PyObject* obj = new_database_enumerator(&DatabaseEnumeratorType, enumerator);
loc_database_enumerator_unref(enumerator);
help=_("Lists all networks in an AS"),
)
list_networks_by_as.add_argument("asn", nargs=1, type=int)
+ list_networks_by_as.add_argument("--family", choices=("ipv6", "ipv4"))
list_networks_by_as.add_argument("--output-format",
choices=self.output_formats.keys(), default="list")
list_networks_by_as.set_defaults(func=self.handle_list_networks_by_as)
help=_("Lists all networks in a country"),
)
list_networks_by_cc.add_argument("country_code", nargs=1)
+ list_networks_by_cc.add_argument("--family", choices=("ipv6", "ipv4"))
list_networks_by_cc.add_argument("--output-format",
choices=self.output_formats.keys(), default="list")
list_networks_by_cc.set_defaults(func=self.handle_list_networks_by_cc)
list_networks_by_flags.add_argument("--anycast",
action="store_true", help=_("Anycasts"),
)
+ list_networks_by_flags.add_argument("--family", choices=("ipv6", "ipv4"))
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)
sys.stderr.write("Could not read the public key: %s\n" % e)
sys.exit(1)
+ # Translate family
+ if args.family == "ipv6":
+ args.family = socket.AF_INET6
+ elif args.family == "ipv4":
+ args.family = socket.AF_INET
+ else:
+ args.family = 0
+
# Call function
ret = args.func(db, args)
with self.__get_output_formatter(ns) as f:
for asn in ns.asn:
# Print all matching networks
- for n in db.search_networks(asn=asn):
+ for n in db.search_networks(asn=asn, family=ns.family):
f.network(n)
def handle_list_networks_by_cc(self, db, ns):
with self.__get_output_formatter(ns) as f:
for country_code in ns.country_code:
# Print all matching networks
- for n in db.search_networks(country_code=country_code):
+ for n in db.search_networks(country_code=country_code, family=ns.family):
f.network(n)
def handle_list_networks_by_flags(self, db, ns):
flags |= location.NETWORK_FLAG_ANYCAST
with self.__get_output_formatter(ns) as f:
- for n in db.search_networks(flags=flags):
+ for n in db.search_networks(flags=flags, family=ns.family):
f.network(n)