Explorar el Código

Merge pull request #13 from YunoHost-Apps/testing

Testing
Maniack Crudelis hace 7 años
padre
commit
5cd2ed1e61

+ 33 - 0
actions.json

@@ -0,0 +1,33 @@
+[{
+		"id": "force_backup",
+		"name": "Create a new backup",
+		"command": "/bin/bash scripts/actions/force_backup",
+		"user": "root",
+		"accepted_return_codes": [0],
+		"description": {
+			"en": "Run Archivist to create a new backup.",
+			"fr": "Lance Archivist pour créer un nouveau backup."
+		}
+},
+{
+		"id": "clean_backups",
+		"name": "Clean all previous backup files",
+		"command": "/bin/bash scripts/actions/clean_backups",
+		"user": "root",
+		"accepted_return_codes": [0],
+		"description": {
+			"en": "Remove all previous backup files made by Archivist.",
+			"fr": "Supprime tout les précédents backups créés par Archivist."
+		}
+},
+{
+		"id": "reset_default_config",
+		"name": "Reset the config file and restore a default one.",
+		"command": "/bin/bash scripts/actions/reset_default_config \"Backup_list.conf\"",
+		"user": "root",
+		"accepted_return_codes": [0],
+		"description": {
+			"en": "Reset the config file Backup_list.conf.",
+			"fr": "Réinitialise le fichier de configuration Backup_list.conf."
+		}
+}]

+ 70 - 0
config_panel.json

@@ -0,0 +1,70 @@
+{
+	"name": "Archivist configuration panel",
+	"version": "0.1",
+	"panel": [{
+		"name": "Archivist configuration",
+		"id": "main",
+		"sections": [{
+			"name": "Encryption",
+			"id": "encryption",
+			"options": [{
+				"name": "Do you want to encrypt your backups ?",
+				"id": "encrypt",
+				"type": "bool",
+				"default": true
+			}, {
+				"name": "Set the password for encryption",
+				"help": "A password is needed if encryption is activated.",
+				"id": "encryption_pwd",
+				"type": "password",
+				"optional": true
+			}]
+		},
+		{
+			"name": "Backup",
+			"id": "backup_types",
+			"options": [{
+				"name": "Would you like to backup your YunoHost core ?",
+				"id": "core_backup",
+				"type": "bool",
+				"default": true
+			}, {
+				"name": "Would you like to backup your apps ?",
+				"help": "WARNING: Changing this value will either remove backup for all apps or add all current apps to the backup.",
+				"id": "apps_backup",
+				"type": "bool",
+				"default": true
+			}]
+		},
+		{
+			"name": "Backup options",
+			"id": "backup_options",
+			"options": [{
+				"name": "Choose the frequency of your backups ?",
+				"help": "We can't use a choices field for now. In the meantime please choose between one of this values:<br>Daily, Each 3 days, Weekly, Biweekly, Monthly.",
+				"id": "frequency",
+				"type": "text",
+				"//": "\"choices\" : [\"Daily\", \"Each 3 days\", \"Weekly\", \"Biweekly\", \"Monthly\"]",
+				"default" : "Weekly"
+			}, {
+				"name": "Max size for each backup in Mb",
+				"help": "Specify the max size of each backup for the following option file_to_backup.</br>This option is a soft limit, that means the script will try to limit each backup to this max size if it can.</br>But there's 2 limitations, for a single directory, it can't makes more than one backup file, even if the files in this directory exceed this maximum size.</br>And, if there's some files in a directory, next to subdirectories, it'll make only one backup for this files.</br>So this limit will be applied to split the backup by its subdirectories to avoid to have only one big backup.",
+				"id": "max_size",
+				"type": "number",
+				"default": 500
+			}]
+		},
+		{
+			"name": "Overwriting config files",
+			"id": "overwrite_files",
+			"options": [{
+				"name": "Overwrite the cron file during the upgrade ?",
+				"help": "If the file is overwritten, a backup will be created.",
+				"id": "overwrite_cron",
+				"type": "bool",
+				"default": true
+			}]
+		}]
+	}
+]
+}

