diff --git a/config_panel.json b/config_panel.json index f3e926b..af55156 100644 --- a/config_panel.json +++ b/config_panel.json @@ -32,6 +32,17 @@ "type": "bool", "default": true }] + }, + { + "name": "Global configuration", + "id": "global_config", + "options": [{ + "name": "Send HTML email to admin ?", + "help": "Allow app scripts to send HTML mails instead of plain text.", + "id": "email_type", + "type": "bool", + "default": true + }] }] } ] diff --git a/scripts/_common.sh b/scripts/_common.sh index 278d8c7..e1d5b28 100755 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -710,7 +710,7 @@ ynh_script_progression () { # Send an email to inform the administrator # # usage: ynh_send_readme_to_admin --app_message=app_message [--recipients=recipients] [--type=type] -# | arg: -m --app_message= - The message to send to the administrator. +# | arg: -m --app_message= - The file with the content 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 @@ -723,11 +723,16 @@ ynh_send_readme_to_admin() { local recipients local type # Manage arguments with getopts + ynh_handle_getopts_args "$@" - app_message="${app_message:-...No specific information...}" + app_message="${app_message:-}" recipients="${recipients:-root}" type="${type:-install}" + # Get the value of admin_mail_html + admin_mail_html=$(ynh_app_setting_get $app admin_mail_html) + admin_mail_html="${admin_mail_html:-0}" + # Retrieve the email of users find_mails () { local list_mails="$1" @@ -774,12 +779,53 @@ ynh_send_readme_to_admin() { Specific information for the application $app. -$app_message +$(if [ -n "$app_message" ] +then + cat "$app_message" +else + echo "...No specific information..." +fi) --- Automatic diagnosis data from YunoHost -$(yunohost tools diagnosis | grep -B 100 "services:" | sed '/services:/d')" +__PRE_TAG1__$(yunohost tools diagnosis | grep -B 100 "services:" | sed '/services:/d')__PRE_TAG2__" + + # Store the message into a file for further modifications. + echo "$mail_message" > mail_to_send + + # If a html email is required. Apply html tags to the message. + if [ "$admin_mail_html" -eq 1 ] + then + # Insert 'br' tags at each ending of lines. + ynh_replace_string "$" "
" mail_to_send + + # Insert starting HTML tags + sed --in-place '1s@^@\n\n\n\n@' mail_to_send + + # Keep tabulations + ynh_replace_string " " "\ \ " mail_to_send + ynh_replace_string "\t" "\ \ " mail_to_send + + # Insert url links tags + ynh_replace_string "__URL_TAG1__\(.*\)__URL_TAG2__\(.*\)__URL_TAG3__" "\1" mail_to_send + + # Insert pre tags + ynh_replace_string "__PRE_TAG1__" "
" mail_to_send
+		ynh_replace_string "__PRE_TAG2__" "<\pre>" mail_to_send
+
+		# Insert finishing HTML tags
+		echo -e "\n\n" >> mail_to_send
+
+	# Otherwise, remove tags to keep a plain text.
+	else
+		# Remove URL tags
+		ynh_replace_string "__URL_TAG[1,3]__" "" mail_to_send
+		ynh_replace_string "__URL_TAG2__" ": " mail_to_send
+
+		# Remove PRE tags
+		ynh_replace_string "__PRE_TAG[1-2]__" "" mail_to_send
+	fi
 
 	# Define binary to use for mail command
 	if [ -e /usr/bin/bsd-mailx ]
@@ -789,8 +835,15 @@ $(yunohost tools diagnosis | grep -B 100 "services:" | sed '/services:/d')"
 		local mail_bin=/usr/bin/mail.mailutils
 	fi
 
+	if [ "$admin_mail_html" -eq 1 ]
+	then
+		content_type="text/html"
+	else
+		content_type="text/plain"
+	fi
+
 	# Send the email to the recipients
-	echo "$mail_message" | $mail_bin -a "Content-Type: text/plain; charset=UTF-8" -s "$mail_subject" "$recipients"
+	cat mail_to_send | $mail_bin -a "Content-Type: $content_type; charset=UTF-8" -s "$mail_subject" "$recipients"
 }
 
 #=================================================
@@ -961,3 +1014,65 @@ ynh_download_file () {
 	# Move the file to its destination
 	mv $filename $dest_dir
 }
