Outils pour utilisateurs

Outils du site


scripts

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
scripts [2025/12/04 14:28] – [PYTHON] huracanscripts [2025/12/04 14:31] (Version actuelle) – [PYTHON] huracan
Ligne 27: Ligne 27:
  import socket  import socket
  from netmiko import ConnectHandler  from netmiko import ConnectHandler
 +  
  SWITCH_FILE = "switches.txt"  SWITCH_FILE = "switches.txt"
  MAX_WORKERS = 20  MAX_WORKERS = 20
 +  
  print_lock = threading.Lock()  print_lock = threading.Lock()
- +   
 +  
  def safe_print(*a, **kw):  def safe_print(*a, **kw):
  with print_lock:  with print_lock:
  print(*a, **kw, flush=True)  print(*a, **kw, flush=True)
- +   
 +  
  def load_hosts(path):  def load_hosts(path):
  p = Path(path)  p = Path(path)
Ligne 44: Ligne 44:
  return []  return []
  return [x.strip() for x in p.read_text().splitlines() if x.strip()]  return [x.strip() for x in p.read_text().splitlines() if x.strip()]
- +   
 +  
  # --------- AJOUT : TEST SSH AVANT CONNEXION -----------  # --------- AJOUT : TEST SSH AVANT CONNEXION -----------
  def test_ssh_port(host, port=22, timeout=2):  def test_ssh_port(host, port=22, timeout=2):
Ligne 54: Ligne 54:
  return False  return False
  # -------------------------------------------------------  # -------------------------------------------------------
- +   
 +  
  def run_on_switch(host, username, password, commands):  def run_on_switch(host, username, password, commands):
  result = {  result = {
Ligne 65: Ligne 65:
  "end": None,  "end": None,
  }  }
 +  
  # --- Test SSH avant toute connexion ---  # --- Test SSH avant toute connexion ---
  if not test_ssh_port(host):  if not test_ssh_port(host):
Ligne 71: Ligne 71:
  result["end"] = datetime.now()  result["end"] = datetime.now()
  return result  return result
 +  
  try:  try:
  device = {  device = {
Ligne 79: Ligne 79:
  "password": password,  "password": password,
  }  }
 +  
  conn = ConnectHandler(**device)  conn = ConnectHandler(**device)
 +  
  except Exception as e:  except Exception as e:
  result["error"] = f"SSH ERROR : {e}"  result["error"] = f"SSH ERROR : {e}"
  result["end"] = datetime.now()  result["end"] = datetime.now()
  return result  return result
 +  
  try:  try:
  conn.send_command("terminal length 0")  conn.send_command("terminal length 0")
 +  
  for cmd in commands:  for cmd in commands:
  out = conn.send_command(cmd, read_timeout=20)  out = conn.send_command(cmd, read_timeout=20)
Ligne 95: Ligne 95:
  safe_print(f"[{host}] {line}")  safe_print(f"[{host}] {line}")
  result["lines"].append(line)  result["lines"].append(line)
 +  
  result["success"] = True  result["success"] = True
 +  
  except Exception as e:  except Exception as e:
  result["error"] = f"COMMAND ERROR : {e}"  result["error"] = f"COMMAND ERROR : {e}"
 +  
  finally:  finally:
  conn.disconnect()  conn.disconnect()
  result["end"] = datetime.now()  result["end"] = datetime.now()
 +  
  return result  return result
- +   
 +  
  def choose_switches(hosts):  def choose_switches(hosts):
  while True:  while True:
Ligne 113: Ligne 113:
  for i, h in enumerate(hosts, 1):  for i, h in enumerate(hosts, 1):
  safe_print(f"{i}) {h}")  safe_print(f"{i}) {h}")
 +  
  safe_print("\nOptions :")  safe_print("\nOptions :")
  safe_print("  X    -> numéro d’un switch")  safe_print("  X    -> numéro d’un switch")
Ligne 120: Ligne 120:
  safe_print("  back -> revenir")  safe_print("  back -> revenir")
  safe_print("====================================")  safe_print("====================================")
 +  
  choice = input("Votre sélection : ").strip().lower()  choice = input("Votre sélection : ").strip().lower()
 +  
  if choice == "back":  if choice == "back":
  return None  return None
 +  
  if choice == "all":  if choice == "all":
  return hosts  return hosts
 +  
  try:  try:
  indices = [int(x.strip()) for x in choice.split(",")]  indices = [int(x.strip()) for x in choice.split(",")]