+ 20 - 2
scripts/_common.sh

@@ -30,6 +30,24 @@ IS_PACKAGE_CHECK () {
 	return $(env | grep -c container=lxc)
 }
 
+#=================================================
+# BOOLEAN CONVERTER
+#=================================================
+
+bool_to_01 () {
+	local var="$1"
+	[ "$var" = "true" ] && var=1
+	[ "$var" = "false" ] && var=0
+	echo "$var"
+}
+
+bool_to_true_false () {
+	local var="$1"
+	[ "$var" = "1" ] && var=true
+	[ "$var" = "0" ] && var=false
+	echo "$var"
+}
+
 #=================================================
 # EXPERIMENTAL HELPERS
 #=================================================
@@ -517,7 +535,7 @@ EOF
   ynh_store_file_checksum "$finalfail2banjailconf"
   ynh_store_file_checksum "$finalfail2banfilterconf"
 
-  systemctl reload fail2ban
+  systemctl restart fail2ban
   local fail2ban_error="$(journalctl -u fail2ban | tail -n50 | grep "WARNING.*$app.*")"
   if [ -n "$fail2ban_error" ]
   then
@@ -532,7 +550,7 @@ EOF
 ynh_remove_fail2ban_config () {
   ynh_secure_remove "/etc/fail2ban/jail.d/$app.conf"
   ynh_secure_remove "/etc/fail2ban/filter.d/$app.conf"
-  systemctl reload fail2ban
+  systemctl restart fail2ban
 }
 
 #=================================================

+ 44 - 0
scripts/actions/clean_backups

@@ -0,0 +1,44 @@
+#!/bin/bash
+
+#=================================================
+# GENERIC STARTING
+#=================================================
+# IMPORT GENERIC HELPERS
+#=================================================
+
+source scripts/_common.sh
+source /usr/share/yunohost/helpers
+
+#=================================================
+# RETRIEVE ARGUMENTS
+#=================================================
+
+app=${YNH_APP_INSTANCE_NAME:-$YNH_APP_ID}
+
+final_path=$(ynh_app_setting_get $app final_path)
+
+#=================================================
+# CHECK IF ARGUMENTS ARE CORRECT
+#=================================================
+
+#=================================================
+# CHECK IF AN ACTION HAS TO BE DONE
+#=================================================
+
+#=================================================
+# SPECIFIC ACTION
+#=================================================
+# CLEAN ALL BACKUP FILES
+#=================================================
+
+# Get the backup directory from the config file
+backup_dir="$(grep "^backup_dir=" "$final_path/Backup_list.conf" | cut -d= -f2)"
+
+while read directory <&3
+do
+	if [ -n "$directory" ]
+	then
+		ynh_print_info "Clean backup directory $directory" >&2
+		ynh_secure_remove "$directory"
+	fi
+done 3<<< $(find "$backup_dir" -maxdepth 1 -mindepth 1 -type d)

+ 34 - 0
scripts/actions/force_backup

@@ -0,0 +1,34 @@
+#!/bin/bash
+
+#=================================================
+# GENERIC STARTING
+#=================================================
+# IMPORT GENERIC HELPERS
+#=================================================
+
+source scripts/_common.sh
+source /usr/share/yunohost/helpers
+
+#=================================================
+# RETRIEVE ARGUMENTS
+#=================================================
+
+app=${YNH_APP_INSTANCE_NAME:-$YNH_APP_ID}
+
+final_path=$(ynh_app_setting_get $app final_path)
+
+#=================================================
+# CHECK IF ARGUMENTS ARE CORRECT
+#=================================================
+
+#=================================================
+# CHECK IF AN ACTION HAS TO BE DONE
+#=================================================
+
+#=================================================
+# SPECIFIC ACTION
+#=================================================
+# FORCE A NEW BACKUP
+#=================================================
+
+ynh_exec_warn nice -n10 $final_path/archivist.sh

+ 82 - 0
scripts/actions/reset_default_config

