From f93e2b307904d1ac5c6dd86c4bf52cc22fda48d2 Mon Sep 17 00:00:00 2001 From: Julien Jershon Date: Sat, 5 Oct 2019 09:55:03 +0200 Subject: [PATCH 01/14] Better error message for invalid email domain. Fix https://github.com/YunoHost/issues/issues/1365. --- locales/en.json | 2 +- locales/fr.json | 2 +- locales/pt.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/locales/en.json b/locales/en.json index 98cbf22e9..2069ee6a6 100644 --- a/locales/en.json +++ b/locales/en.json @@ -286,7 +286,7 @@ "ldap_initialized": "LDAP initialized", "license_undefined": "undefined", "mail_alias_remove_failed": "Could not remove e-mail alias '{mail:s}'", - "mail_domain_unknown": "Unknown e-mail address for domain '{domain:s}'", + "mail_domain_unknown": "Invalid e-mail address for domain '{domain:s}'. Please, use a domain administrated by this server.", "mail_forward_remove_failed": "Could not remove e-mail forwarding '{mail:s}'", "mailbox_disabled": "E-mail turned off for user {user:s}", "mailbox_used_space_dovecot_down": "The Dovecot mailbox service needs to be up, if you want to fetch used mailbox space", diff --git a/locales/fr.json b/locales/fr.json index 8bffec8b2..7a2d299f8 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -120,7 +120,7 @@ "ldap_initialized": "L’annuaire LDAP initialisé", "license_undefined": "indéfinie", "mail_alias_remove_failed": "Impossible de supprimer l’alias de courriel '{mail:s}'", - "mail_domain_unknown": "Le domaine '{domain:s}' pour l'adresse de courriel est inconnu", + "mail_domain_unknown": "Le domaine '{domain:s}' de cette adress de courriel n'est pas valide. Merci d'utiliser un domain administré par ce serveur.", "mail_forward_remove_failed": "Impossible de supprimer le courriel de transfert '{mail:s}'", "maindomain_change_failed": "Impossible de modifier le domaine principal", "maindomain_changed": "Le domaine principal modifié", diff --git a/locales/pt.json b/locales/pt.json index 80a0d5ddd..b8c9d2eb3 100644 --- a/locales/pt.json +++ b/locales/pt.json @@ -72,7 +72,7 @@ "ldap_initialized": "LDAP inicializada com êxito", "license_undefined": "indefinido", "mail_alias_remove_failed": "Não foi possível remover a etiqueta de correio '{mail:s}'", - "mail_domain_unknown": "Domínio de endereço de correio desconhecido '{domain:s}'", + "mail_domain_unknown": "Domínio de endereço de correio '{domain:s}' inválido. Por favor, usa um domínio administrado per esse servidor.", "mail_forward_remove_failed": "Não foi possível remover o reencaminhamento de correio '{mail:s}'", "maindomain_change_failed": "Incapaz alterar o domínio raiz", "maindomain_changed": "Domínio raiz alterado com êxito", From 77960fd40535df3ab7e9f5f19e815742b5bcb502 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 16 Oct 2019 16:40:26 +0200 Subject: [PATCH 02/14] Create FUNDING.yml --- .github/FUNDING.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..c3b460087 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,4 @@ +# These are supported funding model platforms + +custom: https://donate.yunohost.org +liberapay: YunoHost From 6be15a62880338c007bb426007bfba626112e5bf Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 16 Oct 2019 17:32:19 +0200 Subject: [PATCH 03/14] Simplify the README, add cool shiny logo, badges and screenshots --- README.md | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index b860c27d7..5fb72e260 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,27 @@ +# YunoHost + [![Build status](https://travis-ci.org/YunoHost/yunohost.svg?branch=stretch-unstable)](https://travis-ci.org/YunoHost/yunohost) [![GitHub license](https://img.shields.io/github/license/YunoHost/yunohost)](https://github.com/YunoHost/yunohost/blob/stretch-unstable/LICENSE) +![Mastodon Follow](https://img.shields.io/mastodon/follow/28084) -# YunoHost core +This repository corresponds to the core code of YunoHost, mainly written in Python and Bash. -This repository is the core of YunoHost code. +You can learn more about what's YunoHost and its features [here](https://yunohost.org/#/whatsyunohost)! - [Project website](https://yunohost.org) -- [Bugtracker](https://github.com/YunoHost/issues). +- [Installation documentation](https://yunohost.org/install) +- [Issue tracker](https://github.com/YunoHost/issues) + +# Screenshots + +Webadmin ([Yunohost-Admin](https://github.com/YunoHost/yunohost-admin)) | Single-sign on user portal ([SSOwat](https://github.com/YunoHost/ssowat)) +--- | --- +![](https://raw.githubusercontent.com/YunoHost/doc/master/images/webadmin.png) | ![](https://raw.githubusercontent.com/YunoHost/doc/master/images/user_panel.png) + ## Contributing -- You can develop on this repository using [ynh-dev](https://github.com/YunoHost/ynh-dev) with `use-git` sub-command. -- On this repository we are [following this workflow](https://yunohost.org/#/build_system_en): `stable ← testing ← unstable ← your_branch`. -- Note: If you modify Python scripts, you will have to modifiy the actions map. +- You can learn how to get started with developing on YunoHost by reading [this piece of documentation](https://yunohost.org/dev). - You can help translate YunoHost on our [translation platform](https://translate.yunohost.org/engage/yunohost/?utm_source=widget) Translation status @@ -21,7 +30,7 @@ This repository is the core of YunoHost code. ## Repository content - [YunoHost core Python 2.7 scripts](./src/yunohost). -- [An actionsmap](./data/actionsmap/yunohost.yml) used by moulinette. +- [An actionsmap](./data/actionsmap/yunohost.yml) describing the CLI and API - [Services configuration templates](./data/templates). - [Hooks](./data/hooks). - [Locales](./locales) for translations of `yunohost` command. @@ -32,17 +41,10 @@ This repository is the core of YunoHost code. ## How does it work? - Python core scripts are accessible through two interfaces thanks to the [moulinette framework](https://github.com/YunoHost/moulinette): - - [CLI](https://en.wikipedia.org/wiki/Command-line_interface) for `yunohost` command. - - [API](https://en.wikipedia.org/wiki/Application_programming_interface) for [web administration module](https://github.com/YunoHost/yunohost-admin) (other modules could be implemented). + - the [CLI](https://en.wikipedia.org/wiki/Command-line_interface) corresponding to the `yunohost` command. + - the [API](https://en.wikipedia.org/wiki/Application_programming_interface) used by the [web administration interface](https://github.com/YunoHost/yunohost-admin) (other interfaces could be implemented). - You can find more details about how YunoHost works on this [documentation (in French)](https://yunohost.org/#/package_list_fr). -## Dependencies - -- [Python 2.7](https://www.python.org/download/releases/2.7) -- [Moulinette](https://github.com/YunoHost/moulinette) -- [Bash](https://www.gnu.org/software/bash/bash.html) -- [Debian Stretch](https://www.debian.org/releases/stretch) - ## License -As [other components of YunoHost core code](https://yunohost.org/#/faq_en), this repository is licensed GNU AGPL v3. +As [other components of YunoHost](https://yunohost.org/#/faq_en), this repository is licensed GNU AGPL v3. From a0febb0b2110041d58fdfdc61468fe62712ad496 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 16 Oct 2019 17:35:52 +0200 Subject: [PATCH 04/14] Uuuh small fixes for the README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5fb72e260..588878261 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Build status](https://travis-ci.org/YunoHost/yunohost.svg?branch=stretch-unstable)](https://travis-ci.org/YunoHost/yunohost) [![GitHub license](https://img.shields.io/github/license/YunoHost/yunohost)](https://github.com/YunoHost/yunohost/blob/stretch-unstable/LICENSE) -![Mastodon Follow](https://img.shields.io/mastodon/follow/28084) +[![Mastodon Follow](https://img.shields.io/mastodon/follow/28084)](https://mastodon.social/@yunohost) This repository corresponds to the core code of YunoHost, mainly written in Python and Bash. @@ -14,7 +14,7 @@ You can learn more about what's YunoHost and its features [here](https://yunohos # Screenshots -Webadmin ([Yunohost-Admin](https://github.com/YunoHost/yunohost-admin)) | Single-sign on user portal ([SSOwat](https://github.com/YunoHost/ssowat)) +Webadmin ([Yunohost-Admin](https://github.com/YunoHost/yunohost-admin)) | Single sign-on user portal ([SSOwat](https://github.com/YunoHost/ssowat)) --- | --- ![](https://raw.githubusercontent.com/YunoHost/doc/master/images/webadmin.png) | ![](https://raw.githubusercontent.com/YunoHost/doc/master/images/user_panel.png) From d9990cd818ad0c8056ecb1c0f966f2a180be683c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 16 Oct 2019 18:59:23 +0200 Subject: [PATCH 05/14] Smarter regex to avoid redacting all --key=stuff when using setting helpers for example --- src/yunohost/log.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/yunohost/log.py b/src/yunohost/log.py index 0f5ff784c..72e497b5d 100644 --- a/src/yunohost/log.py +++ b/src/yunohost/log.py @@ -315,7 +315,8 @@ class RedactingFormatter(Formatter): try: # This matches stuff like db_pwd=the_secret or admin_password=other_secret # (the secret part being at least 3 chars to avoid catching some lines like just "db_pwd=") - match = re.search(r'(pwd|pass|password|secret|key|token)=(\S{3,})$', record.strip()) + # For 'key', we require to at least have one word char [a-zA-Z0-9_] before it to avoid catching "--key" used in many helpers + match = re.search(r'(pwd|pass|password|secret|\wkey|token)=(\S{3,})$', record.strip()) if match and match.group(2) not in self.data_to_redact: self.data_to_redact.append(match.group(2)) except Exception as e: From e2731955041b6cd37d4eeebf94b96edb66c0ce7a Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 16 Oct 2019 20:22:29 +0200 Subject: [PATCH 06/14] [fix] Bad copypasta: logger doesn't exists in that context... --- data/helpers.d/setting | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/helpers.d/setting b/data/helpers.d/setting index a8d2919a4..fd2824997 100644 --- a/data/helpers.d/setting +++ b/data/helpers.d/setting @@ -159,7 +159,7 @@ ynh_add_protected_uris() { ynh_app_setting() { ACTION="$1" APP="$2" KEY="$3" VALUE="${4:-}" python - < Date: Sat, 19 Oct 2019 05:34:42 +0200 Subject: [PATCH 07/14] Try to make those debug messages sound less like an error --- src/yunohost/hook.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yunohost/hook.py b/src/yunohost/hook.py index 05c5a6b6b..40d3d114f 100644 --- a/src/yunohost/hook.py +++ b/src/yunohost/hook.py @@ -196,7 +196,7 @@ def hook_list(action, list_by='name', show_info=False): else: _append_folder(result, HOOK_FOLDER) except OSError: - logger.debug("system hook folder not found for action '%s' in %s", + logger.debug("No default hook for action '%s' in %s", action, HOOK_FOLDER) try: @@ -207,7 +207,7 @@ def hook_list(action, list_by='name', show_info=False): else: _append_folder(result, CUSTOM_HOOK_FOLDER) except OSError: - logger.debug("custom hook folder not found for action '%s' in %s", + logger.debug("No custom hook for action '%s' in %s", action, CUSTOM_HOOK_FOLDER) return {'hooks': result} From 7c99aff94e3bbbf66af8a2a6cd3cfa20b523e05a Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 19 Oct 2019 18:04:55 +0200 Subject: [PATCH 08/14] Forgot the i18n --- src/yunohost/permission.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/permission.py b/src/yunohost/permission.py index 4cfbc214f..67d115bc7 100644 --- a/src/yunohost/permission.py +++ b/src/yunohost/permission.py @@ -150,7 +150,7 @@ def user_permission_update(operation_logger, permission, add=None, remove=None, # Don't update LDAP if we update exactly the same values if set(new_allowed_groups) == set(current_allowed_groups): - logger.warning("permission_already_up_to_date") + logger.warning(m18n.n("permission_already_up_to_date")) return # Commit the new allowed group list From 9362261d345b255eebf094b9adb14b271d851b23 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 19 Oct 2019 18:05:32 +0200 Subject: [PATCH 09/14] Ugh some apps uses skipped_uris sometimes instead of unprotected_uris... --- src/yunohost/app.py | 2 +- src/yunohost/data_migrations/0011_setup_group_permission.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index f4c504505..9074c90fd 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -1102,7 +1102,7 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu permission_url(app_instance_name + ".main", url=None, sync_perm=False) # Migrate classic public app still using the legacy unprotected_uris - if app_settings.get("unprotected_uris", None) == "/": + if app_settings.get("unprotected_uris", None) == "/" or app_settings.get("skipped_uris", None) == "/": user_permission_update(app_instance_name + ".main", remove="all_users", add="visitors", sync_perm=False) permission_sync_to_user() diff --git a/src/yunohost/data_migrations/0011_setup_group_permission.py b/src/yunohost/data_migrations/0011_setup_group_permission.py index 9ba2268d9..7a987899c 100644 --- a/src/yunohost/data_migrations/0011_setup_group_permission.py +++ b/src/yunohost/data_migrations/0011_setup_group_permission.py @@ -117,7 +117,7 @@ class MyMigration(Migration): app_setting(app, 'allowed_users', delete=True) # Migrate classic public app still using the legacy unprotected_uris - if app_setting(app, "unprotected_uris") == "/": + if app_setting(app, "unprotected_uris") == "/" or app_setting(app, "skipped_uris") == "/": user_permission_update(app+".main", remove="all_users", add="visitors", sync_perm=False) permission_sync_to_user() From 98d60a888bf19987cbb956648e777dcbf79dd047 Mon Sep 17 00:00:00 2001 From: ljf Date: Thu, 17 Oct 2019 02:30:23 +0200 Subject: [PATCH 10/14] [fix] HTTP API for permissions --- data/actionsmap/yunohost.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/actionsmap/yunohost.yml b/data/actionsmap/yunohost.yml index 22037f05f..245b3615d 100644 --- a/data/actionsmap/yunohost.yml +++ b/data/actionsmap/yunohost.yml @@ -285,7 +285,7 @@ user: ### user_permission_list() list: action_help: List permissions and corresponding accesses - api: GET /users/permissions/ + api: GET /users/permissions arguments: -s: full: --short @@ -300,7 +300,7 @@ user: ### user_permission_update() update: action_help: Manage group or user permissions - api: POST /users/permissions/ + api: PUT /users/permissions/ arguments: permission: help: Permission to manage (e.g. mail or nextcloud or wordpress.editors) From e005d94f82c2ef85d47083fd3ee76ed4ff4ffd37 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 19 Oct 2019 19:08:38 +0200 Subject: [PATCH 11/14] Messed up the message UX with a previous PR (did not have the message explaining how to debug at the very end) --- locales/en.json | 2 +- src/yunohost/app.py | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/locales/en.json b/locales/en.json index 03ecdbccd..1ad7361e9 100644 --- a/locales/en.json +++ b/locales/en.json @@ -23,7 +23,7 @@ "app_id_invalid": "Invalid app ID", "app_incompatible": "The app {app} is incompatible with your YunoHost version", "app_install_files_invalid": "These files cannot be installed", - "app_install_failed": "Could not install {app}", + "app_install_failed": "Could not install {app}: {error}", "app_install_script_failed": "An error occured inside the app installation script", "app_location_already_used": "The app '{app}' is already installed in ({path})", "app_make_default_location_already_used": "Can't make the app '{app}' the default on the domain, {domain} is already in use by the other app '{other_app}'", diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 9074c90fd..5b7202362 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -994,19 +994,19 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu install_failed = True if install_retcode != 0 else False if install_failed: error = m18n.n('app_install_script_failed') - logger.exception(error) - operation_logger.error(error) + logger.exception(m18n.n("app_install_failed", app=app_id, error=error)) + failure_message_with_debug_instructions = operation_logger.error(error) # Script got manually interrupted ... N.B. : KeyboardInterrupt does not inherit from Exception except (KeyboardInterrupt, EOFError): error = m18n.n('operation_interrupted') - logger.exception(error) - operation_logger.error(error) + logger.exception(m18n.n("app_install_failed", app=app_id, error=error)) + failure_message_with_debug_instructions = operation_logger.error(error) # Something wrong happened in Yunohost's code (most probably hook_exec) - except Exception as e : + except Exception as e: import traceback error = m18n.n('unexpected_error', error=u"\n" + traceback.format_exc()) - logger.exception(error) - operation_logger.error(error) + logger.exception(m18n.n("app_install_failed", app=app_id, error=error)) + failure_message_with_debug_instructions = operation_logger.error(error) finally: # Whatever happened (install success or failure) we check if it broke the system # and warn the user about it @@ -1015,8 +1015,8 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu _assert_system_is_sane_for_app(manifest, "post") except Exception as e: broke_the_system = True - logger.exception(str(e)) - operation_logger.error(str(e)) + logger.exception(m18n.n("app_install_failed", app=app_id, error=str(e))) + failure_message_with_debug_instructions = operation_logger.error(str(e)) # If the install failed or broke the system, we remove it if install_failed or broke_the_system: @@ -1076,7 +1076,7 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu app_ssowatconf() - raise YunohostError("app_install_failed", app=app_id) + raise YunohostError(failure_message_with_debug_instructions, raw_msg=True) # Clean hooks and add new ones hook_remove(app_instance_name) From 9beeb16077277ba5c181baad94bcdf70510ed3de Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sat, 19 Oct 2019 19:18:19 +0200 Subject: [PATCH 12/14] Don't sync permission right away when deleting them, otherwise we get annoying warning because app_map thinks the app is still installed and expected a main permission --- src/yunohost/app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 5b7202362..5cf812871 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -1055,7 +1055,7 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu # Remove all permission in LDAP for permission_name in user_permission_list()["permissions"].keys(): if permission_name.startswith(app_instance_name+"."): - permission_delete(permission_name, force=True) + permission_delete(permission_name, force=True, sync_perm=False) if remove_retcode != 0: msg = m18n.n('app_not_properly_removed', @@ -1074,7 +1074,7 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu shutil.rmtree(app_setting_path) shutil.rmtree(extracted_app_folder) - app_ssowatconf() + permission_sync_to_user() raise YunohostError(failure_message_with_debug_instructions, raw_msg=True) From 25afdd4d4109faebf8e2aeef78eb2f53587f3dfb Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 22 Oct 2019 15:50:41 +0200 Subject: [PATCH 13/14] Misc README improvements --- README.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 588878261..5b7d04750 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,24 @@ -# YunoHost +

