mejoras, optimización funciones, refactor
bool 'tkn' para consultas con token, o None para DB.
This commit is contained in:
parent
885d4bc3d6
commit
cbfa2dd65d
@ -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.
|
||||||
|
69
iplocate.py
69
iplocate.py
@ -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}
|
||||||
|
85
sql_alch.py
85
sql_alch.py
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user