Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| scripts [2025/12/04 14:25] – [PYTHON] huracan | scripts [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 = " | SWITCH_FILE = " | ||
| MAX_WORKERS = 20 | MAX_WORKERS = 20 | ||
| + | | ||
| print_lock = threading.Lock() | print_lock = threading.Lock() | ||
| - | + | | |
| + | |||
| def safe_print(*a, | def safe_print(*a, | ||
| with print_lock: | with print_lock: | ||
| print(*a, | print(*a, | ||
| - | + | | |
| + | |||
| 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, | def test_ssh_port(host, | ||
| Ligne 54: | Ligne 54: | ||
| return False | return False | ||
| # ------------------------------------------------------- | # ------------------------------------------------------- | ||
| - | + | | |
| + | |||
| def run_on_switch(host, | def run_on_switch(host, | ||
| result = { | result = { | ||
| Ligne 65: | Ligne 65: | ||
| " | " | ||
| } | } | ||
| + | | ||
| # --- 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[" | result[" | ||
| return result | return result | ||
| + | | ||
| try: | try: | ||
| device = { | device = { | ||
| Ligne 79: | Ligne 79: | ||
| " | " | ||
| } | } | ||
| + | | ||
| conn = ConnectHandler(**device) | conn = ConnectHandler(**device) | ||
| + | | ||
| except Exception as e: | except Exception as e: | ||
| result[" | result[" | ||
| result[" | result[" | ||
| return result | return result | ||
| + | | ||
| try: | try: | ||
| conn.send_command(" | conn.send_command(" | ||
| + | | ||
| for cmd in commands: | for cmd in commands: | ||
| out = conn.send_command(cmd, | out = conn.send_command(cmd, | ||
| Ligne 95: | Ligne 95: | ||
| safe_print(f" | safe_print(f" | ||
| result[" | result[" | ||
| + | | ||
| result[" | result[" | ||
| + | | ||
| except Exception as e: | except Exception as e: | ||
| result[" | result[" | ||
| + | | ||
| finally: | finally: | ||
| conn.disconnect() | conn.disconnect() | ||
| result[" | result[" | ||
| + | | ||
| 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, | for i, h in enumerate(hosts, | ||
| safe_print(f" | safe_print(f" | ||
| + | | ||
| safe_print(" | safe_print(" | ||
| safe_print(" | safe_print(" | ||
| Ligne 120: | Ligne 120: | ||
| safe_print(" | safe_print(" | ||
| safe_print(" | safe_print(" | ||
| + | | ||
| choice = input(" | choice = input(" | ||
| + | | ||
| if choice == " | if choice == " | ||
| return None | return None | ||
| + | | ||
| if choice == " | if choice == " | ||
| 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(" | safe_print(" | ||
| - | + | | |
| + | |||
| def main(): | def main(): | ||
| hosts = load_hosts(SWITCH_FILE) | hosts = load_hosts(SWITCH_FILE) | ||
| Ligne 145: | Ligne 145: | ||
| safe_print(f" | safe_print(f" | ||
| return | return | ||
| + | | ||
| safe_print(f" | safe_print(f" | ||
| + | | ||
| username = input(" | username = input(" | ||
| password = getpass(" | password = getpass(" | ||
| + | | ||
| current_selection = hosts # par défaut : tous | current_selection = hosts # par défaut : tous | ||
| + | | ||
| while True: | while True: | ||
| safe_print(" | safe_print(" | ||
| Ligne 158: | Ligne 158: | ||
| for h in current_selection: | for h in current_selection: | ||
| safe_print(f" | safe_print(f" | ||
| + | | ||
| safe_print(" | safe_print(" | ||
| safe_print(" | safe_print(" | ||
| Ligne 165: | Ligne 165: | ||
| safe_print(" | safe_print(" | ||
| safe_print(" | safe_print(" | ||
| + | | ||
| choice = input("> | choice = input("> | ||
| + | | ||
| if choice == " | if choice == " | ||
| return | return | ||
| + | | ||
| if choice == " | if choice == " | ||
| os.system(" | os.system(" | ||
| continue | continue | ||
| + | | ||
| if choice == " | if choice == " | ||
| 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 == " | if choice == " | ||
| safe_print(" | safe_print(" | ||
| commands = [] | commands = [] | ||
| + | | ||
| while True: | while True: | ||
| cmd = input("> | cmd = input("> | ||
| Ligne 193: | Ligne 193: | ||
| continue | continue | ||
| commands.append(cmd) | commands.append(cmd) | ||
| + | | ||
| safe_print(" | safe_print(" | ||
| + | | ||
| start_all = datetime.now() | start_all = datetime.now() | ||
| + | | ||
| results = [] | results = [] | ||
| with ThreadPoolExecutor(max_workers=min(MAX_WORKERS, | with ThreadPoolExecutor(max_workers=min(MAX_WORKERS, | ||
| 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(" | safe_print(" | ||
| Ligne 218: | Ligne 218: | ||
| if r[" | if r[" | ||
| safe_print(f" | safe_print(f" | ||
| + | | ||
| total = (datetime.now() - start_all).total_seconds() | total = (datetime.now() - start_all).total_seconds() | ||
| safe_print(f" | safe_print(f" | ||
| safe_print(" | safe_print(" | ||
| - | + | | |
| + | |||
| if __name__ == " | if __name__ == " | ||
| main() | main() | ||
| + | |||