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/05/28 13:57] – [SCRIPTS IPSET] 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 14: | Ligne 239: | ||
| ---- | ---- | ||
| + | ==== CONVERSION M4A EN FLAC AVEC FFMPEG ==== | ||
| + | |||
| + | 🪟 Sur Windows (PowerShell ou CMD) : | ||
| + | |||
| + | Dans le dossier contenant les .m4a exécuter : | ||
| + | |||
| + | #for %a in (*.m4a) do ffmpeg -i " | ||
| + | |||
| + | |||
| + | ---- | ||
| Ligne 1113: | 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 " | ||
| ---- | ---- | ||
| Ligne 1279: | Ligne 1524: | ||
| ==== MYSQL DATABASE BACKUP ==== | ==== MYSQL DATABASE BACKUP ==== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | |||
| + | === Step 1: Creating MySQL Backup Script === | ||
| + | |||
| + | First, let’s create a simple Bash script that will handle the backup process. | ||
| + | |||
| + | nano backup_mysql.sh | ||
| + | |||
| + | Copy and paste the following script into the backup_mysql.sh file: | ||
| + | |||
| + | #!/bin/bash | ||
| + | | ||
| + | # MySQL Credentials | ||
| + | MYSQL_USER=" | ||
| + | MYSQL_PASS=" | ||
| + | MYSQL_HOST=" | ||
| + | | ||
| + | # Backup Directory (ensure this directory exists) | ||
| + | BACKUP_DIR="/ | ||
| + | | ||
| + | # Email settings | ||
| + | EMAIL_TO=" | ||
| + | EMAIL_SUBJECT=" | ||
| + | EMAIL_BODY="" | ||
| + | | ||
| + | # Get current date to append to backup filename | ||
| + | DATE=$(date +" | ||
| + | | ||
| + | # Databases to back up (list the names of the databases you want to back up) | ||
| + | DATABASES=(" | ||
| + | | ||
| + | # Loop through each database and back it up | ||
| + | for DB in " | ||
| + | BACKUP_FILE=" | ||
| + | | ||
| + | echo " | ||
| + | | ||
| + | # Perform the backup using mysqldump | ||
| + | mysqldump -u $MYSQL_USER -p$MYSQL_PASS -h $MYSQL_HOST $DB > $BACKUP_FILE | ||
| + | | ||
| + | # Check if the backup was successful | ||
| + | if [ $? -eq 0 ]; then | ||
| + | echo " | ||
| + | else | ||
| + | echo " | ||
| + | fi | ||
| + | done | ||
| + | | ||
| + | # Clean up backups older than 30 days (optional) | ||
| + | find $BACKUP_DIR -type f -name " | ||
| + | | ||
| + | # Send email alert | ||
| + | echo -e " | ||
| + | |||
| + | What Does This Script Do? | ||
| + | |||
| + | * MySQL Credentials: | ||
| + | * Backup Directory: This is where your backups will be stored. Make sure this directory exists on your system. | ||
| + | * Timestamped Backup: The script creates backups with a timestamp (e.g., 2025-04-28_12-30-00.sql) to avoid overwriting old backups. | ||
| + | * Databases to Back Up: In the DATABASES array, list the names of the databases you want to back up. You can add or remove databases as needed. | ||
| + | * Backup Command: The script uses mysqldump to create backups of your databases. | ||
| + | * Old Backup Cleanup: The script also deletes backups older than 30 days (you can adjust this time as needed). | ||
| + | * Email Alerts: After running the backup, the script sends an email with the results – whether each database backup succeeded or failed. | ||
| + | |||
| + | **//Sync Backup to Remote Server (Optional but Recommended)// | ||
| + | |||
| + | After your local backup is created, it’s a smart move to sync it to a remote server for extra safety, which ensures your backups survive even if your main server crashes. | ||
| + | |||
| + | Here’s the rsync command you can add to the end of your backup script: | ||
| + | |||
| + | # Sync backup to remote server (optional but recommended) | ||
| + | | ||
| + | SSH_KEY="/ | ||
| + | REMOTE_USER=" | ||
| + | REMOTE_HOST=" | ||
| + | REMOTE_DIR="/ | ||
| + | | ||
| + | rsync -avz \ | ||
| + | -e "ssh -i $SSH_KEY -o StrictHostKeyChecking=no" | ||
| + | --delete-after \ | ||
| + | " | ||
| + | " | ||
| + | |||
| + | Make sure the remote server is reachable, and the destination directory exists with proper write permissions. | ||
| + | |||
| + | Once you’ve saved your script, make it executable by running chmod command: | ||
| + | |||
| + | chmod +x backup_mysql.sh | ||
| + | |||
| + | === Step 2: Testing MySQL Backup Script === | ||
| + | |||
| + | Before setting up the Cron job, it’s a good idea to test the script manually to make sure everything is working as expected. | ||
| + | |||
| + | ./ | ||
| + | |||
| + | Check your backup directory to ensure the backups are created successfully. If everything looks good, proceed to the next step. | ||
| + | |||
| + | === Step 3: Automating MySQL Backups with Cron Jobs === | ||
| + | |||
| + | Now that we have the backup script, the next step is to automate it by using Cron, a tool that runs commands at scheduled times. | ||
| + | |||
| + | crontab -e | ||
| + | |||
| + | Add a Cron job to run the backup script automatically. For example, to run the script every day at 2 AM, add the following line: | ||
| + | |||
| + | 0 2 * * * /bin/bash / | ||
| + | |||
| + | Here’s how the Cron schedule works: | ||
| + | |||
| + | * 0: The minute (0th minute). | ||
| + | * 2: The hour (2 AM). | ||
| + | * *: Every day of the month. | ||
| + | * *: Every month. | ||
| + | * *: Every day of the week. | ||
| + | |||
| + | To verify that your Cron job is running, you can check the system logs or temporarily set the script to run at a closer time to see if it works. | ||
| + | |||
| + | grep CRON / | ||
| + | |||
| + | **// | ||
| + | |||
| + | * Security: Storing your MySQL password in the script is convenient but not secure. For better security, you can store your credentials in a .my.cnf file in your home directory and configure the script to read from there. | ||
| + | * Backup Location: Make sure that the backup directory has enough space for your backups. If you’re running multiple backups, it’s a good idea to set up a separate storage location (like an external hard drive or cloud storage). | ||
| + | * Backup Frequency: Depending on how often your data changes, you might want to adjust the Cron job schedule. For example, you could run the backup every hour, every week, or only on certain days. | ||