trop de modifications
This commit is contained in:
parent
ab81c71b7d
commit
8bdbfd8b93
|
@ -1,10 +1,13 @@
|
||||||
updateall
|
updateall
|
||||||
|
check_sha256.sh
|
||||||
|
generate_playlist.sh
|
||||||
|
generate_playlist_fp.php
|
||||||
|
check_smart.sh
|
||||||
convertMKV.sh
|
convertMKV.sh
|
||||||
castopod_update.sh
|
castopod_update.sh
|
||||||
mkv_extract.sh
|
mkv_extract.sh
|
||||||
podcast_convertImage.sh
|
podcast_convertImage.sh
|
||||||
random_music_player.sh
|
random_music_player.sh
|
||||||
play_tophaire.sh
|
play_tophaire.sh
|
||||||
generate_playlist.sh
|
|
||||||
convertPDF.sh
|
convertPDF.sh
|
||||||
check_domain_cert.sh
|
check_domain_cert.sh
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Vérifie si le bon nombre d'arguments est fourni
|
||||||
|
if [ "$#" -ne 2 ]; then
|
||||||
|
echo "Usage: $0 <expected_hash> <file_path>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
expected_hash=$1
|
||||||
|
file_path=$2
|
||||||
|
|
||||||
|
# Vérifie si le fichier existe
|
||||||
|
if [ ! -f "$file_path" ]; then
|
||||||
|
echo "Error: File $file_path does not exist."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Calculer le hash SHA-256 du fichier et le comparer avec le hash attendu
|
||||||
|
echo "$expected_hash $file_path" | sha256sum -c - > /dev/null 2>&1
|
||||||
|
|
||||||
|
# Vérifier le code de sortie de sha256sum
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "Hash match: OK"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "Hash match: FAILED"
|
||||||
|
exit 1
|
||||||
|
fi
|
|
@ -0,0 +1,99 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Fonction de hachage SHA-256
|
||||||
|
hash_serial() {
|
||||||
|
echo -n "$1" | sha256sum | awk '{print $1}'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fonction pour exécuter le script avec sudo
|
||||||
|
run_with_sudo() {
|
||||||
|
sudo "$0" "$@"
|
||||||
|
exit $?
|
||||||
|
}
|
||||||
|
|
||||||
|
# Envoi des infos
|
||||||
|
send_tracker() {
|
||||||
|
# Envoyer les données au site checksmart.abonnel.fr via HTTP POST avec la date et l'heure
|
||||||
|
status_disk=$1
|
||||||
|
date_time=$(date "+%Y-%m-%d %H:%M:%S")
|
||||||
|
echo "Envoi des données sur smartctl.abonnel.fr"
|
||||||
|
curl -d "serial_number=$hashed_serial&data=$status_disk&date_time=$date_time" https://checksmart.abonnel.fr/api/submit
|
||||||
|
echo -e "\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Vérifier si l'utilisateur a les privilèges sudo
|
||||||
|
if [ "$EUID" -ne 0 ]; then
|
||||||
|
echo "Ce script nécessite des privilèges sudo. Tentative de relance avec sudo..."
|
||||||
|
run_with_sudo "$@"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Vérifier si smartctl est installé
|
||||||
|
if ! command -v smartctl &> /dev/null; then
|
||||||
|
echo "Le programme smartctl n'est pas installé sur ce système."
|
||||||
|
|
||||||
|
# Vérifier quel gestionnaire de paquets est utilisé
|
||||||
|
if command -v apt &> /dev/null; then
|
||||||
|
read -p "Voulez-vous installer smartmontools avec apt ? (O/N) " choice
|
||||||
|
if [[ "$choice" =~ ^[oO] ]]; then
|
||||||
|
apt install smartmontools
|
||||||
|
else
|
||||||
|
echo "Installation annulée."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
elif command -v yum &> /dev/null; then
|
||||||
|
read -p "Voulez-vous installer smartmontools avec yum ? (O/N) " choice
|
||||||
|
if [[ "$choice" =~ ^[oO] ]]; then
|
||||||
|
yum install smartmontools
|
||||||
|
else
|
||||||
|
echo "Installation annulée."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Gestionnaire de paquets non pris en charge. Veuillez installer smartmontools manuellement."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Numéro de série du disque
|
||||||
|
serial_number=$(smartctl -i /dev/sda | grep "Serial Number" | awk '{print $3}')
|
||||||
|
hashed_serial=$(hash_serial "$serial_number")
|
||||||
|
|
||||||
|
# Récupérer la liste des disques
|
||||||
|
disks=$(lsblk -o NAME -n -d)
|
||||||
|
|
||||||
|
|
||||||
|
# Parcourir tous les disques et vérifier l'état SMART
|
||||||
|
for disk in $disks; do
|
||||||
|
# Date et heure actuelles
|
||||||
|
|
||||||
|
echo "----------------------------------------------"
|
||||||
|
# Utiliser smartctl pour vérifier si le disque prend en charge SMART
|
||||||
|
if smartctl -i /dev/$disk > /dev/null 2>&1; then
|
||||||
|
echo "Vérification de l'état SMART pour le disque $disk :"
|
||||||
|
output=$(smartctl -H /dev/$disk)
|
||||||
|
if [[ "$output" =~ "PASSED" ]]; then
|
||||||
|
status="OK"
|
||||||
|
else
|
||||||
|
status="En panne"
|
||||||
|
fi
|
||||||
|
echo "État : $status"
|
||||||
|
|
||||||
|
#echo "Lancement d'un scan pour la prochaine passe."
|
||||||
|
#smartctl -t long "/dev/$disk"
|
||||||
|
|
||||||
|
status_disk=$(smartctl -a /dev/$disk)
|
||||||
|
send_tracker "$status_disk"
|
||||||
|
|
||||||
|
else
|
||||||
|
echo "Le périphérique $disk ne prend pas en charge SMART et est exclu de la vérification."
|
||||||
|
echo "----------------------------------------------"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# URL de consultation des informations
|
||||||
|
url="https://checksmart.abonnel.fr/?hs=$hashed_serial"
|
||||||
|
|
||||||
|
# Afficher un message pour indiquer que les données sont consultables
|
||||||
|
echo "Consultez les informations à l'adresse : $url"
|
|
@ -7,17 +7,32 @@ date_format=$(date +"%Y%m%d_%H%M%S")
|
||||||
|
|
||||||
# Fonction pour afficher l'utilisation du script
|
# Fonction pour afficher l'utilisation du script
|
||||||
usage() {
|
usage() {
|
||||||
echo "Utilisation : $0 [-n <nombre de fichiers>] [-d <répertoire>] [-o <fichier de sortie>]"
|
echo "Utilisation : $0 [-EU] [-n <nombre de fichiers>] [-d <répertoire>] [-o <fichier de sortie>]"
|
||||||
echo "Options :"
|
echo "Options :"
|
||||||
echo " -n <nombre de fichiers> : Nombre de fichiers à inclure dans le M3U"
|
echo " -n <nombre de fichiers> : Nombre de fichiers à inclure dans le M3U"
|
||||||
echo " -d <répertoire> : Répertoire à scanner (y compris les sous-répertoires)"
|
echo " -d <répertoire> : Répertoire à scanner (y compris les sous-répertoires)"
|
||||||
echo " -o <fichier de sortie> : Nom du fichier M3U de sortie"
|
echo " -o <fichier de sortie> : Nom du fichier M3U de sortie"
|
||||||
|
echo " -E : Recherche des doublons basée sur l'empreinte auditive"
|
||||||
|
echo " -U : Mise à jour de la base de données"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Temps de début d'exécution
|
||||||
|
start_time=$(date +%s)
|
||||||
|
|
||||||
|
# search_type
|
||||||
|
search_type="S" # standard
|
||||||
|
|
||||||
# Analyse des options de ligne de commande
|
# Analyse des options de ligne de commande
|
||||||
while getopts "n:d:o:" opt; do
|
while getopts "n:d:o:EU" opt; do
|
||||||
case $opt in
|
case $opt in
|
||||||
|
E)
|
||||||
|
search_type="E" # empreintes identiques
|
||||||
|
;;
|
||||||
|
U)
|
||||||
|
search_type="U" # mise à jour de la base
|
||||||
|
;;
|
||||||
n)
|
n)
|
||||||
num_files=$OPTARG
|
num_files=$OPTARG
|
||||||
;;
|
;;
|
||||||
|
@ -34,6 +49,14 @@ while getopts "n:d:o:" opt; do
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
|
# Définition du dossier des paramètres
|
||||||
|
CONFIG_DIR=${HOME}/.config/cedrix/generate_playlist
|
||||||
|
if [ ! -d "$CONFIG_DIR" ]; then
|
||||||
|
mkdir -p ${CONFIG_DIR}
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Vérifier si le fichier user-dirs.dirs existe
|
# Vérifier si le fichier user-dirs.dirs existe
|
||||||
if [[ -f ~/.config/user-dirs.dirs ]]; then
|
if [[ -f ~/.config/user-dirs.dirs ]]; then
|
||||||
# Charger les variables depuis le fichier user-dirs.dirs
|
# Charger les variables depuis le fichier user-dirs.dirs
|
||||||
|
@ -43,14 +66,14 @@ if [[ -f ~/.config/user-dirs.dirs ]]; then
|
||||||
if [[ -v XDG_MUSIC_DIR ]]; then
|
if [[ -v XDG_MUSIC_DIR ]]; then
|
||||||
# Le répertoire XDG_MUSIC_DIR existe
|
# Le répertoire XDG_MUSIC_DIR existe
|
||||||
mkdir -p "$XDG_MUSIC_DIR/playlists"
|
mkdir -p "$XDG_MUSIC_DIR/playlists"
|
||||||
output_file="$XDG_MUSIC_DIR/playlists/playlist_${date_format}_${num_files}.m3u"
|
output_file="$XDG_MUSIC_DIR/playlists/playlist_${date_format}.m3u"
|
||||||
else
|
else
|
||||||
# La variable XDG_MUSIC_DIR n'est pas définie
|
# La variable XDG_MUSIC_DIR n'est pas définie
|
||||||
output_file="$HOME/playlist_${date_format}_${num_files}.m3u"
|
output_file="$HOME/playlist_${date_format}.m3u"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
# Le fichier user-dirs.dirs n'existe pas
|
# Le fichier user-dirs.dirs n'existe pas
|
||||||
output_file="$HOME/playlist_${date_format}_${num_files}.m3u"
|
output_file="$HOME/playlist_${date_format}.m3u"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
@ -60,9 +83,14 @@ if [ ! -d "$directory" ]; then
|
||||||
usage
|
usage
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Création d'un fichier temporaire pour stocker la liste des fichiers audio avec leur date de création
|
# Création d'un fichier temporaire pour stocker la liste des fichiers audio
|
||||||
temp_file=$(mktemp)
|
temp_file=$(mktemp)
|
||||||
echo "Recherche en cours des fichiers audios dans \"$directory\""
|
|
||||||
|
count=0
|
||||||
|
|
||||||
|
# Si l'option -E est spécifiée, rechercher les doublons basés sur l'empreinte auditive
|
||||||
|
if [ "$search_type" == "S" ]; then
|
||||||
|
echo "Recherche en cours des $num_files derniers fichiers audios dans \"$directory\""
|
||||||
find "$directory" -type f \( -name "*.mp3" -o -name "*.opus" -o -name "*.ogg" -o -name "*.m4a" \) -exec stat --format="%Z %n" {} + > "$temp_file"
|
find "$directory" -type f \( -name "*.mp3" -o -name "*.opus" -o -name "*.ogg" -o -name "*.m4a" \) -exec stat --format="%Z %n" {} + > "$temp_file"
|
||||||
|
|
||||||
echo "Nombre de fichiers audios trouvé dans $directory : "$(wc -l "$temp_file")
|
echo "Nombre de fichiers audios trouvé dans $directory : "$(wc -l "$temp_file")
|
||||||
|
@ -71,7 +99,118 @@ echo "Nombre de fichiers audios trouvé dans $directory : "$(wc -l "$temp_file")
|
||||||
sort -n -r -o "$temp_file" "$temp_file"
|
sort -n -r -o "$temp_file" "$temp_file"
|
||||||
head -n "$num_files" "$temp_file" | awk '{print $2}' > "$output_file"
|
head -n "$num_files" "$temp_file" | awk '{print $2}' > "$output_file"
|
||||||
|
|
||||||
# Suppression du fichier temporaire
|
elif [ "$search_type" == "E" ]; then
|
||||||
rm "$temp_file"
|
# Code pour rechercher les doublons basés sur l'empreinte auditive
|
||||||
|
echo "Option -E spécifiée : Recherche des doublons basés sur l'empreinte auditive. Veuillez patienter ..."
|
||||||
|
|
||||||
echo "Le fichier M3U a été créé avec les $num_files fichiers audio les plus récents dans le répertoire $directory : $output_file"
|
# Chemin de la base de données SQLite
|
||||||
|
db_file=${CONFIG_DIR}/database.sqlite
|
||||||
|
|
||||||
|
# Requête SQL pour récupérer les fichiers avec des empreintes identiques
|
||||||
|
query="SELECT acoustid, GROUP_CONCAT(file_id) AS file_ids, COUNT(*) AS count
|
||||||
|
FROM metadata
|
||||||
|
GROUP BY acoustid
|
||||||
|
HAVING count > 1;"
|
||||||
|
|
||||||
|
# Exécuter la requête SQL et afficher les résultats
|
||||||
|
sqlite3 "$db_file" "$query"| while IFS='|' read -r acoustid file_ids count; do
|
||||||
|
echo "Empreinte digitale ID : $acoustid"
|
||||||
|
echo "Fichiers associés : $file_ids"
|
||||||
|
echo "Nombre de fichiers : $count"
|
||||||
|
echo "-------------------------"
|
||||||
|
done
|
||||||
|
|
||||||
|
exit
|
||||||
|
|
||||||
|
elif [ "$search_type" == "U" ]; then
|
||||||
|
# Code pour rechercher les doublons basés sur l'empreinte auditive
|
||||||
|
echo "Mise à jour de la base de données. Le traitement peut être un peu long. Veuillez patienter ..."
|
||||||
|
|
||||||
|
# Vérifier si fpcalc est installé et l'installer si nécessaire
|
||||||
|
if ! command -v fpcalc &>/dev/null; then
|
||||||
|
echo "Téléchargement de fpcalc..."
|
||||||
|
mkdir -p "$HOME/.local/bin"
|
||||||
|
wget -O /tmp/chromaprint.tar.gz https://github.com/acoustid/chromaprint/releases/download/v1.5.1/chromaprint-fpcalc-1.5.1-linux-x86_64.tar.gz
|
||||||
|
tar -xzf /tmp/chromaprint.tar.gz -C "$HOME/.local/bin" --strip-components=1
|
||||||
|
rm /tmp/chromaprint.tar.gz
|
||||||
|
chmod +x "$HOME/.local/bin/fpcalc"
|
||||||
|
echo "fpcalc installé avec succès."
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Vérifier si PHP est installé
|
||||||
|
if ! command -v php &>/dev/null; then
|
||||||
|
echo "PHP n'est pas installé. Installation en cours..."
|
||||||
|
if command -v dnf &>/dev/null; then
|
||||||
|
sudo dnf install -y php
|
||||||
|
elif command -v apt &>/dev/null; then
|
||||||
|
sudo apt install -y php
|
||||||
|
elif command -v yum &>/dev/null; then
|
||||||
|
sudo yum install -y php
|
||||||
|
else
|
||||||
|
echo "Système de gestion de paquets non pris en charge."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "PHP installé avec succès."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Vérifier si SQLite pour PHP est installé
|
||||||
|
if ! php -m | grep -q "sqlite3"; then
|
||||||
|
echo "SQLite pour PHP n'est pas installé. Installation en cours..."
|
||||||
|
if command -v dnf &>/dev/null; then
|
||||||
|
sudo dnf install -y php-sqlite3
|
||||||
|
elif command -v apt &>/dev/null; then
|
||||||
|
sudo apt install -y php-sqlite3
|
||||||
|
elif command -v yum &>/dev/null; then
|
||||||
|
sudo yum install -y php-sqlite3
|
||||||
|
else
|
||||||
|
echo "Système de gestion de paquets non pris en charge."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "SQLite pour PHP installé avec succès."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Chemin de la base de données SQLite
|
||||||
|
db_file=${CONFIG_DIR}/database.sqlite
|
||||||
|
|
||||||
|
# Chemin complet du script PHP
|
||||||
|
php_script="$(dirname "$0")/generate_playlist_fp.php"
|
||||||
|
|
||||||
|
# Appeler le script PHP avec les paramètres appropriés
|
||||||
|
php "$php_script" "$directory" "$db_file"
|
||||||
|
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e " and more...\n"
|
||||||
|
|
||||||
|
# Suppression du fichier temporaire
|
||||||
|
rm -v "$temp_file"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# ajout du nombre de fichiers de la playlist dans le nom du fichier
|
||||||
|
num_files_real=$(wc -l $output_file)
|
||||||
|
|
||||||
|
# Extraire le nom de fichier sans l'extension
|
||||||
|
filename_without_extension="${output_file%.*}"
|
||||||
|
|
||||||
|
# Extraire l'extension du fichier
|
||||||
|
extension="${original_file##*.}"
|
||||||
|
|
||||||
|
# Construire le nouveau nom de fichier avec num_files_real ajouté avant l'extension
|
||||||
|
output_new_file="${filename_without_extension}_${num_files_real}.${extension}"
|
||||||
|
|
||||||
|
mv -v "${output_file}" "${output_new_file}"
|
||||||
|
|
||||||
|
|
||||||
|
echo "Le fichier M3U a été créé avec les $num_files_real fichiers audio les plus récents dans le répertoire $directory : $output_file"
|
||||||
|
|
||||||
|
|
||||||
|
# Temps de fin d'exécution
|
||||||
|
end_time=$(date +%s)
|
||||||
|
|
||||||
|
# Calcul du temps écoulé
|
||||||
|
execution_time=$((end_time - start_time))
|
||||||
|
|
||||||
|
echo "Temps d'exécution: $execution_time secondes"
|
||||||
|
|
|
@ -0,0 +1,217 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// Fonction pour calculer le fingerprint d'un fichier audio
|
||||||
|
function calculate_fingerprint($file) {
|
||||||
|
$return_code = 0;
|
||||||
|
|
||||||
|
$file_bash = str_replace(['$'], ['\$'], $file);
|
||||||
|
|
||||||
|
exec("fpcalc -json \"$file_bash\" 2>&1", $output, $return_code);
|
||||||
|
// Vérifier s'il y a eu une erreur lors de l'exécution de la commande
|
||||||
|
if ($return_code !== 0) {
|
||||||
|
// Enregistrer l'erreur dans un fichier journal par exemple
|
||||||
|
error_log("Erreur lors du calcul du fingerprint pour le fichier \"$file_bash\" : " . implode("\n", $output));
|
||||||
|
return null; // Retourner null pour indiquer une erreur
|
||||||
|
}
|
||||||
|
|
||||||
|
// Traitement de la réponse
|
||||||
|
$result = json_decode(implode('', $output), true);
|
||||||
|
|
||||||
|
// Vérifier si le résultat est valide
|
||||||
|
if (isset($result['fingerprint'])) {
|
||||||
|
return $result['fingerprint']; // Retourner le fingerprint
|
||||||
|
} else {
|
||||||
|
// Enregistrer un message d'erreur dans le journal
|
||||||
|
error_log("Réponse invalide lors du calcul du fingerprint pour le fichier $file : " . implode("\n", $output));
|
||||||
|
return null; // Retourner null en cas de réponse invalide
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function getTagValue($metadataInFile, $tagKey) {
|
||||||
|
// Vérifier si la clé existe dans le tableau et retourner sa valeur si c'est le cas
|
||||||
|
if (isset($metadataInFile['streams'][0]['tags'][$tagKey])) {
|
||||||
|
return $metadataInFile['streams'][0]['tags'][$tagKey];
|
||||||
|
} else {
|
||||||
|
// Retourner null si la clé n'existe pas
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Fonction pour extraire les métadonnées d'un fichier audio
|
||||||
|
function extract_metadata($file) {
|
||||||
|
|
||||||
|
# Extraire les métadonnées avec ffprobe
|
||||||
|
$ffprobe_output = shell_exec("ffprobe -hide_banner -loglevel fatal -show_error -show_format -show_streams -print_format json \"$file\"");
|
||||||
|
|
||||||
|
// Décoder la sortie JSON
|
||||||
|
$metadataInFile = json_decode($ffprobe_output, true);
|
||||||
|
|
||||||
|
// Vérifier si les métadonnées contiennent les tags
|
||||||
|
if (isset($metadataInFile['streams'][0]['tags'])) {
|
||||||
|
|
||||||
|
|
||||||
|
// Extraire les metadonnées
|
||||||
|
$metadata['ARTIST'] = getTagValue($metadataInFile, 'ARTIST');
|
||||||
|
$metadata['TITLE'] = getTagValue($metadataInFile, 'TITLE');
|
||||||
|
$metadata['ALBUM'] = getTagValue($metadataInFile, 'ALBUM');
|
||||||
|
$metadata['ACOUSTID'] = getTagValue($metadataInFile, 'ACOUSTID_ID');
|
||||||
|
$metadata['duration'] = isset($metadataInFile['format']['duration']) ? (float)$metadataInFile['format']['duration'] : null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (isset($metadata)) {
|
||||||
|
return $metadata;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vérifier si le nombre de paramètres est correct
|
||||||
|
if ($argc != 3) {
|
||||||
|
die("Usage: php scan_files.php <directory> <database>\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
$directory = $argv[1];
|
||||||
|
$db_file = $argv[2];
|
||||||
|
|
||||||
|
// Vérifier si le dossier existe
|
||||||
|
if (!is_dir($directory)) {
|
||||||
|
die("Le dossier spécifié n'existe pas.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vérifier si la base de données existe, sinon la créer
|
||||||
|
if (!file_exists($db_file)) {
|
||||||
|
echo "La base de données n'existe pas. Création en cours...\n";
|
||||||
|
$db = new PDO("sqlite:$db_file");
|
||||||
|
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||||
|
|
||||||
|
// Créer les tables
|
||||||
|
$db->exec("CREATE TABLE IF NOT EXISTS files (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
file_path TEXT UNIQUE,
|
||||||
|
first_referenced DATETIME,
|
||||||
|
last_updated DATETIME
|
||||||
|
)");
|
||||||
|
$db->exec("CREATE TABLE IF NOT EXISTS fingerprints (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
file_id INTEGER UNIQUE,
|
||||||
|
fingerprint TEXT,
|
||||||
|
FOREIGN KEY (file_id) REFERENCES files(id)
|
||||||
|
)");
|
||||||
|
$db->exec("CREATE TABLE IF NOT EXISTS metadata (
|
||||||
|
file_id INTEGER PRIMARY KEY,
|
||||||
|
artist TEXT,
|
||||||
|
title TEXT,
|
||||||
|
album TEXT,
|
||||||
|
duration REAL,
|
||||||
|
acoustid TEXT,
|
||||||
|
FOREIGN KEY (file_id) REFERENCES files(id)
|
||||||
|
)");
|
||||||
|
|
||||||
|
// Création de la table system_info si elle n'existe pas déjà
|
||||||
|
$db->exec("CREATE TABLE IF NOT EXISTS system_info (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
version INTEGER NOT NULL
|
||||||
|
)");
|
||||||
|
|
||||||
|
// Insertion des données de version
|
||||||
|
$version = "1";
|
||||||
|
$insert_version_sql = "INSERT INTO system_info (version) VALUES (:version)";
|
||||||
|
$stmt = $db->prepare($insert_version_sql);
|
||||||
|
$stmt->bindParam(':version', $version, PDO::PARAM_STR);
|
||||||
|
$stmt->execute();
|
||||||
|
|
||||||
|
echo "Base de données créée avec succès.\n";
|
||||||
|
} else {
|
||||||
|
// Connexion à la base de données SQLite
|
||||||
|
$db = new PDO("sqlite:$db_file");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Préparation de la requête d'insertion des fichiers
|
||||||
|
$insert_file_stmt = $db->prepare("INSERT INTO files (file_path, first_referenced, last_updated) VALUES (:file_path, DATETIME('now'), DATETIME('now'))");
|
||||||
|
|
||||||
|
// Préparer la requête SQL d'insertion ou de mise à jour des empreintes digitales
|
||||||
|
$insert_fingerprint_sql = "INSERT INTO fingerprints (file_id, fingerprint)
|
||||||
|
VALUES (:file_id, :fingerprint)
|
||||||
|
ON CONFLICT(file_id) DO UPDATE
|
||||||
|
SET fingerprint = :fingerprint";
|
||||||
|
|
||||||
|
$insert_fingerprint_stmt = $db->prepare($insert_fingerprint_sql);
|
||||||
|
|
||||||
|
// Préparer la requête SQL d'insertion ou de mise à jour des métadonnées
|
||||||
|
$insert_metadata_sql = "INSERT INTO metadata (file_id, artist, title, album, acoustid, duration)
|
||||||
|
VALUES (:file_id, :artist, :title, :album, :acoustid, :duration)
|
||||||
|
ON CONFLICT(file_id) DO UPDATE
|
||||||
|
SET artist = :artist,
|
||||||
|
title = :title,
|
||||||
|
album = :album,
|
||||||
|
acoustid = :acoustid,
|
||||||
|
duration = :duration";
|
||||||
|
|
||||||
|
$insert_metadata_stmt = $db->prepare($insert_metadata_sql);
|
||||||
|
|
||||||
|
$count = 0; // Initialisation du compteur
|
||||||
|
|
||||||
|
// Parcourir les fichiers audio
|
||||||
|
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));
|
||||||
|
foreach ($iterator as $file) {
|
||||||
|
|
||||||
|
$file_bash = escapeshellarg($file);
|
||||||
|
|
||||||
|
if ($file->isFile() && in_array($file->getExtension(), ['mp3', 'opus', 'ogg', 'm4a'])) {
|
||||||
|
|
||||||
|
if ($count % 10 == 0) {
|
||||||
|
echo "\rProgress: $count files processed\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
$file_path = $file->getPathname();
|
||||||
|
|
||||||
|
// Vérifier si le fichier existe déjà dans la base de données
|
||||||
|
$result = $db->query("SELECT id FROM files WHERE file_path = " . $db->quote($file_path));
|
||||||
|
$file_id = $result->fetchColumn();
|
||||||
|
|
||||||
|
if (!$file_id) {
|
||||||
|
// Insérer le fichier dans la base de données
|
||||||
|
$insert_file_stmt->execute([':file_path' => $file_path]);
|
||||||
|
$file_id = $db->lastInsertId();
|
||||||
|
|
||||||
|
// Calculer le fingerprint du fichier
|
||||||
|
// $fingerprint = calculate_fingerprint($file_path);
|
||||||
|
|
||||||
|
// Insérer le fingerprint dans la base de données
|
||||||
|
// $insert_fingerprint_stmt->execute([':file_id' => $file_id, ':fingerprint' => $fingerprint]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Mettre à jour la date de dernière mise à jour du fichier
|
||||||
|
$db->exec("UPDATE files SET last_updated = DATETIME('now') WHERE id = $file_id");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Extraire les métadonnées du fichier audio
|
||||||
|
$metadata = extract_metadata($file_path);
|
||||||
|
|
||||||
|
// Insérer les métadonnées dans la base de données
|
||||||
|
$insert_metadata_stmt->execute([
|
||||||
|
':file_id' => $file_id,
|
||||||
|
':artist' => isset($metadata['ARTIST']) ? $metadata['ARTIST'] : null,
|
||||||
|
':title' => isset($metadata['TITLE']) ? $metadata['TITLE'] : null,
|
||||||
|
':album' => isset($metadata['ALBUM']) ? $metadata['ALBUM'] : null,
|
||||||
|
':acoustid' => isset($metadata['ACOUSTID']) ? $metadata['ACOUSTID'] : null,
|
||||||
|
':duration' => isset($metadata['duration']) ? (int)$metadata['duration'] : null
|
||||||
|
]);
|
||||||
|
|
||||||
|
$count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fermer la connexion à la base de données
|
||||||
|
$db = null;
|
||||||
|
|
||||||
|
echo "Terminé.\n";
|
||||||
|
|
||||||
|
?>
|
|
@ -0,0 +1,77 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Fonction pour vérifier si une ligne existe déjà dans un fichier
|
||||||
|
line_exists() {
|
||||||
|
grep -Fq "$1" "$2"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Vérifie si le système est sous Buster
|
||||||
|
check_buster() {
|
||||||
|
if grep -Fq "buster" /etc/os-release; then
|
||||||
|
echo "Le système est sous Buster."
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "Le système n'est pas sous Buster."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Vérifie si non-free-firmware est configuré
|
||||||
|
check_non_free_firmware() {
|
||||||
|
if grep -Eq "non-free-firmware" /etc/apt/sources.list /etc/apt/sources.list.d/*; then
|
||||||
|
echo "Le dépôt non-free-firmware est déjà configuré."
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "Le dépôt non-free-firmware n'est pas configuré."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Met à jour les sources.list pour passer de Buster à Bullseye ou une version ultérieure
|
||||||
|
update_sources() {
|
||||||
|
local new_codename="$1"
|
||||||
|
sed -i.bak -e "s/buster/$new_codename/g" /etc/apt/sources.list /etc/apt/sources.list.d/*
|
||||||
|
echo "Mise à jour de /etc/apt/sources.list et /etc/apt/sources.list.d/* pour passer à $new_codename."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ajoute non-free-firmware aux sources.list si nécessaire
|
||||||
|
add_non_free_firmware() {
|
||||||
|
if ! check_non_free_firmware; then
|
||||||
|
if check_buster; then
|
||||||
|
# Ajouter non-free-firmware pour la version Bookworm ou ultérieure
|
||||||
|
sed -i.bak -e '/deb .*main/ s/$/ contrib non-free non-free-firmware/' /etc/apt/sources.list /etc/apt/sources.list.d/*
|
||||||
|
echo "Ajout de non-free-firmware aux dépôts."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main script
|
||||||
|
echo "Mise à jour de votre système Debian..."
|
||||||
|
|
||||||
|
# Mettre à jour le système dans sa version actuelle
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get upgrade -y
|
||||||
|
sudo apt-get full-upgrade -y
|
||||||
|
|
||||||
|
# Vérifier si des sauvegardes ont été effectuées (cette étape est manuelle)
|
||||||
|
|
||||||
|
# Mise à jour des sources.list
|
||||||
|
if check_buster; then
|
||||||
|
update_sources "bullseye"
|
||||||
|
add_non_free_firmware
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Nettoyer et mettre à jour les listes de paquets
|
||||||
|
sudo apt-get clean
|
||||||
|
sudo apt-get update
|
||||||
|
|
||||||
|
# Effectuer la mise à niveau majeure
|
||||||
|
sudo apt-get upgrade -y
|
||||||
|
sudo apt-get full-upgrade -y
|
||||||
|
|
||||||
|
# Supprimer les paquets non nécessaires
|
||||||
|
sudo apt-get autoremove -y
|
||||||
|
|
||||||
|
# Redémarrer le système
|
||||||
|
echo "Redémarrage du système pour appliquer les changements..."
|
||||||
|
sudo shutdown -r now
|
|
@ -1,69 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Mise à jour des machines présentes dans .ssh/config avec choix d'ignorer certaines.
|
|
||||||
|
|
||||||
# Fonction pour mettre à jour avec apt
|
|
||||||
update_with_apt() {
|
|
||||||
echo "--- Mise à jour avec apt sur $1"
|
|
||||||
ssh -tt "$1" 'sudo apt update && sudo apt upgrade --assume-yes'
|
|
||||||
}
|
|
||||||
|
|
||||||
# Fonction pour mettre à jour avec dnf
|
|
||||||
update_with_dnf() {
|
|
||||||
echo "--- Mise à jour avec dnf sur $1"
|
|
||||||
ssh -tt "$1" 'sudo dnf check-update && sudo dnf upgrade -y'
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# Déclaration d'une fonction pour récupérer les alias à partir du fichier ~/.ssh/config
|
|
||||||
get_ssh_aliases() {
|
|
||||||
# Parcours du fichier ~/.ssh/config et récupération du premier Host (excluant "*")
|
|
||||||
awk 'tolower($1) == "host" && $2 != "*" && !seen[$2]++ {print $2}' ~/.ssh/config
|
|
||||||
|
|
||||||
# Parcours des fichiers dans le dossier ~/.ssh/include et récupération du premier Host (excluant "*")
|
|
||||||
for include_file in ~/.ssh/include/*; do
|
|
||||||
awk 'tolower($1) == "host" && $2 != "*" && !seen[$2]++ {print $2}' "$include_file"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
# Récupérer les alias SSH
|
|
||||||
machines=($(get_ssh_aliases))
|
|
||||||
|
|
||||||
# Parcourir la liste des machines
|
|
||||||
|
|
||||||
for machine in "${machines[@]}"; do
|
|
||||||
# Vérification si le nom de machine est présent dans le fichier .config/updateall-hosts
|
|
||||||
if grep -q "^$machine " ~/.config/updateall-hosts; then
|
|
||||||
status=$(grep "^$machine " ~/.config/updateall-hosts | awk '{print $2}')
|
|
||||||
if [ "$status" = "1" ]; then
|
|
||||||
echo "--------------------------------------------------------------------------------"
|
|
||||||
echo "--- Vérification du gestionnaire de paquets sur $machine"
|
|
||||||
if timeout 5 ssh "$machine" which apt > /dev/null 2>&1; then
|
|
||||||
update_with_apt "$machine"
|
|
||||||
elif timeout 5 ssh "$machine" which dnf > /dev/null 2>&1; then
|
|
||||||
update_with_dnf "$machine"
|
|
||||||
else
|
|
||||||
echo "[x] Aucun gestionnaire de paquets trouvé sur $machine"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "--------------------------------------------------------------------------------"
|
|
||||||
if timeout 5 ssh "$machine" which apt > /dev/null 2>&1; then
|
|
||||||
update_with_apt "$machine"
|
|
||||||
elif timeout 5 ssh "$machine" which dnf > /dev/null 2>&1; then
|
|
||||||
update_with_dnf "$machine"
|
|
||||||
else
|
|
||||||
echo "[x] Aucun gestionnaire de paquets trouvé sur $machine"
|
|
||||||
fi
|
|
||||||
read -p "--- Le traitement pour $machine vient de se terminer. Souhaitez-vous le refaire les prochaines fois ? (o/n) " choice
|
|
||||||
if [ "$choice" = "o" ]; then
|
|
||||||
echo "$machine 1" >> ~/.config/updateall-hosts
|
|
||||||
else
|
|
||||||
echo "$machine 0" >> ~/.config/updateall-hosts
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
done
|
|
||||||
|
|
|
@ -0,0 +1,177 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Variables pour les codes de couleur ANSI
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Mise à jour des machines présentes dans .ssh/config avec choix d'ignorer certaines.
|
||||||
|
|
||||||
|
# Fonction pour mettre à jour avec apt
|
||||||
|
update_with_apt() {
|
||||||
|
echo -e " - Mise à jour avec apt sur $1 \n"
|
||||||
|
ssh -tt "$1" '
|
||||||
|
sudo apt -y -q clean &&
|
||||||
|
sudo apt -y -q update &&
|
||||||
|
sudo apt -y -q full-upgrade &&
|
||||||
|
sudo apt -y -q autoremove
|
||||||
|
'
|
||||||
|
echo -e "\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fonction pour mettre à jour avec dnf
|
||||||
|
update_with_dnf() {
|
||||||
|
echo -e " - Mise à jour avec dnf sur $1 \n"
|
||||||
|
ssh -tt "$1" 'sudo dnf check-update && sudo dnf upgrade -y'
|
||||||
|
echo -e "\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Déclaration d'une fonction pour récupérer les alias à partir du fichier ~/.ssh/config
|
||||||
|
get_ssh_aliases() {
|
||||||
|
# Parcours du fichier ~/.ssh/config et récupération du premier Host (excluant "*")
|
||||||
|
awk 'tolower($1) == "host" && $2 != "*" && !seen[$2]++ {print $2}' ~/.ssh/config
|
||||||
|
|
||||||
|
# Parcours des fichiers dans le dossier ~/.ssh/include et récupération du premier Host (excluant "*")
|
||||||
|
for include_file in ~/.ssh/include/*; do
|
||||||
|
awk 'tolower($1) == "host" && $2 != "*" && !seen[$2]++ {print $2}' "$include_file"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
check_keyinstall() {
|
||||||
|
local machine="$1"
|
||||||
|
local uniqkey="$2"
|
||||||
|
local uniqkey_file="/etc/cedrix_updateall"
|
||||||
|
|
||||||
|
echo -n " - Vérification d'une mise à jour déjà effectuée sur "$machine" : "
|
||||||
|
|
||||||
|
if ! timeout 5 ssh "$machine" '[ -f "$uniqkey_file" ]'; then
|
||||||
|
echo -e "${GREEN}mise à jour à faire.${NC}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if timeout 5 ssh "$machine" "grep -q '$uniqkey' $uniqkey_file"; then
|
||||||
|
echo -e "${RED}mise à jour déjà faite.${NC}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
timeout 5 ssh "$machine" "sudo rm "$uniqkey_file""
|
||||||
|
echo -e "${GREEN}mise à jour à faire et clé à modifier.${NC}"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
create_installkey() {
|
||||||
|
local machine="$1"
|
||||||
|
local uniqkey="$2"
|
||||||
|
local uniqkey_file="/etc/cedrix_updateall"
|
||||||
|
|
||||||
|
echo -n " - Indiquer à $machine que le script est passé ... "
|
||||||
|
# Si la clé unique n'est pas présente, la déposer dans le fichier
|
||||||
|
echo "$uniqkey" | timeout 5 ssh "$machine" "sudo su -c \"cat > $uniqkey_file\""
|
||||||
|
result="$?"
|
||||||
|
|
||||||
|
if [ $result -eq 0 ]; then
|
||||||
|
echo -e "${GREEN}OK${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}une erreur est survenue. Désactivation des prochaines mise à jour.${NC}"
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
update_machine () {
|
||||||
|
local machine="$1"
|
||||||
|
echo -n " - Détection du gestionnaire de mise à jour ... "
|
||||||
|
if timeout 5 ssh "$machine" which apt > /dev/null 2>&1; then
|
||||||
|
echo -e "${GREEN}apt${NC}"
|
||||||
|
update_with_apt "$machine"
|
||||||
|
elif timeout 5 ssh "$machine" which dnf > /dev/null 2>&1; then
|
||||||
|
echo -e "${GREEN}dnf${NC}"
|
||||||
|
update_with_dnf "$machine"
|
||||||
|
else
|
||||||
|
echo " ${RED} non détecté${NC}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
confirm_update() {
|
||||||
|
local machine="$1"
|
||||||
|
read -p " - Executer la mise à jour pour $machine ? (o/n) " choice
|
||||||
|
if [ "$choice" = "o" ]; then
|
||||||
|
echo "$machine 1" >> ~/.config/updateall-hosts
|
||||||
|
else
|
||||||
|
echo "$machine 0" >> ~/.config/updateall-hosts
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
check_host() {
|
||||||
|
local machine="$1"
|
||||||
|
|
||||||
|
echo -n " - Check host "
|
||||||
|
# Vérifier la résolution du nom d'hôte
|
||||||
|
if ssh "$machine" hostname > /dev/null 2>&1; then
|
||||||
|
echo -e "... ${GREEN}OK${NC}"
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
echo -e "... ${RED}KO${NC}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Générer une clé unique
|
||||||
|
uniqkey=$(uuidgen)
|
||||||
|
echo "Clé d'installation : $uniqkey"
|
||||||
|
|
||||||
|
# Récupérer les alias SSH
|
||||||
|
machines=($(get_ssh_aliases))
|
||||||
|
|
||||||
|
# Parcourir la liste des machines
|
||||||
|
|
||||||
|
for machine in "${machines[@]}"; do
|
||||||
|
# Vérification si le nom de machine est présent dans le fichier .config/updateall-hosts
|
||||||
|
echo -e "\n"
|
||||||
|
echo -n " >> $machine "
|
||||||
|
|
||||||
|
if grep -q "^$machine " ~/.config/updateall-hosts; then
|
||||||
|
status=$(grep "^$machine " ~/.config/updateall-hosts | awk '{print $2}')
|
||||||
|
if [ "$status" = "1" ]; then
|
||||||
|
echo -e "${GREEN}connue${NC}"
|
||||||
|
|
||||||
|
check_host "$machine"
|
||||||
|
machine_online="$?"
|
||||||
|
|
||||||
|
if [ "$machine_online" -eq 1 ]; then
|
||||||
|
check_keyinstall "$machine" "$uniqkey"
|
||||||
|
keyinstall_present="$?"
|
||||||
|
if [ "$keyinstall_present" -eq 0 ]; then
|
||||||
|
update_machine "$machine"
|
||||||
|
create_installkey "$machine" "$uniqkey"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${RED}ignorée${NC}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [ "$machine_online" -eq 1 ]; then
|
||||||
|
echo -e "${RED}vue pour la 1re fois${NC}"
|
||||||
|
|
||||||
|
check_host "$machine"
|
||||||
|
machine_online="$?"
|
||||||
|
|
||||||
|
confirm_update "$machine"
|
||||||
|
update_machine "$machine"
|
||||||
|
create_installkey "$machine" "$uniqkey"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
done
|
||||||
|
|
Loading…
Reference in New Issue