Compare commits

..

22 Commits

Author SHA1 Message Date
2629dd832c ajout de setup_server_debian.sh 2025-03-03 08:47:52 +01:00
2ceb4be24f correction dans la détection de l'os de updateall.sh 2024-07-05 22:54:50 +02:00
615e9595cf Récupérer le nom de l'OS dans updateall.sh 2024-07-05 22:45:11 +02:00
8bdbfd8b93 trop de modifications 2024-07-05 22:29:55 +02:00
ab81c71b7d add 'updateall' script 2024-02-09 00:06:28 +01:00
8315bddba6 Correction des nom des fichiers qui n'étaient pas protégés. 2024-01-16 22:25:21 +01:00
278e40439d Les scripts conservaient leur extension sh lors de la copie.
Ce qui n'était pas voulu.
2024-01-09 08:47:07 +01:00
0629b4a616 Dans convertMKV : Un fichier est créé pour savoir
si le fichier est en cours de traitement (process) ou traité (processed)
 Changes to be committed:
	modified:   local/bin/convertMKV.sh
2023-12-23 17:20:32 +01:00
516df5809c amélioration des paramètres ffmpeg dans convertMKV 2023-12-23 17:13:51 +01:00
eb8bf3ed38 Uniformisation des documentations 2023-12-14 21:29:06 +01:00
34e7b33357 Uniformisation des pages manuels
Changes to be committed:
	modified:   .config/files_local-share-doc
	modified:   .config/files_local-share-man
	modified:   local/share/doc/castopod_update.1.md
	modified:   local/share/doc/convertPDF.1.md
	modified:   local/share/doc/play_tophoraire.1.md
	modified:   local/share/doc/playlist_gen.1.md
	modified:   local/share/doc/random_music_player.1.md
	modified:   local/share/man/castopod_update.1
	modified:   local/share/man/convertPDF.1
	modified:   local/share/man/play_tophoraire.1
	modified:   local/share/man/playlist_gen.1
	modified:   local/share/man/random_music_player.1
	modified:   prep.sh
2023-12-14 21:27:49 +01:00
7f7c74c288 Précisions sur git clone apportée dans README
cedricAbonnel/scripts-bash#4
2023-12-14 17:29:52 +01:00
83e524aee3 Détail dans README concernant install.sh
cedricAbonnel/scripts-bash#5
2023-12-14 17:27:50 +01:00
8cae67dde9 Changes to be committed:
modified:   .config/files_local-bin
	modified:   .config/files_local-share-doc
	modified:   .config/files_local-share-man
	new file:   local/share/man/castopod_update.1

Mise à jour des fichiers de paramétrage et manuel
2023-12-14 17:19:58 +01:00
91588d842e Suppression de la gestion de l'archive castopod_save.tar
Ajout de la documentation castopod_update

 Changes to be committed:
	modified:   local/bin/castopod_update.sh
	new file:   local/share/doc/castopod_update.1.md
2023-12-14 17:16:59 +01:00
bd0dbf5bde Amélioration des logs 2023-12-02 21:23:28 +01:00
bb001830e4 heu ??? 2023-12-01 01:14:30 +01:00
9dc0dcea7f - Amélioration des logs
- process_deployment_files optmisie les opérations de déployement
2023-12-01 01:13:27 +01:00
52581030f8 Optimisation du code + logs 2023-12-01 01:05:03 +01:00
6b67f264e6 ajout du bloc d'information en en-tête
dans install.sh
2023-12-01 00:51:21 +01:00
2349139ced Ajout de la fonction de purge des logs au-dela de
10 jours
2023-12-01 00:42:40 +01:00
2a64bc6d01 Les logs sont d'installation sont plus parlant.
Ils integrent les chemins des fichiers copiés.
2023-12-01 00:32:42 +01:00
34 changed files with 2012 additions and 268 deletions

View File

@@ -1,9 +1,15 @@
podcast_convertImage.sh
ytdll
updateall.sh
update_bullseye2buster.sh
check_sha256.sh
generate_playlist.sh
generate_playlist_fp.php
check_smart.sh
convertMKV.sh
castopod_update.sh
mkv_extract.sh
podcast_convertImage.sh
random_music_player.sh
play_tophaire.sh
mkv_extract.sh
generate_playlist.sh
convertPDF.sh
check_domain_cert.sh
convertMKV.sh

View File

@@ -1,4 +1,5 @@
convertPDF.1.md
play_tophoraire.1.md
convertPDF.1.md
castopod_update.1.md
random_music_player.1.md
playlist_gen.1.md

View File

@@ -1,4 +1,5 @@
playlist_gen.1
random_music_player.1
play_tophoraire.1
castopod_update.1
convertPDF.1
play_tophoraire.1

View File

@@ -0,0 +1,3 @@
definitionsTables.json
lib
config.json

View File

@@ -0,0 +1,4 @@
UpdateManager.php
Config.php
TableManager.php
Database.php

View File

@@ -8,7 +8,10 @@ Le script modifie également le chemin d'accès (PATH) de l'utilisateur ainsi qu
Pour utiliser ces scripts, suivez ces étapes :
1. Clonez ce dépôt Git.
`git clone https://git.abonnel.fr/cedricAbonnel/scripts-bash.git`
2. Exécutez le script en utilisant la commande `./install.sh`.
Le script copiera les fichiers du programme, les pages d'aide et les paramètres dans votre dossier personnel. Il est possible qu'un compte `sudo `soit requis pour l'installation de binaires externes.
Toutes les opérations et les messages d'erreur sont enregistrés dans un fichier journal (`~/log/a5l-scripts_bash-<date et heure de l'instant>-<PID>.log`) situé dans le répertoire personnel de l'utilisateur. Le journal inclut la date, l'heure et les détails de chaque opération.

View File

@@ -1,5 +1,24 @@
#!/bin/bash
# Script Bash - install.sh
# Auteur : Cédric Abonnel
# Description : Script d'installation des exécutables dans le répertoire '~/.local'"
# Version 07.07.24
# - Ajout du traitement de share/ytdll et share/ytdll/lib
# Version 23.12.1.3
# - Amélioration des logs
# - process_deployment_files optmisie les opérations de déployement
# Version 23.12.1.2
# - Fonctionnalité de purge des logs ajoutée.
# Version 23.12.1.1
# - Messages des logs améliorés avec plus de détail avec 'cp'.
# Spécifier le chemin du fichier journal
log_dir="$HOME/log"
log_file="${log_dir}/a5l-scripts_bash-$(date '+%Y%m%d-%H%M%S')-$$.log"
@@ -14,8 +33,10 @@ error() {
# Fonction pour enregistrer les messages de journal
log() {
if [ -n "$1" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - $$ - $1" >> "$log_file"
echo "$1"
fi
}
create_dir() {
@@ -43,17 +64,112 @@ add_uninstall() {
if ! grep -q "$fichier_a_supprimer" "$uninstall_list"; then
# Ajouter le fichier à uninstall_list
echo "$fichier_a_supprimer" >> "$uninstall_list"
log "- Le fichier '$fichier_a_supprimer' ajouté à la liste de fichiers installés"
fi
}
## Fonction de Traitement ##
process_deployment_files() {
local destination="$1"
local source="$2"
local file_desc="$3"
log "### Déploiement des fichiers pour $destination"
# S'assurer que le répertoire de destination existe, sinon, le créer
create_dir "$destination"
# Copier sélectivement les fichiers du dépôt Git local vers $destination en préservant la structure
log "Vérification de l'existence de '$file_desc'"
# Vérifier si le fichier "$file_desc" existe
if [ -e "$file_desc" ]; then
# Récupérer des fichiers installés
fileslist_local=$(cat "$file_desc")
# Copie des fichiers listés dans $file_desc
log "Copie des fichiers listés dans $file_desc."
# Copier les fichiers en supprimant les extensions
for file in $fileslist_local; do
# debut Supprimer l'extension du nom de fichier si c'est un Bash Script
file_type=$(file -b "$source/$file")
if [[ "$file_type" == *"Bourne-Again shell script"* ]]; then
log "$file est un fichier Bash."
file_dest="${file%.*}"
log "Nom de fichier sans extension : $file_dest"
else
file_dest="${file}"
fi
# fin
cp -v "$source/$file" "$destination/$file_dest" 2>&1 | while read -r line; do
log "- $line"
done
add_uninstall "$destination/$file_dest"
done
else
error "Le fichier '$file_desc' n'existe pas. Votre dépôt Git local n'est pas complet ou quelque chose s'est mal passé."
fi
# Affiche un message de confirmation
log "Les fichiers du dépôt Git local ont été copiés vers $destination_dir avec succès."
}
purge_old_logs(){
find "$log_dir" -type f -name "a5l-scripts_bash-*.log" -mtime +10 -exec rm {} \;
find "$log_dir" -type f -name "a5l-scripts_bash_prep-*.log" -mtime +10 -exec rm {} \;
}
log "Debut du script"
## Post traitement : log
# S'assurer que le répertoire de destination existe, sinon, le créer
create_dir "${log_dir}"
# Purger les les logs
purge_old_logs
#### .local/share/ytdll ####
## Declarations ##
# Spécifier le chemin du répertoire destination
destination_dir="$HOME/.local/share/ytdll"
# Spécifier le chemin du répertoire du dépôt Git local
source_dir="local/share/ytdll"
file_local_desc=.config/files_local-share-ytdll
## Traitement ##
log "## Debut du traitement pour $destination_dir"
process_deployment_files "$destination_dir" "$source_dir" "$file_local_desc"
#### .local/share/ytdll/lib ####
## Declarations ##
# Spécifier le chemin du répertoire destination
destination_dir="$HOME/.local/share/ytdll/lib"
# Spécifier le chemin du répertoire du dépôt Git local
source_dir="local/share/ytdll/lib"
file_local_desc=.config/files_local-share-ytdll-lib
## Traitement ##
log "## Debut du traitement pour $destination_dir"
process_deployment_files "$destination_dir" "$source_dir" "$file_local_desc"
@@ -70,33 +186,9 @@ source_dir="local/share/doc"
file_local_desc=.config/files_local-share-doc
## Traitement ##
log "## Debut du traitement pour $destination_dir"
log "Debut du Traitement pour $destination_dir"
# S'assurer que le répertoire de destination existe, sinon, le créer
create_dir "$destination_dir"
log " _ Traitement des fichiers à copier dans $destination_dir"
# Copier sélectivement les fichiers du dépôt Git local vers ~/.local/bin en préservant la structure
# Vérifier si le fichier "$file_local_desc" existe
if [ -e "$file_local_desc" ]; then
# Récupérer des fichiers installés
fileslist_local=$(cat "$file_local_desc")
# Utilisez la commande rsync pour copier les fichiers
log " Copie des fichiers listés dans $file_local_desc"
# Copier les fichiers en supprimant les extensions
for file in $fileslist_local; do
cp -v "$source_dir/$file" "$destination_dir/" || error "Impossible de copier $source_dir/$file vers $destination_dir/"
add_uninstall "$destination_dir/$file"
done
else
error "Le fichier '$file_local_desc' n'existe pas. Votre dépôt Git local n'est pas complet ou quelque chose s'est mal passé."
fi
process_deployment_files "$destination_dir" "$source_dir" "$file_local_desc"
@@ -105,7 +197,7 @@ fi
## Declarations ##
# Spécifier le chemin du répertoire ~/.local/bin
# Spécifier le chemin du répertoire
destination_dir="$HOME/.local/share/man"
# Spécifier le chemin du répertoire du dépôt Git local
@@ -113,45 +205,19 @@ source_dir="local/share/man"
file_local_desc=.config/files_local-share-man
## Traitement ##
log "## Debut du traitement pour $destination_dir"
log "Debut du Traitement pour $destination_dir"
# S'assurer que le répertoire de destination existe, sinon, le créer
create_dir "$destination_dir"
log "### Debut du Traitement pour la gestion du PATH avec $destination_dir"
# Vérifier si le répertoire destination est déjà dans le PATH
if [[ ! ":$(manpath):" == *":$destination_dir:"* ]]; then
# Ajouter le répertoire destination au PATH dans le fichier de configuration de session de l'utilisateur
echo 'export MANPATH="$(manpath):'"$destination_dir"'"' >> ~/.bashrc
source ~/.bashrc
log " _ $destination_dir a été ajouté au MANPATH dans le fichier de configuration de session de l'utilisateur."
log " $destination_dir a été ajouté au MANPATH dans le fichier de configuration de session de l'utilisateur."
fi
log " _ Traitement des fichiers à copier dans $destination_dir"
# Copier sélectivement les fichiers du dépôt Git local
# Vérifier si le fichier "$file_local_desc" existe
if [ -e "$file_local_desc" ]; then
# Récupérer des fichiers installés
fileslist_local=$(cat "$file_local_desc")
# Utilisez la commande rsync pour copier les fichiers
log " Copie des fichiers listés dans $file_local_desc"
# Copier les fichiers en supprimant les extensions
for file in $fileslist_local; do
cp -v "$source_dir/$file" "$destination_dir/man1/" || error "Impossible de fichier $source_dir/$file vers $destination_dir/man1/"
add_uninstall "$destination_dir/man1/$file"
done
else
error "Le fichier '$file_local_desc' n'existe pas. Votre dépôt Git local n'est pas complet ou quelque chose s'est mal passé."
fi
process_deployment_files "$destination_dir" "$source_dir" "$file_local_desc"
@@ -159,7 +225,7 @@ fi
## Declarations ##
# Spécifier le chemin du répertoire ~/.local/bin
# Spécifier le chemin du répertoire
destination_dir="$HOME/.local/bin"
# Spécifier le chemin du répertoire du dépôt Git local
@@ -168,40 +234,22 @@ source_dir="local/bin"
file_local_desc=.config/files_local-bin
## Traitement ##
log "Debut du Traitement pour $destination_dir"
log "## Debut du traitement pour $destination_dir"
# S'assurer que le répertoire de destination existe, sinon, le créer
create_dir "$destination_dir"
log "### Debut du Traitement pour la gestion du PATH avec $destination_dir"
# Vérifier si le répertoire destination est déjà dans le PATH
if [[ ! ":$PATH:" == *":$destination_dir:"* ]]; then
# Ajouter le répertoire destination au PATH dans le fichier de configuration de session de l'utilisateur
echo 'export PATH="$PATH:'"$destination_dir"'"' >> ~/.bashrc
source ~/.bashrc
log " _ $destination_dir a été ajouté au PATH dans le fichier de configuration de session de l'utilisateur."
log " $destination_dir a été ajouté au PATH dans le fichier de configuration de session de l'utilisateur."
fi
log " _ Traitement des fichiers à copier dans $destination_dir"
# Copier sélectivement les fichiers du dépôt Git local vers ~/.local/bin en préservant la structure
# Vérifier si le fichier "$file_local_desc" existe
if [ -e "$file_local_desc" ]; then
# Récupérer des fichiers installés
fileslist_local=$(cat "$file_local_desc")
## Traitement ##
process_deployment_files "$destination_dir" "$source_dir" "$file_local_desc"
# Utilisez la commande rsync pour copier les fichiers
log " Copie des fichiers"
log "## Fin du script. Bonne continuation."
# Copier les fichiers en supprimant les extensions
for file in $fileslist_local; do
new_name="${file%.*}" # Supprimer l'extension
cp -v "$source_dir/$file" "$destination_dir/$new_name" || error "Impossible de fichier $source_dir/$file vers $destination_dir/$new_nam"
add_uninstall "$destination_dir/$new_name"
done
else
error "Le fichier $file_local_desc n'existe pas. Votre dépôt Git local n'est pas complet ou quelque chose s'est mal passé."
fi
# Affiche un message de confirmation
log "Les fichiers du dépôt Git local ont été copiés vers $destination_dir avec succès."

View File

@@ -1,27 +1,19 @@
#!/bin/bash
# Obtenir la date et l'heure actuelles
current_date=$(date +%Y%m%d_%H%M%S)
# Script Bash - castopod_update.sh
# Auteur : Cédric Abonnel
# Description : Script de mise à jour Castopod
# Version 23.12.14
# Definitions
archive_save="save_castopod.tar"
rep_save="save_castopod"
sources_save=("castopod/public/media" "castopod/.env")
php_bin="/usr/bin/php8.1"
castopod_root="castopod"
# Vérifier la présence d'une archive TAR
if [ -e "$archive_save" ]; then
echo "Démarrer l'extraction de l'archive TAR"
pv "$archive_save" | tar xf -
rm "$archive_save"
echo "Extraction terminée."
else
echo "Aucune archive TAR '$archive_save' trouvée. Pas de sauvegarde précédente trouvée."
fi
echo " -- "
# Synchroniser les fichiers sources avec le dossier de sauvegarde
@@ -38,25 +30,53 @@ for source in "${sources_save[@]}"; do
rsync -a "$source" "$rep_save/"
done
# LEGACY 23.12.14 : Suppression de l'archive TAR si elle existe. Elle n'est plus gérée.
archive_file="save_castopod.tar"
if [ -f "$archive_file" ]; then
echo "L'archive $archive_file n'est plus gérée par le script. Seul le dossier 'save_castopod' est pris en compte."
rm -v "$archive_file"
fi
echo " -- "
# Vérifier la présence de l'archive ZIP
if [[ -n $(ls castopod*.zip 2>/dev/null) ]]; then
# Supprimer tous les fichiers et dossiers, sauf .env et public/media
find castopod/ -not -name '.env' -not -path 'castopod/public/media/*' -delete
# Extraire le fichier ZIP présent dans le dossier courant
unzip -o -q castopod*.zip
# Supprimer tous les fichiers et dossiers, sauf ceux présents dans sources_save
## Construire la commande find à partir du tableau sources_save
find_command="find \"$castopod_root/\" "
for source in "${sources_save[@]}"; do
if [ -d "$source" ]; then
### Si c'est un dossier, exclure tous les fichiers et sous-dossiers sous ce dossier
find_command+=" -type d -path \"$source\" -prune -o "
elif [ -f "$source" ]; then
### Si c'est un fichier, exclure ce fichier spécifique
find_command+=" -not -name \"$(basename "$source")\" -o "
fi
done
find_command+=" -delete"
## Exécuter la commande find
eval "$find_command"
# Extraire le fichier ZIP de mise à jour présent dans le dossier courant
echo "Mise à jour en cours de déploiement ... "
unzip -o -q castopod*.zip && echo " ... terminée."
# Désactiver l'archive en renommant les fichiers ZIP en ajoutant ".old" à leur nom
echo "Désactivation de l'archive de mise à jour."
for file in castopod*.zip; do
mv "$file" "${file}.old"
done
# Mettre à jour le schéma de la base de données
/usr/bin/php8.1 castopod/spark castopod:database-update
"$php_bin" castopod/spark castopod:database-update
else
@@ -65,23 +85,3 @@ fi
echo " -- "
# Créer une nouvelle archive compressée à partir du répertoire de sauvegarde et supprimer le répertoire
if [ -e "$rep_save/" ]; then
echo "Création de l'archive en cours '$archive_save'"
# Créer l'archive avec tar et afficher la progression
tar -cf - ./"$rep_save"/ -P | pv -s $(du -sb ./"$rep_save"/ | awk '{print $1}') > "$archive_save"
echo "Création de l'archive terminée."
echo " -- "
# Supprimer le répertoire avec une barre de progression
echo "Suppression du répertoire en cours '$rep_save/'"
rm -vrf "$rep_save/" | pv -l -s $(du -a "$rep_save/" 2>/dev/null | wc -l) > /dev/null
echo "Suppression du répertoire terminée."
else
echo "Le répertoire '$rep_save/' n'existe pas. Interruption de l'opération."
fi
echo " -- "

28
local/bin/check_sha256.sh Executable file
View File

@@ -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

99
local/bin/check_smart.sh Executable file
View File

@@ -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"

View File

@@ -113,7 +113,7 @@ echo -e "==> Traitement des vidéos en cours...\n"|tee -a $logFile
# Replace the file type
out_file=$(echo "$in_file"|sed "s/\(.*\.\)$input_file_type/\1$output_file_type/g")
echo -e "\n [NFO] Output $out_file\n"|tee -a $logFile
echo -e "\n [NFO] Output \"$out_file\"\n"|tee -a $logFile
if [ "$in_file" != "$out_file" ]; then
@@ -220,7 +220,8 @@ echo -e "==> Traitement des vidéos en cours...\n"|tee -a $logFile
# cmd_exec="${cmd_exec} -map 0:v -map 0:a? -map 0:s?"
cmd_exec="${cmd_exec} -map 0"
# cmd_exec="${cmd_exec} -c:a libvorbis -qscale:a 4"
cmd_exec="${cmd_exec} -c:a aac -b:a 128k -ac 2 -af loudnorm=I=-18:TP=-1:LRA=11:print_format=summary"
# cmd_exec="${cmd_exec} -c:a aac -b:a 128k -ac 2 -af loudnorm=I=-18:TP=-1:LRA=11:print_format=summary"
cmd_exec="${cmd_exec} -c:a eac3 -b:a 256k -ac 2 -af loudnorm=I=-18:TP=-1:LRA=11:print_format=summary"
cmd_exec="${cmd_exec} -c:v libx264"
cmd_exec="${cmd_exec} -filter:v \"${vf_option}\""
cmd_exec="${cmd_exec} ${color_params}"
@@ -229,8 +230,9 @@ echo -e "==> Traitement des vidéos en cours...\n"|tee -a $logFile
cmd_exec="${cmd_exec} -preset slower"
cmd_exec="${cmd_exec} -bf 5"
cmd_exec="${cmd_exec} -crf ${param2} -b:v $bitrate -pix_fmt yuv420p -maxrate $maxrate -bufsize $bufsize"
# cmd_exec="${cmd_exec} -crf 23 -maxrate 3000k -bufsize 6000k -b:v 3000k -pix_fmt yuv420p"
cmd_exec="${cmd_exec} -profile:v high -level 4.2"
# cmd_exec="${cmd_exec} -crf 23 -maxrate 4500k -bufsize 6000k -b:v 3000k -pix_fmt yuv420p"
# cmd_exec="${cmd_exec} -profile:v high -level 4.2"
cmd_exec="${cmd_exec} -profile:v main -level 4.1 -tune film"
cmd_exec="${cmd_exec} -movflags +faststart"
cmd_exec="${cmd_exec} -tune fastdecode+zerolatency"
cmd_exec="${cmd_exec} -max_muxing_queue_size 1024 -ss 00:00:00 -t $duration"
@@ -238,13 +240,16 @@ echo -e "==> Traitement des vidéos en cours...\n"|tee -a $logFile
cmd_exec="${cmd_exec} \"${out_file}\""
echo "touch \"${out_file}.process\"">> ${listFileName}
echo ${cmd_exec}>> ${listFileName}
echo "rm \"${out_file}.process\"">> ${listFileName}
echo "touch \"${out_file}.processed\"">> ${listFileName}
echo -e "\n ==> On indique le fichier traité et le résultat dans un log"|tee -a $logFile
cmd_exec="echo -e \"\\\"${in_file}\\\" > \\\"${out_file}\\\"\">> ~/rsbConvert.log"
echo ${cmd_exec}>> ${listFileName}
echo -e "\n ==> Finished $out_file"|tee -a $logFile
echo -e "\n ==> Finished \"$out_file\""|tee -a $logFile
fi
fi

View File

@@ -7,17 +7,32 @@ date_format=$(date +"%Y%m%d_%H%M%S")
# Fonction pour afficher l'utilisation du script
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 " -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 " -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
}
# Temps de début d'exécution
start_time=$(date +%s)
# search_type
search_type="S" # standard
# 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
E)
search_type="E" # empreintes identiques
;;
U)
search_type="U" # mise à jour de la base
;;
n)
num_files=$OPTARG
;;
@@ -34,6 +49,14 @@ while getopts "n:d:o:" opt; do
esac
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
if [[ -f ~/.config/user-dirs.dirs ]]; then
# 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
# Le répertoire XDG_MUSIC_DIR existe
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
# 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
else
# 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
@@ -60,9 +83,14 @@ if [ ! -d "$directory" ]; then
usage
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)
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"
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"
head -n "$num_files" "$temp_file" | awk '{print $2}' > "$output_file"
# Suppression du fichier temporaire
rm "$temp_file"
elif [ "$search_type" == "E" ]; then
# 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"

View File

@@ -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";
?>

149
local/bin/setup_server_debian.sh Executable file
View File

@@ -0,0 +1,149 @@
#!/bin/bash
# Vérifier si le script est exécuté en root
if [[ $EUID -ne 0 ]]; then
echo "Ce script doit être exécuté en tant que root."
exit 1
fi
### Fonction pour mettre à jour le système
update_system() {
echo "Mise à jour du système..."
apt update && apt upgrade -y
}
### Fonction pour installer sudo s'il n'est pas déjà présent
install_sudo() {
if command -v sudo &>/dev/null; then
echo "Sudo est déjà installé."
else
echo "Installation de sudo..."
apt install -y sudo
fi
}
### Fonction pour ajouter un utilisateur administrateur
add_admin_user() {
# Vérifier s'il existe déjà un utilisateur autre que root
EXISTING_USER=$(awk -F: '$3 >= 1000 && $3 < 60000 {print $1; exit}' /etc/passwd)
if [[ -n "$EXISTING_USER" ]]; then
echo "Un utilisateur ($EXISTING_USER) existe déjà sur le système."
read -p "Voulez-vous ajouter un autre utilisateur administrateur ? (o/N) " ADD_NEW_USER
if [[ ! "$ADD_NEW_USER" =~ ^[Oo]$ ]]; then
echo "Aucun nouvel utilisateur ajouté."
return
fi
fi
read -p "Entrez le nom du nouvel utilisateur : " NEW_USER
# Vérifier si l'utilisateur existe déjà
if id "$NEW_USER" &>/dev/null; then
echo "L'utilisateur $NEW_USER existe déjà."
else
adduser "$NEW_USER"
echo "Utilisateur $NEW_USER créé."
fi
# Vérifier si l'utilisateur est dans le groupe sudo
if groups "$NEW_USER" | grep -q "\bsudo\b"; then
echo "$NEW_USER est déjà dans le groupe sudo."
else
usermod -aG sudo "$NEW_USER"
echo "$NEW_USER ajouté au groupe sudo."
fi
# Vérifier si les permissions sudo sont déjà définies
if [ -f "/etc/sudoers.d/$NEW_USER" ]; then
echo "Les permissions sudo sont déjà configurées pour $NEW_USER."
else
echo "$NEW_USER ALL=(ALL) NOPASSWD:ALL" > "/etc/sudoers.d/$NEW_USER"
chmod 0440 "/etc/sudoers.d/$NEW_USER"
echo "Configuration sudo appliquée pour $NEW_USER."
fi
# Demander si on veut ajouter une clé SSH
read -p "Voulez-vous ajouter une clé SSH pour $NEW_USER ? (o/N) " ADD_SSH
if [[ "$ADD_SSH" =~ ^[Oo]$ ]]; then
SSH_DIR="/home/$NEW_USER/.ssh"
AUTH_KEYS="$SSH_DIR/authorized_keys"
# Créer le dossier .ssh s'il n'existe pas
if [ ! -d "$SSH_DIR" ]; then
mkdir -p "$SSH_DIR"
chown "$NEW_USER:$NEW_USER" "$SSH_DIR"
chmod 700 "$SSH_DIR"
echo "Dossier .ssh créé pour $NEW_USER."
fi
read -p "Collez la clé publique SSH : " SSH_KEY
# Vérifier si la clé est déjà présente
if grep -qxF "$SSH_KEY" "$AUTH_KEYS" 2>/dev/null; then
echo "Cette clé SSH est déjà ajoutée."
else
echo "$SSH_KEY" >> "$AUTH_KEYS"
chown "$NEW_USER:$NEW_USER" "$AUTH_KEYS"
chmod 600 "$AUTH_KEYS"
echo "Clé SSH ajoutée pour $NEW_USER."
fi
else
echo "Aucune clé SSH ajoutée."
fi
}
### Fonction pour configurer SSH de manière sécurisée
configure_ssh() {
if grep -q "^PermitRootLogin no" /etc/ssh/sshd_config; then
echo "La connexion root SSH est déjà désactivée."
else
echo "Désactivation de la connexion root via SSH..."
sed -i 's/^#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
systemctl restart ssh
echo "Sécurisation SSH appliquée."
fi
}
### Fonction pour installer et configurer Fail2Ban
install_fail2ban() {
if dpkg -l | grep -q "^ii fail2ban"; then
echo "Fail2Ban est déjà installé."
else
echo "Installation de Fail2Ban..."
apt install -y fail2ban
fi
}
### Fonction pour configurer les locales en français UTF-8
configure_locales() {
echo "Configuration des locales en français UTF-8..."
apt install -y locales
# Vérifier si fr_FR.UTF-8 est déjà activé
if locale -a | grep -q "fr_FR.utf8"; then
echo "Les locales en fr_FR.UTF-8 sont déjà activées."
else
sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/' /etc/locale.gen
locale-gen
fi
# Appliquer les variables locales si nécessaire
if grep -q "LANG=fr_FR.UTF-8" /etc/default/locale; then
echo "Les variables locales sont déjà configurées."
else
update-locale LANG=fr_FR.UTF-8 LANGUAGE=fr_FR.UTF-8 LC_ALL=fr_FR.UTF-8
echo "Variables locales mises à jour."
fi
}
### SECTION PRINCIPALE : Activer/Désactiver les options ici
update_system
install_sudo
add_admin_user
configure_ssh
install_fail2ban
configure_locales
echo "Installation et configuration de base terminées."
echo "Vous pouvez maintenant vous connecter avec l'utilisateur : $NEW_USER"

View File

@@ -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

189
local/bin/updateall.sh Executable file
View File

@@ -0,0 +1,189 @@
#!/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
}
# Fonction pour récupérer la valeur de /etc/os-release
get_os_release() {
ssh "$1" 'grep "^PRETTY_NAME=" /etc/os-release' | cut -d'=' -f2 | tr -d \"
}
update_machine () {
local machine="$1"
# recupérer le nom de l'OS
os_name=$(get_os_release "$machine")
echo -e " - Système d'exploitation : ${GREEN}$os_name${NC}"
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

164
local/bin/ytdll Executable file
View File

@@ -0,0 +1,164 @@
#!/usr/bin/env php
<?php
// Auteur : Cédrix pour a5l.fr
// Projet : scripts-bash/ytdll
// Télécharger les pistes audios ajoutées récemment
// depuis des chaines Youtubes
// Version 2024.07.07-14.31
// Version initiale
/*
Création de la base de données
Linux Debian 12 / PostGres 16
Suivez les instructions suivantes pour créer
votre base de données et tous les éléments
associés.
-- Connectez-vous en tant qu'utilisateur ayant des privilèges suffisants
-- depuis le compte root
sudo su - postgres
-- Modification du fichier pg_hba
nano /etc/postgresql/16/main/ph_hba.conf
-- modifier la ligne
local all all peer
-- avec la valeur suivante
local all all trust
-- avec le compte root redémarrez postgres
systemctl restart postgresql
-- Connectez-vous en tant qu'utilisateur ayant des privilèges suffisants
-- depuis le compte root
sudo su - postgres
-- Connection au requeteur
psql
-- Créer un nouveau role
CREATE ROLE r_ytdll WITH LOGIN PASSWORD 'changeme';
-- Créer la base de données
CREATE DATABASE b_ytdll OWNER r_ytdll;
-- Connectez-vous à la base de données b_ytdll :
\c b_ytdll
-- Créez un nouveau schéma
CREATE SCHEMA s_ytdll AUTHORIZATION r_ytdll;
-- Accorder tous les privilèges sur le schéma à l'utilisateur
GRANT ALL PRIVILEGES ON SCHEMA s_ytdll TO r_ytdll;
-- Accorder des privilèges sur les tables et séquences existantes et futures
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA s_ytdll TO r_ytdll;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA s_ytdll TO r_ytdll;
ALTER DEFAULT PRIVILEGES IN SCHEMA s_ytdll GRANT ALL PRIVILEGES ON TABLES TO r_ytdll;
ALTER DEFAULT PRIVILEGES IN SCHEMA s_ytdll GRANT ALL PRIVILEGES ON SEQUENCES TO r_ytdll;
-- Schéma s_ytdll par défaut
SET search_path TO s_ytdll;
\d
ALTER ROLE r_ytdll SET search_path TO s_ytdll;
ALTER DATABASE b_ytdll SET search_path TO s_ytdll;
*/
// -- GESTION DES PRE REQUIS --
// Vérifier si l'extension pgsql est chargée
if (!extension_loaded('pgsql')) {
die("L'extension PHP 'pgsql' n'est pas installée. Veuillez l'installer avant de continuer.\n");
}
// Chemin du HOME
$homeDir = getenv('HOME');
// Configuration de l'autoloader
spl_autoload_register(function ($class) use ($homeDir) {
$baseDir = $homeDir . '/.local/share/ytdll/lib/';
$file = $baseDir . str_replace('\\', '/', $class) . '.php';
if (file_exists($file)) {
require $file;
}
});
// -- GESTION DE LA CONFIGURATION PRIMAIRE --
function getUserInput($prompt) {
echo $prompt;
return trim(fgets(STDIN));
}
function createConfigFile($configPath, $templatePath) {
// Vérifie si le fichier de configuration existe
if (!file_exists($configPath)) {
// Copie le fichier de modèle
if (!copy($templatePath, $configPath)) {
die("Échec de la copie du fichier de configuration modèle.\n");
}
// Demande à l'utilisateur de saisir les valeurs nécessaires
$databaseHost = getUserInput("Veuillez saisir le host de la base de données : ");
$databaseName = getUserInput("Veuillez saisir le nom de la base de données : ");
$databaseUser = getUserInput("Veuillez saisir l'utilisateur de la base de données : ");
$databasePassword = getUserInput("Veuillez saisir le mot de passe de la base de données : ");
// Lit le fichier de modèle
$configContent = file_get_contents($configPath);
// Remplace les valeurs par défaut par les valeurs saisies par l'utilisateur
$configArray = [
'database' => [
'host' => $databaseHost,
'dbname' => $databaseName,
'user' => $databaseUser,
'password' => $databasePassword
]
];
// Encode en JSON
$jsonConfig = json_encode($configArray, JSON_PRETTY_PRINT);
// Écrit le fichier de configuration JSON
file_put_contents($configPath, $jsonConfig);
echo "Le fichier de configuration a été créé avec succès.\n";
}
}
// Appel de la fonction pour créer le fichier de configuration
$configPath = $homeDir . '/.config/fr.a5l.ytdll.json';
$templatePath = $homeDir . '/.local/share/ytdll/config.php';
createConfigFile($configPath, $templatePath);
// -- DEBUT --
// Lit le fichier de configuration primaire
$configContent = file_get_contents($configPath);
// Décode le JSON en tableau associatif
$config = json_decode($configContent, true);
// Initialiser la connexion à la base de données
$database = new Database($config['database']);
unset($config);
// Initialiser au gestionnaire de configuration
$configManager = new Config($database);
// -- GESTION DES VERSIONS de TABLE --
$updateManager = new UpdateManager($configManager, $pdo);
$updateManager->manageVersionTables();

View File

@@ -0,0 +1,72 @@
\
# NOM
castopod_update - Mise à jour de CASTOPOD
# SYNOPSIS
castopod_update
# DESCRIPTION
Le script **castopod_update** permet de mettre à jour le dossier Web de
CASTOPOD en utilisant le fichier de mise à jour au format ZIP fourni.
# OPTIONS
Aucune option n'est nécessaire pour exécuter le script.
# CONFIGURATION
Le script a sa propre configuration qui n'est pas modifiable.
Le dossier Web de CASTOPOD doit être nommé `castopod`.
Le script doit être positionné au même niveau que le dossier Web de CASTOPOD.
Le dossier `save_castopod` contient une copie des données de CASTOPOD, qui est
rafraîchie au début de l'exécution du script. S'il n'existe pas, il sera créé.
L'archive de mise à jour doit être spécifiquement nommée `castopod*.zip` et
doit être positionnée au même niveau que le script et le dossier Web de
CASTOPOD.
Le script utilise `php8.1` pour effectuer des tâches de maintenance.
# PRÉREQUIS
Téléchargez l'archive de mise à jour disponible sur le site
https://castopod.org/.
# EXEMPLES
Pour exécuter le script sans aucune option :
```
castopod_update
```
# AUTEURS
Cédric Abonnel - \<canl.sb2023@acemail.fr>
# VERSIONS
-23.12.14
: Suppression de l'archive TAR du dossier `save_castopod`.
-23.12.1
: Messages des logs améliorés avec plus de détails lors de l'utilisation de
`cp`.
# RAPPORT D'ERREURS
Pour signaler des erreurs ou des problèmes :
https://git.abonnel.fr/cedricAbonnel/scripts-bash
# REMARQUES
Ce script est fourni tel quel, sans aucune garantie. Vous êtes libre de le
modifier et de le distribuer selon les termes de la licence applicable.

View File

@@ -1,23 +1,39 @@
convertPDF(1) - Compresse des fichiers PDF pour gagner en volume et génère le résultat d'un OCR
## SYNOPSIS
**convertPDF**
# NOM
## DESCRIPTION
Ce script convertit des fichiers PDF en d'autres formats tels que JPG, TXT, et PDF en utilisant des outils comme `pdftocairo`, `pdftotext`, `tesseract`, et `convert`.
convertPDF - Compresse des fichiers PDF pour gagner en volume et génère le résultat d'un OCR
## COMPATIBILITÉ
# SYNOPSIS
convertPDF
# DESCRIPTION
Ce script convertit des fichiers PDF en d'autres formats tels que JPG, TXT, et
PDF en utilisant des outils comme `pdftocairo`, `pdftotext`, `tesseract`, et
`convert`.
# COMPATIBILITÉ
Ce script est compatible avec les fichiers PDF (Portable Document Format).
## EXEMPLE
# EXEMPLES
Convertir plusieurs fichiers PDF présent dans le dossier et sous-dossiers courants :
```
convertPDF
```
## AUTEUR
Ce script a été créé par Cédric Abonnel.
# VERSIONS
## RAPPORT D'ERREURS
Pour signaler des erreurs ou des problèmes : https://git.abonnel.fr/cedricAbonnel/scripts-bash
-23.12.1
: Version originale
# AUTEURS
Cédric Abonnel - \<canl.sb2023@acemail.fr>
# RAPPORT D'ERREURS
Pour signaler des erreurs ou des problèmes :
https://git.abonnel.fr/cedricAbonnel/scripts-bash

View File

@@ -1,33 +1,30 @@
\
# NOM
top_horaire - Gestion du jingle et de l'annonce de l'heure
# SYNOPSIS
**top_horaire** [OPTION]
top_horaire
# DESCRIPTION
Le script **top_horaire** permet de gérer la lecture d'un jingle en arrière-plan suivi de l'annonce de l'heure actuelle en utilisant espeak-ng.
Le script **top_horaire** permet de gérer la lecture d'un jingle en
arrière-plan suivi de l'annonce de l'heure actuelle en utilisant espeak-ng.
## OPTIONS
# OPTIONS
- Aucune option n'est requise pour exécuter le script.
Aucune option n'est requise pour exécuter le script.
## CONFIGURATION
# CONFIGURATION
Le script peut lire la configuration à partir d'un fichier de configuration situé dans le répertoire `~/.config/`. Si le fichier de configuration n'existe pas, il sera créé avec un commentaire indiquant la date de création.
## CONFIGURATION DU CHEMIN DU JINGLE
Le chemin du jingle est configuré par la variable `jingle_tophoraire`. Si cette variable n'est pas définie dans le fichier de configuration, elle sera initialisée avec le chemin par défaut du jingle.
## LECTURE DU JINGLE EN ARRIÈRE-PLAN
Une fois le chemin du jingle configuré, le script utilise la commande `paplay` pour lire le jingle en arrière-plan.
## ANNONCE DE L'HEURE ACTUELLE
Le script obtient l'heure actuelle et crée un message d'annonce contenant l'heure. Il utilise ensuite la commande `espeak-ng` pour annoncer l'heure en français.
# EXEMPLES
@@ -38,10 +35,17 @@ Pour exécuter le script sans aucune option :
top_horaire
```
## AUTEUR
Ce script a été créé par Cédric Abonnel.
# AUTEURS
Cédric Abonnel - \<canl.sb2023@acemail.fr>
# VERSIONS
-23.12.1
: Version originale
# RAPPORT D'ERREURS
## RAPPORT D'ERREURS
Pour signaler des erreurs ou des problèmes : https://git.abonnel.fr/cedricAbonnel/scripts-bash
# VOIR AUSSI

View File

@@ -1,32 +1,43 @@
# playlist_gen(1) - Génère une playlist M3U à partir de fichiers audio
\
## SYNOPSIS
# NOM
**playlist_gen** [-n \<nombre de fichiers\>] [-d \<répertoire\>] [-o \<fichier de sortie\>]
playlist_gen - Génère une playlist M3U à partir de fichiers audio
## DESCRIPTION
# SYNOPSIS
**playlist_gen** est un script Bash qui permet de générer une playlist M3U à partir de fichiers audio situés dans un répertoire spécifié.
playlist_gen [-n \<nombre de fichiers\>] [-d \<répertoire\>] [-o \<fichier de sortie\>]
## OPTIONS
# DESCRIPTION
- **-n \<nombre de fichiers\>** : Spécifie le nombre de fichiers à inclure dans la playlist. Par défaut, le nombre de fichiers est 100.
playlist_gen est un script Bash qui permet de générer une playlist M3U à partir
de fichiers audio situés dans un répertoire spécifié.
- **-d \<répertoire\>** : Spécifie le répertoire à scanner pour les fichiers audio. Par défaut, le répertoire actuel est utilisé.
# OPTIONS
- **-o \<fichier de sortie\>** : Spécifie le nom du fichier M3U de sortie. Par défaut, le fichier est créé dans le répertoire de la musique de l'utilisateur.
-n
: Spécifie le nombre de fichiers à inclure dans la playlist. Par défaut, le
nombre de fichiers est 100.
## UTILISATION
-d
: Spécifie le répertoire à scanner pour les fichiers audio. Par défaut, le
répertoire actuel est utilisé.
-o
: Spécifie le nom du fichier M3U de sortie. Par défaut, le fichier est créé
dans le répertoire de la musique de l'utilisateur.
# UTILISATION
```
playlist_gen -n 50 -d /chemin/vers/repertoire -o playlist.m3u
```
## COMPATIBILITÉ
# COMPATIBILITÉ
Ce script est compatible avec les fichiers audio aux formats MP3, Opus, Ogg et M4A.
## EXEMPLES
# EXEMPLES
1. Générer une playlist M3U à partir du répertoire de musique par défaut de l'utilisateur :
@@ -40,11 +51,16 @@ Ce script est compatible avec les fichiers audio aux formats MP3, Opus, Ogg et M
playlist_gen -n 25 -d /chemin/vers/repertoire
```
## AUTEUR
# AUTEURS
Ce script a été écrit par Cédric Abonnel.
Cédric Abonnel - \<canl.sb2023@acemail.fr>
## RAPPORTS D'ERREURS
# VERSIONS
-23.12.1
: Version originale
# RAPPORTS D'ERREURS
Pour signaler des erreurs ou des problèmes : https://git.abonnel.fr/cedricAbonnel/scripts-bash

View File

@@ -1,39 +1,64 @@
random_music_player(1) - Lecteur de musique aléatoire en ligne de commande
\
## Synopsis
**random_music_player** [OPTIONS]
# NOM
## Description
Le script **random_music_player** est un lecteur de musique aléatoire en ligne de commande qui lit des fichiers audio à partir d'un répertoire spécifié.
random_music_player - Lecteur de musique aléatoire en ligne de commande
## Options
- Aucune option n'est requise.
# SYNOPSIS
random_music_player \[options\]
# DESCRIPTION
Le script **random_music_player** est un lecteur de musique aléatoire en ligne
de commande qui lit des fichiers audio à partir d'un répertoire spécifié.
# OPTIONS
Aucune option n'est requise.
# CONFIGURATION
Le script utilise un fichier de configuration situé à
`~/.config/random_music_player`. Si ce fichier de configuration n'existe pas,
il sera créé avec les paramètres par défaut suivants :
## Configuration
Le script utilise un fichier de configuration situé à `~/.config/random_music_player`. Si ce fichier de configuration n'existe pas, il sera créé avec les paramètres par défaut suivants :
```shell
# Fichier de configuration créé [date de création]
path_music_files=~/Music
volume=0.06
```
Vous pouvez éditer ce fichier de configuration pour personnaliser les réglages du lecteur de musique.
Vous pouvez éditer ce fichier de configuration pour personnaliser les réglages
du lecteur de musique.
## Utilisation
Pour utiliser le lecteur de musique aléatoire, exécutez simplement le script sans aucune option. Il sélectionnera au hasard un fichier audio à partir du répertoire spécifié dans le fichier de configuration et le lira.
# UTILISATION
Pour utiliser le lecteur de musique aléatoire, exécutez simplement le script
sans aucune option. Il sélectionnera au hasard un fichier audio à partir du
répertoire spécifié dans le fichier de configuration et le lira.
```shell
random_music_player
```
## Exemple
# EXEMPLE
```shell
$ random_music_player
```
## Auteur
Ce script a été créé par Cédric Abonnel.
# VERSIONS
## Rapport d'erreurs
Pour signaler des erreurs ou des problèmes : https://git.abonnel.fr/cedricAbonnel/scripts-bash
-23.12.1
: Version originale
# AUTEURS
Cédric Abonnel - \<canl.sb2023@acemail.fr>
# RAPPORT D'ERREUR
Pour signaler des erreurs ou des problèmes :
https://git.abonnel.fr/cedricAbonnel/scripts-bash

View File

@@ -0,0 +1,88 @@
.\" Automatically generated by Pandoc 3.1.3
.\"
.\" Define V font for inline verbatim, using C font in formats
.\" that render this, and otherwise B font.
.ie "\f[CB]x\f[]"x" \{\
. ftr V B
. ftr VI BI
. ftr VB B
. ftr VBI BI
.\}
.el \{\
. ftr V CR
. ftr VI CI
. ftr VB CB
. ftr VBI CBI
.\}
.TH "" "" "" "" ""
.hy
.PP
.PD 0
.P
.PD
.SH NOM
.PP
castopod_update - Mise à jour de CASTOPOD
.SH SYNOPSIS
.PP
castopod_update
.SH DESCRIPTION
.PP
Le script \f[B]castopod_update\f[R] permet de mettre à jour le dossier
Web de CASTOPOD en utilisant le fichier de mise à jour au format ZIP
fourni.
.SH OPTIONS
.PP
Aucune option n\[cq]est nécessaire pour exécuter le script.
.SH CONFIGURATION
.PP
Le script a sa propre configuration qui n\[cq]est pas modifiable.
.PP
Le dossier Web de CASTOPOD doit être nommé \f[V]castopod\f[R].
.PP
Le script doit être positionné au même niveau que le dossier Web de
CASTOPOD.
.PP
Le dossier \f[V]save_castopod\f[R] contient une copie des données de
CASTOPOD, qui est rafraîchie au début de l\[cq]exécution du script.
S\[cq]il n\[cq]existe pas, il sera créé.
.PP
L\[cq]archive de mise à jour doit être spécifiquement nommée
\f[V]castopod*.zip\f[R] et doit être positionnée au même niveau que le
script et le dossier Web de CASTOPOD.
.PP
Le script utilise \f[V]php8.1\f[R] pour effectuer des tâches de
maintenance.
.SH PRÉREQUIS
.PP
Téléchargez l\[cq]archive de mise à jour disponible sur le site
https://castopod.org/.
.SH EXEMPLES
.PP
Pour exécuter le script sans aucune option :
.IP
.nf
\f[C]
castopod_update
\f[R]
.fi
.SH AUTEURS
.PP
Cédric Abonnel - <canl.sb2023\[at]acemail.fr>
.SH VERSIONS
.TP
-23.12.14
Suppression de l\[cq]archive TAR du dossier \f[V]save_castopod\f[R].
.TP
-23.12.1
Messages des logs améliorés avec plus de détails lors de
l\[cq]utilisation de \f[V]cp\f[R].
.SH RAPPORT D\[cq]ERREURS
.PP
Pour signaler des erreurs ou des problèmes :
https://git.abonnel.fr/cedricAbonnel/scripts-bash
.SH REMARQUES
.PP
Ce script est fourni tel quel, sans aucune garantie.
Vous êtes libre de le modifier et de le distribuer selon les termes de
la licence applicable.

View File

@@ -16,29 +16,34 @@
.\}
.TH "" "" "" "" ""
.hy
.SH NOM
.PP
convertPDF(1) - Compresse des fichiers PDF pour gagner en volume et
génère le résultat d\[cq]un OCR
.SS SYNOPSIS
convertPDF - Compresse des fichiers PDF pour gagner en volume et génère
le résultat d\[cq]un OCR
.SH SYNOPSIS
.PP
\f[B]convertPDF\f[R]
.SS DESCRIPTION
convertPDF
.SH DESCRIPTION
.PP
Ce script convertit des fichiers PDF en d\[cq]autres formats tels que
JPG, TXT, et PDF en utilisant des outils comme \f[V]pdftocairo\f[R],
\f[V]pdftotext\f[R], \f[V]tesseract\f[R], et \f[V]convert\f[R].
.SS COMPATIBILITÉ
.SH COMPATIBILITÉ
.PP
Ce script est compatible avec les fichiers PDF (Portable Document
Format).
.SS EXEMPLE
.SH EXEMPLES
.PP
Convertir plusieurs fichiers PDF présent dans le dossier et
sous-dossiers courants : \f[V]convertPDF\f[R]
.SS AUTEUR
.SH VERSIONS
.TP
-23.12.1
Version originale
.SH AUTEURS
.PP
Ce script a été créé par Cédric Abonnel.
.SS RAPPORT D\[cq]ERREURS
Cédric Abonnel - <canl.sb2023\[at]acemail.fr>
.SH RAPPORT D\[cq]ERREURS
.PP
Pour signaler des erreurs ou des problèmes :
https://git.abonnel.fr/cedricAbonnel/scripts-bash

View File

@@ -16,38 +16,39 @@
.\}
.TH "" "" "" "" ""
.hy
.PP
.PD 0
.P
.PD
.SH NOM
.PP
top_horaire - Gestion du jingle et de l\[cq]annonce de l\[cq]heure
.SH SYNOPSIS
.PP
\f[B]top_horaire\f[R] [OPTION]
top_horaire
.SH DESCRIPTION
.PP
Le script \f[B]top_horaire\f[R] permet de gérer la lecture d\[cq]un
jingle en arrière-plan suivi de l\[cq]annonce de l\[cq]heure actuelle en
utilisant espeak-ng.
.SS OPTIONS
.IP \[bu] 2
.SH OPTIONS
.PP
Aucune option n\[cq]est requise pour exécuter le script.
.SS CONFIGURATION
.SH CONFIGURATION
.PP
Le script peut lire la configuration à partir d\[cq]un fichier de
configuration situé dans le répertoire \f[V]\[ti]/.config/\f[R].
Si le fichier de configuration n\[cq]existe pas, il sera créé avec un
commentaire indiquant la date de création.
.SS CONFIGURATION DU CHEMIN DU JINGLE
.PP
Le chemin du jingle est configuré par la variable
\f[V]jingle_tophoraire\f[R].
Si cette variable n\[cq]est pas définie dans le fichier de
configuration, elle sera initialisée avec le chemin par défaut du
jingle.
.SS LECTURE DU JINGLE EN ARRIÈRE-PLAN
.PP
Une fois le chemin du jingle configuré, le script utilise la commande
\f[V]paplay\f[R] pour lire le jingle en arrière-plan.
.SS ANNONCE DE L\[cq]HEURE ACTUELLE
.PP
Le script obtient l\[cq]heure actuelle et crée un message d\[cq]annonce
contenant l\[cq]heure.
@@ -62,10 +63,14 @@ Pour exécuter le script sans aucune option :
top_horaire
\f[R]
.fi
.SS AUTEUR
.SH AUTEURS
.PP
Ce script a été créé par Cédric Abonnel.
.SS RAPPORT D\[cq]ERREURS
Cédric Abonnel - <canl.sb2023\[at]acemail.fr>
.SH VERSIONS
.TP
-23.12.1
Version originale
.SH RAPPORT D\[cq]ERREURS
.PP
Pour signaler des erreurs ou des problèmes :
https://git.abonnel.fr/cedricAbonnel/scripts-bash

View File

@@ -16,42 +16,47 @@
.\}
.TH "" "" "" "" ""
.hy
.SH playlist_gen(1) - Génère une playlist M3U à partir de fichiers audio
.SS SYNOPSIS
.PP
\f[B]playlist_gen\f[R] [-n <nombre de fichiers>] [-d <répertoire>] [-o
<fichier de sortie>]
.SS DESCRIPTION
.PD 0
.P
.PD
.SH NOM
.PP
\f[B]playlist_gen\f[R] est un script Bash qui permet de générer une
playlist M3U à partir de fichiers audio situés dans un répertoire
spécifié.
.SS OPTIONS
.IP \[bu] 2
\f[B]-n <nombre de fichiers>\f[R] : Spécifie le nombre de fichiers à
inclure dans la playlist.
playlist_gen - Génère une playlist M3U à partir de fichiers audio
.SH SYNOPSIS
.PP
playlist_gen [-n <nombre de fichiers>] [-d <répertoire>] [-o <fichier de
sortie>]
.SH DESCRIPTION
.PP
playlist_gen est un script Bash qui permet de générer une playlist M3U à
partir de fichiers audio situés dans un répertoire spécifié.
.SH OPTIONS
.TP
-n
Spécifie le nombre de fichiers à inclure dans la playlist.
Par défaut, le nombre de fichiers est 100.
.IP \[bu] 2
\f[B]-d <répertoire>\f[R] : Spécifie le répertoire à scanner pour les
fichiers audio.
.TP
-d
Spécifie le répertoire à scanner pour les fichiers audio.
Par défaut, le répertoire actuel est utilisé.
.IP \[bu] 2
\f[B]-o <fichier de sortie>\f[R] : Spécifie le nom du fichier M3U de
sortie.
.TP
-o
Spécifie le nom du fichier M3U de sortie.
Par défaut, le fichier est créé dans le répertoire de la musique de
l\[cq]utilisateur.
.SS UTILISATION
.SH UTILISATION
.IP
.nf
\f[C]
playlist_gen -n 50 -d /chemin/vers/repertoire -o playlist.m3u
\f[R]
.fi
.SS COMPATIBILITÉ
.SH COMPATIBILITÉ
.PP
Ce script est compatible avec les fichiers audio aux formats MP3, Opus,
Ogg et M4A.
.SS EXEMPLES
.SH EXEMPLES
.IP "1." 3
Générer une playlist M3U à partir du répertoire de musique par défaut de
l\[cq]utilisateur :
@@ -74,10 +79,14 @@ playlist_gen -n 25 -d /chemin/vers/repertoire
\f[R]
.fi
.RE
.SS AUTEUR
.SH AUTEURS
.PP
Ce script a été écrit par Cédric Abonnel.
.SS RAPPORTS D\[cq]ERREURS
Cédric Abonnel - <canl.sb2023\[at]acemail.fr>
.SH VERSIONS
.TP
-23.12.1
Version originale
.SH RAPPORTS D\[cq]ERREURS
.PP
Pour signaler des erreurs ou des problèmes :
https://git.abonnel.fr/cedricAbonnel/scripts-bash

View File

@@ -17,20 +17,24 @@
.TH "" "" "" "" ""
.hy
.PP
random_music_player(1) - Lecteur de musique aléatoire en ligne de
commande
.SS Synopsis
.PD 0
.P
.PD
.SH NOM
.PP
\f[B]random_music_player\f[R] OPTIONS
.SS Description
random_music_player - Lecteur de musique aléatoire en ligne de commande
.SH SYNOPSIS
.PP
random_music_player [options]
.SH DESCRIPTION
.PP
Le script \f[B]random_music_player\f[R] est un lecteur de musique
aléatoire en ligne de commande qui lit des fichiers audio à partir
d\[cq]un répertoire spécifié.
.SS Options
.IP \[bu] 2
.SH OPTIONS
.PP
Aucune option n\[cq]est requise.
.SS Configuration
.SH CONFIGURATION
.PP
Le script utilise un fichier de configuration situé à
\f[V]\[ti]/.config/random_music_player\f[R].
@@ -47,7 +51,7 @@ volume=0.06
.PP
Vous pouvez éditer ce fichier de configuration pour personnaliser les
réglages du lecteur de musique.
.SS Utilisation
.SH UTILISATION
.PP
Pour utiliser le lecteur de musique aléatoire, exécutez simplement le
script sans aucune option.
@@ -59,17 +63,21 @@ spécifié dans le fichier de configuration et le lira.
random_music_player
\f[R]
.fi
.SS Exemple
.SH EXEMPLE
.IP
.nf
\f[C]
$ random_music_player
\f[R]
.fi
.SS Auteur
.SH VERSIONS
.TP
-23.12.1
Version originale
.SH AUTEURS
.PP
Ce script a été créé par Cédric Abonnel.
.SS Rapport d\[cq]erreurs
Cédric Abonnel - <canl.sb2023\[at]acemail.fr>
.SH RAPPORT D\[cq]ERREUR
.PP
Pour signaler des erreurs ou des problèmes :
https://git.abonnel.fr/cedricAbonnel/scripts-bash

View File

@@ -0,0 +1,9 @@
{
"database": {
"host": "changeme",
"dbname": "changeme",
"user": "changeme",
"password": "changeme"
}
}

View File

@@ -0,0 +1,38 @@
{
"definition_number": 1,
"versions": [
{
"version" : "2024.07.07-14.31",
"comment" : "Version initiale"
}
],
"author": "Cédrix pour a5l.fr",
"project": "scripts-bash/ytdll",
"tables": [
{
"name": "config",
"columns": [
{"name": "id", "type": "SERIAL PRIMARY KEY"},
{"name": "key", "type": "VARCHAR(255)"},
{"name": "value", "type": "VARCHAR(255)"}
]
},
{
"name": "feed_metadata",
"columns": [
{"name": "channel_id", "type": "VARCHAR(255) PRIMARY KEY"},
{"name": "author_name", "type": "VARCHAR(255)"},
{"name": "author_uri", "type": "VARCHAR(255)"}
]
},
{
"name": "entry_metadata",
"columns": [
{"name": "video_id", "type": "VARCHAR(255) PRIMARY KEY"},
{"name": "channel_id", "type": "VARCHAR(255)"},
{"name": "title", "type": "VARCHAR(255)"},
{"name": "author_name", "type": "VARCHAR(255)"}
]
}
]
}

View File

@@ -0,0 +1,91 @@
<?php
// Auteur : Cédrix pour a5l.fr
// Projet : scripts-bash/ytdll
// Version 2024.07.07-14.31
// Version initiale
class Config {
private $pdo;
private $database;
public function __construct(Database $database) {
$this->database = $database;
$this->pdo = $this->database->getPDO();
}
/**
* Set or update the version in the config table.
*
* @param string $version The version to set.
* @return bool True on success, false on failure.
*/
public function setVersionDefinitionsTables($version) {
try {
$stmt = $this->pdo->prepare("
INSERT INTO config (key, value)
VALUES ('versionDefinitionsTables', :version)
ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value
");
$stmt->execute(['version' => $version]);
} catch (PDOException $e) {
// Log the error or handle it appropriately
error_log('Error setting version: ' . $e->getMessage());
return false;
}
}
/**
* Get the current version from the config table.
*
* @return string|null The current version or null if not set.
*/
public function getVersionDefinitionsTables() {
try {
$stmt = $this->pdo->prepare("SELECT value FROM config WHERE key = 'versionDefinitionsTables'");
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
return $row ? $row['value'] : null;
} catch (PDOException $e) {
error_log("Database error: " . $e->getMessage());
// Return a default value or null
return null;
}
}
/**
* Get the current path Definitions Tables from the config table.
*
* @return string The current version or default path if not set.
*/
public function getPathDefinitionsTablesFile() {
$defaultPath = getenv('HOME') . "/.local/share/ytdll/definitionsTables.json";
return $defaultPath;
}
/**
* Verify database privileges by attempting to create and drop a test table.
*
* @return bool True if privileges are sufficient, false otherwise.
*/
public function verifyPrivileges() {
try {
$tableManager = new TableManager($this->database);
$tableManager->createTable('test_table', [
['name' => 'id', 'type' => 'SERIAL PRIMARY KEY'],
['name' => 'name', 'type' => 'VARCHAR(255)']
]);
$tableManager->dropTable('test_table');
return true;
} catch (PDOException $e) {
error_log("Erreur sur les privilèges d'accès à la base de données : " . $e->getMessage());
return false;
}
}
}

View File

@@ -0,0 +1,26 @@
<?php
class Database {
private $pdo;
public function __construct($config) {
$dsn = "pgsql:host={$config['host']};dbname={$config['dbname']}";
try {
$this->pdo = new PDO($dsn, $config['user'], $config['password'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
} catch (PDOException $e) {
die('Connection failed: ' . $e->getMessage());
}
}
public function getDefaultSchema() {
$query = "SELECT current_schema()";
$stmt = $this->pdo->query($query);
return $stmt->fetchColumn();
}
public function getPDO() {
return $this->pdo;
}
}

View File

@@ -0,0 +1,116 @@
<?php
// Auteur : Cédrix pour a5l.fr
// Projet : scripts-bash/ytdll
// Version 2024.07.07-14.31
// Version initiale
class TableManager {
private $pdo;
private $database;
// SGBD PostGreSQL 16
public function __construct(Database $database) {
$this->database = $database;
$this->pdo = $this->database->getPDO();
}
public function getTableColumns($tableName) {
if (!$this->tableExists($tableName)) {
return []; // Retourne un tableau vide si la table n'existe pas
}
$query = "SELECT column_name, data_type FROM information_schema.columns WHERE table_name = :table_name AND table_schema = :table_schema";
$stmt = $this->pdo->prepare($query);
$stmt->execute([
':table_name' => $tableName
]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
private function tableExists($tableName) {
$schema = $this->database->getDefaultSchema();
$query = "SELECT COUNT(*) FROM information_schema.tables WHERE table_name = :table_name AND table_schema = :table_schema";
$stmt = $this->pdo->prepare($query);
echo "Vérification de l'existence de la table : $tableName\n";
$stmt->execute([
':table_name' => $tableName,
':table_schema' => $schema
]);
return $stmt->fetchColumn() > 0;
}
public function processTables($tables) {
foreach ($tables as $table) {
$this->processTable($table);
}
}
private function processTable($table) {
$tableName = $table['name'];
$columns = $table['columns'];
$existingColumns = $this->getTableColumns($tableName);
if (empty($existingColumns) && !$this->tableExists($tableName)) {
$this->createTable($tableName, $columns);
return;
}
$existingColumnsMap = [];
foreach ($existingColumns as $column) {
$existingColumnsMap[$column['column_name']] = $column['data_type'];
}
foreach ($columns as $column) {
$columnName = $column['name'];
$columnType = $column['type'];
if (isset($existingColumnsMap[$columnName])) {
if ($existingColumnsMap[$columnName] !== $columnType) {
$this->alterColumnType($tableName, $columnName, $columnType);
}
unset($existingColumnsMap[$columnName]);
} else {
$this->addColumn($tableName, $columnName, $columnType);
}
}
foreach ($existingColumnsMap as $columnName => $columnType) {
$this->dropColumn($tableName, $columnName);
}
}
public function createTable($tableName, $columns) {
$columnsSql = [];
foreach ($columns as $column) {
$columnsSql[] = "{$column['name']} {$column['type']}";
}
$columnsSql = implode(", ", $columnsSql);
$sql = "CREATE TABLE $tableName ($columnsSql)";
$this->pdo->exec($sql);
}
public function dropTable($tableName) {
$sql = "DROP TABLE IF EXISTS $tableName";
$this->pdo->exec($sql);
}
private function alterColumnType($tableName, $columnName, $columnType) {
$sql = "ALTER TABLE $tableName ALTER COLUMN $columnName TYPE $columnType USING $columnName::$columnType";
$this->pdo->exec($sql);
}
private function addColumn($tableName, $columnName, $columnType) {
$sql = "ALTER TABLE $tableName ADD COLUMN $columnName $columnType";
$this->pdo->exec($sql);
}
private function dropColumn($tableName, $columnName) {
$sql = "ALTER TABLE $tableName DROP COLUMN $columnName";
$this->pdo->exec($sql);
}
}

View File

@@ -0,0 +1,48 @@
<?PHP
// Auteur : Cédrix pour a5l.fr
// Projet : scripts-bash/ytdll
// Version 2024.07.07-14.31
// Version initiale
class UpdateManager {
private $pdo;
private $database;
public function __construct($database) {
$this->database = $database;
$this->pdo = $this->database->getPDO();
}
public function manageVersionTables() {
$configManager = new Config($this->database);
// Obtenir le numéro de version dans le fichier de définitions de table
$definitionsTablesFile = json_decode(file_get_contents($configManager->getPathDefinitionsTablesFile()), true);
$newDefinitionNumber = $definitionsTablesFile['definition_number'];
// Obtenir le numéro de version des Tables en base
$currentDefinitionNumber = $configManager->getVersionDefinitionsTables();
if ($currentDefinitionNumber !== null) {
echo 'Version not set or an error occurred.';
$currentDefinitionNumber = 0;
}
$tables = $definitionsTablesFile['tables'];
if ($newDefinitionNumber > $currentDefinitionNumber) {
$tableManager = new TableManager($this->database);
$tableManager->processTables($tables);
$configManager->setVersionDefinitionsTables($newDefinitionNumber);
if ($currentDefinitionNumber == 0) {
echo "Tables created successfully.";
} else {
echo "Tables updated successfully from $currentDefinitionNumber to $newDefinitionNumber.";
}
}
}
}

39
prep.sh
View File

@@ -1,5 +1,16 @@
#!/bin/bash
# Script Bash - prep.sh
# Auteur : Cédric Abonnel
# Description : Prépare les fichiers de DOC et listing.
# Version 07.07.24
# - Ajout du traitement de ytdll
# Version 23.12.14
# - Modification du traitement des résumés des DOC. La fonctionnalité n'est pas encore accessible.
# Spécifier le chemin du fichier journal
log_dir="$HOME/log"
@@ -40,6 +51,7 @@ ls local/bin/ -c1 >.config/files_local-bin
# 1. Lister des fichiers dans local/share/doc
# 2. Générer les fichiers man dans local/share/man
# 3. Lister des fichiers dans local/share/man
# 4. Lister des fichiers dans local/share/ytdll et share/ytdll/lib
# Spécifier le chemin du répertoire du dépôt Git local
source_dir="local/share/doc"
@@ -105,13 +117,36 @@ fi
log "Lister les fichiers présents dans local/share/man"
ls local/share/man/ -c1 >.config/files_local-share-man
log "Lister les fichiers présents dans local/share/ytdll"
ls local/share/ytdll/ -c1 >.config/files_local-share-ytdll
log "Lister les fichiers présents dans local/share/ytdll/lib"
ls local/share/ytdll/lib/ -c1 >.config/files_local-share-ytdll-lib
########
# Résumé des DOC
## Résumé des DOC
for fichier in local/share/doc/*.md; do
echo "Résumé pour $fichier :"
awk '/DESCRIPTION/{flag=1; next} /^$/{flag=0} flag' "$fichier"
description_found=0
empty_line_encountered=false
description_started=0
while IFS= read -r ligne; do
if [ "$description_found" -eq 1 ] && [ "$description_started" -eq 1 ] && [ -n "$ligne" ]; then
echo "$ligne"
elif [ "$description_found" -eq 1 ] && [ "$description_started" -eq 0 ] && [ -n "$ligne" ]; then
echo "$ligne"
description_started=1
elif [ "$description_found" -eq 1 ] && [ "$description_started" -eq 1 ] && [ ! -n "$ligne" ]; then
break
elif [ "$ligne" = "# DESCRIPTION" ]; then
description_found=1
fi
done < "$fichier"
echo "..."
done