Ligne 136: Ligne 136:
  except:  except:
  pass  pass
 +  
  safe_print("Sélection invalide.")  safe_print("Sélection invalide.")
- +   
 +  
  def main():  def main():
  hosts = load_hosts(SWITCH_FILE)  hosts = load_hosts(SWITCH_FILE)
Ligne 145: Ligne 145:
  safe_print(f"Erreur : fichier {SWITCH_FILE} introuvable ou vide.")  safe_print(f"Erreur : fichier {SWITCH_FILE} introuvable ou vide.")
  return  return
 +  
  safe_print(f"{len(hosts)} switches chargés.")  safe_print(f"{len(hosts)} switches chargés.")
 +  
  username = input("Identifiant SSH : ").strip()  username = input("Identifiant SSH : ").strip()
  password = getpass("Mot de passe SSH : ")  password = getpass("Mot de passe SSH : ")
 +  
  current_selection = hosts  # par défaut : tous  current_selection = hosts  # par défaut : tous
 +  
  while True:  while True:
  safe_print("\n====== MENU PRINCIPAL ======")  safe_print("\n====== MENU PRINCIPAL ======")
Ligne 158: Ligne 158:
  for h in current_selection:  for h in current_selection:
  safe_print(f"  - {h}")  safe_print(f"  - {h}")
 +  
  safe_print("\nOptions :")  safe_print("\nOptions :")
  safe_print("  cmd   -> taper des commandes")  safe_print("  cmd   -> taper des commandes")
Ligne 165: Ligne 165:
  safe_print("  exit  -> quitter")  safe_print("  exit  -> quitter")
  safe_print("============================")  safe_print("============================")
 +  
  choice = input("> ").strip().lower()  choice = input("> ").strip().lower()
 +  
  if choice == "exit":  if choice == "exit":
  return  return
 +  
  if choice == "clear":  if choice == "clear":
  os.system("cls" if os.name == "nt" else "clear")  os.system("cls" if os.name == "nt" else "clear")
  continue  continue
 +  
  if choice == "sel":  if choice == "sel":
  new_sel = choose_switches(hosts)  new_sel = choose_switches(hosts)
Ligne 180: Ligne 180:
  current_selection = new_sel  current_selection = new_sel
  continue  continue
 +  
  if choice == "cmd":  if choice == "cmd":
  safe_print("Entrez vos commandes (ligne vide pour lancer l'exécution).")  safe_print("Entrez vos commandes (ligne vide pour lancer l'exécution).")
  commands = []  commands = []
 +  
  while True:  while True:
  cmd = input("> ").strip()  cmd = input("> ").strip()
Ligne 193: Ligne 193:
  continue  continue
  commands.append(cmd)  commands.append(cmd)
 +  
  safe_print("\n====== EXÉCUTION ======\n")  safe_print("\n====== EXÉCUTION ======\n")
 +  
  start_all = datetime.now()  start_all = datetime.now()
 +  
  results = []  results = []
  with ThreadPoolExecutor(max_workers=min(MAX_WORKERS, len(current_selection))) as pool:  with ThreadPoolExecutor(max_workers=min(MAX_WORKERS, len(current_selection))) as pool:
Ligne 204: Ligne 204:
  for h in current_selection  for h in current_selection
  }  }
 +  
  for f in as_completed(future_map):  for f in as_completed(future_map):
  results.append(f.result())  results.append(f.result())
 +  
  # --- Résumé synthétique ---  # --- Résumé synthétique ---
  safe_print("\n======= RÉSUMÉ =======")  safe_print("\n======= RÉSUMÉ =======")
Ligne 218: Ligne 218:
  if r["error"]:  if r["error"]:
  safe_print(f"    -> {r['error']}")  safe_print(f"    -> {r['error']}")
 +  
  total = (datetime.now() - start_all).total_seconds()  total = (datetime.now() - start_all).total_seconds()
  safe_print(f"Durée totale : {total:.1f}s")  safe_print(f"Durée totale : {total:.1f}s")
scripts.1764854883.txt.gz · Dernière modification : 2025/12/04 14:28 de huracan

DokuWiki Appliance - Powered by TurnKey Linux