25 Commits

Author SHA1 Message Date
dbb36fae15 photo_du_mois.sh
minor corrections
2025-11-28 09:31:25 +01:00
839d05bfbb 27-08-2025 2025-08-27 09:14:20 +02:00
947698f00b handbrake_for_plex.sh
shellcheck.sh
2025-03-06 14:24:48 +01:00
0e6f7c5196 handbrake_for_plex.sh
-si une nouvelle version de handbrakeCLI est disponible, on affiche les nouveautés
2025-02-28 20:49:45 +01:00
b264b99cf0 handbrake_for_plex.sh
-mise-à-jour de handbrakeCli depuis Github
2025-02-28 10:50:34 +01:00
32c1293017 v1.5
Ajout:
-aide
-tri les dossiers mensuels dans des dossiers annuels
2025-02-08 20:10:59 +01:00
b7f9d9aac7 API ovh 2025-02-08 07:24:01 +01:00
fef1ced910 sort_export_folder.sh
tri les photos d’un dossier et les déplace dans des dossiers mensuels
2025-02-08 07:22:10 +01:00
b31f31c17f stacks.sh
Backup des docker-compose.yml et des .env sur le NAS
2024-12-29 19:58:24 +01:00
df32b22fd3 Gotify
fonction send_gotify_notification()
2024-08-25 18:50:36 +02:00
1245ea5a5c Pushover
# ./pushover.sh  -t "Pushover via Bash" -m "Pushover message sent with bash from $(hostname -f)" -p1  -s siren -u http://www.google.com -n "Google"
2024-08-25 18:49:58 +02:00
e14588d06e 25-08-2024 2024-08-25 18:47:43 +02:00
aaf3776e62 22-08-2024 2024-08-22 08:44:15 +02:00
4675acdd0d 05-08-2024 2024-08-05 23:24:18 +02:00
e85e16190f photos-du-mois.sh
-replace clicclac.synology.me by photos-nas.ovh
-minor corrections
2024-04-12 10:26:06 +02:00
1415706fec handbrake_for_plesk.sh 2024-01-09 17:55:05 +01:00
7ab0771eb9 Bugfix 2023-11-16 16:43:13 +01:00
f37dbcf4d0 upgrade_nextcloud.sh
-some bugfixs
2023-11-14 20:24:20 +01:00
d6439437e1 photo-du-mois.sh
-display more recent picture on each server
2023-11-14 20:23:25 +01:00
17a975effa handbrake_for_plex.sh
bugfix with chapters
2023-07-21 09:57:28 +02:00
ef91f1a68e handbrake_for_plex.sh
-support subtitle track
2023-04-13 11:42:28 +02:00
c2ece3fefc photo_du_mois.sh
-bugfix
2023-04-11 12:36:55 +02:00
d8aa2777be 12-03-2023 2023-03-12 17:56:29 +01:00
ade806d162 handbrake_for_plex.sh
-capitalize series’s name
2022-09-01 15:10:24 +02:00
76bc76a872 handbrake_for_plex.sh
-bugfix delete file on linux
2022-08-07 07:27:52 +02:00
33 changed files with 2791 additions and 296 deletions

View File

@@ -1,17 +1,75 @@
# README
# Scripts bash
Collection of various bash scripts.
## Getting Started
- **apache_tools.sh**: Edit Apache/PHP/MySQL configurations files, restart Apache, view Log files, switch PHP version
- **backup-conf.sh**: Backup several files and folders and send them on 2 servers (rsync)
- **api_deepl.sh**: Translate text to another language using DeepL API (function translate). Require a $DEEPL_KEY.
- **api-ovh.sh**:
- **backup-conf.sh**: Backup several files and folders and send them on 2 servers (rsync). (uses GPG2 to encrypt certain files)
- **backup_conf.sh**: Copy several .conf files on Mac to destination folder
- **backup_Joplin.sh**: Backup all Joplin notes
- **backup_mysql.sh**: Sauvegarde toutes les bases MySQL et les envoie sur 2 serveurs (rsync).
- **bash_tools.sh**: Edit/backup/restore .bash_profile file
- **install_adobe_apps.sh**: installe les apps Adobe (Lightroom, Photoshop) depuis les srveurs Adobe.
- ! **backup_mysql.sh**: Sauvegarde toutes les bases MySQL et les envoie sur 2 serveurs (rsync). (use gpg to decrypt MySQL conf file)
- ! **backup_vps.sh**: Backup files/folders on VPS server and send them to NAS and OVH with rsync.
- **bash_tools.sh**: Edit/backup/restore .bash_profile file.
- **convert-videos-for-plex.sh**: Obsolete. Replaced by **handbrake_for_plex.sh**
- **crypt.sh**: encrypt/decrypt password with openssl. .env file usage.
- curl.sh:
- **curl2.sh**: upload content folder to OVH using curl.(!! PASSWD)
- **exiftool.sh**: display or remove EXIF from picture. (Error !!!)
- **git_reachable.sh**: test if a repo git is reachable.
- **git-sparse.sh**: function git-scp (Error !!!)
- **handbrake_for_plex.sh**:
- **iconv.sh**: converts keywords from utf-8 to ASCII
- **install_adobe_apps.sh**: installe les apps Adobe (Lightroom, Photoshop) depuis les serveurs Adobe.
- **latest_release_on_github.sh**: retrieve the latest release from a GitHub repo with the API.
- **mbv-gitea-upd.sh**: met à jour Gitea sur maboiteverte.fr
- **mkbuild.sh**: Build MkDocs project and send him on 2 servers (rsync)
- **syno-cron-gitea-update.sh**: met à jour Gitea sur le NAS Syno
- **ovh_api.sh:** OVH API usage (functions: add_cname, remove_cname, refresh, export_zone)(require OVH_CONSUMER_KEY, OVH_APP_KEY, OVH_APP_SECRET)
- ! **photo_du_mois.sh**:
- **purge_server.sh**: libère de la place sur le VPS 1and1
- **reachable.sh**: vérifie si les serveurs sont joignables avec ping, nc & nmap
- **remote_scripts.sh**: exécute des scripts via ssh sur maboiteverte.fr
- **rename_series.sh**: renomme les séries. Utilisé dans **handbrake_for_plex.sh**.
- **rsync-retry.sh**: runs rsync, retrying on errors up to a maximum number of tries.
- **run.sh**: menu pour lancer updates.sh, mkdocs serve, mkbuid.sh, photo_du_mois.sh
- **server.sh**: liste des serveurs/users/dest/port
- **sphp.sh**: change PHP version
- **sphp_php-fpm.sh**: change PHP -FPM version
- ssl-cert-info.sh:
- **syno-cron-gitea-update.sh**: met à jour Gitea (binaire) sur le NAS Syno.
- **thumbsup-npm.sh**: exécute `thumbsup --config="$config_file"` pour créer une galerie Thumbsup.
- **update_container.sh**: recherche les M-à-J de containers Docker.
- **upgrade_nextcloud.sh**: met à jour Nextcloud sur le NAS ou VPS.
- **urls_check.sh**: check if url is up or down (code 200|301|302\|303)
- **venv_solus.sh**: update apps in Python virtuals environments
- **zsh_tools.sh**: Edit/backup/restore .zshrc file
### Prerequisites
Requirements for the scripts: Bash
## Authors
- **Billie Thompson** - *Provided README Template* -
[PurpleBooth](https://github.com/PurpleBooth)
## License
This project is licensed under the [CC0 1.0 Universal](LICENSE.md)
Creative Commons License - see the [LICENSE.md](LICENSE.md) file for
details
-

215
apache_tools_v2.sh Executable file
View File

@@ -0,0 +1,215 @@
#!/usr/bin/env bash
underline="\033[4m"
red="\033[1;31m"
green="\033[1;32m"
yellow="\033[1;33m"
bold="\033[1m"
reset="\033[0m"
homebrew_path=$(brew --prefix)
editeur=/usr/local/bin/bbedit
# apache
v_apache=$(apachectl -v | sed -n '1p' | awk -F":" '{print $2}' | xargs)
conf_apache=$(httpd -V | grep 'SERVER_CONFIG_FILE' | awk -F "\"" '{print $2}')
document_root=$(grep -e '^DocumentRoot' "$conf_apache" | awk '{print $2}' | sed 's/\"//g')
log_apa=$(grep -e '^ErrorLog' "$conf_apache" | awk -F "\"" '{print $2}')
access_apa=$(grep -e 'CustomLog' "$conf_apache" | grep -v "#" | awk -F "\"" '{print $2}')
vhost=$(grep -e 'httpd-vhosts.conf' "$conf_apache" | awk '{print $2}')
ssl=$(grep -e 'httpd-ssl.conf' "$conf_apache" | awk '{print $2}')
config_apache=()
config_apache+=("$conf_apache")
config_apache+=("$vhost")
config_apache+=("$ssl")
# PHP
declare -a additionnal=()
add_ini() {
# Current php version (from httpd.conf)
ip=$(grep -E SetHandler $conf_apache | grep -v \# | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}:[0-9]{4}")
x=${ip: -2}
current_simple_php_version="${x:0:1}.${x:1}"
current_php_version="php@${x:0:1}.${x:1}"
v_php=$($homebrew_path/opt/$current_php_version/bin/php -v)
php_ini="$homebrew_path/etc/php/$current_simple_php_version/php.ini"
conf_php=()
conf_php+=("$php_ini")
conf_php+=("$homebrew_path/etc/php/$current_simple_php_version/php-fpm.d/www.conf")
addconf_php=$(find "$homebrew_path/etc/php/$current_simple_php_version/conf.d" -name "*.ini" | sort -n)
z=0
additionnal=()
for i in $addconf_php
do
additionnal+=("$addconf_dir$i")
done
conf_php+=(${additionnal[@]})
}
# MySQL
my=$(mysql --help | grep -A1 'Default options' | grep '.my.cnf')
conf_mysql=($my)
v_mysql=$(mysql -V | awk -F"," '{print $1}' | xargs)
# Functions
error_log(){
tail -f "$log_apa" &
tailpid=$!
sleep 0.25
read -p "< Press Enter to quit tail ! >"
kill $tailpid
}
acces_log(){
tail -f "$access_apa" &
tailpid=$!
sleep 0.25
read -p "< Press Enter to quit tail ! >"
kill $tailpid
}
entete(){
v_php_short=$(echo "$v_php" | sed -n '1p' )
printf "Apache: %s\n" "$v_apache"
printf "PHP: %s\n" "$v_php_short"
printf "MySQL: %s\n" "$v_mysql"
echo ""
}
versions(){
echo -e "\n${underline}Apache/PHP/MySQL Version:${reset}\n"
apachectl -v
echo ""
$homebrew_path/opt/$current_php_version/bin/php -v
echo ""
mysql --version
echo ""
read -p "< Press Enter>"
}
conf_files(){
echo -e "\n${underline}Apache/PHP/MySQL Configuration files:${reset}\n"
echo -e "\033[4mApache:\033[0m " #&& echo $conf_apache
for line in "${config_apache[@]}"
do
echo -e "$line"
done
echo
echo -e "\033[4mPHP:\033[0m " # && echo "$conf_php"
for line in "${conf_php[@]}"
do
echo -e "$line"
done
echo
echo -e "\033[4mMySQL:\033[0m "
for line in "${conf_mysql[@]}"
do
echo -e "$line"
done
echo
read -p "< Press Enter>"
}
submenu(){
options2=("${additionnal[@]}" "(M)enu")
echo "Edit which file ?: "
select opt in "${options2[@]}"; do
[[ $opt == "(M)enu" ]] || [[ $REPLY == "m" ]] || [[ $REPLY == "M" ]] && menu;
[[ -z $opt ]] && echo "Wrong choice !"
[[ -n $opt ]] && "$editeur" "$opt";
done
}
switch_php(){
php_installed_array=()
for i in $(ls $homebrew_path/etc/php/); do
[[ -d "$homebrew_path/etc/php/$i" ]] && php_installed_array+=("$i");
done
php_installed_array+=("(M)enu" "Help")
echo -e "\nCurrent PHP: $current_simple_php_version"
echo "Switch to PHP: "
select version in "${php_installed_array[@]}"; do
[[ $version == "(M)enu" ]] || [[ $REPLY == "m" ]] || [[ $REPLY == "M" ]] && menu;
[[ $version == "Help" ]] && echo "Only currently PHP installed are displayed. To switch to another PHP version, install it before (brew install php@8.3) !";
[[ -z $version ]] && [ "$version" != "Help" ] && echo "Wrong choice !"
[[ -n $version ]] && [ "$version" != "Help" ] && echo "$version" | xargs -p -n 1 sphp && menu;
done
}
# Main menu
menu(){
add_ini
options=(
"Apache (r)estart"
"(E)dit httpd.conf"
"Edit httpd-v(h)osts.conf"
"Edit httpd-(s)sl.conf"
"error_(l)og Apache"
"(a)ccess_log Apache"
"Edit (P)HP.ini"
"Edit additio(n)nals *.ini files"
"Open PHP (i)nfo page in browser"
"S(w)itch to PHP version"
"Apache/PHP/MySQL (V)ersion"
"Apache/PHP/MySQL (C)onfiguration files"
"(Q)uit"
)
# --> sphp:<--
# mod-php: https://gist.github.com/rhukster/f4c04f1bf59e0b74e335ee5d186a98e2/
# php-fpm: https://gist.github.com/rozsival/10289d1e2006c68009ace0478306ecd2/
# Brew PHP switcher
# https://github.com/philcook/brew-php-switcher#readme
echo -e "\n\033[1mApache Tools: \033[0m\n"
entete
select option in "${options[@]}"; do
case "$REPLY" in
1|r|R) sudo apachectl -k restart ; menu ;;
2|e|E) "$editeur" "$conf_apache" ;; # httpd.conf
3|h|H) "$editeur" "$vhost" ; menu ;; # httpd-vhost.conf
4|s|S) "$editeur" "$ssl" ; menu ;; # httpd-ssl.conf
5|l|L) command -v ttab >/dev/null 2>&1 && ttab tail -f "$log_apa" || error_log ; menu ;;
6|a|A) command -v ttab >/dev/null 2>&1 && ttab tail -f "$access_apa" || acces_log ; menu ;;
7|p|P) "$editeur" "$php_ini" ; menu ;; # php.ini
8|n|N) submenu ;;
9|i|I) echo '<?php echo phpinfo(); ?>' > $document_root/php-info.php && open 'http://localhost/php-info.php' ;;
10|w|W) switch_php; menu ;;
#read -e -n 3 -p "Which PHP version? (7.4/8.0/8.1/8.2/8.3): " choice
#if [[ "$choice" == "7.4" ]] || [[ "$choice" == "8.0" ]] || [[ "$choice" == "8.1" ]] || [[ "$choice" == "8.2" ]] || [[ "$choice" == "8.3" ]]; then echo "$choice" | xargs -p -n 1 sphp ; fi ; menu ;;
11|v|V) versions ; menu ;;
12|c|C) conf_files ; menu ;;
13|q|Q) exit 0 ;;
esac
done
}
menu

17
api-ovh.sh Normal file
View File

@@ -0,0 +1,17 @@
OVH_HTTP_METHOD="POST"
OVH_HTTP_QUERY="$OVH_API_URL/$OVH_API_END_POINT_DOMAIN_ZONE_DNS/domain.com/$OVH_API_END_POINT_DOMAIN_ZONE_DNS_RECORD"
OVH_FIELD_TYPE="TXT"
OVH_SUB_DOMAIN=""
OVH_TARGET="\"google-site-verification=O_Kd7lqvCvpBz7fzEeUKGVKBmsAsfJgaJuh3PZRnrsk\""
OVH_HTTP_BODY="{\"fieldType\":\"$OVH_FIELD_TYPE\",\"subDomain\":\"$OVH_SUB_DOMAIN\",\"target\":\"$OVH_TARGET\"}"
curl -X $OVH_HTTP_METHOD \
$OVH_HTTP_QUERY \
-H "Content-Type: application/json" \
-H "X-Ovh-Application: $OVH_API_APPLICATION_KEY" \
-H "X-Ovh-Timestamp: $OVH_TIME" \
-H "X-Ovh-Signature: $OVH_SIG" \
-H "X-Ovh-Consumer: $OVH_API_CONSUMER_KEY" \
--data "$OVH_HTTP_BODY"

17
api_deepl.sh Executable file
View File

@@ -0,0 +1,17 @@
#!/usr/bin/env bash
[ ! -f "$HOME/.env" ] || export $(grep -v '^#' "$HOME/.env" | xargs)
# DE/FR/ES/EN-GB/EN-US
translate() {
deepl=$(curl -s -X POST 'https://api-free.deepl.com/v2/translate' \
--header "Authorization: DeepL-Auth-Key $DEEPL_KEY" \
--data-urlencode "text=$2" \
--data-urlencode "target_lang=$1"
)
echo "$deepl" | jq -r .'translations[].text'
}
translate "DE" "il fait beau !"

22
backup_conf.sh Executable file
View File

