diff --git a/README.md b/README.md index 1480924..7c013dc 100644 --- a/README.md +++ b/README.md @@ -42,8 +42,12 @@ ej. alias `alias iploc='~/ruta/script/iplocate.py'` Muestra información disponible en ipinfo.io sobre IPs consultadas. Uso: - iploc - Muestra la información de . - iploc -f - Muestra info. de las IPs en + iploc - Consulta la información de disponible en 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 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. diff --git a/iplocate.py b/iplocate.py index 76dd82f..ba30636 100755 --- a/iplocate.py +++ b/iplocate.py @@ -18,6 +18,7 @@ parser.read(f'{selfpath}/config.cfg') token = parser.get('iplocate','token') token = token.strip("'") muevelog = f'{selfpath}/muevelog.sh ' +#tkn=True # Colores co_rst = Style.RESET_ALL @@ -53,23 +54,27 @@ def filtro_ip_propia(ip): return True if ip != ownip else False -def consulta_db(ip_consulta): - consulta = f'https://ipinfo.io/{ip_consulta}{token}' - info_ip = requests.get(consulta).text - return loads(info_ip) +def consulta_ip(ip_consulta, tkn=True): + if (re.search(ip_regx, ip_consulta)): + match tkn: + case True: + consulta = f'https://ipinfo.io/{ip_consulta}{token}' + info_ip = requests.get(consulta).text + return loads(info_ip) + case False: + consulta = f'https://ipinfo.io/{ip_consulta}' + info_ip = requests.get(consulta).text + return loads(info_ip) + case None: + return {} + # aqui va la consulta a base de datos -def consulta(ip_consulta): - consulta = f'https://ipinfo.io/{ip_consulta}' - info_ip = requests.get(consulta).text - info_ip = loads(info_ip) - for llave, valor in info_ip.items(): - print(f'{co_YelB}{llave}\b\t{co_Blu}->{co_rst} {co_Grn}{valor}{co_rst}') - - -def ipLocate(ip): +def print_ipinfo(ip, tkn=True): if (re.search(ip_regx, ip)): - consulta(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}') else: @@ -77,50 +82,71 @@ def ipLocate(ip): print(f'{co_Red}[{co_BlkMgn}{ipr}{co_rst}{co_Red}] no es una IP válida!{co_rst}') -def archivo_ips(ips): +def archivo_ips(ips, tkn=True): with open(ips, 'r') as lista: for linea in lista: - ipLocate(linea) + print_ipinfo(linea, tkn) sys.exit(0) def main(): - try: - match sys.argv[1]: - case '--sync': - print(f'{co_YelB}Sincronizando logs del servidor(bash script){co_rst}') - subprocess.check_call( - muevelog+"%s" % "--start", - shell=True) - case '-c': - print(f'{co_YelB}Cargando logs en base de datos{co_rst}') - sql_alch.carga_logs() - case '-g': - print(f'{co_YelB}Registrando datos de ipinfo{co_rst}') - sql_alch.registro_ips() - case '-f': - if isfile(sys.argv[2]): - archivo_ips(sys.argv[2]) - else: - print(f'{co_Red}Archivo [{co_BlkMgn}{sys.argv[2]}'+ - f'{co_rst}{co_Red}] no es válido''') - sys.exit(0) - case '-h': - uso() - exit(0) - case _: - ip = sys.argv[1] - ipLocate(ip) - except IndexError: - print(f'\n{co_Blu}Ingresa una {co_BluB}IP o \'s\' ',end='') - print(f'{co_Blu}para salir:{co_rst}') - while True: - ip = input(f'{co_BluB} -> {co_rst}') - if ip in 'sq0SQnN': - exit(0) - ipLocate(ip) - finally: - sys.exit(0) + if len(sys.argv) > 1: + try: + match sys.argv[1]: + case '--sync': + print(f'{co_YelB}Sincronizando logs del servidor(bash script){co_rst}') + subprocess.check_call( + muevelog+"%s" % "--start", + shell=True) + case '-c': + 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() + case '-D': + print(f'{co_YelB}test_db-D{co_rst}') + # PENDIENTE # PENDIENTE + #sql_alch.test_db() + case '-g': + print(f'{co_YelB}Registrando datos de ipinfo{co_rst}') + sql_alch.registro_ips() + case '-f': + if isfile(sys.argv[2]): + archivo_ips(sys.argv[2], False) + else: + print(f'{co_Red}Archivo [{co_BlkMgn}{sys.argv[2]}'+ + f'{co_rst}{co_Red}] no es válido''') + sys.exit(0) + case '-F': + if isfile(sys.argv[2]): + archivo_ips(sys.argv[2]) + else: + print(f'{co_Red}Archivo [{co_BlkMgn}{sys.argv[2]}'+ + f'{co_rst}{co_Red}] no es válido''') + sys.exit(0) + case '-h': + uso() + exit(0) + case '-t': + ip = sys.argv[2] + print_ipinfo(ip) + case _: + ip = sys.argv[1] + print_ipinfo(ip, False) + except IndexError: + print(f'{co_Red} error sys.args! {co_rst}') + finally: + sys.exit(0) + + print(f'{co_Grn}Ingresa una {co_BluB}IP {co_Grn}o {co_BluB}s '+ + f'{co_Grn}para salir:{co_rst}') + while True: + ip = input(f'{co_BluB} -> {co_rst}') + if ip in 'sq0SQnN': + exit(0) + print_ipinfo(ip) def uso(): @@ -129,8 +155,13 @@ def uso(): {co_cuBlu}Muestra información disponible en ipinfo.io sobre IPs consultadas.{co_rst} {co_BluB}Uso:{co_rst} - {co_YelB}iploc {co_Blu} {co_Grn}- Muestra la información de .{co_rst} - {co_YelB}iploc -f {co_Blu} {co_Grn}- Muestra info. de las IPs en + {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} + {co_YelB}iploc -d {co_Blu} {co_Grn}- Consulta la información de disponible en base de datos.{co_rst} + {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_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} diff --git a/sql_alch.py b/sql_alch.py index 438971b..1e3803e 100644 --- a/sql_alch.py +++ b/sql_alch.py @@ -2,11 +2,12 @@ import os import time from datetime import datetime from sqlalchemy import create_engine -from sqlalchemy.orm import sessionmaker +from sqlalchemy.orm import relationship, sessionmaker from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Sequence, update from sqlalchemy.orm.session import Session from sqlalchemy.sql.expression import select +from sqlalchemy.sql.schema import ForeignKey import iplocate as ipl logs_dir = ipl.parser.get('bash_script', 'destino_log') @@ -15,13 +16,36 @@ base_de_datos = f'sqlite:////{ipl.selfpath}/ipinfo.db' Base = declarative_base() +# Tabla registro ip info +class Registro(Base): + __tablename__ = 'registro' + ip = Column(String, primary_key=True) + hostname = Column(String, nullable=True) + anycast = Column(String, nullable=True) + cuidad = Column(String, nullable=True) + region = Column(String, nullable=True) + pais = Column(String, nullable=True) + geoloc = Column(String, nullable=True) + organizacion = Column(String, nullable=True) + fecha_reg = Column(Integer, default=int(time.mktime(time.localtime()))) + tzone = Column(String, nullable=True) + cod_post = Column(String, nullable=True) + #link = Column(String, nullable=True) + visitas = relationship("Visita", + order_by="Visita.id", + back_populates="visita_ip", + cascade="all, delete, delete-orphan") + + class Visita(Base): __tablename__ = 'visita' id = Column(Integer, Sequence('visita_id_seq'), primary_key=True) - ip = Column(String) + ip = Column(String, ForeignKey('registro.ip')) html = Column(Integer) fecha = Column(Integer) registro = Column(Integer, default=0) + visita_ip = relationship("Registro", back_populates="visitas") + def get_fecha(self): return time.asctime(time.localtime(int(self.fecha.__repr__()))) @@ -45,24 +69,6 @@ class Visita(Base): self.consulta_registro()) -# Tabla registro ip info -class Registro(Base): - __tablename__ = 'registro' - id = Column(Integer, Sequence('registro_id_seq'), primary_key=True) - ip = Column(String) - hostname = Column(String, nullable=True) - anycast = Column(String, nullable=True) - cuidad = Column(String, nullable=True) - region = Column(String, nullable=True) - pais = Column(String, nullable=True) - geoloc = Column(String, nullable=True) - organizacion = Column(String, nullable=True) - fecha_reg = Column(Integer, default=int(time.mktime(time.localtime()))) - tzone = Column(String, nullable=True) - cod_post = Column(String, nullable=True) - link = Column(String, nullable=True) - - engine = create_engine(base_de_datos) Base.metadata.create_all(engine) #Base.metadata.create_all(engine.execution_options(synchronize_session="fetch")) @@ -110,8 +116,12 @@ def epoch_to_local(fecha): def ip_registrada(ip): - ip_reg = session.query(Visita).filter(Visita.ip==ip).filter(Visita.registro==1).first() - return 0 if ip_reg is None else ip_reg.registro + try: + 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 def carga_access_log(log): @@ -133,10 +143,12 @@ def carga_access_log(log): os.remove(log) return True except: - print(f'{ipl.co_Red}Ocurrio un error al intentar abrir/cargar: [{log}]{ipl.co_rst}\n') + print(f'{ipl.co_Red}Error al intentar abrir/cargar: '+ + f'[{ipl.co_rst}{log}{ipl.co_Red}]\n') return False else: - print(f'{ipl.co_Red}log: [{log}] inexistente.{ipl.co_rst}\n') + print(f'{ipl.co_RedB}log: [{ipl.co_rst}{log}{ipl.co_RedB}]'+ + f' inexistente.{ipl.co_rst}\n') return False @@ -159,11 +171,12 @@ def carga_error_logs(log): os.remove(log) return True except: - print(f'{ipl.co_Red}Ocurrio un error'+ - f'al intentar abrir/cargar: [{log}]{ipl.co_rst}\n') + print(f'{ipl.co_Red}Error al intentar abrir/cargar: '+ + f'[{ipl.co_rst}{log}{ipl.co_Red}]\n') return False else: - print(f'{ipl.co_Red}log: [{log}] inexistente.{ipl.co_rst}\n') + print(f'{ipl.co_RedB}log: [{ipl.co_rst}{log}{ipl.co_RedB}]'+ + f' inexistente.{ipl.co_rst}\n') return False @@ -188,26 +201,42 @@ def carga_registro_ip(ip_info): info_dic['organizacion'] = ip_info['org'] if 'org' in ip_info else None info_dic['tzone'] = ip_info['timezone'] if 'timezone' in ip_info else None info_dic['cod_post'] = ip_info['postal'] if 'postal' in ip_info else None - info_dic['link'] = ip_info['readme'] if 'readme' in ip_info else None - session.add(Registro( ip = info_dic['ip'], - hostname = info_dic['hostname'], - anycast = info_dic['anycast'], - cuidad = info_dic['ciudad'], - region = info_dic['region'], - pais = info_dic['pais'], - geoloc = info_dic['geoloc'], - organizacion = info_dic['organizacion'], - fecha_reg = int(time.mktime(time.localtime())), - tzone = info_dic['tzone'], - cod_post = info_dic['cod_post'], - link = info_dic['link'], - )) - session.commit() + try: + session.add(Registro( ip = info_dic['ip'], + hostname = info_dic['hostname'], + anycast = info_dic['anycast'], + cuidad = info_dic['ciudad'], + region = info_dic['region'], + pais = info_dic['pais'], + geoloc = info_dic['geoloc'], + organizacion = info_dic['organizacion'], + fecha_reg = int(time.mktime(time.localtime())), + tzone = info_dic['tzone'], + cod_post = info_dic['cod_post'], + )) + session.commit() + except Exception as ex: + print('Exception: ', ex) stmt = update(Visita).where(Visita.ip == ip_info['ip']).values(registro=1).\ execution_options(synchronize_session="fetch") #result = session.execute(stmt) - session.execute(stmt) - session.commit() + try: + session.execute(stmt) + session.commit() + except Exception as ex: + print('Exception: ', ex) + +def registro(): + pass + +def test_db(): + try: + session.add(Visita(ip='dummy_ip', html=000, fecha=int(time.mktime(time.localtime())))) + session.commit() + session.add(Registro(ip ='dummy_ip')) + session.commit() + except Exception as ex: + print('Exception: ', ex) def registro_ips(): @@ -220,5 +249,5 @@ def registro_ips(): registrar = False #ip_actual= res.ip.split('\n')[0] ip_actual= res.ip - ip_info = ipl.consulta_db(ip_actual) + ip_info = ipl.consulta_ip(ip_actual, True) carga_registro_ip(ip_info)