+
+#=================================================
+
+# Create a changelog for an app after an upgrade.
+#
+# The changelog is printed into the file ./changelog for the time of the upgrade.
+#
+# In order to create a changelog, ynh_app_changelog will get info from /etc/yunohost/apps/$app/status.json
+# In order to find the current commit use by the app.
+# The remote repository, and the branch.
+# The changelog will be only the commits since the current revision.
+#
+# Because of the need of those info, ynh_app_changelog works only
+# with apps that have been installed from a list.
+#
+# usage: ynh_app_changelog
+ynh_app_changelog () {
+	get_value_from_settings ()
+	{
+		local value="$1"
+		# Extract a value from the status.json file of an installed app.
+
+		grep "$value\": \"" /etc/yunohost/apps/$app/status.json | sed "s/.*$value\": \"\([^\"]*\).*/\1/"
+	}
+
+	local current_revision="$(get_value_from_settings revision)"
+	local repo="$(get_value_from_settings url)"
+	local branch="$(get_value_from_settings branch)"
+	# ynh_app_changelog works only with an app installed from a list.
+	if [ -z "$current_revision" ] || [ -z "$repo" ] || [ -z "$branch" ]
+	then
+		ynh_print_warn "Unable to build the changelog..."
+		touch changelog
+		return 0
+	fi
+
+	# Fetch the history of the repository, without cloning it
+	mkdir git_history
+	(cd git_history
+	ynh_exec_warn_less git init
+	ynh_exec_warn_less git remote add -f origin $repo
+	# Get the line of the current commit of the installed app in the history.
+	local line_to_head=$(git log origin/$branch --pretty=oneline | grep --line-number "$current_revision" | cut -d':' -f1)
+	# Cut the history before the current commit, to keep only newer commits.
+	# Then use sed to reorganise each lines and have a nice list of commits since the last upgrade.
+	# This list is redirected into the file changelog
+	git log origin/$branch --pretty=oneline | head --lines=$(($line_to_head-1)) | sed 's/^\([[:alnum:]]*\)\(.*\)/*(\1) -> \2/g' > ../changelog)
+	# Remove 'Merge pull request' commits
+	sed -i '/Merge pull request #[[:digit:]]* from/d' changelog
+	# As well as conflict resolving commits
+	sed -i '/Merge branch .* into/d' changelog
+
+	# Get the value of admin_mail_html
+	admin_mail_html=$(ynh_app_setting_get $app admin_mail_html)
+	admin_mail_html="${admin_mail_html:-0}"
+
+	# If a html email is required. Apply html to the changelog.
+ 	if [ "$admin_mail_html" -eq 1 ]
+ 	then
+		sed -in-place "s@\*(\([[:alnum:]]*\)) -> \(.*\)@* __URL_TAG1__\2__URL_TAG2__${repo}/commit/\1__URL_TAG3__@g" changelog
+ 	fi
+}
diff --git a/scripts/config b/scripts/config
index 92939cd..504dbf7 100644
--- a/scripts/config
+++ b/scripts/config
@@ -51,6 +51,11 @@ old_overwrite_settings="$(ynh_app_setting_get $app overwrite_settings)"
 old_overwrite_settings=$(bool_to_true_false $old_overwrite_settings)
 overwrite_settings="${YNH_CONFIG_MAIN_OVERWRITE_FILES_OVERWRITE_SETTINGS:-$old_overwrite_settings}"
 
+# Type of admin mail configuration
+old_admin_mail_html="$(ynh_app_setting_get $app admin_mail_html)"
+old_admin_mail_html=$(bool_to_true_false $old_admin_mail_html)
+admin_mail_html="${YNH_CONFIG_MAIN_GLOBAL_CONFIG_EMAIL_TYPE:-$old_admin_mail_html}"
+
 #=================================================
 # SHOW_CONFIG FUNCTION FOR 'SHOW' COMMAND
 #=================================================
@@ -74,6 +79,8 @@ show_config() {
 	echo "YNH_CONFIG_MAIN_MINIDLNA_CONFIGURATION_FRIENDLY_NAME=$friendly_name"
 
 	echo "YNH_CONFIG_MAIN_OVERWRITE_FILES_OVERWRITE_SETTINGS=$overwrite_settings"
+
+	echo "YNH_CONFIG_MAIN_GLOBAL_CONFIG_EMAIL_TYPE=$admin_mail_html"
 }
 
 #=================================================
@@ -119,6 +126,10 @@ apply_config() {
 	# Set overwrite_settings
 	overwrite_settings=$(bool_to_01 $overwrite_settings)
 	ynh_app_setting_set $app overwrite_settings "$overwrite_settings"
+
+	# Set admin_mail_html
+	admin_mail_html=$(bool_to_01 $admin_mail_html)
+	ynh_app_setting_set $app admin_mail_html "$admin_mail_html"
 }
 
 #=================================================
diff --git a/scripts/install b/scripts/install
index 0383df9..1b8344c 100644
--- a/scripts/install
+++ b/scripts/install
@@ -30,7 +30,9 @@ app=$YNH_APP_INSTANCE_NAME
 ynh_script_progression --message="Store settings from manifest" --weight=2
 
 ynh_app_setting_set $app version ${version:0:1}
+
 ynh_app_setting_set $app overwrite_settings "1"
+ynh_app_setting_set $app admin_mail_html "1"
 
 #=================================================
 # CHECK DEBIAN'S CODENAME