@@ -0,0 +1,22 @@
#!/usr/bin/env bash
dest=$HOME/Documents/conf
cp /opt/homebrew/etc/httpd/other/boiteverte.conf "$dest"
cp /opt/homebrew/etc/httpd/other/clicclac.conf "$dest"
cp /opt/homebrew/etc/httpd/other/sentier.conf "$dest"
cp /opt/homebrew/etc/httpd/extra/httpd-vhosts.conf "$dest"
cp /opt/homebrew/etc/httpd/extra/httpd-ssl.conf "$dest"
cp /opt/homebrew/etc/httpd/httpd.conf "$dest"
cp -r /opt/homebrew/etc/httpd/certs "$dest"
#cp /opt/homebrew/etc/php/8.1/conf.d/imagick.ini "$dest"
#cp /opt/homebrew/etc/php/8.1/php-fpm.conf "$dest"
#cp /opt/homebrew/etc/php/8.1/php.ini "$dest"
#cp /opt/homebrew/etc/php/8.1/php-fpm.d/www.conf "$dest"
#cp /opt/homebrew/etc/php/8.2/php.ini "$dest"
#cp -r /opt/homebrew/etc/php/8.1/conf.d "$dest"
#cp /opt/homebrew/etc/php/8.1/pear.conf "$dest"
cp /opt/homebrew/etc/redis-sentinel.conf "$dest"
cp /opt/homebrew/etc/redis.conf "$dest"

View File

@@ -22,10 +22,33 @@
#
#
# 04-09-2024 : backup, sending remote, notification OK
# 04-09-2024 : TO DO : test deleting local files after $BKP_DAYS
red="\033[1;31m"
greenbold="\033[1;32m"
green="\033[0;32m"
yellow="\033[0;33m"
yellowbold="\033[1;33m"
bold="\033[1m"
#bold_under="\033[1;4m"
underline="\033[4m"
reset="\033[0m"
dotenv () {
set -a
# shellcheck disable=SC1091
[ -f "$HOME/.env" ] && . "$HOME/.env" || echo -e "${red}\nNo .env file found ! Could'nt get update from Github.'.${reset}"
set +a
}
dotenv
#CREATE USER 'mysqlbackupuser'@'localhost' IDENTIFIED BY '34diK=[6]Zui';
#GRANT SELECT ON * . * TO 'mysqlbackupuser'@'localhost';
pass=$(gpg --quiet --decrypt $HOME/.my.cnf.gpg)
pass=$(gpg --quiet --decrypt $HOME/.my.cnf.gpg)
x=$(echo $pass | awk '{print $2}')
BKP_USER=${x:5}
@@ -47,7 +70,7 @@ if [ ! -d $BKP_DEST ]; then mkdir $BKP_DEST; fi
## Note: Scripts will delete all backup which are older then BKP_DAYS##
#
# D:3 W:22 M:93
BKP_DAYS=3 # Enter how many days backup you want,
BKP_DAYS=1 # 3 Enter how many days backup you want,
BKP_WEEKS=21 # 3*7
BKP_MONTHS=93 # 3*31
#
@@ -82,31 +105,39 @@ IGNORE_DB="information_schema mysql performance_schema sys"
[ ! -d $BKP_DEST ] && mkdir -p $BKP_DEST || :
#
################# Autodetect the linux bin path #########################
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
GZIP="$(which gzip)"
#
notification() {
if [ $3 -eq 0 ];
then
sound="Boop"
message="Envoi terminé sur $2 !"
image="$BKP_BASE_DIR/success.png"
else
sound="Galet"
message="Echec lors de l'envoi sur $2 : erreur $result"
image="$BKP_BASE_DIR/error.png"
fi
if [[ "$OSTYPE" == "darwin"* ]] && [ -x "$(command -v terminal-notifier)" ]; then
terminal-notifier -title "$1" -message "$message" -sound "$sound" -contentImage "$image"
fi
curl -Is https://www.apple.com | head -1 | grep 200 1>/dev/null
if [[ $? -eq 1 ]]; then
echo -e "\n${red}No Internet connection !${reset}"
echo -e "No pushover notification !"
#exit 1
fi
send_pushover_notification() {
echo -e "Sending Pushover notification ..."
curl -s -F "token=$AIRBOOK_APP" \
-F "user=$USER_KEY" \
-F "title=$1" \
-F priority=2 \
-F html=1 \
-F retry=300 \
-F expire=86400 \
-F "message=$2" https://api.pushover.net/1/messages.json
[ $? -eq 0 ] && echo -e "${greenbold}\Pushover notification sent successfully !${reset}" || echo -e "${redbold}error sending Pushover notification !${reset}"
}
###################### Get database list ################################
#
DB_LIST="$($MYSQL -u $BKP_USER -h $MYSQL_HOST -p$BKP_PASS -Bse 'SHOW DATABASES')"
#DB_LIST="$($MYSQL -h $MYSQL_HOST -Bse 'SHOW DATABASES')"
: <<'END_COMMENT'
END_COMMENT
#
for db in $DB_LIST
@@ -129,32 +160,39 @@ do
# Dans les dossiers Backup: mkdir -p silverbook/Bases_MySQL
echo -e "Backup $db database..."
$MYSQLDUMP -u $BKP_USER -h $MYSQL_HOST -p$BKP_PASS -r$BKP_FILENAME $db
#$MYSQLDUMP -h $MYSQL_HOST -r$BKP_FILENAME $db
#echo $db
#cat $BKP_FILENAME
$GZIP -9 $BKP_FILENAME
f=$(basename "$BKP_GZ_FILENAME")
server1="ftp.cluster011.ovh.net:backup/$machine/Bases_MySQL/"
echo -e "Transfer $f to $server1"
scp "$BKP_GZ_FILENAME" funnymac@"$server1"
result=$?
result1=$?
notification "Backup MySQL: base $db" "$server1" $result
[ $? -ne 0 ] && send_pushover_notification "Backup MySQL Db" "Error when transfering $f on $s1 "
sleep 1
server2="clicclac.synology.me:/volume1/Backup/$machine/Bases_MySQL/"
#scp -P42666 -p "$BKP_GZ_FILENAME" bruno@"$server2"
scp -P42666 -p "$BKP_GZ_FILENAME" bruno@"$server2"
#scp -P42666 -p "$BKP_GZ_FILENAME" bruno@clicclac.synology.me:/volume1/Backup/$machine/Bases_MySQL/
result=$?
# NAS Synology: scp -O
server2="photos-nas.ovh:/volume1/Backup/$machine/Bases_MySQL/"
s2=$(echo $server2 | awk -F":" '{print $1}')
echo -e "Transfer $f to $server2"
scp -O -P42667 -p "$BKP_GZ_FILENAME" bruno@"$server2"
result2=$?
notification "Backup MySQL: base $db" "$server2" $result
[ $? -ne 0 ] && send_pushover_notification "Backup MySQL Db" "Error when transfering $f on $s2 "
#echo "----"
echo
fi
done
#########To delete all backup files older then BKP_DAYS #################
#
# Nettoyage serveurs locaux:
@@ -162,26 +200,35 @@ done
if find --version >/dev/null 2>&1 ; then
echo Using GNU date
d_duration="$BKP_DAYS"
w_duration="$BKP_DAYS"
m_duration="$BKP_DAYS"
w_duration="$BKP_WEEKS"
m_duration="$BKP_MONTHS"
else
echo Using BSD date
d_duration="$BKP_DAYS"d
w_duration="$BKP_DAYS"d
m_duration="$BKP_DAYS"d
w_duration="$BKP_WEEKS"d
m_duration="$BKP_MONTHS"d
echo "$d_duration"
echo "$w_duration"
echo "$m_duration"
fi
echo -e "Find daily backups..."
#find $BKP_DEST -name "*.sql.gz" -mtime +$BKP_DAYS | grep -v -E '(January|February|March|April|May|June|July|August|September|October|November|December)|(S\d{2}_\d{4})' | xargs rm -f
find $BKP_DEST -name "*.sql.gz" -mtime +"$d_duration" | grep -v -E '(janvier|fevrier|mars|avril|mai|juin|juillet|aout|septembre|octobre|novembre|decembre)|(S\d{2}_\d{4})' | xargs rm -f
find $BKP_DEST -name "*.sql.gz" -mtime +"$d_duration" | grep -v -E '(janvier|fevrier|mars|avril|mai|juin|juillet|aout|septembre|octobre|novembre|decembre)|(Sd{2}_d{4})' | xargs rm -f
##gfind /Users/bruno/Documents/MySQL -mtime +93 -iregex '.*\(January\|February\|March\|April\|May\|June\|July\|September\|October\|November\|December\).*'
echo "----"
find $BKP_DEST -name "*.sql.gz" -mtime +"$w_duration" | grep -E 'S\d{2}_\d{4}' | xargs rm -f
echo -e "Find weekly backups..."
find $BKP_DEST -name "*.sql.gz" -mtime +"$w_duration" | grep -E 'Sd{2}_d{4}' | xargs rm -f
##gfind /Users/bruno/Documents/MySQL -mtime +22 -regextype posix-extended -iregex '.*S[0-9]{2}_[0-9]{4}.*'
echo "----"
echo -e "Find monthly backups..."
#find $BKP_DEST -name "*.sql.gz" -mtime +$BKP_MONTHS | grep -E '(January|February|March|April|May|June|July|August|September|October|November|December)' | xargs rm -f
find $BKP_DEST -name "*.sql.gz" -mtime +"$m_duration" | grep -E '(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|decembre)' | xargs rm -f
#
: <<'END_COMMENT2'
# Nettoyage serveurs distants:
#916_dest="/volume1/Backup/SilverBook/Bases_MySQL"
@@ -238,5 +285,6 @@ done
#### End of script ####
END_COMMENT2

28
backups_conf.sh Executable file
View File

@@ -0,0 +1,28 @@
#!/usr/bin/env bash
italic="\033[3m"
underline="\033[4m"
ita_under="\033[3;4m"
bgd="\033[1;4;31m"
red="\033[1;31m"
bold="\033[1m"
bold_ita="\033[1;3m"
box="\033[1;41m"
redbold="\033[1;31m"
redbox="\033[1;41m"
green="\033[0;32m"
reset="\033[0m"
cp -r /opt/homebrew/etc/httpd /Users/bruno/Documents/webserver
cp -r /opt/homebrew/etc/php /Users/bruno/Documents/webserver
cp /opt/homebrew/etc/my.cnf /Users/bruno/Documents/webserver
cp -r /opt/homebrew/etc/my.cnf.d/ /Users/bruno/Documents/webserver
cp /opt/homebrew/etc/phpmyadmin.config.inc.php /Users/bruno/Documents/webserver
cp /opt/homebrew/etc/redis.conf /Users/bruno/Documents/webserver
cp /opt/homebrew/etc/redis-sentinel.conf /Users/bruno/Documents/webserver

76
crypt.sh Executable file
View File

@@ -0,0 +1,76 @@
#!/usr/bin/env bash
# using aesutil
#SALT=$(mkrand 15) # mkrand generates a 15-character random passwd
#MYENCPASS="i/b9pkcpQAPy7BzH2JlqHVoJc2mNTBM=" # echo "passwd" | aes -e -b -B -p $SALT
#MYPASS=$(echo "$MYENCPASS" | aes -d -b -p $SALT)
# and usage
#serverControl.sh -u admin -p $MYPASS -c shutdown
echo 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'sjkXF*4kX.@9mh-ut8y.'
# U2FsdGVkX199dZHjA0wtjtt0OapR8EOpVwZ5mPqN3JJd40yhCS3fYYxEflQTXTwr
echo "U2FsdGVkX199dZHjA0wtjtt0OapR8EOpVwZ5mPqN3JJd40yhCS3fYYxEflQTXTwr" | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'sjkXF*4kX.@9mh-ut8y.'
echo 'rusty!herring.pitshaft' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'sjkXF*4kX.@9mh-ut8y.' > .secret_vault.txt
# chmod 600 .secret_vault.txt
cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'sjkXF*4kX.@9mh-ut8y.'
#rusty!herring.pitshaft
# Load environment variables from .env file
[ ! -f .env ] || export $(grep -v '^#' .env | xargs) # export $(grep -v '^#' .env | xargs -0)
# while read line; do export $line; done < .env
Example of .env file:
# Database settings
DB_HOST=localhost
DB_PORT=5432
DB_NAME=mydatabase
DB_USER=myuser
DB_PASSWORD=mypassword
# API keys
API_KEY=abc123
SECRET_KEY=def456
DB_NAME=mydb
DB_PASSWORD=abcd1234
source my_custom.env
set -o allexport
source conf-file
set +o allexport
set -a
. ./env.txt
set +a
# .env loading in the shell
dotenv () {
set -a
[ -f .env ] && . .env
set +a
}

28
curl2.sh Executable file
View File

@@ -0,0 +1,28 @@
#!/usr/bin/env bash
folder=Janvier
for file in /Users/bruno/Pictures/_Canon/Export/2023/Janvier/*
do
#curl -u username:password -T ${file} http://www.example.com/folder/${file}
# crée l'arborescence
#/opt/homebrew/opt/curl/bin/curl --user funnymac:a3XELN4PHTYF9fFHtsY97eshXBxxFo --ftp-create-dirs -T ${file} sftp://ftp.cluster011.ovh.net:22/home/funnymac/www/ftp/${file}
/opt/homebrew/opt/curl/bin/curl --user funnymac:a3XELN4PHTYF9fFHtsY97eshXBxxFo -T ${file} sftp://ftp.cluster011.ovh.net:22/home/funnymac/www/ftp/${folder}/${file}/
done
#ok
#find /Users/bruno/Pictures/_Canon/Export/2023/Janvier/ -type f | xargs -L 1 bash -c '/opt/homebrew/opt/curl/bin/curl --user funnymac:a3XELN4PHTYF9fFHtsY97eshXBxxFo -T $1 sftp://ftp.cluster011.ovh.net:22/home/funnymac/www/ftp/${1##*/}' \;
# ok
# /opt/homebrew/opt/curl/bin/curl -i -v --user funnymac:a3XELN4PHTYF9fFHtsY97eshXBxxFo -O sftp://ftp.cluster011.ovh.net:22/home/funnymac/8_2022.jpg
# OK
# /opt/homebrew/opt/curl/bin/curl --user funnymac:a3XELN4PHTYF9fFHtsY97eshXBxxFo -T '{2023-01-31_RuBlanc_0627,2023-01-31_RuBlanc_0623}.jpg' sftp://ftp.cluster011.ovh.net:22/home/funnymac/www/ftp/ \;
# ok
# find /Users/bruno/Desktop/Juin -type f | xargs -L 1 bash -c '/opt/homebrew/opt/curl/bin/curl --user funnymac:a3XELN4PHTYF9fFHtsY97eshXBxxFo --ftp-create-dirs --output-dir 'juin' -T $1 sftp://ftp.cluster011.ovh.net:22/home/funnymac/www/ftp/juin/${1##*/}' \;

68
exiftool.sh Executable file
View File