@@ -0,0 +1,82 @@
+#!/bin/bash
+
+#=================================================
+# GENERIC STARTING
+#=================================================
+# IMPORT GENERIC HELPERS
+#=================================================
+
+source scripts/_common.sh
+source /usr/share/yunohost/helpers
+
+#=================================================
+# RETRIEVE ARGUMENTS
+#=================================================
+
+app=${YNH_APP_INSTANCE_NAME:-$YNH_APP_ID}
+final_path=$(ynh_app_setting_get $app final_path)
+encrypt=$(ynh_app_setting_get $app encrypt)
+core_backup=$(ynh_app_setting_get $app core_backup)
+apps_backup=$(ynh_app_setting_get $app apps_backup)
+
+#=================================================
+# SORT OUT THE CONFIG FILE TO HANDLE
+#=================================================
+
+file="$1"
+
+if [ "$file" = "Backup_list.conf" ]; then
+	config_file="$final_path/Backup_list.conf"
+fi
+
+#=================================================
+# SPECIFIC ACTION
+#=================================================
+# RESET THE CONFIG FILE
+#=================================================
+
+# Verify the checksum and backup the file if it's different
+ynh_backup_if_checksum_is_different "$config_file"
+
+if [ "$file" = "Backup_list.conf" ]
+then
+	# Get the default file and overwrite the current config
+	cp "$final_path/Backup_list.conf.default" "$config_file"
+
+	# Recreate the default config
+	backup_dir="/home/yunohost.app/${app}/backup"
+	enc_backup_dir="/home/yunohost.app/${app}/encrypted_backup"
+	ynh_replace_string "^backup_dir=.*" "backup_dir=$backup_dir" "$config_file"
+	ynh_replace_string "^enc_backup_dir=.*" "enc_backup_dir=$enc_backup_dir" "$config_file"
+
+	if [ $encrypt -eq 1 ]
+	then
+		encrypt=true
+		passkey="$final_path/passkey"
+	else
+		encrypt=false
+		passkey=na
+	fi
+	ynh_replace_string "^encrypt=.*" "encrypt=$encrypt" "$config_file"
+	ynh_replace_string "^cryptpass=.*" "cryptpass=$passkey" "$config_file"
+
+	if [ $core_backup -eq 1 ]
+	then
+		core_backup=true
+	else
+		core_backup=false
+	fi
+	ynh_replace_string "^ynh_core_backup=.*" "ynh_core_backup=$core_backup" "$config_file"
+
+	if [ $apps_backup -eq 1 ]
+	then
+		# Add all current applications to the backup
+		while read backup_app
+		do
+			ynh_replace_string "^ynh_app_backup=$" "ynh_app_backup=$backup_app\n&" "$config_file"
+		done <<< "$(yunohost app list -i | grep id: | sed 's/.*id: //')"
+	fi
+fi
+
+# Calculate and store the config file checksum into the app settings
+ynh_store_file_checksum "$config_file"

+ 171 - 0
scripts/config

