Compare commits
3 Commits
6cf6f8a02a
...
d3ddb52125
| Author | SHA1 | Date | |
|---|---|---|---|
| d3ddb52125 | |||
| e1df5d122f | |||
| 6469910bb7 |
24
servers/linux/.gitea/workflows/generate-hash.yaml
Normal file
24
servers/linux/.gitea/workflows/generate-hash.yaml
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
name: Generate SHA256 Hashes
|
||||||
|
on: [push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
hash:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Generate Hashes
|
||||||
|
run: |
|
||||||
|
# On boucle sur tous les fichiers .sh dans le dossier spécifique
|
||||||
|
cd servers/linux/
|
||||||
|
for file in *.sh; do
|
||||||
|
sha256sum "$file" > "${file}.sha256"
|
||||||
|
done
|
||||||
|
|
||||||
|
- name: Commit and Push
|
||||||
|
run: |
|
||||||
|
git config --global user.name "Gitea Action"
|
||||||
|
git config --global user.email "actions@noreply.gitea.io"
|
||||||
|
git add servers/linux/*.sha256
|
||||||
|
git diff --quiet && git diff --staged --quiet || git commit -m "Auto-update SHA256 hashes"
|
||||||
|
git push
|
||||||
@@ -137,6 +137,7 @@ user $SMTP_USER
|
|||||||
password $SMTP_PASS
|
password $SMTP_PASS
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
|
||||||
# 2. Comparaison avec le fichier existant
|
# 2. Comparaison avec le fichier existant
|
||||||
MSMTP_CONF="/etc/msmtprc"
|
MSMTP_CONF="/etc/msmtprc"
|
||||||
SHOULD_UPDATE=false
|
SHOULD_UPDATE=false
|
||||||
@@ -145,7 +146,7 @@ if [ ! -f "$MSMTP_CONF" ]; then
|
|||||||
echo "📜 Le fichier $MSMTP_CONF n'existe pas. Création..."
|
echo "📜 Le fichier $MSMTP_CONF n'existe pas. Création..."
|
||||||
SHOULD_UPDATE=true
|
SHOULD_UPDATE=true
|
||||||
else
|
else
|
||||||
# Comparaison du contenu (diff ignore les différences de droits, uniquement le texte)
|
# Comparaison du contenu
|
||||||
if ! diff -q "$TMP_MSMTP" "$MSMTP_CONF" > /dev/null; then
|
if ! diff -q "$TMP_MSMTP" "$MSMTP_CONF" > /dev/null; then
|
||||||
echo "🔄 La configuration a changé. Mise à jour de $MSMTP_CONF..."
|
echo "🔄 La configuration a changé. Mise à jour de $MSMTP_CONF..."
|
||||||
SHOULD_UPDATE=true
|
SHOULD_UPDATE=true
|
||||||
@@ -154,17 +155,31 @@ else
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 3. Application si nécessaire
|
|
||||||
|
# 3. Application et sécurisation
|
||||||
if [ "$SHOULD_UPDATE" = true ]; then
|
if [ "$SHOULD_UPDATE" = true ]; then
|
||||||
cp "$TMP_MSMTP" "$MSMTP_CONF"
|
cp "$TMP_MSMTP" "$MSMTP_CONF"
|
||||||
chmod 600 "$MSMTP_CONF"
|
|
||||||
chown root:root "$MSMTP_CONF"
|
# --- CORRECTIONS DES DROITS ---
|
||||||
|
# On donne le fichier au groupe msmtp pour permettre l'accès au binaire
|
||||||
|
chown root:msmtp "$MSMTP_CONF"
|
||||||
|
# 640 : Root lit/écrit, le groupe msmtp lit, les autres rien (sécurité du mot de passe)
|
||||||
|
chmod 640 "$MSMTP_CONF"
|
||||||
|
|
||||||
|
# On s'assure que le binaire msmtp peut lire ce fichier quel que soit l'utilisateur
|
||||||
|
# Le bit 's' (setgid) permet à msmtp de prendre l'identité du groupe 'msmtp'
|
||||||
|
chmod g+s /usr/bin/msmtp
|
||||||
|
|
||||||
|
# On règle le problème du log une fois pour toutes (lecture/écriture pour tous)
|
||||||
|
touch /var/log/msmtp.log
|
||||||
|
chown root:msmtp /var/log/msmtp.log
|
||||||
|
chmod 666 /var/log/msmtp.log
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Nettoyage du fichier temporaire
|
# Nettoyage du fichier temporaire
|
||||||
rm -f "$TMP_MSMTP"
|
rm -f "$TMP_MSMTP"
|
||||||
|
|
||||||
|
h flo
|
||||||
# --- 6. INTERCEPTION GLOBALE (LE WRAPPER) ---
|
# --- 6. INTERCEPTION GLOBALE (LE WRAPPER) ---
|
||||||
echo "--- 6. Création du wrapper sendmail pour préfixer les objets ---"
|
echo "--- 6. Création du wrapper sendmail pour préfixer les objets ---"
|
||||||
# On crée un script qui va modifier le sujet à la volée
|
# On crée un script qui va modifier le sujet à la volée
|
||||||
|
|||||||
42
servers/linux/config_services.php
Normal file
42
servers/linux/config_services.php
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<?php
|
||||||
|
$configFile = 'services_to_check.conf';
|
||||||
|
|
||||||
|
// Sauvegarde si le formulaire est envoyé
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||||
|
$selected = $_POST['services'] ?? [];
|
||||||
|
file_put_contents($configFile, implode("\n", $selected));
|
||||||
|
echo "✅ Configuration mise à jour !<br><a href='/'>Retour</a>";
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Récupération de tous les services installés
|
||||||
|
$allServices = [];
|
||||||
|
exec("systemctl list-unit-files --type=service --no-legend", $output);
|
||||||
|
foreach ($output as $line) {
|
||||||
|
$parts = preg_split('/\s+/', $line);
|
||||||
|
if (isset($parts[0])) $allServices[] = str_replace('.service', '', $parts[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lecture de la config actuelle
|
||||||
|
$currentConfig = file_exists($configFile) ? explode("\n", trim(file_get_contents($configFile))) : ["ssh", "fail2ban"];
|
||||||
|
?>
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head><title>Config Services</title></head>
|
||||||
|
<body>
|
||||||
|
<h2>Services à surveiller</h2>
|
||||||
|
<form method="post">
|
||||||
|
<div style="height: 300px; overflow-y: scroll; border: 1px solid #ccc; padding: 10px;">
|
||||||
|
<?php foreach ($allServices as $svc): ?>
|
||||||
|
<label>
|
||||||
|
<input type="checkbox" name="services[]" value="<?= $svc ?>" <?= in_array($svc, $currentConfig) ? 'checked' : '' ?>>
|
||||||
|
<?= $svc ?>
|
||||||
|
</label><br>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<button type="submit">Enregistrer la configuration</button>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -7,6 +7,8 @@ PROC_THRESHOLD=500
|
|||||||
TMP_THRESHOLD=90
|
TMP_THRESHOLD=90
|
||||||
CONN_THRESHOLD=500
|
CONN_THRESHOLD=500
|
||||||
HOST=$(hostname)
|
HOST=$(hostname)
|
||||||
|
SCRIPT_PATH="$0"
|
||||||
|
SCRIPT_NAME=$(basename "$SCRIPT_PATH")
|
||||||
|
|
||||||
# On envoie à 'root', le système fera la redirection grâce aux aliases
|
# On envoie à 'root', le système fera la redirection grâce aux aliases
|
||||||
DEST="root"
|
DEST="root"
|
||||||
@@ -22,6 +24,55 @@ add_to_report() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# --- Configuration de l'auto-update ---
|
||||||
|
|
||||||
|
BASE_URL="https://git.abonnel.fr/cedricAbonnel/scripts-bash/raw/branch/main/servers/linux"
|
||||||
|
URL_SCRIPT="${BASE_URL}/${SCRIPT_NAME}"
|
||||||
|
URL_HASH="${URL_SCRIPT}.sha256" # On suppose qu'un fichier .sha256 existe
|
||||||
|
TMP_FILE="/tmp/${SCRIPT_NAME}.new"
|
||||||
|
|
||||||
|
# --- Fonction de mise à jour ---
|
||||||
|
update_script() {
|
||||||
|
# 1. Récupérer le hash distant avec timeout
|
||||||
|
REMOTE_HASH=$(curl -s -f --connect-timeout 3 --max-time 5 "$URL_HASH" | awk '{print $1}')
|
||||||
|
|
||||||
|
# Si on n'arrive pas à lire le hash distant, on ignore l'update
|
||||||
|
[[ -z "$REMOTE_HASH" ]] && return 1
|
||||||
|
|
||||||
|
# 2. Calculer le hash local
|
||||||
|
LOCAL_HASH=$(sha256sum "$SCRIPT_PATH" | awk '{print $1}')
|
||||||
|
|
||||||
|
# 3. Comparaison
|
||||||
|
if [ "$LOCAL_HASH" != "$REMOTE_HASH" ]; then
|
||||||
|
echo "[Update] Nouvelle version détectée..."
|
||||||
|
|
||||||
|
# 4. Téléchargement du nouveau script
|
||||||
|
if curl -s -f --connect-timeout 5 --max-time 10 "$URL_SCRIPT" -o "$TMP_FILE"; then
|
||||||
|
|
||||||
|
# 5. Vérification du hash du fichier téléchargé (Sécurité)
|
||||||
|
DOWNLOADED_HASH=$(sha256sum "$TMP_FILE" | awk '{print $1}')
|
||||||
|
|
||||||
|
if [ "$DOWNLOADED_HASH" == "$REMOTE_HASH" ]; then
|
||||||
|
mv "$TMP_FILE" "$SCRIPT_PATH"
|
||||||
|
chmod +x "$SCRIPT_PATH"
|
||||||
|
echo "[Update] Mise à jour appliquée. Relance..."
|
||||||
|
exec "$SCRIPT_PATH" "$@"
|
||||||
|
else
|
||||||
|
echo "[Error] Hash corrompu après téléchargement."
|
||||||
|
rm -f "$TMP_FILE"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Lancer la vérification
|
||||||
|
update_script "$@"
|
||||||
|
|
||||||
|
# --- Reste du script ---
|
||||||
|
echo "Exécution du script principal..."
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# 1. CHECK DISQUE & INODES
|
# 1. CHECK DISQUE & INODES
|
||||||
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
|
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
|
||||||
INODE_USAGE=$(df -i / | awk 'NR==2 {print $5}' | sed 's/%//')
|
INODE_USAGE=$(df -i / | awk 'NR==2 {print $5}' | sed 's/%//')
|
||||||
@@ -106,7 +157,7 @@ fi
|
|||||||
# ------------------------------------------------
|
# ------------------------------------------------
|
||||||
# On récupère les données, puis on exclut les processus du script lui-même
|
# On récupère les données, puis on exclut les processus du script lui-même
|
||||||
# On exclut aussi souvent 'systemd-j' (journal) car il gère ses propres rotations
|
# On exclut aussi souvent 'systemd-j' (journal) car il gère ses propres rotations
|
||||||
DELETED_DATA=$(sudo lsof +L1 2>/dev/null | tail -n +2 | grep -Ev "lsof|tail|cron|sh|systemd-j|sys_check")
|
DELETED_DATA=$(sudo lsof +L1 2>/dev/null | tail -n +2 | grep -Ev "grep|lsof|tail|cron|sh|systemd-j|sys_check")
|
||||||
|
|
||||||
# On compte proprement les lignes
|
# On compte proprement les lignes
|
||||||
DELETED_COUNT=$(echo "$DELETED_DATA" | grep -v '^$' | wc -l)
|
DELETED_COUNT=$(echo "$DELETED_DATA" | grep -v '^$' | wc -l)
|
||||||
|
|||||||
Reference in New Issue
Block a user