@@ -0,0 +1,68 @@
#! /bin/bash
function usage {
echo "usage: $0 -ms path_of_file"
echo " -m to remove useless exif entries"
echo " -s to show current exif entries"
exit -1
}
if [ $# != 2 ]; then
usage
fi
OP=$1
SRC=$2
if [ ! -f $SRC ]; then
echo "error: file not found"
exit -2
fi
if [ $OP = "-m" ]; then
cp "$SRC" "$SRC"."_tmp"
exiftool -all= "$SRC"
exiftool -overwrite_original
-TagsFromFile "$SRC"."_tmp"
-ExposureTime
-FNumber
-ExposureProgram
-ISO
-DateTimeOriginal
-CreateDate
-ExposureCompensation
-MaxApertureValue
-MeteringMode
-LightSource
-Flash
-FocalLength
-SubSecTime
-SubSecTimeOriginal
-SubSecTimeDigitized
-ColorSpace
-ExifImageWidth
-ExifImageHeight
-SensingMethod
-CustomRendered
-ExposureMode
-WhiteBalance
-DigitalZoomRatio
-FocalLengthIn35mmFormat
-SceneCaptureType
-GainControl
-Contrast
-Saturation
-Sharpness
-SubjectDistanceRange
-GPSVersionID
-GPSLatitudeRef
-GPSLatitude
-GPSLongitudeRef
-GPSLongitude
-Make
-Model
"$SRC"
exiftool -delete_original! "$SRC"
rm -f "$SRC"."_tmp"
else
if [ $OP = "-s" ]; then
exiftool "$SRC"
else
usage
fi
fi

10
git-sparse.sh Executable file
View File

@@ -0,0 +1,10 @@
#!/usr/bin/env bash
function git-scp() (
URL="$1" && shift 1
svn export ${URL/blob\/master/trunk}
)
# svn export --force https://github.com/jaysalvat/vegas/trunk/dist
git-scp https://github.com/jaysalvat/vegas/trunk/dist

16
git_reachable.sh Executable file
View File

@@ -0,0 +1,16 @@
#!/usr/bin/env bash
#url="git@gitea.maboiteverte.fr:shell/bash_mbv.git"
url="https://clicclac.synology.me:3000/shell/bash.git"
url="bruno@dsm916e:/volume1/Repositories/bash.git"
url="https://Bruno21@github.com/Bruno21/kymsu.git"
## Returns errlvl 0 if $1 is a reachable git remote url
git-remote-url-reachable() {
git ls-remote "$1" CHECK_GIT_REMOTE_URL_REACHABILITY >/dev/null 2>&1
}
if git-remote-url-reachable "$url"; then
## code
echo "reachable !"
fi

83
gitea.service Normal file
View File

@@ -0,0 +1,83 @@
[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target
###
# Don't forget to add the database service dependencies
###
#
#Wants=mysql.service
#After=mysql.service
#
#Wants=mariadb.service
#After=mariadb.service
#
#Wants=postgresql.service
#After=postgresql.service
#
#Wants=memcached.service
#After=memcached.service
#
#Wants=redis.service
#After=redis.service
#
###
# If using socket activation for main http/s
###
#
#After=gitea.main.socket
#Requires=gitea.main.socket
#
###
# (You can also provide gitea an http fallback and/or ssh socket too)
#
# An example of /etc/systemd/system/gitea.main.socket
###
##
## [Unit]
## Description=Gitea Web Socket
## PartOf=gitea.service
##
## [Socket]
## Service=gitea.service
## ListenStream=<some_port>
## NoDelay=true
##
## [Install]
## WantedBy=sockets.target
##
###
[Service]
# Modify these two values and uncomment them if you have
# repos with lots of files and get an HTTP error 500 because
# of that
###
#LimitMEMLOCK=infinity
#LimitNOFILE=65535
RestartSec=2s
Type=simple
User=git
Group=users
WorkingDirectory=/var/lib/gitea/
# If using Unix socket: tells systemd to create the /run/gitea folder, which will contain the gitea.sock file
# (manually creating /run/gitea doesn't work, because it would not persist across reboots)
#RuntimeDirectory=gitea
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea
# If you install Git to directory prefix other than default PATH (which happens
# for example if you install other versions of Git side-to-side with
# distribution version), uncomment below line and add that prefix to PATH
# Don't forget to place git-lfs binary on the PATH below if you want to enable
# Git LFS support
#Environment=PATH=/path/to/git/bin:/bin:/sbin:/usr/bin:/usr/sbin
# If you want to bind Gitea to a port below 1024, uncomment
# the two values below, or use socket activation to pass Gitea its ports as above
###
#CapabilityBoundingSet=CAP_NET_BIND_SERVICE
#AmbientCapabilities=CAP_NET_BIND_SERVICE
###
[Install]
WantedBy=multi-user.target

29
gotify.sh Normal file
View File

@@ -0,0 +1,29 @@
#!/usr/bin/env bash
token_gotify=
dotenv () {
set -a
# shellcheck disable=SC1091
[ -f ".env" ] && . ".env" || echo -e "${red}\nNo .env file found ! No token for gotify.${reset}"
set +a
}
send_gotify_notification() {
now=$(date +"%d-%m-%Y %T")
gotify_server="https://gotify.maboiteverte.fr"
TITLE="IP has changed on $host"
MESSAGE="**L'IP externe a changé:**\n\n - ancienne IP: $old_ip_externe\n - **nouvelle IP: $ip_externe**\n\n [^]: $now\n"
PRIORITY=8
URL="$gotify_server/message?token=$token_gotify&?format=markdown"
echo -e "Sending notification to $gotify_server ..."
curl -L -S -s --data '{"message": "'"${MESSAGE}"'", "title": "'"${TITLE}"'", "priority":'"${PRIORITY}"', "extras": {"client::display": {"contentType": "text/markdown"}}}' -H 'Content-Type: application/json' "$URL" > /dev/null
[ $? -eq 0 ] && echo -e "${greenbold}Gotify notification sent successfully !${reset}" || echo -e "${redbold}error sending Gotify notification !${reset}"
}
dotenv
send_gotify_notification

View File

@@ -13,79 +13,6 @@ reset="\033[0m"
shopt -s globstar
command -v jq >/dev/null 2>&1 || { echo -e "${bold}93mhandbrake_for_plex${reset} require ${bold}jq${reset} but it's not installed.\nRun ${italic}(brew install jq)${reset}\nAborting..." >&2; exit 1; }
showHelp() {
clear
echo -e "\033[93mhandbrake_for_plex.sh\033[0m"
echo "Convert and rename video files for Plex:"
echo
echo
echo "USAGE: handbrake_for_plex.sh"
echo
echo "Configure:"
echo " -\$SRC : source folder (recursive)"
echo " -\$DEST : destination folder"
echo " -\$DEST_EXT : destination extension"
echo " -\$PRESET : preset HandBrake"
echo " and run script..."
echo
echo "OPTION:"
echo " -h display this help"
echo " -i source folder (recursive)"
echo " -o destination folder"
echo " -p preset HandBrake"
echo
echo -e "Example: ${italic}./handbrake_for_plex.sh -i $HOME/Downloads -o $HOME/Images -p 'Apple 720p30 Surround'${reset}"
echo
echo -e "To known Preset, run ${italic}HandBrakeCLI --preset-list${reset}"
echo
exit 0
}
notification() {
#path_img=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
if [ "$3" -eq 0 ];
then
sound="Glass"
#image="$path_img/success.png"
#image="$path_img/HandBrake.icns"
else
sound="Basso"
#image="$path_img/error.png"
fi
if [[ "$OSTYPE" == "linux-gnu" ]] && [ -x "$(command -v zenity)" ]; then
zenity --title="$1" --notification --text="$2"
elif [[ "$OSTYPE" == "darwin"* ]] && [ -x "$(command -v terminal-notifier)" ]; then
### -appIcon ne marche avec BigSur
# terminal-notifier -title "$1" -message "$2" -sound "$sound" -contentImage "$image" -activate "com.colliderli.iina"
terminal-notifier -title "$1" -message "$2" -sound "$sound" -appIcon "https://sur-le-sentier.fr/HandBrake.png" -activate "com.colliderli.iina"
# org.galad.Subler.plist com.colliderli.iina.plist -appIcon http://vjeantet.fr/images/logo.png
fi
}
while getopts "h?i:o:p:" opt; do
case "$opt" in
h|\?)
showHelp
exit 0
;;
i) input_path="$OPTARG"
;;
o) output_path="$OPTARG"
;;
p) profile="$OPTARG"
;;
esac
done
# Reset OPTIND
shift $((OPTIND-1))
# https://stackoverflow.com/questions/59895/how-can-i-get-the-directory-where-a-bash-script-is-located-from-within-the-scrip
#DIR=$(realpath "$(dirname "${BASH_SOURCE[0]}")")
#SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
@@ -104,51 +31,333 @@ shift $((OPTIND-1))
DEST_EXT=mp4
# Handbrake preset
# handbrakeCli --preset-list (or -z) to get all availables profiles
[[ "$profile" == "" ]] && PRESET="Apple 720p30 Surround" || PRESET="$profile"
# Only files larger than $MAXSIZE will be processed
# Only files larger than $MAXSIZE will be processed (> 30Mo)
MAXSIZE=30000000
#MAXSIZE=300
# Open converted video file in an application
APP="Subler"
SUBTITLE_LIST="eng,fre"
# log
# this reduce handbrake verbosity
logfile=/tmp/HandBrake.log
#logfile=/tmp/HandBrake.log
logfolder=/var/log/handbrake_for_plex
logfile="$logfolder"/HandBrake.log
if [ ! -w "$logfile" ]; then
sudo mkdir "$logfolder"
sudo chown bruno:staff "$logfolder"
sudo touch "$logfile"
sudo chown bruno:staff "$logfile"
sudo chmod 640 "$logfile"
fi
logsize=$(wc -c <"$logfile")
if [ "$logsize" -ge 1000 ]; then
cp "$logfile" "$logfile.old"
truncate -s 0 "$logfile"
fi
#Move to trash after conversion
trash=true
internet=0
command -v jq >/dev/null 2>&1 || {
echo -e "${bold}93mhandbrake_for_plex${reset} require ${bold}jq${reset} but it's not installed.\nRun ${italic}(brew install jq)${reset}\nAborting..." >&2
exit 1
}
fzf_bin=0
if (! type fzf >/dev/null 2>&1); then
echo -e "Install ${bold}fzf${reset} for a better experience !"
echo -e "${italic}brew install fzf${reset}"
fzf_bin=0
else
{
fzf_bin=1
fzf_args=(
--height=8
--with-nth=2..
--layout=reverse
--info=hidden
--border
)
}
fi
showHelp() {
clear
echo -e "\033[93mhandbrake_for_plex.sh\033[0m"
echo "Convert and rename video files for Plex:"
echo
echo
echo "USAGE: handbrake_for_plex.sh"
echo
echo "Configure:"
echo " -\$SRC : source folder (recursive)"
echo " -\$DEST : destination folder"
echo " -\$DEST_EXT : destination extension"
echo " -\$PRESET : preset HandBrake"
echo " and run script..."
echo
echo "OPTION:"
echo " -h display this help"
echo " -i source folder (recursive)"
echo " -o destination folder"
echo " -p preset HandBrake"
echo " -z install handbrake_for_plex.sh"
echo
echo -e "Example: ${italic}./handbrake_for_plex.sh -i $HOME/Downloads -o $HOME/Images -p 'Apple 720p30 Surround'${reset}"
echo
echo -e "To known Preset, run ${italic}HandBrakeCLI --preset-list${reset}"
echo
exit 0
}
update_handbrake() {
# https://www.thegeekdiary.com/how-to-install-dmg-file-on-mac-from-command-line/
if [ "$(printf '%s\n' "$HB_VERSION" "$last_hbc_release" | sort -V | head -n1)" = "$HB_VERSION" ]; then
if [ "$HB_VERSION" != "$last_hbc_release" ]; then
# release=$(gh release list -L 1 --repo HandBrake/HandBrake | cut -f1 | xargs -I{} gh release view {} --repo HandBrake/HandBrake)
# news=$(echo "$release" | awk '/Upgrade Notice/,0')
# news=$(gh release list -L 1 --repo HandBrake/HandBrake | cut -f1 | xargs -I{} gh release view {} --repo HandBrake/HandBrake | awk '/Upgrade Notice/,0')
# asset=$(echo "$release" | awk '/Upgrade Notice/{exit} 1' | grep '^asset:' | grep -v '.sig' | grep 'HandBrakeCLI' | cut -f 2)
# url = https://github.com/HandBrake/HandBrake/releases/download/1.9.2/HandBrakeCLI-1.9.2.dmg
latest=$(curl --silent "https://api.github.com/repos/${gh_hbc_repo}/releases/latest")
last_hbc_dl_url=$(echo "$latest" | grep 'HandBrakeCLI' | grep -v '.sig' | grep 'browser_download_url' | awk -F": " '{print $2}' | sed 's/"//g')
last_hbc_news=$(echo "$latest" | jq '.body')
echo -e "${green}Current version: $HB_VERSION - Version $last_hbc_release available !${reset}"
echo -e "$last_hbc_news"
a=$(echo -e "${bold}Do you want to install HandBrakeCLI v$last_hbc_release (y/n)${reset}")
read -p "$a" hbc
if [[ "$hbc" == "y" || "$hbc" == "Y" ]]; then
if [[ "$OSTYPE" == "darwin"* ]]; then
url=$(echo "$last_hbc_dl_url" | grep '.dmg')
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
url=$(echo "$last_hbc_dl_url" | grep '.flatpak')
fi
echo "Downloading $url"
dest=$HOME/Downloads
filename=$(basename "$url")
curl -L -O --output-dir "$dest" "$url"
if [[ $? -eq 0 ]]; then
vol=$(hdiutil mount "$dest"/"$filename" | tail -1 | awk '{print $3}')
app=$vol/HandBrakeCLI
install_folder=$HOME/.local/bin/
if [ -f "$app" ]; then
echo "Copying $filename to $install_folder"
cp "$app" "$install_folder"
fi
x="$install_folder""HandBrakeCLI"
if [ -f "$x" ]; then
v=$("$x" --version 2>/dev/null | awk '{print $2}')
if [ "$v" == "$last_hbc_release" ]; then
echo -e "${green}HandBrakeCLI v$v successfully installed !${reset}"
else
echo -e "${red}HandBrakeCLI v$v installed !${reset}"
fi
fi
cd "$HOME" || exit
hdiutil unmount "$vol"
fi
fi
fi
fi
}
installation() {
#long_path=`pwd`"/"`basename "$0"`
long_path=$(realpath "$0")
echo -e "${bold}Installing $(basename "$0")${reset}"
echo
fzf_install_paths=("/usr/local/bin" "$HOME/.local/bin" "$HOME")
if [ $fzf_bin -eq 1 ]; then
prompt="Choose the install's path: "
choice=$(printf "Play %s\n" "${fzf_install_paths[@]}" | sort | fzf "${fzf_args[@]}" --prompt "$prompt")
install_path=${choice:5}
else
read -e -p "Choose the install's path: " install_path
fi
[[ ! $PATH =~ $install_path ]] && echo "$install_path in not in \$PATH !!"
if [ -d "$install_path" ]; then
if [ -w "$install_path" ]; then
cp "$long_path" "$install_path"
else
echo -e "${red}$install_path is not writeable !${reset}"
echo -e "${red}${bold}Using sudo ! Enter your password:${reset}"
sudo cp "$long_path" "$install_path"
fi
result=$?
[ "$result" = 0 ] && echo -e "$long_path ${italic}is now installed in${reset} $install_path"
else
echo -e "${red}This folder does not exist !${reset}"
fi
}
notification() {
#path_img=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
if [ "$3" -eq 0 ]; then
sound="Glass"
#image="$path_img/success.png"
#image="$path_img/HandBrake.icns"
else
sound="Basso"
#image="$path_img/error.png"
fi
if [[ "$OSTYPE" == "linux-gnu" ]] && [ -x "$(command -v zenity)" ]; then
zenity --title="$1" --notification --text="$2"
elif [[ "$OSTYPE" == "darwin"* ]] && [ -x "$(command -v terminal-notifier)" ]; then
### -appIcon ne marche avec BigSur
# terminal-notifier -title "$1" -message "$2" -sound "$sound" -contentImage "$image" -activate "com.colliderli.iina"
terminal-notifier -title "$1" -message "$2" -sound "$sound" -appIcon "https://sur-le-sentier.fr/HandBrake.png" -activate "com.colliderli.iina"
# org.galad.Subler.plist com.colliderli.iina.plist -appIcon http://vjeantet.fr/images/logo.png
fi
}
while getopts "h?i:o:p:z" opt; do
case "$opt" in
h | \?)
showHelp
;;
i)
input_path="$OPTARG"
;;
o)
output_path="$OPTARG"
;;
p)
profile="$OPTARG"
;;
z)
installation
exit 0
;;
esac
done
# Reset OPTIND
shift $((OPTIND - 1))
# Update handbrake_for_plex.sh from GitHub
#Github="https://github.com/HandBrake/HandBrake"
# Public Repo:
#RawUrl="https://raw.githubusercontent.com/Bruno21/bashbirds/main/bashbirds.sh"
# Private Repo:
#RawUrl="https://x-access-token:$GITHUB_TOKEN@raw.githubusercontent.com/HandBrake/HandBrake/main/bashbirds.sh"
### Check if there's a new release of the script:
#LatestRelease="$(curl -s -r 0-50 $RawUrl | sed -n "/VERSION/s/VERSION=//p" | tr -d '"')"
#LatestChanges="$(curl -s -r 0-2000 $RawUrl | sed -n "/ChangeNotes/s/# ChangeNotes: //p")"
#LatestChanges="$(curl -s -r 0-2000 $RawUrl | grep "^### ChangeNotes:" | sed 's/### ChangeNotes://g')"
###
echo "_ _ ____ _ _ ___ ___ ____ ____ _ _ ____ ____ ____ ____ ___ _ ____ _ _ ";
echo "|__| |__| |\ | | \ |__] |__/ |__| |_/ |___ |___ | | |__/ |__] | |___ \/ ";
echo "| | | | | \| |__/ |__] | \ | | | \_ |___ | |__| | \ | |___ |___ _/\_ ";
echo " ";
echo " ";
echo " ";
echo "_ _ ____ _ _ ___ ___ ____ ____ _ _ ____ ____ ____ ____ ___ _ ____ _ _ "
echo "|__| |__| |\ | | \ |__] |__/ |__| |_/ |___ |___ | | |__/ |__] | |___ \/ "
echo "| | | | | \| |__/ |__] | \ | | | \_ |___ | |__| | \ | |___ |___ _/\_ "
echo " "
echo " "
echo " "
version=$(ls /opt/homebrew/Cellar/handbrake 2>/dev/null)
if [ "$version" != "" ]; then
HANDBRAKE_CLI="/opt/homebrew/Cellar/handbrake/$version/bin/HandBrakeCLI"
echo -e "${bold}HandBrake $version${reset}"
echo -e "$HANDBRAKE_CLI\n"
else {
cli=$(which HandBrakeCLI)
if [ "$cli" != "" ]; then
HANDBRAKE_CLI="$cli"
version=$("$HANDBRAKE_CLI" --version 2>/dev/null | sed -n '1p')
echo -e "${bold}HandBrake $version${reset}"
echo -e "$HANDBRAKE_CLI\n"
gh_hbc_repo="HandBrake/HandBrake"
curl -sS -I github.com >/dev/null 2>&1
if [[ $? -eq 0 ]]; then
last_hbc_release=$(curl --silent "https://api.github.com/repos/${gh_hbc_repo}/releases/latest" | grep -Po "(?<=\"tag_name\": \").*(?=\")") # 1.10.0
internet=1
fi
# installation brew
version_brew=$(ls /opt/homebrew/Cellar/handbrake 2>/dev/null) # 1.10.0_1
# installation manuelle
cli=$(which HandBrakeCLI) # /Users/bruno/.local/bin/HandBrakeCLI
version_cli=$("$cli" --version 2>/dev/null | awk '{print $2}') # HandBrake 1.9.2
echo "last_hbc_release: $last_hbc_release"
echo "version_brew: $version_brew"
echo "cli: $cli"
echo "version_cli: $version_cli"
# bo handbrake
# /opt/homebrew/Cellar/handbrake/1.10.1 (9 files, 19.3MB)
# installation brew
if [ "$version_brew" != "" ]; then
if [ "$version_cli" != "" ]; then
if [ "$(printf '%s\n' "$version_cli" "$version_brew" | sort -V | head -n1)" = "$version_cli" ]; then
HANDBRAKE_CLI="/opt/homebrew/Cellar/handbrake/$version_brew/bin/HandBrakeCLI"
HB_VERSION="$version_brew"
else
HANDBRAKE_CLI="$cli"
HB_VERSION="$version_cli"
if [ "$internet" = 1 ]; then
update_handbrake
else
echo "No internet connection !"
fi
fi
else
echo -e "${red}HandBrake not installed!${reset}\n"
HANDBRAKE_CLI="/opt/homebrew/Cellar/handbrake/$version_brew/bin/HandBrakeCLI"
HB_VERSION="$version_brew"
fi
# installation manuelle
else
if [ "$version_cli" != "" ]; then
HANDBRAKE_CLI="$cli"
HB_VERSION="$version_cli"
update_handbrake
else
echo -e "\n${red}HandBrake not installed!${reset}\n"
echo -e "\n${red}You should run ${italic}brew install handbrake${reset}\n"
exit 1
fi
}
fi
echo "HANDBRAKE_CLI: $HANDBRAKE_CLI"
echo "HB_VERSION: $HB_VERSION"
#exit
echo -e "\n${bold}HandBrake $HB_VERSION${reset}"
echo -e "$HANDBRAKE_CLI\n"
echo -e "Source folder: ${italic}$SRC${reset}"
echo -e "Destination folder: ${italic}$DEST${reset}"
echo -e "HandBrake Profile: ${italic}$PRESET${reset}"
@@ -161,31 +370,35 @@ echo -e "HandBrake Profile: ${italic}$PRESET${reset}"
#ls "$SRC"/**/*.{mkv,avi,mp4,m4v}
count=0
# Series: SxxEyy
REGEX="([sS]([0-9]{2,}|[X]{2,})[eE]([0-9]{2,}|[Y]{2,}))"
# Films: 2
REGEX2="[0-9]{4}"
# Films:
REGEX2=".[0-9]{4}" # année 2019 mais avec un caractère avant (chaine ne commence pas par 2019)
movies=()
for FILE in "${SRC}"/**/*.{mkv,avi,mp4,m4v}
do
for FILE in "${SRC}"/**/*.{mkv,avi,mp4,m4v}; do
# Get file size
FILESIZE=$(stat -c%s "$FILE")
if (( FILESIZE > MAXSIZE )); then
FILESIZE=$(stat -c%s "$FILE" 2> /dev/null)
if ((FILESIZE > MAXSIZE)); then
movies+=("${FILE}")
fi
done
nb_movies=${#movies[@]}
for FILE in "${movies[@]}"
do
filename=$(basename "$FILE")
#extension=${filename##*.}
filename=${filename%.*}
for FILE in "${movies[@]}"; do
filename=$(basename "$FILE")
#extension=${filename##*.}
filename=${filename%.*}
: <<'END_COMMENT'
declare -a ft=()
declare -a ct=()
declare -a tt=()
declare -a lt=()
declare -a dt=()
: <<'END_COMMENT'
https://stackoverflow.com/questions/41231998/mediainfo-cli-command-line-interface-syntax-teaching-me-once-for-all
media=$(mediainfo --Output=file:///$SCRIPT_DIR/template.txt "$FILE")
l=$(echo "$media" | sed -n '1p')
@@ -193,182 +406,293 @@ do
echo -e "$info\n"
END_COMMENT
if [[ $filename =~ $REGEX ]]; then
MATCH="${BASH_REMATCH[1]}"
e=$(echo "${filename%$MATCH*}" | sed 's/\./\ /g' | xargs)
new_name="$e - $MATCH.$DEST_EXT"
elif [[ $filename =~ $REGEX2 ]]; then
MATCH2="${BASH_REMATCH[0]}"
e=$(echo "${filename%$MATCH2*}" | sed 's/\./\ /g' | xargs)
new_name="$e ($MATCH2).$DEST_EXT"
else
echo "Could not find SXXEYY pattern"
new_name="$filename"
continue
fi
if ! command -v mediainfo &> /dev/null; then
echo -e "${bold}mediainfo${reset} could not be found !\n"
echo -e "You should install ${bold}mediainfo${reset}:\n"
echo -e " - brew install mediainfo"
echo -e ""
else
# Suprrime [ Torrent911.io ]
a="[${filename#*[}"
a="${a%]*}] "
filename=${filename#"$a"}
infos=$(mediainfo "$FILE" --output=JSON | jq -s 'map({ VideoCount: .media.track[0].VideoCount, AudioCount: .media.track[0].AudioCount, TextCount: .media.track[0].TextCount, MenuCount: .media.track[0].MenuCount, FormatFichier: .media.track[0].Format, FileSize: .media.track[0].FileSize, Duration: .media.track[0].Duration, FormatVideo: .media.track[1].Format, Format_Profile: .media.track[1].Format_Profile, Format_Level: .media.track[1].Format_Level, "CodecVideo": .media.track[1].CodecID, Width: .media.track[1].Width, Height: .media.track[1].Height, FormatAudio: .media.track[2].Format, FormatAdditionalFeatures: .media.track[2].Format_AdditionalFeatures, CodecAudio: .media.track[2].CodecID, TitleAudio: .media.track[2].Title, LanguageAudio: .media.track[2].Language, DefaultAudio: .media.track[2].Default, FormatText: .media.track[3].Format, CodecText: .media.track[3].CodecID, LanguageText: .media.track[3].Language, DefaultText: .media.track[3].Default, Menu: .media.track[4].extra})')
# General
#nb_video=$(echo "$infos" | jq -j '.[] | .VideoCount')
nb_audio=$(echo "$infos" | jq -j '.[] | .AudioCount')
if [[ "$nb_audio" == "null" ]]; then nb_audio=0; fi
nb_text=$(echo "$infos" | jq -j '.[] | .TextCount')
if [[ "$nb_text" == "null" ]]; then nb_text=0; fi
nb_menu=$(echo "$infos" | jq -j '.[] | .MenuCount')
if [[ "$nb_menu" == "null" ]]; then nb_menu=0; fi
format_fichier=$(echo "$infos" | jq -j '.[] | .FormatFichier')
filesize=$(echo "$infos" | jq -j '.[] | .FileSize' | numfmt --to=si --format "%8.2f" | xargs)
#fsize=$(numfmt --to iec --format "%8.2f" "$filesize")
duree=$(echo "$infos" | jq -j '.[] | .Duration' | awk -F "." '{print $1}' | awk '{printf "%d:%02d:%02d", $1/3600, ($1/60)%60, $1%60}' | xargs)
# Video
format_video=$(echo "$infos" | jq -j '.[] | .FormatVideo')
format_profile=$(echo "$infos" | jq -j '.[] | .Format_Profile')
format_level=$(echo "$infos" | jq -j '.[] | .Format_Level')
codec_video=$(echo "$infos" | jq -j '.[] | .CodecVideo')
width=$(echo "$infos" | jq -j '.[] | .Width')
height=$(echo "$infos" | jq -j '.[] | .Height')
# Séries
if [[ $filename =~ $REGEX ]]; then
MATCH="${BASH_REMATCH[1]}"
# Remplace les . par des espaces
e=$(echo "${filename%$MATCH*}" | sed 's/\./\ /g' | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//')
# Capitalise chaque mot
f=($e)
g=${f[@]^}
# Met en majuscule SxxExx
new_name="$g - ${MATCH^^}.$DEST_EXT"
# Films
elif [[ $filename =~ $REGEX2 ]]; then
MATCH2="${BASH_REMATCH[0]}"
MATCH2=${MATCH2:1}
# Audio
format_audio=$(echo "$infos" | jq -j '.[] | .FormatAudio')
format_addition=$(echo "$infos" | jq -j '.[] | .FormatAdditionalFeatures')
if [[ "$format_addition" == "null" ]]; then format_addition=""; fi
codec_audio=$(echo "$infos" | jq -j '.[] | .CodecAudio')
title_audio=$(echo "$infos" | jq -j '.[] | .TitleAudio')
language_audio=$(echo "$infos" | jq -j '.[] | .LanguageAudio')
if [[ "$language_audio" == "null" ]]; then language_audio=""; fi
default_audio=$(echo "$infos" | jq -j '.[] | .DefaultAudio')
if [[ "$default_audio" == "null" ]]; then default_audio=""; fi
e=$(echo "${filename%$MATCH2*}" | sed 's/\./\ /g' | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//')
new_name="$e ($MATCH2).$DEST_EXT"
else
echo -e "${red}\nCould not find SXXEYY or YYYY pattern${reset}"
e=$(echo "${filename}" | sed 's/\./\ /g' | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//')
read -e -p "Title: " -i "$e" e
new_name="$e.$DEST_EXT"
#echo "new_name: $new_name"
#continue
fi
# Text
format_text=$(echo "$infos" | jq -j '.[] | .FormatText')
codec_text=$(echo "$infos" | jq -j '.[] | .CodecText')
language_text=$(echo "$infos" | jq -j '.[] | .LanguageText')
default_text=$(echo "$infos" | jq -j '.[] | .DefaultText')
if ! command -v mediainfo &>/dev/null; then
echo -e "${bold}mediainfo${reset} could not be found !\n"
echo -e "You should install ${bold}mediainfo${reset}:\n"
echo -e " - brew install mediainfo"
echo -e ""
else
#infos=$(mediainfo "$FILE" --output=JSON | jq -s 'map({ VideoCount: .media.track[0].VideoCount, AudioCount: .media.track[0].AudioCount, TextCount: .media.track[0].TextCount, MenuCount: .media.track[0].MenuCount, FormatFichier: .media.track[0].Format, FileSize: .media.track[0].FileSize, Duration: .media.track[0].Duration, FormatVideo: .media.track[1].Format, Format_Profile: .media.track[1].Format_Profile, Format_Level: .media.track[1].Format_Level, "CodecVideo": .media.track[1].CodecID, Width: .media.track[1].Width, Height: .media.track[1].Height, FormatAudio: .media.track[2].Format, FormatAdditionalFeatures: .media.track[2].Format_AdditionalFeatures, CodecAudio: .media.track[2].CodecID, TitleAudio: .media.track[2].Title, LanguageAudio: .media.track[2].Language, DefaultAudio: .media.track[2].Default, FormatText: .media.track[3].Format, CodecText: .media.track[3].CodecID, LanguageText: .media.track[3].Language, DefaultText: .media.track[3].Default, Menu: .media.track[4].extra})')
infos=$(mediainfo "$FILE" --output=JSON | jq '.media.track')
while read row; do
type=$(echo "$row" | jq -r '.["@type"]')
if [[ "$type" == "General" ]]; then
general="$row"
#echo "$general" | jq
nb_audio=$(echo "$general" | jq -j '.AudioCount')
if [[ "$nb_audio" == "null" ]]; then nb_audio=0; fi
nb_text=$(echo "$general" | jq -j '.TextCount')
if [[ "$nb_text" == "null" ]]; then nb_text=0; fi
nb_menu=$(echo "$general" | jq -j '.MenuCount')
if [[ "$nb_menu" == "null" ]]; then nb_menu=0; fi
format_fichier=$(echo "$general" | jq -j '.Format')
filesize=$(echo "$general" | jq -j '.FileSize' | numfmt --to=si --format "%8.2f" | xargs)
duree=$(echo "$general" | jq -j '.Duration' | awk -F "." '{print $1}' | awk '{printf "%d:%02d:%02d", $1/3600, ($1/60)%60, $1%60}' | xargs)
elif [[ "$type" == "Video" ]]; then
video="$row"
#echo "$video" | jq
fmt=$(echo "$video" | jq -j '.Format | select( . != null )')
if [ "$fmt" != "JPEG" ]; then
format_video=$(echo "$video" | jq -j '.Format | select( . != null )')
format_profile=$(echo "$video" | jq -j '.Format_Profile | select( . != null )')
format_level=$(echo "$video" | jq -j '.Format_Level | select( . != null )')
codec_video=$(echo "$video" | jq -j '.CodecID | select( . != null )')
width=$(echo "$video" | jq -j '.Width | select( . != null )')
height=$(echo "$video" | jq -j '.Height | select( . != null )')
fi
elif [[ "$type" == "Audio" ]]; then
audio="$row"
#echo "$audio" | jq
format_audio=$(echo "$audio" | jq -j '.Format | select( . != null )')
format_addition=$(echo "$audio" | jq -j '.Format_AdditionalFeatures | select( . != null )')
format_commercial=$(echo "$audio" | jq -j '.Format_Commercial_IfAny | select( . != null )')
codec_audio=$(echo "$audio" | jq -j '.CodecID | select( . != null )')
title_audio=$(echo "$audio" | jq -j '.Title | select( . != null )')
language_audio=$(echo "$audio" | jq -j '.Language | select( . != null )')
default_audio=$(echo "$audio" | jq -j '.Default | select( . != null )')
elif [[ "$type" == "Text" ]]; then
text="$row"
#echo "$text" | jq
format_text=$(echo "$text" | jq -j '.Format | select( . != null )')
codec_text=$(echo "$text" | jq -j '.CodecID | select( . != null )')
title_text=$(echo "$text" | jq -j '.Title | select( . != null )')
language_text=$(echo "$text" | jq -j '.Language | select( . != null )')
default_text=$(echo "$text" | jq -j '.Default | select( . != null )')
ft+=("$format_text")
ct+=("$codec_text")
tt+=("$title_text")
lt+=("$language_text")
dt+=("$default_text")
elif [[ "$type" == "Menu" ]]; then
menu="$row"
#echo "$menu" | jq
fi
done < <(echo "$infos" | jq -c '.[]')
# Menu
menu=$(echo "$infos" | jq -j '.[] | .Menu' | sed '1d;$d')
m=""
while IFS= read -r line
do
t=$(echo "$line" | awk -F": " '{print $1}')
c=$(echo "$line" | awk -F": " '{print $2}')
tt=$(echo "$t" | sed -n '1 s/"//gp' | xargs | sed 's/^_//' | sed 's/_/h/1' | sed 's/_/mm/1' | sed 's/_/s/1' | sed 's/s.*//')
cc=$(echo "$c" | tr -d '"' | xargs | awk -F ":" '{print $2}' | sed 's/,$//' | sed 's/^/ /')
m+="$cc : $tt\n"
done <<< "$menu"
echo -e "\n\n${bold}(${red}$(( count + 1 ))${reset}${bold} / $nb_movies) - $filename${reset}"
#menu=$(echo "$infos" | jq -j '.[] | .Menu' | sed '1d;$d')
menus=$(echo "$menu" | jq -j '.extra' | sed '1d;$d')
#echo "menus: $menus"
m=()
n=1
while IFS= read -r line; do
# L'apparition
# "_00_07_57_920": "en:00:07:57.920",
# Kandahar
# "_00_00_00_000": "1. Studio Logo",
REGEX1="^_(0[0-9]|1[0-9]|2[0-3])_([0-5][0-9])_([0-5][0-9])_([0-9][0-9][0-9])$"
if [[ ${line:3:13} =~ $REGEX1 ]]; then
t=$(echo "$line" | awk -F": " '{print $1}')
c=$(echo "$line" | awk -F": " '{print $2}')
#echo "t: $t"
#echo "c: $c"
# L'apparition
# t: "_00_07_57_920"
# c: "en:00:07:57.920",
ti=$(echo "$t" | sed -n '1 s/"//gp' | xargs | sed 's/^_//' | sed 's/_/h/1' | sed 's/_/mm/1' | sed 's/_/s/1' | sed 's/s.*//')
#cc=$(echo "$c" | tr -d '"' | xargs | awk -F ":" '{print $2}' | sed 's/,$//' | sed 's/^/ /')
cc=$(echo "$c" | tr -d '"' | xargs | sed 's/,$//' | sed 's/^/ /' | xargs)
#echo "tt: $tt"
#echo "cc: $cc"
# L'apparition
# tt: 00h07mm57
# cc: en:00:07:57.920
#m+=("$n:$tt")
m+=("$n:$cc ($ti)")
((n = n + 1))
fi
done <<<"$menus"
((count++))
echo -e "\n\n${bold}(${red}$count${reset}${bold} / $nb_movies) $filename${reset}"
echo -e "\n${bold}General:${reset}"
printf " %-20s %-35s \n" "Format de fichier:" "${format_fichier}"
printf " %-20s %-35s \n" "Taille de fichier:" "${filesize}"
printf " %-21s %-35s \n" "Duree:" "${duree}"
printf " %-20s %-35s \n" "Duree:" "${duree}"
echo -e "\n${bold}Video:${reset}"
printf " %-21s %-35s \n" "Format video:" "${format_video}"
printf " %-20s %-35s \n" "Format video:" "${format_video}"
printf " %-20s %-35s \n" "Profile:" "${format_profile}"
printf " %-20s %-35s \n" "Level:" "${format_level}"
printf " %-20s %-35s \n" "Codec:" "${codec_video}"
printf " %-20s %-35s \n" "Dimensions:" "${width} x ${height}"
echo -e "\n${bold}Audio:${reset}"
printf " %-20s %-35s \n" "Format audio:" "${format_audio}"
printf " %-20s %-35s \n" "Format additionnel:" "${format_addition}"
printf " %-20s %-35s \n" "Format commercial:" "${format_commercial}"
printf " %-20s %-35s \n" "Codec:" "${codec_audio}"
printf " %-20s %-35s \n" "Titre:" "${title_audio}"
printf " %-20s %-35s \n" "Language:" "${language_audio}"
printf " %-20s %-35s \n" "Defaut:" "${default_audio}"
if [[ "$nb_text" != 0 ]]; then
echo -e "\n${bold}Text:${reset}"
printf " %-20s %-35s \n" "Format text:" "${format_text}"
printf " %-20s %-35s \n" "Codec:" "${codec_text}"
printf " %-20s %-35s \n" "Language:" "${language_text}"
printf " %-20s %-35s \n" "Defaut:" "${default_text}"
#if [ "$nb_text" -ge 1 ]; then
# echo -e "\n${bold}Text:${reset}"
# printf " %-20s %-35s \n" "Titre:" "${title_text}"
# printf " %-20s %-35s \n" "Format:" "${format_text}"
# printf " %-20s %-35s \n" "Codec:" "${codec_text}"
# printf " %-20s %-35s \n" "Language:" "${language_text}"
# printf " %-20s %-35s \n" "Defaut:" "${default_text}"
#fi
if [ "$nb_text" -ge 1 ]; then
for val in "${!ft[@]}"; do
index=${val}
((index++))
echo -e "\n${bold}Text $index:${reset}"
printf " %-20s %-35s \n" "Titre:" "${tt[$val]}"
printf " %-20s %-35s \n" "Format:" "${ft[$val]}"
printf " %-20s %-35s \n" "Codec:" "${ct[$val]}"
printf " %-20s %-35s \n" "Language:" "${lt[$val]}"
printf " %-20s %-35s \n" "Defaut:" "${dt[$val]}"
done
fi
if [[ "$nb_menu" != 0 ]]; then
if [ "$nb_menu" -ge 1 ]; then
echo -e "\n${bold}Menu:${reset}"
echo -e "$m"
for elem in "${m[@]}"; do
#echo "${elem}"
# en:00:07:57.920 : 00h07mm57
c=$(echo "${elem}" | awk -F":" '{print $1}')
t=$(echo "${elem}" | awk -F":" '{print $2}')
printf " %-20s %-35s \n" "$c:" "${t}"
done
fi
fi # if mediainfo installed
fi # if mediainfo installed
file_export="$DEST"/"$new_name"
if [ ! -f "$file_export" ]; then
#echo -e "\n${yellow}Convert $FILE${reset} ${bold}->${reset} ${green}$file_export${reset}"
z="\n${yellow}Convert $FILE${reset} ${bold}->${reset} ${green}$file_export${reset}"
#echo -e "${red}language_text: ${language_text}${reset}" # fr-FR (killers of...) fr-FR (yannick)
#echo -e "${red}lt: ${lt[@]}${reset}" # fr fr-FR (killers of...) fr-FR (yannick)
#echo -e "${red}SUBTITLE_LIST: $SUBTITLE_LIST${reset}" # eng,fre
if [ "$nb_text" -ge 1 ]; then
echo -e "$z (with ${bold}${language_text}${reset} subtitle track)" # with fr-FR
$HANDBRAKE_CLI -i "$FILE" -o "$file_export" "$PRESET" --subtitle-lang-list "$SUBTITLE_LIST" --all-subtitles 2>>$logfile
else
echo -e "$z"
$HANDBRAKE_CLI -i "$FILE" -o "$file_export" "$PRESET" 2>>$logfile
fi
result=$?
echo
file_export="$DEST"/"$new_name"
if [ ! -f "$file_export" ]; then
echo -e "\n${yellow}Convert $FILE${reset} ${bold}->${reset} ${green}$file_export${reset}\n"
$HANDBRAKE_CLI -i "$FILE" -o "$file_export" "$PRESET" 2> $logfile
result=$?
if [ "$result" = 0 ]; then
notification "HandBrake for Plex" "$new_name available in $DEST" $result
fi
# Open DEST file in an app
if [ "$APP" != "" ]; then
if [[ $(command -v mdfind) == "" ]]; then
echo -e "\n${red}mdfind not find ! mdfind is a part macOS.${reset}"
else
x=$(mdfind -name "$APP" kind:application)
if [ "$x" != "" ]; then
if [ -f "$file_export" ]; then
echo -e "\n${bold}Opening $file_export in $APP...${reset}"
open -a "$APP" "$file_export"
fi
else
echo -e "\n${red}$APP was not found...${reset}"
if [ "$result" = 0 ]; then
echo -e "${green}$new_name available in $DEST${reset}"
notification "HandBrake for Plex" "$new_name available in $DEST" $result
fi
# Open DEST file in an app
if [ "$APP" != "" ]; then
if [[ $(command -v mdfind) == "" ]]; then
echo -e "\n${red}mdfind not find ! mdfind is a part macOS.${reset}"
else
#x=$(mdfind -name "$APP" kind:application)
# /usr/bin/mdfind $@ 2> >(grep --invert-match ' \[UserQueryParser\] ' >&2)
x=$(mdfind -name "$APP" kind:application 2>/dev/null)
if [ "$x" != "" ]; then
if [ -f "$file_export" ]; then
echo -e "\n${bold}Opening $file_export in $APP...${reset}"
open -a "$APP" "$file_export"
fi
else
echo -e "\n${red}$APP was not found...${reset}"
fi
fi
fi
# Move SRC file to trash
# if [[ "$OSTYPE" == "linux-gnu" ]] && [ -x "$(command -v zenity)" ]; then
# gvfs-trash filepath - gio trash some_file
# Move SRC file to trash
parent_folder=${FILE%/*}
if [ "$trash" = true ] && [[ "$OSTYPE" == "darwin"* ]]; then
echo -e "\n${italic}Move ${filename} to trash...${reset}"
osascript -e "tell application \"Finder\" to delete POSIX file \"${FILE}\"" >/dev/null
fi
if [ "$trash" = true ] && [[ "$OSTYPE" == "linux-gnu"* ]] && [[ $(command -v gio) != "" ]]; then
echo -e "\n${italic}Move ${filename} to trash...${reset}"
gio trash "$FILE" >/dev/null
fi
[ "$(echo "${parent_folder}/"*)" = "${parent_folder}/*" ] && rm -rf "${parent_folder}"
if [ "$trash" = true ] && [[ "$OSTYPE" == "darwin"* ]]; then
echo -e "\n${italic}Move ${filename} to trash...${reset}"
osascript -e "tell application \"Finder\" to delete POSIX file \"${FILE}\"" >/dev/null
fi
if [ "$trash" = true ] && [[ "$OSTYPE" == "linux-gnu"* ]] && [[ $(command -v gio) != "" ]]; then
echo -e "\n${italic}Move ${filename} to trash...${reset}"
gio trash "$FILE" >/dev/null
else
echo -e "\n${italic}Move ${filename} to trash...${reset}"
fi
echo ""
((count++))
echo ""
else
echo -e "\n${green}$file_export already transcoded !${reset}\n"
fi
FILESIZE=
else
echo -e "\n${green}$file_export already transcoded !${reset}\n"
((already_transcoded += 1))
fi
FILESIZE=
done
transcoded=$((count - already_transcoded))
if [ "$count" -eq 0 ]; then
if [ "$transcoded" -eq 0 ]; then
echo -e "\n${red}No file to transcode !${reset}"
else
echo -e "\n${green}${count} files successfully transcoded !${reset}"
echo -e "\n${green}${transcoded} files successfully transcoded !${reset}"
fi

46
iconv.sh Executable file
View File

@@ -0,0 +1,46 @@
#!/usr/bin/env bash
red="\033[1;31m"
greenbold="\033[1;32m"
green="\033[0;32m"
yellow="\033[0;33m"
bold="\033[1m"
#bold_under="\033[1;4m"
underline="\033[4m"
reset="\033[0m"
insta=false # #Becasseauvariable #LeTeich #Bird
flickr=true # "Bécasseau variable" "Le Teich" Bird
ccpx=true # Bécasseau variable, Le Teich, Bird
# Tags automatically added
# You can add tags to this 4 arrays
wild=("wildlife" "wildlifephoto" "wildlifephotographer")
nat=("naturelovers" "natureshot" "naturephotography")
reg=("Bourgogne" "Burgundy" "Bourgogne Franche-Comté" "Côte d'or")
#cinqcent=("Bécasseau variable" "Le Teich" "Bird")
for i in "${reg[@]}"
do
if [[ "$i" = *" "* ]]; then
region_flickr+="\"${i}\" "
#region_ccpx+="${i},"
else
region_flickr+="${i} "
#region_ccpx+="${i},"
fi
###
region_ccpx+="${i},"
#region_insta+="#$(echo "${i}" | iconv -f UTF-8-MAC -t ascii//translit | sed 's/[^a-zA-Z 0-9]//g' | sed 's/ //g') "
region_insta+="#$(echo "${i}" | iconv -s -f UTF-8-MAC -t ASCII//translit | sed 's/[^a-zA-Z 0-9]//g' | sed 's/ //g') "
done
echo "$region_flickr"
echo "$region_insta"
echo "$region_ccpx"

18
latest_release_on_github.sh Executable file
View File

@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Usage: ./latest_release_on_github.sh trunk-rs/trunk
a=$(curl --silent "https://api.github.com/repos/$1/releases/latest")
body=$(echo "$a" | grep '"body":' | sed -E 's/.*"([^"]+)".*/\1/')
echo -e "$body"
tag=$(echo "$a" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
echo -e "$tag"
get_latest_release() {
curl --silent "https://api.github.com/repos/$1/releases/latest" | # Get latest release from GitHub api
#grep '"tag_name":' | # Get tag line
grep '"body":' #|
#sed -E 's/.*"([^"]+)".*/\1/' # Pluck JSON value
}

View File

@@ -136,6 +136,8 @@ fi
if nmap "${server3[server]}" -PN -p ${server3[port]} | grep open &>/dev/null; then
# Failed to resolve "ftp.cluster011.ovh.net".
# WARNING: No targets were specified, so 0 hosts scanned.
echo ""
echo -e "${bold}********************************************"

125
ovh_api.sh Executable file
View File

@@ -0,0 +1,125 @@
#!/bin/bash
source ovh_secrets.txt
HTTP_QUERY="https://api.ovh.com/1.0/domain"
TIME=$(curl -s https://api.ovh.com/1.0/auth/time)
ZONE_FILE="zone.photos-nas.ovh"
ZONE="photos-nas.ovh"
# zone export
export_zone() {
HTTP_METHOD="GET"
HTTP_BODY=""
HTTP_QUERY="https://eu.api.ovh.com/v1/domain/zone/$ZONE/export"
CLEAR_SIGN="$OVH_APP_SECRET+$OVH_CONSUMER_KEY+$HTTP_METHOD+$HTTP_QUERY+$HTTP_BODY+$TIME"
SIG='$1$'$(echo -n $CLEAR_SIGN | openssl dgst -sha1 | sed -e 's/^.* //')
curl --silent -X $HTTP_METHOD -H "Content-Type:application/json;charset=utf-8" -H "X-Ovh-Application:$OVH_APP_KEY" -H "X-Ovh-Timestamp:$TIME" -H "X-Ovh-Signature:$SIG" -H "X-Ovh-Consumer:$OVH_CONSUMER_KEY" --data "$HTTP_BODY" $HTTP_QUERY | sed 's/\\n/\n/g' | sed 's/\"//g' | grep 'CNAME'> $ZONE_FILE
#curl --silent -X $HTTP_METHOD -H "Content-Type:application/json;charset=utf-8" -H "X-Ovh-Application:$OVH_APP_KEY" -H "X-Ovh-Timestamp:$TIME" -H "X-Ovh-Signature:$SIG" -H "X-Ovh-Consumer:$OVH_CONSUMER_KEY" --data "$HTTP_BODY" $HTTP_QUERY | sed 's/\\n/\n/g' | grep 'CNAME'
# |sed 's/,//g' |sed 's/\\n/\'$'\n''/g'
# | sed 's/\\n/\n/g'
echo $?
if [ $? == 0 ]; then
echo "$ZONE_FILE have been created !"
fi
}
#export_zone
cat $ZONE_FILE
refresh() {
HTTP_BODY=""
HTTP_QUERY="https://eu.api.ovh.com/v1/domain/zone/$ZONE/refresh"
CLEAR_SIGN="$OVH_APP_SECRET+$OVH_CONSUMER_KEY+$HTTP_METHOD+$HTTP_QUERY+$HTTP_BODY+$TIME"
SIG='$1$'$(echo -n $CLEAR_SIGN | openssl dgst -sha1 | sed -e 's/^.* //')
curl --silent -X $HTTP_METHOD -H "Content-Type:application/json;charset=utf-8" -H "X-Ovh-Application:$OVH_APP_KEY" -H "X-Ovh-Timestamp:$TIME" -H "X-Ovh-Signature:$SIG" -H "X-Ovh-Consumer:$OVH_CONSUMER_KEY" --data "$HTTP_BODY" $HTTP_QUERY
echo $? # 0
if [ $? == 0 ]; then
echo "Zone $ZONE have been successfully refresh !"
else
echo "Error while refreshing zone $ZONE !"
fi
}
# ajout d'un cname
add_cname() {
HTTP_METHOD="POST"
HTTP_BODY="{\"fieldType\": \"CNAME\",\"subDomain\": \"$1\",\"target\": \"photos-nas.ovh.\",\"ttl\": 0}"
HTTP_QUERY="https://eu.api.ovh.com/v1/domain/zone/$ZONE/record"
CLEAR_SIGN="$OVH_APP_SECRET+$OVH_CONSUMER_KEY+$HTTP_METHOD+$HTTP_QUERY+$HTTP_BODY+$TIME"
SIG='$1$'$(echo -n $CLEAR_SIGN | openssl dgst -sha1 | sed -e 's/^.* //')
curl --silent -X $HTTP_METHOD -H "Content-Type:application/json;charset=utf-8" -H "X-Ovh-Application:$OVH_APP_KEY" -H "X-Ovh-Timestamp:$TIME" -H "X-Ovh-Signature:$SIG" -H "X-Ovh-Consumer:$OVH_CONSUMER_KEY" --data "$HTTP_BODY" $HTTP_QUERY
echo $? # null
if [ $? == 0 ]; then
echo "CNAME $1 have been successfully added !"
else
echo "Error adding CNAME $1 !"
fi
HTTP_BODY=""
HTTP_QUERY="https://eu.api.ovh.com/v1/domain/zone/$ZONE/refresh"
CLEAR_SIGN="$OVH_APP_SECRET+$OVH_CONSUMER_KEY+$HTTP_METHOD+$HTTP_QUERY+$HTTP_BODY+$TIME"
SIG='$1$'$(echo -n $CLEAR_SIGN | openssl dgst -sha1 | sed -e 's/^.* //')
curl --silent -X $HTTP_METHOD -H "Content-Type:application/json;charset=utf-8" -H "X-Ovh-Application:$OVH_APP_KEY" -H "X-Ovh-Timestamp:$TIME" -H "X-Ovh-Signature:$SIG" -H "X-Ovh-Consumer:$OVH_CONSUMER_KEY" --data "$HTTP_BODY" $HTTP_QUERY
echo $? # 0
if [ $? == 0 ]; then
echo "Zone $ZONE have been successfully refresh !"
else
echo "Error while refreshing zone $ZONE !"
fi
}
add_cname "ntfy"
remove_cname() {
record=""
HTTP_METHOD="GET"
HTTP_BODY=""
HTTP_QUERY="https://eu.api.ovh.com/v1/domain/zone/$ZONE/record?fieldType=CNAME&subDomain=$1"
CLEAR_SIGN="$OVH_APP_SECRET+$OVH_CONSUMER_KEY+$HTTP_METHOD+$HTTP_QUERY+$HTTP_BODY+$TIME"
SIG='$1$'$(echo -n $CLEAR_SIGN | openssl dgst -sha1 | sed -e 's/^.* //')
record=$(curl --silent -X $HTTP_METHOD -H "Content-Type:application/json;charset=utf-8" -H "X-Ovh-Application:$OVH_APP_KEY" -H "X-Ovh-Timestamp:$TIME" -H "X-Ovh-Signature:$SIG" -H "X-Ovh-Consumer:$OVH_CONSUMER_KEY" --data "$HTTP_BODY" $HTTP_QUERY | sed 's/.//;s/.$//')
#echo $? # 0
if [ $? == 0 ] && [ -n "$record" ]; then
echo "Record number for CNAME $1 is $record !"
HTTP_METHOD="DELETE"
HTTP_BODY=""
HTTP_QUERY="https://eu.api.ovh.com/v1/domain/zone/$ZONE/record/$record"
CLEAR_SIGN="$OVH_APP_SECRET+$OVH_CONSUMER_KEY+$HTTP_METHOD+$HTTP_QUERY+$HTTP_BODY+$TIME"
SIG='$1$'$(echo -n $CLEAR_SIGN | openssl dgst -sha1 | sed -e 's/^.* //')
curl --silent -X $HTTP_METHOD -H "Content-Type:application/json;charset=utf-8" -H "X-Ovh-Application:$OVH_APP_KEY" -H "X-Ovh-Timestamp:$TIME" -H "X-Ovh-Signature:$SIG" -H "X-Ovh-Consumer:$OVH_CONSUMER_KEY" --data "$HTTP_BODY" $HTTP_QUERY
#echo $? # 0
if [ $? == 0 ]; then
echo "CNAME $1 have been successfully deleted !"
else
echo "Error while deleting CNAME $1 !"
fi
else
echo "No record number found for CNAME $1 !"
fi
}
#remove_cname "kuma"

209
photo_du_mois.sh Executable file
View File

@@ -0,0 +1,209 @@
#!/usr/bin/env bash
italic="\033[3m"
#underline="\033[4m"
#ita_under="\033[3;4m"
#bgd="\033[1;4;31m"
red="\033[1;31m"
green="\033[1;32m"
#yellow="\033[1;33m"
bold="\033[1m"
#box="\033[1;41m"
reset="\033[0m"
shopt -s globstar
# Source image folder
#ln -s ~/Sites/sls/photos/img ~/Pictures/Export/photos-du-mois
[[ "$input_path" == "" ]] && SRC="$HOME/Sites/_sls/photos/img" || SRC="$input_path"
# Server
server=( "ftp.cluster011.ovh.net" "sur-le-sentier.fr" "photos-nas.ovh" )
user=( "funnymac" "sentier" "bruno" )
dest=( "www/zenphoto/albums/photos-du-mois/" "httpdocs/photos/img/" "/volume1/web/photos/img/" )
port=( "22" "22" "42667" )
: <<'END_COMMENT'
user=sentier
server="sur-le-sentier.fr"
path="httpdocs/photos/img/"
port=22 # ssh, scp
user=bruno
server="clicclac.synology.me"
path="/volume1/web/"
port=42666
user=funnymac
server=ftp.cluster011.ovh.net
path="www/zenphoto/albums/photos-du-mois/"
port=22
END_COMMENT
last_remote_files() {
current_year=$(date +"%Y")
last_year=$(( current_year-1 ))
for ((i=0 ; i<"${#server[@]}" ; i++))
do
#rsync sentier@sur-le-sentier.fr:httpdocs/photos/img/'*' | grep -E "$last_year.jpg|$current_year.jpg"
# rsync -e "/usr/bin/ssh -p 42666" --rsync-path=/bin/rsync -zarvh "bruno@clicclac.synology.me:/volume1/web/photos/img/*"
echo -e "${bold}${server[$i]}${reset}:${dest[$i]}"
if [ "${server[$i]}" == "clicclac.synology.me" ]; then
lrf=$(rsync -e "/usr/bin/ssh -p ${port[$i]}" --rsync-path=/bin/rsync -zarvh "${user[$i]}"@"${server[$i]}":"${dest[$i]}*" | grep -E "$last_year.jpg|$current_year.jpg")
else
lrf=$(rsync -zarvh -e "ssh -p ${port[$i]}" "${user[$i]}"@"${server[$i]}":"${dest[$i]}*" | grep -E "$last_year.jpg|$current_year.jpg")
fi
echo "$lrf"
# rsync -zarvh -e "ssh -p 22" "sentier@sur-le-sentier.fr:httpdocs/photos/img/*"
l=$(echo "$lrf" | awk '{print $NF}' | awk -F"." '{print $1}') # 1_2022
e=""
while IFS= read -r line; do
m=$(echo "${line}" | awk -F"_" '{printf "%02d\n", $1}')
y=$(echo "${line}" | awk -F"_" '{print $2}')
d="$y-$m-01"
ts=$(date --date="$d" +"%s")
e+="$ts\n"
done <<< "$l"
echo
g=$(echo -e "$e" | sort -n | sed -n '$p')
last=$(date -d "@$g" +"%B %Y")
echo -e "More recent picture on ${server[$i]}: ${bold}$last${reset}"
echo
done
}
# 2022-12-31
REGEX="(([0-9]{4,}|[Y]{4,})-([0-9]{2,}|[M]{2,})-([0-9]{2,}|[D]{2,}))"
# http://patorjk.com/software/taag/#p=display&f=Calvin%20S&t=photo_du_mois.sh
echo -e "┌─┐┬ ┬┌─┐┌┬┐┌─┐ ┌┬┐┬ ┬ ┌┬┐┌─┐┬┌─┐ ┌─┐┬ ┬"
echo -e "├─┘├─┤│ │ │ │ │ │││ │ ││││ ││└─┐ └─┐├─┤"
echo -e "┴ ┴ ┴└─┘ ┴ └─┘─────┴┘└─┘────┴ ┴└─┘┴└─┘o└─┘┴ ┴"
echo
echo -e "\n${bold}0. Verify last uploads on remote servers (for info.)...${reset}\n"
last_remote_files
echo -e "\n${bold}1. From Lightroom Classic, export ${italic}collection 'Photo du mois'${reset}${bold} => $SRC${reset}\n"
echo -e "Done ! <Press Enter>"
read -r -p ""
# 2. Rename 2025-11-04_ChardonneretElegant_0747 to 11_2025.jpg
echo -e "\n${bold}2. Renaming Photos files...${reset}"
for FILE in "${SRC}"/**/*.{jpg,jpeg}
do
filename=$(basename "$FILE")
#extension=${filename##*.}
filename=${filename%.*}
if [[ $filename =~ $REGEX ]]; then
MATCH="${BASH_REMATCH[0]}"
y=$(echo "${MATCH}" | awk -F"-" '{print $1}')
m=$(echo "${MATCH}" | awk -F"-" '{print $2}')
if [ "${m:0:1}" = "0" ]; then m=${m:1:7}; fi
filepath=$(dirname "$FILE")
newname="$m"_"$y".jpg
newfilename="$filepath/$m"_"$y".jpg
echo -e "Rename ${bold}$filename${reset} to ${bold}$newname${reset}..."
mv "${FILE}" "$newfilename"
movies+=("${newfilename}")
fi
done
# 3. If new images -> copy them to server
if [ "${#movies[@]}" -gt 0 ]; then
echo -e "\n${bold}${#movies[@]} new images found !${reset}\n"
for ((i=0 ; i<"${#server[@]}" ; i++))
do
j=$((i++))
echo -e "\n\n${bold}3.$j Transfert Photos files to ${italic}${server[$i]}${reset}${bold}...${reset}"
if nmap "${server[$i]}" -PN -p "${port[$i]}" | grep open &>/dev/null; then
for new in "${movies[@]}"
do
echo -e "Transfering ${bold}$new${reset} to ${bold}${server[$i]}${reset}..."
filename=$(basename "$new")
#extension=${filename##*.}
filename=${filename%.*}
if [ "${server[$i]}" == "photos-nas.ovh" ]; then
scp -O -P "${port[$i]}" "$new" "${user[$i]}"@"${server[$i]}":"${dest[$i]}"
else
scp -P "${port[$i]}" "$new" "${user[$i]}"@"${server[$i]}":"${dest[$i]}"
# scp -P 22 1_2022.jpg funnymac@ftp.cluster011.ovh.net:www/zenphoto/albums/photos-du-mois/
fi
result=$?
[ "$result" -eq 0 ] && echo -e "${green}Successful transfert...${reset}\n" || echo -e "${red}Error during transfert !${reset}\n"
done
else
echo -e "\n${bold}${red}Server ${server[$i]} down !${reset}\n"
fi
done
else
echo -e "\n${bold}${red}3. No new images to transfer!${reset}"
fi
for ((i=0 ; i<"${#server[@]}" ; i++))
do
echo -e "\n\n${bold}4. Synchronise Local folder to ${server[$i]}${reset}..."
if nmap "${server[$i]}" -PN -p "${port[$i]}" | grep open &>/dev/null; then
if [ "${server[$i]}" == "photos-nas.ovh" ]; then
rsync -e "/usr/bin/ssh -p ${port[$i]}" --rsync-path=/bin/rsync --exclude-from="$HOME/.exclude-rsync.txt" -zarvh --stats --progress "$SRC/" "${user[$i]}"@"${server[$i]}":"${dest[$i]}"
else
rsync --exclude-from="$HOME/.exclude-rsync.txt" -zarvh --stats --progress "$SRC/" "${user[$i]}"@"${server[$i]}":"${dest[$i]}"
# rsync --exclude-from="$HOME/.exclude-rsync.txt" -zarvh --stats --progress "$HOME/Sites/_sls/photos/img" funnymac@ftp.cluster011.ovh.net:www/zenphoto/albums/photos-du-mois/
fi
result=$?
[ "$result" -eq 0 ] && echo -e "\n${green}Successful synchronization...${reset}" || echo -e "\n${red}Error during synchronization !${reset}"
if [ "$i" -eq 0 ]; then # 0 => clicclac.info
# Dans zenphoto, mettre en cache les photos
echo -e "\n${bold}5. Go to ${italic}https://clicclac.info/zenphoto/${reset}${bold} and update cache manager...${reset}\n"
open "https://clicclac.info/zenphoto/zp-core/zp-extensions/cacheManager/cacheImages.php?album=photos-du-mois"
#elif [ "$i" -eq 1 ]; then
else
echo -e "\n${bold}5. Open ${italic}https://${server[$i]}/admin/insert_bdd.php${reset}${bold}...${reset}\n"
open https://"${server[$i]}"/admin/insert_bdd.php
fi
else
echo -e "\n${bold}${red}Server ${server[$i]} down !${reset}\n"
fi
done

53
purge_server.sh Executable file
View File

@@ -0,0 +1,53 @@
#!/usr/bin/env bash
italic="\033[3m"
#underline="\033[4m"
#ita_under="\033[3;4m"
#bgd="\033[1;4;31m"
red="\033[1;31m"
green="\033[1;32m"
yellow="\033[1;33m"
bold="\033[1m"
#box="\033[1;41m"
reset="\033[0m"
host=$(hostname)
# status change XX*24 hours ago.
ago=30 # 30 jours
if [ "$host" == "localhost" ]; then
ip=$(hostname -I | awk '{print $1}')
if [ "$ip" = "212.227.191.167" ]; then
echo -e "\n${red}Running df -h /...${reset}"
df -h /
echo -e "\n${green}Remove backup logfiles ...${reset}"
sudo find /var/log/plesk/PMM/ -name 'backup*' -type d -ctime +$ago -exec rm -rf {} +;
#find /var/log/plesk/PMM/ -name 'backup*' -type d -ctime +$ago -exec rm -rf {} +;
echo -e "\n${green}Remove backup files ...${reset}"
sudo find /var/lib/psa/dumps -name 'backup*' -type f -ctime +$ago -exec rm -rf {} +;
#find /var/lib/psa/dumps -name 'backup*' -type f -ctime +$ago -exec rm -rf {} +;
echo -e "\n${green}Find files bigger than 200Mo ...${reset}"
sudo find / -type f -size +200M -exec du -h {} + 2>/dev/null | sort -r -h
echo -e "\n${green}Voir la place occupée par les logs ...${reset}"
journalctl --disk-usage -q
echo -e "\n${green}Décommenter la ligne SystemMaxUse dans /etc/systemd/journald.conf${reset}"
echo -e "\n${green}Running df -h /...${reset}"
df -h /
echo
fi
fi

241
pushover.sh Executable file
View File

@@ -0,0 +1,241 @@
#!/usr/bin/env bash
# ./pushover.sh -t "Pushover via Bash" -m "Pushover message sent with bash from $(hostname -f)" -p1 -s siren -u http://www.google.com -n "Google"
dotenv () {
set -a
# shellcheck disable=SC1091
[ -f "$HOME/.env" ] && . "$HOME/.env" || echo -e "${red}\nNo $HOME/.env file found ! Could'nt get update from Github.'.${reset}"
set +a
}
dotenv
USER_TOKEN=$USER_KEY
# YOUR APPS TOKENS / UPPERCASE NAME WITH _TOKEN (usage: "-a monitor" uses MONITOR_TOKEN)
BASH_TOKEN=$BASH_APP
SYNO_TOKEN=$SYNO_APP
APP_LIST="bash, syno" # FOR USAGE
APP_ID="bash" # Default app
# v1.8
# 24-08-2024 :
# 14-03-2018 : - Request send only necessary fields.
# - Added message pipe.
# - Added monospace option.
# - Default monitor name
# 12-03-2018 : Added image attachment.
# 30-01-2016 : Added -getopts- arguments to set retry/expire.
# 23-04-2015 : HTML markup language option.
VERSION=1.8
TITLE="<empty>"
URL="<empty>"
URL_TITLE="untitled"
PRIORITY=0
RETRY=60
EXPIRE=86400
SOUND="pushover"
HTML=0
MONOSPACE=0
DEVICE="all"
IMAGE=
DEBUG=0
usage()
{
cat << EOF
usage: $0 options
Push notifications to your Android, iOS, or desktop devices
OPTIONS:
-a Application name : "$APP_LIST" (required)
-m Message (required) If the -f (html) flag = 1, message must be surrounded by a single quote
Example: -m \"'This is a <b>HTML</b> test'\"
-t Title of your notification
-d Send to a specific device name Comma seperated list of devices to receive message
-p Priority of your message : -2 (Silent), -1 (Quiet), 0 (Normal), 1 (High), 2 (Emergency)
-s Sound (https://pushover.net/api#sounds):
pushover - Pushover (default)
bike - Bike
bugle - Bugle
cashregister - Cash Register
classical - Classical
cosmic - Cosmic
falling - Falling
gamelan - Gamelan
incoming - Incoming
intermission - Intermission
magic - Magic
mechanical - Mechanical
pianobar - Piano Bar
siren - Siren
spacealarm - Space Alarm
tugboat - Tug Boat
alien - Alien Alarm (long)
climb - Climb (long)
persistent - Persistent (long)
echo - Pushover Echo (long)
updown - Up Down (long)
none - None (silent)
-i Attach an image (up to 2.5mb)
-u URL Link
-n URL Title
-r Retry (seconds) Set retry period for notifications with priority 2 (default ${RETRY})"
-e Expire (seconds) Set expiration time for notifications with priority 2 (default ${EXPIRE})"
-f HTML Format Enable HTML formatting, cannot be used with the -k (monospace) flag
-k Monospace Format Enable monospace messages, cannot be used with the -f (html) flag
-x Debug Must be the first argument !!
-z Show some examples
-h Show this message
EOF
}
examples()
{
local script=`basename "$0"`
echo "EXAMPLES:"
echo
echo " ${script} -a \"bash\" -m \"This is a test\""
echo " Sends a simple \"This is a test\" message to all devices."
echo
echo " ${script} -a \"bash\" -m \"This is a test\" -t \"Test Title\""
echo " Sends a simple \"This is a test\" message with the title \"Test Title\" to all devices."
echo
echo " ${script} -a \"bash\" -m \"This is a test\" -d \"pixel8,Safari_airbook\""
echo " Sends a simple \"This is a test\" message to the devices named \"pixel8\" and \"Safari_airbook\"."
echo
echo " ${script} -a \"bash\" -m \"This is a test\" -u \"http://www.google.com\" -n Google"
echo " Sends a simple \"This is a test\" message to all devices that contains a link to www.google.com titled \"Google\"."
echo
echo " ${script} -a \"bash\" -m \"This is a test\" -p 1"
echo " Sends a simple \"This is a test\" high priority message to all devices."
echo
echo " ${script} -a \"bash\" -m \"This is a test\" -s bike"
echo " Sends a simple \"This is a test\" message to all devices that uses the sound of a bike bell as the notification sound."
echo
echo " ${script} -a \"bash\" -m \"This is a test Pic\" -i /path/to/pic.jpg "
echo " Sends a simple \"This is a test Pic\" message to all devices and send the Picture with the message."
echo
echo " ${script} -a \"bash\" -m \"'This is a <b>HTML</b> test'\" -f 1 "
echo " Sends a simple \"This is a HTML test\" message with html tag"
echo
}
ARGS=( -F "user=$USER_TOKEN" )
# MESSAGE PIPE
if [ -p /dev/stdin ]
then
MESSAGE=$(</dev/stdin)
ARGS+=( -F "message=$MESSAGE" )
else
MESSAGE=
fi
while getopts “hfkvt:r:e:u:n:p:s:m:a:d:i:xz” OPTION
do
case $OPTION in
t) TITLE=$OPTARG
ARGS+=( -F "title=$TITLE" ) ;;
u) URL=$OPTARG
ARGS+=( -F "url=$URL" ) ;;
n) URL_TITLE=$OPTARG
ARGS+=( -F "url_title=$URL_TITLE" ) ;;
p) PRIORITY=$OPTARG
ARGS+=( -F "priority=$PRIORITY" ) ;;
s) SOUND=$OPTARG
ARGS+=( -F "sound=$SOUND" ) ;;
f) HTML=1
ARGS+=( -F "html=$HTML" ) ;;
k) MONOSPACE=1
ARGS+=( -F "monospace=$MONOSPACE" ) ;;
r) [ ! -z $OPTARG ] && RETRY=$OPTARG ;;
e) [ ! -z $OPTARG ] && EXPIRE=$OPTARG ;;
d) DEVICE=$OPTARG
ARGS+=( -F "device=$DEVICE" ) ;;
i) IMAGE="$OPTARG"
ARGS+=( -F "attachment=@${IMAGE}" ) ;;
a)
APP_ID="$OPTARG"
;;
m)
if [[ -z $MESSAGE ]]
then
MESSAGE=$OPTARG
ARGS+=( -F "message=$MESSAGE" )
#ARGS+=( -F "message='$MESSAGE'" )
fi
;;
v) echo "Pushover shell script version ${VERSION}" && exit 1 ;;
x) DEBUG=1 ;;
:) echo "Option -$OPTARG requires an argument." >&2; exit 1 ;;
h) usage; exit 1 ;;
z) examples; exit 1 ;;
?) usage; exit ;;
esac
done
# APP TOKEN
if [[ ! -z $APP_ID ]]
then
APP_ID=`echo $APP_ID | tr '[:lower:]' '[:upper:]'`
APP_NAME="${APP_ID}_TOKEN"
APP_TOKEN="${!APP_NAME}"
ARGS+=( -F "token=$APP_TOKEN" )
fi
# EMERGENCY PRIORITY
if [[ $PRIORITY == 2 ]]
then
ARGS+=( -F "retry=$RETRY" )
ARGS+=( -F "expire=$EXPIRE" )
fi
# REQUIRED FIELDS
if [[ -z $MESSAGE ]] || [[ -z $APP_TOKEN ]]
then
echo -e "\n\\033[31mMessage and Application token are required.\\033[0m"
usage
exit 1
fi
if [[ $HTML == 1 ]]
then
MESSAGE="'$MESSAGE'"
fi
# DEBUG PRINT
if [[ $DEBUG == 1 ]]
then
echo "TITLE ...... $TITLE"
echo "DEVICE ..... $DEVICE"
echo "URL ........ ${URL} (${URL_TITLE})"
echo "FORMAT ..... HTML ${HTML} MONOSPACE ${MONOSPACE}"
echo "APP ........ ID:${APP_ID} TOKEN:${APP_TOKEN}"
echo "PRIORITY ... $PRIORITY"
if [[ $PRIORITY == 2 ]]
then
echo "RETRY ...... $RETRY"
echo "EXPIRE ..... $EXPIRE"
fi
echo "SOUND ...... $SOUND"
echo "IMAGE ..... $IMAGE"
echo "MESSAGE -----------------------------------------"
echo "${MESSAGE}"
echo "-------------------------------------------------"
exit 0
fi
# SEND NOTIFICATION
curl -s "${ARGS[@]}" https://api.pushover.net/1/messages.json
#echo "${ARGS[@]}"