@@ -134,18 +136,18 @@ ynh_systemd_action --action=restart --service_name=minidlna
 # Get main domain and buid the url of the admin panel of the app.
 admin_panel="https://$(grep portal_domain /etc/ssowat/conf.json | cut -d'"' -f4)/yunohost/admin/#/apps/$app"
 
-message="You can find a config file at /etc/minidlna.conf
+echo "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
 
-You can configure this app easily by using the experimental config-panel feature: $admin_panel/config-panel.
-You can also find some specific actions for this app by using the experimental action feature: $admin_panel/actions.
+You can configure this app easily by using the experimental __URL_TAG1__config-panel feature__URL_TAG2__$admin_panel/config-panel__URL_TAG3__.
+You can also find some specific actions for this app by using the experimental __URL_TAG1__action feature__URL_TAG2__$admin_panel/actions__URL_TAG3__.
 
-If you're facing an issue or want to improve this app, please open a new issue in this project: https://github.com/YunoHost-Apps/minidlna_ynh"
+If you're facing an issue or want to improve this app, please open a new issue in this __URL_TAG1__project__URL_TAG2__https://github.com/YunoHost-Apps/minidlna_ynh__URL_TAG3__." > mail_to_send
 
-ynh_send_readme_to_admin --app_message="$message" --recipients="root" --type="install"
+ynh_send_readme_to_admin --app_message="mail_to_send" --recipients="root" --type="install"
 
 #=================================================
 # END OF SCRIPT
diff --git a/scripts/restore b/scripts/restore
index 7947023..fb97f4a 100644
--- a/scripts/restore
+++ b/scripts/restore
@@ -96,18 +96,18 @@ yunohost service add minidlna --log "/var/log/minidlna.log"
 # Get main domain and buid the url of the admin panel of the app.
 admin_panel="https://$(grep portal_domain /etc/ssowat/conf.json | cut -d'"' -f4)/yunohost/admin/#/apps/$app"
 
-message="You can find a config file at /etc/minidlna.conf
+echo "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
 
-You can configure this app easily by using the experimental config-panel feature: $admin_panel/config-panel.
-You can also find some specific actions for this app by using the experimental action feature: $admin_panel/actions.
+You can configure this app easily by using the experimental __URL_TAG1__config-panel feature__URL_TAG2__$admin_panel/config-panel__URL_TAG3__.
+You can also find some specific actions for this app by using the experimental __URL_TAG1__action feature__URL_TAG2__$admin_panel/actions__URL_TAG3__.
 
-If you're facing an issue or want to improve this app, please open a new issue in this project: https://github.com/YunoHost-Apps/minidlna_ynh"
+If you're facing an issue or want to improve this app, please open a new issue in this __URL_TAG1__project__URL_TAG2__https://github.com/YunoHost-Apps/minidlna_ynh__URL_TAG3__." > mail_to_send
 
-ynh_send_readme_to_admin --app_message="$message" --recipients="root" --type="restore"
+ynh_send_readme_to_admin --app_message="mail_to_send" --recipients="root" --type="restore"
 
 #=================================================
 # END OF SCRIPT
diff --git a/scripts/upgrade b/scripts/upgrade
index 483b5c9..04f45aa 100644
--- a/scripts/upgrade
+++ b/scripts/upgrade
@@ -144,18 +144,26 @@ ynh_systemd_action --action=restart --service_name=minidlna
 # Get main domain and buid the url of the admin panel of the app.
 admin_panel="https://$(grep portal_domain /etc/ssowat/conf.json | cut -d'"' -f4)/yunohost/admin/#/apps/$app"
 
-message="You can find a config file at /etc/minidlna.conf
+# Build the changelog
+ynh_app_changelog || true
+
+echo "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
 
-You can configure this app easily by using the experimental config-panel feature: $admin_panel/config-panel.
-You can also find some specific actions for this app by using the experimental action feature: $admin_panel/actions.
+You can configure this app easily by using the experimental __URL_TAG1__config-panel feature__URL_TAG2__$admin_panel/config-panel__URL_TAG3__.
+You can also find some specific actions for this app by using the experimental __URL_TAG1__action feature__URL_TAG2__$admin_panel/actions__URL_TAG3__.
 
-If you're facing an issue or want to improve this app, please open a new issue in this project: https://github.com/YunoHost-Apps/minidlna_ynh"
+If you're facing an issue or want to improve this app, please open a new issue in this __URL_TAG1__project__URL_TAG2__https://github.com/YunoHost-Apps/minidlna_ynh__URL_TAG3__.
 
-ynh_send_readme_to_admin --app_message="$message" --recipients="root" --type="upgrade"
+---
+
+Changelog since your last upgrade:
+$(cat changelog)" > mail_to_send
+
+ynh_send_readme_to_admin --app_message="mail_to_send" --recipients="root" --type="upgrade"
 
 #=================================================
 # END OF SCRIPT