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/11/10 20:07] – [WINDOWS] huracan | scripts [2025/12/04 14:31] (Version actuelle) – [PYTHON] huracan | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| ====== SCRIPTS ====== | ====== SCRIPTS ====== | ||
| + | |||
| + | |||
| + | |||
| Ligne 8: | Ligne 11: | ||
| ---- | ---- | ||
| + | |||
| + | |||
| + | ===== PYTHON ===== | ||
| + | |||
| + | |||
| + | Script pour commandes multithread sur plusieurs switchs | ||
| + | |||
| + | # | ||
| + | from concurrent.futures import ThreadPoolExecutor, | ||
| + | from datetime import datetime | ||
| + | from getpass import getpass | ||
| + | import threading | ||
| + | from pathlib import Path | ||
| + | import os | ||
| + | import socket | ||
| + | from netmiko import ConnectHandler | ||
| + | | ||
| + | SWITCH_FILE = " | ||
| + | MAX_WORKERS = 20 | ||
| + | | ||
| + | print_lock = threading.Lock() | ||
| + | | ||
| + | | ||
| + | def safe_print(*a, | ||
| + | with print_lock: | ||
| + | print(*a, | ||
| + | | ||
| + | | ||
| + | def load_hosts(path): | ||
| + | p = Path(path) | ||
| + | if not p.exists(): | ||
| + | return [] | ||
| + | return [x.strip() for x in p.read_text().splitlines() if x.strip()] | ||
| + | | ||
| + | | ||
| + | # --------- AJOUT : TEST SSH AVANT CONNEXION ----------- | ||
| + | def test_ssh_port(host, | ||
| + | try: | ||
| + | with socket.create_connection((host, | ||
| + | return True | ||
| + | except: | ||
| + | return False | ||
| + | # ------------------------------------------------------- | ||
| + | | ||
| + | | ||
| + | def run_on_switch(host, | ||
| + | result = { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | | ||
| + | # --- Test SSH avant toute connexion --- | ||
| + | if not test_ssh_port(host): | ||
| + | result[" | ||
| + | result[" | ||
| + | return result | ||
| + | | ||
| + | try: | ||
| + | device = { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | | ||
| + | conn = ConnectHandler(**device) | ||
| + | | ||
| + | except Exception as e: | ||
| + | result[" | ||
| + | result[" | ||
| + | return result | ||
| + | | ||
| + | try: | ||
| + | conn.send_command(" | ||
| + | | ||
| + | for cmd in commands: | ||
| + | out = conn.send_command(cmd, | ||
| + | for line in out.splitlines(): | ||
| + | safe_print(f" | ||
| + | result[" | ||
| + | | ||
| + | result[" | ||
| + | | ||
| + | except Exception as e: | ||
| + | result[" | ||
| + | | ||
| + | finally: | ||
| + | conn.disconnect() | ||
| + | result[" | ||
| + | | ||
| + | return result | ||
| + | | ||
| + | | ||
| + | def choose_switches(hosts): | ||
| + | while True: | ||
| + | safe_print(" | ||
| + | for i, h in enumerate(hosts, | ||
| + | safe_print(f" | ||
| + | | ||
| + | safe_print(" | ||
| + | safe_print(" | ||
| + | safe_print(" | ||
| + | safe_print(" | ||
| + | safe_print(" | ||
| + | safe_print(" | ||
| + | | ||
| + | choice = input(" | ||
| + | | ||
| + | if choice == " | ||
| + | return None | ||
| + | | ||
| + | if choice == " | ||
| + | return hosts | ||
| + | | ||
| + | try: | ||
| + | indices = [int(x.strip()) for x in choice.split("," | ||
| + | selected = [hosts[i - 1] for i in indices if 1 <= i <= len(hosts)] | ||
| + | if selected: | ||
| + | return selected | ||
| + | except: | ||
| + | pass | ||
| + | | ||
| + | safe_print(" | ||
| + | | ||
| + | | ||
| + | def main(): | ||
| + | hosts = load_hosts(SWITCH_FILE) | ||
| + | if not hosts: | ||
| + | safe_print(f" | ||
| + | return | ||
| + | | ||
| + | safe_print(f" | ||
| + | | ||
| + | username = input(" | ||
| + | password = getpass(" | ||
| + | | ||
| + | current_selection = hosts # par défaut : tous | ||
| + | | ||
| + | while True: | ||
| + | safe_print(" | ||
| + | safe_print(" | ||
| + | for h in current_selection: | ||
| + | safe_print(f" | ||
| + | | ||
| + | safe_print(" | ||
| + | safe_print(" | ||
| + | safe_print(" | ||
| + | safe_print(" | ||
| + | safe_print(" | ||
| + | safe_print(" | ||
| + | | ||
| + | choice = input("> | ||
| + | | ||
| + | if choice == " | ||
| + | return | ||
| + | | ||
| + | if choice == " | ||
| + | os.system(" | ||
| + | continue | ||
| + | | ||
| + | if choice == " | ||
| + | new_sel = choose_switches(hosts) | ||
| + | if new_sel: | ||
| + | current_selection = new_sel | ||
| + | continue | ||
| + | | ||
| + | if choice == " | ||
| + | safe_print(" | ||
| + | commands = [] | ||
| + | | ||
| + | while True: | ||
| + | cmd = input("> | ||
| + | if cmd == "": | ||
| + | if commands: | ||
| + | break | ||
| + | else: | ||
| + | continue | ||
| + | commands.append(cmd) | ||
| + | | ||
| + | safe_print(" | ||
| + | | ||
| + | start_all = datetime.now() | ||
| + | | ||
| + | results = [] | ||
| + | with ThreadPoolExecutor(max_workers=min(MAX_WORKERS, | ||
| + | future_map = { | ||
| + | pool.submit(run_on_switch, | ||
| + | for h in current_selection | ||
| + | } | ||
| + | | ||
| + | for f in as_completed(future_map): | ||
| + | results.append(f.result()) | ||
| + | | ||
| + | # --- Résumé synthétique --- | ||
| + | safe_print(" | ||
| + | for r in results: | ||
| + | host = r[" | ||
| + | status = " | ||
| + | lines = len(r[" | ||
| + | dur = (r[" | ||
| + | safe_print(f" | ||
| + | if r[" | ||
| + | safe_print(f" | ||
| + | | ||
| + | total = (datetime.now() - start_all).total_seconds() | ||
| + | safe_print(f" | ||
| + | safe_print(" | ||
| + | | ||
| + | | ||
| + | if __name__ == " | ||
| + | main() | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ---- | ||
| + | |||
| + | |||
| ===== WINDOWS ===== | ===== WINDOWS ===== | ||
| Ligne 1123: | Ligne 1348: | ||
| #echo `test $machin = ' | #echo `test $machin = ' | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ==== CONVERSION M4A EN FLAC AVEC FFMPEG ==== | ||
| + | |||
| + | Dans le dossier contenant les .m4a, exécuter : | ||
| + | |||
| + | 🐧 Sur Linux (terminal bash) : | ||
| + | |||
| + | #for f in *.m4a; do ffmpeg -i " | ||
| ---- | ---- | ||