59
reachable.sh Executable file
View File

@@ -0,0 +1,59 @@
#!/usr/bin/env bash
host1=maboiteverte.fr
port1=22
host2=clicclac.synology.me
port2=42666
echo -e "\nnc\n"
if nc -z -G 2 $host1 $port1 &>/dev/null; then
echo $?
echo "server $host1 up"
else
echo $?
echo "server $host1 down"
fi
if nc -z -G 2 $host2 $port2 &>/dev/null; then
echo $?
echo "server $host2 up"
else
echo $?
echo "server $host2 down"
fi
echo -e "\nnmap\n"
if nmap maboiteverte.fr -PN -p 22 | grep open &>/dev/null; then
echo $?
echo "server $host1 up"
else
echo $?
echo "server $host1 down"
fi
if nmap clicclac.synology.me -PN -p 42666 | grep open &>/dev/null; then
echo $?
echo "server $host2 up"
else
echo $?
echo "server $host2 down"
fi
echo -e "\nping\n"
ping -c1 -W1 -q maboiteverte.fr 2>/dev/null;
echo $?
ping -c1 -W1 -q clicclac.synology.me 2>/dev/null;
echo $?

48
remote_scripts.sh Executable file
View File

@@ -0,0 +1,48 @@
#!/usr/bin/env bash
# remote scripts
ssh -t bruno@maboiteverte.fr ./purge_server.sh
ssh -t bruno@maboiteverte.fr ./upgrade_joplin.sh
ssh -t bruno@maboiteverte.fr ./mbv-gitea-upd.sh
# sudo: /opt/plesk/php/7.2/bin/php: command not found
#ssh -t bruno@maboiteverte.fr ./upgrade_nextcloud.sh
printf './upgrade_nextcloud.sh' | ssh -t bruno@maboiteverte.fr 'bash -l'
# pb with ssh keys
ssh -t bruno@maboiteverte.fr ./backup_vps.sh
# ssh bruno@maboiteverte.fr 'source ~/.bash_profile && php -v'
#PHP 7.2.24
# echo "php -v" | mbv
# PHP 8.2.6
# php -v | ssh 'bruno@maboiteverte.fr'
#-bash: line 1: syntax error near unexpected token `('
#-bash: line 1: `PHP 8.2.10 (cli) (built: Sep 1 2023 00:17:29) (NTS)'
# php -v | ssh bruno@maboiteverte.fr 'bash -l'
# bash: line 1: syntax error near unexpected token `('
# bash: line 1: `PHP 8.2.10 (cli) (built: Sep 1 2023 00:17:29) (NTS)'
# printf 'php -v' | ssh bruno@maboiteverte.fr 'bash -l'
# PHP 8.2.6 (cli) (built: May 15 2023 06:37:47) (NTS)
# Copyright (c) The PHP Group
# Zend Engine v4.2.6, Copyright (c) Zend Technologies
# with Zend OPcache v8.2.6, Copyright (c), by Zend Technologies
# printf 'php -v' | ssh bruno@maboiteverte.fr
# Pseudo-terminal will not be allocated because stdin is not a terminal.
# PHP 8.2.6 (cli) (built: May 15 2023 06:37:47) (NTS)
# Copyright (c) The PHP Group
# Zend Engine v4.2.6, Copyright (c) Zend Technologies
# with Zend OPcache v8.2.6, Copyright (c), by Zend Technologies

