From 7114f258b037ae00070b24a1f230d97cbddd2df2 Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Sat, 16 Dec 2017 23:25:28 +0100 Subject: [PATCH] Use new helpers --- manifest.json | 2 +- scripts/_common.sh | 370 +++++++++++++++++++++++++++++++++++++++++---- scripts/install | 22 ++- scripts/remove | 8 +- scripts/restore | 18 ++- scripts/upgrade | 6 + 6 files changed, 385 insertions(+), 41 deletions(-) diff --git a/manifest.json b/manifest.json index b21f535..20e81ff 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Light DLNA server to share media files over the LAN", "fr": "Serveur DLNA léger pour partager les fichiers multimédia sur le réseau local" }, - "version": "1.0", + "version": "1.0~ynh1", "url": "http://minidlna.sourceforge.net/", "license": "GPL-2.0", "maintainer": { diff --git a/scripts/_common.sh b/scripts/_common.sh index cac8bd1..883fe5e 100755 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -1,31 +1,5 @@ #!/bin/bash -#================================================= -# DISPLAYING -#================================================= - -NO_PRINT () { # Supprime l'affichage dans stdout pour la commande en argument. - set +x - $@ - set -x -} - -WARNING () { # Écrit sur le canal d'erreur pour passer en warning. - $@ >&2 -} - -SUPPRESS_WARNING () { # Force l'écriture sur la sortie standard - $@ 2>&1 -} - -QUIET () { # Redirige la sortie standard dans /dev/null - $@ > /dev/null -} - -ALL_QUIET () { # Redirige la sortie standard et d'erreur dans /dev/null - $@ > /dev/null 2>&1 -} - #================================================= # BACKUP #================================================= @@ -42,8 +16,8 @@ CHECK_SIZE () { # Vérifie avant chaque backup que l'espace est suffisant if [ $free_space -le $backup_size ] then - WARNING echo "Espace insuffisant pour sauvegarder $file_to_analyse." - WARNING echo "Espace disponible: $(HUMAN_SIZE $free_space)" + ynh_print_err "Espace insuffisant pour sauvegarder $file_to_analyse." + ynh_print_err "Espace disponible: $(HUMAN_SIZE $free_space)" ynh_die "Espace nécessaire: $(HUMAN_SIZE $backup_size)" fi } @@ -57,7 +31,7 @@ IS_PACKAGE_CHECK () { # Détermine une exécution en conteneur (Non testé) } #================================================= -# NODEJS +# EXPERIMENTAL HELPERS #================================================= # INFOS @@ -234,6 +208,344 @@ EOF chmod +x "/etc/cron.daily/node_update" } +#================================================= + +# Start or restart a service and follow its booting +# +# usage: ynh_check_starting "Line to match" [Log file] [Timeout] +# +# | arg: Line to match - The line to find in the log to attest the service have finished to boot. +# | arg: Log file - The log file to watch +# /var/log/$app/$app.log will be used if no other log is defined. +# | arg: Timeout - The maximum time to wait before ending the watching. Defaut 300 seconds. +ynh_check_starting () { + local line_to_match="$1" + local app_log="${2:-/var/log/$app/$app.log}" + local timeout=${3:-300} + + ynh_clean_check_starting () { + # Stop the execution of tail. + kill -s 15 $pid_tail 2>&1 + ynh_secure_remove "$templog" 2>&1 + } + + echo "Starting of $app" >&2 + systemctl restart $app + local templog="$(mktemp)" + # Following the starting of the app in its log + tail -f -n1 "$app_log" > "$templog" & + # Get the PID of the tail command + local pid_tail=$! + + local i=0 + for i in `seq 1 $timeout` + do + # Read the log until the sentence is found, that means the app finished to start. Or run until the timeout + if grep --quiet "$line_to_match" "$templog" + then + echo "The service $app has correctly started." >&2 + break + fi + echo -n "." >&2 + sleep 1 + done + if [ $i -eq $timeout ] + then + echo "The service $app didn't fully started before the timeout." >&2 + fi + + echo "" + ynh_clean_check_starting +} + +#================================================= + +ynh_print_log () { + echo "${1}" +} + +# Print an info on stdout +# +# usage: ynh_print_info "Text to print" +# | arg: text - The text to print +ynh_print_info () { + ynh_print_log "[INFO] ${1}" +} + +# Print a warning on stderr +# +# usage: ynh_print_warn "Text to print" +# | arg: text - The text to print +ynh_print_warn () { + ynh_print_log "[WARN] ${1}" >&2 +} + +# Print a error on stderr +# +# usage: ynh_print_err "Text to print" +# | arg: text - The text to print +ynh_print_err () { + ynh_print_log "[ERR] ${1}" >&2 +} + +# Execute a command and print the result as an error +# +# usage: ynh_exec_err command to execute +# usage: ynh_exec_err "command to execute | following command" +# In case of use of pipes, you have to use double quotes. Otherwise, this helper will be executed with the first command, then be send to the next pipe. +# +# | arg: command - command to execute +ynh_exec_err () { + ynh_print_err "$(eval $@)" +} + +# Execute a command and print the result as a warning +# +# usage: ynh_exec_warn command to execute +# usage: ynh_exec_warn "command to execute | following command" +# In case of use of pipes, you have to use double quotes. Otherwise, this helper will be executed with the first command, then be send to the next pipe. +# +# | arg: command - command to execute +ynh_exec_warn () { + ynh_print_warn "$(eval $@)" +} + +# Execute a command and force the result to be printed on stdout +# +# usage: ynh_exec_warn_less command to execute +# usage: ynh_exec_warn_less "command to execute | following command" +# In case of use of pipes, you have to use double quotes. Otherwise, this helper will be executed with the first command, then be send to the next pipe. +# +# | arg: command - command to execute +ynh_exec_warn_less () { + eval $@ 2>&1 +} + +# Execute a command and redirect stdout in /dev/null +# +# usage: ynh_exec_quiet command to execute +# usage: ynh_exec_quiet "command to execute | following command" +# In case of use of pipes, you have to use double quotes. Otherwise, this helper will be executed with the first command, then be send to the next pipe. +# +# | arg: command - command to execute +ynh_exec_quiet () { + eval $@ > /dev/null +} + +# Execute a command and redirect stdout and stderr in /dev/null +# +# usage: ynh_exec_fully_quiet command to execute +# usage: ynh_exec_fully_quiet "command to execute | following command" +# In case of use of pipes, you have to use double quotes. Otherwise, this helper will be executed with the first command, then be send to the next pipe. +# +# | arg: command - command to execute +ynh_exec_fully_quiet () { + eval $@ > /dev/null 2>&1 +} + +#================================================= + +# Install or update the main directory yunohost.multimedia +# +# usage: ynh_multimedia_build_main_dir +ynh_multimedia_build_main_dir () { + wget -nv https://github.com/YunoHost-Apps/yunohost.multimedia/archive/master.zip 2>&1 + unzip -q master.zip + ./yunohost.multimedia-master/script/ynh_media_build.sh +} + +# Add a directory in yunohost.multimedia +# This "directory" will be a symbolic link to a existing directory. +# +# usage: ynh_multimedia_addfolder "Source directory" "Destination directory" +# +# | arg: Source directory - The real directory which contains your medias. +# | arg: Destination directory - The name and the place of the symbolic link, relative to "/home/yunohost.multimedia" +ynh_multimedia_addfolder () { + local source_dir="$1" + local dest_dir="$2" + ./yunohost.multimedia-master/script/ynh_media_addfolder.sh --source="$source_dir" --dest="$dest_dir" +} + +# Move a directory in yunohost.multimedia, and replace by a symbolic link +# +# usage: ynh_multimedia_movefolder "Source directory" "Destination directory" +# +# | arg: Source directory - The real directory which contains your medias. +# It will be moved to "Destination directory" +# A symbolic link will replace it. +# | arg: Destination directory - The new name and place of the directory, relative to "/home/yunohost.multimedia" +ynh_multimedia_movefolder () { + local source_dir="$1" + local dest_dir="$2" + ./yunohost.multimedia-master/script/ynh_media_addfolder.sh --inv --source="$source_dir" --dest="$dest_dir" +} + +# Allow an user to have an write authorisation in multimedia directories +# +# usage: ynh_multimedia_addaccess user_name +# +# | arg: user_name - The name of the user which gain this access. +ynh_multimedia_addaccess () { + local user_name=$1 + groupadd -f multimedia + usermod -a -G multimedia $user_name +} + +#================================================= + +# Create a dedicated fail2ban config (jail and filter conf files) +# +# usage: ynh_add_fail2ban_config log_file filter [max_retry [ports]] +# | arg: log_file - Log file to be checked by fail2ban +# | arg: failregex - Failregex to be looked for by fail2ban +# | arg: max_retry - Maximum number of retries allowed before banning IP address - default: 3 +# | arg: ports - Ports blocked for a banned IP address - default: http,https +ynh_add_fail2ban_config () { + # Process parameters + logpath=$1 + failregex=$2 + max_retry=${3:-3} + ports=${4:-http,https} + + test -n "$logpath" || ynh_die "ynh_add_fail2ban_config expects a logfile path as first argument and received nothing." + test -n "$failregex" || ynh_die "ynh_add_fail2ban_config expects a failure regex as second argument and received nothing." + + finalfail2banjailconf="/etc/fail2ban/jail.d/$app.conf" + finalfail2banfilterconf="/etc/fail2ban/filter.d/$app.conf" + ynh_backup_if_checksum_is_different "$finalfail2banjailconf" 1 + ynh_backup_if_checksum_is_different "$finalfail2banfilterconf" 1 + + sudo tee $finalfail2banjailconf <&2 + unset YNH_FORCE_UPGRADE + elif [ "$package_check" != "0" ] + then + echo "Upgrade forced for package check." >&2 + else + ynh_die "Up-to-date, nothing to do" 0 + fi + fi +} + +#================================================= + +# Send an email to inform the administrator +# +# usage: ynh_send_readme_to_admin app_message [recipients] +# | arg: app_message - The message to send to the administrator. +# | arg: recipients - The recipients of this email. Use spaces to separate multiples recipients. - default: root +# example: "root admin@domain" +# If you give the name of a YunoHost user, ynh_send_readme_to_admin will find its email adress for you +# example: "root admin@domain user1 user2" +ynh_send_readme_to_admin() { + local app_message="${1:-...No specific informations...}" + local recipients="${2:-root}" + + # Retrieve the email of users + find_mails () { + local list_mails="$1" + local mail + local recipients=" " + # Read each mail in argument + for mail in $list_mails + do + # Keep root or a real email address as it is + if [ "$mail" = "root" ] || echo "$mail" | grep --quiet "@" + then + recipients="$recipients $mail" + else + # But replace an user name without a domain after by its email + if mail=$(ynh_user_get_info "$mail" "mail" 2> /dev/null) + then + recipients="$recipients $mail" + fi + fi + done + echo "$recipients" + } + recipients=$(find_mails "$recipients") + + local mail_subject="☁️🆈🅽🅷☁️: \`$app\` was just installed!" + + local mail_message="This is an automated message from your beloved YunoHost server. + +Specific informations for the application $app. + +$app_message + +--- +Automatic diagnosis data from YunoHost + +$(yunohost tools diagnosis | grep -B 100 "services:" | sed '/services:/d')" + + # Send the email to the recipients + echo "$mail_message" | mail -a "Content-Type: text/plain; charset=UTF-8" -s "$mail_subject" "$recipients" +} #================================================= #============= FUTURE YUNOHOST HELPER ============ diff --git a/scripts/install b/scripts/install index 8c40d2c..ef3c728 100644 --- a/scripts/install +++ b/scripts/install @@ -38,8 +38,8 @@ test -z "$codename" && (ynh_die "codename empty") port=$(ynh_find_port 48200) # Cherche un port libre. # Ouvre les ports dans le firewall -ALL_QUIET yunohost firewall allow --no-upnp TCP $port -ALL_QUIET yunohost firewall allow --no-upnp UDP 1900 # Découverte SSDP pour UPNP. +ynh_exec_fully_quiet yunohost firewall allow --no-upnp TCP $port +ynh_exec_fully_quiet yunohost firewall allow --no-upnp UDP 1900 # Découverte SSDP pour UPNP. ynh_app_setting_set $app port $port # Enregistre les infos dans la config YunoHost @@ -49,9 +49,7 @@ ynh_app_setting_set $app version ${version:0:1} # CREATE YUNOHOST.MULTIMEDIA DIRECTORY #================================================= -wget -nv https://github.com/YunoHost-Apps/yunohost.multimedia/archive/master.zip -unzip master.zip -./yunohost.multimedia-master/script/ynh_media_build.sh +ynh_multimedia_build_main_dir #================================================= # SPECIFIC SETUP @@ -108,3 +106,17 @@ ynh_store_file_checksum "/etc/minidlna.conf" # Enregistre la somme de contrôle # Redémarre minidlna pour prendre en compte la nouvelle configuration systemctl restart minidlna + +#================================================= +# SEND A README FOR THE ADMIN +#================================================= + +message="You can find a config file at /etc/minidlna.conf + +MiniDLNA is going to serve the files present in the directory /home/yunohost.multimedia/share + +Please have a look to the documentation to learn more how to use MiniDLNA, https://yunohost.org/#/app_minidlna + +If you facing an issue or want to improve this app, please open a new issue in this project: https://github.com/YunoHost-Apps/minidlna_ynh" + +ynh_send_readme_to_admin "$message" "root" diff --git a/scripts/remove b/scripts/remove index 2258e3b..5984fad 100755 --- a/scripts/remove +++ b/scripts/remove @@ -26,7 +26,7 @@ port=$(ynh_app_setting_get $app port) # Retire le service du monitoring de Yunohost. if yunohost service status | grep -q minidlna # Test l'existence du service dans Yunohost then - echo "Remove minidlna service" + ynh_print_info "Remove minidlna service" >&2 yunohost service remove minidlna fi @@ -35,8 +35,8 @@ fi #================================================= # Ferme les ports dans le firewall -ALL_QUIET yunohost firewall disallow TCP $port -ALL_QUIET yunohost firewall disallow UDP 1900 +ynh_exec_fully_quiet yunohost firewall disallow TCP $port +ynh_exec_fully_quiet yunohost firewall disallow UDP 1900 #================================================= # SPECIFIC REMOVE @@ -53,7 +53,7 @@ ynh_secure_remove "/etc/apt/sources.list.d/minidlna.list" # Suppression du paramètre inotify pour minidlna. if [ -e "/etc/sysctl.d/90-inotify_minidlna.conf" ]; then - echo "Delete kernel config" + ynh_print_info "Delete kernel config" >&2 ynh_secure_remove "/etc/sysctl.d/90-inotify_minidlna.conf" # Et rechargement de la config du noyau. if IS_PACKAGE_CHECK; then diff --git a/scripts/restore b/scripts/restore index 65818b4..6dc5ca4 100644 --- a/scripts/restore +++ b/scripts/restore @@ -36,8 +36,8 @@ port=$(ynh_app_setting_get $app port) # OPEN PORTS #================================================= -ALL_QUIET yunohost firewall allow --no-upnp TCP $port -ALL_QUIET yunohost firewall allow --no-upnp UDP 1900 # Découverte SSDP pour UPNP. +ynh_exec_fully_quiet yunohost firewall allow --no-upnp TCP $port +ynh_exec_fully_quiet yunohost firewall allow --no-upnp UDP 1900 # Découverte SSDP pour UPNP. #================================================= # CREATE YUNOHOST.MULTIMEDIA DIRECTORY @@ -82,3 +82,17 @@ systemctl restart minidlna # Ajoute le service au monitoring de Yunohost. yunohost service add minidlna --log "/var/log/minidlna.log" + +#================================================= +# SEND A README FOR THE ADMIN +#================================================= + +message="You can find a config file at /etc/minidlna.conf + +MiniDLNA is going to serve the files present in the directory /home/yunohost.multimedia/share + +Please have a look to the documentation to learn more how to use MiniDLNA, https://yunohost.org/#/app_minidlna + +If you facing an issue or want to improve this app, please open a new issue in this project: https://github.com/YunoHost-Apps/minidlna_ynh" + +ynh_send_readme_to_admin "$message" "root" diff --git a/scripts/upgrade b/scripts/upgrade index 2be8d6e..7044acc 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -18,6 +18,12 @@ app=$YNH_APP_INSTANCE_NAME version=$(ynh_app_setting_get $app version) port=$(ynh_app_setting_get $app port) +#================================================= +# CHECK VERSION +#================================================= + +ynh_abort_if_up_to_date + #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #=================================================