@@ -0,0 +1,171 @@
+#!/bin/bash
+
+#=================================================
+# GENERIC STARTING
+#=================================================
+# IMPORT GENERIC HELPERS
+#=================================================
+
+source _common.sh
+source /usr/share/yunohost/helpers
+
+#=================================================
+# RETRIEVE ARGUMENTS
+#=================================================
+
+app=${YNH_APP_INSTANCE_NAME:-$YNH_APP_ID}
+
+final_path=$(ynh_app_setting_get $app final_path)
+
+#=================================================
+# SPECIFIC CODE
+#=================================================
+# DECLARE GENERIC FUNCTION
+#=================================================
+
+config_file="$final_path/Backup_list.conf"
+passkey="$final_path/passkey"
+
+get_config_value() {
+	option_name="$1"
+	# Get the value of this option in the config file
+	grep "^$option_name=" "$config_file" | cut -d= -f2
+}
+
+#=================================================
+# LOAD VALUES
+#=================================================
+
+# Load the real value from the app config or elsewhere.
+# Then get the value from the form.
+# If the form has a value for a variable, take the value from the form,
+# Otherwise, keep the value from the app config.
+
+# Encryption
+old_encrypt="$(get_config_value encrypt)"
+encrypt="${YNH_CONFIG_MAIN_ENCRYPTION_ENCRYPT:-$old_encrypt}"
+# Encryption password
+ynh_print_OFF
+old_encrypt_password="$(cat $passkey)"
+encrypt_password="${YNH_CONFIG_MAIN_ENCRYPTION_ENCRYPTION_PWD:-$old_encrypt_password}"
+ynh_print_ON
+# ynh_core_backup
+old_ynh_core_backup="$(get_config_value ynh_core_backup)"
+ynh_core_backup="${YNH_CONFIG_MAIN_BACKUP_TYPES_CORE_BACKUP:-$old_ynh_core_backup}"
+# ynh_app_backup
+if [ -n "$(get_config_value ynh_app_backup)" ]
+then
+	old_ynh_app_backup="true"
+else
+	old_ynh_app_backup="false"
+fi
+ynh_app_backup="${YNH_CONFIG_MAIN_BACKUP_TYPES_APPS_BACKUP:-$old_ynh_app_backup}"
+# Frequency
+old_frequency="$(grep "^frequency: " "/etc/yunohost/apps/$app/settings.yml" | cut -d' ' -f2)"
+frequency="${YNH_CONFIG_MAIN_BACKUP_OPTIONS_FREQUENCY:-$old_frequency}"
+# Max size
+old_max_size="$(get_config_value max_size)"
+max_size="${YNH_CONFIG_MAIN_BACKUP_OPTIONS_MAX_SIZE:-$old_max_size}"
+
+# Overwrite cron file
+old_overwrite_cron="$(ynh_app_setting_get $app overwrite_cron)"
+old_overwrite_cron=$(bool_to_true_false $old_overwrite_cron)
+overwrite_cron="${YNH_CONFIG_MAIN_OVERWRITE_FILES_OVERWRITE_CRON:-$old_overwrite_cron}"
+
+#=================================================
+# SHOW_CONFIG FUNCTION FOR 'SHOW' COMMAND
+#=================================================
+
+show_config() {
+	# here you are supposed to read some config file/database/other then print the values
+	# echo "YNH_CONFIG_${PANEL_ID}_${SECTION_ID}_${OPTION_ID}=value"
+	echo "YNH_CONFIG_MAIN_ENCRYPTION_ENCRYPT=$encrypt"
+	echo "YNH_CONFIG_MAIN_ENCRYPTION_ENCRYPTION_PWD="
+
+	echo "YNH_CONFIG_MAIN_BACKUP_TYPES_CORE_BACKUP=$ynh_core_backup"
+	echo "YNH_CONFIG_MAIN_BACKUP_TYPES_APPS_BACKUP=$ynh_app_backup"
+
+	echo "YNH_CONFIG_MAIN_BACKUP_OPTIONS_FREQUENCY=$frequency"
+	echo "YNH_CONFIG_MAIN_BACKUP_OPTIONS_MAX_SIZE=$max_size"
+
+	echo "YNH_CONFIG_MAIN_OVERWRITE_FILES_OVERWRITE_CRON=$overwrite_cron"
+}
+
+#=================================================
+# MODIFY THE CONFIGURATION
+#=================================================
+
+apply_config() {
+	# Change the password if needed
+	if [ "$encrypt" = "true" ]; then
+		ynh_print_OFF
+		test -n "$encrypt_password" || ynh_die "The password for encryption can't be empty if you choose to enable encryption."
+		ynh_print_ON
+		# Replace the password by the previous one
+		passkey="$final_path/passkey"
+		ynh_print_OFF; echo "$encrypt_password" > "$passkey"; ynh_print_ON
+		chmod 400 "$passkey"
+		ynh_replace_string "^cryptpass=.*" "cryptpass=$passkey" "$config_file"
+	fi
+
+	# Change encrypt in the config file
+	ynh_replace_string "^encrypt=.*" "encrypt=$encrypt" "$config_file"
+
+	# Change ynh_core_backup in the config file
+	ynh_replace_string "^ynh_core_backup=.*" "ynh_core_backup=$ynh_core_backup" "$config_file"
+
+	# Change ynh_app_backup in the config file
+	if [ "$ynh_app_backup" = "true" ] && [ "$old_ynh_app_backup" = "false" ]
+	then
+		# If ynh_app_backup changed from false to true.
+		# Add all current applications to the backup
+		while read backup_app
+		do
+			ynh_print_info "Add a backup for the app $backup_app." >&2
+			ynh_replace_string "^ynh_app_backup=$" "ynh_app_backup=$backup_app\n&" "$config_file"
+		done <<< "$(yunohost app list -i | grep id: | sed 's/.*id: //')"
+	elif [ "$ynh_app_backup" = "false" ] && [ "$old_ynh_app_backup" = "true" ]
+	then
+		# Remove all app currently backup
+		# By deleting all line starting by 'ynh_app_backup=' and having something after '='
+		sed -i "/^ynh_app_backup=.\+$/d" "$config_file"
+	fi
+
+	# Change frequency in the cron file and store the value into the settings
+	ynh_app_setting_set $app frequency "$frequency"
+	if [ "$frequency" = "Daily" ]; then
+		cron_freq="0 2 * * *"
+		run_freq="every day"
+	elif [ "$frequency" = "Each 3 days" ]; then
+		cron_freq="0 2 */3 * *"
+		run_freq="each 3 days"
+	elif [ "$frequency" = "Weekly" ]; then
+		cron_freq="0 2 * * 0"
+		run_freq="once a week on sunday"
+	elif [ "$frequency" = "Biweekly" ]; then
+		cron_freq="0 2 * * 0/2"
+		run_freq="one sunday out of two"
+	else	# Monthly
+		cron_freq="0 2 1 * *"
+		run_freq="once a month on the first sunday"
+	fi
+	ynh_replace_string ".* root" "$cron_freq root" /etc/cron.d/$app
+
+	# Change max_size in the config file
+	ynh_replace_string "^max_size=.*" "max_size=$max_size" "$config_file"
+
+	# Set overwrite_cron
+	overwrite_cron=$(bool_to_01 $overwrite_cron)
+	ynh_app_setting_set $app overwrite_cron "$overwrite_cron"
+}
+
+#=================================================
+# GENERIC FINALIZATION
+#=================================================
+# SELECT THE ACTION FOLLOWING THE GIVEN ARGUMENT
+#=================================================
+
+case $1 in
+  show) show_config;;
+  apply) apply_config;;
+esac