67
rename_series.sh Executable file
View File

@@ -0,0 +1,67 @@
#!/usr/bin/env bash
italic="\033[3m"
underline="\033[4m"
ita_under="\033[3;4m"
bgd="\033[1;4;31m"
red="\033[1;31m"
green="\033[1;32m"
yellow="\033[1;33m"
bold="\033[1m"
box="\033[1;41m"
reset="\033[0m"
shopt -s globstar
SRC="$HOME/Downloads"
DEST="$HOME/Movies"
DEST_EXT=mp4
#HANDBRAKE_CLI=HandBrakeCLI
PRESET="Apple 720p30 Surround"
MAXSIZE=30000000
REGEX="([sS]([0-9]{2,}|[X]{2,})[eE]([0-9]{2,}|[Y]{2,}))"
#REGEX2="[0-9]{4}"
REGEX2="2[0-9]{3}"
for FILE in "${SRC}"/**/*.{mkv,avi,mp4,m4v}
do
echo "$FILE"
filename=$(basename "$FILE")
#echo "$filename" # Arctic.Circle.S01E02.iNTERNAL.MULTi.720p.WEB.H264-CiELOS.mkv
extension=${filename##*.}
#echo "$extension" # mkv
filename=${filename%.*} # sans extension
#echo "$filename" # Arctic.Circle.S01E02.iNTERNAL.MULTi.720p.WEB.H264-CiELOS
# Get file size
FILESIZE=$(stat -c%s "$FILE")
if (( FILESIZE > MAXSIZE )); then
if [[ $filename =~ $REGEX ]]; then
MATCH="${BASH_REMATCH[1]}"
e=$(echo ${filename%$MATCH*} | sed 's/\./\ /g' | xargs)
new_name="$e - $MATCH.$DEST_EXT"
echo "$new_name"
elif [[ $filename =~ $REGEX2 ]]; then
MATCH2="${BASH_REMATCH[0]}"
e=$(echo ${filename%$MATCH2*} | sed 's/\./\ /g' | xargs)
new_name="$e ($MATCH2).$DEST_EXT"
echo "$new_name"
else
echo "Could not find SXXEYY pattern in new format"
echo " "
continue
fi
echo "--------------"
fi
done

74
rsync-retry.sh Executable file
View File

@@ -0,0 +1,74 @@
#!/bin/bash
### ABOUT: See: http://gist.github.com/366269
### Runs rsync, retrying on errors up to a maximum number of tries.
### On failure script waits for internect connection to come back up by pinging google.com before continuing.
###
### Usage: $ ./rsync-retry.sh source destination
### Example: $ ./rsync-retry.sh user@server.example.com:~/* ~/destination/path/
###
### INPORTANT:
### To avoid repeated password requests use public key authentication instead of passwords
### "ssh-keygen" (with no password), then "ssh-copy-id user@server.example.com"
# ----------------------------- rSync Options ------------------------------------------------
OPT="--inplace -vzP"
# -------------------- Shouldn't need to change anything bellow -------------------------------
echo -n "Enter No. of retries to attempt... "
read MAX_RETRIES
echo -n "Recursive flag ON? (y/n) "
read YN
if [[ $YN == "y" || $YN == "Y" ]]; then
RFLAG=r
fi
COM="rsync $OPT$RFLAG -e 'ssh -o \"ServerAliveInterval 10\"' $1 $2"
echo
echo "Using command: $COM"
# Trap interrupts and exit instead of continuing the loop
trap "echo Ctl+C Detected... Exiting!; exit;" SIGINT SIGTERM
COUNT=0
START=$SECONDS
# Set the initial exit value to failure
false
while [ $? -ne 0 -a $COUNT -lt $MAX_RETRIES ]; do
COUNT=$(($COUNT+1))
if [ $COUNT -ne 1 ]; then
echo
echo "Waiting for Internet connection..."
false
until [ $? -eq 0 ]; do
wget -q --tries=10 --timeout=5 http://www.google.com -O /tmp/index.google &> /dev/null
done
fi
echo
echo "Attempt No. $COUNT / $MAX_RETRIES"
echo
## Havn't got the quoting quite right above to just have $COM here.
#$COM
rsync -vzP$RFLAG --inplace -e 'ssh -o "ServerAliveInterval 10"' $1 $2
done
FINISH=$SECONDS
if [[ $(($FINISH - $START)) -gt 3600 ]]; then
ELAPSED="$((($FINISH - $START)/3600))hrs, $(((($FINISH - $START)/60)%60))min, $((($FINISH - $START)%60))sec"
elif [[ $(($FINISH - $START)) -gt 60 ]]; then
ELAPSED="$(((($FINISH - $START)/60)%60))min, $((($FINISH - $START)%60))sec"
else
ELAPSED="$(($FINISH - $START))sec"
fi
if [ $COUNT -eq $MAX_RETRIES -a $? -ne 0 ]; then
echo "Hit maximum number of retries($MAX_RETRIES), giving up. Elapsed time: $ELAPSED"
fi
if [ $? -eq 0 ]; then
echo "Finished after $COUNT retries!! Elapsed time: $ELAPSED"
fi

41
run.sh Executable file
View File

@@ -0,0 +1,41 @@
#!/usr/bin/env bash
italic="\033[3m"
underline="\033[4m"
ita_under="\033[3;4m"
bgd="\033[1;4;31m"
red="\033[1;31m"
bold="\033[1m"
box="\033[1;41m"
reset="\033[0m"
# Main menu
menu(){
options=(
"(u)pdates.sh (Update websites)"
"mk(s)erve (Serve MkDocs)"
"mk(b)uild.sh (Transfer MkDocs to servers)"
"photo_du_mois.sh (Transfer photo_du_mois.jpg to servers)"
"(Q)uit"
)
echo -e "\n\033[1mScripts menu: \033[0m\n"
select option in "${options[@]}"; do
case "$REPLY" in
1|u|U) ./updates.sh ;;
2|s|S) cd $HOME/Documents/docs ; mkdocs serve ;;
3|b|B) ./mkbuild.sh ;;
4|m|M) ./photo_du_mois.sh ;;
4|q|Q) exit 0 ;;
esac
done
}
menu

