From 1b8eab1058a4f9b57c0661aabbd95cd4b969af42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josu=C3=A9=20Tille?= Date: Tue, 30 Apr 2024 22:36:17 +0200 Subject: [PATCH 1/6] Add jinja helper for apps --- scripts/change_url | 5 +- scripts/experimental_helper.sh | 135 +++++++++++++++++++++++++++++++++ scripts/install | 8 +- 3 files changed, 141 insertions(+), 7 deletions(-) create mode 100644 scripts/experimental_helper.sh diff --git a/scripts/change_url b/scripts/change_url index 2eb3b36..c711c18 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -1,5 +1,6 @@ #!/bin/bash +source ./experimental_helper.sh source _common.sh source /usr/share/yunohost/helpers @@ -7,9 +8,7 @@ ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app ynh_change_url_nginx_config -ynh_backup_if_checksum_is_different --file="$install_dir/coin/settings_local.py" -ynh_render_template ../conf/local.py.j2 "$install_dir/coin/settings_local.py" -ynh_store_file_checksum --file="$install_dir/coin/settings_local.py" +ynh_add_jinja_config --template=local.py.j2 --destination="$install_dir/coin/settings_local.py" chmod 400 "$install_dir/coin/settings_local.py" chown $app "$install_dir/coin/settings_local.py" diff --git a/scripts/experimental_helper.sh b/scripts/experimental_helper.sh new file mode 100644 index 0000000..bfdd78d --- /dev/null +++ b/scripts/experimental_helper.sh @@ -0,0 +1,135 @@ +# Create a dedicated config file from a jinja template +# +# usage: ynh_add_jinja_config --template="template" --destination="destination" +# | arg: -t, --template= - Template config file to use +# | arg: -d, --destination= - Destination of the config file +# | arg: -i, --ignore_vars= - List separated by space of script variables to ignore and don't pass in the jinja context. +# | This could be useful mainly for special share which can't be retried by reference name (like the array). +# +# examples: +# ynh_add_jinja_config --template="app.conf" --destination="$install_dir/app.conf" +# ynh_add_jinja_config --template="app-env" --destination="$install_dir/app-env" --ignore_vars="complex_array yolo" +# +# The template can be by default the name of a file in the conf directory +# +# The helper will verify the checksum and backup the destination file +# if it's different before applying the new template. +# +# And it will calculate and store the destination file checksum +# into the app settings when configuration is done. +# +## +## About the variables passed to the template: +## +# +# All variable defined in the script are available into the template (as string) except someone described below. +# If a variable make crash the helper for some reason (by example if the variable is of type array) +# or you just want to don't pass a specific variable for some other reason you can add it in the '--ignore_vars=' parameter as described above. +# Here are the list of ignored variable and so there won't never be available in the template: +# - All system environment variable like (TERM, USER, PATH, LANG, etc). +# If you need someone you just need to declare an other variable with the same value. +# Note that all Yunohost variable whose name begins by 'YNH_' are available and can be used in the template. +# - This following list: +# legacy_args args_array template destination ignore_vars template_path python_env_var ignore_var_regex +# progress_scale progress_string0 progress_string1 progress_string2 +# old changed binds types file_hash formats +# +## +## Usage in templates: +## +# +# For a full documentation of the template you can refer to: https://jinja.palletsprojects.com/en/3.1.x/templates/ +# In Yunohost context there are no really some specificity except that all variable passed are of type string. +# So here are some example of recommended usage: +# +# If you need a conditional block +# +# {% if should_my_block_be_shown == 'true' %} +# ... +# {% endif %} +# +# or +# +# {% if should_my_block_be_shown == '1' %} +# ... +# {% endif %} +# +# If you need to iterate with loop: +# +# {% for yolo in var_with_multiline_value.splitlines() %} +# ... +# {% endfor %} +# +# or +# +# {% for jail in my_var_with_coma.split(',') %} +# ... +# {% endfor %} +# +ynh_add_jinja_config() { + # Declare an array to define the options of this helper. + local legacy_args=tdi + local -A args_array=([t]=template= [d]=destination= [i]=ignore_vars= ) + local template + local destination + local ignore_vars + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + local template_path + + # + ## List of all vars ignored and not passed to the template + # WARNING Update the list on the helper documentation at the top of the helper, if you change this list + # + + # local vars used in the helper + ignore_vars+=" legacy_args args_array template destination ignore_vars template_path python_env_var ignore_var_regex" + # yunohost helpers + ignore_vars+=" progress_scale progress_string0 progress_string1 progress_string2" + # Arrays used in config panel + ignore_vars+=" old changed binds types file_hash formats" + + if [ -f "$YNH_APP_BASEDIR/conf/$template" ]; then + template_path="$YNH_APP_BASEDIR/conf/$template" + elif [ -f "$template" ]; then + template_path=$template + else + ynh_die --message="The provided template $template doesn't exist" + fi + + ynh_backup_if_checksum_is_different --file="$destination" + + # Make sure to set the permissions before we copy the file + # This is to cover a case where an attacker could have + # created a file beforehand to have control over it + # (cp won't overwrite ownership / modes by default...) + touch "$destination" + chown root:root "$destination" + chmod 640 "$destination" + + local python_env_var='' + local ignore_var_regex + ignore_var_regex="$(echo "$ignore_vars" | sed -E 's@^\s*(.*\w)\s*$@\1@g' | sed -E 's@(\s+)@|@g')" + while read -r one_var; do + # Blacklist of var to not pass to template + if { [[ "$one_var" =~ ^[A-Z0-9_]+$ ]] && [[ "$one_var" != YNH_* ]]; } \ + || [[ "$one_var" =~ ^($ignore_var_regex)$ ]]; then + continue + fi + # Well python is very bad for the last character on raw string + # https://stackoverflow.com/questions/647769/why-cant-pythons-raw-string-literals-end-with-a-single-backslash + # So the solution here is to add one last char '-' so we know what it is + # and we are sure that it not \ or ' or something else which will be problematic with python + # And then we remove it while we are processing + python_env_var+="$one_var=r'''${!one_var}-'''[:-1]," + done <<< "$(compgen -v)" + + _ynh_apply_default_permissions "$destination" + ( + python3 -c 'import os, sys, jinja2; sys.stdout.write( + jinja2.Template(source=sys.stdin.read(), + undefined=jinja2.StrictUndefined, + ).render('"$python_env_var"'));' <"$template_path" >"$destination" + ) + ynh_store_file_checksum --file="$destination" +} diff --git a/scripts/install b/scripts/install index e5a75ee..2be461a 100644 --- a/scripts/install +++ b/scripts/install @@ -1,9 +1,10 @@ #!/bin/bash +source ./experimental_helper.sh source _common.sh source /usr/share/yunohost/helpers -export secret=$(ynh_string_random 24) +secret=$(ynh_string_random 24) ynh_app_setting_set --app=$app --key=secret --value=$secret #================================================= @@ -37,10 +38,9 @@ popd #================================================= ynh_script_progression --message="Configuring application..." -export prefix="${path#"/"}/" +prefix="${path#"/"}/" prefix=${prefix%"/"} -ynh_render_template ../conf/local.py.j2 "$install_dir/coin/settings_local.py" -ynh_store_file_checksum --file="$install_dir/coin/settings_local.py" +ynh_add_jinja_config --template=local.py.j2 --destination="$install_dir/coin/settings_local.py" chmod 400 "$install_dir/coin/settings_local.py" chown $app "$install_dir/coin/settings_local.py" From e176a39b72479b5f16c2b3d08df1260bc8601b2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josu=C3=A9=20Tille?= Date: Wed, 1 May 2024 11:13:11 +0200 Subject: [PATCH 2/6] Fix change url --- scripts/change_url | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/change_url b/scripts/change_url index c711c18..6787012 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -8,6 +8,8 @@ ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app ynh_change_url_nginx_config +prefix="${path#"/"}/" +prefix=${prefix%"/"} ynh_add_jinja_config --template=local.py.j2 --destination="$install_dir/coin/settings_local.py" chmod 400 "$install_dir/coin/settings_local.py" From 77b100d39e8492ca067fa8888c03d256a5515602 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josu=C3=A9=20Tille?= Date: Tue, 4 Jun 2024 21:02:42 +0200 Subject: [PATCH 3/6] Use the official jinja helper --- manifest.toml | 2 +- scripts/change_url | 3 +- scripts/experimental_helper.sh | 135 --------------------------------- scripts/install | 3 +- 4 files changed, 3 insertions(+), 140 deletions(-) delete mode 100644 scripts/experimental_helper.sh diff --git a/manifest.toml b/manifest.toml index 218bf3c..02f3b3d 100644 --- a/manifest.toml +++ b/manifest.toml @@ -17,7 +17,7 @@ website = "https://code.ffdn.org/FFDN/coin" code = "https://code.ffdn.org/ffdn/coin" [integration] -yunohost = ">= 11.0.0" +yunohost = ">= 11.2.13" architectures = "all" multi_instance = false ldap = false diff --git a/scripts/change_url b/scripts/change_url index 6787012..5da12ad 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -1,6 +1,5 @@ #!/bin/bash -source ./experimental_helper.sh source _common.sh source /usr/share/yunohost/helpers @@ -10,7 +9,7 @@ ynh_change_url_nginx_config prefix="${path#"/"}/" prefix=${prefix%"/"} -ynh_add_jinja_config --template=local.py.j2 --destination="$install_dir/coin/settings_local.py" +ynh_add_config --jinja --template=local.py.j2 --destination="$install_dir/coin/settings_local.py" chmod 400 "$install_dir/coin/settings_local.py" chown $app "$install_dir/coin/settings_local.py" diff --git a/scripts/experimental_helper.sh b/scripts/experimental_helper.sh deleted file mode 100644 index bfdd78d..0000000 --- a/scripts/experimental_helper.sh +++ /dev/null @@ -1,135 +0,0 @@ -# Create a dedicated config file from a jinja template -# -# usage: ynh_add_jinja_config --template="template" --destination="destination" -# | arg: -t, --template= - Template config file to use -# | arg: -d, --destination= - Destination of the config file -# | arg: -i, --ignore_vars= - List separated by space of script variables to ignore and don't pass in the jinja context. -# | This could be useful mainly for special share which can't be retried by reference name (like the array). -# -# examples: -# ynh_add_jinja_config --template="app.conf" --destination="$install_dir/app.conf" -# ynh_add_jinja_config --template="app-env" --destination="$install_dir/app-env" --ignore_vars="complex_array yolo" -# -# The template can be by default the name of a file in the conf directory -# -# The helper will verify the checksum and backup the destination file -# if it's different before applying the new template. -# -# And it will calculate and store the destination file checksum -# into the app settings when configuration is done. -# -## -## About the variables passed to the template: -## -# -# All variable defined in the script are available into the template (as string) except someone described below. -# If a variable make crash the helper for some reason (by example if the variable is of type array) -# or you just want to don't pass a specific variable for some other reason you can add it in the '--ignore_vars=' parameter as described above. -# Here are the list of ignored variable and so there won't never be available in the template: -# - All system environment variable like (TERM, USER, PATH, LANG, etc). -# If you need someone you just need to declare an other variable with the same value. -# Note that all Yunohost variable whose name begins by 'YNH_' are available and can be used in the template. -# - This following list: -# legacy_args args_array template destination ignore_vars template_path python_env_var ignore_var_regex -# progress_scale progress_string0 progress_string1 progress_string2 -# old changed binds types file_hash formats -# -## -## Usage in templates: -## -# -# For a full documentation of the template you can refer to: https://jinja.palletsprojects.com/en/3.1.x/templates/ -# In Yunohost context there are no really some specificity except that all variable passed are of type string. -# So here are some example of recommended usage: -# -# If you need a conditional block -# -# {% if should_my_block_be_shown == 'true' %} -# ... -# {% endif %} -# -# or -# -# {% if should_my_block_be_shown == '1' %} -# ... -# {% endif %} -# -# If you need to iterate with loop: -# -# {% for yolo in var_with_multiline_value.splitlines() %} -# ... -# {% endfor %} -# -# or -# -# {% for jail in my_var_with_coma.split(',') %} -# ... -# {% endfor %} -# -ynh_add_jinja_config() { - # Declare an array to define the options of this helper. - local legacy_args=tdi - local -A args_array=([t]=template= [d]=destination= [i]=ignore_vars= ) - local template - local destination - local ignore_vars - # Manage arguments with getopts - ynh_handle_getopts_args "$@" - local template_path - - # - ## List of all vars ignored and not passed to the template - # WARNING Update the list on the helper documentation at the top of the helper, if you change this list - # - - # local vars used in the helper - ignore_vars+=" legacy_args args_array template destination ignore_vars template_path python_env_var ignore_var_regex" - # yunohost helpers - ignore_vars+=" progress_scale progress_string0 progress_string1 progress_string2" - # Arrays used in config panel - ignore_vars+=" old changed binds types file_hash formats" - - if [ -f "$YNH_APP_BASEDIR/conf/$template" ]; then - template_path="$YNH_APP_BASEDIR/conf/$template" - elif [ -f "$template" ]; then - template_path=$template - else - ynh_die --message="The provided template $template doesn't exist" - fi - - ynh_backup_if_checksum_is_different --file="$destination" - - # Make sure to set the permissions before we copy the file - # This is to cover a case where an attacker could have - # created a file beforehand to have control over it - # (cp won't overwrite ownership / modes by default...) - touch "$destination" - chown root:root "$destination" - chmod 640 "$destination" - - local python_env_var='' - local ignore_var_regex - ignore_var_regex="$(echo "$ignore_vars" | sed -E 's@^\s*(.*\w)\s*$@\1@g' | sed -E 's@(\s+)@|@g')" - while read -r one_var; do - # Blacklist of var to not pass to template - if { [[ "$one_var" =~ ^[A-Z0-9_]+$ ]] && [[ "$one_var" != YNH_* ]]; } \ - || [[ "$one_var" =~ ^($ignore_var_regex)$ ]]; then - continue - fi - # Well python is very bad for the last character on raw string - # https://stackoverflow.com/questions/647769/why-cant-pythons-raw-string-literals-end-with-a-single-backslash - # So the solution here is to add one last char '-' so we know what it is - # and we are sure that it not \ or ' or something else which will be problematic with python - # And then we remove it while we are processing - python_env_var+="$one_var=r'''${!one_var}-'''[:-1]," - done <<< "$(compgen -v)" - - _ynh_apply_default_permissions "$destination" - ( - python3 -c 'import os, sys, jinja2; sys.stdout.write( - jinja2.Template(source=sys.stdin.read(), - undefined=jinja2.StrictUndefined, - ).render('"$python_env_var"'));' <"$template_path" >"$destination" - ) - ynh_store_file_checksum --file="$destination" -} diff --git a/scripts/install b/scripts/install index 2be461a..438438d 100644 --- a/scripts/install +++ b/scripts/install @@ -1,6 +1,5 @@ #!/bin/bash -source ./experimental_helper.sh source _common.sh source /usr/share/yunohost/helpers @@ -40,7 +39,7 @@ ynh_script_progression --message="Configuring application..." prefix="${path#"/"}/" prefix=${prefix%"/"} -ynh_add_jinja_config --template=local.py.j2 --destination="$install_dir/coin/settings_local.py" +ynh_add_config --jinja --template=local.py.j2 --destination="$install_dir/coin/settings_local.py" chmod 400 "$install_dir/coin/settings_local.py" chown $app "$install_dir/coin/settings_local.py" From af4455fd234fc1108e75cca0665543203e74cea1 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Wed, 5 Jun 2024 10:27:14 +0000 Subject: [PATCH 4/6] Auto-update READMEs --- ALL_README.md | 1 + README_es.md | 58 +++++++++++++++++++++++++++++++++++++++++++++++ README_zh_Hans.md | 2 +- 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 README_es.md diff --git a/ALL_README.md b/ALL_README.md index a01b345..152f2e7 100644 --- a/ALL_README.md +++ b/ALL_README.md @@ -1,6 +1,7 @@ # All available README files by language - [Read the README in English](README.md) +- [Lea el README en español](README_es.md) - [Irakurri README euskaraz](README_eu.md) - [Lire le README en français](README_fr.md) - [Le o README en galego](README_gl.md) diff --git a/README_es.md b/README_es.md new file mode 100644 index 0000000..6680ebb --- /dev/null +++ b/README_es.md @@ -0,0 +1,58 @@ + + +# Coin para Yunohost + +[![Nivel de integración](https://dash.yunohost.org/integration/coin.svg)](https://dash.yunohost.org/appci/app/coin) ![Estado funcional](https://ci-apps.yunohost.org/ci/badges/coin.status.svg) ![Estado En Mantención](https://ci-apps.yunohost.org/ci/badges/coin.maintain.svg) + +[![Instalar Coin con Yunhost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=coin) + +*[Leer este README en otros idiomas.](./ALL_README.md)* + +> *Este paquete le permite instalarCoin rapidamente y simplement en un servidor YunoHost.* +> *Si no tiene YunoHost, visita [the guide](https://yunohost.org/install) para aprender como instalarla.* + +## Descripción general + +COIN is an Information System designed for associative ISPs in the FFDN. + +### Features + +- Provide a nice, clean UI for members +- Manage memberships +- Handle service requests for VPN, VPS, Housing, external accounts, etc, + - including IP pools management + - custom hooks can be added to interface with the actual infrastructure and provision services from the admin + - members can get status info regarding their services + - handle invoices, send reminders, import payment from bank, derive a member balance +- Optional features: mailing list, hardware provisionning + + +**Versión actual:** 20231216~ynh1 + +## Capturas + +![Captura de Coin](./doc/screenshots/screenshot.png) + +## Documentaciones y recursos + +- Sitio web oficial: +- Repositorio del código fuente oficial de la aplicación : +- Catálogo YunoHost: +- Reportar un error: + +## Información para desarrolladores + +Por favor enviar sus correcciones a la [`branch testing`](https://github.com/YunoHost-Apps/coin_ynh/tree/testing + +Para probar la rama `testing`, sigue asÍ: + +```bash +sudo yunohost app install https://github.com/YunoHost-Apps/coin_ynh/tree/testing --debug +o +sudo yunohost app upgrade coin -u https://github.com/YunoHost-Apps/coin_ynh/tree/testing --debug +``` + +**Mas informaciones sobre el empaquetado de aplicaciones:** diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 3c4d059..0de766c 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -3,7 +3,7 @@ 请勿手动编辑。 --> -# YunoHost 的 Coin +# YunoHost 上的 Coin [![集成程度](https://dash.yunohost.org/integration/coin.svg)](https://dash.yunohost.org/appci/app/coin) ![工作状态](https://ci-apps.yunohost.org/ci/badges/coin.status.svg) ![维护状态](https://ci-apps.yunohost.org/ci/badges/coin.maintain.svg) From 9cc70f3c9c913868d4e6c0bd29a0842e7b111b2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josu=C3=A9=20Tille?= Date: Sat, 29 Jun 2024 23:27:35 +0200 Subject: [PATCH 5/6] Remove prefix definition and use hard coded value --- conf/local.py.j2 | 3 ++- scripts/change_url | 2 -- scripts/install | 2 -- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/conf/local.py.j2 b/conf/local.py.j2 index 477fd56..651d83c 100644 --- a/conf/local.py.j2 +++ b/conf/local.py.j2 @@ -7,7 +7,8 @@ DEBUG = TEMPLATE_DEBUG = False ALLOWED_HOSTS = ['{{ domain }}'] -URL_PREFIX = '{{ prefix }}' +# Prefix is hard coded for now as the app can only be installed on whole domain +URL_PREFIX = '' STATIC_ROOT = '{{ install_dir }}/static' NOTIFICATION_EMAILS = ['{{ email }}'] DEFAULT_FROM_EMAIL = 'notifier@{{ domain }}' diff --git a/scripts/change_url b/scripts/change_url index 5da12ad..f990470 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -7,8 +7,6 @@ ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app ynh_change_url_nginx_config -prefix="${path#"/"}/" -prefix=${prefix%"/"} ynh_add_config --jinja --template=local.py.j2 --destination="$install_dir/coin/settings_local.py" chmod 400 "$install_dir/coin/settings_local.py" diff --git a/scripts/install b/scripts/install index 438438d..3133d5b 100644 --- a/scripts/install +++ b/scripts/install @@ -37,8 +37,6 @@ popd #================================================= ynh_script_progression --message="Configuring application..." -prefix="${path#"/"}/" -prefix=${prefix%"/"} ynh_add_config --jinja --template=local.py.j2 --destination="$install_dir/coin/settings_local.py" chmod 400 "$install_dir/coin/settings_local.py" chown $app "$install_dir/coin/settings_local.py" From 5b67a845fbeead8b3d8b52d783ace2cec4bf8084 Mon Sep 17 00:00:00 2001 From: yunohost-bot Date: Sat, 29 Jun 2024 21:27:46 +0000 Subject: [PATCH 6/6] Auto-update READMEs --- README.md | 2 +- README_es.md | 2 +- README_eu.md | 2 +- README_fr.md | 2 +- README_gl.md | 2 +- README_zh_Hans.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 2f1b8e0..5370751 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ It shall NOT be edited by hand. # Coin for YunoHost -[![Integration level](https://dash.yunohost.org/integration/coin.svg)](https://dash.yunohost.org/appci/app/coin) ![Working status](https://ci-apps.yunohost.org/ci/badges/coin.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/coin.maintain.svg) +[![Integration level](https://dash.yunohost.org/integration/coin.svg)](https://ci-apps.yunohost.org/ci/apps/coin/) ![Working status](https://ci-apps.yunohost.org/ci/badges/coin.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/coin.maintain.svg) [![Install Coin with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=coin) diff --git a/README_es.md b/README_es.md index 6680ebb..4312fd2 100644 --- a/README_es.md +++ b/README_es.md @@ -5,7 +5,7 @@ No se debe editar a mano. # Coin para Yunohost -[![Nivel de integración](https://dash.yunohost.org/integration/coin.svg)](https://dash.yunohost.org/appci/app/coin) ![Estado funcional](https://ci-apps.yunohost.org/ci/badges/coin.status.svg) ![Estado En Mantención](https://ci-apps.yunohost.org/ci/badges/coin.maintain.svg) +[![Nivel de integración](https://dash.yunohost.org/integration/coin.svg)](https://ci-apps.yunohost.org/ci/apps/coin/) ![Estado funcional](https://ci-apps.yunohost.org/ci/badges/coin.status.svg) ![Estado En Mantención](https://ci-apps.yunohost.org/ci/badges/coin.maintain.svg) [![Instalar Coin con Yunhost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=coin) diff --git a/README_eu.md b/README_eu.md index 16c7e75..194a3f4 100644 --- a/README_eu.md +++ b/README_eu.md @@ -5,7 +5,7 @@ EZ editatu eskuz. # Coin YunoHost-erako -[![Integrazio maila](https://dash.yunohost.org/integration/coin.svg)](https://dash.yunohost.org/appci/app/coin) ![Funtzionamendu egoera](https://ci-apps.yunohost.org/ci/badges/coin.status.svg) ![Mantentze egoera](https://ci-apps.yunohost.org/ci/badges/coin.maintain.svg) +[![Integrazio maila](https://dash.yunohost.org/integration/coin.svg)](https://ci-apps.yunohost.org/ci/apps/coin/) ![Funtzionamendu egoera](https://ci-apps.yunohost.org/ci/badges/coin.status.svg) ![Mantentze egoera](https://ci-apps.yunohost.org/ci/badges/coin.maintain.svg) [![Instalatu Coin YunoHost-ekin](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=coin) diff --git a/README_fr.md b/README_fr.md index 3d8b7a3..4f010d7 100644 --- a/README_fr.md +++ b/README_fr.md @@ -5,7 +5,7 @@ Il NE doit PAS être modifié à la main. # Coin pour YunoHost -[![Niveau d’intégration](https://dash.yunohost.org/integration/coin.svg)](https://dash.yunohost.org/appci/app/coin) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/coin.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/coin.maintain.svg) +[![Niveau d’intégration](https://dash.yunohost.org/integration/coin.svg)](https://ci-apps.yunohost.org/ci/apps/coin/) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/coin.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/coin.maintain.svg) [![Installer Coin avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=coin) diff --git a/README_gl.md b/README_gl.md index f27d2b3..f1d486a 100644 --- a/README_gl.md +++ b/README_gl.md @@ -5,7 +5,7 @@ NON debe editarse manualmente. # Coin para YunoHost -[![Nivel de integración](https://dash.yunohost.org/integration/coin.svg)](https://dash.yunohost.org/appci/app/coin) ![Estado de funcionamento](https://ci-apps.yunohost.org/ci/badges/coin.status.svg) ![Estado de mantemento](https://ci-apps.yunohost.org/ci/badges/coin.maintain.svg) +[![Nivel de integración](https://dash.yunohost.org/integration/coin.svg)](https://ci-apps.yunohost.org/ci/apps/coin/) ![Estado de funcionamento](https://ci-apps.yunohost.org/ci/badges/coin.status.svg) ![Estado de mantemento](https://ci-apps.yunohost.org/ci/badges/coin.maintain.svg) [![Instalar Coin con YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=coin) diff --git a/README_zh_Hans.md b/README_zh_Hans.md index 0de766c..20e90d8 100644 --- a/README_zh_Hans.md +++ b/README_zh_Hans.md @@ -5,7 +5,7 @@ # YunoHost 上的 Coin -[![集成程度](https://dash.yunohost.org/integration/coin.svg)](https://dash.yunohost.org/appci/app/coin) ![工作状态](https://ci-apps.yunohost.org/ci/badges/coin.status.svg) ![维护状态](https://ci-apps.yunohost.org/ci/badges/coin.maintain.svg) +[![集成程度](https://dash.yunohost.org/integration/coin.svg)](https://ci-apps.yunohost.org/ci/apps/coin/) ![工作状态](https://ci-apps.yunohost.org/ci/badges/coin.status.svg) ![维护状态](https://ci-apps.yunohost.org/ci/badges/coin.maintain.svg) [![使用 YunoHost 安装 Coin](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=coin)