+ 7 - 0
scripts/install

@@ -46,6 +46,10 @@ fi
 #=================================================
 
 ynh_app_setting_set $app frequency "$frequency"
+ynh_app_setting_set $app encrypt "$encrypt"
+ynh_app_setting_set $app core_backup "$core_backup"
+ynh_app_setting_set $app apps_backup "$apps_backup"
+ynh_app_setting_set $app overwrite_cron "1"
 
 #=================================================
 # STANDARD MODIFICATIONS
@@ -118,6 +122,9 @@ then
 	done <<< "$(yunohost app list -i | grep id: | sed 's/.*id: //')"
 fi
 
+# Calculate and store the config file checksum into the app settings
+ynh_store_file_checksum "$config_file"
+
 #=================================================
 # STRETCH COMPATIBILITY
 #=================================================

+ 61 - 20
scripts/upgrade

@@ -24,6 +24,10 @@ app=$YNH_APP_INSTANCE_NAME
 
 final_path=$(ynh_app_setting_get $app final_path)
 frequency="$(ynh_app_setting_get $app frequency)"
+encrypt=$(ynh_app_setting_get $app encrypt)
+core_backup=$(ynh_app_setting_get $app core_backup)
+apps_backup=$(ynh_app_setting_get $app apps_backup)
+overwrite_cron=$(ynh_app_setting_get $app overwrite_cron)
 
 #=================================================
 # CHECK VERSION