47
server.sh Executable file
View File

@@ -0,0 +1,47 @@
#!/usr/bin/env bash
: <<'END_COMMENT'
# server1: clicclac.synology.me
declare -A server1
server1[user]="bruno"
server1[server]="clicclac.synology.me"
server1[dest]="/volume1/web/$folder/"
server1[port]=42666
# server2: ovh.net
declare -A server2
server2[user]="funnymac"
server2[server]="ftp.cluster011.ovh.net"
server2[dest]="www/$folder/"
server2[port]=22
# server3: maboiteverte.fr
declare -A server3
server3[user]="bruno"
server3[server]="ftp.maboiteverte.fr"
server3[dest]="httpdocs/$folder/"
server3[port]=22
END_COMMENT
server=( "ftp.cluster011.ovh.net" "sur-le-sentier.fr" "ftp.maboiteverte.fr" "clicclac.synology.me" )
user=( "funnymac" "sentier" "bruno" "bruno" )
dest=( "www/zenphoto/albums/photos-du-mois/" "httpdocs/photos/img/" "httpdocs/" "/volume1/web/" )
port=( "22" "22" "22" "42666" )
for new in "${server[@]}"
do
echo "${new}"
done
echo ""
for ((i=0 ; i<"${#server[@]}" ; i++))
do
echo ${server[$i]} - ${user[$i]} - ${dest[$i]} - ${port[$i]}
done

