Compare commits

..

No commits in common. "78a6996f5f33e97f33468ae88deaae7f2090773e" and "32943e40f1c57c3c355f1c3690f2350af59e01f5" have entirely different histories.

4 changed files with 199 additions and 364 deletions

View File

@ -24,9 +24,9 @@ console = Console()
# tkn=True # tkn=True
logging.basicConfig( logging.basicConfig(
filename=log_file, filename=log_file,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO level=logging.INFO
) )
logging.info("iplocate inicio") logging.info("iplocate inicio")
@ -70,43 +70,6 @@ def filtro_ip_propia(ip):
return True if ip != ownip and not local_ip(ip) else False return True if ip != ownip and not local_ip(ip) else False
def visita_como_lista(ip_info):
lista_visitas = []
contad = 0
for tupla in ip_info:
visita = []
if contad < 1:
for ind, val in enumerate(tupla):
if ind == 0:
ip_dict = dict()
for dato in str(val).split(';'):
ip_dict[dato.split("=")[0]] = dato.split("=")[1]
print_tabla_ip(ip_dict)
else:
visita.append(str(val).split(',')[3].split('=')[1])
visita.append(str(val).split(',')[2].split('=')[1])
metodo = (str(val).split(',')[4].split('=')[1])
metodo = '---' if metodo == 'None' else metodo
visita.append(metodo)
request = ''.join(str(val).split(',')[5].split('=')[1:])
request = '---' if request == 'None' else request
visita.append(request)
else:
for ind, val in enumerate(tupla):
if ind > 0:
visita.append(str(val).split(',')[3].split('=')[1])
visita.append(str(val).split(',')[2].split('=')[1])
metodo = (str(val).split(',')[4].split('=')[1])
metodo = '---' if metodo == 'None' else metodo
visita.append(metodo)
request = ''.join(str(val).split(',')[5].split('=')[1:])
request = '---' if request == 'None' else request
visita.append(request)
lista_visitas.append(visita)
contad += 1
return lista_visitas
def print_ipinfo(ip, tkn=True): def print_ipinfo(ip, tkn=True):
if valid_ip(ip): if valid_ip(ip):
try: try:
@ -117,18 +80,50 @@ def print_ipinfo(ip, tkn=True):
if isinstance(ip_info, dict): if isinstance(ip_info, dict):
print_tabla_ip(ip_info) print_tabla_ip(ip_info)
elif isinstance(ip_info, list): elif isinstance(ip_info, list):
print_tabla_visita(visita_como_lista(ip_info)) lista_visitas = []
contad = 0
for tupla in ip_info:
visita = []
if contad < 1:
for ind, val in enumerate(tupla):
if ind == 0:
ip_dict = dict()
for dato in str(val).split(';'):
ip_dict[dato.split("=")[0]] = dato.split("=")[1]
print_tabla_ip(ip_dict)
else:
visita.append(str(val).split(',')[3].split('=')[1]) # .ljust(24))
visita.append(str(val).split(',')[2].split('=')[1]) # .center(11))
metodo = (str(val).split(',')[4].split('=')[1])
metodo = '---' if metodo == 'None' else metodo # .center(10)
visita.append(metodo)
request = ''.join(str(val).split(',')[5].split('=')[1:])
# configurar wrap en tabla
# request = request[:86]+'...' if len(request) > 90 else request
request = '---' if request == 'None' else request
visita.append(request)
else:
for ind, val in enumerate(tupla):
if ind > 0:
# aqui modificar para representar las nuevas columnas de tabla visita
visita.append(str(val).split(',')[3].split('=')[1]) #.ljust(24)
visita.append(str(val).split(',')[2].split('=')[1]) #.center(11)
metodo = (str(val).split(',')[4].split('=')[1])
metodo = '---' if metodo == 'None' else metodo #.center(10)
visita.append(metodo)
request = ''.join(str(val).split(',')[5].split('=')[1:])
# configurar wrap en tabla
# request = request[:86]+'...' if len(request) > 90 else request
request = '---' if request == 'None' else request
visita.append(request)
lista_visitas.append(visita)
contad += 1
print_tabla_visita(lista_visitas)
else: else:
console.print( console.print(f'[red]Error type(ip_info) = [/red][magenta]{type(ip_info)}[/magenta][red]][/red]')
'[red]Error type(ip_info) = [/red][magenta]'
f'{type(ip_info)}[/magenta][red]][/red]'
)
else: else:
ipr = ip.split('\n')[0] ipr = ip.split('\n')[0]
console.print( console.print(f'[red][[/red][magenta]{ipr}[/magenta][red]] no es una IP válida![/red]')
f'[red][[/red][magenta]{ipr}[/magenta][red]]'
' no es una IP válida![/red]'
)
def print_tabla_ip(ip_info): def print_tabla_ip(ip_info):
@ -180,14 +175,11 @@ def print_tabla_ip(ip_info):
def print_tabla_visita(lista_visitas): def print_tabla_visita(lista_visitas):
tbl_v = Table(box=box.ROUNDED, show_lines=False, row_styles=[ tbl_v = Table(box=box.ROUNDED, show_lines=False, row_styles=["dim", ""], border_style="dark_orange3")
"dim", ""], border_style="dark_orange3") tbl_v.add_column("Fecha visita", justify="center", style="bright_yellow", no_wrap=True)
tbl_v.add_column("Fecha visita", justify="center",
style="bright_yellow", no_wrap=True)
tbl_v.add_column("Codigo", justify="center", style="bold dodger_blue2") tbl_v.add_column("Codigo", justify="center", style="bold dodger_blue2")
tbl_v.add_column("Metodo", justify="center", style="bright_magenta") tbl_v.add_column("Metodo", justify="center", style="bright_magenta")
tbl_v.add_column("Request", justify="left", style="#00ff5f", tbl_v.add_column("Request", justify="left", style="#00ff5f", overflow='fold', no_wrap=False)
overflow='fold', no_wrap=False)
for item in lista_visitas: for item in lista_visitas:
tbl_v.add_row(item[0], item[1], item[2], item[3]) tbl_v.add_row(item[0], item[1], item[2], item[3])
@ -204,78 +196,56 @@ def archivo_ips(ips, tkn=True):
def _sync(): def _sync():
console.print( console.print('[bold yellow]Sincronizando logs del servidor(bash script)[/bold yellow]')
'[bold yellow]Sincronizando logs del servidor'
'(bash script)[/bold yellow]'
)
subprocess.check_call(muevelog+"%s" % "--start", shell=True) subprocess.check_call(muevelog+"%s" % "--start", shell=True)
def archivo_invalido(archivo):
console.print(
f'[red]Archivo [[/red][magenta]{archivo}'
'[/magenta][red]] no es válido[/red]'
)
sys.exit(0)
def main(): def main():
if len(sys.argv) > 1: if len(sys.argv) > 1:
try: try:
match sys.argv[1]: match sys.argv[1]:
case '--all': case '--all':
_sync() _sync()
console.print( console.print('[bold yellow]Cargando logs en base de datos[/bold yellow]\n')
'[bold yellow]Cargando logs en base de datos'
'[/bold yellow]\n'
)
sql_alch.carga_logs() sql_alch.carga_logs()
console.print( console.print('[bold yellow]Registro de datos de ipinfo[/bold yellow]')
'[bold yellow]Registro de datos de ipinfo'
'[/bold yellow]'
)
sql_alch.registro_ips() sql_alch.registro_ips()
console.print( console.print('[bold yellow]Generando mapa de visitas[/bold yellow]')
'[bold yellow]Generando mapa de visitas[/bold yellow]')
sql_alch.mapsgen() sql_alch.mapsgen()
case '--sync': case '--sync':
_sync() _sync()
case '-c': case '-c':
console.print( console.print('[bold yellow]Cargando logs en base de datos[/bold yellow]\n')
'[bold yellow]Cargando logs en base de datos'
'[/bold yellow]\n'
)
sql_alch.carga_logs() sql_alch.carga_logs()
case '-g': case '-g':
console.print( console.print('[bold yellow]Registro de datos de ipinfo[/bold yellow]')
'[bold yellow]Registro de datos de ipinfo'
'[/bold yellow]'
)
sql_alch.registro_ips() sql_alch.registro_ips()
case '-d': case '-d':
console.print( console.print('[bold yellow]Consulta a base de datos:[/bold yellow]')
'[bold yellow]Consulta a base de datos:[/bold yellow]')
ip = sys.argv[2] ip = sys.argv[2]
print_ipinfo(ip, None) print_ipinfo(ip, None)
case '-D': case '-D':
console.print( console.print('[bold yellow]Consulta por archivo a base de datos:[/bold yellow]')
'[bold yellow]Consulta por archivo a base de datos:'
'[/bold yellow]'
)
if isfile(sys.argv[2]): if isfile(sys.argv[2]):
archivo_ips(sys.argv[2], None) archivo_ips(sys.argv[2], None)
else: else:
archivo_invalido(sys.argv[2]) console.print(f'[red]Archivo [[/red][magenta]{sys.argv[2]}[/magenta]'
'[red]] no es válido![/red]')
sys.exit(0)
case '-f': case '-f':
if isfile(sys.argv[2]): if isfile(sys.argv[2]):
archivo_ips(sys.argv[2], False) archivo_ips(sys.argv[2], False)
else: else:
archivo_invalido(sys.argv[2]) console.print(f'[red]Archivo [[/red][magenta]{sys.argv[2]}[/magenta]'
'[red]] no es válido[/red]')
sys.exit(0)
case '-F': case '-F':
if isfile(sys.argv[2]): if isfile(sys.argv[2]):
archivo_ips(sys.argv[2]) archivo_ips(sys.argv[2])
else: else:
archivo_invalido(sys.argv[2]) console.print(f'[red]Archivo [[/red][magenta]{sys.argv[2]}[/magenta]'
'[red]] no es válido[/red]')
sys.exit(0)
case '-h': case '-h':
uso() uso()
exit(0) exit(0)
@ -286,8 +256,7 @@ def main():
ip = sys.argv[2] ip = sys.argv[2]
print_ipinfo(ip) print_ipinfo(ip)
case '-M': case '-M':
console.print( console.print('[bold yellow]Generando mapa de visitas[/bold yellow]')
'[bold yellow]Generando mapa de visitas[/bold yellow]')
sql_alch.mapsgen() sql_alch.mapsgen()
case '-q': case '-q':
match sys.argv[2]: match sys.argv[2]:
@ -300,37 +269,20 @@ def main():
case '--pais-desde': case '--pais-desde':
pais = sys.argv[3] pais = sys.argv[3]
fecha_local = sys.argv[4] fecha_local = sys.argv[4]
fecha_unix = sql_alch.fecha_error_to_epoch( fecha_unix = sql_alch.fecha_error_to_epoch(sys.argv[4]+' 00:00:00')
sys.argv[4]+' 00:00:00' querys.pt_sel_pais_fecha(pais.upper(), fecha_unix, fecha_local)
)
querys.pt_sel_pais_fecha(
pais.upper(),
fecha_unix,
fecha_local
)
case '--detalle-pais': case '--detalle-pais':
pais = sys.argv[3] pais = sys.argv[3]
if len(sys.argv) > 4: if len(sys.argv) > 4:
if sys.argv[4].isnumeric(): if sys.argv[4].isnumeric():
codigo = sys.argv[4] codigo = sys.argv[4]
querys.pt_visita_pais_detalle( querys.pt_visita_pais_detalle(pais.upper(), codigo)
pais.upper(),
codigo
)
else: else:
console.print( console.print(f'[magenta]-q --detalle-pais <pais> [/magenta][red][bold]<CODIGO> inválido ({sys.argv[4]})[/bold][/red]')
'[magenta]-q --detalle-pais <pais> '
'[/magenta][red][bold]<CODIGO> '
f'inválido ({sys.argv[4]})'
'[/bold][/red]'
)
else: else:
querys.pt_visita_pais_detalle(pais.upper()) querys.pt_visita_pais_detalle(pais.upper())
case _: case _:
console.print( console.print(f'[red] query desconocida [bold]{sys.argv[2]}[/bold][/red]')
'[red] query desconocida [bold]'
f'{sys.argv[2]}[/bold][/red]'
)
case _: case _:
ip = sys.argv[1] ip = sys.argv[1]
print_ipinfo(ip, False) print_ipinfo(ip, False)
@ -351,7 +303,7 @@ def main():
def uso_consultas(): def uso_consultas():
ayuda = """ ayuda = f"""
[bold blue]ipLocate[/bold blue] [bold blue]ipLocate[/bold blue]
[deep_sky_blue1]Reportes según consultas a base de datos. [deep_sky_blue1]Reportes según consultas a base de datos.
@ -369,7 +321,7 @@ def uso_consultas():
def uso(): def uso():
ayuda = """ ayuda = f"""
[bold blue]ipLocate[/bold blue] [bold blue]ipLocate[/bold blue]
[deep_sky_blue1]Consulta en ipinfo.io (con o sin token) información sobre IP(s). [deep_sky_blue1]Consulta en ipinfo.io (con o sin token) información sobre IP(s).

Binary file not shown.

Before

Width:  |  Height:  |  Size: 279 KiB

After

Width:  |  Height:  |  Size: 279 KiB

View File

@ -16,13 +16,8 @@ def map200(geolocs):
lat = float(loc[0].split(',')[0]) lat = float(loc[0].split(',')[0])
lon = float(loc[0].split(',')[1]) lon = float(loc[0].split(',')[1])
marca200 = staticmaps.create_latlng(lat, lon) marca200 = staticmaps.create_latlng(lat, lon)
cntxt200.add_object( cntxt200.add_object(staticmaps.Marker(
staticmaps.Marker( marca200, color=staticmaps.parse_color('#00ff29'), size=7))
marca200,
color=staticmaps.parse_color('#00ff29'),
size=7
)
)
svg_image = cntxt200.render_svg(1920, 1080) svg_image = cntxt200.render_svg(1920, 1080)
with open(f"{selfpath}/maps/map_200.svg", "w", encoding="utf-8") as f: with open(f"{selfpath}/maps/map_200.svg", "w", encoding="utf-8") as f:
@ -56,25 +51,15 @@ def maps_gen(locs_200, locs_300):
lat = float(loc[0].split(',')[0]) lat = float(loc[0].split(',')[0])
lon = float(loc[0].split(',')[1]) lon = float(loc[0].split(',')[1])
marca3 = staticmaps.create_latlng(lat, lon) marca3 = staticmaps.create_latlng(lat, lon)
cntxtAll.add_object( cntxtAll.add_object(staticmaps.Marker(
staticmaps.Marker( marca3, color=staticmaps.parse_color('#b20101'), size=5))
marca3,
color=staticmaps.parse_color('#b20101'),
size=5
)
)
for loc in locs_200: for loc in locs_200:
lat = float(loc[0].split(',')[0]) lat = float(loc[0].split(',')[0])
lon = float(loc[0].split(',')[1]) lon = float(loc[0].split(',')[1])
marca3 = staticmaps.create_latlng(lat, lon) marca3 = staticmaps.create_latlng(lat, lon)
cntxtAll.add_object( cntxtAll.add_object(staticmaps.Marker(
staticmaps.Marker( marca3, color=staticmaps.parse_color('#00ff29'), size=6))
marca3,
color=staticmaps.parse_color('#00ff29'),
size=6
)
)
svg_image = cntxtAll.render_svg(1920, 1080) svg_image = cntxtAll.render_svg(1920, 1080)
with open(f"{selfpath}/maps/map_all.svg", "w", encoding="utf-8") as f: with open(f"{selfpath}/maps/map_all.svg", "w", encoding="utf-8") as f:
@ -93,25 +78,15 @@ def maps_thumbs(locs_200, locs_300):
lat = float(loc[0].split(',')[0]) lat = float(loc[0].split(',')[0])
lon = float(loc[0].split(',')[1]) lon = float(loc[0].split(',')[1])
demo300 = staticmaps.create_latlng(lat, lon) demo300 = staticmaps.create_latlng(lat, lon)
cntxtdemo.add_object( cntxtdemo.add_object(staticmaps.Marker(
staticmaps.Marker( demo300, color=staticmaps.parse_color('#b20101'), size=4))
demo300,
color=staticmaps.parse_color('#b20101'),
size=4
)
)
for loc in locs_200: for loc in locs_200:
lat = float(loc[0].split(',')[0]) lat = float(loc[0].split(',')[0])
lon = float(loc[0].split(',')[1]) lon = float(loc[0].split(',')[1])
demo200 = staticmaps.create_latlng(lat, lon) demo200 = staticmaps.create_latlng(lat, lon)
cntxtdemo.add_object( cntxtdemo.add_object(staticmaps.Marker(
staticmaps.Marker( demo200, color=staticmaps.parse_color('#00ff29'), size=5))
demo200,
color=staticmaps.parse_color('#00ff29'),
size=5
)
)
svg_thumb = cntxtdemo.render_svg(1024, 768) svg_thumb = cntxtdemo.render_svg(1024, 768)
with open(f"{selfpath}/maps/map_thumb.svg", "w", encoding="utf-8") as f: with open(f"{selfpath}/maps/map_thumb.svg", "w", encoding="utf-8") as f:

View File

@ -2,23 +2,15 @@ import os
import time import time
import subprocess import subprocess
from consultas.querys_sqlite import get_geoloc from consultas.querys_sqlite import get_geoloc
from iplocate import ( from iplocate import requests, token, filtro_ip_propia, selfpath, parser, log_usage, valid_ip
requests,
token,
filtro_ip_propia,
selfpath,
parser,
log_usage,
valid_ip
)
from json import loads from json import loads
from datetime import datetime from datetime import datetime
from sqlalchemy import create_engine from sqlalchemy import create_engine
from sqlalchemy.orm import relationship, 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 # , distinct from sqlalchemy.sql.expression import distinct, select
from sqlalchemy.sql.schema import ForeignKey from sqlalchemy.sql.schema import ForeignKey
from rich.progress import Progress, track from rich.progress import Progress, track
from rich.console import Console from rich.console import Console
@ -37,40 +29,35 @@ class Registro(Base):
"""Definición de tabla 'Registro'""" """Definición de tabla 'Registro'"""
__tablename__ = 'registro' __tablename__ = 'registro'
ip = Column(String, primary_key=True) ip = Column(String, primary_key=True)
hostname = Column(String, nullable=True) hostname = Column(String, nullable=True)
anycast = Column(String, nullable=True) anycast = Column(String, nullable=True)
cuidad = Column(String, nullable=True) cuidad = Column(String, nullable=True)
region = Column(String, nullable=True) region = Column(String, nullable=True)
pais = Column(String, nullable=True) pais = Column(String, nullable=True)
geoloc = Column(String, nullable=True) geoloc = Column(String, nullable=True)
organizacion = Column(String, nullable=True) organizacion = Column(String, nullable=True)
fecha_reg = Column(Integer, default=int(time.mktime(time.localtime()))) fecha_reg = Column(Integer, default=int(time.mktime(time.localtime())))
tzone = Column(String, nullable=True) tzone = Column(String, nullable=True)
cod_post = Column(String, nullable=True) cod_post = Column(String, nullable=True)
visitas = relationship( #link = Column(String, nullable=True)
"Visita", visitas = relationship("Visita",
order_by="Visita.id", order_by="Visita.id",
back_populates="visita_ip", back_populates="visita_ip",
cascade="all, delete, delete-orphan" cascade="all, delete, delete-orphan")
)
def get_fecha(self): def get_fecha(self):
"""Convierte fecha 'unix epoch' y devuelve en formato local""" """Convierte fecha 'unix epoch' y devuelve en formato local"""
return time.asctime( return time.asctime(time.localtime(int(self.fecha_reg.__repr__())))
time.localtime(
int(self.fecha_reg.__repr__())
)
)
def __repr__(self) -> str: def __repr__(self) -> str:
# print('en repr')
try: try:
rep = f'ip={self.ip};host={self.hostname};' \ rep = f'ip={self.ip};host={self.hostname};anycast={self.anycast};'+\
f'anycast={self.anycast};cuidad={self.cuidad};' \ f'cuidad={self.cuidad};region={self.region};pais={self.pais};'+\
f'region={self.region};pais={self.pais};' \ f'geoloc={self.geoloc};organizacion={self.organizacion};'+\
f'geoloc={self.geoloc};organizacion={self.organizacion};' \ f'fecha_reg={self.get_fecha()};tzone={self.tzone};cod_post={self.cod_post}'
f'fecha_reg={self.get_fecha()};tzone={self.tzone};' \ # print('Repr:', rep)
f'cod_post={self.cod_post}'
return rep return rep
except Exception as ex: except Exception as ex:
print('Exception :', ex) print('Exception :', ex)
@ -80,22 +67,18 @@ class Registro(Base):
class Visita(Base): class Visita(Base):
"""Definición de tabla 'Visita'""" """Definición de tabla 'Visita'"""
__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, ForeignKey('registro.ip')) ip = Column(String, ForeignKey('registro.ip'))
cod_html = Column(Integer) cod_html = Column(Integer)
fecha = Column(Integer) fecha = Column(Integer)
metodo = Column(String, default='---') metodo = Column(String, default='---')
consulta = Column(String, default='---') consulta = Column(String, default='---')
registro = Column(Integer, default=0) registro = Column(Integer, default=0)
visita_ip = relationship("Registro", back_populates="visitas") visita_ip = relationship("Registro", back_populates="visitas")
def get_fecha(self): def get_fecha(self):
"""Convierte fecha 'unix epoch' y devuelve en formato local""" """Convierte fecha 'unix epoch' y devuelve en formato local"""
return time.asctime( return time.asctime(time.localtime(int(self.fecha.__repr__())))
time.localtime(
int(self.fecha.__repr__())
)
)
def consulta_registro(self): def consulta_registro(self):
return True if self.registro == 1 else False return True if self.registro == 1 else False
@ -103,9 +86,8 @@ class Visita(Base):
def __repr__(self) -> str: def __repr__(self) -> str:
"""Representación en cadena de texto del los datos en tabla""" """Representación en cadena de texto del los datos en tabla"""
try: try:
rep = f'id={self.id},ip={self.ip},html={self.cod_html},' \ rep = f'id={self.id},ip={self.ip},html={self.cod_html},'\
f'fecha={self.get_fecha()},metodo={self.metodo}' \ f'fecha={self.get_fecha()},metodo={self.metodo},request={self.consulta}'
f',request={self.consulta}'
return rep return rep
except Exception as ex: except Exception as ex:
print('Exception :', ex) print('Exception :', ex)
@ -114,6 +96,7 @@ class Visita(Base):
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"))
Session = sessionmaker(bind=engine) Session = sessionmaker(bind=engine)
session = Session() session = Session()
@ -129,7 +112,7 @@ fecha_access = "10/May/2022:11:42:14 -0400".split(' ')[0]
def fecha_access_to_epoch(fecha): def fecha_access_to_epoch(fecha):
"""Convierte la fecha del formato entregado por access.log """Convierte la fecha del formato entregado por access.log
y reverse_access.log (nginx) al formato unix epoch. y reverse_access.log(nginx) al formato unix epoch.
:fecha: str Fecha :fecha: str Fecha
:returns: int unix epoch fecha (secs) :returns: int unix epoch fecha (secs)
""" """
@ -162,11 +145,7 @@ def ip_registrada(ip):
en tabla 'Visita' para ip pasada como argumento. en tabla 'Visita' para ip pasada como argumento.
""" """
try: try:
ip_reg = session.query(Visita).filter( ip_reg = session.query(Visita).filter(Visita.ip == ip).filter(Visita.registro == 1).first()
Visita.ip == ip
).filter(
Visita.registro == 1
).first()
except Exception as ex: except Exception as ex:
print('Exception', ex) print('Exception', ex)
ip_reg = None ip_reg = None
@ -175,29 +154,20 @@ def ip_registrada(ip):
def carga_access_log(log): def carga_access_log(log):
"""Procesa logs del tipo access, filtra IPs propias (publica y locales), """Procesa logs del tipo access, filtra IPs propias (publica y locales),
acorta las peticiones donde es necesario, convierte fechas a formato unix acorta los donde es necesario, convierte fechas a formato unix epoch,
epoch, los añade a la session para la tabla 'Visita'. los añade a session para tabla 'Visita'.
Finalmente realiza la transaccion utilizando clase Progres() del modulo Finalmente realiza la transaccion utilizando clase Progres() del modulo rich.
rich. Borra el log procesado.""" Y borra el log procesado.
"""
if os.path.exists(log): if os.path.exists(log):
nombre_log = log.split('/')[-1] nombre_log = log.split('/')[-1]
console.print( console.print(f'[yellow]Procesando [[/yellow]{nombre_log}[yellow]][/yellow]')
f'[yellow]Procesando [[/yellow]{nombre_log}[yellow]][/yellow]'
)
try: try:
with open(log, 'r') as lista: with open(log, 'r') as lista:
try: try:
largo = subprocess.run( largo = subprocess.run(['wc', '-l', log], capture_output=True, text=True)
['wc', '-l', log],
capture_output=True,
text=True
)
largo = int(largo.stdout.split(' ')[0]) largo = int(largo.stdout.split(' ')[0])
for linea in track( for linea in track(lista, total=largo, description='[blue bold]Cargando [/blue bold]'):
lista,
total=largo,
description='[blue bold]Cargando [/blue bold]'
):
ip = linea.split(' ')[0] ip = linea.split(' ')[0]
if filtro_ip_propia(ip): if filtro_ip_propia(ip):
try: try:
@ -209,19 +179,19 @@ def carga_access_log(log):
metodo = linea.split('"')[1].split(' ')[0] metodo = linea.split('"')[1].split(' ')[0]
if len(metodo) > 10 or len(metodo) < 2: if len(metodo) > 10 or len(metodo) < 2:
metodo = '---' metodo = '---'
except Exception: except Exception as ex:
metodo = '---' metodo = '---'
try: try:
url = linea.split('"')[1].split(' ')[1] url = linea.split('"')[1].split(' ')[1]
if len(url) > 254: if len(url) > 254:
url = url[:252]+'...' url = url[:252]+'...'
except Exception: except Exception as ex:
url = '---' url = '---'
try: try:
codigo = int(linea.split('"')[2].split(' ')[1]) codigo = int(linea.split('"')[2].split(' ')[1])
if len(str(codigo)) != 3: if len(str(codigo)) != 3:
codigo = 0 codigo = 0
except Exception: except Exception as ex:
codigo = 0 codigo = 0
try: try:
fecha = linea.split(' ')[3][1:] fecha = linea.split(' ')[3][1:]
@ -230,94 +200,64 @@ def carga_access_log(log):
fecha = None fecha = None
print('Exception split Fecha:', ex) print('Exception split Fecha:', ex)
if ip_registrada(ip): if ip_registrada(ip):
session.add( session.add(Visita(ip=ip,
Visita( cod_html=codigo,
ip=ip, fecha=fecha,
cod_html=codigo, metodo=metodo,
fecha=fecha, consulta=url,
metodo=metodo, registro=1))
consulta=url,
registro=1
)
)
else: else:
session.add( session.add(Visita(ip=ip,
Visita( cod_html=codigo,
ip=ip, fecha=fecha,
cod_html=codigo, metodo=metodo,
fecha=fecha, consulta=url))
metodo=metodo,
consulta=url
)
)
except Exception as ex: except Exception as ex:
print('Exception: ', ex) print('Exception: ', ex)
try: try:
with Progress() as prog, session: with Progress() as prog, session:
task1 = prog.add_task( task1 = prog.add_task("[yellow bold]Guardando[/yellow bold]", total=len(session.new))
"[yellow bold]Guardando[/yellow bold]",
total=len(session.new)
)
session.commit() session.commit()
while not prog.finished: while not prog.finished:
prog.update(task1, advance=0.1) prog.update(task1, advance=0.1)
time.sleep(0.05) time.sleep(0.05)
except Exception as ex: except Exception as ex:
print('Exception Progress: ', ex) print('Exception Progress: ', ex)
console.print( console.print('[magenta] - Carga completa.. borrando log[/magenta]\n')
'[magenta] - Carga completa.. borrando log[/magenta]\n'
)
os.remove(log) os.remove(log)
return True return True
except Exception: except:
console.print( console.print(f'[red]Error al intentar abrir/cargar: [{log}[/red]]\n')
f'[red]Error al intentar abrir/cargar: [{log}[/red]]\n'
)
return False return False
else: else:
console.print( console.print(f'[bold red]Log: [[/bold red]{log}[bold red]] inexistente.[/bold red]\n')
f'[bold red]Log: [[/bold red]{log}[bold red]] '
'inexistente.[/bold red]\n'
)
return False return False
def carga_error_logs(log): def carga_error_logs(log):
"""Procesa logs del tipo error, acorta los donde es necesario, convierte """Procesa logs del tipo error, acorta los donde es necesario, convierte fechas
fechas a formato unix epoch, filtra IPs propias (publica y locales), los a formato unix epoch, filtra IPs propias (publica y locales), los añade a session
añade a session para tabla 'Visita'. para tabla 'Visita'.
Finalmente realiza la transaccion utilizando clase 'Progress' del modulo Finalmente realiza la transaccion utilizando clase 'Progress' del modulo rich.
rich. Borra el log procesado.""" Y borra el log procesado.
"""
if os.path.exists(log): if os.path.exists(log):
nombre_log = log.split('/')[-1] nombre_log = log.split('/')[-1]
console.print( console.print(f'[yellow]Procesando [[/yellow]{nombre_log}[yellow]][/yellow]')
f'[yellow]Procesando [[/yellow]{nombre_log}[yellow]][/yellow]'
)
try: try:
with open(log, 'r') as lista: with open(log, 'r') as lista:
ip, fecha, url, metodo = None, None, None, None ip, fecha, url, metodo = None, None, None, None
try: try:
largo = subprocess.run( largo = subprocess.run(['wc', '-l', log], capture_output=True, text=True)
['wc', '-l', log],
capture_output=True,
text=True
)
largo = int(largo.stdout.split(' ')[0]) largo = int(largo.stdout.split(' ')[0])
for linea in track( for linea in track(lista, total=largo, description='[blue bold]Cargando [/blue bold]'):
lista,
total=largo,
description='[blue bold]Cargando [/blue bold]'
):
linea = linea.split('\n')[0] linea = linea.split('\n')[0]
if (linea.rfind('[notice]') > 0 or linea.rfind('[crit]') > 0): if (linea.rfind('[notice]') > 0 or linea.rfind('[crit]') > 0):
if linea.find('[crit]') > 0: if linea.find('[crit]') > 0:
try: try:
ip = linea.split('client: ')[1].split(',')[0] ip = linea.split('client: ')[1].split(',')[0]
except Exception as ex: except Exception as ex:
log_usage( log_usage('Exception Ip error_log {crit}', ex)
'Exception Ip error_log {crit}',
ex
)
ip = None ip = None
try: try:
fecha = ' '.join(linea.split(' ')[0:2]) fecha = ' '.join(linea.split(' ')[0:2])
@ -337,10 +277,7 @@ def carga_error_logs(log):
try: try:
ip = linea.split('client: ')[1].split(',')[0] ip = linea.split('client: ')[1].split(',')[0]
except Exception as ex: except Exception as ex:
log_usage( log_usage('Exception Ip error_log {notice}', ex)
'Exception Ip error_log {notice}',
ex
)
ip = None ip = None
try: try:
fecha = ' '.join(linea.split(' ')[0:2]) fecha = ' '.join(linea.split(' ')[0:2])
@ -361,65 +298,46 @@ def carga_error_logs(log):
fecha = int(fecha_error_to_epoch(fecha)) fecha = int(fecha_error_to_epoch(fecha))
codigo = 0 codigo = 0
if ip_registrada(ip): if ip_registrada(ip):
session.add( session.add(Visita(ip=ip,
Visita( cod_html=codigo,
ip=ip, fecha=fecha,
cod_html=codigo, consulta=url,
fecha=fecha, metodo=metodo,
consulta=url, registro=1))
metodo=metodo,
registro=1
)
)
else: else:
session.add( session.add(Visita(ip=ip,
Visita( cod_html=codigo,
ip=ip, fecha=fecha,
cod_html=codigo, consulta=url,
fecha=fecha, metodo=metodo))
consulta=url,
metodo=metodo
)
)
else: else:
log_usage('carga error.log', linea) log_usage('carga error.log', linea)
except Exception as ex: except Exception as ex:
print('[Procesando *Error.log] Exception: ', ex) print('[Procesando *Error.log] Exception: ', ex)
try: try:
info_error = f'IP:[{ip}] - FECHA:[{fecha}] - ' \ info_error = f'IP:[{ip}] - FECHA:[{fecha}] - METODO:[{metodo}] - URL:[{url}]'
f'METODO:[{metodo}] - URL:[{url}]'
log_usage('Exception error.log', info_error) log_usage('Exception error.log', info_error)
except Exception: except:
pass pass
try: try:
with Progress() as prog, session: with Progress() as prog, session:
task1 = prog.add_task( task1 = prog.add_task("[yellow bold]Guardando[/yellow bold]", total=len(session.new))
"[yellow bold]Guardando[/yellow bold]",
total=len(session.new)
)
session.commit() session.commit()
while not prog.finished: while not prog.finished:
prog.update(task1, advance=0.1) prog.update(task1, advance=0.1)
time.sleep(0.05) time.sleep(0.05)
except Exception as ex: except Exception as ex:
log_usage('Exception error.log - Progress session commit', ex) log_usage('Exception error.log - Progress session commit', ex)
console.print( console.print(f'[magenta] - Carga completa.. borrando log[/magenta]\n')
'[magenta] - Carga completa.. borrando log[/magenta]\n'
)
os.remove(log) os.remove(log)
return True return True
except Exception: except:
console.print( console.print(f'[red]Error al intentar abrir/cargar: [{log}[/red]]\n')
f'[red]Error al intentar abrir/cargar: [{log}[/red]]\n' log_usage(f'Error al abrir/cargar', log)
)
log_usage('Error al abrir/cargar', log)
return False return False
else: else:
console.print( console.print(f'[bold red]Log: [[/bold red]{log}[bold red]] inexistente.[/bold red]\n')
f'[bold red]Log: [[/bold red]{log}[bold red]]' log_usage(f'Log inexistente', log)
' inexistente.[/bold red]\n'
)
log_usage('Log inexistente', log)
return False return False
@ -457,30 +375,25 @@ def carga_registro_ip(ip_info):
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
try: try:
session.add( session.add(Registro(ip=info_dic['ip'],
Registro( hostname=info_dic['hostname'],
ip=info_dic['ip'], anycast=info_dic['anycast'],
hostname=info_dic['hostname'], cuidad=info_dic['ciudad'],
anycast=info_dic['anycast'], region=info_dic['region'],
cuidad=info_dic['ciudad'], pais=info_dic['pais'],
region=info_dic['region'], geoloc=info_dic['geoloc'],
pais=info_dic['pais'], organizacion=info_dic['organizacion'],
geoloc=info_dic['geoloc'], fecha_reg=int(time.mktime(time.localtime())),
organizacion=info_dic['organizacion'], tzone=info_dic['tzone'],
fecha_reg=int(time.mktime(time.localtime())), cod_post=info_dic['cod_post'],
tzone=info_dic['tzone'], ))
cod_post=info_dic['cod_post'],
)
)
session.commit() session.commit()
except Exception as ex: except Exception as ex:
print('[session.commit(ADD REGISTRO)] Exception: ', ex) print('[session.commit(ADD REGISTRO)] Exception: ', ex)
print('Datos-Dic: ', info_dic) print('Datos-Dic: ', info_dic)
stmt = update(Visita).where( stmt = update(Visita).where(Visita.ip == ip_info['ip']).values(registro=1).\
Visita.ip == ip_info['ip'] execution_options(synchronize_session="fetch")
).values( # result = session.execute(stmt)
registro=1
).execution_options(synchronize_session="fetch")
try: try:
session.execute(stmt) session.execute(stmt)
session.commit() session.commit()
@ -513,9 +426,7 @@ def consulta_db(ip):
y sus detalles. y sus detalles.
""" """
try: try:
statement = session.query( statement = session.query(Registro, Visita).join('visitas').filter_by(ip=ip)
Registro, Visita
).join('visitas').filter_by(ip=ip)
result = session.execute(statement).all() result = session.execute(statement).all()
return result return result
except Exception as ex: except Exception as ex:
@ -530,15 +441,13 @@ def registro_ips():
statement = select(Visita).filter_by(registro=0) statement = select(Visita).filter_by(registro=0)
with Progress() as progress: with Progress() as progress:
total = len(session.execute(statement).scalars().all()) total = len(session.execute(statement).scalars().all())
task1 = progress.add_task( task1 = progress.add_task("[bold blue]Cargando [/bold blue]", total=total)
"[bold blue]Cargando [/bold blue]",
total=total
)
total_ant = total total_ant = total
while not progress.finished: while not progress.finished:
res = session.execute(statement).scalars().first() res = session.execute(statement).scalars().first()
total_act = len(session.execute(statement).scalars().all()) total_act = len(session.execute(statement).scalars().all())
avance = total_ant - total_act avance = total_ant - total_act
# print('total update:',total,'total_act:', total_act,' Diferencia: ', avance )
total_ant = total_act total_ant = total_act
if res is None: if res is None:
progress.update(task1, advance=avance) progress.update(task1, advance=avance)
@ -547,16 +456,15 @@ def registro_ips():
ip_info = consulta_ip(ip_actual, True) ip_info = consulta_ip(ip_actual, True)
carga_registro_ip(ip_info) carga_registro_ip(ip_info)
progress.update(task1, advance=avance) progress.update(task1, advance=avance)
console.print( console.print('\n[bold yellow]Registro en base de datos finalizado.[/bold yellow]')
'\n[bold yellow]Registro en base de datos finalizado.[/bold yellow]'
)
def mapsgen(): def mapsgen():
"""Realiza 2 consultas de los datos de columna 'geoloc' de la tabla """Realiza 2 consultas de los datos de columna 'geoloc' de la tabla 'Registro',
'Registro' según valor de columna 'cod_html' de la tabla 'Visita', según valor de columna 'cod_html' de la tabla 'Visita', para valores 200 y para
para valores 200 y otros. Llama a función maps_gen con estas listas otros valores.
de valores como argumentos.""" Llama a función maps_gen con estas listas de valores como argumentos.
"""
try: try:
loc_200 = get_geoloc(200) loc_200 = get_geoloc(200)
loc_300 = get_geoloc(300) loc_300 = get_geoloc(300)