diff --git a/README.md b/README.md index 591da96..b8ab79f 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,8 @@ Use the file `/etc/radicale/config` to change the main configuration of radicale The file `/etc/radicale/logging` to change the level of logging. And the file `/etc/radicale/rights` to edit the way the calendars will be sharing. +InfCloud has its own config file, at /var/www/radicale/infcloud/config.js + ## Documentation * Official documentation: https://github.com/Kozea/Radicale/blob/website/pages/user_documentation.rst diff --git a/README_fr.md b/README_fr.md index dbb58c6..70720eb 100644 --- a/README_fr.md +++ b/README_fr.md @@ -23,6 +23,8 @@ Utilisez le fichier `/etc/radicale/config` pour modifier la configuration princi Le fichier `/etc/radicale/logging` pour changer le niveau de journalisation. Et le fichier `/etc/radicale/rights` pour éditer la façon dont les calendriers seront partagés. +InfCloud a son propre fichier de config, à /var/www/radicale/infcloud/config.js + ## Documentation * Official documentation: https://github.com/Kozea/Radicale/blob/website/pages/user_documentation.rst diff --git a/manifest.json b/manifest.json index baa12c6..51aa359 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "CalDAV (calendar) and CardDAV (contact) synchronization server", "fr": "Serveur de synchronisation CalDAV et CardDAV" }, - "version": "1.1.6", + "version": "1.1.6~ynh1", "url": "http://radicale.org", "license": "GPL-3.0,AGPL-3.0", "maintainer": { diff --git a/scripts/_common.sh b/scripts/_common.sh index cac8bd1..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 @@ -234,6 +208,344 @@ 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 ============ diff --git a/scripts/install b/scripts/install index c908a1a..266529b 100755 --- a/scripts/install +++ b/scripts/install @@ -29,8 +29,7 @@ language=$YNH_APP_ARG_LANGUAGE app=$YNH_APP_INSTANCE_NAME -version=$(grep '\"version\": ' ../manifest.json | cut -d '"' -f 4) # Retrieve the version number in the manifest file. - +version=$(grep '\"version\": ' ../manifest.json | cut -d '"' -f 4 | cut -d '~' -f 1) # Retrieve the version number in the manifest file. #================================================= # CHECK IF THE APP CAN BE INSTALLED WITH THIS ARGS @@ -96,6 +95,7 @@ ynh_system_user_create $app # Créer un utilisateur système dédié à l'app # Init virtualenv virtualenv /opt/yunohost/$app +version=$(ynh_app_setting_get $app version $version) /opt/yunohost/$app/bin/pip install radicale==$version python-ldap #================================================= @@ -270,3 +270,24 @@ fi #================================================= systemctl reload nginx + +#================================================= +# SEND A README FOR THE ADMIN +#================================================= + +if [ $infcloud -eq 1 ] +then + infcloud_config=" +InfCloud has its own config file, at $final_path/infcloud/config.js +" +else + infcloud_config="" +fi + +message="Use the file /etc/radicale/config to change the main configuration of radicale. +The file /etc/radicale/logging to change the level of logging. +And the file /etc/radicale/rights to edit the way the calendars will be sharing. +$infcloud_config +If you facing an issue or want to improve this app, please open a new issue in this project: https://github.com/YunoHost-Apps/radicale_ynh" + +ynh_send_readme_to_admin "$message" "$admin" diff --git a/scripts/remove b/scripts/remove index e210a75..30203de 100644 --- a/scripts/remove +++ b/scripts/remove @@ -81,7 +81,7 @@ then else if yunohost service status | grep -q uwsgi # Test l'existence du service dans Yunohost then - echo "Remove uwsgi service" + ynh_print_info "Remove uwsgi service" >&2 yunohost service remove uwsgi fi fi diff --git a/scripts/restore b/scripts/restore index faffd34..518e9ce 100644 --- a/scripts/restore +++ b/scripts/restore @@ -38,7 +38,7 @@ path_url=$(ynh_app_setting_get $app path) # 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 " @@ -127,3 +127,24 @@ ynh_restore_file "/etc/logrotate.d/$app" systemctl restart uwsgi systemctl reload nginx + +#================================================= +# SEND A README FOR THE ADMIN +#================================================= + +if [ $infcloud -eq 1 ] +then + infcloud_config=" +InfCloud has its own config file, at $final_path/infcloud/config.js +" +else + infcloud_config="" +fi + +message="Use the file /etc/radicale/config to change the main configuration of radicale. +The file /etc/radicale/logging to change the level of logging. +And the file /etc/radicale/rights to edit the way the calendars will be sharing. +$infcloud_config +If you facing an issue or want to improve this app, please open a new issue in this project: https://github.com/YunoHost-Apps/radicale_ynh" + +ynh_send_readme_to_admin "$message" "$admin" diff --git a/scripts/upgrade b/scripts/upgrade index 932cf6a..1198d3f 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -23,6 +23,12 @@ language=$(ynh_app_setting_get $app language) final_path=$(ynh_app_setting_get $app final_path) version=$(ynh_app_setting_get $app version) +#================================================= +# CHECK VERSION +#================================================= + +ynh_abort_if_up_to_date + #================================================= # FIX OLD THINGS #================================================= @@ -37,7 +43,7 @@ fi if [ -z "$version" ] then - version=$(grep '\"version\": ' ../manifest.json | cut -d '"' -f 4) # Retrieve the version number in the manifest file. + version=$(grep '\"version\": ' ../manifest.json | cut -d '"' -f 4 | cut -d '~' -f 1) # Retrieve the version number in the manifest file. ynh_app_setting_set $app version "$version" fi @@ -115,6 +121,7 @@ fi # Upgrade pip packages ynh_secure_remove /opt/yunohost/$app virtualenv /opt/yunohost/$app +version=$(ynh_app_setting_get $app version $version) bash -c "source /opt/yunohost/radicale/bin/activate && pip install radicale==$version python-ldap" #=================================================