186
sort_export_folder.sh Executable file
View File

@@ -0,0 +1,186 @@
#!/bin/bash
VERSION=1.5
#NO_COLOR=1
# Check if NO_COLOR is set to disable colorization
if [ -z "$NO_COLOR" ]; then
: "${COLOR_GREEN:=$'\e[32m'}"
: "${COLOR_GREEN_BOLD:=$'\e[1;32m'}"
: "${COLOR_RED:=$'\e[31m'}"
: "${COLOR_RED_BOLD:=$'\e[1;31m'}"
: "${COLOR_YELLOW=$'\e[33m'}"
: "${COLOR_YELLOW_BOLD:=$'\e[1;33m'}"
: "${COLOR_SILVER=$'\e[37m'}"
: "${COLOR_LIGHT_GREY=$'\e[249m'}"
: "${COLOR_BRIGHT_PURPLE=$'\e[35;1m'}"
: "${COLOR_PURPLE=$'\e[35m'}"
: "${BOLD:=$'\e[1m'}"
: "${ITALIC:=$'\e[3m'}"
: "${COLOR_RESET:=$'\e[00m'}"
else
: "${BOLD:=$'\e[1m'}"
: "${COLOR_RESET:=$'\e[00m'}"
: "${ITALIC:=$'\e[3m'}"
fi
fr_months=("Janvier" "Février" "Mars" "Avril" "Mai" "Juin" "Juillet" "Août" "Septembre" "Octobre" "Novembre" "Décembre")
# Vérifiez si exiftool est installé
if ! command -v exiftool &> /dev/null; then
echo "exiftool n'est pas installé. Veuillez l'installer d'abord."
exit 1
fi
# Help
Help() {
clear
echo -e "\n${COLOR_GREEN_BOLD}Sort Export Folder $VERSION${COLOR_RESET}\n"
echo "Syntaxe: sort_export_folder.sh [<folder>]"
echo
echo "Tri les photos contenues dans un dossier, et selon le mois de prise de vue, les copies dans des dossiers AN/Mois AN"
echo "Requiert le tag -CreateDate avec exiftool"
echo
echo "Options:"
echo " -h Affiche l'aide"
echo " -d Dossier à trier"
echo
echo "Exemples: sort_export_folder.sh -d /Volumes/Sophie/Export"
echo " sort_export_folder.sh"
echo
echo "Requiert l'installation de exiftool"
echo " -https://exiftool.org"
echo " -brew install exiftool"
}
### Parse options
optspec="fh"
while getopts "$optspec" opt
do
case ${opt} in
d) PHOTO_DIR="${!OPTIND}"; OPTIND=$(( OPTIND + 1 )) ;;
h) Help
Help
exit 2
;;
*) exit 1 ;;
esac
done
shift $((OPTIND -1))
if [[ -z "$PHOTO_DIR" ]]; then
# Répertoire contenant les photos
while :
do
read -e -p "Répertoire contenant les photos: " PHOTO_DIR
[ "$PHOTO_DIR" == "q" ] && exit 1
if [ "$PHOTO_DIR" != "q" ] && [ -d "$PHOTO_DIR" ]; then
break 2
fi
done
fi
nb_jpg_before=$(ls -Uba1 "$PHOTO_DIR" | grep -E -c '.jpg|.jpeg|.cr3|.tif|.dng|.webp|.avif'$)
echo "$nb_jpg_before images trouvées dans $PHOTO_DIR"
[ $nb_jpg_before -eq 0 ] && exit 3
echo
i=0
# Parcourir chaque fichier dans le répertoire
for PHOTO in "$PHOTO_DIR"/*; do
# Vérifiez si le fichier est une image
if [[ -f "$PHOTO" ]] && [[ $(file --mime-type -b "$PHOTO") == image/* ]]; then
# Extraire la date de création EXIF
DATE=$(exiftool -d "%Y-%m" -CreateDate -s -s -s "$PHOTO" 2>/dev/null)
if [[ -n "$DATE" ]]; then
y=$(echo "$DATE" | awk -F"-" '{print $1}')
m=$(echo "$DATE" | awk -F"-" '{print $2}')
else
# image extraite d'une vidéo -> pas de -CreateDate
# 2015-09-11_Daguet_0090.jpg
x=$(basename "$PHOTO" | awk -F"_" '{print $1}')
y=$(echo "$x" | awk -F"-" '{print $1}')
m=$(echo "$x" | awk -F"-" '{print $2}')
fi
# Si le mois commence par 0, on supprime le 0
[ ${m:0:1} == "0" ] && m=${m:1}
# L'index du tableau commence par 0, donc on retranche 1
d=${fr_months["$((m - 1))"]}
month=$(echo "$d $y" | sed 'y/àáâäãåèéêëìíîïòóôöõùúûüÿćčçčďđłńňřśšťžż/aaaaaaeeeeiiiiooooouuuuyccccddlnnrsstzz/')
# Si la date est extraite avec succès
if [[ -n "$month" ]]; then
# Créer le répertoire pour le mois correspondant
MONTH_DIR="$PHOTO_DIR/$month"
mkdir -p "$MONTH_DIR"
# Déplacer la photo dans le répertoire du mois
mv "$PHOTO" "$MONTH_DIR/" &
#echo "Déplacé : $PHOTO -> $MONTH_DIR/"
else
echo "Aucune date EXIF trouvée pour : $PHOTO"
fi
((++i))
fi
done
wait
echo "Triage de $i photos terminé."
nb_jpg_after=$(ls -Uba1 "$PHOTO_DIR" | grep -E -c '.jpg|.jpeg|.cr3|.tif|.dng|.webp|.avif'$)
echo "$nb_jpg_after images trouvées dans $PHOTO_DIR"
#subfolders=$(ls -A "$PHOTO_DIR" | tr '\n' ', ' | sed 's/.$//')
subfolders=$(ls -A "$PHOTO_DIR" | tr '\n' ' ' | sed 's/.$//')
#####
echo
nb_subfolders=$(ls -l "$PHOTO_DIR" | grep -c ^d)
echo "Il y a $nb_subfolders sous-dossiers dans $PHOTO_DIR. Rangeons-les par année !"
for DIR in "$PHOTO_DIR"/*; do
if [[ -d "$DIR" ]]; then
year=$(basename "$DIR" | awk -F" " '{print $2}')
new_year+=(${year})
if [[ -n "$year" ]]; then
# Créer le répertoire pour l'année correspondante
YEAR_DIR="$PHOTO_DIR/$year"
mkdir -p "$YEAR_DIR"
mv "$DIR" "$YEAR_DIR/" &
#echo "Déplacé : $DIR -> $YEAR_DIR/"
fi
fi
done
nb_year_folders=$(ls -l "$PHOTO_DIR" | grep -c ^d)
#year_folders=$(ls -d *)
year_folders=$(cd "$PHOTO_DIR"; ls -d * | tr '\n' ' ')
echo "$nb_year_folders sous-répertoires $year_folders crées."
###
nb_jpg_id_dest=$(find "$PHOTO_DIR" -mindepth 2 -type f -exec bash -c 'echo ${0%${0#$1}}' {} "$PHOTO_DIR" \; | uniq -c | awk '{print $1}')
echo "$nb_jpg_id_dest images trouvées dans les sous-répertoires $subfolders"
[ $nb_jpg_after -ne 0 ] && echo "Erreur !! Il reste des photos dans le dossier d'origine."
[ $nb_jpg_before -ne $nb_jpg_id_dest ] && echo "Erreur !! Toutes les photos n'ont pas été déplacées."
echo
tr=$(tree -d "$PHOTO_DIR" | head -n -1)
echo -e "${COLOR_PURPLE}$tr${COLOR_RESET}"
tree -a "$PHOTO_DIR" | tail -n 1

126
sphp_php-fpm.sh Executable file
View File

@@ -0,0 +1,126 @@
#!/usr/bin/env bash
underline="\033[4m"
red="\033[1;31m"
green="\033[1;32m"
yellow="\033[1;33m"
bold="\033[1m"
reset="\033[0m"
if [ "$1" == "-h" ]; then
echo -e "\\033[4msphp_php-fpm.sh \\033[0m"
echo "Change php version (php-fpm)"
echo
echo "USAGE: sphp_php-fpm.sh version (8.1 8.2 8.3)"
echo
echo " -h display this help"
echo
exit 0
fi
#
# mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers
#
homebrew_path=$(brew --prefix)
brew_prefix=$(brew --prefix | sed 's#/#\\\/#g')
protocol="http"
apache_conf_path=$(httpd -V | grep 'SERVER_CONFIG_FILE' | awk -F '\"' '{print $2}')
document_root=$(grep -e '^DocumentRoot' "$apache_conf_path" | awk '{print $2}' | sed 's/\"//g')
server_name=$(grep -e '^ServerName' "$apache_conf_path" | awk '{print $2}')
h=$(hostname)
vhost_conf=$(grep -e 'httpd-vhosts.conf' $apache_conf_path | awk '{print $2}')
#ssl_conf=$(grep -e 'httpd-ssl.conf' $homebrew_path/etc/httpd/httpd.conf | awk '{print $2}')
ssl_conf=$(grep -e 'httpd-ssl.conf' $apache_conf_path | awk '{print $2}')
if [ -f "$ssl_conf" ]; then
apache_port=$(cat $ssl_conf | grep -e '^Listen' | awk '{print $2}')
a=$(nmap --script http-methods -p$apache_port --script-args http-methods.url-path=/page $h | grep -A1 "^PORT" | tail -1 | awk '{print $3}')
if [[ "$a" == "http" ]] || [[ "$a" == "https" ]]; then protocol=$a; fi
fi
brew_array=("8.1","8.2","8.3")
php_array=("php@8.1" "php@8.2" "php@8.3")
php_installed_array=()
php_version="php@$1"
php_opt_path="$brew_prefix\/opt\/"
simple_php_version=$(echo "$php_version" | sed 's/^php@//' | sed 's/\.//')
# Current php version (from httpd.conf)
ip=$(grep -E SetHandler $apache_conf_path | grep -v \# | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}:[0-9]{4}")
x=${ip: -2}
current__simple_php_version="$x"
current_php_version="php@${x:0:1}.${x:1}"
echo -e "${underline}Current${reset} php version: ${bold}$current_php_version${reset}"
# What versions of php are installed via brew
# /opt/homebrew/etc/php/8.0/php-fpm.d/www.conf - listen = 127.0.0.1:9081
echo -e "\nPHP version ${underline}installed${reset}:"
for i in ${php_array[*]}; do
version=$(echo "$i" | sed 's/^php@//')
if [[ -d "$homebrew_path/etc/php/$version" ]]; then
php_installed_array+=("$i")
#php_port=$(sed -n "/^listen/p" $homebrew_path/etc/php/$version/php-fpm.d/www.conf)
php_ipport=$(grep -E ^listen $homebrew_path/etc/php/$version/php-fpm.d/www.conf | awk -F" = " '{print $2}')
php_running=$(lsof -i -n -P | grep php-fpm | grep $php_ipport)
[ -n "$php_running" ] && echo -e " ● php-fpm version: ${bold}$i${reset} ($php_ipport)" "${green}Running...${reset}" || echo -e "php-fpm version: $version ($php_ipport)" "${red}Stopped.${reset}"
echo -e " ● php (cli): /opt/homebrew/opt/$i/bin/php"
fi
done
proxy_pass_match_string="ProxyPassMatch \"^/(.*\.php(/.*)?)$\" \"fcgi://127.0.0.1:90$simple_php_version/opt/homebrew/local/var/www/\$1\""
set_handler_string="SetHandler \"proxy:fcgi://127.0.0.1:90$simple_php_version\""
# Check that the requested version is supported
if [[ " ${php_array[*]} " == *"$php_version"* ]]; then
# Check that the requested version is installed
if [[ " ${php_installed_array[*]} " == *"$php_version"* ]]; then
if [[ "$php_version" == "$current_php_version" ]]; then
echo -e "\nPHP already running version ${bold}$php_version${reset} !"
echo "Exiting..."
exit 0
else
version=$(echo "$php_version" | sed 's/^php@//')
echo -e "\nSwitching to ${bold}$php_version${reset}..."
echo "Edit your Apache conf..."
#sed -i.bak "s/ProxyPassMatch.*/ProxyPassMatch \"^/(.*\.php(/.*)?)$\" \"fcgi:\/\/127.0.0.1:90$simple_php_version\/opt\/homebrew\/local\/var\/www\/\$1\"/" $apache_conf_path
#sed -i.bak "s/SetHandler \"proxy:fcgi.*/SetHandler \"proxy:fcgi:\/\/127.0.0.1:90$simple_php_version\"/" $apache_conf_path
sed -i.bak "s/fcgi:\/\/127.0.0.1:90$current__simple_php_version/fcgi:\/\/127.0.0.1:90$simple_php_version/" $apache_conf_path
echo "Restarting Apache server..."
#brew services restart httpd
sudo apachectl -k restart
echo "Loading PHP info..."
echo '<?php echo phpinfo(); ?>' > $document_root/php-info.php && open "$protocol://$server_name/php-info.php"
echo "All done!"
echo -e "\n${underline}Apache conf files:${reset}"
echo "$apache_conf_path"
echo "$vhost_conf"
echo "$ssl_conf"
echo -e "${underline}PHP conf files:${reset}"
echo "$homebrew_path/etc/php/$version/php.ini"
echo "$homebrew_path/etc/php/$version/php-fpm.d/www.conf"
find "$homebrew_path/etc/php/$version/conf.d" -name "*.ini" -print | sort -n
fi
else
echo -e "\nSorry, but $php_version is not installed via brew. Install by running: brew install $php_version"
fi
else
echo -e "\nUnknown version of PHP. PHP Switcher can only handle arguments of:" ${brew_array[@]}
fi

