From a11a88dfbf28bdb0b044771749beba34f72826db Mon Sep 17 00:00:00 2001 From: Maniack Crudelis Date: Sat, 5 Aug 2017 23:16:02 +0200 Subject: [PATCH] =?UTF-8?q?Refactoring=20et=20upgrade=202.1.26-final=20L'u?= =?UTF-8?q?pgrade=20depuis=20la=20pr=C3=A9c=C3=A9dente=20version=20a=20?= =?UTF-8?q?=C3=A9t=C3=A9=20test=C3=A9,=20mais=20une=20sauvegarde=20pr?= =?UTF-8?q?=C3=A9alable=20n'est=20pas=20inutile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 17 +- check_process | 25 ++- conf/app.src | 6 + conf/nginx.conf | 2 +- conf/php-fpm.conf | 2 +- conf/populate.sql | 14 +- manifest.json | 6 +- scripts/.fonctions | 213 ------------------------- scripts/_common.sh | 379 +++++++++++++++++++++++++++++++++++++++++++++ scripts/backup | 82 +++++++--- scripts/install | 156 +++++++++++++------ scripts/remove | 65 +++++--- scripts/restore | 127 ++++++++++----- scripts/upgrade | 110 ++++++++----- 14 files changed, 802 insertions(+), 402 deletions(-) create mode 100644 conf/app.src delete mode 100755 scripts/.fonctions create mode 100755 scripts/_common.sh diff --git a/README.md b/README.md index fb37bd4..e1500c7 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,7 @@ Gestionnaire de mot de passe collaboratif. http://www.teampass.net -Le script installe le paquet *php5-cli*. - -Teampass peut-être configuré uniquement via le compte administrateur. Pour cela il faut s'identifier avec admin et le mot de passe choisi à l'installation. +Teampass peut être configuré uniquement via le compte administrateur. Pour cela il faut s'identifier avec admin et le mot de passe choisi à l'installation. Pour utiliser la fonction de sauvegarde automatique, il est nécessaire de mettre en place un cron contenant ceci dans /etc/cron.d/teampass: ```0 0 * * * www-data cd /var/www/teampass/backups && php script.backup.php``` @@ -20,9 +18,16 @@ Pour utiliser la fonction de sauvegarde automatique, il est nécessaire de mettr sudo yunohost app upgrade teampass -u https://github.com/YunoHost-Apps/teampass_ynh **Multi-utilisateur:** Oui, avec support ldap. -> *Depuis la dernière mise à jour, 2.1.26-3, le support ldap est cassé. Mais des corrections de bug justifient un changement de version.* + +**Voir l'état du package:** +~*[Dernier rapport hebdomadaire](https://forum.yunohost.org/t/rapport-hebdomadaire-dintegration-continue/2297)*~ +~*[Dernier test d'intégration continue](https://ci-apps.yunohost.org/jenkins/job/teampass%20%28Community%29/lastBuild/consoleFull)*~ + +--- + +> *Depuis la mise à jour 2.1.26-3, le support ldap est cassé. Mais des corrections de bug justifient un changement de version.* *Les utilisateurs sont dans la base de données de teampass, mais le mot est généré aléatoirement et devra être réinitialisé pour chaque utilisateur souhaitant utiliser l'application* *Pour la première connexion, utiliser l'accès admin, avec le login 'admin' et le mot de passe renseigné à l'installation.* -*Bon les mails ne fonctionne pas non plus, donc impossible d'utiliser la fonction 'Mot de passe oublié'.* -*Je pense que Teampass n'est toujours pas prêt... Le sera-t-il un jour?* \ No newline at end of file +> *les mails ne fonctionne pas non plus, donc impossible d'utiliser la fonction 'Mot de passe oublié'.* +*Je pense que Teampass n'est toujours pas prêt... Le sera-t-il un jour ...?* diff --git a/check_process b/check_process index ce84db7..bbbd452 100644 --- a/check_process +++ b/check_process @@ -1,9 +1,8 @@ ;; Test complet - auto_remove=1 ; Manifest domain="domain.tld" (DOMAIN) path="/path" (PATH) - password="pass" (PASSWORD) + password="pass" ; Checks pkg_linter=1 setup_sub_dir=1 @@ -14,10 +13,22 @@ upgrade=1 backup_restore=1 multi_instance=0 - wrong_user=0 - wrong_path=1 incorrect_path=1 - corrupt_source=0 - fail_download_source=0 port_already_use=0 - final_path_already_use=0 + change_url=0 +;;; Levels + Level 1=auto + Level 2=auto + Level 3=auto +# Level 4: + Level 4=0 +# Level 5: + Level 5=auto + Level 6=auto + Level 7=auto + Level 8=0 + Level 9=0 + Level 10=0 +;;; Options +Email=maniackc_dev@crudelis.fr +Notification=down diff --git a/conf/app.src b/conf/app.src new file mode 100644 index 0000000..d610f7f --- /dev/null +++ b/conf/app.src @@ -0,0 +1,6 @@ +SOURCE_URL=https://github.com/nilsteampassnet/TeamPass/archive/2.1.26-final-3.tar.gz +SOURCE_SUM=ab57589c20e86c4e684b96241c6e73f4 +SOURCE_SUM_PRG=md5sum +SOURCE_FORMAT=tar.gz +SOURCE_IN_SUBDIR=true +SOURCE_FILENAME= diff --git a/conf/nginx.conf b/conf/nginx.conf index a7cf3d3..0a76272 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -8,7 +8,7 @@ location __PATH__ { try_files $uri $uri/ index.php; location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$; - fastcgi_pass unix:/var/run/php5-fpm-__NAMETOCHANGE__.sock; + fastcgi_pass unix:/var/run/php5-fpm-__NAME__.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param REMOTE_USER $remote_user; diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf index 1f178f7..6c69660 100644 --- a/conf/php-fpm.conf +++ b/conf/php-fpm.conf @@ -101,7 +101,7 @@ pm.max_children = 10 ; The number of child processes created on startup. ; Note: Used only when pm is set to 'dynamic' ; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 -pm.start_servers = 1 +pm.start_servers = 2 ; The desired minimum number of idle server processes. ; Note: Used only when pm is set to 'dynamic' diff --git a/conf/populate.sql b/conf/populate.sql index f1a4597..9ace1b6 100644 --- a/conf/populate.sql +++ b/conf/populate.sql @@ -72,7 +72,8 @@ INSERT INTO `teampass_misc` (`type`, `intitule`, `valeur`) VALUES ('admin','enable_sts','0'), ('admin','encryptClientServer','1'), ('admin','cpassman_version','__VERSION__'), --- ('admin','ldap_mode','1'), -- ldap est cassé sur la version 2.1.26-3 +-- ('admin','ldap_mode','1'), +-- ldap ne fonctionne plus sur cette version de teampass... ('admin','ldap_mode','0'), ('admin','ldap_type','posix-search'), ('admin','ldap_suffix','0'), @@ -141,18 +142,11 @@ INSERT INTO `teampass_misc` (`type`, `intitule`, `valeur`) VALUES ('admin','show_only_accessible_folders','1'), ('admin','enable_suggestion','0'), ('admin','otv_expiration_period','7'), --- ('admin', 'timezone', '__TIMEZONE__'), --- ('admin', 'can_create_root_folder', '1'), --- ('admin', 'settings_offline_mode', '1'), --- ('admin', 'offline_key_level', '50'), ('admin','default_session_expiration_time','60'), -('admin','bck_script_path','__FINALPATH__/backups/'), --- ('complex','1','0'), --- ('admin', 'menu_type', 'context'), ('admin', 'duo', '0'), --- ('update', 'encrypt_pw_in_log_items', '1'); ('admin','enable_server_password_change','0'), ('admin','ldap_object_class','0'), +('admin','bck_script_path','__FINALPATH__/backups/'), ('admin','bck_script_filename', 'bck_cpassman'), ('admin','syslog_enable','0'), ('admin','syslog_host','localhost'), @@ -178,7 +172,7 @@ CREATE TABLE IF NOT EXISTS `teampass_nested_tree` ( KEY `personal_folder_idx` (`personal_folder`) ) CHARSET=utf8; -INSERT INTO teampass_nested_tree VALUES("1","0","__FOLDERS__","1","2","1","0","0","0","0"); +-- INSERT INTO teampass_nested_tree VALUES("1","0","__FOLDERS__","1","2","1","0","0","0","0"); CREATE TABLE IF NOT EXISTS `teampass_rights` ( `id` int(12) NOT null AUTO_INCREMENT, diff --git a/manifest.json b/manifest.json index 48b2340..93eee44 100644 --- a/manifest.json +++ b/manifest.json @@ -3,15 +3,15 @@ "id": "teampass", "packaging_format": 1, "requirements": { - "yunohost": ">= 2.4" + "yunohost": ">= 2.6.4" }, "description": { "en": "Passwords Manager", "fr": "Gestionnaire de mots de passes." }, - "version": "2.1.26-3", + "version": "2.1.26-final-3", "url": "http://www.teampass.net", - "license": "free", + "license": "AGPL-3.0", "maintainer": { "name": "Ackak, Maniack Crudelis et matlink", "email": "ackak_ynh@ackak.net maniackc_dev@crudelis.fr matlink@matlink.fr" diff --git a/scripts/.fonctions b/scripts/.fonctions deleted file mode 100755 index c18e8d3..0000000 --- a/scripts/.fonctions +++ /dev/null @@ -1,213 +0,0 @@ -#!/bin/bash - -CHECK_VAR () { # Vérifie que la variable n'est pas vide. -# $1 = Variable à vérifier -# $2 = Texte à afficher en cas d'erreur - test -n "$1" || (echo "$2" >&2 && false) -} - -EXIT_PROPERLY () { # Provoque l'arrêt du script en cas d'erreur. Et nettoye les résidus. - exit_code=$? - if [ "$exit_code" -eq 0 ]; then - exit 0 # Quitte sans erreur si le script se termine correctement. - fi - trap '' EXIT - set +eu - echo -e "\e[91m \e[1m" # Shell in light red bold - echo -e "!!\n $app install's script has encountered an error. Installation was cancelled.\n!!" >&2 - - if type -t CLEAN_SETUP > /dev/null; then # Vérifie l'existance de la fonction avant de l'exécuter. - CLEAN_SETUP # Appel la fonction de nettoyage spécifique du script install. - fi - - # Compense le bug de ssowat qui ne supprime pas l'entrée de l'app en cas d'erreur d'installation. - sudo sed -i "\@\"$domain$path/\":@d" /etc/ssowat/conf.json - - ynh_die -} - -TRAP_ON () { # Activate signal capture - set -eu # Exit if a command fail, and if a variable is used unset. - trap EXIT_PROPERLY EXIT # Capturing exit signals on shell script -} - -CHECK_USER () { # Vérifie la validité de l'user admin -# $1 = Variable de l'user admin. - ynh_user_exists "$1" || (echo "Wrong admin" >&2 && false) -} - -CHECK_PATH () { # Vérifie la présence du / en début de path. Et son absence à la fin. - if [ "${path:0:1}" != "/" ]; then # Si le premier caractère n'est pas un / - path="/$path" # Ajoute un / en début de path - fi - if [ "${path:${#path}-1}" == "/" ] && [ ${#path} -gt 1 ]; then # Si le dernier caractère est un / et que ce n'est pas le seul caractère. - path="${path:0:${#path}-1}" # Supprime le dernier caractère - fi -} - -CHECK_DOMAINPATH () { # Vérifie la disponibilité du path et du domaine. - sudo yunohost app checkurl $domain$path -a $app -} - -CHECK_FINALPATH () { # Vérifie que le dossier de destination n'est pas déjà utilisé. - final_path=/var/www/$app - if [ -e "$final_path" ] - then - echo "This path already contains a folder" >&2 - false - fi -} - -GENERATE_DB () { # Créer une base de données et un utilisateur dédié au nom de l'app. -# $1 = Nom de la base de donnée - db_user=$1 - db_user=${db_user//-/_} # mariadb ne supporte pas les - dans les noms de base de données. Ils sont donc remplacé par des _ - # Génère un mot de passe aléatoire. -# db_pwd=$(head -n20 /dev/urandom | tr -c -d 'A-Za-z0-9' | head -c20) - db_pwd=$(ynh_string_random) - CHECK_VAR "$db_pwd" "db_pwd empty" - # Utilise '$app' comme nom d'utilisateur et de base de donnée - # Initialise la base de donnée et stocke le mot de passe mysql. - ynh_mysql_create_db "$db_user" "$db_user" $db_pwd - ynh_app_setting_set $app mysqlpwd $db_pwd -} - -SETUP_SOURCE () { # Télécharge la source, décompresse et copie dans $final_path -# $1 = Nom de l'archive téléchargée. - wget -nv -i ../sources/source_url -O $1 - # Vérifie la somme de contrôle de la source téléchargée. - md5sum -c ../sources/source_md5 --status || (echo "Corrupt source" >&2 && false) - # Décompresse la source - if [ "$(echo ${1##*.})" == "gz" ]; then - tar -x -f $1 - elif [ "$(echo ${1##*.})" == "zip" ]; then - unzip -q $1 - else - false # Format d'archive non pris en charge. - fi - # Copie les fichiers sources - sudo cp -a $(cat ../sources/source_dir)/. "$final_path" - # Copie les fichiers additionnels ou modifiés. - if test -e "../sources/ajouts"; then - sudo cp -a ../sources/ajouts/. "$final_path" - fi -} - -ADD_SYS_USER () { # Créer un utilisateur système dédié à l'app - if ! ynh_system_user_exists "$app" # Test l'existence de l'utilisateur - then - sudo useradd -d /var/www/$app --system --user-group $app --shell /usr/sbin/nologin || (echo "Unable to create $app system account" >&2 && false) - fi -} - -POOL_FPM () { # Créer le fichier de configuration du pool php-fpm et le configure. - sed -i "s@__NAMETOCHANGE__@$app@g" ../conf/php-fpm.conf - sed -i "s@__FINALPATH__@$final_path@g" ../conf/php-fpm.conf - sed -i "s@__USER__@$app@g" ../conf/php-fpm.conf - finalphpconf=/etc/php5/fpm/pool.d/$app.conf - sudo cp ../conf/php-fpm.conf $finalphpconf - sudo chown root: $finalphpconf - finalphpini=/etc/php5/fpm/conf.d/20-$app.ini - sudo cp ../conf/php-fpm.ini $finalphpini - sudo chown root: $finalphpini - sudo service php5-fpm reload -} - -STORE_MD5_CONFIG () { # Enregistre la somme de contrôle du fichier de config -# $1 = Nom du fichier de conf pour le stockage dans settings.yml -# $2 = Nom complet et chemin du fichier de conf. - ynh_app_setting_set $app $1_file_md5 $(sudo md5sum "$2" | cut -d' ' -f1) -} - -CHECK_MD5_CONFIG () { # Créé un backup du fichier de config si il a été modifié. -# $1 = Nom du fichier de conf pour le stockage dans settings.yml -# $2 = Nom complet et chemin du fichier de conf. - if [ "$(ynh_app_setting_get $app $1_file_md5)" != $(sudo md5sum "$2" | cut -d' ' -f1) ]; then - sudo cp -a "$2" "$2.backup.$(date '+%d.%m.%y_%Hh%M,%Ss')" # Si le fichier de config a été modifié, créer un backup. - fi -} - -FIND_PORT () { # Cherche un port libre. -# $1 = Numéro de port pour débuter la recherche. - port=$1 - while ! sudo yunohost app checkport $port ; do - port=$((port+1)) - done - CHECK_VAR "$port" "port empty" -} - - -### REMOVE SCRIPT - -REMOVE_NGINX_CONF () { # Suppression de la configuration nginx - if [ -e "/etc/nginx/conf.d/$domain.d/$app.conf" ]; then # Delete nginx config - echo "Delete nginx config" - sudo rm "/etc/nginx/conf.d/$domain.d/$app.conf" - sudo service nginx reload - fi -} - -REMOVE_FPM_CONF () { # Suppression de la configuration du pool php-fpm - if [ -e "/etc/php5/fpm/pool.d/$app.conf" ]; then # Delete fpm config - echo "Delete fpm config" - sudo rm "/etc/php5/fpm/pool.d/$app.conf" - fi - if [ -e "/etc/php5/fpm/conf.d/20-$app.ini" ]; then # Delete php config - echo "Delete php config" - sudo rm "/etc/php5/fpm/conf.d/20-$app.ini" - fi - sudo service php5-fpm reload -} - -REMOVE_LOGROTATE_CONF () { # Suppression de la configuration de logrotate - if [ -e "/etc/logrotate.d/$app" ]; then - echo "Delete logrotate config" - sudo rm "/etc/logrotate.d/$app" - fi -} - -SECURE_REMOVE () { # Suppression de dossier avec vérification des variables - chaine="$1" # L'argument doit être donné entre quotes simple '', pour éviter d'interpréter les variables. - no_var=0 - while (echo "$chaine" | grep -q '\$') # Boucle tant qu'il y a des $ dans la chaine - do - no_var=1 - global_var=$(echo "$chaine" | cut -d '$' -f 2) # Isole la première variable trouvée. - only_var=\$$(expr "$global_var" : '\([A-Za-z0-9_]*\)') # Isole complètement la variable en ajoutant le $ au début et en gardant uniquement le nom de la variable. Se débarrasse surtout du / et d'un éventuel chemin derrière. - real_var=$(eval "echo ${only_var}") # `eval "echo ${var}` permet d'interpréter une variable contenue dans une variable. - if test -z "$real_var" || [ "$real_var" = "/" ]; then - echo "Variable $only_var is empty, suppression of $chaine cancelled." >&2 - return 1 - fi - chaine=$(echo "$chaine" | sed "s@$only_var@$real_var@") # remplace la variable par sa valeur dans la chaine. - done - if [ "$no_var" -eq 1 ] - then - if [ -e "$chaine" ]; then - echo "Delete directory $chaine" - sudo rm -r "$chaine" - fi - return 0 - else - echo "No detected variable." >&2 - return 1 - fi -} - -REMOVE_BDD () { # Suppression de la base de donnée et de l'utilisateur associé. -# $1 = Nom de la base de donnée - # Utilise '$app' comme nom d'utilisateur et de base de donnée - db_user=$1 - if mysqlshow -u root -p$(sudo cat $MYSQL_ROOT_PWD_FILE) | grep -q "^| $db_user"; then - echo "Delete db" - ynh_mysql_drop_db $db_user - ynh_mysql_drop_user $db_user - fi -} - -REMOVE_SYS_USER () { # Supprime l'utilisateur système dédié à l'app - if ynh_system_user_exists "$app" # Test l'existence de l'utilisateur - then - sudo userdel $app - fi -} diff --git a/scripts/_common.sh b/scripts/_common.sh new file mode 100755 index 0000000..13045f0 --- /dev/null +++ b/scripts/_common.sh @@ -0,0 +1,379 @@ +#!/bin/bash + +# ============================================================================= +# YUNOHOST 2.7 FORTHCOMING HELPERS +# ============================================================================= + +# Create a dedicated nginx config +# +# usage: ynh_add_nginx_config +ynh_add_nginx_config () { + finalnginxconf="/etc/nginx/conf.d/$domain.d/$app.conf" + ynh_backup_if_checksum_is_different "$finalnginxconf" + 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 +} + +# Remove the dedicated nginx config +# +# usage: ynh_remove_nginx_config +ynh_remove_nginx_config () { + ynh_secure_remove "/etc/nginx/conf.d/$domain.d/$app.conf" + sudo systemctl reload nginx +} + +# Create a dedicated php-fpm config +# +# usage: ynh_add_fpm_config +ynh_add_fpm_config () { + finalphpconf="/etc/php5/fpm/pool.d/$app.conf" + ynh_backup_if_checksum_is_different "$finalphpconf" + sudo cp ../conf/php-fpm.conf "$finalphpconf" + ynh_replace_string "__NAMETOCHANGE__" "$app" "$finalphpconf" + ynh_replace_string "__FINALPATH__" "$final_path" "$finalphpconf" + ynh_replace_string "__USER__" "$app" "$finalphpconf" + sudo chown root: "$finalphpconf" + ynh_store_file_checksum "$finalphpconf" + + if [ -e "../conf/php-fpm.ini" ] + then + finalphpini="/etc/php5/fpm/conf.d/20-$app.ini" + ynh_backup_if_checksum_is_different "$finalphpini" + sudo cp ../conf/php-fpm.ini "$finalphpini" + sudo chown root: "$finalphpini" + ynh_store_file_checksum "$finalphpini" + fi + + sudo systemctl reload php5-fpm +} + +# Remove the dedicated php-fpm config +# +# usage: ynh_remove_fpm_config +ynh_remove_fpm_config () { + ynh_secure_remove "/etc/php5/fpm/pool.d/$app.conf" + ynh_secure_remove "/etc/php5/fpm/conf.d/20-$app.ini" 2>&1 + sudo systemctl reload php5-fpm +} + +# Create a dedicated systemd config +# +# usage: ynh_add_systemd_config +ynh_add_systemd_config () { + finalsystemdconf="/etc/systemd/system/$app.service" + ynh_backup_if_checksum_is_different "$finalsystemdconf" + sudo cp ../conf/systemd.service "$finalsystemdconf" + + # 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 "${final_path:-}"; then + ynh_replace_string "__FINALPATH__" "$final_path" "$finalsystemdconf" + fi + if test -n "${app:-}"; then + ynh_replace_string "__APP__" "$app" "$finalsystemdconf" + fi + ynh_store_file_checksum "$finalsystemdconf" + + sudo chown root: "$finalsystemdconf" + sudo systemctl enable $app + sudo systemctl daemon-reload +} + +# Remove the dedicated systemd config +# +# usage: ynh_remove_systemd_config +ynh_remove_systemd_config () { + finalsystemdconf="/etc/systemd/system/$app.service" + if [ -e "$finalsystemdconf" ]; then + sudo systemctl stop $app + sudo systemctl disable $app + ynh_secure_remove "$finalsystemdconf" + fi +} + +#================================================= +#================================================= + +#================================================= +# CHECKING +#================================================= + +CHECK_DOMAINPATH () { # Vérifie la disponibilité du path et du domaine. + # 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 +} + +CHECK_FINALPATH () { # Vérifie que le dossier de destination n'est pas déjà utilisé. + final_path=/var/www/$app + test ! -e "$final_path" || ynh_die "This path already contains a folder" +} + +#================================================= +# 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 +#================================================= + +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-system $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-system --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 +} + +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) + + 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_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" +} + +#================================================= +# PACKAGE CHECK BYPASSING... +#================================================= + +IS_PACKAGE_CHECK () { # Détermine une exécution en conteneur (Non testé) + return $(uname -n | grep -c 'pchecker_lxc') +} + +#================================================= +# NODEJS +#================================================= + +# INFOS +# n (Node version management) utilise la variable PATH pour stocker le path de la version de node à utiliser. +# C'est ainsi qu'il change de version +# ynh_install_nodejs installe la version de nodejs demandée en argument, avec n +# ynh_use_nodejs active une version de nodejs dans le script courant +# 3 variables sont mises à disposition, et 2 sont stockées dans la config de l'app +# - nodejs_path: Le chemin absolu de cette version de node +# Utilisé pour des appels directs à node. +# - nodejs_version: Simplement le numéro de version de nodejs pour cette application +# - nodejs_use_version: Un alias pour charger une version de node dans le shell courant. +# Utilisé pour démarrer un service ou un script qui utilise node ou npm +# Dans ce cas, c'est $PATH qui contient le chemin de la version de node. Il doit être propagé sur les autres shell si nécessaire. + +n_install_dir="/opt/node_n" +node_version_path="/usr/local/n/versions/node" +ynh_use_nodejs () { + nodejs_version=$(ynh_app_setting_get $app nodejs_version) + + load_n_path="[[ :$PATH: == *\":$n_install_dir/bin:\"* ]] || PATH=\"$n_install_dir/bin:$PATH\"" + + nodejs_use_version="$n_install_dir/bin/n -q $nodejs_version" + + # "Load" a version of node + eval $load_n_path; $nodejs_use_version + + # Get the absolute path of this version of node + nodejs_path="$(n bin $nodejs_version)" + + # Make an alias for node use + ynh_node_exec="eval $load_n_path; n use $nodejs_version" +} + +ynh_install_nodejs () { + # Use n, https://github.com/tj/n to manage the nodejs versions + nodejs_version="$1" + local n_install_script="https://git.io/n-install" + + # Create $n_install_dir + mkdir -p "$n_install_dir" + + # Load n path in PATH + CLEAR_PATH="$n_install_dir/bin:$PATH" + # Remove /usr/local/bin in PATH in case of node has already setup. + PATH=$(echo $CLEAR_PATH | sed 's@/usr/local/bin:@@') + + # Move an existing node binary, to avoid to block n. + test -x /usr/bin/node && mv /usr/bin/node /usr/bin/node_n + test -x /usr/bin/npm && mv /usr/bin/npm /usr/bin/npm_n + + # If n is not previously setup, install it + n --version > /dev/null 2>&1 || \ + ( echo "Installation of N - Node.js version management" >&2; \ + curl -sL $n_install_script | N_PREFIX="$n_install_dir" bash -s -- -y - ) + + # Restore /usr/local/bin in PATH + PATH=$CLEAR_PATH + + # And replace the old node binary. + test -x /usr/bin/node_n && mv /usr/bin/node_n /usr/bin/node + test -x /usr/bin/npm_n && mv /usr/bin/npm_n /usr/bin/npm + + # Install the requested version of nodejs + n $nodejs_version + + # Find the last "real" version for this major version of node. + real_nodejs_version=$(find $node_version_path/$nodejs_version* -maxdepth 0 | sort --version-sort | tail --lines=1) + real_nodejs_version=$(basename $real_nodejs_version) + + # Create a symbolic link for this major version + ln --symbolic --force --no-target-directory $node_version_path/$real_nodejs_version $node_version_path/$nodejs_version + + # Store the ID of this app and the version of node requested for it + echo "$YNH_APP_ID:$nodejs_version" | tee --append "$n_install_dir/ynh_app_version" + + # Store nodejs_version into the config of this app + ynh_app_setting_set $app nodejs_version $nodejs_version + + # Build the update script and set the cronjob + ynh_cron_upgrade_node + + ynh_use_nodejs +} + +ynh_remove_nodejs () { + ynh_use_nodejs + + # Remove the line for this app + sed --in-place "/$YNH_APP_ID:$nodejs_version/d" "$n_install_dir/ynh_app_version" + + # If none another app uses this version of nodejs, remove it. + if ! grep --quiet "$nodejs_version" "$n_install_dir/ynh_app_version" + then + n rm $nodejs_version + fi + + # If none another app uses n, remove n + if [ ! -s "$n_install_dir/ynh_app_version" ] + then + ynh_secure_remove "$n_install_dir" + ynh_secure_remove "/usr/local/n" + sed --in-place "/N_PREFIX/d" /root/.bashrc + fi +} + +ynh_cron_upgrade_node () { + # Build the update script + cat > "$n_install_dir/node_update.sh" << EOF +#!/bin/bash + +version_path="$node_version_path" +n_install_dir="$n_install_dir" + +# Log the date +date + +# List all real installed version of node +all_real_version="\$(find \$version_path/* -maxdepth 0 -type d | sed "s@\$version_path/@@g")" + +# Keep only the major version number of each line +all_real_version=\$(echo "\$all_real_version" | sed 's/\..*\$//') + +# Remove double entries +all_real_version=\$(echo "\$all_real_version" | sort --unique) + +# Read each major version +while read version +do + echo "Update of the version \$version" + sudo \$n_install_dir/bin/n \$version + + # Find the last "real" version for this major version of node. + real_nodejs_version=\$(find \$version_path/\$version* -maxdepth 0 | sort --version-sort | tail --lines=1) + real_nodejs_version=\$(basename \$real_nodejs_version) + + # Update the symbolic link for this version + sudo ln --symbolic --force --no-target-directory \$version_path/\$real_nodejs_version \$version_path/\$version +done <<< "\$(echo "\$all_real_version")" +EOF + + chmod +x "$n_install_dir/node_update.sh" + + # Build the cronjob + cat > "/etc/cron.daily/node_update" << EOF +#!/bin/bash + +$n_install_dir/node_update.sh >> $n_install_dir/node_update.log +EOF + + chmod +x "/etc/cron.daily/node_update" +} diff --git a/scripts/backup b/scripts/backup index f145e39..182d2b2 100644 --- a/scripts/backup +++ b/scripts/backup @@ -1,33 +1,75 @@ #!/bin/bash -# Récupère les infos de l'application. +#================================================= +# GENERIC STARTING +#================================================= +# MANAGE FAILURE OF THE SCRIPT +#================================================= + +# Exit on command errors and treat unset variables as an error +set -eu + +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +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 +fi +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# LOAD SETTINGS +#================================================= + app=$YNH_APP_INSTANCE_NAME -# Source app helpers -source /usr/share/yunohost/helpers final_path=$(ynh_app_setting_get $app final_path) domain=$(ynh_app_setting_get $app domain) +db_name=$(ynh_app_setting_get $app db_name) +#================================================= +# STANDARD BACKUP STEPS +#================================================= +# BACKUP OF THE MAIN DIR OF THE APP +#================================================= -# The parameter $1 is the backup directory location -# which will be compressed afterward -backup_dir=$1/apps/$app -sudo mkdir -p "$backup_dir" +CHECK_SIZE "$final_path" +ynh_backup "$final_path" "${YNH_APP_BACKUP_DIR}$final_path" -# Backup sources & data -sudo cp -a $final_path/. $backup_dir/sources +#================================================= +# BACKUP OF THE NGINX CONFIGURATION +#================================================= -# Copy Nginx and YunoHost parameters to make the script "standalone" -sudo cp -a /etc/yunohost/apps/$app/. $backup_dir/yunohost -sudo cp -a /etc/nginx/conf.d/$domain.d/$app.conf $backup_dir/nginx.conf +ynh_backup "/etc/nginx/conf.d/$domain.d/$app.conf" "${YNH_APP_BACKUP_DIR}/etc/nginx/conf.d/$domain.d/$app.conf" -# Copy dedicated php-fpm process to backup folder -sudo cp -a /etc/php5/fpm/pool.d/$app.conf $backup_dir/php-fpm.conf -sudo cp -a /etc/php5/fpm/conf.d/20-$app.ini $backup_dir/php-fpm.ini +#================================================= +# BACKUP OF THE PHP-FPM CONFIGURATION +#================================================= -# Backup db -root_pwd=$(sudo cat /etc/yunohost/mysql) -sudo mysqldump -u root -p$root_pwd --no-create-db $app --result-file="$backup_dir/db.sql" +ynh_backup "/etc/php5/fpm/pool.d/$app.conf" "${YNH_APP_BACKUP_DIR}/etc/php5/fpm/pool.d/$app.conf" +ynh_backup "/etc/php5/fpm/conf.d/20-$app.ini" "${YNH_APP_BACKUP_DIR}/etc/php5/fpm/conf.d/20-$app.ini" -# Copie du fichier sk.php -sudo cp -a /etc/teampass/sk.php $backup_dir/sk.php +#================================================= +# BACKUP OF THE SQL BDD +#================================================= + +ynh_mysql_dump_db "$db_name" > db.sql +CHECK_SIZE "db.sql" + +#================================================= +# SPECIFIC BACKUP +#================================================= +# BACKUP SK.PHP +#================================================= + +ynh_backup "/etc/teampass/sk.php" "${YNH_APP_BACKUP_DIR}/etc/teampass/sk.php" + +#================================================= +# BACKUP CRON FILE +#================================================= + +ynh_backup "/etc/cron.d/teampass" "${YNH_APP_BACKUP_DIR}/etc/cron.d/teampass" diff --git a/scripts/install b/scripts/install index 438892a..1dbdd64 100644 --- a/scripts/install +++ b/scripts/install @@ -1,59 +1,93 @@ #!/bin/bash -source .fonctions # Charge les fonctions génériques habituellement utilisées dans le script +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= -CLEAN_SETUP () { +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# MANAGE FAILURE OF THE SCRIPT +#================================================= + +ynh_clean_setup () { # Nettoyage des résidus d'installation non pris en charge par le script remove. # Pas de nettoyage supplémentaire nécessaire ici... echo "" } -TRAP_ON # Active trap pour arrêter le script si une erreur est détectée. +ynh_abort_if_errors # Active trap pour arrêter le script si une erreur est détectée. + +#================================================= +# RETRIEVE ARGUMENTS FROM THE MANIFEST +#================================================= domain=$YNH_APP_ARG_DOMAIN -path=$YNH_APP_ARG_PATH +path_url=$YNH_APP_ARG_PATH password_admin=$YNH_APP_ARG_PASSWORD app=$YNH_APP_INSTANCE_NAME -# Source app helpers -source /usr/share/yunohost/helpers +#================================================= +# CHECK IF THE APP CAN BE INSTALLED WITH THIS ARGS +#================================================= -# Vérifie que les variables ne sont pas vides. -CHECK_VAR "$app" "app name not set" - -CHECK_PATH # Vérifie et corrige la syntaxe du path. +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. - CHECK_FINALPATH # Vérifie que le dossier de destination n'est pas déjà utilisé. +#================================================= +# STORE SETTINGS FROM MANIFEST +#================================================= -# Enregistre les infos dans la config YunoHost ynh_app_setting_set $app domain $domain -ynh_app_setting_set $app path $path +ynh_app_setting_set $app path $path_url -GENERATE_DB $app # Créer une base de données et un utilisateur dédié au nom de l'app. +#================================================= +# STANDARD MODIFICATIONS +#================================================= +# CREATE A SQL BDD +#================================================= +db_name=$(ynh_sanitize_dbid $app) +ynh_app_setting_set $app db_name $db_name +ynh_mysql_setup_db $db_name $db_name + +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= -# Créer le repertoire de destination et stocke son emplacement. -sudo mkdir "$final_path" ynh_app_setting_set $app final_path $final_path - -SETUP_SOURCE "teampass.tar.gz" # Télécharge la source, décompresse et copie dans $final_path +ynh_setup_source "$final_path" # Télécharge la source, décompresse et copie dans $final_path # Delete the install directory. # SECURE_REMOVE '$final_path/install' -# Et copie le fichier de config nginx -sudo cp ../conf/nginx.conf /etc/nginx/conf.d/$domain.d/$app.conf +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_add_nginx_config -# Modifie les variables dans le fichier de configuration nginx -sudo sed -i "s@__PATH__@$path@g" /etc/nginx/conf.d/$domain.d/$app.conf -sudo sed -i "s@__FINALPATH__@$final_path@g" /etc/nginx/conf.d/$domain.d/$app.conf -sudo sed -i "s@__NAMETOCHANGE__@$app@g" /etc/nginx/conf.d/$domain.d/$app.conf +#================================================= +# CREATE DEDICATED USER +#================================================= -ADD_SYS_USER # Créer un user système dédié pour l'application -POOL_FPM # Créer le fichier de configuration du pool php-fpm et le configure. +ynh_system_user_create $app # Créer un utilisateur système dédié à l'app + +#================================================= +# PHP-FPM CONFIGURATION +#================================================= + +ynh_add_fpm_config # Créer le fichier de configuration du pool php-fpm et le configure. + +#================================================= +# SPECIFIC SETUP +#================================================= +# FILL THE DATABASE +#================================================= # Copie du script contenant la fonction bCrypt sudo cp ../conf/mdphash.php $final_path @@ -62,7 +96,7 @@ sudo cp ../conf/mdphash.php $final_path if [ $(echo $LANG | cut -c1-2) == "fr" ] then langue=french - folders=partagés + folders=partagés # Le dossier partagé est actuellement désactivé par défaut. Encore un bug... roles=utilisateurs else langue=english @@ -71,7 +105,7 @@ else fi sed -i "s@__FINALPATH__@$final_path@g" ../conf/populate.sql sed -i "s@__DOMAIN__@$domain@g" ../conf/populate.sql -sed -i "s@__PATH__@$path@g" ../conf/populate.sql +sed -i "s@__PATH__@$path_url@g" ../conf/populate.sql sed -i "s@__FOLDERS__@$folders@g" ../conf/populate.sql sed -i "s@__ROLES__@$roles@g" ../conf/populate.sql sed -i "s@__VERSION__@$(sed -n 3p $final_path/changelog.md)@g" ../conf/populate.sql @@ -83,28 +117,43 @@ sed -i "s@__LANG__@$langue@g" ../conf/populate.sql ynh_app_setting_set $app langue $langue # Import du fichier SQL -mysql -u $db_user -p$db_pwd $db_user < ../conf/populate.sql +mysql -u $db_name -p$db_pwd $db_name < ../conf/populate.sql + +#================================================= +# CONFIGURE TEAMPASS +#================================================= # Remplacement des variables dans les fichier settings.php et sk.php -sed -i "s@__DBUSER__@$db_user@g" ../conf/settings.php +sed -i "s@__DBUSER__@$db_name@g" ../conf/settings.php sed -i "s@__DBPWD__@$db_pwd@g" ../conf/settings.php sed -i "s@__FINALPATH__@$final_path@g" ../conf/settings.php path_sk_file=/etc/teampass/ sudo mkdir $path_sk_file sed -i "s@__SKPATH__@$path_sk_file@g" ../conf/settings.php +#================================================= +# CREATE A SALTKEY +#================================================= + saltkey=$(dd if=/dev/urandom bs=1 count=200 2> /dev/null | tr -c -d '[A-Za-z0-9]' | sed -n 's/\(.\{32\}\).*/\1/p') sed -i "s@__SALTKEY__@$saltkey@g" ../conf/sk.php -# Et copie des fichiers à leurs emplacements. +#================================================= +# COPY THE FILES +#================================================= + sudo cp ../conf/sk.php $path_sk_file/sk.php sudo chown -R root:$app $path_sk_file sudo chmod 750 $path_sk_file sudo cp ../conf/settings.php $final_path/includes/config/settings.php -STORE_MD5_CONFIG "settings.php" "$final_path/includes/config/settings.php" # Enregistre la somme de contrôle du fichier de config +ynh_store_file_checksum "$final_path/includes/config/settings.php" # Enregistre la somme de contrôle du fichier de config sudo cp $final_path/includes/libraries/csrfp/libs/csrfp.config.sample.php $final_path/includes/libraries/csrfp/libs/csrfp.config.php # Créer le fichier de config de csrfp sed -i "s@CSRFP_TOKEN\" => \"@&$(head -n40 /dev/urandom | tr -c -d 'a-f0-9' | head -c50)@g" $final_path/includes/libraries/csrfp/libs/csrfp.config.php # Renseigne un token, valide en hexadécimal -sed -i "s@jsUrl\" => \"@&$domain$path/includes/libraries/csrfp/js/csrfprotector.js@g" $final_path/includes/libraries/csrfp/libs/csrfp.config.php # Renseigne l'adresse de csrfprotector.js +sed -i "s@jsUrl\" => \"@&$domain$path_url/includes/libraries/csrfp/js/csrfprotector.js@g" $final_path/includes/libraries/csrfp/libs/csrfp.config.php # Renseigne l'adresse de csrfprotector.js + +#================================================= +# CREATE THE USERS +#================================================= # Ajout des utilisateurs actuels dans la base yunohost teampass_users=$(ldapsearch -h localhost -b ou=users,dc=yunohost,dc=org -x objectClass=mailAccount uid | grep uid: | sed 's/uid: //' | xargs) @@ -115,28 +164,35 @@ do password=$(php ../conf/mdphash.php $real_password) mail=$(sudo ldapsearch -h localhost -b ou=users,dc=yunohost,dc=org -x uid=$teampassuser mail | grep mail: | sed 's/mail: //' | head -n1) # Creation de l'utilisateur - mysql -u $db_user -p$db_pwd $db_user -e "INSERT INTO teampass_users (id, login, pw, groupes_visibles, derniers, key_tempo, last_pw_change, last_pw, admin, fonction_id, groupes_interdits, last_connexion, gestionnaire, email, favourites, latest_items, personal_folder, can_create_root_folder) VALUES (NULL, '$teampassuser', '$password', '1', '', '', '', '', '0', '1', '', '', '0', '$mail', '', '', '1', '1');" + mysql -u $db_name -p$db_pwd $db_name -e "INSERT INTO teampass_users (id, login, pw, groupes_visibles, derniers, key_tempo, last_pw_change, last_pw, admin, fonction_id, groupes_interdits, last_connexion, gestionnaire, email, favourites, latest_items, personal_folder, can_create_root_folder) VALUES (NULL, '$teampassuser', '$password', '1', '', '', '', '', '0', '1', '', '', '0', '$mail', '', '', '1', '1');" # Creation du repertoire personnel - id_user=$(mysql -u $db_user -p$db_pwd $db_user -se "SELECT id from teampass_users where login='$teampassuser';") - mysql -u $db_user -p$db_pwd $db_user -e "INSERT INTO teampass_nested_tree (id, parent_id, title, nleft, nright, nlevel, bloquer_creation, bloquer_modification, personal_folder, renewal_period) VALUES (NULL, 0, '$id_user', 0, 0, 1, 0, 0, 1, 0);" + id_user=$(mysql -u $db_name -p$db_pwd $db_name -se "SELECT id from teampass_users where login='$teampassuser';") + mysql -u $db_name -p$db_pwd $db_name -e "INSERT INTO teampass_nested_tree (id, parent_id, title, nleft, nright, nlevel, bloquer_creation, bloquer_modification, personal_folder, renewal_period) VALUES (NULL, 0, '$id_user', 0, 0, 1, 0, 0, 1, 0);" ((id++)) done +#================================================= +# CREATE A CRON FILE FOR AUTOMATIC BACKUP +#================================================= + +echo "0 0 * * 0 $app cd $final_path/backups && php script.backup.php" > /etc/cron.d/teampass + +#================================================= +# GENERIC FINALISATION +#================================================= +# SECURING FILES AND DIRECTORIES +#================================================= -# Configure les droits d'accès au fichiers -# -rw-r--r-- sur les fichiers -sudo find $final_path -type f -print0 | xargs -0 sudo chmod 644 -# drwxr-xr-x sur les dossiers -sudo find $final_path -type d -print0 | xargs -0 sudo chmod 755 -# Les dossiers files et upload ont besoin d'un droit d'écriture. -sudo chmod 774 -R $final_path/files $final_path/upload -# Le script de conversion csv xml doit être exécutable, au moins par root. -sudo chmod 744 $final_path/CsvToXml_For_Teampass.sh # Les fichiers appartiennent à root -sudo chown -R root:$app $final_path +sudo chown -R root: $final_path +# Sauf les dossiers files et upload +sudo chown -R $app: $final_path/files $final_path/upload +# Restreint l'accès au dossier de backup +sudo chmod 750 $final_path/backups -# Recharge la configuration Nginx -sudo service nginx reload -# Régénère la configuration de SSOwat -sudo yunohost app ssowatconf +#================================================= +# RELOAD NGINX +#================================================= + +sudo systemctl reload nginx diff --git a/scripts/remove b/scripts/remove index 5e5103e..278b7dd 100644 --- a/scripts/remove +++ b/scripts/remove @@ -1,34 +1,61 @@ #!/bin/bash -source .fonctions # Charge les fonctions génériques habituellement utilisées dans le script +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= -# Récupère les infos de l'application. -app=$YNH_APP_INSTANCE_NAME - -# Source app helpers +source _common.sh source /usr/share/yunohost/helpers +#================================================= +# LOAD SETTINGS +#================================================= + +app=$YNH_APP_INSTANCE_NAME + domain=$(ynh_app_setting_get $app domain) +db_name=$(ynh_app_setting_get $app db_name) -REMOVE_BDD $app # Suppression de la base de donnée et de l'utilisateur associé. +#================================================= +# STANDARD REMOVE +#================================================= +# REMOVE THE SQL BDD +#================================================= -SECURE_REMOVE '/var/www/$app' # Suppression du dossier de l'application +ynh_mysql_remove_db $db_name $db_name # Suppression de la base de donnée et de l'utilisateur associé. -# Remove the sk.php -if [ -e "/etc/teampass/" ]; then - echo "Delete sk.php" - sudo rm -r "/etc/teampass/" -fi +#================================================= +# REMOVE THE MAIN DIR OF THE APP +#================================================= -REMOVE_NGINX_CONF # Suppression de la configuration nginx +ynh_secure_remove "/var/www/$app" # Suppression du dossier de l'application -SECURE_REMOVE '/var/log/$app/' # Suppression des log +#================================================= +# REMOVE THE NGINX CONFIGURATION +#================================================= -REMOVE_FPM_CONF # Suppression de la configuration du pool php-fpm +ynh_remove_nginx_config # Suppression de la configuration nginx -REMOVE_SYS_USER # Supprime l'user système dédié pour l'application +#================================================= +# REMOVE THE PHP-FPM CONFIGURATION +#================================================= -# Régénère la configuration de SSOwat -sudo yunohost app ssowatconf +ynh_remove_fpm_config # Suppression de la configuration du pool php-fpm -echo -e "\e[0m" # Restore normal color +#================================================= +# SPECIFIC REMOVE +#================================================= +# REMOVE THE SK.PHP FILE +#================================================= + +ynh_secure_remove "/etc/teampass" + +#================================================= +# GENERIC FINALISATION +#================================================= +# REMOVE DEDICATED USER +#================================================= + +ynh_system_user_delete $app diff --git a/scripts/restore b/scripts/restore index aa1c42a..c291dc4 100644 --- a/scripts/restore +++ b/scripts/restore @@ -1,57 +1,110 @@ #!/bin/bash -# Récupère les infos de l'application. -app=$YNH_APP_INSTANCE_NAME +#================================================= +# GENERIC STARTING +#================================================= +# MANAGE FAILURE OF THE SCRIPT +#================================================= -# Source app helpers +# Exit on command errors and treat unset variables as an error +set -eu + +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +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 +fi +source _common.sh source /usr/share/yunohost/helpers +#================================================= +# LOAD SETTINGS +#================================================= + +app=$YNH_APP_INSTANCE_NAME + domain=$(ynh_app_setting_get $app domain) +path_url=$(ynh_app_setting_get $app path) final_path=$(ynh_app_setting_get $app final_path) +db_name=$(ynh_app_setting_get $app db_name) -# The parameter $1 is the uncompressed restore directory location -backup_dir=$1/apps/$app +#================================================= +# CHECK IF THE APP CAN BE RESTORED +#================================================= -# Restore Nginx -conf=/etc/nginx/conf.d/$domain.d/$app.conf -if [ -f $conf ]; then - echo "There is already a nginx conf file at this path: $conf " >&2 - ynh_die -fi -sudo cp -a $backup_dir/nginx.conf $conf +sudo yunohost app checkurl "${domain}${path_url}" -a "$app" \ + || ynh_die "Path not available: ${domain}${path_url}" +test ! -d $final_path \ + || ynh_die "There is already a directory: $final_path " -# Restore YunoHost parameters -sudo cp -a $backup_dir/yunohost/. /etc/yunohost/apps/$app +#================================================= +# STANDARD RESTORE STEPS +#================================================= +# RESTORE OF THE NGINX CONFIGURATION +#================================================= -# Restore sources & data -sudo cp -a "$backup_dir/sources/." $final_path +ynh_restore_file "/etc/nginx/conf.d/$domain.d/$app.conf" + +#================================================= +# RESTORE OF THE MAIN DIR OF THE APP +#================================================= + +ynh_restore_file "$final_path" + +#================================================= +# RESTORE OF THE SQL BDD +#================================================= -# Créer la base de donnée et la restaure db_pwd=$(ynh_app_setting_get $app mysqlpwd) -db_user=$app -ynh_mysql_create_db $db_user $db_user $db_pwd -mysql --debug-check -u $db_user -p$db_pwd $db_user < ${backup_dir}/db.sql +ynh_mysql_setup_db $db_name $db_name $db_pwd +ynh_mysql_connect_as $db_name $db_pwd $db_name < ./db.sql -# Copy dedicated php-fpm process from backup folder to the right location -sudo cp -a $backup_dir/php-fpm.conf /etc/php5/fpm/pool.d/$app.conf -sudo cp -a $backup_dir/php-fpm.ini /etc/php5/fpm/conf.d/20-$app.ini +#================================================= +# RECREATE OF THE DEDICATED USER +#================================================= -# ADD_SYS_USER # Créer un user système dédié pour l'application -if ! ynh_system_user_exists "$app" # Test l'existence de l'utilisateur -then - sudo useradd -d /var/www/$app --system --user-group $app --shell /usr/sbin/nologin || (echo "Unable to create $app system account" >&2 && false) -fi +ynh_system_user_create $app # Recreate the dedicated user, if not exist -# Copie du fichier sk.php -sudo mkdir /etc/teampass -sudo cp -a $backup_dir/sk.php /etc/teampass/sk.php -sudo chown -R root:$app /etc/teampass/sk.php +#================================================= +# RESTORE USER RIGHTS +#================================================= # Les fichiers appartiennent à root -sudo chown -R root:$app $final_path +sudo chown -R root: $final_path +# Sauf les dossiers files et upload +sudo chown -R $app: $final_path/files $final_path/upload -# And Reload service -sudo service php5-fpm reload +#================================================= +# RESTORE OF THE PHP-FPM CONFIGURATION +#================================================= -# Reload webserver -sudo service nginx reload +ynh_restore_file "/etc/php5/fpm/pool.d/$app.conf" +ynh_restore_file "/etc/php5/fpm/conf.d/20-$app.ini" + +#================================================= +# SPECIFIC RESTORE +#================================================= +# RESTORE THE SK.PHP FILE +#================================================= + +ynh_restore_file "/etc/teampass/sk.php" +sudo chown -R root:$app "/etc/teampass/sk.php" + +#================================================= +# RESTORE CRON FILE +#================================================= + +ynh_restore_file "/etc/cron.d/teampass" + +#================================================= +# GENERIC FINALISATION +#================================================= +# RELOAD NGINX AND PHP-FPM +#================================================= + +sudo systemctl reload php5-fpm +sudo systemctl reload nginx diff --git a/scripts/upgrade b/scripts/upgrade index 88e15dc..c16e40e 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -1,53 +1,93 @@ #!/bin/bash -source .fonctions # Charge les fonctions génériques habituellement utilisées dans le script +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= -# Récupère les infos de l'application. -app=$YNH_APP_INSTANCE_NAME - -# Source app helpers +source _common.sh source /usr/share/yunohost/helpers +#================================================= +# LOAD SETTINGS +#================================================= + +app=$YNH_APP_INSTANCE_NAME + domain=$(ynh_app_setting_get $app domain) -path=$(ynh_app_setting_get $app path) +path_url=$(ynh_app_setting_get $app path) final_path=$(ynh_app_setting_get $app final_path) -CHECK_PATH # Vérifie et corrige la syntaxe du path. +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= -SETUP_SOURCE "teampass.tar.gz" # Télécharge la source, décompresse et copie dans $final_path +BACKUP_BEFORE_UPGRADE # Backup the current version of the app +ynh_clean_setup () { + BACKUP_FAIL_UPGRADE # restore it if the upgrade fails +} +ynh_abort_if_errors # Active trap pour arrêter le script si une erreur est détectée. -# Delete the install directory. -SECURE_REMOVE '$final_path/install' +#================================================= +# CHECK THE PATH +#================================================= -# Et copie le fichier de config nginx -sudo cp ../conf/nginx.conf /etc/nginx/conf.d/$domain.d/$app.conf +path_url=$(ynh_normalize_url_path $path_url) # Vérifie et corrige la syntaxe du path. -# Modifie les variables dans le fichier de configuration nginx -sudo sed -i "s@__PATH__@$path@g" /etc/nginx/conf.d/$domain.d/$app.conf -sudo sed -i "s@__FINALPATH__@$final_path@g" /etc/nginx/conf.d/$domain.d/$app.conf -sudo sed -i "s@__NAMETOCHANGE__@$app@g" /etc/nginx/conf.d/$domain.d/$app.conf +#================================================= +# STANDARD UPGRADE STEPS +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= -ADD_SYS_USER # Créer un user système dédié pour l'application -POOL_FPM # Créer le fichier de configuration du pool php-fpm et le configure. +ynh_setup_source "$final_path" # Télécharge la source, décompresse et copie dans $final_path -# sudo chown www-data: -R $final_path -# sudo chmod 770 -R $final_path -# sudo find $final_path -type f -print0 | xargs -0 sudo chmod 740 # Applique les permissions sur les fichiers seulement (rwxr-----) -# sudo chmod 770 -R $final_path/files $final_path/upload -# sudo chmod a+x $final_path/CsvToXml_For_Teampass.sh +#================================================= +# NGINX CONFIGURATION +#================================================= + +ynh_add_nginx_config + +#================================================= +# CREATE DEDICATED USER +#================================================= + +ynh_system_user_create $app # Create the dedicated user, if not exist + +#================================================= +# PHP-FPM CONFIGURATION +#================================================= + +ynh_add_fpm_config # Créer le fichier de configuration du pool php-fpm et le configure. + +#================================================= +# SPECIFIC UPGRADE +#================================================= +# ... +#================================================= + +#================================================= +# CREATE A CRON FILE FOR AUTOMATIC BACKUP +#================================================= + +echo "0 0 * * 0 $app cd $final_path/backups && php script.backup.php" > /etc/cron.d/teampass + +#================================================= +# GENERIC FINALISATION +#================================================= +# SECURING FILES AND DIRECTORIES +#================================================= -# -rw-r--r-- sur les fichiers -sudo find $final_path -type f -print0 | xargs -0 sudo chmod 644 -# drwxr-xr-x sur les dossiers -sudo find $final_path -type d -print0 | xargs -0 sudo chmod 755 -# Les dossiers files et upload ont besoin d'un droit d'écriture. -sudo chmod 774 -R $final_path/files $final_path/upload -# Le script de conversion csv xml doit être exécutable, au moins par root. -sudo chmod 744 $final_path/CsvToXml_For_Teampass.sh # Les fichiers appartiennent à root sudo chown -R root: $final_path +# Sauf les dossiers files et upload +sudo chown -R $app: $final_path/files $final_path/upload +# Restreint l'accès au dossier de backup +sudo chmod 750 $final_path/backups -# Recharge la configuration Nginx -sudo service nginx reload -# Régénère la configuration de SSOwat -sudo yunohost app ssowatconf +#================================================= +# RELOAD NGINX +#================================================= + +sudo systemctl reload nginx