+ YunoHost +

+ +

YunoHost

+ +
[![Build status](https://travis-ci.org/YunoHost/yunohost.svg?branch=stretch-unstable)](https://travis-ci.org/YunoHost/yunohost) [![GitHub license](https://img.shields.io/github/license/YunoHost/yunohost)](https://github.com/YunoHost/yunohost/blob/stretch-unstable/LICENSE) [![Mastodon Follow](https://img.shields.io/mastodon/follow/28084)](https://mastodon.social/@yunohost) +
+ +YunoHost is an operating system aiming to simplify as much as possible the administration of a server. + This repository corresponds to the core code of YunoHost, mainly written in Python and Bash. -You can learn more about what's YunoHost and its features [here](https://yunohost.org/#/whatsyunohost)! - +- [Project features](https://yunohost.org/#/whatsyunohost) - [Project website](https://yunohost.org) -- [Installation documentation](https://yunohost.org/install) +- [Install documentation](https://yunohost.org/install) - [Issue tracker](https://github.com/YunoHost/issues) # Screenshots @@ -22,6 +31,7 @@ Webadmin ([Yunohost-Admin](https://github.com/YunoHost/yunohost-admin)) | Single ## Contributing - You can learn how to get started with developing on YunoHost by reading [this piece of documentation](https://yunohost.org/dev). +- Come chat with us on the [dev chatroom](https://yunohost.org/#/chat_rooms) ! - You can help translate YunoHost on our [translation platform](https://translate.yunohost.org/engage/yunohost/?utm_source=widget) Translation status From 73741f6cd937061329f0b9a2bbd54c3699a1a7e4 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 22 Oct 2019 16:44:20 +0200 Subject: [PATCH 14/14] Simplify README, all those explanations are now in the dev documentation --- README.md | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 5b7d04750..aec5300e2 100644 --- a/README.md +++ b/README.md @@ -34,27 +34,10 @@ Webadmin ([Yunohost-Admin](https://github.com/YunoHost/yunohost-admin)) | Single - Come chat with us on the [dev chatroom](https://yunohost.org/#/chat_rooms) ! - You can help translate YunoHost on our [translation platform](https://translate.yunohost.org/engage/yunohost/?utm_source=widget) +

Translation status - - -## Repository content - -- [YunoHost core Python 2.7 scripts](./src/yunohost). -- [An actionsmap](./data/actionsmap/yunohost.yml) describing the CLI and API -- [Services configuration templates](./data/templates). -- [Hooks](./data/hooks). -- [Locales](./locales) for translations of `yunohost` command. -- [Shell helpers](./helpers.d) for [application packaging](https://yunohost.org/#/packaging_apps_helpers_en). -- [Modules for the XMPP server Metronome](./lib/metronome/modules). -- [Debian files](./debian) for package creation. - -## How does it work? - -- Python core scripts are accessible through two interfaces thanks to the [moulinette framework](https://github.com/YunoHost/moulinette): - - the [CLI](https://en.wikipedia.org/wiki/Command-line_interface) corresponding to the `yunohost` command. - - the [API](https://en.wikipedia.org/wiki/Application_programming_interface) used by the [web administration interface](https://github.com/YunoHost/yunohost-admin) (other interfaces could be implemented). -- You can find more details about how YunoHost works on this [documentation (in French)](https://yunohost.org/#/package_list_fr). +

## License -As [other components of YunoHost](https://yunohost.org/#/faq_en), this repository is licensed GNU AGPL v3. +As [other components of YunoHost](https://yunohost.org/#/faq_en), this repository is licensed under GNU AGPL v3.