From 3fabf8b5937f59f6a2f9208b55095ba06ef67b55 Mon Sep 17 00:00:00 2001 From: "jp.av.dev" Date: Mon, 16 May 2022 03:24:08 -0400 Subject: [PATCH] agregadas funciones: iploc '-d' y '-D' (iplocate) modf: print_ipinfo() print segun type() modf: archivo_ips() elimina \n en caso de modf: repr de Clases/Tablas (sql_alch) pend: cambiar token(bool) por int() o str() --- README.md | 13 +++++---- iplocate.py | 77 ++++++++++++++++++++++++++++++++++++++++++----------- sql_alch.py | 50 ++++++++++++++++++++++------------ 3 files changed, 103 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 7c013dc..3e952a1 100644 --- a/README.md +++ b/README.md @@ -39,20 +39,23 @@ Crea base de datos ***SQLite3*** **`./ipinfo.db`** con tablas de **registro** y ej. alias `alias iploc='~/ruta/script/iplocate.py'` ```bash ipLocate - Muestra información disponible en ipinfo.io sobre IPs consultadas. + Consulta información sobre IP(s) disponibles en ipinfo.io con o sin token. + Carga logs de nginx en base de datos. Consulta con ipinfo.io y registra + en base de datos. + Consultas y reportes según información en la base de datos. Uso: iploc - Consulta la información de disponible en ipinfo.io. - iploc -t - Consulta la info. de usando 'token' de ipinfo.io, + iploc -t - Consulta la info. de usando 'token' de ipinfo.io, especificado en config.cfg. - iploc -f - Consulta info. de las IPs en (ipinfo.ip). + iploc -d - Consulta la información de disponible en base de datos. + iploc -f - Consulta info. de las IPs en (ipinfo.io). + iploc -F - Consulta info. de las IPs en (token, ipinfo.io). iploc -D - Consulta info. de las IPs en (base de datos). - iploc -d - Muestra toda la info. disponible de registrada en BD. iploc -c - Carga logs en base de datos. iploc -g - Guarda ipinfo de IPs sin registro en la BD. iploc -h - Muestra esta ayuda. iploc --sync - Sincroniza logs del servidor (bash script). - ``` **`iploc --sync`** diff --git a/iplocate.py b/iplocate.py index ba30636..eafaee8 100755 --- a/iplocate.py +++ b/iplocate.py @@ -66,17 +66,52 @@ def consulta_ip(ip_consulta, tkn=True): info_ip = requests.get(consulta).text return loads(info_ip) case None: - return {} + resp = sql_alch.consulta_db(ip_consulta) + #print('consulta_ip :', resp) + return resp # aqui va la consulta a base de datos def print_ipinfo(ip, tkn=True): if (re.search(ip_regx, ip)): ip_info = consulta_ip(ip, tkn) - for llave, valor in ip_info.items(): - print(f'{co_YelB}{llave}\b\t{co_Blu}->{co_rst} {co_Grn}{valor}{co_rst}') - print(f'{co_RedB}------------------------------', end='') - print(f'--------------------------------{co_rst}') + if isinstance(ip_info, dict): + for llave, valor in ip_info.items(): + print(f'{co_YelB}{llave}\b\t{co_Blu}->{co_rst} {co_Grn}{valor}{co_rst}') + print(f'{co_RedB}------------------------------', end='') + print(f'--------------------------------{co_rst}') + elif isinstance(ip_info, list): + contad=0 + for tupla in ip_info: + if contad < 1: + for ind, val in enumerate(tupla): + if ind == 0: + print(f'{co_RedB}-------------------------' + f'---------------------------{co_rst}') + for dato in str(val).split(';'): + print(f'{co_Blu}| {co_BluB}{dato.split("=")[0].ljust(12)}' + f'{co_Blu}| {co_rst}{dato.split("=")[1]}{co_rst}') + print(f'{co_BluD}-------------------------' + f'---------------------------{co_rst}') + print(f'{co_Blu}|{co_YelB} Codigo html {co_Blu}|' + f'{co_YelB} Fecha Visita{co_rst}') + else: + codig = str(val).split(',')[2].split('=')[1] + fecha = str(val).split(',')[3].split('=')[1] + print(f'{co_Blu}|{co_GrnB} {codig} {co_Blu}|' + f'{co_Grn} {fecha}{co_rst}') + else: + for ind, val in enumerate(tupla): + if ind > 0: + codig = str(val).split(',')[2].split('=')[1] + fecha = str(val).split(',')[3].split('=')[1] + print(f'{co_Blu}|{co_GrnB} {codig} {co_Blu}|' + f'{co_Grn} {fecha}{co_rst}') + contad+=1 + print(f'{co_RedB}-------------------------' + f'---------------------------{co_rst}') + else: + print('otra wea: ', type(ip_info)) else: ipr = ip.split('\n')[0] print(f'{co_Red}[{co_BlkMgn}{ipr}{co_rst}{co_Red}] no es una IP válida!{co_rst}') @@ -85,6 +120,8 @@ def print_ipinfo(ip, tkn=True): def archivo_ips(ips, tkn=True): with open(ips, 'r') as lista: for linea in lista: + if '\n' in linea: + linea = linea.split('\n')[0] print_ipinfo(linea, tkn) sys.exit(0) @@ -102,13 +139,17 @@ def main(): print(f'{co_YelB}Cargando logs en base de datos{co_rst}') sql_alch.carga_logs() case '-d': - print(f'{co_YelB}test_db-d{co_rst}') - # PENDIENTE # PENDIENTE - #sql_alch.test_db() + print(f'{co_YelB}Consulta base de datos:{co_rst}') + ip = sys.argv[2] + print_ipinfo(ip, None) case '-D': - print(f'{co_YelB}test_db-D{co_rst}') - # PENDIENTE # PENDIENTE - #sql_alch.test_db() + print(f'{co_YelB}Consulta por archivo en base de datos:{co_rst}') + if isfile(sys.argv[2]): + archivo_ips(sys.argv[2], None) + else: + print(f'{co_Red}Archivo [{co_BlkMgn}{sys.argv[2]}'+ + f'{co_rst}{co_Red}] no es válido''') + sys.exit(0) case '-g': print(f'{co_YelB}Registrando datos de ipinfo{co_rst}') sql_alch.registro_ips() @@ -152,9 +193,14 @@ def main(): def uso(): ayuda = f""" {co_BluB}ipLocate{co_rst} - {co_cuBlu}Muestra información disponible en ipinfo.io sobre IPs consultadas.{co_rst} + {co_cuBlu}Consulta información sobre IP(s) disponibles en ipinfo.io con o sin token. + Carga logs de nginx en base de datos. Consulta con ipinfo.io y registra + en base de datos. + Consultas y reportes según información en la base de datos.{co_rst} - {co_BluB}Uso:{co_rst} + {co_YelB}iploc -h {co_Grn}- Muestra esta ayuda.{co_rst} + + {co_BluB}Uso para consultas:{co_rst} {co_YelB}iploc {co_Blu} {co_Grn}- Consulta la información de disponible en ipinfo.io.{co_rst} {co_YelB}iploc -t {co_Blu} {co_Grn}- Consulta la info. de usando 'token' de ipinfo.io, especificado en config.cfg.{co_rst} @@ -162,10 +208,11 @@ def uso(): {co_YelB}iploc -f {co_Blu} {co_Grn}- Consulta info. de las IPs en (ipinfo.io).{co_rst} {co_YelB}iploc -F {co_Blu} {co_Grn}- Consulta info. de las IPs en (token, ipinfo.io).{co_rst} {co_YelB}iploc -D {co_Blu} {co_Grn}- Consulta info. de las IPs en (base de datos).{co_rst} + + {co_BluB}Operaciones base de datos:{co_rst} + {co_YelB}iploc --sync {co_Grn}- Sincroniza logs del servidor (bash script).{co_rst} {co_YelB}iploc -c {co_Grn}- Carga logs en base de datos.{co_rst} {co_YelB}iploc -g {co_Grn}- Guarda ipinfo de IPs sin registro en la BD.{co_rst} - {co_YelB}iploc -h {co_Grn}- Muestra esta ayuda.{co_rst} - {co_YelB}iploc --sync {co_Grn}- Sincroniza logs del servidor (bash script).{co_rst} """ print(ayuda) diff --git a/sql_alch.py b/sql_alch.py index 1e3803e..6724be4 100644 --- a/sql_alch.py +++ b/sql_alch.py @@ -36,6 +36,23 @@ class Registro(Base): back_populates="visita_ip", cascade="all, delete, delete-orphan") + def get_fecha(self): + return time.asctime(time.localtime(int(self.fecha_reg.__repr__()))) + + + def __repr__(self) -> str: + #print('en repr') + try: + rep = f'ip={self.ip};host={self.hostname};anycast={self.anycast};'+\ + f'cuidad={self.cuidad};region={self.region};pais={self.pais};'+\ + f'geoloc={self.geoloc};organizacion={self.organizacion};'+\ + f'fecha_reg={self.get_fecha()};tzone={self.tzone};cod_post={self.cod_post}' + #print('Repr:', rep) + return rep + except Exception as ex: + print('Exception :', ex) + return "error repr" + class Visita(Base): __tablename__ = 'visita' @@ -50,23 +67,16 @@ class Visita(Base): def get_fecha(self): return time.asctime(time.localtime(int(self.fecha.__repr__()))) - def fecha_local(self): - fecha_l = self.get_fecha() - #fecha_l = time.asctime(self.fecha) - return fecha_l - #fecha_l = time.strftime(fecha_l) - def consulta_registro(self): return True if self.registro == 1 else False def __repr__(self) -> str: - return "ID: {}\nIP: {}\nHtmlCode: {}\n" \ - "Fecha: {}\nRegistrado: {}\n".format( - self.id, - self.ip, - self.html, - self.get_fecha(), - self.consulta_registro()) + try: + rep = f'id={self.id},ip={self.ip},html={self.html},fecha={self.get_fecha()}' + return rep + except Exception as ex: + print('Exception :', ex) + return "Error repr Visita" engine = create_engine(base_de_datos) @@ -120,8 +130,8 @@ def ip_registrada(ip): ip_reg = session.query(Visita).filter(Visita.ip==ip).filter(Visita.registro==1).first() except Exception as ex: print('Exception', ex) - finally: - return 0 if ip_reg is None else ip_reg.registro + ip_reg = None + return 0 if ip_reg is None else ip_reg.registro def carga_access_log(log): @@ -226,8 +236,14 @@ def carga_registro_ip(ip_info): except Exception as ex: print('Exception: ', ex) -def registro(): - pass +def consulta_db(ip): + try: + statement = session.query(Registro, Visita).join('visitas').filter_by(ip=ip) + result = session.execute(statement).all() + return result + except Exception as ex: + print('Exception consulta_db:\n', ex) + def test_db(): try: