Compare commits
43 Commits
e9aa5d3ff8
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 2629dd832c | |||
| 2ceb4be24f | |||
| 615e9595cf | |||
| 8bdbfd8b93 | |||
| ab81c71b7d | |||
| 8315bddba6 | |||
| 278e40439d | |||
| 0629b4a616 | |||
| 516df5809c | |||
| eb8bf3ed38 | |||
| 34e7b33357 | |||
| 7f7c74c288 | |||
| 83e524aee3 | |||
| 8cae67dde9 | |||
| 91588d842e | |||
| bd0dbf5bde | |||
| bb001830e4 | |||
| 9dc0dcea7f | |||
| 52581030f8 | |||
| 6b67f264e6 | |||
| 2349139ced | |||
| 2a64bc6d01 | |||
| e7f4ff842e | |||
| fe642e74ec | |||
| 8cd6407721 | |||
| 11ce999181 | |||
| 03a2e899a3 | |||
| 9cfa91532b | |||
| 572bb05afc | |||
| 73c36ee624 | |||
|
|
8eb8f661ae | ||
| fb062731fe | |||
| 3954579449 | |||
| 2822bcbec3 | |||
| 53890fc4c4 | |||
| 0f003a6bb5 | |||
| 42f290b7ae | |||
| 0eaaa2b588 | |||
| 76072f28d8 | |||
| 29bab4ceaa | |||
| 5e643dc792 | |||
| d901311f24 | |||
| d07469b06c |
15
.config/files_local-bin
Normal file
15
.config/files_local-bin
Normal file
@@ -0,0 +1,15 @@
|
||||
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
|
||||
convertPDF.sh
|
||||
check_domain_cert.sh
|
||||
@@ -1,4 +1,5 @@
|
||||
play_tophoraire.1.md
|
||||
convertPDF.1.md
|
||||
castopod_update.1.md
|
||||
random_music_player.1.md
|
||||
playlist_gen.1.md
|
||||
convertPDF
|
||||
@@ -1,4 +1,5 @@
|
||||
convertPDF
|
||||
playlist_gen.1
|
||||
random_music_player.1
|
||||
castopod_update.1
|
||||
convertPDF.1
|
||||
play_tophoraire.1
|
||||
3
.config/files_local-share-ytdll
Normal file
3
.config/files_local-share-ytdll
Normal file
@@ -0,0 +1,3 @@
|
||||
definitionsTables.json
|
||||
lib
|
||||
config.json
|
||||
4
.config/files_local-share-ytdll-lib
Normal file
4
.config/files_local-share-ytdll-lib
Normal file
@@ -0,0 +1,4 @@
|
||||
UpdateManager.php
|
||||
Config.php
|
||||
TableManager.php
|
||||
Database.php
|
||||
33
README.md
33
README.md
@@ -1,27 +1,36 @@
|
||||
# scripts-bash
|
||||
Some bash scripts
|
||||
Quelques scripts Bash
|
||||
|
||||
Le script `install.sh` a été créé pour automatiser le processus de copie de fichiers depuis un dépôt Git local vers un répertoire local, en préservant la structure des fichiers et en renommant les fichiers pour supprimer leurs extensions. Le script a également la capacité d'ajouter le répertoire de destination au chemin d'accès (PATH) de l'utilisateur.
|
||||
Le script `install.sh` a été conçu pour automatiser le processus de copie de fichiers depuis un dépôt Git local vers un répertoire local.
|
||||
Le script modifie également le chemin d'accès (PATH) de l'utilisateur ainsi que le chemin d'accès de man (MANPATH) de l'utilisateur.
|
||||
|
||||
## Utilisation
|
||||
Pour utiliser ces scripts, suivez ces étapes :
|
||||
|
||||
1. Clonez ce dépôt Git
|
||||
2. Assurez-vous que le script est exécutable en utilisant la commande `chmod +x copy_files.sh`.
|
||||
3. Exécutez le script en utilisant `./copy_files.sh`.
|
||||
1. Clonez ce dépôt Git.
|
||||
`git clone https://git.abonnel.fr/cedricAbonnel/scripts-bash.git`
|
||||
|
||||
Toutes les opérations et les messages d'erreur sont enregistrés dans un fichier journal (`~/log/copy_files.log`) situé dans le répertoire personnel de l'utilisateur. Le journal comprend la date, l'heure, le numéro de processus (PID) et les messages d'exécution du script.
|
||||
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.
|
||||
|
||||
Le chemin complet des fichiers copiés est enregistré de manière unique dans le fichier `~/.config/a5l_scripts-bash_uninstall-list`.
|
||||
|
||||
## Documentation
|
||||
Le dossier `local/share/doc` contient la documentation de chaque script.
|
||||
|
||||
Le dossier `local/share/man/man1` contient la documentation de chaque script au format MAN.
|
||||
|
||||
## Désinstallation
|
||||
Le script `uninstall.sh` permet de supprimer tous les fichiers précédemment copiés avec le script `install.sh`, en se basant sur le fichier utilisateur `~/.config/a5l_scripts-bash_uninstall-list`.
|
||||
|
||||
# License
|
||||
Shield: [![CC BY-SA 4.0][cc-by-sa-shield]][cc-by-sa]
|
||||
|
||||
This work is licensed under a
|
||||
[Creative Commons Attribution-ShareAlike 4.0 International License][cc-by-sa].
|
||||
# Licence
|
||||
Ce travail est sous licence [Creative Commons Attribution-ShareAlike 4.0 International License][cc-by-sa] par Cédric Abonnel.
|
||||
|
||||
[![CC BY-SA 4.0][cc-by-sa-image]][cc-by-sa]
|
||||
|
||||
[cc-by-sa]: http://creativecommons.org/licenses/by-sa/4.0/
|
||||
[cc-by-sa-image]: https://licensebuttons.net/l/by-sa/4.0/88x31.png
|
||||
[cc-by-sa-shield]: https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg
|
||||
|
||||
Test
|
||||
@@ -1,7 +0,0 @@
|
||||
play_tophaire.sh
|
||||
mkv_extract.sh
|
||||
generate_playlist.sh
|
||||
install_check_update.sh
|
||||
convertPDF.sh
|
||||
check_domain_cert.sh
|
||||
convertMKV.sh
|
||||
233
install.sh
233
install.sh
@@ -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() {
|
||||
@@ -30,14 +51,125 @@ create_dir() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
add_uninstall() {
|
||||
## Create or update uninstall script
|
||||
|
||||
uninstall_list=$HOME/.config/a5l_scripts-bash_uninstall-list
|
||||
test -f "${uninstall_list}" || touch "${uninstall_list}"
|
||||
|
||||
local fichier_a_supprimer="$1"
|
||||
|
||||
# Vérifier si le fichier de suppression existe déjà dans uninstall_script
|
||||
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}
|
||||
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"
|
||||
|
||||
log "Rafraichissement des listes de fichiers"
|
||||
|
||||
|
||||
|
||||
@@ -51,31 +183,12 @@ destination_dir="$HOME/.local/share/doc"
|
||||
# Spécifier le chemin du répertoire du dépôt Git local
|
||||
source_dir="local/share/doc"
|
||||
|
||||
file_local_desc=files_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"
|
||||
rsync -av --files-from="$file_local_desc" "$source_dir/" "$destination_dir/" >> "$log_file" 2>&1 || error "Échec de la copie avec rsync"
|
||||
|
||||
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"
|
||||
|
||||
|
||||
|
||||
@@ -84,46 +197,27 @@ fi
|
||||
|
||||
## Declarations ##
|
||||
|
||||
# Spécifier le chemin du répertoire ~/.local/bin
|
||||
destination_dir="$HOME/.local/share/man/man1"
|
||||
# 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
|
||||
source_dir="local/share/man"
|
||||
|
||||
file_local_desc=files_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"
|
||||
rsync -av --files-from="$file_local_desc" "$source_dir/" "$destination_dir/" >> "$log_file" 2>&1 || error "Échec de copie"
|
||||
|
||||
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"
|
||||
|
||||
|
||||
|
||||
@@ -131,52 +225,31 @@ 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
|
||||
source_dir="local/bin"
|
||||
|
||||
file_local_desc=files_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
|
||||
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"
|
||||
rsync -av --files-from=$file_local_desc "$source_dir/" "$destination_dir/" >> "$log_file" 2>&1 || error "Échec de la copie avec rsync"
|
||||
log "## Fin du script. Bonne continuation."
|
||||
|
||||
# Renommez les fichiers en supprimant les extensions
|
||||
for file in $fileslist_local; do
|
||||
if [ -f "$destination_dir/$file" ]; then
|
||||
new_name="${file%.*}" # Supprimer l'extension
|
||||
mv -v "$destination_dir/$file" "$destination_dir/$new_name" || error "Impossible de renommer le fichier $file en $new_name"
|
||||
log " __ Renommer $file -> $new_name."
|
||||
fi
|
||||
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."
|
||||
|
||||
87
local/bin/castopod_update.sh
Normal file
87
local/bin/castopod_update.sh
Normal file
@@ -0,0 +1,87 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script Bash - castopod_update.sh
|
||||
# Auteur : Cédric Abonnel
|
||||
|
||||
# Description : Script de mise à jour Castopod
|
||||
|
||||
# Version 23.12.14
|
||||
|
||||
# Definitions
|
||||
rep_save="save_castopod"
|
||||
sources_save=("castopod/public/media" "castopod/.env")
|
||||
php_bin="/usr/bin/php8.1"
|
||||
castopod_root="castopod"
|
||||
|
||||
|
||||
echo " -- "
|
||||
|
||||
# Synchroniser les fichiers sources avec le dossier de sauvegarde
|
||||
mkdir -vp "$rep_save/"
|
||||
echo " -- "
|
||||
|
||||
echo "Sauvegarde des fichiers medias"
|
||||
|
||||
# Parcourir le tableau des sources de sauvegarde
|
||||
for source in "${sources_save[@]}"; do
|
||||
# Afficher la source de sauvegarde
|
||||
echo "Source de sauvegarde : $source"
|
||||
|
||||
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 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
|
||||
"$php_bin" castopod/spark castopod:database-update
|
||||
|
||||
|
||||
else
|
||||
echo "Aucune archive ZIP commençant par 'castopod' trouvée. Pas de mise à jour."
|
||||
fi
|
||||
|
||||
echo " -- "
|
||||
|
||||
28
local/bin/check_sha256.sh
Executable file
28
local/bin/check_sha256.sh
Executable 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
99
local/bin/check_smart.sh
Executable 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"
|
||||
@@ -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
|
||||
|
||||
@@ -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,18 +83,134 @@ 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\""
|
||||
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")
|
||||
count=0
|
||||
|
||||
# Création de la liste des fichiers audio les plus récents à partir du fichier temporaire
|
||||
sort -n -r -o "$temp_file" "$temp_file"
|
||||
head -n "$num_files" "$temp_file" | awk '{print $2}' > "$output_file"
|
||||
# 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")
|
||||
|
||||
# Création de la liste des fichiers audio les plus récents à partir du fichier temporaire
|
||||
sort -n -r -o "$temp_file" "$temp_file"
|
||||
head -n "$num_files" "$temp_file" | awk '{print $2}' > "$output_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 ..."
|
||||
|
||||
# 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 "$temp_file"
|
||||
rm -v "$temp_file"
|
||||
|
||||
echo "Le fichier M3U a été créé avec les $num_files fichiers audio les plus récents dans le répertoire $directory : $output_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"
|
||||
|
||||
217
local/bin/generate_playlist_fp.php
Normal file
217
local/bin/generate_playlist_fp.php
Normal 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";
|
||||
|
||||
?>
|
||||
@@ -1,50 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Définir les chemins vers les fichiers
|
||||
update_script=/usr/local/bin/check-update
|
||||
update_file=/var/update_file
|
||||
bashrc=/etc/profile
|
||||
|
||||
# Créer le fichier de script de mise à jour
|
||||
echo "#!/bin/bash
|
||||
|
||||
# Stocker la sortie de la commande de mise à jour dans un fichier
|
||||
dnf check-update
|
||||
dnf check-update > $update_file" > $update_script
|
||||
|
||||
# Rendre le script exécutable
|
||||
chmod +x $update_script
|
||||
|
||||
# Créer le fichier d'info
|
||||
touch $update_file
|
||||
chmod 644 $update_file
|
||||
|
||||
# Vérifier si le script est déjà présent dans la table cron
|
||||
if ! (crontab -l | grep $update_script > /dev/null); then
|
||||
# Ajouter le script à la tâche cron
|
||||
(crontab -l 2>/dev/null; echo "0 */1 * * * $update_script") | crontab -
|
||||
fi
|
||||
|
||||
# Vérifier si le code pour afficher les mises à jour est déjà présent dans .bashrc
|
||||
if ! (grep "594f33f0-ab2f-11ed-afa1-0242ac120002/abonnel.fr" $bashrc > /dev/null); then
|
||||
# Ajouter le code pour afficher les mises à jour au fichier .bashrc
|
||||
echo '
|
||||
# -- VERIFIER LES MISES A JOUR DISPO --
|
||||
# Script id 594f33f0-ab2f-11ed-afa1-0242ac120002/abonnel.fr
|
||||
|
||||
# Définir le chemin vers le fichier de mise à jour
|
||||
update_file=/var/update_file
|
||||
|
||||
# Vérifier si le fichier de mise à jour existe
|
||||
if [ -f $update_file ]; then
|
||||
# Compter le nombre de mises à jour
|
||||
updates=$(($(wc -l < $update_file) - 1))
|
||||
# Afficher le nombre de mises à jour en attente
|
||||
echo "Il y a $updates mise(s) à jour en attente."
|
||||
fi
|
||||
' >> $bashrc
|
||||
fi
|
||||
|
||||
# Recharger le fichier .bashrc
|
||||
source $bashrc
|
||||
|
||||
35
local/bin/podcast_convertImage.sh
Executable file
35
local/bin/podcast_convertImage.sh
Executable file
@@ -0,0 +1,35 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Vérifier si ImageMagick est installé
|
||||
if ! command -v convert &> /dev/null; then
|
||||
echo "ImageMagick n'est pas installé. Veuillez l'installer."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Vérifier si l'argument de l'image est fourni
|
||||
if [ $# -eq 0 ]; then
|
||||
echo "Usage: $0 <image_source>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Récupérer le nom du fichier source
|
||||
image_source="$1"
|
||||
|
||||
# Vérifier si le fichier source existe
|
||||
if [ ! -f "$image_source" ]; then
|
||||
echo "Le fichier source '$image_source' n'existe pas."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Utiliser la commande "file" pour vérifier le type de fichier
|
||||
if ! file "$image_source" | grep -q "image"; then
|
||||
echo "Le fichier '$image_source' n'a pas l'air d'être une image. Je tente le coup quand même."
|
||||
fi
|
||||
|
||||
# Enlever l'extension du nom de fichier
|
||||
filename_no_extension="${image_source%.*}"
|
||||
|
||||
# Redimensionner l'image en 1400x1400 pixels et la convertir en JPG
|
||||
convert "$image_source" -resize 1400x1400 "${filename_no_extension}.jpg"
|
||||
|
||||
echo "L'image a été redimensionnée en 1400x1400 pixels et enregistrée en tant que '${filename_no_extension}.jpg'."
|
||||
149
local/bin/setup_server_debian.sh
Executable file
149
local/bin/setup_server_debian.sh
Executable 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"
|
||||
77
local/bin/update_bullseye2buster.sh
Normal file
77
local/bin/update_bullseye2buster.sh
Normal 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
189
local/bin/updateall.sh
Executable 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
164
local/bin/ytdll
Executable 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();
|
||||
72
local/share/doc/castopod_update.1.md
Normal file
72
local/share/doc/castopod_update.1.md
Normal 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.
|
||||
@@ -1,23 +0,0 @@
|
||||
convertPDF(1) - Compresse des fichiers PDF pour gagner en volume et génère le résultat d'un OCR
|
||||
|
||||
## 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
|
||||
Convertir plusieurs fichiers PDF présent dans le dossier et sous-dossiers courants :
|
||||
```
|
||||
convertPDF
|
||||
```
|
||||
|
||||
## AUTEUR
|
||||
Ce script a été créé par Cédric Abonnel.
|
||||
|
||||
## RAPPORT D'ERREURS
|
||||
Pour signaler des erreurs ou des problèmes : https://git.abonnel.fr/cedricAbonnel/scripts-bash
|
||||
39
local/share/doc/convertPDF.1.md
Normal file
39
local/share/doc/convertPDF.1.md
Normal file
@@ -0,0 +1,39 @@
|
||||
|
||||
# NOM
|
||||
|
||||
convertPDF - Compresse des fichiers PDF pour gagner en volume et génère le résultat d'un OCR
|
||||
|
||||
# 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).
|
||||
|
||||
# EXEMPLES
|
||||
|
||||
Convertir plusieurs fichiers PDF présent dans le dossier et sous-dossiers courants :
|
||||
```
|
||||
convertPDF
|
||||
```
|
||||
|
||||
# VERSIONS
|
||||
|
||||
-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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
88
local/share/man/castopod_update.1
Normal file
88
local/share/man/castopod_update.1
Normal 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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
9
local/share/ytdll/config.json
Normal file
9
local/share/ytdll/config.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"database": {
|
||||
"host": "changeme",
|
||||
"dbname": "changeme",
|
||||
"user": "changeme",
|
||||
"password": "changeme"
|
||||
}
|
||||
|
||||
}
|
||||
38
local/share/ytdll/definitionsTables.json
Normal file
38
local/share/ytdll/definitionsTables.json
Normal 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)"}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
91
local/share/ytdll/lib/Config.php
Normal file
91
local/share/ytdll/lib/Config.php
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
26
local/share/ytdll/lib/Database.php
Normal file
26
local/share/ytdll/lib/Database.php
Normal 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;
|
||||
}
|
||||
}
|
||||
116
local/share/ytdll/lib/TableManager.php
Normal file
116
local/share/ytdll/lib/TableManager.php
Normal 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);
|
||||
}
|
||||
}
|
||||
48
local/share/ytdll/lib/UpdateManager.php
Normal file
48
local/share/ytdll/lib/UpdateManager.php
Normal 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.";
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
53
prep.sh
53
prep.sh
@@ -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"
|
||||
@@ -33,13 +44,14 @@ create_dir() {
|
||||
|
||||
|
||||
log "Lister les fichiers présents dans local/bin"
|
||||
ls local/bin/ -c1 >files_local-bin
|
||||
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"
|
||||
@@ -50,11 +62,11 @@ destination_dir="local/share/man"
|
||||
create_dir "$destination_dir"
|
||||
|
||||
log "Lister les fichiers présents dans local/share/doc"
|
||||
ls "$source_dir/" -c1 >files_local-share-doc
|
||||
ls "$source_dir/" -c1 >.config/files_local-share-doc
|
||||
|
||||
log "Creer les pages MAN"
|
||||
|
||||
file_local_desc=files_local-share-doc
|
||||
file_local_desc=.config/files_local-share-doc
|
||||
|
||||
# Répertoire local/share/man
|
||||
## Vérifier si Pandoc est installé
|
||||
@@ -103,5 +115,38 @@ else
|
||||
fi
|
||||
|
||||
log "Lister les fichiers présents dans local/share/man"
|
||||
ls local/share/man/ -c1 >files_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
|
||||
|
||||
|
||||
for fichier in local/share/doc/*.md; do
|
||||
echo "Résumé pour $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
|
||||
|
||||
|
||||
20
uninstall.sh
Executable file
20
uninstall.sh
Executable file
@@ -0,0 +1,20 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Chemin du fichier uninstall-list
|
||||
uninstall_list_file=$HOME/.config/a5l_scripts-bash_uninstall-list
|
||||
|
||||
# Vérifie si le fichier uninstall-list existe
|
||||
if [ -e $uninstall_list_file ]; then
|
||||
# Parcourt le fichier ligne par ligne
|
||||
while IFS= read -r file; do
|
||||
if [ -e "$file" ]; then
|
||||
# Supprime le fichier
|
||||
rm -v "$file"
|
||||
fi
|
||||
done < "$uninstall_list_file"
|
||||
|
||||
rm -v "$uninstall_list_file"
|
||||
else
|
||||
echo "Le fichier $uninstall_list_file n'existe pas."
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user