From 1621e1fb22c566fb132be50c03a69977fe9d2f33 Mon Sep 17 00:00:00 2001 From: YunoHost Bot Date: Fri, 21 May 2021 19:28:13 +0200 Subject: [PATCH 01/16] [autopatch] Update issue and PR templates (#6) Co-authored-by: Yunohost-Bot <> --- issue_template.md => .github/ISSUE_TEMPLATE.md | 4 ++-- .github/PULL_REQUEST_TEMPLATE.md | 16 ++++++++++++++++ pull_request_template.md | 16 ---------------- 3 files changed, 18 insertions(+), 18 deletions(-) rename issue_template.md => .github/ISSUE_TEMPLATE.md (94%) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 pull_request_template.md diff --git a/issue_template.md b/.github/ISSUE_TEMPLATE.md similarity index 94% rename from issue_template.md rename to .github/ISSUE_TEMPLATE.md index 03b4ce2..2729a6b 100644 --- a/issue_template.md +++ b/.github/ISSUE_TEMPLATE.md @@ -8,7 +8,7 @@ about: When creating a bug report, please use the following template to provide 1. *Read this whole template first.* 2. *Determine if you are on the right place:* - *If you were performing an action on the app from the webadmin or the CLI (install, update, backup, restore, change_url...), you are on the right place!* - - *Otherwise, the issue may be due to guacamole itself. Refer to its documentation or repository for help.* + - *Otherwise, the issue may be due to the app itself. Refer to its documentation or repository for help.* - *When in doubt, post here and we will figure it out together.* 3. *Delete the italic comments as you write over them below, and remove this guide.* --- @@ -31,7 +31,7 @@ about: When creating a bug report, please use the following template to provide - *If you performed a command from the CLI, the command itself is enough. For example:* ```sh - sudo yunohost app install guacamole + sudo yunohost app install the_app ``` - *If you used the webadmin, please perform the equivalent command from the CLI first.* - *If the error occurs in your browser, explain what you did:* diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..ef70e18 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,16 @@ +## Problem + +- *Description of why you made this PR* + +## Solution + +- *And how do you fix that problem* + +## PR Status + +- [ ] Code finished and ready to be reviewed/tested +- [ ] The fix/enhancement were manually tested (if applicable) + +## Automatic tests + +Automatic tests can be triggered on https://ci-apps-dev.yunohost.org/ *after creating the PR*, by commenting "!testme", "!gogogadgetoci" or "By the power of systemd, I invoke The Great App CI to test this Pull Request!". (N.B. : for this to work you need to be a member of the Yunohost-Apps organization) diff --git a/pull_request_template.md b/pull_request_template.md deleted file mode 100644 index 6c28fc5..0000000 --- a/pull_request_template.md +++ /dev/null @@ -1,16 +0,0 @@ -## Problem -- *Description of why you made this PR* - -## Solution -- *And how do you fix that problem* - -## PR Status -- [ ] Code finished. -- [ ] Tested with Package_check. -- [ ] Fix or enhancement tested. -- [ ] Upgrade from last version tested. -- [ ] Can be reviewed and tested. - -## Package_check results ---- -* An automatic package_check will be launch at https://ci-apps-dev.yunohost.org/, when you add a specific comment to your Pull Request: "!testme", "!gogogadgetoci" or "By the power of systemd, I invoke The Great App CI to test this Pull Request!"* From 1f8d7cdd79d33c97d486424d70de03ceae01adf8 Mon Sep 17 00:00:00 2001 From: tituspijean Date: Wed, 14 Jul 2021 18:27:49 +0200 Subject: [PATCH 02/16] Update to tomcat 9.0.31-1~deb10u4 (#8) * Update to tomcat 9.0.31-1~deb10u4 - It is annoying that older builds are getting removed from source server - Let's rename the downloaded archive to simplify the code * Silence make warnings * Bump package version --- conf/tomcat9_deb.src | 6 +++--- manifest.json | 4 ++-- scripts/install | 12 ++++++------ scripts/upgrade | 12 ++++++------ 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/conf/tomcat9_deb.src b/conf/tomcat9_deb.src index 9d430c7..ba35364 100644 --- a/conf/tomcat9_deb.src +++ b/conf/tomcat9_deb.src @@ -1,7 +1,7 @@ -SOURCE_URL=https://ftp.debian.org/debian/pool/main/t/tomcat9/tomcat9_9.0.31-1~deb10u3_all.deb -SOURCE_SUM=0f51e6e84f4045564d6c3b249b69e1a7cb10a8f737458003da701b52a2903970 +SOURCE_URL=https://ftp.debian.org/debian/pool/main/t/tomcat9/tomcat9_9.0.31-1~deb10u4_all.deb +SOURCE_SUM=42276CABAD11856553DD9265B8C7FBCCE245525BF80EAF180085AB74BB078619 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=ar SOURCE_IN_SUBDIR=false -SOURCE_FILENAME=tomcat9_9.0.31-1~deb10u3_all.deb +SOURCE_FILENAME=tomcat9.deb SOURCE_EXTRACT=false diff --git a/manifest.json b/manifest.json index a59ca7f..f0f7ede 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH.", "fr": "Service de bureau à distance sans client. Fonctionne avec des protocoles standard comme VNC, RDP, et SSH." }, - "version": "1.3.0~ynh3", + "version": "1.3.0~ynh4", "url": "https://guacamole.apache.org/", "license": "Apache-2.0", "maintainer": { @@ -54,4 +54,4 @@ } ] } -} \ No newline at end of file +} diff --git a/scripts/install b/scripts/install index 7ed5ae3..024bd54 100755 --- a/scripts/install +++ b/scripts/install @@ -68,7 +68,7 @@ ynh_app_setting_set --app=$app --key=port --value=$port #================================================= ynh_script_progression --message="Installing dependencies..." --weight=1 -# Guacamole depends on Apache Tomcat. +# Guacamole depends on Apache Tomcat. # But installing Tomcat from the Debian repos automatically enables and starts it. # So we stop and disable it, unless Tomcat was already enabled or started by the user beforehand @@ -136,13 +136,13 @@ mv "$final_path/etc/guacamole/lib/mariadb-java-client-2.7.2.jar" "$final_path/et ynh_setup_source --source_id="tomcat9_deb" --dest_dir="$final_path/" pushd "$final_path" || ynh_die - ar x "$final_path/tomcat9_9.0.31-1~deb10u3_all.deb" "data.tar.xz" + ar x "$final_path/tomcat9.deb" "data.tar.xz" popd || ynh_die -ynh_secure_remove --file="$final_path/tomcat9_9.0.31-1~deb10u3_all.deb" +ynh_secure_remove --file="$final_path/tomcat9.deb" mkdir -p "$final_path/tomcat9-data" tar -C "$final_path/tomcat9-data" -xJf "$final_path/data.tar.xz" cp -r "$final_path/tomcat9-data/usr/share/tomcat9/etc" -T "$final_path/etc/tomcat9/" -cp -r "$final_path/tomcat9-data/etc/tomcat9/" -T "$final_path/etc/tomcat9/" +cp -r "$final_path/tomcat9-data/etc/tomcat9/" -T "$final_path/etc/tomcat9/" ynh_secure_remove --file="$final_path/data.tar.xz" ynh_secure_remove --file="$final_path/tomcat9-data" @@ -184,8 +184,8 @@ ynh_script_progression --message="Compiling guacd..." --weight=30 pushd "$final_path/.guacd-src" || ynh_die ./configure --enable-allow-freerdp-snapshots --prefix="$final_path" --datadir="$final_path" --with-freerdp-plugin-dir="$final_path/lib/x86_64-linux-gnu/freerdp2" - make - make install + ynh_exec_warn_less make + ynh_exec_warn_less make install popd || ynh_die #================================================= diff --git a/scripts/upgrade b/scripts/upgrade index c9d4346..69407ab 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -92,13 +92,13 @@ if [ "$upgrade_type" == "UPGRADE_APP" ]; then ynh_setup_source --source_id="tomcat9_deb" --dest_dir="$final_path/" pushd "$final_path" || ynh_die - ar x "$final_path/tomcat9_9.0.31-1~deb10u3_all.deb" "data.tar.xz" + ar x "$final_path/tomcat9.deb" "data.tar.xz" popd || ynh_die - ynh_secure_remove --file="$final_path/tomcat9_9.0.31-1~deb10u3_all.deb" + ynh_secure_remove --file="$final_path/tomcat9.deb" mkdir -p "$final_path/tomcat9-data" tar -C "$final_path/tomcat9-data" -xJf "$final_path/data.tar.xz" cp -r "$final_path/tomcat9-data/usr/share/tomcat9/etc" -T "$final_path/etc/tomcat9/" - cp -r "$final_path/tomcat9-data/etc/tomcat9/" -T "$final_path/etc/tomcat9/" + cp -r "$final_path/tomcat9-data/etc/tomcat9/" -T "$final_path/etc/tomcat9/" ynh_secure_remove --file="$final_path/data.tar.xz" ynh_secure_remove --file="$final_path/tomcat9-data" fi @@ -116,7 +116,7 @@ ynh_add_nginx_config #================================================= ynh_script_progression --message="Upgrading dependencies..." --weight=1 -# Guacamole depends on Apache Tomcat. +# Guacamole depends on Apache Tomcat. # But installing Tomcat from the Debian repos automatically enables and starts it. # So we stop and disable it, unless Tomcat was already enabled or started by the user beforehand @@ -158,8 +158,8 @@ ynh_script_progression --message="Compiling guacd..." --weight=30 pushd "$final_path/.guacd-src" || ynh_die ./configure --enable-allow-freerdp-snapshots --prefix="$final_path" --datadir="$final_path" --with-freerdp-plugin-dir="$final_path/lib/x86_64-linux-gnu/freerdp2" - make - make install + ynh_exec_warn_less make + ynh_exec_warn_less make install popd || ynh_die #================================================= From 8b73a43154654c30420b70905a3009c36b005cc6 Mon Sep 17 00:00:00 2001 From: yalh76 Date: Fri, 6 Aug 2021 13:44:33 +0200 Subject: [PATCH 03/16] Apply last example_ynh (#11) * Apply last example_ynh * Fix restore --- check_process | 15 +++------ doc/.gitkeep | 0 doc/DISCLAIMER.md | 3 ++ doc/DISCLAIMER_fr.md | 3 ++ doc/screenshots/.gitkeep | 0 doc/screenshots/screenshot1.jpg | Bin 0 -> 58502 bytes manifest.json | 12 +++++--- scripts/change_url | 14 ++++++--- scripts/install | 36 +++++++++++----------- scripts/remove | 4 +-- scripts/restore | 47 +++++++++++++++-------------- scripts/upgrade | 41 +++++++++++++------------ sources/extra_files/app/.gitignore | 2 -- sources/patches/.gitignore | 2 -- 14 files changed, 92 insertions(+), 87 deletions(-) create mode 100644 doc/.gitkeep create mode 100644 doc/DISCLAIMER.md create mode 100644 doc/DISCLAIMER_fr.md create mode 100644 doc/screenshots/.gitkeep create mode 100644 doc/screenshots/screenshot1.jpg delete mode 100644 sources/extra_files/app/.gitignore delete mode 100644 sources/patches/.gitignore diff --git a/check_process b/check_process index 338bf1d..ccf1005 100644 --- a/check_process +++ b/check_process @@ -1,14 +1,9 @@ -# See here for more information -# https://github.com/YunoHost/package_check#syntax-check_process-file - -# Move this file from check_process.default to check_process when you have filled it. - ;; Test complet ; Manifest - domain="domain.tld" (DOMAIN) - path="/path" (PATH) - admin="john" (USER) - is_public=0 (PUBLIC|public=1|private=0) + domain="domain.tld" + path="/path" + admin="john" + is_public=0 ; Checks pkg_linter=1 setup_sub_dir=1 @@ -17,7 +12,6 @@ setup_private=1 setup_public=1 upgrade=1 - upgrade=0 from_commit=CommitHash backup_restore=1 multi_instance=1 port_already_use=0 @@ -29,4 +23,3 @@ Notification=none ; commit=CommitHash name=Name and date of the commit. manifest_arg=domain=DOMAIN&path=PATH&admin=USER&is_public=1& - diff --git a/doc/.gitkeep b/doc/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md new file mode 100644 index 0000000..7ccabce --- /dev/null +++ b/doc/DISCLAIMER.md @@ -0,0 +1,3 @@ +## Configuration + +The user that is configured as admin during install will have access to admin settings in the settings menu of the app (under the user menu). Configuration files are in `/opt/yunohost/guacamole/etc/guacamole` (for the first install). diff --git a/doc/DISCLAIMER_fr.md b/doc/DISCLAIMER_fr.md new file mode 100644 index 0000000..439f20e --- /dev/null +++ b/doc/DISCLAIMER_fr.md @@ -0,0 +1,3 @@ +## Configuration + +L'utilisateur choisi comme admin durant le processus d'installation aura accès au paramétres d'administration dans le menu de configuration de l'application (sous le menu utilisateur). Le fichiers de configuration sont dans `/opt/yunohost/guacamole/etc/guacamole` (pour la première installation). diff --git a/doc/screenshots/.gitkeep b/doc/screenshots/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/doc/screenshots/screenshot1.jpg b/doc/screenshots/screenshot1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6c5b06aa132d254b05800cb1757af922e3885340 GIT binary patch literal 58502 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 EKVIfa=l}o! literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json index f0f7ede..6ced031 100644 --- a/manifest.json +++ b/manifest.json @@ -6,8 +6,14 @@ "en": "Clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH.", "fr": "Service de bureau à distance sans client. Fonctionne avec des protocoles standard comme VNC, RDP, et SSH." }, - "version": "1.3.0~ynh4", + "version": "1.3.0~ynh5", "url": "https://guacamole.apache.org/", + "upstream": { + "license": "Apache-2.0", + "website": "https://guacamole.apache.org/", + "admindoc": "https://guacamole.apache.org/doc/gug/", + "code": "https://github.com/search?utf8=%E2%9C%93&q=repo%3Aapache%2Fguacamole-server+repo%3Aapache%2Fguacamole-client+repo%3Aapache%2Fguacamole-website&type=Repositories&ref=searchresults" + }, "license": "Apache-2.0", "maintainer": { "name": "Jules Bertholet", @@ -31,10 +37,6 @@ { "name": "path", "type": "path", - "ask": { - "en": "Choose a path for Guacamole", - "fr": "Choisissez un chemin pour Guacamole" - }, "example": "/guacamole", "default": "/guacamole" }, diff --git a/scripts/change_url b/scripts/change_url index 0622964..7a634cc 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -31,7 +31,7 @@ final_path=$(ynh_app_setting_get --app=$app --key=final_path) port=$(ynh_app_setting_get --app=$app --key=port) #================================================= -# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +# BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP #================================================= ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --weight=1 @@ -52,12 +52,14 @@ ynh_abort_if_errors #================================================= change_domain=0 -if [ "$old_domain" != "$new_domain" ]; then +if [ "$old_domain" != "$new_domain" ] +then change_domain=1 fi change_path=0 -if [ "$old_path" != "$new_path" ]; then +if [ "$old_path" != "$new_path" ] +then change_path=1 fi @@ -79,7 +81,8 @@ ynh_script_progression --message="Updating NGINX web server configuration..." -- nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf # Change the path in the NGINX config file -if [ $change_path -eq 1 ]; then +if [ $change_path -eq 1 ] +then # Make a backup of the original NGINX config file if modified ynh_backup_if_checksum_is_different --file="$nginx_conf_path" # Set global variables for NGINX helper @@ -90,7 +93,8 @@ if [ $change_path -eq 1 ]; then fi # Change the domain for NGINX -if [ $change_domain -eq 1 ]; then +if [ $change_domain -eq 1 ] +then # Delete file checksum for the old conf file location ynh_delete_file_checksum --file="$nginx_conf_path" mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf diff --git a/scripts/install b/scripts/install index 024bd54..89746af 100755 --- a/scripts/install +++ b/scripts/install @@ -92,6 +92,15 @@ if [ ! $tomcat_active ]; then systemctl stop tomcat9 --quiet fi +#================================================= +# CREATE DEDICATED USERS +#================================================= +ynh_script_progression --message="Configuring system users..." --weight=1 + +# Create system users +ynh_system_user_create --username="$app-guacd" +ynh_system_user_create --username="$app-tomcat" + #================================================= # CREATE A MYSQL DATABASE #================================================= @@ -166,15 +175,6 @@ ynh_script_progression --message="Configuring NGINX web server..." --weight=1 # Create a dedicated NGINX config ynh_add_nginx_config -#================================================= -# CREATE DEDICATED USERS -#================================================= -ynh_script_progression --message="Configuring system users..." --weight=1 - -# Create system users -ynh_system_user_create --username="$app-guacd" -ynh_system_user_create --username="$app-tomcat" - #================================================= # SPECIFIC SETUP #================================================= @@ -202,15 +202,6 @@ ln -s -f "/var/cache/$app-tomcat9" "$final_path/var/lib/tomcat9/work" #================================================= mkdir -p "/var/log/$app/tomcat/" "/var/log/$app/guacd/" "/var/log/$app/tomcat/" -#================================================= -# SETUP SYSTEMD -#================================================= -ynh_script_progression --message="Configuring systemd services..." --weight=1 - -# Create dedicated systemd configs -ynh_add_systemd_config --service="$app-guacd" --template="guacd.service" -v guacd_port -ynh_add_systemd_config --service="$app-tomcat" --template="tomcat.service" - #================================================= # ADD CONFIGURATIONS #================================================= @@ -219,6 +210,15 @@ ynh_add_config --template="guacamole.properties" --destination="$final_path/etc/ ynh_replace_string --match_string="8080" --replace_string="$port" --target_file="$final_path/etc/tomcat9/server.xml" +#================================================= +# SETUP SYSTEMD +#================================================= +ynh_script_progression --message="Configuring systemd services..." --weight=1 + +# Create dedicated systemd configs +ynh_add_systemd_config --service="$app-guacd" --template="guacd.service" +ynh_add_systemd_config --service="$app-tomcat" --template="tomcat.service" + #================================================= # GENERIC FINALIZATION #================================================= diff --git a/scripts/remove b/scripts/remove index f57c1af..c36b3d3 100755 --- a/scripts/remove +++ b/scripts/remove @@ -90,7 +90,7 @@ ynh_remove_logrotate #================================================= # REMOVE FAIL2BAN CONFIGURATION #================================================= -ynh_script_progression --message="Removing Fail2ban configuration..." --weight=1 +ynh_script_progression --message="Removing Fail2Ban configuration..." --weight=1 # Remove the dedicated Fail2Ban config ynh_remove_fail2ban_config @@ -102,7 +102,7 @@ ynh_remove_fail2ban_config #================================================= # Remove the log files -ynh_secure_remove --file="/var/log/$app/" +ynh_secure_remove --file="/var/log/$app" #================================================= # GENERIC FINALIZATION diff --git a/scripts/restore b/scripts/restore index f580fa6..fccdf1d 100755 --- a/scripts/restore +++ b/scripts/restore @@ -48,16 +48,10 @@ test ! -d $final_path \ #================================================= # RESTORE THE NGINX CONFIGURATION #================================================= +ynh_script_progression --message="Restoring the NGINX web server configuration..." ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" -#================================================= -# RESTORE THE APP MAIN DIR -#================================================= -ynh_script_progression --message="Restoring the app main directory..." --weight=1 - -ynh_restore_file --origin_path="$final_path" - #================================================= # RECREATE THE DEDICATED USER #================================================= @@ -68,11 +62,23 @@ ynh_system_user_create --username="$app-guacd" ynh_system_user_create --username="$app-tomcat" #================================================= -# RESTORE VARIOUS FILES +# RESTORE THE APP MAIN DIR #================================================= +ynh_script_progression --message="Restoring the app main directory..." --weight=1 -ynh_restore_file --origin_path="/var/log/$app" +ynh_restore_file --origin_path="$final_path" +#================================================= +# RESTORE FAIL2BAN CONFIGURATION +#================================================= +ynh_script_progression --message="Restoring the Fail2Ban configuration..." --weight=1 + +ynh_restore_file "/etc/fail2ban/jail.d/$app.conf" +ynh_restore_file "/etc/fail2ban/filter.d/$app.conf" +ynh_systemd_action --action=restart --service_name=fail2ban + +#================================================= +# SPECIFIC RESTORATION #================================================= # REINSTALL DEPENDENCIES #================================================= @@ -108,23 +114,10 @@ chown -R root:root $final_path chmod -R o-rwx $final_path setfacl -n -R -m user:$app-guacd:rx -m default:user:$app-guacd:rx $final_path setfacl -n -R -m user:$app-tomcat:rx -m default:user:$app-tomcat:rx $final_path -chown -R $app-guacd:$app-guacd "/var/log/$app/guacd/" -chown -R $app-tomcat:$app-tomcat "/var/log/$app/tomcat/" chown -R root:$app-tomcat "$final_path/etc/tomcat9/" "$final_path/etc/guacamole/" chown -R "$app-tomcat":"$app-tomcat" "$final_path/var/lib/tomcat9/webapps" setfacl -n -R -m user:$app-guacd:- -m default:user:$app-guacd:- "$final_path/var/lib/tomcat9/" "$final_path/etc/guacamole/" "$final_path/etc/tomcat9/" -#================================================= -# RESTORE FAIL2BAN CONFIGURATION -#================================================= -ynh_script_progression --message="Restoring the Fail2Ban configuration..." --weight=1 - -ynh_restore_file "/etc/fail2ban/jail.d/$app.conf" -ynh_restore_file "/etc/fail2ban/filter.d/$app.conf" -ynh_systemd_action --action=restart --service_name=fail2ban - -#================================================= -# SPECIFIC RESTORATION #================================================= # RESTORE THE MYSQL DATABASE #================================================= @@ -134,6 +127,15 @@ db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd ynh_mysql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./db.sql +#================================================= +# RESTORE VARIOUS FILES +#================================================= +ynh_script_progression --message="Restoring various files..." + +ynh_restore_file --origin_path="/var/log/$app" +chown -R $app-guacd:$app-guacd "/var/log/$app/guacd/" +chown -R $app-tomcat:$app-tomcat "/var/log/$app/tomcat/" + #================================================= # RESTORE SYSTEMD #================================================= @@ -163,6 +165,7 @@ ynh_systemd_action --service_name="$app-tomcat" --action="start" --log_path="/va #================================================= # RESTORE THE LOGROTATE CONFIGURATION #================================================= +ynh_script_progression --message="Restoring the logrotate configuration..." ynh_restore_file --origin_path="/etc/logrotate.d/$app" diff --git a/scripts/upgrade b/scripts/upgrade index 69407ab..f468777 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -26,10 +26,10 @@ db_name=$(ynh_app_setting_get --app=$app --key=db_name) db_user=$db_name db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) - #================================================= # CHECK VERSION #================================================= +ynh_script_progression --message="Checking version..." upgrade_type=$(ynh_check_app_version_changed) @@ -57,11 +57,21 @@ ynh_script_progression --message="Stopping systemd services..." --weight=1 ynh_systemd_action --service_name="$app-guacd" --action="stop" --log_path="/var/log/$app/guacd.log" ynh_systemd_action --service_name="$app-tomcat" --action="stop" --log_path="/var/log/$app/tomcat.log" +#================================================= +# CREATE DEDICATED USERS +#================================================= +ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 + +# Create dedicated users (if not existing) +ynh_system_user_create --username="$app-guacd" +ynh_system_user_create --username="$app-tomcat" + #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= -if [ "$upgrade_type" == "UPGRADE_APP" ]; then +if [ "$upgrade_type" == "UPGRADE_APP" ] +then ynh_script_progression --message="Upgrading source files..." --weight=1 # Download, check integrity, uncompress and patch the source from app.src @@ -140,15 +150,6 @@ if [ ! $tomcat_active ]; then systemctl stop tomcat9 --quiet fi -#================================================= -# CREATE DEDICATED USERS -#================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 - -# Create dedicated users (if not existing) -ynh_system_user_create --username="$app-guacd" -ynh_system_user_create --username="$app-tomcat" - #================================================= # SPECIFIC UPGRADE #================================================= @@ -176,15 +177,6 @@ ln -s -f "/var/cache/$app-tomcat9" "$final_path/var/lib/tomcat9/work" #================================================= mkdir -p "/var/log/$app/tomcat/" "/var/log/$app/guacd/" "/var/log/$app/tomcat/" -#================================================= -# SETUP SYSTEMD -#================================================= -ynh_script_progression --message="Upgrading systemd configuration..." --weight=1 - -# Create dedicated systemd configs -ynh_add_systemd_config --service="$app-guacd" --template="guacd.service" -v guacd_port -ynh_add_systemd_config --service="$app-tomcat" --template="tomcat.service" - #================================================= # UPDATE CONFIG FILES #================================================= @@ -193,6 +185,15 @@ ynh_add_config --template="guacamole.properties" --destination="$final_path/etc/ ynh_replace_string --match_string="8080" --replace_string="$port" --target_file="$final_path/etc/tomcat9/server.xml" +#================================================= +# SETUP SYSTEMD +#================================================= +ynh_script_progression --message="Upgrading systemd configuration..." --weight=1 + +# Create dedicated systemd configs +ynh_add_systemd_config --service="$app-guacd" --template="guacd.service" +ynh_add_systemd_config --service="$app-tomcat" --template="tomcat.service" + #================================================= # GENERIC FINALIZATION #================================================= diff --git a/sources/extra_files/app/.gitignore b/sources/extra_files/app/.gitignore deleted file mode 100644 index 783a4ae..0000000 --- a/sources/extra_files/app/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*~ -*.sw[op] diff --git a/sources/patches/.gitignore b/sources/patches/.gitignore deleted file mode 100644 index 783a4ae..0000000 --- a/sources/patches/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*~ -*.sw[op] From 7137457debef48e256c5f5d89e6b04b6ec5089d0 Mon Sep 17 00:00:00 2001 From: Jaime Marcos Date: Sun, 17 Oct 2021 13:54:45 +0800 Subject: [PATCH 04/16] Update tomcat9_deb.src --- conf/tomcat9_deb.src | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/tomcat9_deb.src b/conf/tomcat9_deb.src index ba35364..4ac41f2 100644 --- a/conf/tomcat9_deb.src +++ b/conf/tomcat9_deb.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://ftp.debian.org/debian/pool/main/t/tomcat9/tomcat9_9.0.31-1~deb10u4_all.deb -SOURCE_SUM=42276CABAD11856553DD9265B8C7FBCCE245525BF80EAF180085AB74BB078619 +SOURCE_URL=https://ftp.debian.org/debian/pool/main/t/tomcat9/tomcat9_9.0.31-1~deb10u5_all.deb +SOURCE_SUM=35a6218445462a9d7613fd353e2a1d8a45ae3d9eebb12babbd55dd45193f57d2 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=ar SOURCE_IN_SUBDIR=false From da0c9ed20b2437148ab5f04cb7e0d53686e4549b Mon Sep 17 00:00:00 2001 From: Jaime Marcos Date: Sun, 17 Oct 2021 15:52:10 +0800 Subject: [PATCH 05/16] Update tomcat9_deb.src --- conf/tomcat9_deb.src | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/tomcat9_deb.src b/conf/tomcat9_deb.src index 4ac41f2..c7cf78a 100644 --- a/conf/tomcat9_deb.src +++ b/conf/tomcat9_deb.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://ftp.debian.org/debian/pool/main/t/tomcat9/tomcat9_9.0.31-1~deb10u5_all.deb -SOURCE_SUM=35a6218445462a9d7613fd353e2a1d8a45ae3d9eebb12babbd55dd45193f57d2 +SOURCE_URL=https://ftp.debian.org/debian/pool/main/t/tomcat9/tomcat9_9.0.31-1~deb10u6_all.deb +SOURCE_SUM=9fc770b3cb32bacd22e6e48ea4539985173e523545f799dc207ea4316a8402e9 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=ar SOURCE_IN_SUBDIR=false From fecb949c89d402f246d6ea4ab1eb2f2b67ae9d5b Mon Sep 17 00:00:00 2001 From: tituspijean Date: Wed, 20 Oct 2021 19:41:05 +0200 Subject: [PATCH 07/16] Follow linter advice in manifest --- manifest.json | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/manifest.json b/manifest.json index 6ced031..a9fc38a 100644 --- a/manifest.json +++ b/manifest.json @@ -31,8 +31,7 @@ "install" : [ { "name": "domain", - "type": "domain", - "example": "example.com" + "type": "domain" }, { "name": "path", @@ -42,8 +41,7 @@ }, { "name": "admin", - "type": "user", - "example": "johndoe" + "type": "user" }, { "name": "is_public", From 818534fbd594891204c10777a303b7956e0048c1 Mon Sep 17 00:00:00 2001 From: tituspijean Date: Wed, 20 Oct 2021 19:47:33 +0200 Subject: [PATCH 08/16] Follow linter advice on chown --- scripts/install | 4 ++-- scripts/restore | 4 ++-- scripts/upgrade | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/install b/scripts/install index 89746af..d52648b 100755 --- a/scripts/install +++ b/scripts/install @@ -226,13 +226,13 @@ ynh_add_systemd_config --service="$app-tomcat" --template="tomcat.service" #================================================= # Set permissions to app files -chown -R root:root $final_path +chown -R nobody:nobody $final_path chmod -R o-rwx $final_path setfacl -n -R -m user:$app-guacd:rx -m default:user:$app-guacd:rx $final_path setfacl -n -R -m user:$app-tomcat:rx -m default:user:$app-tomcat:rx $final_path chown -R $app-guacd:$app-guacd "/var/log/$app/guacd/" chown -R $app-tomcat:$app-tomcat "/var/log/$app/tomcat/" -chown -R root:$app-tomcat "$final_path/etc/tomcat9/" "$final_path/etc/guacamole/" +chown -R nobody:$app-tomcat "$final_path/etc/tomcat9/" "$final_path/etc/guacamole/" chown -R "$app-tomcat":"$app-tomcat" "$final_path/var/lib/tomcat9/webapps" setfacl -n -R -m user:$app-guacd:- -m default:user:$app-guacd:- "$final_path/var/lib/tomcat9/" "$final_path/etc/guacamole/" "$final_path/etc/tomcat9/" diff --git a/scripts/restore b/scripts/restore index fccdf1d..268876f 100755 --- a/scripts/restore +++ b/scripts/restore @@ -110,11 +110,11 @@ fi #================================================= # Restore permissions on app files -chown -R root:root $final_path +chown -R nobody:nobody $final_path chmod -R o-rwx $final_path setfacl -n -R -m user:$app-guacd:rx -m default:user:$app-guacd:rx $final_path setfacl -n -R -m user:$app-tomcat:rx -m default:user:$app-tomcat:rx $final_path -chown -R root:$app-tomcat "$final_path/etc/tomcat9/" "$final_path/etc/guacamole/" +chown -R nobody:$app-tomcat "$final_path/etc/tomcat9/" "$final_path/etc/guacamole/" chown -R "$app-tomcat":"$app-tomcat" "$final_path/var/lib/tomcat9/webapps" setfacl -n -R -m user:$app-guacd:- -m default:user:$app-guacd:- "$final_path/var/lib/tomcat9/" "$final_path/etc/guacamole/" "$final_path/etc/tomcat9/" diff --git a/scripts/upgrade b/scripts/upgrade index f468777..de05dcc 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -201,13 +201,13 @@ ynh_add_systemd_config --service="$app-tomcat" --template="tomcat.service" #================================================= # Set permissions on app files -chown -R root:root $final_path +chown -R nobody:nobody $final_path chmod -R o-rwx $final_path setfacl -n -R -m user:$app-guacd:rx -m default:user:$app-guacd:rx $final_path setfacl -n -R -m user:$app-tomcat:rx -m default:user:$app-tomcat:rx $final_path chown -R $app-guacd:$app-guacd "/var/log/$app/guacd/" chown -R $app-tomcat:$app-tomcat "/var/log/$app/tomcat/" -chown -R root:$app-tomcat "$final_path/etc/tomcat9/" "$final_path/etc/guacamole/" +chown -R nobody:$app-tomcat "$final_path/etc/tomcat9/" "$final_path/etc/guacamole/" chown -R "$app-tomcat":"$app-tomcat" "$final_path/var/lib/tomcat9/webapps" setfacl -n -R -m user:$app-guacd:- -m default:user:$app-guacd:- "$final_path/var/lib/tomcat9/" "$final_path/etc/guacamole/" "$final_path/etc/tomcat9/" From f20f57d6a62c3bbb867d0fe40a4c7dcc49576704 Mon Sep 17 00:00:00 2001 From: tituspijean Date: Wed, 20 Oct 2021 19:48:03 +0200 Subject: [PATCH 09/16] Follow linter advice on ynh_webpath_available --- scripts/restore | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/restore b/scripts/restore index 268876f..61927e0 100755 --- a/scripts/restore +++ b/scripts/restore @@ -38,8 +38,6 @@ db_user=$db_name #================================================= ynh_script_progression --message="Validating restoration parameters..." --weight=1 -ynh_webpath_available --domain=$domain --path_url=$path_url \ - || ynh_die --message="Path not available: ${domain}${path_url}" test ! -d $final_path \ || ynh_die --message="There is already a directory: $final_path " From 8e692fb67260be574b63fdac5aa6990e79d7e364 Mon Sep 17 00:00:00 2001 From: tituspijean Date: Wed, 20 Oct 2021 19:51:26 +0200 Subject: [PATCH 10/16] Appease linter on service security --- conf/guacd.service | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/conf/guacd.service b/conf/guacd.service index ea1c52a..3b30a0f 100644 --- a/conf/guacd.service +++ b/conf/guacd.service @@ -11,5 +11,33 @@ Restart=on-abnormal Environment="LD_LIBRARY_PATH=__FINALPATH__/lib:__FINALPATH__/usr/lib" Environment="GUACAMOLE_HOME=__FINALPATH__/etc/guacamole" +# Sandboxing options to harden security +# Details for these options: https://www.freedesktop.org/software/systemd/man/systemd.exec.html +NoNewPrivileges=yes +PrivateTmp=yes +PrivateDevices=yes +RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 +RestrictNamespaces=yes +RestrictRealtime=yes +DevicePolicy=closed +ProtectSystem=full +ProtectControlGroups=yes +ProtectKernelModules=yes +ProtectKernelTunables=yes +LockPersonality=yes +SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap + +# Denying access to capabilities that should not be relevant for webapps +# Doc: https://man7.org/linux/man-pages/man7/capabilities.7.html +CapabilityBoundingSet=~CAP_RAWIO CAP_MKNOD +CapabilityBoundingSet=~CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE +CapabilityBoundingSet=~CAP_SYS_BOOT CAP_SYS_TIME CAP_SYS_MODULE CAP_SYS_PACCT +CapabilityBoundingSet=~CAP_LEASE CAP_LINUX_IMMUTABLE CAP_IPC_LOCK +CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_WAKE_ALARM +CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG +CapabilityBoundingSet=~CAP_MAC_ADMIN CAP_MAC_OVERRIDE +CapabilityBoundingSet=~CAP_NET_ADMIN CAP_NET_BROADCAST CAP_NET_RAW +CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SYSLOG + [Install] WantedBy=multi-user.target From 7850d16052b332d70e41f6a3d1964b0fbf2081ba Mon Sep 17 00:00:00 2001 From: tituspijean Date: Thu, 21 Oct 2021 08:25:22 +0200 Subject: [PATCH 11/16] Fix chown nobody --- scripts/install | 2 +- scripts/restore | 2 +- scripts/upgrade | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/install b/scripts/install index d52648b..82f2412 100755 --- a/scripts/install +++ b/scripts/install @@ -226,7 +226,7 @@ ynh_add_systemd_config --service="$app-tomcat" --template="tomcat.service" #================================================= # Set permissions to app files -chown -R nobody:nobody $final_path +chown -R nobody $final_path chmod -R o-rwx $final_path setfacl -n -R -m user:$app-guacd:rx -m default:user:$app-guacd:rx $final_path setfacl -n -R -m user:$app-tomcat:rx -m default:user:$app-tomcat:rx $final_path diff --git a/scripts/restore b/scripts/restore index 61927e0..2cb58bf 100755 --- a/scripts/restore +++ b/scripts/restore @@ -108,7 +108,7 @@ fi #================================================= # Restore permissions on app files -chown -R nobody:nobody $final_path +chown -R nobody $final_path chmod -R o-rwx $final_path setfacl -n -R -m user:$app-guacd:rx -m default:user:$app-guacd:rx $final_path setfacl -n -R -m user:$app-tomcat:rx -m default:user:$app-tomcat:rx $final_path diff --git a/scripts/upgrade b/scripts/upgrade index de05dcc..8034f77 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -201,7 +201,7 @@ ynh_add_systemd_config --service="$app-tomcat" --template="tomcat.service" #================================================= # Set permissions on app files -chown -R nobody:nobody $final_path +chown -R nobody $final_path chmod -R o-rwx $final_path setfacl -n -R -m user:$app-guacd:rx -m default:user:$app-guacd:rx $final_path setfacl -n -R -m user:$app-tomcat:rx -m default:user:$app-tomcat:rx $final_path From 2fa6ef068ee859a81aa4583f686907e7e85a006c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 23 Oct 2021 14:48:03 +0200 Subject: [PATCH 12/16] Remove old CI badges in readme --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index 103fd6b..22dda41 100644 --- a/README.md +++ b/README.md @@ -29,11 +29,6 @@ The user that is configured as admin during install will have access to admin se Are LDAP and HTTP auth supported? **Yes** Can the app be used by multiple users? **Yes** -#### Supported architectures - -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/guacamole%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/guacamole/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/guacamole%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/guacamole/) - ## Links * Report a bug: https://github.com/YunoHost-Apps/guacamole_ynh/issues From da1c0d9c4fdedab4ebb059c201fef43ca91fa4be Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 23 Oct 2021 16:46:38 +0200 Subject: [PATCH 13/16] Fix disclaimer encoding making autoreadme crash --- doc/DISCLAIMER_fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/DISCLAIMER_fr.md b/doc/DISCLAIMER_fr.md index 439f20e..6247918 100644 --- a/doc/DISCLAIMER_fr.md +++ b/doc/DISCLAIMER_fr.md @@ -1,3 +1,3 @@ ## Configuration -L'utilisateur choisi comme admin durant le processus d'installation aura accès au paramétres d'administration dans le menu de configuration de l'application (sous le menu utilisateur). Le fichiers de configuration sont dans `/opt/yunohost/guacamole/etc/guacamole` (pour la première installation). +L'utilisateur choisi comme admin durant le processus d'installation aura accès au paramétres d'administration dans le menu de configuration de l'application (sous le menu utilisateur). Le fichiers de configuration sont dans `/opt/yunohost/guacamole/etc/guacamole` (pour la première installation). From 41a4014584f250ef8577c892bd7214c85af31d40 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sat, 23 Oct 2021 14:47:14 +0000 Subject: [PATCH 14/16] Auto-update README --- README.md | 44 +++++++++++++++++++++++--------------------- README_fr.md | 51 +++++++++++++++++++++------------------------------ 2 files changed, 44 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 22dda41..f7f4ada 100644 --- a/README.md +++ b/README.md @@ -1,46 +1,46 @@ + + # Apache Guacamole for YunoHost [![Integration level](https://dash.yunohost.org/integration/guacamole.svg)](https://dash.yunohost.org/appci/app/guacamole) ![](https://ci-apps.yunohost.org/ci/badges/guacamole.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/guacamole.maintain.svg) -[![Install guacamole with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=guacamole) +[![Install Apache Guacamole with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=guacamole) *[Lire ce readme en français.](./README_fr.md)* -> *This package allows you to install guacamole quickly and simply on a YunoHost server. +> *This package allows you to install Apache Guacamole quickly and simply on a YunoHost server. If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* ## Overview -Apache Guacamole is a clientless remote desktop gateway. You can use it to access your server, or other machines, via protocols like VNC, RDP, SSH, and SFTP. It supports multiple users, and you can configure which useres are allowed to access what connections. -**Shipped version:** 1.3.0 +Clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH. + +**Shipped version:** 1.3.0~ynh5 + + ## Screenshots -![](https://guacamole.apache.org/images/demo-thumbnail.jpg) +![](./doc/screenshots/screenshot1.jpg) + +## Disclaimers / important information ## Configuration The user that is configured as admin during install will have access to admin settings in the settings menu of the app (under the user menu). Configuration files are in `/opt/yunohost/guacamole/etc/guacamole` (for the first install). -## Documentation - * Official documentation: https://guacamole.apache.org/doc/gug/ +## Documentation and resources -#### Multi-user support - -Are LDAP and HTTP auth supported? **Yes** -Can the app be used by multiple users? **Yes** - -## Links - - * Report a bug: https://github.com/YunoHost-Apps/guacamole_ynh/issues - * App website: https://guacamole.apache.org/ - * Upstream app repository: https://github.com/search?utf8=%E2%9C%93&q=repo%3Aapache%2Fguacamole-server+repo%3Aapache%2Fguacamole-client+repo%3Aapache%2Fguacamole-website&type=Repositories&ref=searchresults - * YunoHost website: https://yunohost.org/ - ---- +* Official app website: https://guacamole.apache.org/ +* Official admin documentation: https://guacamole.apache.org/doc/gug/ +* Upstream app code repository: https://github.com/search?utf8=%E2%9C%93&q=repo%3Aapache%2Fguacamole-server+repo%3Aapache%2Fguacamole-client+repo%3Aapache%2Fguacamole-website&type=Repositories&ref=searchresults +* YunoHost documentation for this app: https://yunohost.org/app_guacamole +* Report a bug: https://github.com/YunoHost-Apps/guacamole_ynh/issues ## Developer info -**Only if you want to use a testing branch for coding, instead of merging directly into master.** Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/guacamole_ynh/tree/testing). To try the testing branch, please proceed like that. @@ -49,3 +49,5 @@ sudo yunohost app install https://github.com/YunoHost-Apps/guacamole_ynh/tree/te or sudo yunohost app upgrade guacamole -u https://github.com/YunoHost-Apps/guacamole_ynh/tree/testing --debug ``` + +**More info regarding app packaging:** https://yunohost.org/packaging_apps \ No newline at end of file diff --git a/README_fr.md b/README_fr.md index a4934ad..4c2f188 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,53 +1,42 @@ # Apache Guacamole pour YunoHost [![Niveau d'intégration](https://dash.yunohost.org/integration/guacamole.svg)](https://dash.yunohost.org/appci/app/guacamole) ![](https://ci-apps.yunohost.org/ci/badges/guacamole.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/guacamole.maintain.svg) -[![Installer guacamole avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=guacamole) +[![Installer Apache Guacamole avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=guacamole) -*[Read this readme in english.](./README.md)* +*[Read this readme in english.](./README.md)* +*[Lire ce readme en français.](./README_fr.md)* -> *Ce package vous permet d'installer guacamole rapidement et simplement sur un serveur YunoHost. -Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install) pour apprendre comment l'installer.* +> *Ce package vous permet d'installer Apache Guacamole rapidement et simplement sur un serveur YunoHost. +Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour savoir comment l'installer et en profiter.* ## Vue d'ensemble -Apache Guacamole est un service de bureau à distance sans client. Vous pouvez l'ulitiser pour accéder à votre serveur, ou d'autres machines, via des protocoles comme VNC, RDP, SSH, et SFTP. Apache Guacamole fonctionne avec plusieurs utilisateurs, et vous pouvez choisir quels utilisateurs peuvent accéder à quelles connections. -**Version incluse :** 1.3.0 +Service de bureau à distance sans client. Fonctionne avec des protocoles standard comme VNC, RDP, et SSH. + +**Version incluse :** 1.3.0~ynh5 + + ## Captures d'écran -![](https://guacamole.apache.org/images/demo-thumbnail.jpg) +![](./doc/screenshots/screenshot1.jpg) + +## Avertissements / informations importantes ## Configuration L'utilisateur choisi comme admin durant le processus d'installation aura accès au paramétres d'administration dans le menu de configuration de l'application (sous le menu utilisateur). Le fichiers de configuration sont dans `/opt/yunohost/guacamole/etc/guacamole` (pour la première installation). -## Documentation +## Documentations et ressources - * Documentation officielle : https://guacamole.apache.org/doc/gug/ - -#### Support multi-utilisateur - -* L'authentification LDAP et HTTP est-elle prise en charge ? **Oui** -* L'application peut-elle être utilisée par plusieurs utilisateurs ? **Oui** - -#### Architectures supportées - -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/guacamole%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/guacamole/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/guacamole%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/guacamole/) - - -## Liens - - * Signaler un bug : https://github.com/YunoHost-Apps/guacamole_ynh/issues - * Site de l'application : https://guacamole.apache.org// - * Dépôt de l'application principale : https://github.com/search?utf8=%E2%9C%93&q=repo%3Aapache%2Fguacamole-server+repo%3Aapache%2Fguacamole-client+repo%3Aapache%2Fguacamole-website&type=Repositories&ref=searchresults - * Site web YunoHost : https://yunohost.org/ - ---- +* Site officiel de l'app : https://guacamole.apache.org/ +* Documentation officielle de l'admin : https://guacamole.apache.org/doc/gug/ +* Dépôt de code officiel de l'app : https://github.com/search?utf8=%E2%9C%93&q=repo%3Aapache%2Fguacamole-server+repo%3Aapache%2Fguacamole-client+repo%3Aapache%2Fguacamole-website&type=Repositories&ref=searchresults +* Documentation YunoHost pour cette app : https://yunohost.org/app_guacamole +* Signaler un bug : https://github.com/YunoHost-Apps/guacamole_ynh/issues ## Informations pour les développeurs -**Seulement si vous voulez utiliser une branche de test pour le codage, au lieu de fusionner directement dans la banche principale.** Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/guacamole_ynh/tree/testing). Pour essayer la branche testing, procédez comme suit. @@ -56,3 +45,5 @@ sudo yunohost app install https://github.com/YunoHost-Apps/guacamole_ynh/tree/te ou sudo yunohost app upgrade guacamole -u https://github.com/YunoHost-Apps/guacamole_ynh/tree/testing --debug ``` + +**Plus d'infos sur le packaging d'applications :** https://yunohost.org/packaging_apps \ No newline at end of file From 3a87f282242bc95508574ee3ad84c3e3547f7db3 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 14 Nov 2021 17:52:06 +0100 Subject: [PATCH 15/16] Bump package version --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index a9fc38a..08dd0cc 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH.", "fr": "Service de bureau à distance sans client. Fonctionne avec des protocoles standard comme VNC, RDP, et SSH." }, - "version": "1.3.0~ynh5", + "version": "1.3.0~ynh6", "url": "https://guacamole.apache.org/", "upstream": { "license": "Apache-2.0", From 4ff33e79e8e48a27ddda1d268780f5a5d5f05a82 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sun, 14 Nov 2021 16:52:08 +0000 Subject: [PATCH 16/16] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f7f4ada..199343e 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH. -**Shipped version:** 1.3.0~ynh5 +**Shipped version:** 1.3.0~ynh6 diff --git a/README_fr.md b/README_fr.md index 4c2f188..a3d36fb 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Service de bureau à distance sans client. Fonctionne avec des protocoles standard comme VNC, RDP, et SSH. -**Version incluse :** 1.3.0~ynh5 +**Version incluse :** 1.3.0~ynh6