mejoras, optimización funciones, refactor

bool 'tkn' para consultas con token, o None para DB.
This commit is contained in:
jp.av.dev 2022-05-15 04:06:41 -04:00
parent 885d4bc3d6
commit cbfa2dd65d
3 changed files with 165 additions and 101 deletions

View File

@ -42,8 +42,12 @@ ej. alias `alias iploc='~/ruta/script/iplocate.py'`
Muestra información disponible en ipinfo.io sobre IPs consultadas. Muestra información disponible en ipinfo.io sobre IPs consultadas.
Uso: Uso:
iploc <IP> - Muestra la información de <IP>. iploc <IP> - Consulta la información de <IP> disponible en ipinfo.io.
iploc -f <archivo> - Muestra info. de las IPs en <archivo> iploc -t <IP> - Consulta la info. de <IP> usando 'token' de ipinfo.io,
especificado en config.cfg.
iploc -f <archivo> - Consulta info. de las IPs en <archivo> (ipinfo.ip).
iploc -D <archivo> - Consulta info. de las IPs en <archivo> (base de datos).
iploc -d <IP> - Muestra toda la info. disponible de <IP> registrada en BD.
iploc -c - Carga logs en base de datos. iploc -c - Carga logs en base de datos.
iploc -g - Guarda ipinfo de IPs sin registro en la BD. iploc -g - Guarda ipinfo de IPs sin registro en la BD.
iploc -h - Muestra esta ayuda. iploc -h - Muestra esta ayuda.

View File

