Agregado de ping y del campo de mascara

This commit is contained in:
Miguel 2025-04-03 10:50:59 +02:00
parent 4ee8015953
commit 60f083413a
5 changed files with 749 additions and 355 deletions

View File

@ -1,7 +1,6 @@
import sys
import subprocess
import ctypes
import time
import logging
import os
from datetime import datetime
@ -47,6 +46,9 @@ def run_command(logger, cmd: str) -> bool:
if result.stderr:
logger.error(f"Command error: {result.stderr}")
if result.returncode != 0:
logger.error(f"Command failed with return code: {result.returncode}")
return result.returncode == 0
except Exception as e:
@ -68,25 +70,38 @@ def main():
if len(sys.argv) < 3:
logger.error("Insufficient arguments")
logger.info("Usage: ip_changer_admin.py <interface> <ip|dhcp>")
logger.info("Usage: ip_changer_admin.py <interface> <ip|dhcp|command>")
logger.info("Example for static IP: ip_changer_admin.py Ethernet 192.168.1.100")
logger.info("Example for DHCP: ip_changer_admin.py Ethernet dhcp")
logger.info("Example for command: ip_changer_admin.py Ethernet \"netsh interface ip set address...\"")
return 1
interface = sys.argv[1]
ip_mode = sys.argv[2]
param = sys.argv[2]
logger.info(f"Processing request for interface: {interface}")
logger.info(f"IP mode: {ip_mode}")
logger.info(f"Parameter: {param}")
if ip_mode.lower() == "dhcp":
# Check if the second parameter is a full command (starts with netsh)
if param.lower().startswith('netsh'):
cmd = param
elif param.lower() == "dhcp":
cmd = f'netsh interface ip set address "{interface}" dhcp'
else:
# Asumimos que es una IP estática
ip = ip_mode
gateway = '.'.join(ip.split('.')[:3] + ['1'])
cmd = f'netsh interface ip set address "{interface}" static {ip} 255.255.255.0 {gateway}'
# Assume it's an IP address (for backward compatibility)
ip = param
# If more parameters are provided, use them for subnet mask
if len(sys.argv) > 3:
subnet_mask = sys.argv[3]
else:
subnet_mask = "255.255.255.0"
# Extract first three octets for gateway
gateway = '.'.join(ip.split('.')[:3] + ['1'])
cmd = f'netsh interface ip set address "{interface}" static {ip} {subnet_mask} {gateway}'
logger.info(f"Command to execute: {cmd}")
success = run_command(logger, cmd)
if success:

View File

@ -1 +1 @@
{"last_interface": "Ethernet", "last_ip_prefix": "10.1.33"}
{"last_interface": "Ethernet", "last_ip_prefix": "10.1.22", "previous_config": {"name": "Ethernet", "ip_address": "10.1.22.249", "subnet_mask": "255.240.0.0", "gateway": "10.1.22.1", "dhcp_enabled": false}}

View File