67
stacks.sh Normal file
View File

@@ -0,0 +1,67 @@
#!/usr/bin/env bash
red="\033[1;31m"
greenbold="\033[1;32m"
green="\033[0;32m"
yellow="\033[0;33m"
bold="\033[1m"
#bold_under="\033[1;4m"
italic="\033[3m"
underline="\033[4m"
reset="\033[0m"
dotenv () {
set -a
# shellcheck disable=SC1091
[ -f "$HOME/.env" ] && . "$HOME/.env" || echo -e "${red}\nNo .env file found ! Archive won't be encrypted !${reset}"
set +a
}
dotenv
dir_docker="/volume1/docker"
dir_stacks="/volume1/docker/dockge/stacks"
dir_backup="/volume1/docker/_backup"
[ ! -d "$dir_backup" ] && mkdir "$dir_backup"
stacks=$(cd "$dir_stacks" && fd -g docker-compose.yml)
nb=0
while IFS= read -r line; do
app=$(echo "${line}" | awk -F"/" '{print $1}')
folder="$dir_backup/$app"
[ ! -d "$folder" ] && mkdir "$folder"
cp "$line" "$folder"
((nb++))
done <<< "$stacks"
echo -e "$nb 'docker-compose.yml' files founds in DockGe !"
env=$(cd "$dir_stacks" && fd -H -g .env)
nb=0
while IFS= read -r line; do
app=$(echo "${line}" | awk -F"/" '{print $1}')
folder="$dir_backup/$app"
[ -d "$folder" ] && cp "$line" "$folder"
((nb++))
done <<< "$env"
echo -e "$nb '.env' files founds in DockGe !"
echo -e "Archivage du dossier _backup..."
if ! command -v gpg &> /dev/null; then
echo -e "${bold}gpg${reset} could not be found !\n"
echo -e "Archive won't be encrypted !\n"
echo -e ""
tar -zcvf "$dir_docker/backup_Docker.tar.gz" "$dir_backup" >/dev/null 2>&1
else
rm "$dir_docker/backup_Docker.tar".gpg && tar -cvzf - "$dir_backup" | gpg --encrypt --recipient $recipient -o "$dir_docker/backup_Docker.tar".gpg
fi

42
update_container.sh Executable file
View File

@@ -0,0 +1,42 @@
#!/usr/bin/env bash
set -e
# Our function to update containers based on their base image
update_container() {
local image=$1
docker pull $image
local updated_containers=0
# Loop through all running containers
for container in $(docker ps --format "{{.Names}}"); do
local container_image=$(docker inspect --format '{{.Config.Image}}' "$container")
# We check if the current container's image matches the updated image
if [[ "$container_image" == "$image" ]]; then
local latest=$(docker inspect --format "{{.Id}}" $image)
local running=$(docker inspect --format "{{.Image}}" $container)
if [[ "$running" != "$latest" ]]; then
echo "Upgrading $container"
#docker rm -f $container
# docker run --name $container $image
((updated_containers++))
fi
fi
done
if [[ $updated_containers -eq 0 ]]; then
echo "No containers updated for $image"
else
echo "$updated_containers container(s) updated for $image"
fi
}
# Our main script starts here
# Check for updates to all images used by running containers
for image in $(docker ps --format '{{.Image}}' | sort | uniq); do
echo "Checking updates for $image"
update_container $image
done
echo "Container update check complete."

View File

@@ -4,7 +4,9 @@ host=$(hostname)
if [ "$host" = "DS916" ]; then
php_version=74
#php_version=81
php_version=$(php -v | head -n 1 | cut -d " " -f 2 | cut -f1-2 -d".")
php_version=${php_version/.}
php_bin=/usr/local/bin/php$php_version
nc_dir=/volume1/web/nextcloud
@@ -25,6 +27,7 @@ if [ "$host" = "DS916" ]; then
#echo ""
#sudo -u http $php_bin -d memory_limit=1024M occ maintenance:mode --on
sudo -u http $php_bin -d memory_limit=1024M occ upgrade
sudo -u http $php_bin -d memory_limit=1024M occ db:add-missing-indices
sudo -u http $php_bin -d memory_limit=1024M occ maintenance:mode --off
elif [ "$host" == "localhost" ]; then
@@ -32,18 +35,20 @@ elif [ "$host" == "localhost" ]; then
if [ "$ip" = "212.227.191.167" ]; then
php_version=7.4
#php_version=8.1
php_version=$(php -v | head -n 1 | cut -d " " -f 2 | cut -f1-2 -d".")
php_bin=/opt/plesk/php/$php_version/bin/php
nc_dir=/var/www/vhosts/maboiteverte.fr/httpdocs/nextcloud
cd $nc_dir || exit
sudo -u bruno $php_bin occ maintenance:mode --on
sudo -u bruno $php_bin occ maintenance:repair
sudo -u bruno $php_bin updater/updater.phar
sudo -u bruno $php_bin -d memory_limit=-1 occ maintenance:mode --on
sudo -u bruno $php_bin -d memory_limit=-1 occ maintenance:repair
sudo -u bruno $php_bin -d memory_limit=-1 updater/updater.phar
sudo -u bruno $php_bin occ upgrade
sudo -u bruno $php_bin occ maintenance:mode --off
sudo -u bruno $php_bin -d memory_limit=-1 occ upgrade
sudo -u bruno $php_bin -d memory_limit=-1 occ db:add-missing-indices
sudo -u bruno $php_bin -d memory_limit=-1 occ maintenance:mode --off
fi