#!/bin/bash email=exemple@exemple.fr userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36" # Chemin vers la base de données SQLite database="/root/domains.db" delay_expiration=10 # Commande SQL pour récupérer le champ "domain" de la table "domain" current_timestamp=$(date +"%Y-%m-%d %H:%M:%S") echo "Il est $current_timestamp" query="SELECT id, url FROM url_check WHERE next_check<='$current_timestamp' OR next_check IS NULL;" # Exécution de la commande SQLite et récupération du résultat dans la variable "result" results=$(sqlite3 "$database" "$query") update_next_check() { local id="$1" # Récupérer la valeur d'intervalle à partir de la base de données SQLite interval=$(sqlite3 "$database" "SELECT interval FROM url_check WHERE id = $id;") # Obtenir le timestamp (nombre de secondes depuis l'époque UNIX) pour la date actuelle current_timestamp=$(date +"%s") # Calculer le nouveau timestamp en ajoutant l'intervalle (en secondes) à la date actuelle new_timestamp=$((current_timestamp + interval)) # Convertir le nouveau timestamp en format de date "YYYY-MM-DD HH:MM:SS" next_check=$(date -d "@$new_timestamp" +"%Y-%m-%d %H:%M:%S") # Mettre à jour la table url_check avec la nouvelle valeur de next_check pour l'ID spécifique echo " ✨ Mise à jour du next check à $next_check" sqlite3 "$database" "UPDATE url_check SET next_check = '$next_check' WHERE id = $id;" } check_status_200() { local id="$1" query="SELECT url FROM url_check WHERE id=$id;" # Exécution de la commande SQLite et récupération du résultat dans la variable "result" results=$(sqlite3 "$database" "$query") # Vérifier si le résultat n'est pas vide if [ -n "$results" ]; then # Parcourir les résultats ligne par ligne et afficher chaque enregistrement while IFS='|' read -r url; do # Effectuer la requête HTTP GET avec curl et stocker le résultat dans une variable response=$(timeout 1 curl -A "$userAgent" -s -o /dev/null -w "%{http_code}" "$url") echo " 🎯 Reponse http : $response" # Vérifier si le code de statut existe déjà dans la table log_check_url query="SELECT COUNT(*) FROM log_check_url WHERE id_url = $id AND value = $response AND label='http_code'" query+=" AND datetime = (SELECT MAX(datetime) FROM log_check_url WHERE id_url = $id AND label='http_code');" exists=$(sqlite3 "$database" "$query") if [ -n "$exists" ] && [ "$exists" -eq 0 ]; then echo " ✨ C'est un nouveau status, je l'inscris dans les logs" echo " Status $response pour l'url $url" | mail -s " ✨ Nouveau status pour le site $url" "$email" # Insérer le nouveau statut avec le timestamp actuel dans la table log_check_url current_timestamp=$(date +"%Y-%m-%d %H:%M:%S") sqlite3 "$database" "INSERT INTO log_check_url (id_url, label, value, datetime) VALUES ($id, 'http_code', $response, '$current_timestamp');" fi done <<< "$results" else echo " 🚫 Aucun résultat trouvé." fi } check_content(){ local id="$1" query="SELECT url FROM url_check WHERE id=$id;" # Exécution de la commande SQLite et récupération du résultat dans la variable "results" results=$(sqlite3 "$database" "$query") # Vérifier si le résultat n'est pas vide if [ -n "$results" ]; then # Parcourir les résultats ligne par ligne et afficher chaque enregistrement while IFS='|' read -r url; do # Traitement avec 'string_check' query="SELECT string_check FROM url_check WHERE id=$id;" # Exécution de la commande SQLite et récupération du résultat dans la variable "string_check_result" string_check_result=$(sqlite3 "$database" "$query") # Vérifier si string_check_result n'est pas vide if [ -n "$string_check_result" ]; then # Récupérer le contenu HTML response=$(curl -A "$userAgent" -s -L "$url" | bash -c "$string_check_result") # Si la variable n'est pas vide, attribuer la valeur à la variable "response" response_sha1=$(echo -n ${response} | sha1sum | awk '{print $1}') # Vérifier si le code de statut existe déjà dans la table log_check_url echo "Vérification du contenu..." query="SELECT COUNT(*) FROM log_check_url WHERE id_url = $id AND value = '$response_sha1' AND label='html_content_sha1'" query+=" AND datetime = (SELECT MAX(datetime) FROM log_check_url WHERE id_url = $id AND label='html_content_sha1');" exists=$(sqlite3 "$database" "$query") if [ "$exists" -eq 0 ]; then echo " ✨ C'est du nouveau contenu, je l'inscris dans les logs" echo -e " Nouveau contenu pour l'url $url\n\n\n ${response:0:1024}" | mail -s " ✨ Nouveau contenu pour le site ${url:0:64}" "$email" # Insérer le nouveau statut avec le timestamp actuel dans la table log_check_url current_timestamp=$(date +"%Y-%m-%d %H:%M:%S") response64=$(echo -n ${response} | base64) sqlite3 "$database" "INSERT INTO log_check_url (id_url, label, value, datetime) VALUES ($id, 'html_content_sha1', '$response_sha1', '$current_timestamp');" sqlite3 "$database" "INSERT INTO log_check_url (id_url, label, value, datetime) VALUES ($id, 'html_content', '${response64}', '$current_timestamp');" echo " ...le nouveau contenu est dans la base." else echo " ...rien n'a changé." fi fi done <<< "$results" else echo " 🚫 Aucun résultat trouvé." fi } # Fonction pour tester le domaine avec le port spécifié check_domain_url() { local id="$1" # Vérifier que 'next_check' soit inférieur ou égal à l'heure actuel sinon arrêter # ou si next_check est null alors bifurquer sur initCheck # Vérifier le statut 200. check_status_200 "$id" # Récupérer le contenu # Si il est différent de ce qu'il y a de stocké alors # loguer le nouveau, alerter et arrêter. code_retour=11 # Si le nombre de jours restants est inférieur à 10 if [ "$code_retour" -eq "-1" ]; then echo " ⚠️ Impossible de tester le $domain:$port." echo " ⚠️ Impossible de tester le $domain:$port." | mail -s " ⚠️ [ALERTE] Impossible de tester le $domain:$port" "$email" elif [ "$code_retour" -lt "10" ]; then echo " ⚠️ Le certificat de $domain:$port est proche de son expiration." echo "Le certificat de $domain:$port est proche de son expiration. Il reste $code_retour jour(s) avant son expiration" | mail -s " ⚠️ [ALERTE] Impossible de tester le $domain:$port" "$email" fi } # Vérifier si le résultat n'est pas vide if [ -n "$results" ]; then # Parcourir les résultats ligne par ligne et afficher chaque enregistrement while IFS='|' read -r id url; do echo -e "\n\n -- $id - URL testée : $url" check_domain_url "$id" update_next_check "$id" check_content "$id" done <<< "$results" else echo "Aucun résultat trouvé." fi