diff --git a/check_process b/check_process index c71b420..e218cf4 100644 --- a/check_process +++ b/check_process @@ -20,10 +20,10 @@ Level 1=auto Level 2=auto Level 3=auto +# Level 4: No multi-users support Level 4=na -# Level 4: - Level 5=auto -# Level 5: +# Level 5: https://github.com/YunoHost-Apps/transmission_ynh/issues/30 + Level 5=1 Level 6=auto Level 7=auto Level 8=0 diff --git a/manifest.json b/manifest.json index be21604..9eef4e2 100644 --- a/manifest.json +++ b/manifest.json @@ -2,19 +2,20 @@ "name": "Transmission", "id": "transmission", "packaging_format": 1, - "requirements": { - "yunohost": ">= 2.4.0" - }, "description": { "en": "A Fast, Easy, and Free BitTorrent Client", "fr": "Un client BitTorrent libre et rapide" }, + "version": "1.0", "url": "https://www.transmissionbt.com/", "license": " GPL-3.0", "maintainer": { "name": "Apps Group", "email": "apps_group@yunohost.org" }, + "requirements": { + "yunohost": ">= 2.7.2" + }, "multi_instance": false, "services": [ "nginx", diff --git a/scripts/_common.sh b/scripts/_common.sh index 79cee95..adbff7a 100755 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -7,130 +7,17 @@ ynh_multimedia_build_main_dir () { wget -qq https://github.com/YunoHost-Apps/yunohost.multimedia/archive/master.zip unzip -qq master.zip - sudo ./yunohost.multimedia-master/script/ynh_media_build.sh + ./yunohost.multimedia-master/script/ynh_media_build.sh } ynh_multimedia_addfolder () { - sudo ./yunohost.multimedia-master/script/ynh_media_addfolder.sh --source="$1" --dest="$2" -} - -#================================================= -#================================================= -# TESTING -#================================================= -#================================================= - -ynh_nginx_config () { - finalnginxconf="/etc/nginx/conf.d/$domain.d/$app.conf" - ynh_backup_if_checksum_is_different "$finalnginxconf" 1 - sudo cp ../conf/nginx.conf "$finalnginxconf" - - # To avoid a break by set -u, use a void substitution ${var:-}. If the variable is not set, it's simply set with an empty variable. - # Substitute in a nginx config file only if the variable is not empty - if test -n "${path_url:-}"; then - ynh_replace_string "__PATH__" "$path_url" "$finalnginxconf" - fi - if test -n "${domain:-}"; then - ynh_replace_string "__DOMAIN__" "$domain" "$finalnginxconf" - fi - if test -n "${port:-}"; then - ynh_replace_string "__PORT__" "$port" "$finalnginxconf" - fi - if test -n "${app:-}"; then - ynh_replace_string "__NAME__" "$app" "$finalnginxconf" - fi - if test -n "${final_path:-}"; then - ynh_replace_string "__FINALPATH__" "$final_path" "$finalnginxconf" - fi - ynh_store_file_checksum "$finalnginxconf" - - sudo systemctl reload nginx -} - -ynh_remove_nginx_config () { - ynh_secure_remove "/etc/nginx/conf.d/$domain.d/$app.conf" - sudo systemctl reload nginx -} - -#================================================= -#================================================= - -#================================================= -# CHECKING -#================================================= - -CHECK_DOMAINPATH () { # Vérifie la disponibilité du path et du domaine. - if sudo yunohost app --help | grep --quiet url-available - then - # Check availability of a web path - ynh_webpath_available $domain $path_url - # Register/book a web path for an app - ynh_webpath_register $app $domain $path_url - else - # Use the legacy command - sudo yunohost app checkurl $domain$path_url -a $app - fi -} - -#================================================= -# 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 + ./yunohost.multimedia-master/script/ynh_media_addfolder.sh --source="$1" --dest="$2" } #================================================= # BACKUP #================================================= -BACKUP_FAIL_UPGRADE () { - WARNING echo "Upgrade failed." - app_bck=${app//_/-} # Replace all '_' by '-' - if sudo yunohost backup list | grep -q $app_bck-pre-upgrade$backup_number; then # Vérifie l'existence de l'archive avant de supprimer l'application et de restaurer - sudo yunohost app remove $app # Supprime l'application avant de la restaurer. - sudo yunohost backup restore --ignore-hooks $app_bck-pre-upgrade$backup_number --apps $app --force # Restore the backup if upgrade failed - ynh_die "The app was restored to the way it was before the failed upgrade." - fi -} - -BACKUP_BEFORE_UPGRADE () { # Backup the current version of the app, restore it if the upgrade fails - backup_number=1 - old_backup_number=2 - app_bck=${app//_/-} # Replace all '_' by '-' - if sudo yunohost backup list | grep -q $app_bck-pre-upgrade1; then # Vérifie l'existence d'une archive déjà numéroté à 1. - backup_number=2 # Et passe le numéro de l'archive à 2 - old_backup_number=1 - fi - - sudo yunohost backup create --ignore-hooks --apps $app --name $app_bck-pre-upgrade$backup_number # Créer un backup différent de celui existant. - if [ "$?" -eq 0 ]; then # Si le backup est un succès, supprime l'archive précédente. - if sudo yunohost backup list | grep -q $app_bck-pre-upgrade$old_backup_number; then # Vérifie l'existence de l'ancienne archive avant de la supprimer, pour éviter une erreur. - QUIET sudo yunohost backup delete $app_bck-pre-upgrade$old_backup_number - fi - else # Si le backup a échoué - ynh_die "Backup failed, the upgrade process was aborted." - fi -} - HUMAN_SIZE () { # Transforme une taille en Ko en une taille lisible pour un humain human=$(numfmt --to=iec --from-unit=1K $1) echo $human @@ -138,236 +25,13 @@ HUMAN_SIZE () { # Transforme une taille en Ko en une taille lisible pour un huma CHECK_SIZE () { # Vérifie avant chaque backup que l'espace est suffisant file_to_analyse=$1 - backup_size=$(sudo du --summarize "$file_to_analyse" | cut -f1) - free_space=$(sudo df --output=avail "/home/yunohost.backup" | sed 1d) + backup_size=$(du --summarize "$file_to_analyse" | cut -f1) + free_space=$(df --output=avail "/home/yunohost.backup" | sed 1d) if [ $free_space -le $backup_size ] then - WARNING echo "Espace insuffisant pour sauvegarder $file_to_analyse." - WARNING echo "Espace disponible: $(HUMAN_SIZE $free_space)" + echo "Espace insuffisant pour sauvegarder $file_to_analyse." >&2 + echo "Espace disponible: $(HUMAN_SIZE $free_space)" >&2 ynh_die "Espace nécessaire: $(HUMAN_SIZE $backup_size)" fi } - -# Ce helper est temporaire et sert de remplacement à la véritable fonction ynh_restore_file. Le temps qu'elle arrive... -ynh_restore_file () { - if [ -f "$1" ]; then - ynh_die "There is already a file at this path: $1" - fi - sudo cp -a "${YNH_APP_BACKUP_DIR}$1" "$1" -} - -#================================================= -#================================================= -# FUTUR YNH HELPERS -#================================================= -# Importer ce fichier de fonction avant celui des helpers officiel -# Ainsi, les officiels prendront le pas sur ceux-ci le cas échéant -#================================================= - -# Normalize the url path syntax -# Handle the slash at the beginning of path and its absence at ending -# Return a normalized url path -# -# example: url_path=$(ynh_normalize_url_path $url_path) -# ynh_normalize_url_path example -> /example -# ynh_normalize_url_path /example -> /example -# ynh_normalize_url_path /example/ -> /example -# ynh_normalize_url_path / -> / -# -# usage: ynh_normalize_url_path path_to_normalize -# | arg: url_path_to_normalize - URL path to normalize before using it -ynh_normalize_url_path () { - path_url=$1 - test -n "$path_url" || ynh_die "ynh_normalize_url_path expect a URL path as first argument and received nothing." - if [ "${path_url:0:1}" != "/" ]; then # If the first character is not a / - path_url="/$path_url" # Add / at begin of path variable - fi - if [ "${path_url:${#path_url}-1}" == "/" ] && [ ${#path_url} -gt 1 ]; then # If the last character is a / and that not the only character. - path_url="${path_url:0:${#path_url}-1}" # Delete the last character - fi - echo $path_url -} - -# Manage a fail of the script -# -# Print a warning to inform that the script was failed -# Execute the ynh_clean_setup function if used in the app script -# -# usage of ynh_clean_setup function -# This function provide a way to clean some residual of installation that not managed by remove script. -# To use it, simply add in your script: -# ynh_clean_setup () { -# instructions... -# } -# This function is optionnal. -# -# Usage: ynh_exit_properly is used only by the helper ynh_abort_if_errors. -# You must not use it directly. -ynh_exit_properly () { - exit_code=$? - if [ "$exit_code" -eq 0 ]; then - exit 0 # Exit without error if the script ended correctly - fi - - trap '' EXIT # Ignore new exit signals - set +eu # Do not exit anymore if a command fail or if a variable is empty - - echo -e "!!\n $app's script has encountered an error. Its execution was cancelled.\n!!" >&2 - - if type -t ynh_clean_setup > /dev/null; then # Check if the function exist in the app script. - ynh_clean_setup # Call the function to do specific cleaning for the app. - fi - - ynh_die # Exit with error status -} - -# Exit if an error occurs during the execution of the script. -# -# Stop immediatly the execution if an error occured or if a empty variable is used. -# The execution of the script is derivate to ynh_exit_properly function before exit. -# -# Usage: ynh_abort_if_errors -ynh_abort_if_errors () { - set -eu # Exit if a command fail, and if a variable is used unset. - trap ynh_exit_properly EXIT # Capturing exit signals on shell script -} - -# Find a free port and return it -# -# example: port=$(ynh_find_port 8080) -# -# usage: ynh_find_port begin_port -# | arg: begin_port - port to start to search -ynh_find_port () { - port=$1 - test -n "$port" || ynh_die "The argument of ynh_find_port must be a valid port." - while netcat -z 127.0.0.1 $port # Check if the port is free - do - port=$((port+1)) # Else, pass to next port - done - echo $port -} - -# Delete a system user -# -# usage: ynh_system_user_delete user_name -# | arg: user_name - Name of the system user that will be create -ynh_system_user_delete () { - if ynh_system_user_exists "$1" # Check if the user exists on the system - then - echo "Remove the user $1" >&2 - sudo userdel $1 - else - echo "The user $1 was not found" >&2 - fi -} - -# Substitute/replace a string by another in a file -# -# usage: ynh_replace_string match_string replace_string target_file -# | arg: match_string - String to be searched and replaced in the file -# | arg: replace_string - String that will replace matches -# | arg: target_file - File in which the string will be replaced. -ynh_replace_string () { - delimit=@ - match_string=${1//${delimit}/"\\${delimit}"} # Escape the delimiter if it's in the string. - replace_string=${2//${delimit}/"\\${delimit}"} - workfile=$3 - - sudo sed --in-place "s${delimit}${match_string}${delimit}${replace_string}${delimit}g" "$workfile" -} - -# Remove a file or a directory securely -# -# usage: ynh_secure_remove path_to_remove -# | arg: path_to_remove - File or directory to remove -ynh_secure_remove () { - path_to_remove=$1 - forbidden_path=" \ - /var/www \ - /home/yunohost.app" - - if [[ "$forbidden_path" =~ "$path_to_remove" \ - # Match all paths or subpaths in $forbidden_path - || "$path_to_remove" =~ ^/[[:alnum:]]+$ \ - # Match all first level paths from / (Like /var, /root, etc...) - || "${path_to_remove:${#path_to_remove}-1}" = "/" ]] - # Match if the path finishes by /. Because it seems there is an empty variable - then - echo "Avoid deleting $path_to_remove." >&2 - else - if [ -e "$path_to_remove" ] - then - sudo rm -R "$path_to_remove" - else - echo "$path_to_remove wasn't deleted because it doesn't exist." >&2 - fi - fi -} - -# Check availability of a web path -# -# example: ynh_webpath_available some.domain.tld /coffee -# -# usage: ynh_webpath_available domain path -# | arg: domain - the domain/host of the url -# | arg: path - the web path to check the availability of -ynh_webpath_available () { - local domain=$1 - local path=$2 - sudo yunohost domain url-available $domain $path -} - -# Register/book a web path for an app -# -# example: ynh_webpath_register wordpress some.domain.tld /coffee -# -# usage: ynh_webpath_register app domain path -# | arg: app - the app for which the domain should be registered -# | arg: domain - the domain/host of the web path -# | arg: path - the web path to be registered -ynh_webpath_register () { - local app=$1 - local domain=$2 - local path=$3 - sudo yunohost app register-url $app $domain $path -} - -# Calculate and store a file checksum into the app settings -# -# $app should be defined when calling this helper -# -# usage: ynh_store_file_checksum file -# | arg: file - The file on which the checksum will performed, then stored. -ynh_store_file_checksum () { - local checksum_setting_name=checksum_${1//[\/ ]/_} # Replace all '/' and ' ' by '_' - ynh_app_setting_set $app $checksum_setting_name $(sudo md5sum "$1" | cut -d' ' -f1) -} - -# Verify the checksum and backup the file if it's different -# This helper is primarily meant to allow to easily backup personalised/manually -# modified config files. -# -# $app should be defined when calling this helper -# -# usage: ynh_backup_if_checksum_is_different file -# | arg: file - The file on which the checksum test will be perfomed. -# -# | ret: Return the name a the backup file, or nothing -ynh_backup_if_checksum_is_different () { - local file=$1 - local checksum_setting_name=checksum_${file//[\/ ]/_} # Replace all '/' and ' ' by '_' - local checksum_value=$(ynh_app_setting_get $app $checksum_setting_name) - if [ -n "$checksum_value" ] - then # Proceed only if a value was stored into the app settings - if ! echo "$checksum_value $file" | sudo md5sum -c --status - then # If the checksum is now different - backup_file="/home/yunohost.conf/backup/$file.backup.$(date '+%Y%m%d.%H%M%S')" - sudo mkdir -p "$(dirname "$backup_file")" - sudo cp -a "$file" "$backup_file" # Backup the current file - echo "File $file has been manually modified since the installation or last upgrade. So it has been duplicated in $backup_file" >&2 - echo "$backup_file" # Return the name of the backup file - fi - fi -} diff --git a/scripts/backup b/scripts/backup index 8662c9d..6fba36d 100644 --- a/scripts/backup +++ b/scripts/backup @@ -14,9 +14,9 @@ set -eu #================================================= if [ ! -e _common.sh ]; then - # Rapatrie le fichier de fonctions si il n'est pas dans le dossier courant - sudo cp ../settings/scripts/_common.sh ./_common.sh - sudo chmod a+rx _common.sh + # 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 /usr/share/yunohost/helpers @@ -35,7 +35,7 @@ domain=$(ynh_app_setting_get $app domain) # BACKUP OF THE NGINX CONFIGURATION #================================================= -ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" "${YNH_APP_BACKUP_DIR}/etc/nginx/conf.d/$domain.d/$app.conf" +ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # SPECIFIC BACKUP @@ -43,23 +43,22 @@ ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" "${YNH_APP_BACKUP_DIR}/etc/ng # BACKUP TRANSMISSION CONFIGURATION #================================================= -ynh_backup "/etc/transmission-daemon/settings.json" "${YNH_APP_BACKUP_DIR}/etc/transmission-daemon/settings.json" +ynh_backup "/etc/transmission-daemon/settings.json" #================================================= # BACKUP DATA #================================================= -CHECK_SIZE "/usr/share/transmission" -ynh_backup "/usr/share/transmission" "${YNH_APP_BACKUP_DIR}/usr/share/transmission" +ynh_backup "/usr/share/transmission" -CHECK_SIZE "/var/lib/transmission-daemon" -ynh_backup "/var/lib/transmission-daemon" "${YNH_APP_BACKUP_DIR}/var/lib/transmission-daemon" +ynh_backup "/var/lib/transmission-daemon" backup_core_only=$(ynh_app_setting_get $app backup_core_only) -if [ -z $backup_core_only ] # Si backup_core_only a une valeur dans le fichier settings.yml, ne sauvegarde pas le dossier data +# If backup_core_only have a value in settings.yml, do not backup the data directory +if [ -z $backup_core_only ] then CHECK_SIZE "/home/yunohost.transmission" - ynh_backup "/home/yunohost.transmission" "${YNH_APP_BACKUP_DIR}/home/yunohost.transmission" + ynh_backup "/home/yunohost.transmission" else echo "Data dir will not saved, because backup_core_only is set." >&2 fi diff --git a/scripts/install b/scripts/install index 960253d..3cfff11 100644 --- a/scripts/install +++ b/scripts/install @@ -13,7 +13,8 @@ source /usr/share/yunohost/helpers # MANAGE FAILURE OF THE SCRIPT #================================================= -ynh_abort_if_errors # Active trap pour arrêter le script si une erreur est détectée. +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors #================================================= # RETRIEVE ARGUMENTS FROM THE MANIFEST @@ -28,8 +29,13 @@ app=$YNH_APP_INSTANCE_NAME # CHECK IF THE APP CAN BE INSTALLED WITH THIS ARGS #================================================= -path_url=$(ynh_normalize_url_path $path_url) # Vérifie et corrige la syntaxe du path. -CHECK_DOMAINPATH # Vérifie la disponibilité du path et du domaine. +# Normalize the url path syntax +path_url=$(ynh_normalize_url_path $path_url) + +# Check web path availability +ynh_webpath_available $domain $path_url +# Register (book) web path +ynh_webpath_register $app $domain $path_url #================================================= # STORE SETTINGS FROM MANIFEST @@ -44,14 +50,16 @@ ynh_app_setting_set $app path $path_url # FIND AND OPEN PORTS #================================================= -port=$(ynh_find_port 9091) # Cherche un port libre. -# Ouvre le port dans le firewall -ALL_QUIET sudo yunohost firewall allow --no-upnp TCP $port +# Find a free port +port=$(ynh_find_port 9091) +# Open this port +yunohost firewall allow --no-upnp TCP $port >/dev/null 2>&1 ynh_app_setting_set $app port $port -peer_port=$(ynh_find_port 51413) # Cherche un port libre. -# Ouvre le port dans le firewall -ALL_QUIET sudo yunohost firewall allow TCP $peer_port +# Find a free port +peer_port=$(ynh_find_port 51413) +# Open this port +yunohost firewall allow TCP $peer_port >/dev/null 2>&1 ynh_app_setting_set $app peer_port $peer_port #================================================= @@ -67,7 +75,7 @@ ynh_package_install transmission-daemon # Add a "/" at the end of path_url for next commands # To avoid a double / in the nginx config file. [ "$path_url" = "/" ] || path_url=${path_url}/ -ynh_nginx_config +ynh_add_nginx_config #================================================= # SPECIFIC SETUP @@ -75,23 +83,23 @@ ynh_nginx_config # CREATE DIRECTORIES #================================================= -sudo mkdir -p /home/yunohost.transmission/{progress,completed,watched} +mkdir -p /home/yunohost.transmission/{progress,completed,watched} #================================================= # SECURING FILES AND DIRECTORIES #================================================= -sudo chown -R debian-transmission:www-data /home/yunohost.transmission/ -sudo chown -R debian-transmission: /home/yunohost.transmission/{progress,watched} -sudo chmod -R 764 /home/yunohost.transmission -sudo chmod -R 777 /home/yunohost.transmission/watched +chown -R debian-transmission:www-data /home/yunohost.transmission/ +chown -R debian-transmission: /home/yunohost.transmission/{progress,watched} +chmod -R 764 /home/yunohost.transmission +chmod -R 777 /home/yunohost.transmission/watched #================================================= # CONFIGURE TRANSMISSION #================================================= # Transmission has to be stopped before modifying its config -sudo systemctl stop transmission-daemon +systemctl stop transmission-daemon # Create a RPC password rpcpassword=$(ynh_string_random) @@ -101,7 +109,7 @@ ynh_replace_string "__RPC_PASSWORD_TO_CHANGE__" "$rpcpassword" ../conf/settings. ynh_replace_string "__PATH__" "$path_url" ../conf/settings.json ynh_replace_string "__PEER_PORT__" "$peer_port" ../conf/settings.json ynh_replace_string "__PORT__" "$port" ../conf/settings.json -sudo cp ../conf/settings.json /etc/transmission-daemon/settings.json +cp ../conf/settings.json /etc/transmission-daemon/settings.json #================================================= # STORE THE CHECKSUM OF THE CONFIG FILE @@ -125,8 +133,8 @@ ynh_multimedia_addfolder "/home/yunohost.transmission/watched" "share/Torrent to # PATCH SOURCE TO ADD A DOWNLOAD BUTTON #================================================= -sudo cp ../sources/extra_files/app/toolbar-downloads.png /usr/share/transmission/web/style/transmission/images/toolbar-downloads.png -sudo bash -c 'cat ../sources/extra_files/app/ynh_common.css >> /usr/share/transmission/web/style/transmission/common.css' +cp ../sources/extra_files/app/toolbar-downloads.png /usr/share/transmission/web/style/transmission/images/toolbar-downloads.png +cat ../sources/extra_files/app/ynh_common.css >> /usr/share/transmission/web/style/transmission/common.css ynh_replace_string "
" "" /usr/share/transmission/web/index.html #================================================= @@ -135,16 +143,16 @@ ynh_replace_string "