@ -18,6 +18,7 @@ parser.read(f'{selfpath}/config.cfg')
token = parser.get('iplocate','token') token = parser.get('iplocate','token')
token = token.strip("'") token = token.strip("'")
muevelog = f'{selfpath}/muevelog.sh ' muevelog = f'{selfpath}/muevelog.sh '
#tkn=True
# Colores # Colores
co_rst = Style.RESET_ALL co_rst = Style.RESET_ALL
@ -53,23 +54,27 @@ def filtro_ip_propia(ip):
return True if ip != ownip else False return True if ip != ownip else False
def consulta_db(ip_consulta): 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}' consulta = f'https://ipinfo.io/{ip_consulta}{token}'
info_ip = requests.get(consulta).text info_ip = requests.get(consulta).text
return loads(info_ip) return loads(info_ip)
case False:
def consulta(ip_consulta):
consulta = f'https://ipinfo.io/{ip_consulta}' consulta = f'https://ipinfo.io/{ip_consulta}'
info_ip = requests.get(consulta).text info_ip = requests.get(consulta).text
info_ip = loads(info_ip) return loads(info_ip)
for llave, valor in info_ip.items(): case None:
print(f'{co_YelB}{llave}\b\t{co_Blu}->{co_rst} {co_Grn}{valor}{co_rst}') return {}
# aqui va la consulta a base de datos
def ipLocate(ip): def print_ipinfo(ip, tkn=True):
if (re.search(ip_regx, ip)): 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_RedB}------------------------------', end='')
print(f'--------------------------------{co_rst}') print(f'--------------------------------{co_rst}')
else: else:
@ -77,14 +82,15 @@ def ipLocate(ip):
print(f'{co_Red}[{co_BlkMgn}{ipr}{co_rst}{co_Red}] no es una IP válida!{co_rst}') 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: with open(ips, 'r') as lista:
for linea in lista: for linea in lista:
ipLocate(linea) print_ipinfo(linea, tkn)
sys.exit(0) sys.exit(0)
def main(): def main():
if len(sys.argv) > 1:
try: try:
match sys.argv[1]: match sys.argv[1]:
case '--sync': case '--sync':
@ -95,10 +101,25 @@ def main():
case '-c': case '-c':
print(f'{co_YelB}Cargando logs en base de datos{co_rst}') print(f'{co_YelB}Cargando logs en base de datos{co_rst}')
sql_alch.carga_logs() 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': case '-g':
print(f'{co_YelB}Registrando datos de ipinfo{co_rst}') print(f'{co_YelB}Registrando datos de ipinfo{co_rst}')
sql_alch.registro_ips() sql_alch.registro_ips()
case '-f': 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]): if isfile(sys.argv[2]):
archivo_ips(sys.argv[2]) archivo_ips(sys.argv[2])
else: else:
@ -108,19 +129,24 @@ def main():
case '-h': case '-h':
uso() uso()
exit(0) exit(0)
case '-t':
ip = sys.argv[2]
print_ipinfo(ip)
case _: case _:
ip = sys.argv[1] ip = sys.argv[1]
ipLocate(ip) print_ipinfo(ip, False)
except IndexError: except IndexError:
print(f'\n{co_Blu}Ingresa una {co_BluB}IP o \'s\' ',end='') print(f'{co_Red} error sys.args! {co_rst}')
print(f'{co_Blu}para salir:{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: while True:
ip = input(f'{co_BluB} -> {co_rst}') ip = input(f'{co_BluB} -> {co_rst}')
if ip in 'sq0SQnN': if ip in 'sq0SQnN':
exit(0) exit(0)
ipLocate(ip) print_ipinfo(ip)
finally:
sys.exit(0)
def uso(): def uso():
@ -129,8 +155,13 @@ def uso():
{co_cuBlu}Muestra información disponible en ipinfo.io sobre IPs consultadas.{co_rst} {co_cuBlu}Muestra información disponible en ipinfo.io sobre IPs consultadas.{co_rst}
{co_BluB}Uso:{co_rst} {co_BluB}Uso:{co_rst}
{co_YelB}iploc {co_Blu}<IP> {co_Grn}- Muestra la información de <IP>.{co_rst} {co_YelB}iploc {co_Blu}<IP> {co_Grn}- Consulta la información de <IP> disponible en ipinfo.io.{co_rst}
{co_YelB}iploc -f {co_Blu}<archivo> {co_Grn}- Muestra info. de las IPs en <archivo> {co_YelB}iploc -t {co_Blu}<IP> {co_Grn}- Consulta la info. de <IP> usando 'token' de ipinfo.io,
especificado en config.cfg.{co_rst}
{co_YelB}iploc -d {co_Blu}<IP> {co_Grn}- Consulta la información de <IP> disponible en base de datos.{co_rst}
{co_YelB}iploc -f {co_Blu}<archivo> {co_Grn}- Consulta info. de las IPs en <archivo> (ipinfo.io).{co_rst}
{co_YelB}iploc -F {co_Blu}<archivo> {co_Grn}- Consulta info. de las IPs en <archivo> (token, ipinfo.io).{co_rst}
{co_YelB}iploc -D {co_Blu}<archivo> {co_Grn}- Consulta info. de las IPs en <archivo> (base de datos).{co_rst}
{co_YelB}iploc -c {co_Grn}- Carga logs 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 -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 -h {co_Grn}- Muestra esta ayuda.{co_rst}

View File

@ -2,11 +2,12 @@ import os
import time import time
from datetime import datetime from datetime import datetime
from sqlalchemy import create_engine 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.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Sequence, update from sqlalchemy import Column, Integer, String, Sequence, update
from sqlalchemy.orm.session import Session from sqlalchemy.orm.session import Session
from sqlalchemy.sql.expression import select from sqlalchemy.sql.expression import select
from sqlalchemy.sql.schema import ForeignKey
import iplocate as ipl import iplocate as ipl
logs_dir = ipl.parser.get('bash_script', 'destino_log') 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() 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): class Visita(Base):
__tablename__ = 'visita' __tablename__ = 'visita'
id = Column(Integer, Sequence('visita_id_seq'), primary_key=True) id = Column(Integer, Sequence('visita_id_seq'), primary_key=True)
ip = Column(String) ip = Column(String, ForeignKey('registro.ip'))
html = Column(Integer) html = Column(Integer)
fecha = Column(Integer) fecha = Column(Integer)
registro = Column(Integer, default=0) registro = Column(Integer, default=0)
visita_ip = relationship("Registro", back_populates="visitas")
def get_fecha(self): def get_fecha(self):
return time.asctime(time.localtime(int(self.fecha.__repr__()))) return time.asctime(time.localtime(int(self.fecha.__repr__())))
@ -45,24 +69,6 @@ class Visita(Base):
self.consulta_registro()) 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) engine = create_engine(base_de_datos)
Base.metadata.create_all(engine) Base.metadata.create_all(engine)
#Base.metadata.create_all(engine.execution_options(synchronize_session="fetch")) #Base.metadata.create_all(engine.execution_options(synchronize_session="fetch"))
@ -110,7 +116,11 @@ def epoch_to_local(fecha):
def ip_registrada(ip): def ip_registrada(ip):
try:
ip_reg = session.query(Visita).filter(Visita.ip==ip).filter(Visita.registro==1).first() 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 return 0 if ip_reg is None else ip_reg.registro
@ -133,10 +143,12 @@ def carga_access_log(log):
os.remove(log) os.remove(log)
return True return True
except: 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 return False
else: 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 return False
@ -159,11 +171,12 @@ def carga_error_logs(log):
os.remove(log) os.remove(log)
return True return True
except: except:
print(f'{ipl.co_Red}Ocurrio un error'+ print(f'{ipl.co_Red}Error al intentar abrir/cargar: '+
f'al intentar abrir/cargar: [{log}]{ipl.co_rst}\n') f'[{ipl.co_rst}{log}{ipl.co_Red}]\n')
return False return False
else: 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 return False
@ -188,7 +201,7 @@ def carga_registro_ip(ip_info):
info_dic['organizacion'] = ip_info['org'] if 'org' in ip_info else None 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['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['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 try:
session.add(Registro( ip = info_dic['ip'], session.add(Registro( ip = info_dic['ip'],
hostname = info_dic['hostname'], hostname = info_dic['hostname'],
anycast = info_dic['anycast'], anycast = info_dic['anycast'],
@ -200,14 +213,30 @@ def carga_registro_ip(ip_info):
fecha_reg = int(time.mktime(time.localtime())), fecha_reg = int(time.mktime(time.localtime())),
tzone = info_dic['tzone'], tzone = info_dic['tzone'],
cod_post = info_dic['cod_post'], cod_post = info_dic['cod_post'],
link = info_dic['link'],
)) ))
session.commit() session.commit()
except Exception as ex:
print('Exception: ', ex)
stmt = update(Visita).where(Visita.ip == ip_info['ip']).values(registro=1).\ stmt = update(Visita).where(Visita.ip == ip_info['ip']).values(registro=1).\
execution_options(synchronize_session="fetch") execution_options(synchronize_session="fetch")
#result = session.execute(stmt) #result = session.execute(stmt)
try:
session.execute(stmt) session.execute(stmt)
session.commit() 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(): def registro_ips():
@ -220,5 +249,5 @@ def registro_ips():
registrar = False registrar = False
#ip_actual= res.ip.split('\n')[0] #ip_actual= res.ip.split('\n')[0]
ip_actual= res.ip ip_actual= res.ip
ip_info = ipl.consulta_db(ip_actual) ip_info = ipl.consulta_ip(ip_actual, True)
carga_registro_ip(ip_info) carga_registro_ip(ip_info)