@@ -31,6 +35,39 @@ frequency="$(ynh_app_setting_get $app frequency)"
 
 upgrade_type=$(ynh_check_app_version_changed)
 
+#=================================================
+# ENSURE DOWNWARD COMPATIBILITY
+#=================================================
+
+# If encrypt doesn't exist, create it
+if [ -z "$encrypt" ]; then
+	encrypt="$(grep "^encrypt=" "$final_path/Backup_list.conf" | cut -d= -f2)"
+	if [ "$encrypt" = true ]; then
+		encrypt=1
+	else
+		encrypt=0
+	fi
+	ynh_app_setting_set $app encrypt $encrypt
+fi
+
+# If core_backup doesn't exist, create it
+if [ -z "$core_backup" ]; then
+	core_backup="$(grep "^ynh_core_backup=" "$final_path/Backup_list.conf" | cut -d= -f2)"
+	ynh_app_setting_set $app core_backup $core_backup
+fi
+
+# If apps_backup doesn't exist, create it
+if [ -z "$apps_backup" ]; then
+	apps_backup="$(grep --count --max-count=1 "^ynh_app_backup=" "$final_path/Backup_list.conf")"
+	ynh_app_setting_set $app apps_backup $apps_backup
+fi
+
+# If overwrite_cron doesn't exist, create it
+if [ -z "$overwrite_cron" ]; then
+	overwrite_cron=1
+	ynh_app_setting_set $app overwrite_cron $overwrite_cron
+fi
+
 #=================================================
 # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP
 #=================================================
@@ -72,27 +109,31 @@ fi
 # UPDATE THE CRON FILE
 #=================================================
 
-# Verify the checksum and backup the file if it's different
-ynh_backup_if_checksum_is_different "/etc/cron.d/$app"
-
-cp ../conf/cron /etc/cron.d/$app
-ynh_replace_string "__FINALPATH__" "$final_path" /etc/cron.d/$app
-ynh_replace_string "__APP__" "$app" /etc/cron.d/$app
-if [ "$frequency" = "Daily" ]; then
-	cron_freq="0 2 * * *"
-elif [ "$frequency" = "Each 3 days" ]; then
-	cron_freq="0 2 */3 * *"
-elif [ "$frequency" = "Weekly" ]; then
-	cron_freq="0 2 * * 0"
-elif [ "$frequency" = "Biweekly" ]; then
-	cron_freq="0 2 * * 0/2"
-else	# Monthly
-	cron_freq="0 2 1 * *"
+# Overwrite the cron file only if it's allowed
+if [ $overwrite_cron -eq 1 ]
+then
+	# Verify the checksum and backup the file if it's different
+	ynh_backup_if_checksum_is_different "/etc/cron.d/$app"
+
+	cp ../conf/cron /etc/cron.d/$app
+	ynh_replace_string "__FINALPATH__" "$final_path" /etc/cron.d/$app
+	ynh_replace_string "__APP__" "$app" /etc/cron.d/$app
+	if [ "$frequency" = "Daily" ]; then
+		cron_freq="0 2 * * *"
+	elif [ "$frequency" = "Each 3 days" ]; then
+		cron_freq="0 2 */3 * *"
+	elif [ "$frequency" = "Weekly" ]; then
+		cron_freq="0 2 * * 0"
+	elif [ "$frequency" = "Biweekly" ]; then
+		cron_freq="0 2 * * 0/2"
+	else	# Monthly
+		cron_freq="0 2 1 * *"
+	fi
+	ynh_replace_string "__FREQUENCY__" "$cron_freq" /etc/cron.d/$app
+
+	# Recalculate and store the config file checksum into the app settings
+	ynh_store_file_checksum "/etc/cron.d/$app"
 fi
-ynh_replace_string "__FREQUENCY__" "$cron_freq" /etc/cron.d/$app
-
-# Recalculate and store the config file checksum into the app settings
-ynh_store_file_checksum "/etc/cron.d/$app"
 
 #=================================================
 # SETUP LOGROTATE