@ -1,192 +0,0 @@
import ctypes
import subprocess
import sys
import re
import os
import json
import time
from win10toast import ToastNotifier
# Definir una constante para la ruta del directorio
DIR = "D:\\Proyectos\\Scripts\\IPChanger"
IP_HISTORY_FILE = os.path.join(DIR, "ip_history.json")
def is_admin():
"""Verifica si el script se está ejecutando con privilegios de administrador."""
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
def run_as_admin(argv=None, debug=False):
"""Ejecuta el script como administrador."""
shell32 = ctypes.windll.shell32
if argv is None and shell32.IsUserAnAdmin():
# Ya estamos ejecutando como administrador, no es necesario hacer nada
return True
if argv is None:
argv = sys.argv
if hasattr(sys, "_MEIPASS"):
# Soporte para PyInstaller
arguments = map(str, argv[1:])
else:
arguments = map(str, argv)
argument_line = " ".join(arguments)
executable = str(sys.executable)
if debug:
print(f"Command line: {executable} {argument_line}")
ret = shell32.ShellExecuteW(None, "runas", executable, argument_line, None, 1)
if int(ret) <= 32:
return False
return None
def set_static_ip(ip_address, gateway):
"""Establece una dirección IP estática para el adaptador Ethernet."""
try:
subprocess.run(
f'netsh interface ip set address "Ethernet" static {ip_address} 255.255.255.0 {gateway}',
shell=True,
)
return f"Dirección IP establecida en {ip_address}"
except Exception as e:
return f"Error al establecer la dirección IP: {e}"
def set_dhcp():
"""Configura el adaptador Ethernet para obtener la dirección IP automáticamente a través de DHCP."""
try:
subprocess.run('netsh interface ip set address "Ethernet" dhcp', shell=True)
return "Adaptador Ethernet configurado para DHCP"
except Exception as e:
return f"Error al configurar DHCP: {e}"
def save_current_ip():
"""Guarda la dirección IP actual del adaptador Ethernet en un archivo."""
try:
ip_config_output = subprocess.check_output("ipconfig", shell=True).decode(
"cp850"
)
current_ip = re.search(
"Adaptador de Ethernet Ethernet:[\s\S]*?Dirección IPv4. . . . . . . . . . . . . . : (\d+\.\d+\.\d+\.\d+)",
ip_config_output,
)
if current_ip:
update_ip_history(current_ip.group(1))
return f"Dirección IP actual guardada: {current_ip.group(1)}"
else:
return "No se encontró la dirección IP actual."
except Exception as e:
return f"Error al guardar la dirección IP actual: {e}"
def update_ip_history(current_ip):
"""Actualiza el historial de las últimas 10 IPs usadas, excluyendo 'auto'."""
if current_ip.lower() == "auto":
return
if os.path.exists(IP_HISTORY_FILE):
with open(IP_HISTORY_FILE, "r") as file:
ip_history = json.load(file)
else:
ip_history = []
ip_history.insert(0, current_ip)
ip_history = ip_history[:10]
with open("ip_history.json", "w") as file:
json.dump(ip_history, file)
def restore_last_ip():
"""Restaura la última dirección IP guardada para el adaptador Ethernet."""
if os.path.exists(IP_HISTORY_FILE):
with open(IP_HISTORY_FILE, "r") as file:
ip_history = json.load(file)
if ip_history:
last_ip = ip_history[0] # Obtener la última IP del historial
gateway = last_ip.rsplit(".", 1)[0] + ".1"
return set_static_ip(last_ip, gateway)
else:
return "No hay direcciones IP guardadas en el historial."
else:
return "No se encontró el archivo de historial de IPs."
def get_input_parameter():
"""Solicita al usuario un parámetro por línea de comandos."""
return input(
"Ingrese la dirección IP, 'auto' para DHCP, o 'last' para la última IP: "
)
def display_ip_history(ip_history):
"""Muestra el historial de las últimas 10 IPs y permite al usuario seleccionar una."""
if ip_history:
for i, ip in enumerate(ip_history):
print(f"{i}: {ip}")
choice = input(
"Seleccione una IP del historial (0-9), o presione Enter para continuar: "
)
if choice.isdigit() and 0 <= int(choice) < len(ip_history):
return ip_history[int(choice)]
return None
def main():
if not is_admin():
# Si no se está ejecutando como administrador, solicitar elevación
result = run_as_admin()
if result is True:
print("Ejecutando como administrador.")
elif result is False:
print("No se pudo obtener privilegios de administrador.")
return
else:
# El script se reinició con privilegios de administrador
return
if os.path.exists(IP_HISTORY_FILE):
with open(IP_HISTORY_FILE, "r") as file:
ip_history = json.load(file)
argument = sys.argv[1] if len(sys.argv) > 1 else None
if not argument:
chosen_ip = display_ip_history()
if chosen_ip:
argument = chosen_ip
else:
argument = get_input_parameter()
# Guardar la dirección IP actual solo si no es 'auto'
if argument.lower() != "auto":
message = save_current_ip()
if argument == "auto":
message = set_dhcp()
elif argument == "last":
message = restore_last_ip()
else:
ip_parts = argument.split(".")
if len(ip_parts) == 3:
argument += ".249"
gateway = ".".join(ip_parts[:3]) + ".1"
message = set_static_ip(argument, gateway)
update_ip_history(argument) # Actualizar el historial solo con IPs estáticas
# Aquí asumimos que 'message' contiene el mensaje que quieres mostrar
try:
toaster = ToastNotifier()
toaster.show_toast("Cambio de IP", message, duration=10)
except Exception as e:
print(
f"Se produjo un error al mostrar la notificación, pero la operación se completó con éxito: {e}"
)
if __name__ == "__main__":
main()

File diff suppressed because it is too large Load Diff

1
ping_targets.json Normal file
View File

@ -0,0 +1 @@
{"10.1.22": "10.1.20.11"}