Browse Source

Upgrade helpers

Maniack Crudelis 7 years ago
parent
commit
09329575a4
10 changed files with 374 additions and 148 deletions
  1. 1 0
      README.md
  2. 1 0
      README_fr.md
  3. 2 2
      manifest.json
  4. 314 57
      scripts/_common.sh
  5. 1 18
      scripts/backup
  6. 16 13
      scripts/change_url
  7. 5 21
      scripts/install
  8. 3 3
      scripts/remove
  9. 7 12
      scripts/restore
  10. 24 22
      scripts/upgrade

+ 1 - 0
README.md

@@ -41,6 +41,7 @@ Use the admin panel of your Pi-hole to configure this app.
 
 * x86-64b - [![Build Status](https://ci-apps.yunohost.org/jenkins/job/pihole%20(Community)/badge/icon)](https://ci-apps.yunohost.org/jenkins/job/pihole%20(Community)/)
 * ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/jenkins/job/pihole%20(Community)%20(%7EARM%7E)/badge/icon)](https://ci-apps-arm.yunohost.org/jenkins/job/pihole%20(Community)%20(%7EARM%7E)/)
+* Jessie x86-64b - [![Build Status](https://ci-stretch.nohost.me/jenkins/job/pihole%20(Community)/badge/icon)](https://ci-stretch.nohost.me/jenkins/job/pihole%20(Community)/)
 
 ## Limitations
 

+ 1 - 0
README_fr.md

@@ -41,6 +41,7 @@ Utiliser le panneau d'administration de votre Pi-hole pour configurer cette appl
 
 * x86-64b - [![Build Status](https://ci-apps.yunohost.org/jenkins/job/pihole%20(Community)/badge/icon)](https://ci-apps.yunohost.org/jenkins/job/pihole%20(Community)/)
 * ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/jenkins/job/pihole%20(Community)%20(%7EARM%7E)/badge/icon)](https://ci-apps-arm.yunohost.org/jenkins/job/pihole%20(Community)%20(%7EARM%7E)/)
+* Jessie x86-64b - [![Build Status](https://ci-stretch.nohost.me/jenkins/job/pihole%20(Community)/badge/icon)](https://ci-stretch.nohost.me/jenkins/job/pihole%20(Community)/)
 
 ## Limitations
 

+ 2 - 2
manifest.json

@@ -6,7 +6,7 @@
 		"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.3.1~ynh1",
+	"version": "3.3.1~ynh2",
 	"url": "https://pi-hole.net/",
 	"license": "EUPL-1.2",
 	"maintainer": {
@@ -14,7 +14,7 @@
 		"email": "maniackc_dev@crudelis.fr"
 	},
 	"requirements": {
-        "yunohost": ">= 2.7.12"
+		"yunohost": ">= 2.7.14"
 	},
 	"multi_instance": false,
 	"services": [

+ 314 - 57
scripts/_common.sh

@@ -26,29 +26,229 @@ CHECK_SIZE () {	# Vérifie avant chaque backup que l'espace est suffisant
 # PACKAGE CHECK BYPASSING...
 #=================================================
 
-IS_PACKAGE_CHECK () {	# Détermine une exécution en conteneur (Non testé)
-	return $(uname -n | grep -c 'pchecker_lxc')
+IS_PACKAGE_CHECK () {
+	return $(env | grep -c container=lxc)
 }
 
 #=================================================
 # EXPERIMENTAL HELPERS
 #=================================================
 
+# Internal helper design to allow helpers to use getopts to manage their arguments
+#
+# example: function my_helper()
+# {
+#     declare -Ar args_array=( [a]=arg1= [b]=arg2= [c]=arg3 )
+#     local arg1
+#     local arg2
+#     local arg3
+#     ynh_handle_getopts_args "$@"
+#
+#     [...]
+# }
+# my_helper --arg1 "val1" -b val2 -c
+#
+# usage: ynh_handle_getopts_args "$@"
+# | arg: $@    - Simply "$@" to tranfert all the positionnal arguments to the function
+#
+# This helper need an array, named "args_array" with all the arguments used by the helper
+# 	that want to use ynh_handle_getopts_args
+# Be carreful, this array has to be an associative array, as the following example:
+# declare -Ar args_array=( [a]=arg1 [b]=arg2= [c]=arg3 )
+# Let's explain this array:
+# a, b and c are short options, -a, -b and -c
+# arg1, arg2 and arg3 are the long options associated to the previous short ones. --arg1, --arg2 and --arg3
+# For each option, a short and long version has to be defined.
+# Let's see something more significant
+# declare -Ar args_array=( [u]=user [f]=finalpath= [d]=database )
+#
+# NB: Because we're using 'declare' without -g, the array will be declared as a local variable.
+#
+# Please keep in mind that the long option will be used as a variable to store the values for this option.
+# For the previous example, that means that $finalpath will be fill with the value given as argument for this option.
+#
+# Also, in the previous example, finalpath has a '=' at the end. That means this option need a value.
+# So, the helper has to be call with --finalpath /final/path, --finalpath=/final/path or -f /final/path, the variable $finalpath will get the value /final/path
+# If there's many values for an option, -f /final /path, the value will be separated by a ';' $finalpath=/final;/path
+# For an option without value, like --user in the example, the helper can be called only with --user or -u. $user will then get the value 1.
+#
+# To keep a retrocompatibility, a package can still call a helper, using getopts, with positional arguments.
+# The "legacy mode" will manage the positional arguments and fill the variable in the same order than they are given in $args_array.
+# e.g. for `my_helper "val1" val2`, arg1 will be filled with val1, and arg2 with val2.
+ynh_handle_getopts_args () {
+	# Manage arguments only if there's some provided
+	set +x
+	if [ $# -ne 0 ]
+	then
+		# Store arguments in an array to keep each argument separated
+		local arguments=("$@")
+
+		# For each option in the array, reduce to short options for getopts (e.g. for [u]=user, --user will be -u)
+		# And built parameters string for getopts
+		# ${!args_array[@]} is the list of all keys in the array (A key is 'u' in [u]=user, user is a value)
+		local getopts_parameters=""
+		local key=""
+		for key in "${!args_array[@]}"
+		do
+			# Concatenate each keys of the array to build the string of arguments for getopts
+			# Will looks like 'abcd' for -a -b -c -d
+			# If the value of a key finish by =, it's an option with additionnal values. (e.g. --user bob or -u bob)
+			# Check the last character of the value associate to the key
+			if [ "${args_array[$key]: -1}" = "=" ]
+			then
+				# For an option with additionnal values, add a ':' after the letter for getopts.
+				getopts_parameters="${getopts_parameters}${key}:"
+			else
+				getopts_parameters="${getopts_parameters}${key}"
+			fi
+			# Check each argument given to the function
+			local arg=""
+			# ${#arguments[@]} is the size of the array
+			for arg in `seq 0 $(( ${#arguments[@]} - 1 ))`
+			do
+				# And replace long option (value of the key) by the short option, the key itself
+				# (e.g. for [u]=user, --user will be -u)
+				# Replace long option with =
+				arguments[arg]="${arguments[arg]//--${args_array[$key]}/-${key} }"
+				# And long option without =
+				arguments[arg]="${arguments[arg]//--${args_array[$key]%=}/-${key}}"
+			done
+		done
+
+		# Read and parse all the arguments
+		# Use a function here, to use standart arguments $@ and be able to use shift.
+		parse_arg () {
+			# Read all arguments, until no arguments are left
+			while [ $# -ne 0 ]
+			do
+				# Initialize the index of getopts
+				OPTIND=1
+				# Parse with getopts only if the argument begin by -, that means the argument is an option
+				# getopts will fill $parameter with the letter of the option it has read.
+				local parameter=""
+				getopts ":$getopts_parameters" parameter || true
+
+				if [ "$parameter" = "?" ]
+				then
+					ynh_die "Invalid argument: -${OPTARG:-}"
+				elif [ "$parameter" = ":" ]
+				then
+					ynh_die "-$OPTARG parameter requires an argument."
+				else
+					local shift_value=1
+					# Use the long option, corresponding to the short option read by getopts, as a variable
+					# (e.g. for [u]=user, 'user' will be used as a variable)
+					# Also, remove '=' at the end of the long option
+					# The variable name will be stored in 'option_var'
+					local option_var="${args_array[$parameter]%=}"
+					# If this option doesn't take values
+					# if there's a '=' at the end of the long option name, this option takes values
+					if [ "${args_array[$parameter]: -1}" != "=" ]
+					then
+						# 'eval ${option_var}' will use the content of 'option_var'
+						eval ${option_var}=1
+					else
+						# Read all other arguments to find multiple value for this option.
+						# Load args in a array
+						local all_args=("$@")
+
+						# If the first argument is longer than 2 characters,
+						# There's a value attached to the option, in the same array cell
+						if [ ${#all_args[0]} -gt 2 ]; then
+							# Remove the option and the space, so keep only the value itself.
+							all_args[0]="${all_args[0]#-${parameter} }"
+							# Reduce the value of shift, because the option has been removed manually
+							shift_value=$(( shift_value - 1 ))
+						fi
+
+						# Then read the array value per value
+						for i in `seq 0 $(( ${#all_args[@]} - 1 ))`
+						do
+							# If this argument is an option, end here.
+							if [ "${all_args[$i]:0:1}" == "-" ] || [ -z "${all_args[$i]}" ]
+							then
+								# Ignore the first value of the array, which is the option itself
+								if [ "$i" -ne 0 ]; then
+									break
+								fi
+							else
+								# Declare the content of option_var as a variable.
+								eval ${option_var}=""
+								# Else, add this value to this option
+								# Each value will be separated by ';'
+								if [ -n "${!option_var}" ]
+								then
+									# If there's already another value for this option, add a ; before adding the new value
+									eval ${option_var}+="\;"
+								fi
+								eval ${option_var}+=\"${all_args[$i]}\"
+								shift_value=$(( shift_value + 1 ))
+							fi
+						done
+					fi
+				fi
+
+				# Shift the parameter and its argument(s)
+				shift $shift_value
+			done
+		}
+
+		# LEGACY MODE
+		# Check if there's getopts arguments
+		if [ "${arguments[0]:0:1}" != "-" ]
+		then
+			# If not, enter in legacy mode and manage the arguments as positionnal ones.
+			echo "! Helper used in legacy mode !"
+			for i in `seq 0 $(( ${#arguments[@]} -1 ))`
+			do
+				# Use getopts_parameters as a list of key of the array args_array
+				# Remove all ':' in getopts_parameters
+				getopts_parameters=${getopts_parameters//:}
+				# Get the key from getopts_parameters, by using the key according to the position of the argument.
+				key=${getopts_parameters:$i:1}
+				# Use the long option, corresponding to the key, as a variable
+				# (e.g. for [u]=user, 'user' will be used as a variable)
+				# Also, remove '=' at the end of the long option
+				# The variable name will be stored in 'option_var'
+				local option_var="${args_array[$key]%=}"
+
+				# Store each value given as argument in the corresponding variable
+				# The values will be stored in the same order than $args_array
+				eval ${option_var}+=\"${arguments[$i]}\"
+			done
+		else
+			# END LEGACY MODE
+			# Call parse_arg and pass the modified list of args as an array of arguments.
+			parse_arg "${arguments[@]}"
+		fi
+	fi
+	set -x
+}
+
+#=================================================
+
 # Start or restart a service and follow its booting
 #
 # usage: ynh_check_starting "Line to match" [Log file] [Timeout] [Service name]
 #
-# | 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; specify "systemd" to read systemd journal for specified service
+# | arg: -m, --line_to_match= - Line to match - The line to find in the log to attest the service have finished to boot.
+# | arg: -l, --app_log= - Log file - The log file to watch; specify "systemd" to read systemd journal for specified service
 #    /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.
-# | arg: Service name
+# | arg: -t, --timeout= - Timeout - The maximum time to wait before ending the watching. Defaut 300 seconds.
+# | arg: -n, --service_name= - Service name
 
 ynh_check_starting () {
-	local line_to_match="$1"
-	local app_log="${2:-/var/log/$service_name/$service_name.log}"
-	local timeout=${3:-300}
-	local service_name="${4:-$app}"
+	# Declare an array to define the options of this helper.
+	declare -Ar args_array=( [m]=line_to_match= [l]=app_log= [t]=timeout= [n]=service_name= )
+	local line_to_match
+	local app_log
+	local timeout
+	local service_name
+	# Manage arguments with getopts
+	ynh_handle_getopts_args "$@"
+	local app_log="${app_log:-/var/log/$service_name/$service_name.log}"
+	local timeout=${timeout:-300}
+	local service_name="${service_name:-$app}"
 
 	echo "Starting of $service_name" >&2
 	systemctl stop $service_name
@@ -85,11 +285,11 @@ ynh_check_starting () {
 	echo ""
 	ynh_clean_check_starting
 }
+
 # Clean temporary process and file used by ynh_check_starting
 # (usually used in ynh_clean_setup scripts)
 #
 # usage: ynh_clean_check_starting
-
 ynh_clean_check_starting () {
 	# Stop the execution of tail.
 	kill -s 15 $pid_tail 2>&1
@@ -225,11 +425,16 @@ ynh_multimedia_build_main_dir () {
 #
 # 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"
+# | arg: -s, --source_dir= - Source directory - The real directory which contains your medias.
+# | arg: -d, --dest_dir= - 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"
+	# Declare an array to define the options of this helper.
+	declare -Ar args_array=( [s]=source_dir= [d]=dest_dir= )
+	local source_dir
+	local dest_dir
+	# Manage arguments with getopts
+	ynh_handle_getopts_args "$@"
+
 	./yunohost.multimedia-master/script/ynh_media_addfolder.sh --source="$source_dir" --dest="$dest_dir"
 }
 
@@ -237,13 +442,18 @@ ynh_multimedia_addfolder () {
 #
 # usage: ynh_multimedia_movefolder "Source directory" "Destination directory"
 #
-# | arg: Source directory - The real directory which contains your medias.
+# | arg: -s, --source_dir= - 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"
+# | arg: -d, --dest_dir= - 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"
+	# Declare an array to define the options of this helper.
+	declare -Ar args_array=( [s]=source_dir= [d]=dest_dir= )
+	local source_dir
+	local dest_dir
+	# Manage arguments with getopts
+	ynh_handle_getopts_args "$@"
+
 	./yunohost.multimedia-master/script/ynh_media_addfolder.sh --inv --source="$source_dir" --dest="$dest_dir"
 }
 
@@ -251,9 +461,14 @@ ynh_multimedia_movefolder () {
 #
 # usage: ynh_multimedia_addaccess user_name
 #
-# | arg: user_name - The name of the user which gain this access.
+# | arg: -u, --user_name= - The name of the user which gain this access.
 ynh_multimedia_addaccess () {
-	local user_name=$1
+	# Declare an array to define the options of this helper.
+	declare -Ar args_array=( [u]=user_name=)
+	local user_name
+	# Manage arguments with getopts
+	ynh_handle_getopts_args "$@"
+
 	groupadd -f multimedia
 	usermod -a -G multimedia $user_name
 }
@@ -273,15 +488,15 @@ ynh_add_fail2ban_config () {
    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 <<EOF
 [$app]
 enabled = true
@@ -301,7 +516,7 @@ EOF
 
   ynh_store_file_checksum "$finalfail2banjailconf"
   ynh_store_file_checksum "$finalfail2banfilterconf"
-  
+
   systemctl reload fail2ban
   local fail2ban_error="$(journalctl -u fail2ban | tail -n50 | grep "WARNING.*$app.*")"
   if [ -n "$fail2ban_error" ]
@@ -333,7 +548,7 @@ ynh_read_manifest () {
 	python3 -c "import sys, json;print(json.load(open('$manifest', encoding='utf-8'))['$key'])"
 }
 
-# Read the upstream version from the manifest 
+# Read the upstream version from the manifest
 # The version number in the manifest is defined by <upstreamversion>~ynh<packageversion>
 # For example : 4.3-2~ynh3
 # This include the number before ~ynh
@@ -349,6 +564,7 @@ ynh_app_upstream_version () {
     echo "${version_key/~ynh*/}"
 }
 
+
 # Read package version from the manifest
 # The version number in the manifest is defined by <upstreamversion>~ynh<packageversion>
 # For example : 4.3-2~ynh3
@@ -365,35 +581,49 @@ ynh_app_package_version () {
     echo "${version_key/*~ynh/}"
 }
 
-# Exit without error if the package is up to date
+# Checks the app version to upgrade with the existing app version and returns:
+# - UPGRADE_APP if the upstream app version has changed
+# - UPGRADE_PACKAGE if only the YunoHost package has changed
+#
+## It stops the current script without error if the package is up-to-date
 #
-# This helper should be used to avoid an upgrade of a package
-# when it's not needed.
+# This helper should be used to avoid an upgrade of an app, or the upstream part
+# of it, when it's not needed
 #
 # To force an upgrade, even if the package is up to date,
 # you have to set the variable YNH_FORCE_UPGRADE before.
 # example: sudo YNH_FORCE_UPGRADE=1 yunohost app upgrade MyApp
-#
-# usage: ynh_abort_if_up_to_date
-ynh_abort_if_up_to_date () {
-	local force_upgrade=${YNH_FORCE_UPGRADE:-0}
-	local package_check=${PACKAGE_CHECK_EXEC:-0}
 
-	local version=$(ynh_read_manifest "/etc/yunohost/apps/$YNH_APP_INSTANCE_NAME/manifest.json" "version" || echo 1.0)
-	local last_version=$(ynh_read_manifest "../manifest.json" "version" || echo 1.0)
-	if [ "$version" = "$last_version" ]
-	then
-		if [ "$force_upgrade" != "0" ]
-		then
-			echo "Upgrade forced by YNH_FORCE_UPGRADE." >&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
+# usage: ynh_check_app_version_changed
+ynh_check_app_version_changed () {
+  local force_upgrade=${YNH_FORCE_UPGRADE:-0}
+  local package_check=${PACKAGE_CHECK_EXEC:-0}
+
+  # By default, upstream app version has changed
+  local return_value="UPGRADE_APP"
+
+  local current_version=$(ynh_read_manifest "/etc/yunohost/apps/$YNH_APP_INSTANCE_NAME/manifest.json" "version" || echo 1.0)
+  local current_upstream_version="${current_version/~ynh*/}"
+  local update_version=$(ynh_read_manifest "../manifest.json" "version" || echo 1.0)
+  local update_upstream_version="${update_version/~ynh*/}"
+
+  if [ "$current_version" == "$update_version" ] ; then
+      # Complete versions are the same
+      if [ "$force_upgrade" != "0" ]
+      then
+        echo "Upgrade forced by YNH_FORCE_UPGRADE." >&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
+  elif [ "$current_upstream_version" == "$update_upstream_version" ] ; then
+    # Upstream versions are the same, only YunoHost package versions differ
+    return_value="UPGRADE_PACKAGE"
+  fi
+  echo $return_value
 }
 
 #=================================================
@@ -401,14 +631,20 @@ ynh_abort_if_up_to_date () {
 # 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
+# | arg: -m --app_message= - The message to send to the administrator.
+# | arg: -r, --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 information...}"
-	local recipients="${2:-root}"
+	# Declare an array to define the options of this helper.
+	declare -Ar args_array=( [m]=app_message= [r]=recipients= )
+	local app_message
+	local recipients
+	# Manage arguments with getopts
+	ynh_handle_getopts_args "$@"
+	local app_message="${app_message:-...No specific information...}"
+	local recipients="${recipients:-root}"
 
 	# Retrieve the email of users
 	find_mails () {
@@ -464,11 +700,16 @@ $(yunohost tools diagnosis | grep -B 100 "services:" | sed '/services:/d')"
 # Reload (or other actions) a service and print a log in case of failure.
 #
 # usage: ynh_system_reload service_name [action]
-# | arg: service_name - Name of the service to reload
-# | arg: action - Action to perform with systemctl. Default: reload
+# | arg: -n, --service_name= - Name of the service to reload
+# | arg: -a, --action= - Action to perform with systemctl. Default: reload
 ynh_system_reload () {
-        local service_name=$1
-        local action=${2:-reload}
+        # Declare an array to define the options of this helper.
+        declare -Ar args_array=( [n]=service_name= [a]=action= )
+        local service_name
+        local action
+        # Manage arguments with getopts
+        ynh_handle_getopts_args "$@"
+        local action=${action:-reload}
 
         # Reload, restart or start and print the log if the service fail to start or reload
         systemctl $action $service_name || ( journalctl --lines=20 -u $service_name >&2 && false)
@@ -514,6 +755,14 @@ ynh_delete_file_checksum () {
 #=================================================
 
 ynh_maintenance_mode_ON () {
+	# Load value of $path_url and $domain from the config if their not set
+	if [ -z $path_url ]; then
+		path_url=$(ynh_app_setting_get $app path)
+	fi
+	if [ -z $domain ]; then
+		domain=$(ynh_app_setting_get $app domain)
+	fi
+
 	# Create an html to serve as maintenance notice
 	echo "<!DOCTYPE html>
 <html>
@@ -560,6 +809,14 @@ include conf.d/yunohost_panel.conf.inc;
 }
 
 ynh_maintenance_mode_OFF () {
+	# Load value of $path_url and $domain from the config if their not set
+	if [ -z $path_url ]; then
+		path_url=$(ynh_app_setting_get $app path)
+	fi
+	if [ -z $domain ]; then
+		domain=$(ynh_app_setting_get $app domain)
+	fi
+
 	# Rewrite the nginx config file to redirect from ${path_url}_maintenance to the real url of the app.
 	echo "rewrite ^${path_url}_maintenance/(.*)$ ${path_url}/\$1 redirect;" > "/etc/nginx/conf.d/$domain.d/maintenance.$app.conf"
 	systemctl reload nginx

+ 1 - 18
scripts/backup

@@ -6,12 +6,7 @@
 # IMPORT GENERIC HELPERS
 #=================================================
 
-if [ ! -e _common.sh ]; then
-	# Get the _common.sh file if it's not in the current directory
-	cp ../settings/scripts/_common.sh ./_common.sh
-	chmod a+rx _common.sh
-fi
-source _common.sh
+source ../settings/scripts/_common.sh
 source /usr/share/yunohost/helpers
 
 #=================================================
@@ -31,12 +26,6 @@ final_path=$(ynh_app_setting_get $app final_path)
 path_url=$(ynh_app_setting_get $app path)
 domain=$(ynh_app_setting_get $app domain)
 
-#=================================================
-# ACTIVATE MAINTENANCE MODE
-#=================================================
-
-ynh_maintenance_mode_ON
-
 #=================================================
 # STANDARD BACKUP STEPS
 #=================================================
@@ -100,9 +89,3 @@ if test -e "/etc/dnsmasq.d/04-pihole-static-dhcp.conf"; then
 fi
 
 ynh_backup "/usr/share/yunohost/hooks/conf_regen/50-dnsmasq_$app"
-
-#=================================================
-# DEACTIVE MAINTENANCE MODE
-#=================================================
-
-ynh_maintenance_mode_OFF

+ 16 - 13
scripts/change_url

@@ -72,26 +72,29 @@ nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf
 # Change the path in the nginx config file
 if [ $change_path -eq 1 ]
 then
+	# Make a backup of the original nginx config file if modified
+	ynh_backup_if_checksum_is_different "$nginx_conf_path"
 
-	# Move from sub path to root
-	if [ "$new_path" == "/" ]
-	then
-		ynh_replace_string "^ *rewrite.*\^$old_path" "#sub_path_only&" "$nginx_conf_path"
-		ynh_replace_string "\(rewrite *\^\)$old_path\$ $old_path/*" "\1$new_path$ $new_path" "$nginx_conf_path"
+	# Set global variables for nginx helper
+	domain="$old_domain"
+	path_url="$new_path"
 
-	# Move to a sub path
-	else
-		ynh_replace_string "^#sub_path_only" "" "$nginx_conf_path"
-		ynh_replace_string "\(rewrite *\^\)$old_path\$ $old_path/*" "\1$new_path$ $new_path/" "$nginx_conf_path"
-	fi
+	# Store path_url setting
+	ynh_app_setting_set $app path_url "$path_url"
 
-	ynh_replace_string "location ${old_path%/}/" "location ${new_path%/}/" "$nginx_conf_path"
+	# Create a dedicated nginx config
+	ynh_add_nginx_config
 fi
 
 # Change the domain for nginx
 if [ $change_domain -eq 1 ]
 then
-	sudo mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf
+	# Delete file checksum for the old conf file location
+	ynh_delete_file_checksum "$nginx_conf_path"
+	mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf
+
+	# Store file checksum for the new config file location
+	ynh_store_file_checksum "/etc/nginx/conf.d/$new_domain.d/$app.conf"
 fi
 
 #=================================================
@@ -100,7 +103,7 @@ fi
 # RELOAD NGINX
 #=================================================
 
-ynh_system_reload nginx
+ynh_system_reload --service_name=nginx
 
 #=================================================
 # DEACTIVE MAINTENANCE MODE

+ 5 - 21
scripts/install

@@ -54,12 +54,6 @@ 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
 
-#=================================================
-# ACTIVATE MAINTENANCE MODE
-#=================================================
-
-ynh_maintenance_mode_ON
-
 #=================================================
 # STANDARD MODIFICATIONS
 #=================================================
@@ -100,10 +94,6 @@ ynh_setup_source "$final_path" admin_dashboard
 # NGINX CONFIGURATION
 #=================================================
 
-if [ "$path_url" != "/" ]
-then
-	ynh_replace_string "^#sub_path_only" "" "../conf/nginx.conf"
-fi
 ynh_add_nginx_config
 
 #=================================================
@@ -218,7 +208,7 @@ ynh_store_file_checksum "$setupVars"	# Enregistre la somme de contrôle du fichi
 # SET UP THE DNSMASQ CONFIG
 #=================================================
 
-ynh_system_reload dnsmasq stop
+ynh_system_reload --service_name=dnsmasq --action=stop
 
 pihole_dnsmasq_config="/etc/dnsmasq.d/01-pihole.conf"
 cp "$pihole_local_repo/advanced/01-pihole.conf" $pihole_dnsmasq_config
@@ -301,7 +291,7 @@ ynh_exec_fully_quiet yunohost firewall allow UDP 67 --no-upnp
 # RESTART DNSMASQ
 #=================================================
 
-ynh_system_reload dnsmasq restart
+ynh_system_reload --service_name=dnsmasq --action=restart
 
 #=================================================
 # INSTALL THE CRON JOB
@@ -322,7 +312,7 @@ ynh_exec_warn_less /opt/pihole/gravity.sh
 # START PIHOLE-FTL
 #=================================================
 
-ynh_system_reload pihole-FTL restart
+ynh_system_reload --service_name=pihole-FTL --action=restart
 
 #=================================================
 # SET UP THE CONF_REGEN HOOK
@@ -348,13 +338,7 @@ yunohost app addaccess --users=$admin $app
 # RELOAD NGINX
 #=================================================
 
-ynh_system_reload nginx
-
-#=================================================
-# DEACTIVE MAINTENANCE MODE
-#=================================================
-
-ynh_maintenance_mode_OFF
+ynh_system_reload --service_name=nginx
 
 #=================================================
 # SEND A README FOR THE ADMIN
@@ -372,4 +356,4 @@ 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"
+ynh_send_readme_to_admin --app_message="$message" --recipients="$admin"

+ 3 - 3
scripts/remove

@@ -34,7 +34,7 @@ fi
 # STOP THE SERVICE PIHOLE-FTL
 #=================================================
 
-ynh_system_reload pihole-FTL stop
+ynh_system_reload --service_name=pihole-FTL --action=stop
 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"
 
@@ -108,7 +108,7 @@ ynh_secure_remove "/etc/sudoers.d/pihole"
 # REMOVE THE DNSMASQ CONFIG
 #=================================================
 
-ynh_system_reload dnsmasq stop
+ynh_system_reload --service_name=dnsmasq --action=stop
 rm -f "/etc/dnsmasq.d/01-pihole.conf"
 rm -f "/etc/dnsmasq.d/02-pihole-dhcp.conf"
 rm -f "/etc/dnsmasq.d/03-pihole-wildcard.conf"
@@ -130,7 +130,7 @@ sed -i "/#Added by pihole#/d" /etc/hosts
 # RESTART DNSMASQ
 #=================================================
 
-ynh_system_reload dnsmasq restart
+ynh_system_reload --service_name=dnsmasq --action=restart
 
 #=================================================
 # REMOVE THE CONF_REGEN HOOK

+ 7 - 12
scripts/restore

@@ -6,12 +6,7 @@
 # IMPORT GENERIC HELPERS
 #=================================================
 
-if [ ! -e _common.sh ]; then
-	# Get the _common.sh file if it's not in the current directory
-	cp ../settings/scripts/_common.sh ./_common.sh
-	chmod a+rx _common.sh
-fi
-source _common.sh
+source ../settings/scripts/_common.sh
 source /usr/share/yunohost/helpers
 # Load common variables for all scripts.
 source ../settings/scripts/_variables
@@ -137,7 +132,7 @@ ynh_restore_file "/usr/share/yunohost/hooks/conf_regen/50-dnsmasq_$app"
 # RESTORE OF DNSMASQ CONFIG
 #=================================================
 
-ynh_system_reload dnsmasq stop
+ynh_system_reload --service_name=dnsmasq --action=stop
 
 ynh_restore_file "/etc/dnsmasq.d/01-pihole.conf"
 test -e "${YNH_APP_BACKUP_DIR}/etc/dnsmasq.d/02-pihole-dhcp.conf" && \
@@ -174,7 +169,7 @@ done <<< "$(yunohost domain list | grep "\." | sed 's/.*: \|.*- //')"
 # RESTART DNSMASQ
 #=================================================
 
-ynh_system_reload dnsmasq restart
+ynh_system_reload --service_name=dnsmasq --action=restart
 
 #=================================================
 # UPDATE THE VARIABLES FILE
@@ -193,7 +188,7 @@ ynh_store_file_checksum "$setupVars"	# Enregistre la somme de contrôle du fichi
 #=================================================
 
 ynh_exec_warn_less systemctl enable pihole-FTL
-ynh_system_reload pihole-FTL restart
+ynh_system_reload --service_name=pihole-FTL --action=restart
 
 #=================================================
 # GENERIC FINALISATION
@@ -201,8 +196,8 @@ ynh_system_reload pihole-FTL restart
 # RELOAD NGINX AND PHP-FPM
 #=================================================
 
-ynh_system_reload php5-fpm
-ynh_system_reload nginx
+ynh_system_reload --service_name=php5-fpm
+ynh_system_reload --service_name=nginx
 
 #=================================================
 # DEACTIVE MAINTENANCE MODE
@@ -226,4 +221,4 @@ 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"
+ynh_send_readme_to_admin --app_message="$message" --recipients="$admin"

+ 24 - 22
scripts/upgrade

@@ -28,7 +28,7 @@ port=$(ynh_app_setting_get $app port)
 # CHECK VERSION
 #=================================================
 
-ynh_abort_if_up_to_date
+upgrade_type=$(ynh_check_app_version_changed)
 
 #=================================================
 # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP
@@ -67,20 +67,19 @@ ynh_install_app_dependencies $app_depencencies
 # DOWNLOAD, CHECK AND UNPACK SOURCE
 #=================================================
 
-# Update la copie du repo de pihole (nécessaire pour Gravity)
-pihole_local_repo="/etc/.pihole"
-ynh_setup_source "$pihole_local_repo"
-# Update le dashboard admin
-ynh_setup_source "$final_path" admin_dashboard
+if [ "$upgrade_type" == "UPGRADE_APP" ]
+then
+	# Update la copie du repo de pihole (nécessaire pour Gravity)
+	pihole_local_repo="/etc/.pihole"
+	ynh_setup_source "$pihole_local_repo"
+	# Update le dashboard admin
+	ynh_setup_source "$final_path" admin_dashboard
+fi
 
 #=================================================
 # NGINX CONFIGURATION
 #=================================================
 
-if [ "$path_url" != "/" ]
-then
-	ynh_replace_string "^#sub_path_only" "" "../conf/nginx.conf"
-fi
 ynh_add_nginx_config
 
 #=================================================
@@ -138,17 +137,20 @@ sed -i "/# su #/d;" "$pihole_storage/logrotate"
 # UPDATE OF PIHOLE-FTL
 #=================================================
 
-ynh_system_reload pihole-FTL stop
+ynh_system_reload --service_name=pihole-FTL --action=stop
 
-# Get the source of Pi-Hole-FTL
-FTL_temp_path=$(mktemp -d)
-ynh_setup_source "$FTL_temp_path" FTL
-
-# Plutôt que télécharger le binaire C, on le compile nous-même.
-( cd "$FTL_temp_path"
-ynh_exec_warn_less make
-ynh_exec_warn_less make install )
-ynh_secure_remove "$FTL_temp_path"
+if [ "$upgrade_type" == "UPGRADE_APP" ]
+then
+	# Get the source of Pi-Hole-FTL
+	FTL_temp_path=$(mktemp -d)
+	ynh_setup_source "$FTL_temp_path" FTL
+
+	# Plutôt que télécharger le binaire C, on le compile nous-même.
+	( cd "$FTL_temp_path"
+	ynh_exec_warn_less make
+	ynh_exec_warn_less make install )
+	ynh_secure_remove "$FTL_temp_path"
+fi
 
 cp -a $pihole_local_repo/advanced/pihole-FTL.service /etc/init.d/pihole-FTL
 chmod +x /etc/init.d/pihole-FTL
@@ -191,7 +193,7 @@ ynh_replace_string ".*updatechecker.*" "#&" /etc/cron.d/pihole
 # START PIHOLE-FTL
 #=================================================
 
-ynh_system_reload pihole-FTL restart
+ynh_system_reload --service_name=pihole-FTL --action=restart
 
 #=================================================
 # UPDATE THE CONF_REGEN HOOK
@@ -203,7 +205,7 @@ cp ../conf/dnsmasq_regenconf_hook /usr/share/yunohost/hooks/conf_regen/50-dnsmas
 # RELOAD NGINX
 #=================================================
 
-ynh_system_reload nginx
+ynh_system_reload --service_name=nginx
 
 #=================================================
 # DEACTIVE MAINTENANCE MODE