From 9a66a00278f10a7a4f167147f78a17c6b0f82d50 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Mon, 8 Aug 2016 07:46:38 +0200 Subject: [PATCH 01/38] [fix] wait for admin user to be available after a slapd regen-conf, this fix install on slow hardware/vps --- data/hooks/conf_regen/06-slapd | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/data/hooks/conf_regen/06-slapd b/data/hooks/conf_regen/06-slapd index b3353962e..aef47c347 100755 --- a/data/hooks/conf_regen/06-slapd +++ b/data/hooks/conf_regen/06-slapd @@ -102,6 +102,23 @@ do_post_regen() { fi sudo service slapd force-reload + + # on slow hardware/vm this regen conf would exit before the admin user that + # is stored in ldap is available because ldap seems to slow to restart + # so we'll wait either until we are able to log as admin or until a timeout + # is reached + # we need to do this because the next hooks executed after this one during + # postinstall requires to run as admin thus breaking postinstall on slow + # hardware which mean yunohost can't be correctly installed on those hardware + # and this sucks + # wait a maximum time of 5 minutes + # yes, force-reload behave like a restart + number_of_wait=0 + while ! sudo su admin -c '' && ((number_of_wait < 60)) + do + sleep 5 + ((number_of_wait += 1)) + done } FORCE=${2:-0} From 9225d12da88a1d3eb46c49d0f47d2c06621bfd70 Mon Sep 17 00:00:00 2001 From: Julien Malik Date: Wed, 7 Sep 2016 17:57:04 +0200 Subject: [PATCH 02/38] [enh] Remove useless comments autogenerated in the past --- data/templates/dovecot/dovecot.conf | 2 -- 1 file changed, 2 deletions(-) diff --git a/data/templates/dovecot/dovecot.conf b/data/templates/dovecot/dovecot.conf index 3daa670bf..244b78780 100644 --- a/data/templates/dovecot/dovecot.conf +++ b/data/templates/dovecot/dovecot.conf @@ -1,5 +1,3 @@ -# 2.1.7: /etc/dovecot/dovecot.conf -# OS: Linux 3.2.0-3-686-pae i686 Debian wheezy/sid ext4 listen = *, :: auth_mechanisms = plain login login_greeting = Dovecot ready!! From e3f4686c90f83dcbd985145e8aab25f0f89e17a6 Mon Sep 17 00:00:00 2001 From: Julien Malik Date: Wed, 7 Sep 2016 18:04:29 +0200 Subject: [PATCH 03/38] [enh] Hide the fact that we are speaking to dovecot --- data/templates/dovecot/dovecot.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/data/templates/dovecot/dovecot.conf b/data/templates/dovecot/dovecot.conf index 244b78780..00916d88d 100644 --- a/data/templates/dovecot/dovecot.conf +++ b/data/templates/dovecot/dovecot.conf @@ -1,6 +1,5 @@ listen = *, :: auth_mechanisms = plain login -login_greeting = Dovecot ready!! mail_gid = 8 mail_home = /var/mail/%n mail_location = maildir:/var/mail/%n From e4832234185d45322318041dde99131b9b30c2f5 Mon Sep 17 00:00:00 2001 From: Julien Malik Date: Wed, 7 Sep 2016 18:20:21 +0200 Subject: [PATCH 04/38] [enh] reorder dovecot main configuration so that it is easier to read and extend --- data/templates/dovecot/dovecot.conf | 64 ++++++++++++++++------------- 1 file changed, 36 insertions(+), 28 deletions(-) diff --git a/data/templates/dovecot/dovecot.conf b/data/templates/dovecot/dovecot.conf index 00916d88d..af745c93d 100644 --- a/data/templates/dovecot/dovecot.conf +++ b/data/templates/dovecot/dovecot.conf @@ -1,15 +1,44 @@ listen = *, :: auth_mechanisms = plain login + mail_gid = 8 mail_home = /var/mail/%n mail_location = maildir:/var/mail/%n mail_uid = 500 + +protocols = imap sieve + +mail_plugins = $mail_plugins quota + +ssl = yes +ssl_cert = Date: Wed, 7 Sep 2016 18:37:53 +0200 Subject: [PATCH 05/38] [enh] Remove autocreate plugin related settings, unused now autosubscribe & autosubscribe2 are part of the autocreate plugin configuration. Should have been removed with f36e4e2a837ae1947aa6f196622f5e3bed637a9 See https://github.com/YunoHost/yunohost-config-dovecot/pull/3 --- data/templates/dovecot/dovecot.conf | 5 ----- 1 file changed, 5 deletions(-) diff --git a/data/templates/dovecot/dovecot.conf b/data/templates/dovecot/dovecot.conf index af745c93d..fbaa61ca9 100644 --- a/data/templates/dovecot/dovecot.conf +++ b/data/templates/dovecot/dovecot.conf @@ -77,11 +77,6 @@ plugin { antispam_pipe_program_notspam_arg = learn_ham } -plugin { - autosubscribe = Trash - autosubscribe2 = Junk -} - plugin { quota = maildir:User quota quota_rule2 = SPAM:ignore From ea17e9fa80094d1a1c47059cdf428f876bd749f9 Mon Sep 17 00:00:00 2001 From: Julien Malik Date: Fri, 9 Sep 2016 17:12:50 +0200 Subject: [PATCH 06/38] [enh] Allow for dovecot configuration extensions --- data/hooks/conf_regen/25-dovecot | 7 +++++++ data/templates/dovecot/dovecot.conf | 5 +++++ data/templates/dovecot/post-ext.conf | 1 + data/templates/dovecot/pre-ext.conf | 1 + 4 files changed, 14 insertions(+) create mode 100644 data/templates/dovecot/post-ext.conf create mode 100644 data/templates/dovecot/pre-ext.conf diff --git a/data/hooks/conf_regen/25-dovecot b/data/hooks/conf_regen/25-dovecot index 5d82470a5..4c5ae24c1 100755 --- a/data/hooks/conf_regen/25-dovecot +++ b/data/hooks/conf_regen/25-dovecot @@ -26,11 +26,18 @@ do_pre_regen() { 's/^\(listen =\).*/\1 */' \ "${dovecot_dir}/dovecot.conf" fi + + mkdir -p "${dovecot_dir}/yunohost.d" + cp pre-ext.conf "${dovecot_dir}/yunohost.d" + cp post-ext.conf "${dovecot_dir}/yunohost.d" } do_post_regen() { regen_conf_files=$1 + sudo mkdir -p "/etc/dovecot/yunohost.d/pre-ext.d" + sudo mkdir -p "/etc/dovecot/yunohost.d/post-ext.d" + # create vmail user id vmail > /dev/null 2>&1 \ || sudo adduser --system --ingroup mail --uid 500 vmail diff --git a/data/templates/dovecot/dovecot.conf b/data/templates/dovecot/dovecot.conf index fbaa61ca9..5ea10ea79 100644 --- a/data/templates/dovecot/dovecot.conf +++ b/data/templates/dovecot/dovecot.conf @@ -1,3 +1,5 @@ +!include yunohost.d/pre-ext.conf + listen = *, :: auth_mechanisms = plain login @@ -10,6 +12,7 @@ protocols = imap sieve mail_plugins = $mail_plugins quota + ssl = yes ssl_cert = Date: Thu, 24 Nov 2016 02:55:59 +0100 Subject: [PATCH 07/38] [fix] Can't get mailbos used space if dovecot is down --- locales/en.json | 1 + src/yunohost/user.py | 46 +++++++++++++++++++++++++++++--------------- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/locales/en.json b/locales/en.json index e939b26fa..a87a459b7 100644 --- a/locales/en.json +++ b/locales/en.json @@ -118,6 +118,7 @@ "mail_alias_remove_failed": "Unable to remove mail alias '{mail:s}'", "mail_domain_unknown": "Unknown mail address domain '{domain:s}'", "mail_forward_remove_failed": "Unable to remove mail forward '{mail:s}'", + "mailbox_used_space_dovecot_down": "Dovecot mailbox service need to be up, if you want to get mailbox used space", "maindomain_change_failed": "Unable to change the main domain", "maindomain_changed": "The main domain has been changed", "monitor_disabled": "The server monitoring has been disabled", diff --git a/src/yunohost/user.py b/src/yunohost/user.py index ec7dd539c..348a23d32 100644 --- a/src/yunohost/user.py +++ b/src/yunohost/user.py @@ -92,7 +92,7 @@ def user_list(auth, fields=None, filter=None, limit=None, offset=None): def user_create(auth, username, firstname, lastname, mail, password, - mailbox_quota=0): + mailbox_quota="0"): """ Create user @@ -398,20 +398,36 @@ def user_info(auth, username): result_dict['mail-forward'] = user['maildrop'][1:] if 'mailuserquota' in user: - if user['mailuserquota'][0] != '0': - cmd = 'doveadm -f flow quota get -u %s' % user['uid'][0] - userquota = subprocess.check_output(cmd,stderr=subprocess.STDOUT, - shell=True) - quotavalue = re.findall(r'\d+', userquota) - result = '%s (%s%s)' % ( _convertSize(eval(quotavalue[0])), - quotavalue[2], '%') - result_dict['mailbox-quota'] = { - 'limit' : user['mailuserquota'][0], - 'use' : result - } - else: - result_dict['mailbox-quota'] = m18n.n('unlimit') - + userquota = user['mailuserquota'][0] + if isinstance( userquota, int ): + userquota = str(userquota) + + # Test if userquota is '0' or '0M' ( quota pattern is ^(\d+[bkMGT])|0$ ) + is_limited = not re.match('0[bkMGT]?', userquota) + storage_use = '?' + cmd = 'doveadm -f flow quota get -u %s' % user['uid'][0] + try: + cmd_result = subprocess.check_output(cmd,stderr=subprocess.STDOUT, + shell=True) + # Exemple of return value for cmd: + # """Quota name=User quota Type=STORAGE Value=0 Limit=- %=0 + # Quota name=User quota Type=MESSAGE Value=0 Limit=- %=0""" + has_value=re.search(r'Value=(\d+)', cmd_result) + if has_value: + storage_use = int(has_value.group(1)) + storage_use = _convertSize(storage_use) + if is_limited: + has_percent=re.search(r'%=(\d+)', cmd_result) + if has_percent: + percentage = int(has_percent.group(1)) + storage_use += ' (%s%s)' % (percentage, '%') + except subprocess.CalledProcessError: + logger.warning(m18n.n('mailbox_used_space_dovecot_down')) + result_dict['mailbox-quota'] = { + 'limit' : userquota if is_limited else m18n.n('unlimit'), + 'use' : storage_use + } + if result: return result_dict else: From 8bf8534a9a68c9ca324559c1aede7a939d495a52 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 30 Nov 2016 00:02:52 -0500 Subject: [PATCH 08/38] [fix] Need to create archives_path even for custom output directory --- src/yunohost/backup.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/yunohost/backup.py b/src/yunohost/backup.py index dd7c73852..7d2e9d445 100644 --- a/src/yunohost/backup.py +++ b/src/yunohost/backup.py @@ -120,8 +120,10 @@ def backup_create(name=None, description=None, output_directory=None, env_var['CAN_BIND'] = 0 else: output_directory = archives_path - if not os.path.isdir(archives_path): - os.mkdir(archives_path, 0750) + + # Create archives directory if it does not exists + if not os.path.isdir(archives_path): + os.mkdir(archives_path, 0750) def _clean_tmp_dir(retcode=0): ret = hook_callback('post_backup_create', args=[tmp_dir, retcode]) From 6171fbdb0302cf524f1e17517b27f2a16294306b Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Wed, 30 Nov 2016 00:04:17 -0500 Subject: [PATCH 09/38] Keep track of backups with custom directory using symlinks --- locales/en.json | 1 + src/yunohost/backup.py | 27 +++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/locales/en.json b/locales/en.json index efeb66e69..c50f3d3de 100644 --- a/locales/en.json +++ b/locales/en.json @@ -43,6 +43,7 @@ "backup_action_required": "You must specify something to save", "backup_app_failed": "Unable to back up the app '{app:s}'", "backup_archive_app_not_found": "App '{app:s}' not found in the backup archive", + "backup_archive_broken_link": "Unable to access backup archive (broken link to {path:s})", "backup_archive_hook_not_exec": "Hook '{hook:s}' not executed in this backup", "backup_archive_name_exists": "The backup's archive name already exists", "backup_archive_name_unknown": "Unknown local backup archive named '{name:s}'", diff --git a/src/yunohost/backup.py b/src/yunohost/backup.py index 7d2e9d445..0e991e8fc 100644 --- a/src/yunohost/backup.py +++ b/src/yunohost/backup.py @@ -290,7 +290,7 @@ def backup_create(name=None, description=None, output_directory=None, raise MoulinetteError(errno.EIO, m18n.n('backup_archive_open_failed')) - # Add files to the arvhice + # Add files to the archive try: tar.add(tmp_dir, arcname='') tar.close() @@ -300,10 +300,22 @@ def backup_create(name=None, description=None, output_directory=None, raise MoulinetteError(errno.EIO, m18n.n('backup_creation_failed')) + # FIXME : it looks weird that the "move info file" is not enabled if + # user activated "no_compress" ... or does it really means + # "dont_keep_track_of_this_backup_in_history" ? + # Move info file shutil.move(tmp_dir + '/info.json', '{:s}/{:s}.info.json'.format(archives_path, name)) + # If backuped to a non-default location, keep a symlink of the archive + # to that location + if output_directory != archives_path: + link = "%s/%s.tar.gz" % (archives_path, name) + os.symlink(archive_file, link) + + + # Clean temporary directory if tmp_dir != output_directory: _clean_tmp_dir() @@ -604,10 +616,21 @@ def backup_info(name, with_details=False, human_readable=False): """ archive_file = '%s/%s.tar.gz' % (archives_path, name) - if not os.path.isfile(archive_file): + + # Check file exist (even if it's a broken symlink) + if not os.path.lexists(archive_file): raise MoulinetteError(errno.EIO, m18n.n('backup_archive_name_unknown', name=name)) + # If symlink, retrieve the real path + if os.path.islink(archive_file) : + archive_file = os.path.realpath(archive_file) + + # Raise exception if link is broken (e.g. on unmounted external storage) + if (not os.path.exists(archive_file)) : + raise MoulinetteError(errno.EIO, + m18n.n('backup_archive_broken_link', path=archive_file)) + info_file = "%s/%s.info.json" % (archives_path, name) try: with open(info_file) as f: From c2065f0a7222f9d00111e4ed47a35b3b15d2f33f Mon Sep 17 00:00:00 2001 From: opi Date: Sun, 4 Dec 2016 15:32:34 +0100 Subject: [PATCH 10/38] [fix] Improve dnssec key generation on low entropy devices See https://bugs.launchpad.net/ubuntu/+source/bind9/+bug/963368 --- src/yunohost/dyndns.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/dyndns.py b/src/yunohost/dyndns.py index 878bc577e..b32cde0da 100644 --- a/src/yunohost/dyndns.py +++ b/src/yunohost/dyndns.py @@ -95,7 +95,7 @@ def dyndns_subscribe(subscribe_host="dyndns.yunohost.org", domain=None, key=None logger.info(m18n.n('dyndns_key_generating')) os.system('cd /etc/yunohost/dyndns && ' \ - 'dnssec-keygen -a hmac-md5 -b 128 -n USER %s' % domain) + 'dnssec-keygen -a hmac-md5 -b 128 -r /dev/urandom -n USER %s' % domain) os.system('chmod 600 /etc/yunohost/dyndns/*.key /etc/yunohost/dyndns/*.private') key_file = glob.glob('/etc/yunohost/dyndns/*.key')[0] From 397aeb2498425d07e9ca60d56e536fe07500bdc9 Mon Sep 17 00:00:00 2001 From: opi Date: Mon, 5 Dec 2016 10:42:38 +0100 Subject: [PATCH 11/38] [enh] Add haveged as dependency Increase entropy on virtual servers. Speed up key generation by openssl and dnssec See https://github.com/YunoHost/yunohost/pull/201 & https://bugs.launchpad.net/ubuntu/+source/bind9/+bug/963368 --- debian/control | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/control b/debian/control index 80f562e76..ec44a06b1 100644 --- a/debian/control +++ b/debian/control @@ -25,6 +25,7 @@ Depends: ${python:Depends}, ${misc:Depends} , dnsmasq, openssl, avahi-daemon , ssowat, metronome , rspamd (>= 1.2.0), rmilter (>=1.7.0), redis-server, opendkim-tools + , haveged Recommends: yunohost-admin , openssh-server, ntp, inetutils-ping | iputils-ping , bash-completion, rsyslog, etckeeper From d85657a5c60afc8c9387e830d8250dd0e950dd18 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Wed, 7 Dec 2016 21:54:13 +0100 Subject: [PATCH 12/38] [mod] style --- src/yunohost/user.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/yunohost/user.py b/src/yunohost/user.py index 348a23d32..6c73c5ba0 100644 --- a/src/yunohost/user.py +++ b/src/yunohost/user.py @@ -399,30 +399,38 @@ def user_info(auth, username): if 'mailuserquota' in user: userquota = user['mailuserquota'][0] - if isinstance( userquota, int ): + + if isinstance(userquota, int): userquota = str(userquota) # Test if userquota is '0' or '0M' ( quota pattern is ^(\d+[bkMGT])|0$ ) is_limited = not re.match('0[bkMGT]?', userquota) storage_use = '?' + cmd = 'doveadm -f flow quota get -u %s' % user['uid'][0] + try: - cmd_result = subprocess.check_output(cmd,stderr=subprocess.STDOUT, + cmd_result = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) # Exemple of return value for cmd: # """Quota name=User quota Type=STORAGE Value=0 Limit=- %=0 # Quota name=User quota Type=MESSAGE Value=0 Limit=- %=0""" - has_value=re.search(r'Value=(\d+)', cmd_result) + has_value = re.search(r'Value=(\d+)', cmd_result) + if has_value: storage_use = int(has_value.group(1)) storage_use = _convertSize(storage_use) + if is_limited: - has_percent=re.search(r'%=(\d+)', cmd_result) + has_percent = re.search(r'%=(\d+)', cmd_result) + if has_percent: percentage = int(has_percent.group(1)) - storage_use += ' (%s%s)' % (percentage, '%') + storage_use += ' (%s%%)' % percentage + except subprocess.CalledProcessError: logger.warning(m18n.n('mailbox_used_space_dovecot_down')) + result_dict['mailbox-quota'] = { 'limit' : userquota if is_limited else m18n.n('unlimit'), 'use' : storage_use From 1b6d8b64637bbebf630139315c5674e5733b57ad Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Fri, 9 Dec 2016 00:50:28 +0100 Subject: [PATCH 13/38] [mod] pep8 --- src/yunohost/backup.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/yunohost/backup.py b/src/yunohost/backup.py index 0e991e8fc..4aec59598 100644 --- a/src/yunohost/backup.py +++ b/src/yunohost/backup.py @@ -623,15 +623,16 @@ def backup_info(name, with_details=False, human_readable=False): m18n.n('backup_archive_name_unknown', name=name)) # If symlink, retrieve the real path - if os.path.islink(archive_file) : + if os.path.islink(archive_file): archive_file = os.path.realpath(archive_file) # Raise exception if link is broken (e.g. on unmounted external storage) - if (not os.path.exists(archive_file)) : + if not os.path.exists(archive_file): raise MoulinetteError(errno.EIO, m18n.n('backup_archive_broken_link', path=archive_file)) info_file = "%s/%s.info.json" % (archives_path, name) + try: with open(info_file) as f: # Retrieve backup info From 4897c39edfcdb2e30e8855fbc17b31966c33cb8c Mon Sep 17 00:00:00 2001 From: Moul Date: Sun, 11 Dec 2016 18:14:42 +0100 Subject: [PATCH 14/38] =?UTF-8?q?[fix]=20[#662](https://dev.yunohost.org/i?= =?UTF-8?q?ssues/662):=C2=A0missing=20'python-openssl'=20dependency=20for?= =?UTF-8?q?=20Let's=20Encrypt=20integration.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index 5fb816c61..480cde40b 100644 --- a/debian/control +++ b/debian/control @@ -11,7 +11,7 @@ Package: yunohost Architecture: all Depends: ${python:Depends}, ${misc:Depends} , moulinette (>= 2.3.5.1) - , python-psutil, python-requests, python-dnspython + , python-psutil, python-requests, python-dnspython, python-openssl , python-apt, python-miniupnpc , glances , dnsutils, bind9utils, unzip, git, curl, cron From 71672d371e1626955afd9fdb796b23dc77fd2a30 Mon Sep 17 00:00:00 2001 From: opi Date: Sun, 11 Dec 2016 22:58:56 +0100 Subject: [PATCH 15/38] [fix] --no-remove-on-failure for app install should behave as a flag. --- data/actionsmap/yunohost.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/data/actionsmap/yunohost.yml b/data/actionsmap/yunohost.yml index 91c5b2aad..25eb6cf6d 100644 --- a/data/actionsmap/yunohost.yml +++ b/data/actionsmap/yunohost.yml @@ -502,6 +502,7 @@ app: -n: full: --no-remove-on-failure help: Debug option to avoid removing the app on a failed installation + action: store_true ### app_remove() TODO: Write help remove: From f6648f360cf7d7088cba04f4fac996ce10be1789 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Mon, 5 Dec 2016 18:44:31 +0100 Subject: [PATCH 16/38] [fix] don't remove trailing char if it's not a slash --- src/yunohost/app.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 153a13575..95146ad64 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -1011,19 +1011,19 @@ def app_ssowatconf(auth): for item in _get_setting(app_settings, 'skipped_uris'): if item[-1:] == '/': item = item[:-1] - skipped_urls.append(app_settings['domain'] + app_settings['path'][:-1] + item) + skipped_urls.append(app_settings['domain'] + app_settings['path'].rstrip('/') + item) for item in _get_setting(app_settings, 'skipped_regex'): skipped_regex.append(item) for item in _get_setting(app_settings, 'unprotected_uris'): if item[-1:] == '/': item = item[:-1] - unprotected_urls.append(app_settings['domain'] + app_settings['path'][:-1] + item) + unprotected_urls.append(app_settings['domain'] + app_settings['path'].rstrip('/') + item) for item in _get_setting(app_settings, 'unprotected_regex'): unprotected_regex.append(item) for item in _get_setting(app_settings, 'protected_uris'): if item[-1:] == '/': item = item[:-1] - protected_urls.append(app_settings['domain'] + app_settings['path'][:-1] + item) + protected_urls.append(app_settings['domain'] + app_settings['path'].rstrip('/') + item) for item in _get_setting(app_settings, 'protected_regex'): protected_regex.append(item) if 'redirected_urls' in app_settings: From 0e2cae4f1b473b6734fda28066b80ce38c884c7c Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Sun, 11 Dec 2016 17:59:39 -0500 Subject: [PATCH 17/38] Use service_status to check if dovecot is running --- src/yunohost/user.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/yunohost/user.py b/src/yunohost/user.py index 6c73c5ba0..65cfddae2 100644 --- a/src/yunohost/user.py +++ b/src/yunohost/user.py @@ -35,6 +35,7 @@ import re from moulinette.core import MoulinetteError from moulinette.utils.log import getActionLogger +from yunohost.service import service_status logger = getActionLogger('yunohost.user') @@ -407,9 +408,10 @@ def user_info(auth, username): is_limited = not re.match('0[bkMGT]?', userquota) storage_use = '?' - cmd = 'doveadm -f flow quota get -u %s' % user['uid'][0] - - try: + if (service_status("dovecot")["status"] != "running"): + logger.warning(m18n.n('mailbox_used_space_dovecot_down')) + else: + cmd = 'doveadm -f flow quota get -u %s' % user['uid'][0] cmd_result = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) # Exemple of return value for cmd: @@ -428,9 +430,6 @@ def user_info(auth, username): percentage = int(has_percent.group(1)) storage_use += ' (%s%%)' % percentage - except subprocess.CalledProcessError: - logger.warning(m18n.n('mailbox_used_space_dovecot_down')) - result_dict['mailbox-quota'] = { 'limit' : userquota if is_limited else m18n.n('unlimit'), 'use' : storage_use From 6f313d943bb7ce47598b9c61336f3bc34d967966 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Mon, 12 Dec 2016 00:14:22 +0100 Subject: [PATCH 18/38] [mod] pep8 --- src/yunohost/user.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/user.py b/src/yunohost/user.py index 65cfddae2..08ab4c649 100644 --- a/src/yunohost/user.py +++ b/src/yunohost/user.py @@ -408,7 +408,7 @@ def user_info(auth, username): is_limited = not re.match('0[bkMGT]?', userquota) storage_use = '?' - if (service_status("dovecot")["status"] != "running"): + if service_status("dovecot")["status"] != "running": logger.warning(m18n.n('mailbox_used_space_dovecot_down')) else: cmd = 'doveadm -f flow quota get -u %s' % user['uid'][0] From 656bb809d137fb5e4613d1ad767a9af7db28b0f3 Mon Sep 17 00:00:00 2001 From: Moul Date: Mon, 12 Dec 2016 00:22:50 +0100 Subject: [PATCH 19/38] [mod] certificate: pep8. --- src/yunohost/certificate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/yunohost/certificate.py b/src/yunohost/certificate.py index 8209160a4..04d755692 100644 --- a/src/yunohost/certificate.py +++ b/src/yunohost/certificate.py @@ -812,7 +812,7 @@ def _domain_is_accessible_through_HTTP(ip, domain): def _name_self_CA(): ca_conf = os.path.join(SSL_DIR, "openssl.ca.cnf") - if not os.path.exists(ca_conf) : + if not os.path.exists(ca_conf): logger.warning(m18n.n('certmanager_self_ca_conf_file_not_found', file=ca_conf)) return "" From 64af6a1dbf6ad61bd7c5e19c49fe9721a53f5aa8 Mon Sep 17 00:00:00 2001 From: likeitneverwentaway Date: Mon, 12 Dec 2016 09:03:50 +0100 Subject: [PATCH 20/38] [enh] List available domains when installing an app by CLI. --- locales/en.json | 1 + src/yunohost/app.py | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/locales/en.json b/locales/en.json index dfb8ffa4f..a8a55dd26 100644 --- a/locales/en.json +++ b/locales/en.json @@ -84,6 +84,7 @@ "domain_zone_exists": "DNS zone file already exists", "domain_zone_not_found": "DNS zone file not found for domain {:s}", "done": "Done", + "domains_available": "Available domains:", "downloading": "Downloading...", "dyndns_cron_installed": "The DynDNS cron job has been installed", "dyndns_cron_remove_failed": "Unable to remove the DynDNS cron job", diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 95146ad64..85693a0dd 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -1497,7 +1497,7 @@ def _parse_args_from_manifest(manifest, action, args={}, auth=None): args -- A dictionnary of arguments to parse """ - from yunohost.domain import domain_list + from yunohost.domain import domain_list, _get_maindomain from yunohost.user import user_info args_dict = OrderedDict() @@ -1537,6 +1537,13 @@ def _parse_args_from_manifest(manifest, action, args={}, auth=None): # Check for a password argument is_password = True if arg_type == 'password' else False + if arg_type == 'domain': + arg_default = _get_maindomain() + ask_string += ' (default: {0})'.format(arg_default) + msignals.display(m18n.n('domains_available')) + for domain in domain_list(auth)['domains']: + msignals.display("- {}".format(domain)) + try: input_string = msignals.prompt(ask_string, is_password) except NotImplementedError: From a8a682ac7e2ac4bacafccc98f83e3b1c046c1726 Mon Sep 17 00:00:00 2001 From: Moul Date: Mon, 12 Dec 2016 19:18:03 +0100 Subject: [PATCH 21/38] [enh] add empty file for esperanto to enable it on weblate --- locales/eo.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 locales/eo.json diff --git a/locales/eo.json b/locales/eo.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/locales/eo.json @@ -0,0 +1 @@ +{} From 7717c58de4c8cda615165d84a12a30dd73eea58a Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Fri, 25 Nov 2016 00:15:03 +0100 Subject: [PATCH 22/38] Revert "[fix] Can't restore app on a root domain" --- src/yunohost/app.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index 95146ad64..b6657539e 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -917,6 +917,10 @@ def app_checkurl(auth, url, app=None): raise MoulinetteError(errno.EINVAL, m18n.n('domain_unknown')) if domain in apps_map: + # Domain already has apps on sub path + if path == '/': + raise MoulinetteError(errno.EPERM, + m18n.n('app_location_install_failed')) # Loop through apps for p, a in apps_map[domain].items(): # Skip requested app checking @@ -926,7 +930,7 @@ def app_checkurl(auth, url, app=None): if path == p: raise MoulinetteError(errno.EINVAL, m18n.n('app_location_already_used')) - elif path.startswith(p) or p.startswith(path): + elif path.startswith(p): raise MoulinetteError(errno.EPERM, m18n.n('app_location_install_failed')) From 67cd9d9b22390579c3fa84439856d2a02c86879c Mon Sep 17 00:00:00 2001 From: Philip Gatzka Date: Fri, 29 Jul 2016 11:05:25 +0200 Subject: [PATCH 23/38] [i18n] Translated using Weblate (German) Currently translated at 63.5% (152 of 239 strings) --- locales/de.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/locales/de.json b/locales/de.json index 1331c56b4..0fff3e0b4 100644 --- a/locales/de.json +++ b/locales/de.json @@ -209,5 +209,14 @@ "yunohost_ca_creation_failed": "Zertifikatsstelle konnte nicht erstellt werden", "yunohost_configured": "YunoHost wurde erfolgreich konfiguriert", "yunohost_installing": "YunoHost wird installiert...", - "yunohost_not_installed": "Die YunoHost ist unvollständig. Bitte 'yunohost tools postinstall' ausführen." + "yunohost_not_installed": "Die YunoHost ist unvollständig. Bitte 'yunohost tools postinstall' ausführen.", + "app_not_properly_removed": "{app:s} wurde nicht ordnungsgemäß entfernt", + "service_regenconf_failed": "Konnte die Konfiguration für folgende Dienste nicht neu erzeugen: {services}", + "not_enough_disk_space": "Zu wenig Speicherplatz unter '{path:s}' verfügbar", + "backup_creation_failed": "Erzeugung des Backups fehlgeschlagen", + "service_conf_up_to_date": "Die Konfiguration für den Dienst '{service}' ist bereits aktuell", + "package_not_installed": "Paket '{pkgname}' ist nicht installiert", + "pattern_positive_number": "Muss eine positive Zahl sein", + "diagnostic_kernel_version_error": "Kann Kernelversion nicht abrufen: {error}", + "package_unexpected_error": "Ein unerwarteter Fehler trat bei der Verarbeitung des Pakets '{pkgname}' auf" } From 8c1c5f6ce85db2fc40888ff76f8f64c512191d71 Mon Sep 17 00:00:00 2001 From: Anmol Date: Fri, 29 Jul 2016 13:58:09 +0200 Subject: [PATCH 24/38] [i18n] Translated using Weblate (Hindi) Currently translated at 4.1% (10 of 239 strings) --- locales/hi.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/locales/hi.json b/locales/hi.json index 0967ef424..e202d8378 100644 --- a/locales/hi.json +++ b/locales/hi.json @@ -1 +1,12 @@ -{} +{ + "action_invalid": "अवैध कार्रवाई '{action:s}'", + "admin_password": "व्यवस्थापक पासवर्ड", + "admin_password_change_failed": "पासवर्ड बदलने में असमर्थ", + "admin_password_changed": "व्यवस्थापक पासवर्ड बदल दिया गया है", + "app_already_installed": "'{app:s}' पहले से ही इंस्टाल्ड है", + "app_argument_choice_invalid": "गलत तर्क का चयन किया गया '{name:s}' , तर्क इन विकल्पों में से होने चाहिए {choices:s}", + "app_argument_invalid": "तर्क के लिए अमान्य मान '{name:s}': {error:s}", + "app_argument_required": "तर्क '{name:s}' की आवश्यकता है", + "app_extraction_failed": "इन्सटाल्ड फ़ाइलों को निकालने में असमर्थ", + "app_id_invalid": "अवैध एप्लिकेशन id" +} From 5a12996017ba087402510cf49b18111a379d2e9a Mon Sep 17 00:00:00 2001 From: Anmol Date: Tue, 2 Aug 2016 22:31:47 +0200 Subject: [PATCH 25/38] [i18n] Translated using Weblate (Hindi) Currently translated at 33.0% (79 of 239 strings) --- locales/hi.json | 71 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/locales/hi.json b/locales/hi.json index e202d8378..2ed328282 100644 --- a/locales/hi.json +++ b/locales/hi.json @@ -8,5 +8,74 @@ "app_argument_invalid": "तर्क के लिए अमान्य मान '{name:s}': {error:s}", "app_argument_required": "तर्क '{name:s}' की आवश्यकता है", "app_extraction_failed": "इन्सटाल्ड फ़ाइलों को निकालने में असमर्थ", - "app_id_invalid": "अवैध एप्लिकेशन id" + "app_id_invalid": "अवैध एप्लिकेशन id", + "app_incompatible": "यह एप्लिकेशन युनोहोस्ट की इस वर्जन के लिए नहीं है", + "app_install_files_invalid": "फाइलों की अमान्य स्थापना", + "app_location_already_used": "इस लोकेशन पे पहले से ही कोई एप्लीकेशन इन्सटाल्ड है", + "app_location_install_failed": "इस लोकेशन पे एप्लीकेशन इंस्टाल करने में असमर्थ", + "app_manifest_invalid": "एप्लीकेशन का मैनिफेस्ट अमान्य", + "app_no_upgrade": "कोई भी एप्लीकेशन को अपडेट की जरूरत नहीं", + "app_not_correctly_installed": "{app:s} ठीक ढंग से इनस्टॉल नहीं हुई", + "app_not_installed": "{app:s} इनस्टॉल नहीं हुई", + "app_not_properly_removed": "{app:s} ठीक ढंग से नहीं अनइन्सटॉल की गई", + "app_package_need_update": "इस एप्लीकेशन पैकेज को युनोहोस्ट के नए बदलावों/गाइडलिनेज़ के कारण उपडटेशन की जरूरत", + "app_removed": "{app:s} को अनइन्सटॉल कर दिया गया", + "app_requirements_checking": "जरूरी पैकेजेज़ की जाँच हो रही है ....", + "app_requirements_failed": "आवश्यकताओं को पूरा करने में असमर्थ: {error}", + "app_requirements_unmeet": "आवश्यकताए पूरी नहीं हो सकी, पैकेज {pkgname}({version})यह होना चाहिए {spec}", + "app_sources_fetch_failed": "सोर्स फाइल्स प्राप्त करने में असमर्थ", + "app_unknown": "अनजान एप्लीकेशन", + "app_unsupported_remote_type": "एप्लीकेशन के लिए उन्सुपपोर्टेड रिमोट टाइप इस्तेमाल किया गया", + "app_upgrade_failed": "{app:s} अपडेट करने में असमर्थ", + "app_upgraded": "{app:s} अपडेट हो गयी हैं", + "appslist_fetched": "एप्लीकेशन की सूचि अपडेट हो गयी", + "appslist_removed": "एप्लीकेशन की सूचि निकल दी गयी है", + "appslist_retrieve_error": "दूरस्थ एप्लिकेशन सूची प्राप्त करने में असमर्थ", + "appslist_unknown": "अनजान एप्लिकेशन सूची", + "ask_current_admin_password": "वर्तमान व्यवस्थापक पासवर्ड", + "ask_email": "ईमेल का पता", + "ask_firstname": "नाम", + "ask_lastname": "अंतिम नाम", + "ask_list_to_remove": "सूचि जिसको हटाना है", + "ask_main_domain": "मुख्य डोमेन", + "ask_new_admin_password": "नया व्यवस्थापक पासवर्ड", + "ask_password": "पासवर्ड", + "backup_action_required": "आप को सेव करने के लिए कुछ लिखना होगा", + "backup_app_failed": "एप्लीकेशन का बैकअप करने में असमर्थ '{app:s}'", + "backup_archive_app_not_found": "'{app:s}' बैकअप आरचिव में नहीं मिला", + "backup_archive_hook_not_exec": "हुक '{hook:s}' इस बैकअप में एक्सेक्युट नहीं किया गया", + "backup_archive_name_exists": "इस बैकअप आरचिव का नाम पहले से ही मौजूद है", + "backup_archive_name_unknown": "'{name:s}' इस नाम की लोकल बैकअप आरचिव मौजूद नहीं", + "backup_archive_open_failed": "बैकअप आरचिव को खोलने में असमर्थ", + "backup_cleaning_failed": "टेम्पोरेरी बैकअप डायरेक्टरी को उड़ने में असमर्थ", + "backup_created": "बैकअप सफलतापूर्वक किया गया", + "backup_creating_archive": "बैकअप आरचिव बनाई जा रही है ...", + "backup_creation_failed": "बैकअप बनाने में विफल", + "backup_delete_error": "'{path:s}' डिलीट करने में असमर्थ", + "backup_deleted": "इस बैकअप को डिलीट दिया गया है", + "backup_extracting_archive": "बैकअप आरचिव को एक्सट्रेक्ट किया जा रहा है ...", + "backup_hook_unknown": "'{hook:s}' यह बैकअप हुक नहीं मिला", + "backup_invalid_archive": "अवैध बैकअप आरचिव", + "backup_nothings_done": "सेव करने के लिए कुछ नहीं", + "backup_output_directory_forbidden": "निषिद्ध आउटपुट डायरेक्टरी। निम्न दिए गए डायरेक्टरी में बैकअप नहीं बन सकता /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var और /home/yunohost.backup/archives के सब-फोल्डर।", + "backup_output_directory_not_empty": "आउटपुट डायरेक्टरी खाली नहीं है", + "backup_output_directory_required": "बैकअप करने के लिए आउट पुट डायरेक्टरी की आवश्यकता है", + "backup_running_app_script": "'{app:s}' एप्लीकेशन की बैकअप स्क्रिप्ट चल रही है...", + "backup_running_hooks": "बैकअप हुक्स चल रहे है...", + "custom_app_url_required": "आप को अपनी कस्टम एप्लिकेशन '{app:s}' को अपग्रेड करने के लिए यूआरएल(URL) देने की आवश्यकता है", + "custom_appslist_name_required": "आप को अपनी कस्टम एप्लीकेशन के लिए नाम देने की आवश्यकता है", + "diagnostic_debian_version_error": "डेबियन वर्जन प्राप्त करने में असफलता {error}", + "diagnostic_kernel_version_error": "कर्नेल वर्जन प्राप्त नहीं की जा पा रही : {error}", + "diagnostic_monitor_disk_error": "डिस्क की मॉनिटरिंग नहीं की जा पा रही: {error}", + "diagnostic_monitor_network_error": "नेटवर्क की मॉनिटरिंग नहीं की जा पा रही: {error}", + "diagnostic_monitor_system_error": "सिस्टम की मॉनिटरिंग नहीं की जा पा रही: {error}", + "diagnostic_no_apps": "कोई एप्लीकेशन इन्सटाल्ड नहीं है", + "dnsmasq_isnt_installed": "dnsmasq इन्सटाल्ड नहीं लगता,इनस्टॉल करने के लिए किप्या ये कमांड चलाये 'apt-get remove bind9 && apt-get install dnsmasq'", + "domain_cert_gen_failed": "सर्टिफिकेट उत्पन करने में असमर्थ", + "domain_created": "डोमेन बनाया गया", + "domain_creation_failed": "डोमेन बनाने में असमर्थ", + "domain_deleted": "डोमेन डिलीट कर दिया गया है", + "domain_deletion_failed": "डोमेन डिलीट करने में असमर्थ", + "domain_dyndns_already_subscribed": "DynDNS डोमेन पहले ही सब्स्क्राइड है", + "domain_dyndns_invalid": "DynDNS के साथ इनवैलिड डोमिन इस्तेमाल किया गया" } From d22f0012355d42e1bd22a503ab5cbd5499302975 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Date: Tue, 29 Nov 2016 22:25:36 +0100 Subject: [PATCH 26/38] [i18n] Translated using Weblate (French) Currently translated at 99.6% (256 of 257 strings) --- locales/fr.json | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/locales/fr.json b/locales/fr.json index 7898de57f..6017e3737 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -248,5 +248,22 @@ "yunohost_ca_creation_failed": "Impossible de créer l'autorité de certification", "yunohost_configured": "YunoHost a été configuré", "yunohost_installing": "Installation de YunoHost...", - "yunohost_not_installed": "YunoHost n'est pas ou pas correctement installé. Veuillez exécuter « yunohost tools postinstall »." + "yunohost_not_installed": "YunoHost n'est pas ou pas correctement installé. Veuillez exécuter « yunohost tools postinstall ».", + "certmanager_attempt_to_replace_valid_cert": "Vous êtes en train de remplacer un certificat correct et valide pour le domaine {domain:s} ! (Utilisez --force pour contourner)", + "certmanager_domain_unknown": "Domaine inconnu {domain:s}", + "certmanager_domain_cert_not_selfsigned": "Le certificat du domaine {domain:s} n’est pas auto-signé. Voulez-vous vraiment le remplacer ? (Utilisez --force)", + "certmanager_certificate_fetching_or_enabling_failed": "Il semble que l'activation du nouveau certificat pour {domain:s} a échoué…", + "certmanager_attempt_to_renew_nonLE_cert": "Le certificat pour le domaine {domain:s} n’est pas fourni par Let’s Encrypt. Impossible de le renouveler automatiquement !", + "certmanager_attempt_to_renew_valid_cert": "Le certificat pour le domaine {domain:s} est sur le point d’expirer ! Utilisez --force pour contourner", + "certmanager_domain_http_not_working": "Il semble que le domaine {domain:s} n’est pas accessible via HTTP. Veuillez vérifier que vos configuration DNS et nginx sont correctes.", + "certmanager_error_no_A_record": "Aucun enregistrement DNS « A » n’a été trouvé pour {domain:s}. De devez faire pointer votre nom de domaine vers votre machine pour être capable d’installer un certificat Let’s Encrypt ! (Si vous savez ce que vous faites, utilisez --no-checks pour désactiver ces contrôles)", + "certmanager_domain_dns_ip_differs_from_public_ip": "L’enregistrement DNS « A » du domaine {domain:s} est différent de l’adresse IP de ce serveur. Si vous avez modifié récemment votre enregistrement « A », veuillez attendre sa propagation (quelques vérificateur de propagation sont disponibles en ligne). (Si vous savez ce que vous faites, utilisez --no-checks pour désactiver ces contrôles)", + "certmanager_cannot_read_cert": "Quelque chose s’est mal passé lors de la tentative d’ouverture du certificat actuel pour le domaine {domain:s} (fichier : {file:s}), cause : {reason:s}", + "certmanager_cert_install_success_selfsigned": "Installation avec succès d’un certificat auto-signé pour le domaine {domain:s} !", + "certmanager_cert_install_success": "Installation avec succès d’un certificat Let’s Encrypt pour le domaine {domain:s} !", + "certmanager_cert_renew_success": "Renouvellement avec succès d’un certificat Let’s Encrypt pour le domaine {domain:s} !", + "certmanager_old_letsencrypt_app_detected": "\nYunoHost a détecté que l’application « letsencrypt » est installé, ce qui est en conflit avec les nouvelles fonctionnalités de gestion intégrée de certificats dans YunoHost. Si vous souhaitez utiliser ces nouvelles fonctionnalités intégrées, veuillez lancer les commandes suivantes pour migrer votre installation :\n\n yunohost app remove letsencrypt\n yunohost domain cert-install\n\nN.B. : cela tentera de réinstaller les certificats de tous les domaines avec un certificat Let's Encrypt ou ceux auto-signés.", + "certmanager_cert_signing_failed": "La signature du nouveau certificat a échoué.", + "certmanager_no_cert_file": "Impossible de lire le fichier de certificat pour le domaine {domain:s} (fichier : {file:s})", + "certmanager_conflicting_nginx_file": "Impossible de préparer le domaine pour de défi ACME : le fichier de configuration nginx {filepath:s} est en conflit et doit être retiré au préalable." } From 62a5e5c5df1cb73a0f947bff9d706ee5a61854dd Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Date: Tue, 29 Nov 2016 22:25:36 +0100 Subject: [PATCH 27/38] [i18n] Translated using Weblate (French) Currently translated at 100.0% (257 of 257 strings) --- locales/fr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/fr.json b/locales/fr.json index 6017e3737..01f1cb184 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -265,5 +265,6 @@ "certmanager_old_letsencrypt_app_detected": "\nYunoHost a détecté que l’application « letsencrypt » est installé, ce qui est en conflit avec les nouvelles fonctionnalités de gestion intégrée de certificats dans YunoHost. Si vous souhaitez utiliser ces nouvelles fonctionnalités intégrées, veuillez lancer les commandes suivantes pour migrer votre installation :\n\n yunohost app remove letsencrypt\n yunohost domain cert-install\n\nN.B. : cela tentera de réinstaller les certificats de tous les domaines avec un certificat Let's Encrypt ou ceux auto-signés.", "certmanager_cert_signing_failed": "La signature du nouveau certificat a échoué.", "certmanager_no_cert_file": "Impossible de lire le fichier de certificat pour le domaine {domain:s} (fichier : {file:s})", - "certmanager_conflicting_nginx_file": "Impossible de préparer le domaine pour de défi ACME : le fichier de configuration nginx {filepath:s} est en conflit et doit être retiré au préalable." + "certmanager_conflicting_nginx_file": "Impossible de préparer le domaine pour de défi ACME : le fichier de configuration nginx {filepath:s} est en conflit et doit être retiré au préalable.", + "certmanager_hit_rate_limit": "Trop de certificats ont déjà été demandés récemment pour cet ensemble précis de domaines {domain:s}. Veuillez réessayer plus tard. Lisez https://letsencrypt.org/docs/rate-limits/ pour obtenir plus de détails." } From d6e76d2891ae11935be8b1bf369dbd2c5c5e3ca8 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Date: Thu, 1 Dec 2016 22:46:40 +0100 Subject: [PATCH 28/38] [i18n] Translated using Weblate (French) Currently translated at 100.0% (258 of 258 strings) --- locales/fr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/fr.json b/locales/fr.json index 01f1cb184..f0afe0597 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -266,5 +266,6 @@ "certmanager_cert_signing_failed": "La signature du nouveau certificat a échoué.", "certmanager_no_cert_file": "Impossible de lire le fichier de certificat pour le domaine {domain:s} (fichier : {file:s})", "certmanager_conflicting_nginx_file": "Impossible de préparer le domaine pour de défi ACME : le fichier de configuration nginx {filepath:s} est en conflit et doit être retiré au préalable.", - "certmanager_hit_rate_limit": "Trop de certificats ont déjà été demandés récemment pour cet ensemble précis de domaines {domain:s}. Veuillez réessayer plus tard. Lisez https://letsencrypt.org/docs/rate-limits/ pour obtenir plus de détails." + "certmanager_hit_rate_limit": "Trop de certificats ont déjà été demandés récemment pour cet ensemble précis de domaines {domain:s}. Veuillez réessayer plus tard. Lisez https://letsencrypt.org/docs/rate-limits/ pour obtenir plus de détails.", + "ldap_init_failed_to_create_admin": "L’initialisation de LDAP n’a pas réussi à créer l’utilisateur admin." } From 83e9e10123364044f512382edcd0c4a978c46781 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Date: Mon, 5 Dec 2016 07:29:35 +0100 Subject: [PATCH 29/38] [i18n] Translated using Weblate (French) Currently translated at 100.0% (260 of 260 strings) --- locales/fr.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/locales/fr.json b/locales/fr.json index f0afe0597..ca2d7fe50 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -267,5 +267,7 @@ "certmanager_no_cert_file": "Impossible de lire le fichier de certificat pour le domaine {domain:s} (fichier : {file:s})", "certmanager_conflicting_nginx_file": "Impossible de préparer le domaine pour de défi ACME : le fichier de configuration nginx {filepath:s} est en conflit et doit être retiré au préalable.", "certmanager_hit_rate_limit": "Trop de certificats ont déjà été demandés récemment pour cet ensemble précis de domaines {domain:s}. Veuillez réessayer plus tard. Lisez https://letsencrypt.org/docs/rate-limits/ pour obtenir plus de détails.", - "ldap_init_failed_to_create_admin": "L’initialisation de LDAP n’a pas réussi à créer l’utilisateur admin." + "ldap_init_failed_to_create_admin": "L’initialisation de LDAP n’a pas réussi à créer l’utilisateur admin.", + "ssowat_persistent_conf_read_error": "Erreur lors de la lecture de la configuration persistante de SSOwat : {error:s}. Modifiez le fichier /etc/ssowat/conf.json.persistent pour réparer la syntaxe JSON.", + "ssowat_persistent_conf_write_error": "Erreur lors de la sauvegarde de la configuration persistante de SSOwat : {error:s}. Modifiez le fichier /etc/ssowat/conf.json.persistent pour réparer la syntaxe JSON." } From 6e9f305e8381ce1c0734b7fc4cf4acb5ca07b617 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Date: Thu, 8 Dec 2016 07:09:57 +0100 Subject: [PATCH 30/38] [i18n] Translated using Weblate (French) Currently translated at 100.0% (261 of 261 strings) --- locales/fr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/locales/fr.json b/locales/fr.json index ca2d7fe50..2a05dbd58 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -269,5 +269,6 @@ "certmanager_hit_rate_limit": "Trop de certificats ont déjà été demandés récemment pour cet ensemble précis de domaines {domain:s}. Veuillez réessayer plus tard. Lisez https://letsencrypt.org/docs/rate-limits/ pour obtenir plus de détails.", "ldap_init_failed_to_create_admin": "L’initialisation de LDAP n’a pas réussi à créer l’utilisateur admin.", "ssowat_persistent_conf_read_error": "Erreur lors de la lecture de la configuration persistante de SSOwat : {error:s}. Modifiez le fichier /etc/ssowat/conf.json.persistent pour réparer la syntaxe JSON.", - "ssowat_persistent_conf_write_error": "Erreur lors de la sauvegarde de la configuration persistante de SSOwat : {error:s}. Modifiez le fichier /etc/ssowat/conf.json.persistent pour réparer la syntaxe JSON." + "ssowat_persistent_conf_write_error": "Erreur lors de la sauvegarde de la configuration persistante de SSOwat : {error:s}. Modifiez le fichier /etc/ssowat/conf.json.persistent pour réparer la syntaxe JSON.", + "domain_cannot_remove_main": "Impossible de retirer le domaine principal. Définissez un nouveau domaine principal au préalable." } From 41f70f5d56770c44af1cf883308786a1c8ee55e8 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Holcroft Date: Sun, 11 Dec 2016 22:56:27 +0100 Subject: [PATCH 31/38] [i18n] Translated using Weblate (French) Currently translated at 100.0% (263 of 263 strings) --- locales/fr.json | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/locales/fr.json b/locales/fr.json index 2a05dbd58..ed299daf1 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -59,7 +59,7 @@ "backup_hook_unknown": "Script de sauvegarde « {hook:s} » inconnu", "backup_invalid_archive": "Archive de sauvegarde incorrecte", "backup_nothings_done": "Il n'y a rien à sauvegarder", - "backup_output_directory_forbidden": "Dossier de sortie interdit. Les sauvegardes ne peuvent être créées dans les dossiers /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var ou /home/yunohost.backup/archives.", + "backup_output_directory_forbidden": "Dossier de destination interdit. Les sauvegardes ne peuvent être créées dans les dossiers /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var ou /home/yunohost.backup/archives", "backup_output_directory_not_empty": "Le dossier de sortie n'est pas vide", "backup_output_directory_required": "Vous devez spécifier un dossier de sortie pour la sauvegarde", "backup_running_app_script": "Lancement du script de sauvegarde de l'application « {app:s} »...", @@ -82,11 +82,11 @@ "domain_dyndns_invalid": "Domaine incorrect pour un usage avec DynDNS", "domain_dyndns_root_unknown": "Domaine DynDNS principal inconnu", "domain_exists": "Le domaine existe déjà", - "domain_uninstall_app_first": "Une ou plusieurs applications sont installées sur ce domaine. Veuillez d'abord les désinstaller avant de supprimer ce domaine.", + "domain_uninstall_app_first": "Une ou plusieurs applications sont installées sur ce domaine. Veuillez d'abord les désinstaller avant de supprimer ce domaine", "domain_unknown": "Domaine inconnu", "domain_zone_exists": "Le fichier de zone DNS existe déjà", "domain_zone_not_found": "Fichier de zone DNS introuvable pour le domaine {:s}", - "done": "Terminé.", + "done": "Terminé", "downloading": "Téléchargement...", "dyndns_cron_installed": "La tâche cron pour le domaine DynDNS a été installée", "dyndns_cron_remove_failed": "Impossible d'enlever la tâche cron pour le domaine DynDNS", @@ -105,7 +105,7 @@ "field_invalid": "Champ incorrect : « {:s} »", "firewall_reload_failed": "Impossible de recharger le pare-feu", "firewall_reloaded": "Le pare-feu a été rechargé", - "firewall_rules_cmd_failed": "Certaines règles du pare-feu n'ont pas pu être appliquées. Pour plus d'informations, consultez le journal.", + "firewall_rules_cmd_failed": "Certaines règles du pare-feu n'ont pas pu être appliquées. Pour plus d'informations, consultez le journal", "format_datetime_short": "%d/%m/%Y %H:%M", "hook_argument_missing": "Argument manquant : '{:s}'", "hook_choice_invalid": "Choix incorrect : '{:s}'", @@ -115,8 +115,8 @@ "hook_name_unknown": "Nom de script « {name:s} » inconnu", "installation_complete": "Installation terminée", "installation_failed": "Échec de l'installation", - "ip6tables_unavailable": "Vous ne pouvez pas jouer avec ip6tables ici. Vous êtes sûrement dans un conteneur, ou alors votre noyau ne le supporte pas.", - "iptables_unavailable": "Vous ne pouvez pas jouer avec iptables ici. Vous êtes sûrement dans un conteneur, autrement votre noyau ne le supporte pas.", + "ip6tables_unavailable": "Vous ne pouvez pas jouer avec ip6tables ici. Vous êtes soit dans un conteneur, soit votre noyau ne le supporte pas", + "iptables_unavailable": "Vous ne pouvez pas jouer avec iptables ici. Vous êtes soit dans un conteneur, soit votre noyau ne le supporte pas", "ldap_initialized": "L'annuaire LDAP a été initialisé", "license_undefined": "indéfinie", "mail_alias_remove_failed": "Impossible de supprimer l'adresse courriel supplémentaire « {mail:s} »", @@ -248,27 +248,29 @@ "yunohost_ca_creation_failed": "Impossible de créer l'autorité de certification", "yunohost_configured": "YunoHost a été configuré", "yunohost_installing": "Installation de YunoHost...", - "yunohost_not_installed": "YunoHost n'est pas ou pas correctement installé. Veuillez exécuter « yunohost tools postinstall ».", + "yunohost_not_installed": "YunoHost n'est pas ou pas correctement installé. Veuillez exécuter « yunohost tools postinstall »", "certmanager_attempt_to_replace_valid_cert": "Vous êtes en train de remplacer un certificat correct et valide pour le domaine {domain:s} ! (Utilisez --force pour contourner)", "certmanager_domain_unknown": "Domaine inconnu {domain:s}", "certmanager_domain_cert_not_selfsigned": "Le certificat du domaine {domain:s} n’est pas auto-signé. Voulez-vous vraiment le remplacer ? (Utilisez --force)", "certmanager_certificate_fetching_or_enabling_failed": "Il semble que l'activation du nouveau certificat pour {domain:s} a échoué…", "certmanager_attempt_to_renew_nonLE_cert": "Le certificat pour le domaine {domain:s} n’est pas fourni par Let’s Encrypt. Impossible de le renouveler automatiquement !", "certmanager_attempt_to_renew_valid_cert": "Le certificat pour le domaine {domain:s} est sur le point d’expirer ! Utilisez --force pour contourner", - "certmanager_domain_http_not_working": "Il semble que le domaine {domain:s} n’est pas accessible via HTTP. Veuillez vérifier que vos configuration DNS et nginx sont correctes.", + "certmanager_domain_http_not_working": "Il semble que le domaine {domain:s} n’est pas accessible via HTTP. Veuillez vérifier que vos configuration DNS et nginx sont correctes", "certmanager_error_no_A_record": "Aucun enregistrement DNS « A » n’a été trouvé pour {domain:s}. De devez faire pointer votre nom de domaine vers votre machine pour être capable d’installer un certificat Let’s Encrypt ! (Si vous savez ce que vous faites, utilisez --no-checks pour désactiver ces contrôles)", "certmanager_domain_dns_ip_differs_from_public_ip": "L’enregistrement DNS « A » du domaine {domain:s} est différent de l’adresse IP de ce serveur. Si vous avez modifié récemment votre enregistrement « A », veuillez attendre sa propagation (quelques vérificateur de propagation sont disponibles en ligne). (Si vous savez ce que vous faites, utilisez --no-checks pour désactiver ces contrôles)", "certmanager_cannot_read_cert": "Quelque chose s’est mal passé lors de la tentative d’ouverture du certificat actuel pour le domaine {domain:s} (fichier : {file:s}), cause : {reason:s}", "certmanager_cert_install_success_selfsigned": "Installation avec succès d’un certificat auto-signé pour le domaine {domain:s} !", "certmanager_cert_install_success": "Installation avec succès d’un certificat Let’s Encrypt pour le domaine {domain:s} !", "certmanager_cert_renew_success": "Renouvellement avec succès d’un certificat Let’s Encrypt pour le domaine {domain:s} !", - "certmanager_old_letsencrypt_app_detected": "\nYunoHost a détecté que l’application « letsencrypt » est installé, ce qui est en conflit avec les nouvelles fonctionnalités de gestion intégrée de certificats dans YunoHost. Si vous souhaitez utiliser ces nouvelles fonctionnalités intégrées, veuillez lancer les commandes suivantes pour migrer votre installation :\n\n yunohost app remove letsencrypt\n yunohost domain cert-install\n\nN.B. : cela tentera de réinstaller les certificats de tous les domaines avec un certificat Let's Encrypt ou ceux auto-signés.", - "certmanager_cert_signing_failed": "La signature du nouveau certificat a échoué.", + "certmanager_old_letsencrypt_app_detected": "\nYunoHost a détecté que l’application « letsencrypt » est installé, ce qui est en conflit avec les nouvelles fonctionnalités de gestion intégrée de certificats dans YunoHost. Si vous souhaitez utiliser ces nouvelles fonctionnalités intégrées, veuillez lancer les commandes suivantes pour migrer votre installation :\n\n yunohost app remove letsencrypt\n yunohost domain cert-install\n\nN.B. : cela tentera de réinstaller les certificats de tous les domaines avec un certificat Let's Encrypt ou ceux auto-signés", + "certmanager_cert_signing_failed": "La signature du nouveau certificat a échoué", "certmanager_no_cert_file": "Impossible de lire le fichier de certificat pour le domaine {domain:s} (fichier : {file:s})", - "certmanager_conflicting_nginx_file": "Impossible de préparer le domaine pour de défi ACME : le fichier de configuration nginx {filepath:s} est en conflit et doit être retiré au préalable.", - "certmanager_hit_rate_limit": "Trop de certificats ont déjà été demandés récemment pour cet ensemble précis de domaines {domain:s}. Veuillez réessayer plus tard. Lisez https://letsencrypt.org/docs/rate-limits/ pour obtenir plus de détails.", - "ldap_init_failed_to_create_admin": "L’initialisation de LDAP n’a pas réussi à créer l’utilisateur admin.", - "ssowat_persistent_conf_read_error": "Erreur lors de la lecture de la configuration persistante de SSOwat : {error:s}. Modifiez le fichier /etc/ssowat/conf.json.persistent pour réparer la syntaxe JSON.", - "ssowat_persistent_conf_write_error": "Erreur lors de la sauvegarde de la configuration persistante de SSOwat : {error:s}. Modifiez le fichier /etc/ssowat/conf.json.persistent pour réparer la syntaxe JSON.", - "domain_cannot_remove_main": "Impossible de retirer le domaine principal. Définissez un nouveau domaine principal au préalable." + "certmanager_conflicting_nginx_file": "Impossible de préparer le domaine pour de défi ACME : le fichier de configuration nginx {filepath:s} est en conflit et doit être retiré au préalable", + "certmanager_hit_rate_limit": "Trop de certificats ont déjà été demandés récemment pour cet ensemble précis de domaines {domain:s}. Veuillez réessayer plus tard. Lisez https://letsencrypt.org/docs/rate-limits/ pour obtenir plus de détails", + "ldap_init_failed_to_create_admin": "L’initialisation de LDAP n’a pas réussi à créer l’utilisateur admin", + "ssowat_persistent_conf_read_error": "Erreur lors de la lecture de la configuration persistante de SSOwat : {error:s}. Modifiez le fichier /etc/ssowat/conf.json.persistent pour réparer la syntaxe JSON", + "ssowat_persistent_conf_write_error": "Erreur lors de la sauvegarde de la configuration persistante de SSOwat : {error:s}. Modifiez le fichier /etc/ssowat/conf.json.persistent pour réparer la syntaxe JSON", + "domain_cannot_remove_main": "Impossible de retirer le domaine principal. Définissez un nouveau domaine principal au préalable.", + "certmanager_self_ca_conf_file_not_found": "Le fichier de configuration pour l’autorité du certificat auto-signé est introuvable (fichier : {file:s})", + "certmanager_unable_to_parse_self_CA_name": "Impossible d’analyser le nom de l’autorité du certificat auto-signé (fichier : {file:s})" } From 64a831721323c079ddc9ff86a0fe00515040068a Mon Sep 17 00:00:00 2001 From: Genma Date: Mon, 12 Dec 2016 12:22:44 +0100 Subject: [PATCH 32/38] [i18n] Translated using Weblate (French) Currently translated at 100.0% (264 of 264 strings) --- locales/fr.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/locales/fr.json b/locales/fr.json index ed299daf1..c7fc1a130 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -111,7 +111,7 @@ "hook_choice_invalid": "Choix incorrect : '{:s}'", "hook_exec_failed": "Échec de l'exécution du script « {path:s} »", "hook_exec_not_terminated": "L'exécution du script « {path:s} » ne s'est pas terminée", - "hook_list_by_invalid": "Propriété pour lister les scripts incorrecte", + "hook_list_by_invalid": "Propriété pour lister les scripts incorrects", "hook_name_unknown": "Nom de script « {name:s} » inconnu", "installation_complete": "Installation terminée", "installation_failed": "Échec de l'installation", @@ -272,5 +272,6 @@ "ssowat_persistent_conf_write_error": "Erreur lors de la sauvegarde de la configuration persistante de SSOwat : {error:s}. Modifiez le fichier /etc/ssowat/conf.json.persistent pour réparer la syntaxe JSON", "domain_cannot_remove_main": "Impossible de retirer le domaine principal. Définissez un nouveau domaine principal au préalable.", "certmanager_self_ca_conf_file_not_found": "Le fichier de configuration pour l’autorité du certificat auto-signé est introuvable (fichier : {file:s})", - "certmanager_unable_to_parse_self_CA_name": "Impossible d’analyser le nom de l’autorité du certificat auto-signé (fichier : {file:s})" + "certmanager_unable_to_parse_self_CA_name": "Impossible d’analyser le nom de l’autorité du certificat auto-signé (fichier : {file:s})", + "mailbox_used_space_dovecot_down": "Le service de mail Dovecot doit être démarré, si vous souhaitez voir l'espace disque occupé par la boîte mail." } From a3f2e62c11b0b842bf89dc57f65622de9da482c6 Mon Sep 17 00:00:00 2001 From: Moul Date: Mon, 12 Dec 2016 21:34:07 +0100 Subject: [PATCH 33/38] [enh] readme: add translation badge status. --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 714fa0980..9aed880ac 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,10 @@ This repository is the core of YunoHost code. + +Translation status + + ## Issues - [Please report issues on YunoHost bugtracker](https://dev.yunohost.org/projects/yunohost/issues) (no registration needed). From e3b7db71f2fa6ee5a70efcd31e087172988b1bcf Mon Sep 17 00:00:00 2001 From: Juanu Date: Tue, 13 Dec 2016 14:00:04 +0100 Subject: [PATCH 34/38] [i18n] Translated using Weblate (Spanish) Currently translated at 100.0% (264 of 264 strings) --- locales/es.json | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/locales/es.json b/locales/es.json index 549cbe29a..093fb17fa 100644 --- a/locales/es.json +++ b/locales/es.json @@ -58,7 +58,7 @@ "backup_hook_unknown": "Hook de copia de seguridad desconocido '{hook:s}'", "backup_invalid_archive": "La copia de seguridad no es válida", "backup_nothings_done": "No hay nada que guardar", - "backup_output_directory_forbidden": "Directorio de salida no permitido. Las copias de seguridad no pueden ser creadas en /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var o en los subdirectorios /home/yunohost.backup.", + "backup_output_directory_forbidden": "Directorio de salida no permitido. Las copias de seguridad no pueden ser creadas en /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var o en los subdirectorios de /home/yunohost.backup/archives", "backup_output_directory_not_empty": "El directorio de salida no está vacío", "backup_output_directory_required": "Debe proporcionar un directorio de salida para la copia de seguridad", "backup_running_app_script": "Ejecutando la script de copia de seguridad de la aplicación '{app:s}'...", @@ -114,8 +114,8 @@ "hook_name_unknown": "Nombre de hook desconocido '{name:s}'", "installation_complete": "Instalación finalizada", "installation_failed": "No pudo realizar la instalación", - "ip6tables_unavailable": "No puede modificar ip6tables aquí. O bien está en un 'container' o su kernel no soporta esta opción.", - "iptables_unavailable": "No puede modificar iptables aquí. O bien está en un 'container' o su kernel no soporta esta opción.", + "ip6tables_unavailable": "No puede modificar ip6tables aquí. O bien está en un 'container' o su kernel no soporta esta opción", + "iptables_unavailable": "No puede modificar iptables aquí. O bien está en un 'container' o su kernel no soporta esta opción", "ldap_initialized": "LDAP iniciado", "license_undefined": "indefinido", "mail_alias_remove_failed": "No se pudo eliminar el alias de correo '{mail:s}'", @@ -240,5 +240,30 @@ "yunohost_ca_creation_failed": "No se pudo crear el certificado de autoridad", "yunohost_configured": "YunoHost ha sido configurado", "yunohost_installing": "Instalando YunoHost...", - "yunohost_not_installed": "YunoHost no está instalado o ha habido errores en la instalación. Ejecute 'yunohost tools postinstall'." + "yunohost_not_installed": "YunoHost no está instalado o ha habido errores en la instalación. Ejecute 'yunohost tools postinstall'", + "ldap_init_failed_to_create_admin": "La inicialización de LDAP falló al crear el usuario administrador", + "mailbox_used_space_dovecot_down": "El servicio de e-mail Dovecot debe estar funcionando si desea obtener el espacio utilizado por el buzón", + "ssowat_persistent_conf_read_error": "Error al leer la configuración persistente de SSOwat: {error:s} 1. Edite el archivo /etc/ssowat/conf.json.persistent para corregir la sintaxis de JSON", + "ssowat_persistent_conf_write_error": "Error al guardar la configuración persistente de SSOwat: {error:s} 1. Edite el archivo /etc/ssowat/conf.json.persistent para corregir la sintaxis de JSON", + "certmanager_attempt_to_replace_valid_cert": "Está intentando sobrescribir un certificado correcto y válido para el dominio {domain:s} 1! (Use --force para omitir este mensaje)", + "certmanager_domain_unknown": "Dominio desconocido {domain:s} 1", + "certmanager_domain_cert_not_selfsigned": "El certificado para el dominio {domain:s} 1 no es autofirmado. ¿Estás seguro de que quiere reemplazarlo? (Use --force para omitir este mensaje)", + "certmanager_certificate_fetching_or_enabling_failed": "Parece que al habilitar el nuevo certificado para {domain:s} 1 falla de alguna manera...", + "certmanager_attempt_to_renew_nonLE_cert": "El certificado para el dominio {domain:s} 1 no está emitido por Let's Encrypt. ¡No se puede renovar automáticamente!", + "certmanager_attempt_to_renew_valid_cert": "El certificado para el dominio {domain:s} 1 no está a punto de expirar! Utilice --force para omitir este mensaje", + "certmanager_domain_http_not_working": "Parece que no se puede acceder al dominio {domain:s} 1 a través de HTTP. Compruebe que la configuración del DNS y de nginx es correcta", + "certmanager_error_no_A_record": "No se ha encontrado un registro DNS 'A' para el dominio {domain:s} 1. Debe hacer que su nombre de dominio apunte a su máquina para poder instalar un certificado Let's Encrypt. (Si sabe lo que está haciendo, use --no-checks para desactivar esas comprobaciones.)", + "certmanager_domain_dns_ip_differs_from_public_ip": "El registro DNS 'A' para el dominio {domain:s} 1 es diferente de la IP de este servidor. Si recientemente modificó su registro A, espere a que se propague (existen algunos controladores de propagación DNS disponibles en línea). (Si sabe lo que está haciendo, use --no-checks para desactivar esas comprobaciones.)", + "certmanager_cannot_read_cert": "Se ha producido un error al intentar abrir el certificado actual para el dominio {domain:s} 1 (archivo: {file:s} 2), razón: {reason:s} 3", + "certmanager_cert_install_success_selfsigned": "¡Se ha instalado correctamente un certificado autofirmado para el dominio {domain:s} 1!", + "certmanager_cert_install_success": "Se ha instalado correctamente un certificado Let's Encrypt para el dominio {domain:s} 1!", + "certmanager_cert_renew_success": "¡Se ha renovado correctamente el certificado Let's Encrypt para el dominio {domain:s} 1!", + "certmanager_old_letsencrypt_app_detected": "\nYunohost ha detectado que la aplicación 'letsencrypt' está instalada y esto produce conflictos con las nuevas funciones de administración de certificados integradas en Yunohost. Si desea utilizar las nuevas funciones integradas, ejecute los siguientes comandos para migrar su instalación:\n\n Yunohost app remove letsencrypt\n Yunohost domain cert-install\n\nP.D.: esto intentará reinstalar certificados para todos los dominios con un certificado Let's Encrypt o un certificado autofirmado", + "certmanager_hit_rate_limit": "Se han emitido demasiados certificados recientemente para el conjunto de dominios {domain:s} 1. Por favor, inténtelo de nuevo más tarde. Consulte https://letsencrypt.org/docs/rate-limits/ para obtener más detalles", + "certmanager_cert_signing_failed": "No se pudo firmar el nuevo certificado", + "certmanager_no_cert_file": "No se puede leer el certificado para el dominio {domain:s} 1 (archivo: {file:s} 2)", + "certmanager_conflicting_nginx_file": "No se puede preparar el dominio para el desafío ACME: el archivo de configuración nginx {filepath:s} 1 está en conflicto y debe ser eliminado primero", + "domain_cannot_remove_main": "No se puede eliminar el dominio principal. Primero debe establecer un nuevo dominio principal", + "certmanager_self_ca_conf_file_not_found": "No se ha encontrado el archivo de configuración para la autoridad de autofirma (file: {file:s} 1)", + "certmanager_unable_to_parse_self_CA_name": "No se puede procesar el nombre de la autoridad de autofirma (file: {file:s} 1)" } From 72789875347a49c8be9ad90791cdac58426636e2 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Holcroft Date: Tue, 13 Dec 2016 07:20:51 +0100 Subject: [PATCH 35/38] [i18n] Translated using Weblate (French) Currently translated at 100.0% (264 of 264 strings) --- locales/fr.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locales/fr.json b/locales/fr.json index c7fc1a130..35749030c 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -119,9 +119,9 @@ "iptables_unavailable": "Vous ne pouvez pas jouer avec iptables ici. Vous êtes soit dans un conteneur, soit votre noyau ne le supporte pas", "ldap_initialized": "L'annuaire LDAP a été initialisé", "license_undefined": "indéfinie", - "mail_alias_remove_failed": "Impossible de supprimer l'adresse courriel supplémentaire « {mail:s} »", - "mail_domain_unknown": "Le domaine « {domain:s} » de l'adresse courriel est inconnu", - "mail_forward_remove_failed": "Impossible de supprimer l'adresse courriel de transfert « {mail:s} »", + "mail_alias_remove_failed": "Impossible de supprimer l'alias courriel « {mail:s} »", + "mail_domain_unknown": "Le domaine « {domain:s} » du courriel est inconnu", + "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 a été modifié", "monitor_disabled": "La supervision du serveur a été désactivé", @@ -155,7 +155,7 @@ "path_removal_failed": "Impossible de supprimer le chemin {:s}", "pattern_backup_archive_name": "Doit être un nom de fichier valide composé de caractères alphanumérique et -_. uniquement", "pattern_domain": "Doit être un nom de domaine valide (ex : mon-domaine.org)", - "pattern_email": "Doit être une adresse courriel valide (ex. : someone@domain.org)", + "pattern_email": "Doit être une adresse courriel valide (ex. : pseudo@domain.org)", "pattern_firstname": "Doit être un prénom valide", "pattern_lastname": "Doit être un nom valide", "pattern_listname": "Doit être composé uniquement de caractères alphanumériques et de tirets bas", @@ -273,5 +273,5 @@ "domain_cannot_remove_main": "Impossible de retirer le domaine principal. Définissez un nouveau domaine principal au préalable.", "certmanager_self_ca_conf_file_not_found": "Le fichier de configuration pour l’autorité du certificat auto-signé est introuvable (fichier : {file:s})", "certmanager_unable_to_parse_self_CA_name": "Impossible d’analyser le nom de l’autorité du certificat auto-signé (fichier : {file:s})", - "mailbox_used_space_dovecot_down": "Le service de mail Dovecot doit être démarré, si vous souhaitez voir l'espace disque occupé par la boîte mail." + "mailbox_used_space_dovecot_down": "Le service de mail Dovecot doit être démarré, si vous souhaitez voir l'espace disque occupé par la messagerie" } From cde530735e942fef067c1fb4aa30d1022590b7f8 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Tue, 13 Dec 2016 15:09:25 +0100 Subject: [PATCH 36/38] [enh] add empty file for breton translation --- locales/br.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 locales/br.json diff --git a/locales/br.json b/locales/br.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/locales/br.json @@ -0,0 +1 @@ +{} From 12c66d153096b13abe99e8978eb35cd6c2edc2f6 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Sat, 3 Dec 2016 00:36:22 +0100 Subject: [PATCH 37/38] [enh] remove timeout from cli interface --- bin/yunohost | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bin/yunohost b/bin/yunohost index b2a0e4b1b..0bf2c004c 100755 --- a/bin/yunohost +++ b/bin/yunohost @@ -66,6 +66,10 @@ def _parse_cli_args(): action='store_true', default=False, help="Don't produce any output", ) + parser.add_argument('--timeout', + type=int, default=None, + help="Number of seconds before this command will timeout because it can't acquire the lock (meaning that another command is currently running), by default there is no timeout and the command will wait until it can get the lock", + ) parser.add_argument('--admin-password', default=None, dest='password', metavar='PASSWORD', help="The admin password to use to authenticate", @@ -209,6 +213,7 @@ if __name__ == '__main__': ret = moulinette.cli( _retrieve_namespaces(), args, use_cache=opts.use_cache, output_as=opts.output_as, - password=opts.password, parser_kwargs={'top_parser': parser} + password=opts.password, parser_kwargs={'top_parser': parser}, + timeout=opts.timeout, ) sys.exit(ret) From eb1f6a77a9c1800ffd520316dcae097bb155d869 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Thu, 15 Dec 2016 16:33:46 +0100 Subject: [PATCH 38/38] Revert "Revert "[fix] Can't restore app on a root domain"" This reverts commit 7717c58de4c8cda615165d84a12a30dd73eea58a. --- src/yunohost/app.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/yunohost/app.py b/src/yunohost/app.py index eb22cb955..85693a0dd 100644 --- a/src/yunohost/app.py +++ b/src/yunohost/app.py @@ -917,10 +917,6 @@ def app_checkurl(auth, url, app=None): raise MoulinetteError(errno.EINVAL, m18n.n('domain_unknown')) if domain in apps_map: - # Domain already has apps on sub path - if path == '/': - raise MoulinetteError(errno.EPERM, - m18n.n('app_location_install_failed')) # Loop through apps for p, a in apps_map[domain].items(): # Skip requested app checking @@ -930,7 +926,7 @@ def app_checkurl(auth, url, app=None): if path == p: raise MoulinetteError(errno.EINVAL, m18n.n('app_location_already_used')) - elif path.startswith(p): + elif path.startswith(p) or p.startswith(path): raise MoulinetteError(errno.EPERM, m18n.n('app_location_install_failed'))