Compare commits
	
		
			5 commits
		
	
	
		
			master
			...
			feature/co
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 75b8e2fb6c | |||
| 4147d03607 | |||
| 5a7dfe7e3c | |||
| 0062ae0b2b | |||
| f7f833e289 | 
					 1 changed files with 48 additions and 18 deletions
				
			
		|  | @ -26,13 +26,12 @@ class LookupException(Exception): | |||
|     """ | ||||
|     pass | ||||
| 
 | ||||
| 
 | ||||
| def get_county_code(ipaddress, dbfile): | ||||
| def get_geoip_result(ipaddress, dbfile): | ||||
|     """ | ||||
|     Determine the country code that the given ipaddress comes from. | ||||
|     Perform a lookup of the given ipaddress in the database. | ||||
|     :param ipaddress: The IP address to look up | ||||
|     :param dbfile: The path to the GeoIP2/GeoLite2 database file (Country or City database) | ||||
|     :return: The ISO country code (2 letters) | ||||
|     :return: The lookup result | ||||
|     """ | ||||
|     if not ipaddress: | ||||
|         raise LookupException("No address given") | ||||
|  | @ -43,18 +42,17 @@ def get_county_code(ipaddress, dbfile): | |||
|     try: | ||||
|         reader = geoip2.database.Reader(dbfile) | ||||
|         dbtype = reader.metadata().database_type | ||||
|         country = None | ||||
|         result = None | ||||
|         if dbtype == 'GeoLite2-City' or dbtype == 'GeoIP2-City': | ||||
|             country = reader.city(ipaddress).country | ||||
|         elif dbfile == 'GeoLite2-Country' or dbtype == 'GeoIP2-Country': | ||||
|             country = reader.country(ipaddress).country | ||||
|             result = reader.city(ipaddress) | ||||
|         elif dbtype == 'GeoLite2-Country' or dbtype == 'GeoIP2-Country': | ||||
|             result = reader.country(ipaddress) | ||||
|         # ASN is not supported | ||||
|         # elif dbfile == 'GeoLite2-ASN' or dbtype == 'GeoIP2-ASN': | ||||
| 
 | ||||
|         if not country: | ||||
|         else: | ||||
|             raise LookupException("Unsupported DB type: " + dbtype) | ||||
| 
 | ||||
|         return country.iso_code | ||||
|         return result | ||||
|     except FileNotFoundError as e: | ||||
|         raise LookupException(e.args) | ||||
|     except maxminddb.errors.InvalidDatabaseError as e: | ||||
|  | @ -67,6 +65,30 @@ def get_county_code(ipaddress, dbfile): | |||
|         if reader: | ||||
|             reader.close() | ||||
| 
 | ||||
| def get_county_code(ipaddress, dbfile): | ||||
|     """ | ||||
|     Determine the country code that the given ipaddress comes from. | ||||
|     :param ipaddress: The IP address to look up | ||||
|     :param dbfile: The path to the GeoIP2/GeoLite2 database file (Country or City database) | ||||
|     :return: The ISO country code (2 letters) | ||||
|     """ | ||||
|     result = get_geoip_result(ipaddress, dbfile) | ||||
| 
 | ||||
|     return result.country.iso_code | ||||
| 
 | ||||
| def get_details(ipaddress, dbfile): | ||||
|     """ | ||||
|     Determine the country code, continent code and the network that the given ipaddress comes from. | ||||
|     :param ipaddress: The IP address to look up | ||||
|     :param dbfile: The path to the GeoIP2/GeoLite2 database file (Country or City database) | ||||
|     :return: A string consisting of the ISO country code (2 letters), ISO continent code (2 letters) and network (CIDR notation), concatenated by "," | ||||
|     """ | ||||
|     result = get_geoip_result(ipaddress, dbfile) | ||||
|     country = result.country.iso_code | ||||
|     continent = result.continent.code | ||||
|     network = result.traits.network | ||||
| 
 | ||||
|     return "%s,%s,%s" % (country, continent, network) | ||||
| 
 | ||||
| def parse_command_line(argv): | ||||
|     """ | ||||
|  | @ -78,26 +100,34 @@ def parse_command_line(argv): | |||
|     dbfile = None | ||||
|     parser = argparse.ArgumentParser(description='Get the country code from an IP address') | ||||
|     parser.add_argument('-f', dest='dbfile', required=True, help="Path to the GeoIP2 database file") | ||||
|     parser.add_argument('-d', dest='detail', action='store_const', const=True, default=False, help="Verbose output: Print continent code and network along with country code") | ||||
|     parser.add_argument('--detail', dest='detail', action='store_const', const=True, default=False, help="Verbose output: Print continent code and network along with country code") | ||||
|     parser.add_argument('address', help="The IP address to check") | ||||
|     args = parser.parse_args() | ||||
|      | ||||
|     return args.dbfile, args.address | ||||
| 
 | ||||
|     return args.dbfile, args.address, args.detail | ||||
| 
 | ||||
| def main(argv): | ||||
|     """ | ||||
|     Read the database file and the IP address from the command line and print the corresponding ISO country code on | ||||
|     stdout. | ||||
|     :param argv: Format: "-f /path/to/database.mmdb ip.v4.add.ress" | ||||
|     :param argv: Format: "-f /path/to/database.mmdb [--detail|-d] ip.v4.add.ress" | ||||
|     :return: | ||||
|     """ | ||||
|     try: | ||||
|         (dbfile, ipaddress) = parse_command_line(argv) | ||||
|         code = get_county_code(ipaddress, dbfile) | ||||
|         (dbfile, ipaddress, detail) = parse_command_line(argv) | ||||
|         if detail: | ||||
|             code = get_details(ipaddress, dbfile) | ||||
|         else: | ||||
|             code = get_county_code(ipaddress, dbfile) | ||||
| 
 | ||||
|         print(code) | ||||
|     except LookupException as e: | ||||
|         print(e.args, file=sys.stderr) | ||||
|         print("Unknown") | ||||
| 
 | ||||
|         if detail: | ||||
|             print("Unknown,,") | ||||
|         else: | ||||
|             print("Unknown") | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     try: | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue