#!/usr/bin/env python import os import sys import subprocess import requests import re import configparser as cfg from os.path import isfile from json import loads from colorama import Fore, Back, Style import sql_alch selfpath = os.path.abspath(os.path.dirname(__file__)) ownip = requests.get('https://ifconfig.me/').text parser = cfg.ConfigParser() 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 co_Blu = Fore.BLUE+Style.NORMAL co_BluD = Fore.BLUE+Style.DIM co_BluB = Fore.BLUE+Style.BRIGHT co_Red = Fore.RED+Style.NORMAL co_RedD = Fore.RED+Style.DIM co_RedB = Fore.RED+Style.BRIGHT co_Grn = Fore.GREEN+Style.NORMAL co_GrnD = Fore.GREEN+Style.DIM co_GrnB = Fore.GREEN+Style.BRIGHT co_Yel = Fore.YELLOW+Style.NORMAL co_YelD = Fore.YELLOW+Style.DIM co_YelB = Fore.YELLOW+Style.BRIGHT co_BluLWh = Fore.BLUE+Back.LIGHTWHITE_EX+Style.NORMAL co_BluLWhB = Fore.BLUE+Back.LIGHTWHITE_EX+Style.BRIGHT co_GrnMgnB = Fore.GREEN+Back.MAGENTA+Style.BRIGHT co_RedBluD = Fore.RED+Back.BLUE+Style.DIM co_LRedBleD = Fore.LIGHTRED_EX+Back.BLUE+Style.DIM co_BlkMgnB = Fore.BLACK+Back.MAGENTA+Style.BRIGHT co_BlkMgn = Fore.BLACK+Back.MAGENTA+Style.NORMAL co_LGrLBlk = Fore.LIGHTGREEN_EX+Back.LIGHTBLACK_EX co_RdYl = Fore.RED+Back.YELLOW+Style.NORMAL co_RdYlB = Fore.RED+Back.YELLOW+Style.BRIGHT co_BlkLBlkD = Fore.BLACK+Back.LIGHTBLACK_EX+Style.DIM co_BluLBlkD = Fore.BLUE+Back.LIGHTBLACK_EX+Style.DIM co_cuBlu = '\33[38;5;122m' # IP validate https://stackoverflow.com/questions/319279/how-to-validate-ip-address-in-python ip_regx = "^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$" def filtro_ip_propia(ip): return True if ip != ownip else False 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: 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) 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_BluD} _____________________________' 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} Fecha Visita {co_rst}' f'{co_Blu}|{co_YelB}Codigo html{co_Blu}|' f'{co_YelB} Metodo {co_rst}' f'{co_Blu}|{co_YelB} Request {co_rst}') print(f'{co_Blu}|------------------------|--' f'---------|----------|-------------{co_rst}') else: # aqui modificar para representar las nuevas columnas de tabla visita codig = str(val).split(',')[2].split('=')[1].center(11) fecha = str(val).split(',')[3].split('=')[1].ljust(24) metodo = (str(val).split(',')[4].split('=')[1]) metodo = '---'.center(10) if metodo == 'None' else metodo.center(10) request = str(val).split(',')[5].split('=')[1] request = request[:86]+'...' if len(request) > 90 else request request = '---' if request == 'None' else request #if len(request) > 90: # request = request[:86]+'...' print(f'{co_Blu}|{co_Yel}{fecha}{co_rst}' f'{co_Blu}|{co_GrnB}{codig}' f'{co_Blu}|{co_Grn}{metodo}{co_rst}' f'{co_Blu}|{co_Grn}{request}{co_rst}') else: for ind, val in enumerate(tupla): if ind > 0: # aqui modificar para representar las nuevas columnas de tabla visita codig = str(val).split(',')[2].split('=')[1].center(11) fecha = str(val).split(',')[3].split('=')[1].ljust(24) metodo = (str(val).split(',')[4].split('=')[1]) metodo = '---'.center(10) if metodo == 'None' else metodo.center(10) request = str(val).split(',')[5].split('=')[1] request = request[:86]+'...' if len(request) > 90 else request request = '---' if request == 'None' else request print(f'{co_Blu}|{co_Yel}{fecha}{co_rst}' f'{co_Blu}|{co_GrnB}{codig}' f'{co_Blu}|{co_Grn}{metodo}{co_rst}' f'{co_Blu}|{co_Grn}{request}{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}') 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) def main(): 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}Consulta base de datos:{co_rst}') ip = sys.argv[2] print_ipinfo(ip, None) case '-D': 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() 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(): ayuda = f""" {co_BluB}ipLocate{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_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} {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_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} """ print(ayuda) if __name__ == "__main__": main()