Varken/varken/helpers.py

133 lines
3.8 KiB
Python
Raw Normal View History

import os
import time
import tarfile
2018-12-02 19:59:46 -08:00
import hashlib
import urllib3
import geoip2.database
2018-12-04 16:16:00 -08:00
import logging
from json.decoder import JSONDecodeError
from os.path import abspath, join
2018-12-11 11:41:00 -08:00
from requests.exceptions import InvalidSchema, SSLError, ConnectionError
from urllib.request import urlretrieve
2018-11-28 12:32:39 -08:00
2018-12-17 10:28:14 -08:00
logger = logging.getLogger()
2018-11-28 12:32:39 -08:00
def geoip_download(data_folder):
datafolder = data_folder
tar_dbfile = abspath(join(datafolder, 'GeoLite2-City.tar.gz'))
url = 'http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz'
logger.info('Downloading GeoLite2 from %s', url)
urlretrieve(url, tar_dbfile)
2018-12-04 16:16:00 -08:00
tar = tarfile.open(tar_dbfile, 'r:gz')
logging.debug('Opening GeoLite2 tar file : %s', tar_dbfile)
for files in tar.getmembers():
if 'GeoLite2-City.mmdb' in files.name:
logging.debug('"GeoLite2-City.mmdb" FOUND in tar file')
files.name = os.path.basename(files.name)
tar.extract(files, datafolder)
logging.debug('%s has been extracted to %s', files, datafolder)
2018-12-12 19:26:02 -08:00
os.remove(tar_dbfile)
2018-12-02 19:59:46 -08:00
def geo_lookup(ipaddress, data_folder):
datafolder = data_folder
2018-12-12 19:26:02 -08:00
logging.debug('Reading GeoLite2 DB from %s', datafolder)
2018-12-10 19:16:13 -08:00
dbfile = abspath(join(datafolder, 'GeoLite2-City.mmdb'))
now = time.time()
try:
dbinfo = os.stat(dbfile)
db_age = now - dbinfo.st_ctime
if db_age > (35 * 86400):
2018-12-10 19:16:13 -08:00
logging.info('GeoLite2 DB is older than 35 days. Attempting to re-download...')
os.remove(dbfile)
2018-12-10 19:16:13 -08:00
geoip_download(datafolder)
except FileNotFoundError:
2018-12-10 19:16:13 -08:00
logging.error('GeoLite2 DB not found. Attempting to download...')
geoip_download(datafolder)
reader = geoip2.database.Reader(dbfile)
return reader.city(ipaddress)
2018-12-02 19:59:46 -08:00
def hashit(string):
encoded = string.encode()
hashed = hashlib.md5(encoded).hexdigest()
return hashed
def connection_handler(session, request, verify):
s = session
r = request
v = verify
return_json = False
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
try:
get = s.send(r, verify=v)
if get.status_code == 401:
2018-12-11 08:30:52 -08:00
logger.info('Your api key is incorrect for %s', r.url)
elif get.status_code == 404:
2018-12-11 08:30:52 -08:00
logger.info('This url doesnt even resolve: %s', r.url)
elif get.status_code == 200:
try:
return_json = get.json()
except JSONDecodeError:
2018-12-11 08:30:52 -08:00
logger.error('No JSON response. Response is: %s', get.text)
# 204 No Content is for ASA only
elif get.status_code == 204:
if get.headers['X-Auth-Token']:
return get.headers['X-Auth-Token']
except InvalidSchema:
2018-12-11 08:30:52 -08:00
logger.error("You added http(s):// in the config file. Don't do that.")
except SSLError as e:
logger.error('Either your host is unreachable or you have an SSL issue. : %s', e)
2018-12-11 11:41:00 -08:00
except ConnectionError as e:
logger.error('Cannot resolve the url/ip/port. Check connectivity. Error: %s', e)
return return_json
def mkdir_p(path):
templogger = logging.getLogger('temp')
try:
templogger.info('Creating folder %s ', path)
os.makedirs(path, exist_ok=True)
except Exception as e:
templogger.error('Could not create folder %s : %s ', path, e)
2018-12-11 09:45:43 -08:00
def clean_sid_check(server_id_list, server_type=None):
t = server_type
sid_list = server_id_list
cleaned_list = sid_list.replace(' ', '').split(',')
valid_sids = []
for sid in cleaned_list:
try:
valid_sids.append(int(sid))
except ValueError:
logger.error("%s is not a valid server id number", sid)
2018-12-11 09:45:43 -08:00
if valid_sids:
logger.info('%s : %s', t.upper(), valid_sids)
return valid_sids
else:
logger.error('No valid %s', t.upper())
return False