diff --git a/manifest.json b/manifest.json index 70417a2..de6b4f1 100644 --- a/manifest.json +++ b/manifest.json @@ -6,9 +6,9 @@ "en": "Network-wide ad blocking via your own DNS server.", "fr": "Filtrage publicitaire sur l'ensemble du réseau via votre propre serveur DNS." }, - "version": "3.1.4", + "version": "3.1.4~ynh1", "url": "https://pi-hole.net/", - "license": " EUPL-1.2", + "license": "EUPL-1.2", "maintainer": { "name": "Maniack Crudelis", "email": "maniackc_dev@crudelis.fr" diff --git a/scripts/_common.sh b/scripts/_common.sh index f395dfa..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 @@ -233,3 +207,357 @@ 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 ============ +#================================================= + +# Delete a file checksum from the app settings +# +# $app should be defined when calling this helper +# +# usage: ynh_remove_file_checksum file +# | arg: file - The file for which the checksum will be deleted +ynh_delete_file_checksum () { + local checksum_setting_name=checksum_${1//[\/ ]/_} # Replace all '/' and ' ' by '_' + ynh_app_setting_delete $app $checksum_setting_name +} diff --git a/scripts/install b/scripts/install index 4ae5787..f98ca86 100644 --- a/scripts/install +++ b/scripts/install @@ -52,6 +52,7 @@ ynh_app_setting_set $app domain $domain ynh_app_setting_set $app path $path_url ynh_app_setting_set $app admin $admin ynh_app_setting_set $app query_logging $query_logging +ynh_app_setting_set $app enable_dhcp $enable_dhcp #================================================= # STANDARD MODIFICATIONS @@ -65,12 +66,12 @@ then ynh_die "The ports 4711 to 4720 are already in use. Pi-hole can't works on another port. Please try to free one of this ports." fi # Ouvre le port dans le firewall -ALL_QUIET yunohost firewall allow --no-upnp TCP $port +ynh_exec_fully_quiet yunohost firewall allow --no-upnp TCP $port ynh_app_setting_set $app port $port # Désactive le port 53 en upnp -ALL_QUIET yunohost firewall disallow Both 53 --no-reload -ALL_QUIET yunohost firewall allow Both 53 --no-upnp +ynh_exec_fully_quiet yunohost firewall disallow Both 53 --no-reload +ynh_exec_fully_quiet yunohost firewall allow Both 53 --no-upnp #================================================= # INSTALL DEPENDENCIES @@ -164,11 +165,11 @@ sed -i "/# su #/d;" "$pihole_storage/logrotate" git clone https://github.com/pi-hole/FTL # Plutôt que télécharger le binaire C, on le compile nous-même. ( cd FTL -SUPPRESS_WARNING make -SUPPRESS_WARNING make install ) +ynh_exec_warn_less make +ynh_exec_warn_less make install ) cp -a $pihole_local_repo/advanced/pihole-FTL.service /etc/init.d/pihole-FTL chmod +x /etc/init.d/pihole-FTL -SUPPRESS_WARNING systemctl enable pihole-FTL +ynh_exec_warn_less systemctl enable pihole-FTL #================================================= # BUILD THE VARIABLES FILE @@ -271,7 +272,7 @@ then fi # Open the UDP port 67 for dhcp -ALL_QUIET yunohost firewall allow UDP 67 --no-upnp +ynh_exec_fully_quiet yunohost firewall allow UDP 67 --no-upnp #================================================= # RESTART DNSMASQ @@ -290,7 +291,7 @@ cp $pihole_local_repo/advanced/pihole.cron /etc/cron.d/pihole #================================================= cp "$pihole_local_repo/adlists.default" "$pihole_storage/adlists.default" -SUPPRESS_WARNING /opt/pihole/gravity.sh +ynh_exec_warn_less /opt/pihole/gravity.sh #================================================= # START PIHOLE-FTL @@ -323,3 +324,21 @@ yunohost app addaccess --users=$admin $app #================================================= systemctl reload nginx + +#================================================= +# SEND A README FOR THE ADMIN +#================================================= + +if [ $enable_dhcp -eq 1 ] +then + dhcp_alert="You asked to use the internal DHCP server of dnsmasq with PiHole. +You should really read the documentation about that, https://github.com/YunoHost-Apps/pihole_ynh/blob/master/dhcp.md + +" +else + dhcp_alert="" +fi + +message="${dhcp_alert}If you facing an issue or want to improve this app, please open a new issue in this project: https://github.com/YunoHost-Apps/pihole_ynh" + +ynh_send_readme_to_admin "$message" "$admin" diff --git a/scripts/remove b/scripts/remove index 25e551d..6f53987 100755 --- a/scripts/remove +++ b/scripts/remove @@ -26,7 +26,7 @@ port=$(ynh_app_setting_get $app port) if yunohost service status | grep -q pihole-FTL # Test l'existence du service dans Yunohost then - echo "Remove pihole-FTL service" + ynh_print_info "Remove pihole-FTL service" >&2 yunohost service remove pihole-FTL fi @@ -35,7 +35,7 @@ fi #================================================= systemctl stop pihole-FTL -SUPPRESS_WARNING systemctl disable pihole-FTL +ynh_exec_warn_less systemctl disable pihole-FTL rm -f "/etc/init.d/pihole-FTL" "/usr/bin/pihole-FTL" "/var/run/pihole-FTL.pid" "/var/run/pihole-FTL.port" #================================================= @@ -71,14 +71,14 @@ ynh_remove_fpm_config # Suppression de la configuration du pool php-fpm if yunohost firewall list | grep -q "\- $port$" then - echo "Close port $port" - QUIET yunohost firewall disallow TCP $port + ynh_print_info "Close port $port" >&2 + ynh_exec_quiet yunohost firewall disallow TCP $port fi if yunohost firewall list | grep -q "\- 67$" then - echo "Close port 67" - QUIET yunohost firewall disallow UDP 67 + ynh_print_info "Close port 67" >&2 + ynh_exec_quiet yunohost firewall disallow UDP 67 fi #================================================= @@ -136,7 +136,7 @@ systemctl start dnsmasq # REMOVE THE CONF_REGEN HOOK #================================================= -rm /usr/share/yunohost/hooks/conf_regen/50-dnsmasq_$app +ynh_secure_remove /usr/share/yunohost/hooks/conf_regen/50-dnsmasq_$app #================================================= # GENERIC FINALISATION diff --git a/scripts/restore b/scripts/restore index c5c47b5..305e1e9 100644 --- a/scripts/restore +++ b/scripts/restore @@ -32,12 +32,13 @@ app=$YNH_APP_INSTANCE_NAME domain=$(ynh_app_setting_get $app domain) path_url=$(ynh_app_setting_get $app path) final_path=$(ynh_app_setting_get $app final_path) +enable_dhcp=$(ynh_app_setting_get $app enable_dhcp) #================================================= # CHECK IF THE APP CAN BE RESTORED #================================================= -yunohost app checkurl "${domain}${path_url}" -a "$app" \ +ynh_webpath_available $domain $path_url \ || ynh_die "Path not available: ${domain}${path_url}" test ! -d $final_path \ || ynh_die "There is already a directory: $final_path " @@ -184,7 +185,7 @@ ynh_store_file_checksum "$setupVars" # Enregistre la somme de contrôle du fichi # START PIHOLE-FTL #================================================= -SUPPRESS_WARNING systemctl enable pihole-FTL +ynh_exec_warn_less systemctl enable pihole-FTL systemctl start pihole-FTL #================================================= @@ -195,3 +196,21 @@ systemctl start pihole-FTL systemctl reload php5-fpm systemctl reload nginx + +#================================================= +# SEND A README FOR THE ADMIN +#================================================= + +if [ $enable_dhcp -eq 1 ] +then + dhcp_alert="You asked to use the internal DHCP server of dnsmasq with PiHole. +You should really read the documentation about that, https://github.com/YunoHost-Apps/pihole_ynh/blob/master/dhcp.md + +" +else + dhcp_alert="" +fi + +message="${dhcp_alert}If you facing an issue or want to improve this app, please open a new issue in this project: https://github.com/YunoHost-Apps/pihole_ynh" + +ynh_send_readme_to_admin "$message" "$admin" diff --git a/scripts/upgrade b/scripts/upgrade index 62e793d..d4d71bf 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -22,6 +22,12 @@ query_logging=$(ynh_app_setting_get $app query_logging) final_path=$(ynh_app_setting_get $app final_path) port=$(ynh_app_setting_get $app port) +#================================================= +# CHECK VERSION +#================================================= + +ynh_abort_if_up_to_date + #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= @@ -116,11 +122,11 @@ systemctl stop pihole-FTL git clone https://github.com/pi-hole/FTL # Plutôt que télécharger le binaire C, on le compile nous-même. ( cd FTL -SUPPRESS_WARNING make -SUPPRESS_WARNING make install ) +ynh_exec_warn_less make +ynh_exec_warn_less make install ) cp -a $pihole_local_repo/advanced/pihole-FTL.service /etc/init.d/pihole-FTL chmod +x /etc/init.d/pihole-FTL -SUPPRESS_WARNING systemctl enable pihole-FTL +ynh_exec_warn_less systemctl enable pihole-FTL #================================================= # BUILD THE VARIABLES FILE