mirror of
https://github.com/YunoHost/yunohost.git
synced 2024-09-03 20:06:10 +02:00
Merge branch 'dev' of https://github.com/YunoHost/yunohost into dev
This commit is contained in:
commit
eb1fe7ceef
66 changed files with 1105 additions and 1275 deletions
|
@ -1,3 +1,4 @@
|
|||
---
|
||||
stages:
|
||||
- build
|
||||
- install
|
||||
|
@ -12,7 +13,7 @@ default:
|
|||
interruptible: true
|
||||
|
||||
variables:
|
||||
YNH_BUILD_DIR: "ynh-build"
|
||||
YNH_BUILD_DIR: "ynh-build"
|
||||
|
||||
include:
|
||||
- local: .gitlab/ci/build.gitlab-ci.yml
|
||||
|
|
|
@ -12,7 +12,7 @@ generate-helpers-doc:
|
|||
- git config --global user.name "$GITHUB_USER"
|
||||
script:
|
||||
- cd doc
|
||||
- python generate_helper_doc.py
|
||||
- python3 generate_helper_doc.py
|
||||
- hub clone https://$GITHUB_TOKEN:x-oauth-basic@github.com/YunoHost/doc.git doc_repo
|
||||
- cp helpers.md doc_repo/pages/02.contribute/04.packaging_apps/11.helpers/packaging_apps_helpers.md
|
||||
- cd doc_repo
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
########################################
|
||||
# later we must fix lint and format-check jobs and remove "allow_failure"
|
||||
|
||||
---
|
||||
lint37:
|
||||
stage: lint
|
||||
image: "before-install"
|
||||
|
@ -37,11 +38,13 @@ format-run:
|
|||
- hub clone --branch ${CI_COMMIT_REF_NAME} "https://$GITHUB_TOKEN:x-oauth-basic@github.com/YunoHost/yunohost.git" github_repo
|
||||
- cd github_repo
|
||||
script:
|
||||
# checkout or create and checkout the branch
|
||||
- hub checkout "ci-format-${CI_COMMIT_REF_NAME}" || hub checkout -b "ci-format-${CI_COMMIT_REF_NAME}"
|
||||
# create a local branch that will overwrite distant one
|
||||
- git checkout -b "ci-format-${CI_COMMIT_REF_NAME}" --no-track
|
||||
- tox -e py37-black-run
|
||||
- hub commit -am "[CI] Format code" || true
|
||||
- '[ $(git diff | wc -l) != 0 ] || exit 0' # stop if there is nothing to commit
|
||||
- git commit -am "[CI] Format code" || true
|
||||
- git push -f origin "ci-format-${CI_COMMIT_REF_NAME}":"ci-format-${CI_COMMIT_REF_NAME}"
|
||||
- hub pull-request -m "[CI] Format code" -b Yunohost:dev -p || true # GITHUB_USER and GITHUB_TOKEN registered here https://gitlab.com/yunohost/yunohost/-/settings/ci_cd
|
||||
only:
|
||||
refs:
|
||||
- dev
|
||||
refs:
|
||||
- dev
|
||||
|
|
|
@ -252,30 +252,6 @@ user:
|
|||
extra:
|
||||
pattern: *pattern_groupname
|
||||
|
||||
### user_group_update()
|
||||
update:
|
||||
action_help: Update group
|
||||
api: PUT /users/groups/<groupname>
|
||||
arguments:
|
||||
groupname:
|
||||
help: Name of the group to be updated
|
||||
extra:
|
||||
pattern: *pattern_groupname
|
||||
-a:
|
||||
full: --add
|
||||
help: User(s) to add in the group
|
||||
nargs: "*"
|
||||
metavar: USERNAME
|
||||
extra:
|
||||
pattern: *pattern_username
|
||||
-r:
|
||||
full: --remove
|
||||
help: User(s) to remove in the group
|
||||
nargs: "*"
|
||||
metavar: USERNAME
|
||||
extra:
|
||||
pattern: *pattern_username
|
||||
|
||||
### user_group_info()
|
||||
info:
|
||||
action_help: Get information about a specific group
|
||||
|
@ -286,6 +262,38 @@ user:
|
|||
extra:
|
||||
pattern: *pattern_username
|
||||
|
||||
### user_group_add()
|
||||
add:
|
||||
action_help: Add users to group
|
||||
api: PUT /users/groups/<groupname>/add/<usernames>
|
||||
arguments:
|
||||
groupname:
|
||||
help: Name of the group to add user(s) to
|
||||
extra:
|
||||
pattern: *pattern_groupname
|
||||
usernames:
|
||||
help: User(s) to add in the group
|
||||
nargs: "*"
|
||||
metavar: USERNAME
|
||||
extra:
|
||||
pattern: *pattern_username
|
||||
|
||||
### user_group_remove()
|
||||
remove:
|
||||
action_help: Remove users from group
|
||||
api: PUT /users/groups/<groupname>/remove/<usernames>
|
||||
arguments:
|
||||
groupname:
|
||||
help: Name of the group to remove user(s) from
|
||||
extra:
|
||||
pattern: *pattern_groupname
|
||||
usernames:
|
||||
help: User(s) to remove from the group
|
||||
nargs: "*"
|
||||
metavar: USERNAME
|
||||
extra:
|
||||
pattern: *pattern_username
|
||||
|
||||
permission:
|
||||
subcategory_help: Manage permissions
|
||||
actions:
|
||||
|
@ -322,20 +330,6 @@ user:
|
|||
arguments:
|
||||
permission:
|
||||
help: Permission to manage (e.g. mail or nextcloud or wordpress.editors) (use "yunohost user permission list" and "yunohost user permission -f" to see all the current permissions)
|
||||
-a:
|
||||
full: --add
|
||||
help: Group or usernames to grant this permission to
|
||||
nargs: "*"
|
||||
metavar: GROUP_OR_USER
|
||||
extra:
|
||||
pattern: *pattern_username
|
||||
-r:
|
||||
full: --remove
|
||||
help: Group or usernames revoke this permission from
|
||||
nargs: "*"
|
||||
metavar: GROUP_OR_USER
|
||||
extra:
|
||||
pattern: *pattern_username
|
||||
-l:
|
||||
full: --label
|
||||
help: Label for this permission. This label will be shown on the SSO and in the admin
|
||||
|
@ -346,10 +340,38 @@ user:
|
|||
- 'True'
|
||||
- 'False'
|
||||
|
||||
## user_permission_add()
|
||||
add:
|
||||
action_help: Grant permission to group or user
|
||||
api: PUT /users/permissions/<permission>/add/<names>
|
||||
arguments:
|
||||
permission:
|
||||
help: Permission to manage (e.g. mail or nextcloud or wordpress.editors) (use "yunohost user permission list" and "yunohost user permission -f" to see all the current permissions)
|
||||
names:
|
||||
help: Group or usernames to grant this permission to
|
||||
nargs: "*"
|
||||
metavar: GROUP_OR_USER
|
||||
extra:
|
||||
pattern: *pattern_username
|
||||
|
||||
## user_permission_remove()
|
||||
remove:
|
||||
action_help: Revoke permission to group or user
|
||||
api: PUT /users/permissions/<permission>/remove/<names>
|
||||
arguments:
|
||||
permission:
|
||||
help: Permission to manage (e.g. mail or nextcloud or wordpress.editors) (use "yunohost user permission list" and "yunohost user permission -f" to see all the current permissions)
|
||||
names:
|
||||
help: Group or usernames to revoke this permission to
|
||||
nargs: "*"
|
||||
metavar: GROUP_OR_USER
|
||||
extra:
|
||||
pattern: *pattern_username
|
||||
|
||||
## user_permission_reset()
|
||||
reset:
|
||||
action_help: Reset allowed groups to the default (all_users) for a given permission
|
||||
api: DELETE /users/permissions/<app>
|
||||
api: DELETE /users/permissions/<permission>
|
||||
arguments:
|
||||
permission:
|
||||
help: Permission to manage (e.g. mail or nextcloud or wordpress.editors) (use "yunohost user permission list" and "yunohost user permission -f" to see all the current permissions)
|
||||
|
@ -357,25 +379,6 @@ user:
|
|||
ssh:
|
||||
subcategory_help: Manage ssh access
|
||||
actions:
|
||||
### user_ssh_enable()
|
||||
allow:
|
||||
action_help: Allow the user to uses ssh
|
||||
api: POST /users/ssh/enable
|
||||
arguments:
|
||||
username:
|
||||
help: Username of the user
|
||||
extra:
|
||||
pattern: *pattern_username
|
||||
|
||||
### user_ssh_disable()
|
||||
disallow:
|
||||
action_help: Disallow the user to uses ssh
|
||||
api: POST /users/ssh/disable
|
||||
arguments:
|
||||
username:
|
||||
help: Username of the user
|
||||
extra:
|
||||
pattern: *pattern_username
|
||||
|
||||
### user_ssh_keys_list()
|
||||
list-keys:
|
||||
|
@ -414,7 +417,6 @@ user:
|
|||
key:
|
||||
help: The key to be removed
|
||||
|
||||
|
||||
#############################
|
||||
# Domain #
|
||||
#############################
|
||||
|
@ -485,7 +487,7 @@ domain:
|
|||
- maindomain
|
||||
api:
|
||||
- GET /domains/main
|
||||
- PUT /domains/main
|
||||
- PUT /domains/<new_main_domain>/main
|
||||
arguments:
|
||||
-n:
|
||||
full: --new-main-domain
|
||||
|
@ -496,7 +498,7 @@ domain:
|
|||
### certificate_status()
|
||||
cert-status:
|
||||
action_help: List status of current certificates (all by default).
|
||||
api: GET /domains/cert-status/<domain_list>
|
||||
api: GET /domains/<domain_list>/cert
|
||||
arguments:
|
||||
domain_list:
|
||||
help: Domains to check
|
||||
|
@ -508,7 +510,7 @@ domain:
|
|||
### certificate_install()
|
||||
cert-install:
|
||||
action_help: Install Let's Encrypt certificates for given domains (all by default).
|
||||
api: POST /domains/cert-install/<domain_list>
|
||||
api: PUT /domains/<domain_list>/cert
|
||||
arguments:
|
||||
domain_list:
|
||||
help: Domains for which to install the certificates
|
||||
|
@ -529,7 +531,7 @@ domain:
|
|||
### certificate_renew()
|
||||
cert-renew:
|
||||
action_help: Renew the Let's Encrypt certificates for given domains (all by default).
|
||||
api: POST /domains/cert-renew/<domain_list>
|
||||
api: PUT /domains/<domain_list>/cert/renew
|
||||
arguments:
|
||||
domain_list:
|
||||
help: Domains for which to renew the certificates
|
||||
|
@ -550,7 +552,7 @@ domain:
|
|||
### domain_url_available()
|
||||
url-available:
|
||||
action_help: Check availability of a web path
|
||||
api: GET /domain/urlavailable
|
||||
api: GET /domain/<domain>/urlavailable
|
||||
arguments:
|
||||
domain:
|
||||
help: The domain for the web path (e.g. your.domain.tld)
|
||||
|
@ -559,20 +561,6 @@ domain:
|
|||
path:
|
||||
help: The path to check (e.g. /coffee)
|
||||
|
||||
|
||||
### domain_info()
|
||||
# info:
|
||||
# action_help: Get domain informations
|
||||
# api: GET /domains/<domain>
|
||||
# arguments:
|
||||
# domain:
|
||||
# help: ""
|
||||
# extra:
|
||||
# pattern:
|
||||
# - '^([a-zA-Z0-9]{1}([a-zA-Z0-9\-]*[a-zA-Z0-9])*)(\.[a-zA-Z0-9]{1}([a-zA-Z0-9\-]*[a-zA-Z0-9])*)*(\.[a-zA-Z]{1}([a-zA-Z0-9\-]*[a-zA-Z0-9])*)$'
|
||||
# - "Must be a valid domain name (e.g. my-domain.org)"
|
||||
|
||||
|
||||
#############################
|
||||
# App #
|
||||
#############################
|
||||
|
@ -582,7 +570,7 @@ app:
|
|||
|
||||
catalog:
|
||||
action_help: Show the catalog of installable application
|
||||
api: GET /appscatalog
|
||||
api: GET /apps/catalog
|
||||
arguments:
|
||||
-f:
|
||||
full: --full
|
||||
|
@ -592,7 +580,7 @@ app:
|
|||
full: --with-categories
|
||||
help: Also return a list of app categories
|
||||
action: store_true
|
||||
|
||||
|
||||
### app_search()
|
||||
search:
|
||||
action_help: Search installable apps
|
||||
|
@ -600,6 +588,14 @@ app:
|
|||
string:
|
||||
help: Return matching app name or description with "string"
|
||||
|
||||
### app_manifest()
|
||||
manifest:
|
||||
action_help: Return the manifest of a given app from the catalog, or from a remote git repo
|
||||
api: GET /apps/manifest
|
||||
arguments:
|
||||
app:
|
||||
help: Name, local path or git URL of the app to fetch the manifest of
|
||||
|
||||
fetchlist:
|
||||
deprecated: true
|
||||
|
||||
|
@ -634,7 +630,7 @@ app:
|
|||
### app_map()
|
||||
map:
|
||||
action_help: Show the mapping between urls and apps
|
||||
api: GET /appsmap
|
||||
api: GET /apps/map
|
||||
arguments:
|
||||
-a:
|
||||
full: --app
|
||||
|
@ -671,18 +667,18 @@ app:
|
|||
help: Do not ask confirmation if the app is not safe to use (low quality, experimental or 3rd party)
|
||||
action: store_true
|
||||
|
||||
### app_remove() TODO: Write help
|
||||
### app_remove()
|
||||
remove:
|
||||
action_help: Remove app
|
||||
api: DELETE /apps/<app>
|
||||
arguments:
|
||||
app:
|
||||
help: App(s) to delete
|
||||
help: App to delete
|
||||
|
||||
### app_upgrade()
|
||||
upgrade:
|
||||
action_help: Upgrade app
|
||||
api: PUT /upgrade/apps
|
||||
api: PUT /apps/<app>/upgrade
|
||||
arguments:
|
||||
app:
|
||||
help: App(s) to upgrade (default all)
|
||||
|
@ -740,7 +736,6 @@ app:
|
|||
### app_register_url()
|
||||
register-url:
|
||||
action_help: Book/register a web path for a given app
|
||||
api: PUT /tools/registerurl
|
||||
arguments:
|
||||
app:
|
||||
help: App which will use the web path
|
||||
|
@ -764,7 +759,6 @@ app:
|
|||
### app_ssowatconf()
|
||||
ssowatconf:
|
||||
action_help: Regenerate SSOwat configuration file
|
||||
api: PUT /ssowatconf
|
||||
|
||||
### app_change_label()
|
||||
change-label:
|
||||
|
@ -779,7 +773,6 @@ app:
|
|||
### app_addaccess() TODO: Write help
|
||||
addaccess:
|
||||
action_help: Grant access right to users (everyone by default)
|
||||
api: PUT /access
|
||||
deprecated: true
|
||||
arguments:
|
||||
apps:
|
||||
|
@ -791,7 +784,6 @@ app:
|
|||
### app_removeaccess() TODO: Write help
|
||||
removeaccess:
|
||||
action_help: Revoke access right to users (everyone by default)
|
||||
api: DELETE /access
|
||||
deprecated: true
|
||||
arguments:
|
||||
apps:
|
||||
|
@ -803,7 +795,6 @@ app:
|
|||
### app_clearaccess()
|
||||
clearaccess:
|
||||
action_help: Reset access rights for the app
|
||||
api: POST /access
|
||||
deprecated: true
|
||||
arguments:
|
||||
apps:
|
||||
|
@ -851,7 +842,7 @@ app:
|
|||
### app_config_apply()
|
||||
apply:
|
||||
action_help: apply the new configuration
|
||||
api: POST /apps/<app>/config
|
||||
api: PUT /apps/<app>/config
|
||||
arguments:
|
||||
app:
|
||||
help: App name
|
||||
|
@ -869,7 +860,7 @@ backup:
|
|||
### backup_create()
|
||||
create:
|
||||
action_help: Create a backup local archive. If neither --apps or --system are given, this will backup all apps and all system parts. If only --apps if given, this will only backup apps and no system parts. Similarly, if only --system is given, this will only backup system parts and no apps.
|
||||
api: POST /backup
|
||||
api: POST /backups
|
||||
arguments:
|
||||
-n:
|
||||
full: --name
|
||||
|
@ -893,11 +884,14 @@ backup:
|
|||
--apps:
|
||||
help: List of application names to backup (or all if none given)
|
||||
nargs: "*"
|
||||
--dry-run:
|
||||
help: "'Simulate' the backup and return the size details per item to backup"
|
||||
action: store_true
|
||||
|
||||
### backup_restore()
|
||||
restore:
|
||||
action_help: Restore from a local backup archive. If neither --apps or --system are given, this will restore all apps and all system parts in the archive. If only --apps if given, this will only restore apps and no system parts. Similarly, if only --system is given, this will only restore system parts and no apps.
|
||||
api: POST /backup/restore/<name>
|
||||
api: PUT /backups/<name>/restore
|
||||
arguments:
|
||||
name:
|
||||
help: Name of the local backup archive
|
||||
|
@ -914,7 +908,7 @@ backup:
|
|||
### backup_list()
|
||||
list:
|
||||
action_help: List available local backup archives
|
||||
api: GET /backup/archives
|
||||
api: GET /backups
|
||||
arguments:
|
||||
-i:
|
||||
full: --with-info
|
||||
|
@ -928,7 +922,7 @@ backup:
|
|||
### backup_info()
|
||||
info:
|
||||
action_help: Show info about a local backup archive
|
||||
api: GET /backup/archives/<name>
|
||||
api: GET /backups/<name>
|
||||
arguments:
|
||||
name:
|
||||
help: Name of the local backup archive
|
||||
|
@ -944,7 +938,7 @@ backup:
|
|||
### backup_download()
|
||||
download:
|
||||
action_help: (API only) Request to download the file
|
||||
api: GET /backup/download/<name>
|
||||
api: GET /backups/<name>/download
|
||||
arguments:
|
||||
name:
|
||||
help: Name of the local backup archive
|
||||
|
@ -952,7 +946,7 @@ backup:
|
|||
### backup_delete()
|
||||
delete:
|
||||
action_help: Delete a backup archive
|
||||
api: DELETE /backup/archives/<name>
|
||||
api: DELETE /backups/<name>
|
||||
arguments:
|
||||
name:
|
||||
help: Name of the archive to delete
|
||||
|
@ -1019,7 +1013,6 @@ service:
|
|||
### service_add()
|
||||
add:
|
||||
action_help: Add a service
|
||||
# api: POST /services
|
||||
arguments:
|
||||
name:
|
||||
help: Service name to add
|
||||
|
@ -1057,7 +1050,6 @@ service:
|
|||
### service_remove()
|
||||
remove:
|
||||
action_help: Remove a service
|
||||
# api: DELETE /services
|
||||
arguments:
|
||||
name:
|
||||
help: Service name to remove
|
||||
|
@ -1065,7 +1057,7 @@ service:
|
|||
### service_start()
|
||||
start:
|
||||
action_help: Start one or more services
|
||||
api: PUT /services/<names>
|
||||
api: PUT /services/<names>/start
|
||||
arguments:
|
||||
names:
|
||||
help: Service name to start
|
||||
|
@ -1075,7 +1067,7 @@ service:
|
|||
### service_stop()
|
||||
stop:
|
||||
action_help: Stop one or more services
|
||||
api: DELETE /services/<names>
|
||||
api: PUT /services/<names>/stop
|
||||
arguments:
|
||||
names:
|
||||
help: Service name to stop
|
||||
|
@ -1123,7 +1115,7 @@ service:
|
|||
### service_disable()
|
||||
disable:
|
||||
action_help: Disable one or more services
|
||||
api: DELETE /services/<names>/enable
|
||||
api: PUT /services/<names>/disable
|
||||
arguments:
|
||||
names:
|
||||
help: Service name to disable
|
||||
|
@ -1158,7 +1150,6 @@ service:
|
|||
### service_regen_conf()
|
||||
regen-conf:
|
||||
action_help: Regenerate the configuration file(s) for a service
|
||||
api: PUT /services/regenconf
|
||||
deprecated_alias:
|
||||
- regenconf
|
||||
arguments:
|
||||
|
@ -1210,19 +1201,10 @@ firewall:
|
|||
help: List forwarded ports with UPnP
|
||||
action: store_true
|
||||
|
||||
### firewall_reload()
|
||||
reload:
|
||||
action_help: Reload all firewall rules
|
||||
api: PUT /firewall
|
||||
arguments:
|
||||
--skip-upnp:
|
||||
help: Do not refresh port forwarding using UPnP
|
||||
action: store_true
|
||||
|
||||
### firewall_allow()
|
||||
allow:
|
||||
action_help: Allow connections on a port
|
||||
api: POST /firewall/port
|
||||
api: PUT /firewall/<protocol>/allow/<port>
|
||||
arguments:
|
||||
protocol:
|
||||
help: "Protocol type to allow (TCP/UDP/Both)"
|
||||
|
@ -1252,11 +1234,10 @@ firewall:
|
|||
help: Do not reload firewall rules
|
||||
action: store_true
|
||||
|
||||
|
||||
### firewall_disallow()
|
||||
disallow:
|
||||
action_help: Disallow connections on a port
|
||||
api: DELETE /firewall/port
|
||||
api: PUT /firewall/<protocol>/disallow/<port>
|
||||
arguments:
|
||||
protocol:
|
||||
help: "Protocol type to allow (TCP/UDP/Both)"
|
||||
|
@ -1284,11 +1265,10 @@ firewall:
|
|||
help: Do not reload firewall rules
|
||||
action: store_true
|
||||
|
||||
|
||||
### firewall_upnp()
|
||||
upnp:
|
||||
action_help: Manage port forwarding using UPnP
|
||||
api: GET /firewall/upnp
|
||||
api: PUT /firewall/upnp/<action>
|
||||
arguments:
|
||||
action:
|
||||
choices:
|
||||
|
@ -1302,10 +1282,19 @@ firewall:
|
|||
help: Do not refresh port forwarding
|
||||
action: store_true
|
||||
|
||||
|
||||
### firewall_reload()
|
||||
reload:
|
||||
action_help: Reload all firewall rules
|
||||
arguments:
|
||||
--skip-upnp:
|
||||
help: Do not refresh port forwarding using UPnP
|
||||
action: store_true
|
||||
|
||||
### firewall_stop()
|
||||
stop:
|
||||
action_help: Stop iptables and ip6tables
|
||||
api: DELETE /firewall
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1319,7 +1308,6 @@ dyndns:
|
|||
### dyndns_subscribe()
|
||||
subscribe:
|
||||
action_help: Subscribe to a DynDNS service
|
||||
api: POST /dyndns
|
||||
arguments:
|
||||
--subscribe-host:
|
||||
help: Dynette HTTP API to subscribe to
|
||||
|
@ -1336,7 +1324,6 @@ dyndns:
|
|||
### dyndns_update()
|
||||
update:
|
||||
action_help: Update IP on DynDNS platform
|
||||
api: PUT /dyndns
|
||||
arguments:
|
||||
--dyn-host:
|
||||
help: Dynette DNS server to inform
|
||||
|
@ -1440,25 +1427,40 @@ tools:
|
|||
### tools_update()
|
||||
update:
|
||||
action_help: YunoHost update
|
||||
api: PUT /update
|
||||
api: PUT /update/<target>
|
||||
arguments:
|
||||
target:
|
||||
help: What to update, "apps" (application catalog) or "system" (fetch available package upgrades, equivalent to apt update), "all" for both
|
||||
choices:
|
||||
- apps
|
||||
- system
|
||||
- all
|
||||
nargs: "?"
|
||||
metavar: TARGET
|
||||
default: all
|
||||
--apps:
|
||||
help: Fetch the application list to check which apps can be upgraded
|
||||
help: (Deprecated, see first positional arg) Fetch the application list to check which apps can be upgraded
|
||||
action: store_true
|
||||
--system:
|
||||
help: Fetch available system packages upgrades (equivalent to apt update)
|
||||
help: (Deprecated, see first positional arg) Fetch available system packages upgrades (equivalent to apt update)
|
||||
action: store_true
|
||||
|
||||
### tools_upgrade()
|
||||
upgrade:
|
||||
action_help: YunoHost upgrade
|
||||
api: PUT /upgrade
|
||||
api: PUT /upgrade/<target>
|
||||
arguments:
|
||||
target:
|
||||
help: What to upgrade, either "apps" (all apps) or "system" (all system packages)
|
||||
choices:
|
||||
- apps
|
||||
- system
|
||||
nargs: "?"
|
||||
--apps:
|
||||
help: List of apps to upgrade (all by default)
|
||||
nargs: "*"
|
||||
help: (Deprecated, see first positional arg) Upgrade all applications
|
||||
action: store_true
|
||||
--system:
|
||||
help: Upgrade only the system packages
|
||||
help: (Deprecated, see first positional arg) Upgrade only the system packages
|
||||
action: store_true
|
||||
|
||||
### tools_shell()
|
||||
|
@ -1492,7 +1494,9 @@ tools:
|
|||
### tools_regen_conf()
|
||||
regen-conf:
|
||||
action_help: Regenerate the configuration file(s)
|
||||
api: PUT /tools/regenconf
|
||||
api:
|
||||
- PUT /regenconf
|
||||
- PUT /regenconf/<names>
|
||||
arguments:
|
||||
names:
|
||||
help: Categories to regenerate configuration of (all by default)
|
||||
|
@ -1541,7 +1545,9 @@ tools:
|
|||
### tools_migrations_run()
|
||||
run:
|
||||
action_help: Run migrations
|
||||
api: POST /migrations/run
|
||||
api:
|
||||
- PUT /migrations
|
||||
- PUT /migrations/<targets>
|
||||
deprecated_alias:
|
||||
- migrate
|
||||
arguments:
|
||||
|
@ -1564,7 +1570,6 @@ tools:
|
|||
### tools_migrations_state()
|
||||
state:
|
||||
action_help: Show current migrations state
|
||||
api: GET /migrations/state
|
||||
|
||||
|
||||
#############################
|
||||
|
@ -1593,7 +1598,6 @@ hook:
|
|||
### hook_info()
|
||||
info:
|
||||
action_help: Get information about a given hook
|
||||
api: GET /hooks/<action>/<name>
|
||||
arguments:
|
||||
action:
|
||||
help: Action name
|
||||
|
@ -1623,7 +1627,6 @@ hook:
|
|||
### hook_callback()
|
||||
callback:
|
||||
action_help: Execute all scripts binded to an action
|
||||
api: POST /hooks/<action>
|
||||
arguments:
|
||||
action:
|
||||
help: Action name
|
||||
|
@ -1719,7 +1722,7 @@ log:
|
|||
### log_share()
|
||||
share:
|
||||
action_help: Share the full log on yunopaste (alias to show --share)
|
||||
api: GET /logs/share
|
||||
api: GET /logs/<path>/share
|
||||
arguments:
|
||||
path:
|
||||
help: Log file to share
|
||||
|
@ -1734,11 +1737,11 @@ diagnosis:
|
|||
|
||||
list:
|
||||
action_help: List diagnosis categories
|
||||
api: GET /diagnosis/list
|
||||
api: GET /diagnosis/categories
|
||||
|
||||
show:
|
||||
action_help: Show most recents diagnosis results
|
||||
api: GET /diagnosis/show
|
||||
api: GET /diagnosis
|
||||
arguments:
|
||||
categories:
|
||||
help: Diagnosis categories to display (all by default)
|
||||
|
@ -1756,9 +1759,20 @@ diagnosis:
|
|||
help: Show a human-readable output
|
||||
action: store_true
|
||||
|
||||
get:
|
||||
action_help: Low-level command to fetch raw data and status about a specific diagnosis test
|
||||
api: GET /diagnosis/<category>
|
||||
arguments:
|
||||
category:
|
||||
help: Diagnosis category to fetch results from
|
||||
item:
|
||||
help: "List of criteria describing the test. Must correspond exactly to the 'meta' infos in 'yunohost diagnosis show'"
|
||||
metavar: CRITERIA
|
||||
nargs: "*"
|
||||
|
||||
run:
|
||||
action_help: Run diagnosis
|
||||
api: POST /diagnosis/run
|
||||
api: PUT /diagnosis/run
|
||||
arguments:
|
||||
categories:
|
||||
help: Diagnosis categories to run (all by default)
|
||||
|
@ -1775,27 +1789,21 @@ diagnosis:
|
|||
|
||||
ignore:
|
||||
action_help: Configure some diagnosis results to be ignored and therefore not considered as actual issues
|
||||
api: POST /diagnosis/ignore
|
||||
api: PUT /diagnosis/ignore
|
||||
arguments:
|
||||
--add-filter:
|
||||
--filter:
|
||||
help: "Add a filter. The first element should be a diagnosis category, and other criterias can be provided using the infos from the 'meta' sections in 'yunohost diagnosis show'. For example: 'dnsrecords domain=yolo.test category=xmpp'"
|
||||
nargs: "*"
|
||||
metavar: CRITERIA
|
||||
--remove-filter:
|
||||
help: Remove a filter (it should be an existing filter as listed with --list)
|
||||
nargs: "*"
|
||||
metavar: CRITERIA
|
||||
--list:
|
||||
help: List active ignore filters
|
||||
action: store_true
|
||||
|
||||
get:
|
||||
action_help: Low-level command to fetch raw data and status about a specific diagnosis test
|
||||
api: GET /diagnosis/item/<category>
|
||||
unignore:
|
||||
action_help: Configure some diagnosis results to be unignored and therefore considered as actual issues
|
||||
api: PUT /diagnosis/unignore
|
||||
arguments:
|
||||
category:
|
||||
help: Diagnosis category to fetch results from
|
||||
item:
|
||||
help: "List of criteria describing the test. Must correspond exactly to the 'meta' infos in 'yunohost diagnosis show'"
|
||||
metavar: CRITERIA
|
||||
--filter:
|
||||
help: Remove a filter (it should be an existing filter as listed with --list)
|
||||
nargs: "*"
|
||||
metavar: CRITERIA
|
||||
|
|
|
@ -20,7 +20,7 @@ ynh_find_port () {
|
|||
test -n "$port" || ynh_die --message="The argument of ynh_find_port must be a valid port."
|
||||
while ! ynh_port_available --port=$port
|
||||
do
|
||||
port=$((port+1)) # Else, pass to next port
|
||||
port=$((port+1))
|
||||
done
|
||||
echo $port
|
||||
}
|
||||
|
@ -42,7 +42,12 @@ ynh_port_available () {
|
|||
# Manage arguments with getopts
|
||||
ynh_handle_getopts_args "$@"
|
||||
|
||||
if ss --numeric --listening --tcp --udp | awk '{print$5}' | grep --quiet --extended-regexp ":$port$" # Check if the port is free
|
||||
# Check if the port is free
|
||||
if ss --numeric --listening --tcp --udp | awk '{print$5}' | grep --quiet --extended-regexp ":$port$"
|
||||
then
|
||||
return 1
|
||||
# This is to cover (most) case where an app is using a port yet ain't currently using it for some reason (typically service ain't up)
|
||||
elif grep -q "port: '$port'" /etc/yunohost/apps/*/settings.yml
|
||||
then
|
||||
return 1
|
||||
else
|
||||
|
|
|
@ -287,6 +287,12 @@ ynh_remove_fpm_config () {
|
|||
fpm_service="php$YNH_DEFAULT_PHP_VERSION-fpm"
|
||||
fi
|
||||
|
||||
ynh_secure_remove --file="$fpm_config_dir/pool.d/$app.conf"
|
||||
if [ -e $fpm_config_dir/conf.d/20-$app.ini ]
|
||||
then
|
||||
ynh_secure_remove --file="$fpm_config_dir/conf.d/20-$app.ini"
|
||||
fi
|
||||
|
||||
if [ $dedicated_service -eq 1 ]
|
||||
then
|
||||
# Remove the dedicated service PHP-FPM service for the app
|
||||
|
@ -299,12 +305,6 @@ ynh_remove_fpm_config () {
|
|||
ynh_systemd_action --service_name=$fpm_service --action=reload
|
||||
fi
|
||||
|
||||
ynh_secure_remove --file="$fpm_config_dir/pool.d/$app.conf"
|
||||
if [ -e $fpm_config_dir/conf.d/20-$app.ini ]
|
||||
then
|
||||
ynh_secure_remove --file="$fpm_config_dir/conf.d/20-$app.ini"
|
||||
fi
|
||||
|
||||
# If the PHP version used is not the default version for YunoHost
|
||||
if [ "$phpversion" != "$YNH_DEFAULT_PHP_VERSION" ]
|
||||
then
|
||||
|
|
|
@ -92,10 +92,11 @@ ynh_system_group_exists() {
|
|||
|
||||
# Create a system user
|
||||
#
|
||||
# usage: ynh_system_user_create --username=user_name [--home_dir=home_dir] [--use_shell]
|
||||
# usage: ynh_system_user_create --username=user_name [--home_dir=home_dir] [--use_shell] [--groups="group1 group2"]
|
||||
# | arg: -u, --username= - Name of the system user that will be create
|
||||
# | arg: -h, --home_dir= - Path of the home dir for the user. Usually the final path of the app. If this argument is omitted, the user will be created without home
|
||||
# | arg: -s, --use_shell - Create a user using the default login shell if present. If this argument is omitted, the user will be created with /usr/sbin/nologin shell
|
||||
# | arg: -g, --groups - Add the user to system groups. Typically meant to add the user to the ssh.app / sftp.app group (e.g. for borgserver, my_webapp)
|
||||
#
|
||||
# Create a nextcloud user with no home directory and /usr/sbin/nologin login shell (hence no login capability) :
|
||||
# ```
|
||||
|
@ -110,14 +111,17 @@ ynh_system_group_exists() {
|
|||
ynh_system_user_create () {
|
||||
# Declare an array to define the options of this helper.
|
||||
local legacy_args=uhs
|
||||
local -A args_array=( [u]=username= [h]=home_dir= [s]=use_shell )
|
||||
local -A args_array=( [u]=username= [h]=home_dir= [s]=use_shell [g]=groups= )
|
||||
local username
|
||||
local home_dir
|
||||
local use_shell
|
||||
local groups
|
||||
|
||||
# Manage arguments with getopts
|
||||
ynh_handle_getopts_args "$@"
|
||||
use_shell="${use_shell:-0}"
|
||||
home_dir="${home_dir:-}"
|
||||
groups="${groups:-}"
|
||||
|
||||
if ! ynh_system_user_exists "$username" # Check if the user exists on the system
|
||||
then # If the user doesn't exist
|
||||
|
@ -135,6 +139,12 @@ ynh_system_user_create () {
|
|||
fi
|
||||
useradd $user_home_dir --system --user-group $username $shell || ynh_die --message="Unable to create $username system account"
|
||||
fi
|
||||
|
||||
local group
|
||||
for group in $groups
|
||||
do
|
||||
usermod -a -G "$group" "$username"
|
||||
done
|
||||
}
|
||||
|
||||
# Delete a system user
|
||||
|
|
|
@ -201,6 +201,7 @@ ynh_setup_source () {
|
|||
else
|
||||
unzip -quo $src_filename -d "$dest_dir"
|
||||
fi
|
||||
ynh_secure_remove --file="$src_filename"
|
||||
else
|
||||
local strip=""
|
||||
if [ "$src_in_subdir" != "false" ]
|
||||
|
@ -219,6 +220,7 @@ ynh_setup_source () {
|
|||
else
|
||||
ynh_die --message="Archive format unrecognized."
|
||||
fi
|
||||
ynh_secure_remove --file="$src_filename"
|
||||
fi
|
||||
|
||||
# Apply patches
|
||||
|
|
|
@ -187,6 +187,10 @@ do_post_regen() {
|
|||
[[ ! -e /etc/yunohost/hooks.d ]] || (chown root /etc/yunohost/hooks.d && chmod 700 /etc/yunohost/hooks.d)
|
||||
[[ ! -e /etc/yunohost/apps ]] || (chown root /etc/yunohost/apps && chmod 700 /etc/yunohost/apps)
|
||||
|
||||
# Create ssh.app and sftp.app groups if they don't exist yet
|
||||
grep -q '^ssh.app:' /etc/group || groupadd ssh.app
|
||||
grep -q '^sftp.app:' /etc/group || groupadd sftp.app
|
||||
|
||||
# Propagates changes in systemd service config overrides
|
||||
[[ ! "$regen_conf_files" =~ "ntp.service.d/ynh-override.conf" ]] || { systemctl daemon-reload; systemctl restart ntp; }
|
||||
[[ ! "$regen_conf_files" =~ "nftables.service.d/ynh-override.conf" ]] || systemctl daemon-reload
|
||||
|
|
|
@ -25,7 +25,7 @@ do_pre_regen() {
|
|||
|
||||
# Support different strategy for security configurations
|
||||
export compatibility="$(yunohost settings get 'security.ssh.compatibility')"
|
||||
|
||||
export port="$(yunohost settings get 'security.ssh.port')"
|
||||
export ssh_keys
|
||||
export ipv6_enabled
|
||||
ynh_render_template "sshd_config" "${pending_dir}/etc/ssh/sshd_config"
|
||||
|
|
|
@ -147,7 +147,7 @@ do_post_regen() {
|
|||
su openldap -s "/bin/bash" -c "/usr/sbin/slapindex"
|
||||
|
||||
echo "Reloading slapd"
|
||||
service slapd force-reload
|
||||
systemctl force-reload slapd
|
||||
|
||||
# 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
|
||||
|
|
|
@ -67,7 +67,7 @@ do_post_regen() {
|
|||
chown -R metronome: /etc/metronome/conf.d/
|
||||
|
||||
[[ -z "$regen_conf_files" ]] \
|
||||
|| service metronome restart
|
||||
|| systemctl restart metronome
|
||||
}
|
||||
|
||||
FORCE=${2:-0}
|
||||
|
|
|
@ -76,7 +76,7 @@ do_post_regen() {
|
|||
fi
|
||||
|
||||
[[ -z "$regen_conf_files" ]] \
|
||||
|| { service postfix restart && service postsrsd restart; }
|
||||
|| { systemctl restart postfix && systemctl restart postsrsd; }
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -60,7 +60,7 @@ do_post_regen() {
|
|||
chown -R vmail:mail /etc/dovecot/global_script
|
||||
}
|
||||
|
||||
service dovecot restart
|
||||
systemctl restart dovecot
|
||||
}
|
||||
|
||||
FORCE=${2:-0}
|
||||
|
|
|
@ -37,7 +37,7 @@ do_post_regen() {
|
|||
# This is a trick to check if we're able to use mysql without password
|
||||
# Expect instances installed in stretch to already have unix_socket
|
||||
#configured, but not old instances from the jessie/wheezy era
|
||||
if ! echo "" | mysql
|
||||
if ! echo "" | mysql 2>/dev/null
|
||||
then
|
||||
password="$(cat /etc/yunohost/mysql)"
|
||||
# Enable plugin unix_socket for root on localhost
|
||||
|
@ -45,7 +45,7 @@ do_post_regen() {
|
|||
fi
|
||||
|
||||
# If now we're able to login without password, drop the mysql password
|
||||
if echo "" | mysql
|
||||
if echo "" | mysql 2>/dev/null
|
||||
then
|
||||
rm /etc/yunohost/mysql
|
||||
else
|
||||
|
@ -66,7 +66,7 @@ do_post_regen() {
|
|||
fi
|
||||
|
||||
[[ -z "$regen_conf_files" ]] \
|
||||
|| service mysql restart
|
||||
|| systemctl restart mysql
|
||||
}
|
||||
|
||||
FORCE=${2:-0}
|
||||
|
|
|
@ -15,7 +15,7 @@ do_post_regen() {
|
|||
regen_conf_files=$1
|
||||
|
||||
[[ -z "$regen_conf_files" ]] \
|
||||
|| service avahi-daemon restart
|
||||
|| systemctl restart avahi-daemon
|
||||
}
|
||||
|
||||
FORCE=${2:-0}
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
set -e
|
||||
|
||||
. /usr/share/yunohost/helpers
|
||||
|
||||
do_pre_regen() {
|
||||
pending_dir=$1
|
||||
|
||||
|
@ -13,14 +15,16 @@ do_pre_regen() {
|
|||
|
||||
cp yunohost.conf "${fail2ban_dir}/filter.d/yunohost.conf"
|
||||
cp jail.conf "${fail2ban_dir}/jail.conf"
|
||||
cp yunohost-jails.conf "${fail2ban_dir}/jail.d/"
|
||||
|
||||
export ssh_port="$(yunohost settings get 'security.ssh.port')"
|
||||
ynh_render_template "yunohost-jails.conf" "${fail2ban_dir}/jail.d/yunohost-jails.conf"
|
||||
}
|
||||
|
||||
do_post_regen() {
|
||||
regen_conf_files=$1
|
||||
|
||||
[[ -z "$regen_conf_files" ]] \
|
||||
|| service fail2ban restart
|
||||
|| systemctl reload fail2ban
|
||||
}
|
||||
|
||||
FORCE=${2:-0}
|
||||
|
|
|
@ -77,7 +77,9 @@ class SystemResourcesDiagnoser(Diagnoser):
|
|||
|
||||
# Ignore /dev/loop stuff which are ~virtual partitions ? (e.g. mounted to /snap/)
|
||||
disk_partitions = [
|
||||
d for d in disk_partitions if d.mountpoint in ["/", "/var"] or not d.device.startswith("/dev/loop")
|
||||
d
|
||||
for d in disk_partitions
|
||||
if d.mountpoint in ["/", "/var"] or not d.device.startswith("/dev/loop")
|
||||
]
|
||||
|
||||
for disk_partition in disk_partitions:
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import os
|
||||
import re
|
||||
|
||||
from yunohost.settings import settings_get
|
||||
from yunohost.diagnosis import Diagnoser
|
||||
from yunohost.regenconf import _get_regenconf_infos, _calculate_hash
|
||||
from moulinette.utils.filesystem import read_file
|
||||
|
||||
|
||||
class RegenconfDiagnoser(Diagnoser):
|
||||
|
@ -35,6 +38,32 @@ class RegenconfDiagnoser(Diagnoser):
|
|||
details=["diagnosis_regenconf_manually_modified_details"],
|
||||
)
|
||||
|
||||
if (
|
||||
any(f["path"] == "/etc/ssh/sshd_config" for f in regenconf_modified_files)
|
||||
and os.system(
|
||||
"grep -q '^ *AllowGroups\\|^ *AllowUsers' /etc/ssh/sshd_config"
|
||||
)
|
||||
!= 0
|
||||
):
|
||||
yield dict(
|
||||
meta={"test": "sshd_config_insecure"},
|
||||
status="ERROR",
|
||||
summary="diagnosis_sshd_config_insecure",
|
||||
)
|
||||
|
||||
# Check consistency between actual ssh port in sshd_config vs. setting
|
||||
ssh_port_setting = settings_get("security.ssh.port")
|
||||
ssh_port_line = re.findall(
|
||||
r"\bPort *([0-9]{2,5})\b", read_file("/etc/ssh/sshd_config")
|
||||
)
|
||||
if len(ssh_port_line) == 1 and int(ssh_port_line[0]) != ssh_port_setting:
|
||||
yield dict(
|
||||
meta={"test": "sshd_config_port_inconsistency"},
|
||||
status="WARNING",
|
||||
summary="diagnosis_sshd_config_inconsistent",
|
||||
details=["diagnosis_sshd_config_inconsistent_details"],
|
||||
)
|
||||
|
||||
def manually_modified_files(self):
|
||||
|
||||
for category, infos in _get_regenconf_infos().items():
|
||||
|
|
|
@ -89,3 +89,25 @@ depends_children:
|
|||
label: "XMPP"
|
||||
showTile: "FALSE"
|
||||
isProtected: "TRUE"
|
||||
cn=ssh.main,ou=permission:
|
||||
cn: ssh.main
|
||||
gidNumber: "5003"
|
||||
objectClass:
|
||||
- posixGroup
|
||||
- permissionYnh
|
||||
groupPermission: []
|
||||
authHeader: "FALSE"
|
||||
label: "SSH"
|
||||
showTile: "FALSE"
|
||||
isProtected: "TRUE"
|
||||
cn=sftp.main,ou=permission:
|
||||
cn: sftp.main
|
||||
gidNumber: "5004"
|
||||
objectClass:
|
||||
- posixGroup
|
||||
- permissionYnh
|
||||
groupPermission: []
|
||||
authHeader: "FALSE"
|
||||
label: "SFTP"
|
||||
showTile: "FALSE"
|
||||
isProtected: "TRUE"
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
[sshd]
|
||||
port = {{ssh_port}}
|
||||
enabled = true
|
||||
|
||||
[nginx-http-auth]
|
||||
|
|
|
@ -6,6 +6,6 @@ location /yunohost/admin/ {
|
|||
default_type text/html;
|
||||
index index.html;
|
||||
|
||||
more_set_headers "Content-Security-Policy: upgrade-insecure-requests; default-src 'self'; connect-src 'self' https://raw.githubusercontent.com https://paste.yunohost.org wss://$host; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-eval'; object-src 'none'; img-src 'self' data:;";
|
||||
more_set_headers "Content-Security-Policy: upgrade-insecure-requests; default-src 'self'; connect-src 'self' https://paste.yunohost.org wss://$host; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-eval'; object-src 'none'; img-src 'self' data:;";
|
||||
more_set_headers "Content-Security-Policy-Report-Only:";
|
||||
}
|
||||
|
|
|
@ -33,6 +33,9 @@ more_set_headers "X-Download-Options : noopen";
|
|||
more_set_headers "X-Permitted-Cross-Domain-Policies : none";
|
||||
more_set_headers "X-Frame-Options : SAMEORIGIN";
|
||||
|
||||
# Disable the disaster privacy thing that is FLoC
|
||||
more_set_headers "Permissions-Policy : interest-cohort=()";
|
||||
|
||||
# Disable gzip to protect against BREACH
|
||||
# Read https://trac.nginx.org/nginx/ticket/1720 (text/html cannot be disabled!)
|
||||
gzip off;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# by YunoHost
|
||||
|
||||
Protocol 2
|
||||
Port 22
|
||||
Port {{ port }}
|
||||
|
||||
{% if ipv6_enabled == "true" %}ListenAddress ::{% endif %}
|
||||
ListenAddress 0.0.0.0
|
||||
|
@ -64,20 +64,31 @@ PrintLastLog yes
|
|||
ClientAliveInterval 60
|
||||
AcceptEnv LANG LC_*
|
||||
|
||||
# Disallow user without ssh or sftp permissions
|
||||
AllowGroups ssh.main sftp.main ssh.app sftp.app admins root
|
||||
|
||||
# Allow users to create tunnels or forwarding
|
||||
AllowTcpForwarding yes
|
||||
AllowStreamLocalForwarding yes
|
||||
PermitTunnel yes
|
||||
PermitUserRC yes
|
||||
|
||||
# SFTP stuff
|
||||
Subsystem sftp internal-sftp
|
||||
|
||||
# Forbid users from using their account SSH as a VPN (even if SSH login is disabled)
|
||||
AllowTcpForwarding no
|
||||
AllowStreamLocalForwarding no
|
||||
|
||||
# Disable .ssh/rc, which could be edited (e.g. from Nextcloud or whatever) by users to execute arbitrary commands even if SSH login is disabled
|
||||
PermitUserRC no
|
||||
|
||||
Match User admin,root
|
||||
AllowTcpForwarding yes
|
||||
AllowStreamLocalForwarding yes
|
||||
PermitUserRC yes
|
||||
# Apply following instructions to user with sftp perm only
|
||||
Match Group sftp.main,!ssh.main
|
||||
ForceCommand internal-sftp
|
||||
# We can't restrict to /home/%u because the chroot base must be owned by root
|
||||
# So we chroot only on /home
|
||||
# See https://serverfault.com/questions/584986/bad-ownership-or-modes-for-chroot-directory-component
|
||||
ChrootDirectory /home
|
||||
# Forbid SFTP users from using their account SSH as a VPN (even if SSH login is disabled)
|
||||
AllowTcpForwarding no
|
||||
AllowStreamLocalForwarding no
|
||||
PermitTunnel no
|
||||
# Disable .ssh/rc, which could be edited (e.g. from Nextcloud or whatever) by users to execute arbitrary commands even if SSH login is disabled
|
||||
PermitUserRC no
|
||||
|
||||
|
||||
# root login is allowed on local networks
|
||||
|
@ -86,4 +97,4 @@ Match User admin,root
|
|||
# If the server is a VPS, it's expected that the owner of the
|
||||
# server has access to a web console through which to log in.
|
||||
Match Address 192.168.0.0/16,10.0.0.0/8,172.16.0.0/12,169.254.0.0/16,fe80::/10,fd00::/8
|
||||
PermitRootLogin yes
|
||||
PermitRootLogin yes
|
||||
|
|
52
debian/changelog
vendored
52
debian/changelog
vendored
|
@ -1,3 +1,55 @@
|
|||
yunohost (4.2.3) testing; urgency=low
|
||||
|
||||
- Fix a stupid issue where an app's tmp work dir would be deleted during upgrade because of the backup process (50af0393)
|
||||
- cli ux: Don't suggest that we can remove multiple apps (4ae72cc3)
|
||||
- ynh_port_available: also check ports used by other apps in settings.yml (381f789f)
|
||||
- ssh: Add ssh.app, sftp.app groups to cover my_webapp and borg needing ssh access ([#1216](https://github.com/yunohost/yunohost/pull/1216))
|
||||
- i18n: Translations updated for German
|
||||
|
||||
Thanks to all contributors <3 ! (Bram, Christian W.)
|
||||
|
||||
-- Alexandre Aubin <alex.aubin@mailoo.org> Mon, 26 Apr 2021 16:29:17 +0200
|
||||
|
||||
yunohost (4.2.2) testing; urgency=low
|
||||
|
||||
- permissions: Add SFTP / SSH permissions ([#606](https://github.com/yunohost/yunohost/pull/606))
|
||||
- refactoring: Uniformize API routes ([#1192](https://github.com/yunohost/yunohost/pull/1192))
|
||||
- settings: New setting to disable the 'YunoHost' panel overlay in apps ([#1071](https://github.com/yunohost/yunohost/pull/1071), 08fbfa2e)
|
||||
- settings: New setting for custom ssh port ([#1209](https://github.com/yunohost/yunohost/pull/1209), 37c0825e, 95999fea)
|
||||
- security: Redact 'passphrase' settings from logs ([#1206](https://github.com/yunohost/yunohost/pull/1206))
|
||||
- security: Sane default permissions for files added using ynh_add_config and ynh_setup_source ([#1188](https://github.com/yunohost/yunohost/pull/1188))
|
||||
- backup: Support having .tar / .tar.gz in the archive name arg of backup_info/restore (00ec7b2f)
|
||||
- backup: Don't backup crons + manage crons from the regenconf ([#1184](https://github.com/yunohost/yunohost/pull/1184))
|
||||
- backup: Drop support for archive restore from prior 3.8 ([#1203](https://github.com/yunohost/yunohost/pull/1203))
|
||||
- backup: Introduce hooks during restore to apply migrations between archive version and current version ([#1203](https://github.com/yunohost/yunohost/pull/1203))
|
||||
- backup: Create a proper operation log for backup_create (fe9f0731)
|
||||
- backup: Improve error management for app restore ([#1191](https://github.com/yunohost/yunohost/pull/1191))
|
||||
- backup: Rework content of system backups ([#1185](https://github.com/yunohost/yunohost/pull/1185))
|
||||
- backup: Add a --dry-run option to backup_create to fetch an estimate of the backup size ([#1205](https://github.com/yunohost/yunohost/pull/1205))
|
||||
- helpers: Add --keep option to ynh_setup_source to keep files that may be overwritten during upgrade ([#1200](https://github.com/yunohost/yunohost/pull/1200))
|
||||
- helpers: Bump 'n' to version 7.1.0 ([#1197](https://github.com/yunohost/yunohost/pull/1197))
|
||||
- mail: Support SMTPS Relay ([#1159](https://github.com/yunohost/yunohost/pull/1159))
|
||||
- nginx: add header to disallow FLoC ([#1211](https://github.com/yunohost/yunohost/pull/1211))
|
||||
- app: Add route to fetch app manifest for custom app installs in a forge-agnostic way ([#1213](https://github.com/yunohost/yunohost/pull/1213))
|
||||
- perf: add optional 'apps' argument to user_permission_list to speed up user_info / user_list (e6312db3)
|
||||
- ux: Add '--human-readable' to recommended command to display diagnosis issues in cli ([#1207](https://github.com/yunohost/yunohost/pull/1207))
|
||||
- Misc enh/fixes, code quality (42f8c9dc, 86f22d1b, 1468073f, b33e7c16, d1f0064b, c3754dd6, 02a30125, aabe5f19, ce9f6b3d, d7786662, f9419c96, c92e495b, 0616d632, 92eb9704, [#1190](https://github.com/yunohost/yunohost/pull/1190), [#1201](https://github.com/yunohost/yunohost/pull/1201), [#1210](https://github.com/yunohost/yunohost/pull/1210), [#1214](https://github.com/yunohost/yunohost/pull/1214), [#1215](https://github.com/yunohost/yunohost/pull/1215))
|
||||
- i18n: Translations updated for French, German
|
||||
|
||||
Thanks to all contributors <3 ! (axolotle, Bram, cyxae, Daniel, Éric G., grenagit, Josué, Kay0u, lapineige, ljf, Scapharnaum)
|
||||
|
||||
-- Alexandre Aubin <alex.aubin@mailoo.org> Sat, 17 Apr 2021 03:45:49 +0200
|
||||
|
||||
yunohost (4.2.1.1) testing; urgency=low
|
||||
|
||||
- [fix] services.py, python3: missing decode() in subprocess output fetch (357c151c)
|
||||
- [fix] log.py: don't inject log_ref if the operation didnt start yet (f878d61f)
|
||||
- [fix] dyndns.py: Missing raw_msg=True (008e9f1d)
|
||||
- [fix] firewall.py: Don't miserably crash when there are port ranges (6fd5f7e8)
|
||||
- [fix] nginx conf: CSP rules for admin was blocking small images used for checkboxes, radio, pacman in the new webadmin (575fab8a)
|
||||
|
||||
-- Alexandre Aubin <alex.aubin@mailoo.org> Sun, 11 Apr 2021 20:15:11 +0200
|
||||
|
||||
yunohost (4.2.1) testing; urgency=low
|
||||
|
||||
- security: Various permissions tweaks to protect from malicious yunohost users (aefc100a, fc26837a)
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
"app_upgrade_failed": "تعذرت عملية ترقية {app:s}",
|
||||
"app_upgrade_some_app_failed": "تعذرت عملية ترقية بعض التطبيقات",
|
||||
"app_upgraded": "تم تحديث التطبيق {app:s}",
|
||||
"ask_email": "عنوان البريد الإلكتروني",
|
||||
"ask_firstname": "الإسم",
|
||||
"ask_lastname": "اللقب",
|
||||
"ask_main_domain": "النطاق الرئيسي",
|
||||
|
@ -29,7 +28,6 @@
|
|||
"backup_applying_method_copy": "جارٍ نسخ كافة الملفات إلى النسخة الإحتياطية …",
|
||||
"backup_applying_method_tar": "جارٍ إنشاء ملف TAR للنسخة الاحتياطية…",
|
||||
"backup_created": "تم إنشاء النسخة الإحتياطية",
|
||||
"backup_invalid_archive": "نسخة إحتياطية غير صالحة",
|
||||
"backup_method_copy_finished": "إنتهت عملية النسخ الإحتياطي",
|
||||
"backup_nothings_done": "ليس هناك أي شيء للحفظ",
|
||||
"backup_output_directory_required": "يتوجب عليك تحديد مجلد لتلقي النسخ الإحتياطية",
|
||||
|
@ -37,7 +35,6 @@
|
|||
"certmanager_cert_install_success_selfsigned": "نجحت عملية تثبيت الشهادة الموقعة ذاتيا الخاصة بالنطاق {domain:s}",
|
||||
"certmanager_cert_renew_success": "نجحت عملية تجديد شهادة Let's Encrypt الخاصة باسم النطاق {domain:s} !",
|
||||
"certmanager_cert_signing_failed": "فشل إجراء توقيع الشهادة الجديدة",
|
||||
"certmanager_domain_unknown": "النطاق مجهول {domain:s}",
|
||||
"certmanager_no_cert_file": "تعذرت عملية قراءة شهادة نطاق {domain:s} (الملف : {file:s})",
|
||||
"domain_created": "تم إنشاء النطاق",
|
||||
"domain_creation_failed": "تعذرت عملية إنشاء النطاق",
|
||||
|
@ -54,10 +51,6 @@
|
|||
"installation_complete": "إكتملت عملية التنصيب",
|
||||
"main_domain_change_failed": "تعذّر تغيير النطاق الأساسي",
|
||||
"main_domain_changed": "تم تغيير النطاق الأساسي",
|
||||
"migrate_tsig_wait": "لننتظر الآن ثلاثة دقائق ريثما يأخذ خادم أسماء النطاقات الديناميكية بعين الاعتبار المفتاح الجديد…",
|
||||
"migrate_tsig_wait_2": "دقيقتين …",
|
||||
"migrate_tsig_wait_3": "دقيقة واحدة …",
|
||||
"migrate_tsig_wait_4": "30 ثانية …",
|
||||
"migrations_skip_migration": "جارٍ تجاهل التهجير {id}…",
|
||||
"pattern_domain": "يتوجب أن يكون إسم نطاق صالح (مثل my-domain.org)",
|
||||
"pattern_email": "يتوجب أن يكون عنوان بريد إلكتروني صالح (مثل someone@domain.org)",
|
||||
|
@ -87,24 +80,14 @@
|
|||
"user_unknown": "المستخدم {user:s} مجهول",
|
||||
"user_update_failed": "لا يمكن تحديث المستخدم",
|
||||
"user_updated": "تم تحديث المستخدم",
|
||||
"yunohost_ca_creation_failed": "تعذرت عملية إنشاء هيئة الشهادات",
|
||||
"yunohost_ca_creation_success": "تم إنشاء هيئة الشهادات المحلية.",
|
||||
"yunohost_installing": "عملية تنصيب يونوهوست جارية …",
|
||||
"yunohost_not_installed": "إنَّ واي يونوهوست ليس مُنَصَّب أو هو مثبت حاليا بشكل خاطئ. قم بتنفيذ الأمر 'yunohost tools postinstall'",
|
||||
"migration_description_0003_migrate_to_stretch": "تحديث النظام إلى ديبيان ستريتش و واي يونوهوست 3.0",
|
||||
"migration_0003_patching_sources_list": "عملية تصحيح ملف المصادر sources.lists جارية…",
|
||||
"migration_0003_main_upgrade": "بداية عملية التحديث الأساسية…",
|
||||
"migration_0003_fail2ban_upgrade": "بداية عملية تحديث Fail2Ban…",
|
||||
"migration_0003_not_jessie": "إن توزيعة ديبيان الحالية تختلف عن جيسي !",
|
||||
"migration_description_0002_migrate_to_tsig_sha256": "يقوم بتحسين أمان TSIG لنظام أسماء النطاقات الديناميكة باستخدام SHA512 بدلًا مِن MD5",
|
||||
"migration_0003_system_not_fully_up_to_date": "إنّ نظامك غير مُحدَّث بعدُ لذا يرجى القيام بتحديث عادي أولا قبل إطلاق إجراء الإنتقال إلى نظام ستريتش.",
|
||||
"migrations_list_conflict_pending_done": "لا يمكنك استخدام --previous و --done معًا على نفس سطر الأوامر.",
|
||||
"service_description_avahi-daemon": "يسمح لك بالنفاذ إلى خادومك عبر الشبكة المحلية باستخدام yunohost.local",
|
||||
"service_description_metronome": "يُدير حسابات الدردشة الفورية XMPP",
|
||||
"service_description_nginx": "يقوم بتوفير النفاذ و السماح بالوصول إلى كافة مواقع الويب المستضافة على خادومك",
|
||||
"service_description_postfix": "يقوم بإرسال و تلقي الرسائل البريدية الإلكترونية",
|
||||
"service_description_yunohost-api": "يقوم بإدارة التفاعلات ما بين واجهة الويب لواي يونوهوست و النظام",
|
||||
"log_category_404": "فئةالسجل '{category}' لا وجود لها",
|
||||
"log_app_change_url": "تعديل رابط تطبيق '{}'",
|
||||
"log_app_install": "تنصيب تطبيق '{}'",
|
||||
"log_app_remove": "حذف تطبيق '{}'",
|
||||
|
@ -128,12 +111,10 @@
|
|||
"log_tools_upgrade": "تحديث حُزم ديبيان",
|
||||
"log_tools_shutdown": "إطفاء الخادم",
|
||||
"log_tools_reboot": "إعادة تشغيل الخادم",
|
||||
"migration_description_0005_postgresql_9p4_to_9p6": "تهجير قواعد البيانات مِن postgresql 9.4 إلى 9.6",
|
||||
"service_description_dnsmasq": "مُكلَّف بتحليل أسماء النطاقات (DNS)",
|
||||
"service_description_mysql": "يقوم بتخزين بيانات التطبيقات (قواعد بيانات SQL)",
|
||||
"service_description_rspamd": "يقوم بتصفية البريد المزعج و إدارة ميزات أخرى للبريد",
|
||||
"service_description_yunohost-firewall": "يُدير فتح وإغلاق منافذ الاتصال إلى الخدمات",
|
||||
"users_available": "المستخدمون المتوفرون:",
|
||||
"aborting": "إلغاء.",
|
||||
"admin_password_too_long": "يرجى اختيار كلمة سرية أقصر مِن 127 حرف",
|
||||
"app_not_upgraded": "",
|
||||
|
@ -146,9 +127,7 @@
|
|||
"global_settings_setting_security_password_admin_strength": "قوة الكلمة السرية الإدارية",
|
||||
"global_settings_setting_security_password_user_strength": "قوة الكلمة السرية للمستخدم",
|
||||
"password_too_simple_1": "يجب أن يكون طول الكلمة السرية على الأقل 8 حروف",
|
||||
"service_description_php7.0-fpm": "يُشغّل التطبيقات المكتوبة بلغة الـ PHP على NGINX",
|
||||
"already_up_to_date": "كل شيء على ما يرام. ليس هناك ما يتطلّب تحديثًا.",
|
||||
"service_description_nslcd": "يدير اتصال متسخدمي واي يونوهوست عبر طرفية سطر الأوامر",
|
||||
"service_description_slapd": "يخزّن المستخدمين والنطاقات والمعلومات المتعلقة بها",
|
||||
"service_reloaded": "تم إعادة تشغيل خدمة '{service:s}'",
|
||||
"service_restarted": "تم إعادة تشغيل خدمة '{service:s}'",
|
||||
|
@ -184,4 +163,4 @@
|
|||
"diagnosis_description_dnsrecords": "تسجيلات خدمة DNS",
|
||||
"diagnosis_description_ip": "الإتصال بالإنترنت",
|
||||
"diagnosis_description_basesystem": "النظام الأساسي"
|
||||
}
|
||||
}
|
|
@ -32,7 +32,6 @@
|
|||
"app_upgrade_failed": "No s'ha pogut actualitzar {app:s}: {error}",
|
||||
"app_upgrade_some_app_failed": "No s'han pogut actualitzar algunes aplicacions",
|
||||
"app_upgraded": "S'ha actualitzat {app:s}",
|
||||
"ask_email": "Adreça de correu electrònic",
|
||||
"ask_firstname": "Nom",
|
||||
"ask_lastname": "Cognom",
|
||||
"ask_main_domain": "Domini principal",
|
||||
|
@ -40,7 +39,6 @@
|
|||
"ask_password": "Contrasenya",
|
||||
"backup_abstract_method": "Encara està per implementar aquest mètode de còpia de seguretat",
|
||||
"backup_app_failed": "No s'ha pogut fer la còpia de seguretat de {app:s}",
|
||||
"backup_applying_method_borg": "Enviant tots els fitxers de la còpia de seguretat al repositori borg-backup...",
|
||||
"backup_applying_method_copy": "Còpia de tots els fitxers a la còpia de seguretat...",
|
||||
"backup_applying_method_custom": "Crida del mètode de còpia de seguretat personalitzat \"{method:s}\"...",
|
||||
"backup_applying_method_tar": "Creació de l'arxiu TAR de la còpia de seguretat...",
|
||||
|
@ -52,7 +50,6 @@
|
|||
"backup_archive_system_part_not_available": "La part «{part:s}» del sistema no està disponible en aquesta copia de seguretat",
|
||||
"backup_archive_writing_error": "No es poden afegir els arxius «{source:s}» (anomenats en l'arxiu «{dest:s}») a l'arxiu comprimit de la còpia de seguretat «{archive:s}»",
|
||||
"backup_ask_for_copying_if_needed": "Voleu fer la còpia de seguretat utilitzant {size:s}MB temporalment? (S'utilitza aquest mètode ja que alguns dels fitxers no s'han pogut preparar utilitzar un mètode més eficient.)",
|
||||
"backup_borg_not_implemented": "El mètode de còpia de seguretat Borg encara no està implementat",
|
||||
"backup_cant_mount_uncompress_archive": "No es pot carregar l'arxiu descomprimit com a protegit contra escriptura",
|
||||
"backup_cleaning_failed": "No s'ha pogut netejar el directori temporal de la còpia de seguretat",
|
||||
"backup_copying_to_organize_the_archive": "Copiant {size:s}MB per organitzar l'arxiu",
|
||||
|
@ -76,8 +73,6 @@
|
|||
"backup_delete_error": "No s'ha pogut suprimir «{path:s}»",
|
||||
"backup_deleted": "S'ha suprimit la còpia de seguretat",
|
||||
"backup_hook_unknown": "Script de còpia de seguretat «{hook:s}» desconegut",
|
||||
"backup_invalid_archive": "Aquest no és un arxiu de còpia de seguretat",
|
||||
"backup_method_borg_finished": "La còpia de seguretat a Borg ha acabat",
|
||||
"backup_method_copy_finished": "La còpia de la còpia de seguretat ha acabat",
|
||||
"backup_method_custom_finished": "El mètode de còpia de seguretat personalitzat \"{method:s}\" ha acabat",
|
||||
"backup_method_tar_finished": "S'ha creat l'arxiu de còpia de seguretat TAR",
|
||||
|
@ -94,7 +89,6 @@
|
|||
"backup_output_directory_not_empty": "Heu d'escollir un directori de sortida buit",
|
||||
"backup_output_directory_required": "Heu d'especificar un directori de sortida per la còpia de seguretat",
|
||||
"backup_output_symlink_dir_broken": "El directori del arxiu «{path:s}» es un enllaç simbòlic trencat. Pot ser heu oblidat muntar, tornar a muntar o connectar el mitja d'emmagatzematge al que apunta.",
|
||||
"backup_php5_to_php7_migration_may_fail": "No s'ha pogut convertir l'arxiu per suportar PHP 7, pot ser que no es puguin restaurar les vostres aplicacions PHP (raó: {error:s})",
|
||||
"backup_running_hooks": "Executant els scripts de la còpia de seguretat...",
|
||||
"backup_system_part_failed": "No s'ha pogut fer la còpia de seguretat de la part \"{part:s}\" del sistema",
|
||||
"backup_unable_to_organize_files": "No s'ha pogut utilitzar el mètode ràpid per organitzar els fitxers dins de l'arxiu",
|
||||
|
@ -110,15 +104,10 @@
|
|||
"certmanager_cert_renew_success": "S'ha renovat correctament el certificat Let's Encrypt pel domini «{domain:s}»",
|
||||
"certmanager_cert_signing_failed": "No s'ha pogut firmar el nou certificat",
|
||||
"certmanager_certificate_fetching_or_enabling_failed": "Sembla que utilitzar el nou certificat per {domain:s} ha fallat...",
|
||||
"certmanager_conflicting_nginx_file": "No s'ha pogut preparar el domini per al desafiament ACME: l'arxiu de configuració NGINX {filepath:s} entra en conflicte i s'ha d'eliminar primer",
|
||||
"certmanager_couldnt_fetch_intermediate_cert": "S'ha exhaurit el temps d'esperar al intentar recollir el certificat intermedi des de Let's Encrypt. La instal·lació/renovació del certificat s'ha cancel·lat - torneu a intentar-ho més tard.",
|
||||
"certmanager_domain_cert_not_selfsigned": "El certificat pel domini {domain:s} no és auto-signat Esteu segur de voler canviar-lo? (Utilitzeu «--force» per fer-ho)",
|
||||
"certmanager_domain_dns_ip_differs_from_public_ip": "Els registres DNS pel domini «{domain:s}» són diferents a l'adreça IP d'aquest servidor. Mireu la categoria «registres DNS» (bàsic) al diagnòstic per a més informació. Si heu modificat recentment el registre A, si us plau espereu a que es propagui (hi ha eines per verificar la propagació disponibles a internet). (Si sabeu el que esteu fent, podeu utilitzar «--no-checks» per desactivar aquestes comprovacions.)",
|
||||
"certmanager_domain_http_not_working": "El domini {domain:s} sembla que no és accessible via HTTP. Verifiqueu la categoria «Web» en el diagnòstic per a més informació. (Si sabeu el que esteu fent, utilitzeu «--no-checks» per deshabilitar les comprovacions.)",
|
||||
"certmanager_domain_unknown": "Domini desconegut «{domain:s}»",
|
||||
"certmanager_error_no_A_record": "No s'ha trobat cap registre DNS «A» per «{domain:s}». Heu de fer que el vostre nom de domini apunti cap a la vostra màquina per tal de poder instal·lar un certificat Let's Encrypt. (Si sabeu el que esteu fent, podeu utilitzar «--no-checks» per desactivar aquestes comprovacions.)",
|
||||
"certmanager_hit_rate_limit": "S'han emès massa certificats recentment per aquest mateix conjunt de dominis {domain:s}. Si us plau torneu-ho a intentar més tard. Consulteu https://letsencrypt.org/docs/rate-limits/ per obtenir més detalls",
|
||||
"certmanager_http_check_timeout": "S'ha exhaurit el temps d'espera quan el servidor ha intentat contactar amb ell mateix via HTTP utilitzant la seva adreça IP pública (domini «{domain:s}» amb IP «{ip:s}»). Pot ser degut a hairpinning o a que el talla focs/router al que està connectat el servidor estan mal configurats.",
|
||||
"certmanager_no_cert_file": "No s'ha pogut llegir l'arxiu del certificat pel domini {domain:s} (fitxer: {file:s})",
|
||||
"certmanager_self_ca_conf_file_not_found": "No s'ha trobat el fitxer de configuració per l'autoritat del certificat auto-signat (fitxer: {file:s})",
|
||||
"certmanager_unable_to_parse_self_CA_name": "No s'ha pogut analitzar el nom de l'autoritat del certificat auto-signat (fitxer: {file:s})",
|
||||
|
@ -156,12 +145,7 @@
|
|||
"dyndns_registration_failed": "No s'ha pogut registrar el domini DynDNS: {error:s}",
|
||||
"dyndns_domain_not_provided": "El proveïdor de DynDNS {provider:s} no pot oferir el domini {domain:s}.",
|
||||
"dyndns_unavailable": "El domini {domain:s} no està disponible.",
|
||||
"executing_command": "Execució de l'ordre « {command:s} »...",
|
||||
"executing_script": "Execució de l'script « {script:s} »...",
|
||||
"extracting": "Extracció en curs...",
|
||||
"dyndns_cron_installed": "S'ha creat la tasca cron pel DynDNS",
|
||||
"dyndns_cron_remove_failed": "No s'ha pogut eliminar la tasca cron per a DynDNS: {error}",
|
||||
"dyndns_cron_removed": "S'ha eliminat la tasca cron pel DynDNS",
|
||||
"experimental_feature": "Atenció: Aquesta funcionalitat és experimental i no es considera estable, no s'ha d'utilitzar a excepció de saber el que esteu fent.",
|
||||
"field_invalid": "Camp incorrecte « {:s} »",
|
||||
"file_does_not_exist": "El camí {path:s} no existeix.",
|
||||
|
@ -175,10 +159,6 @@
|
|||
"global_settings_cant_write_settings": "No s'ha pogut escriure el fitxer de configuració, raó: {reason:s}",
|
||||
"global_settings_key_doesnt_exists": "La clau « {settings_key:s} » no existeix en la configuració global, podeu veure totes les claus disponibles executant « yunohost settings list »",
|
||||
"global_settings_reset_success": "S'ha fet una còpia de seguretat de la configuració anterior a {path:s}",
|
||||
"global_settings_setting_example_bool": "Exemple d'opció booleana",
|
||||
"global_settings_setting_example_enum": "Exemple d'opció de tipus enumeració",
|
||||
"global_settings_setting_example_int": "Exemple d'opció de tipus enter",
|
||||
"global_settings_setting_example_string": "Exemple d'opció de tipus cadena",
|
||||
"global_settings_setting_security_nginx_compatibility": "Solució de compromís entre compatibilitat i seguretat pel servidor web NGINX. Afecta els criptògrafs (i altres aspectes relacionats amb la seguretat)",
|
||||
"global_settings_setting_security_password_admin_strength": "Robustesa de la contrasenya d'administrador",
|
||||
"global_settings_setting_security_password_user_strength": "Robustesa de la contrasenya de l'usuari",
|
||||
|
@ -197,7 +177,6 @@
|
|||
"ip6tables_unavailable": "No podeu modificar les ip6tables aquí. O bé sou en un contenidor o bé el vostre nucli no és compatible amb aquesta opció",
|
||||
"iptables_unavailable": "No podeu modificar les iptables aquí. O bé sou en un contenidor o bé el vostre nucli no és compatible amb aquesta opció",
|
||||
"log_corrupted_md_file": "El fitxer de metadades YAML associat amb els registres està malmès: « {md_file} »\nError: {error}",
|
||||
"log_category_404": "La categoria de registres « {category} » no existeix",
|
||||
"log_link_to_log": "El registre complet d'aquesta operació: «<a href=\"#/tools/logs/{name}\" style=\"text-decoration:underline\">{desc}</a>»",
|
||||
"log_help_to_get_log": "Per veure el registre de l'operació « {desc} », utilitzeu l'ordre « yunohost log show {name}{name} »",
|
||||
"log_link_to_failed_log": "No s'ha pogut completar l'operació « {desc} ». Per obtenir ajuda, <a href=\"#/tools/logs/{name}\">proveïu el registre complete de l'operació clicant aquí</a>",
|
||||
|
@ -243,49 +222,6 @@
|
|||
"mail_unavailable": "Aquesta adreça de correu està reservada i ha de ser atribuïda automàticament el primer usuari",
|
||||
"main_domain_change_failed": "No s'ha pogut canviar el domini principal",
|
||||
"main_domain_changed": "S'ha canviat el domini principal",
|
||||
"migrate_tsig_end": "La migració cap a HMAC-SHA-512 s'ha acabat",
|
||||
"migrate_tsig_failed": "Ha fallat la migració del domini DynDNS «{domain}» cap a HMAC-SHA-512, anul·lant les modificacions. Error: {error_code}, {error}",
|
||||
"migrate_tsig_start": "L'algoritme de generació de claus no es prou segur per a la signatura TSIG del domini «{domain}», començant la migració cap a un de més segur HMAC-SHA-512",
|
||||
"migrate_tsig_wait": "Esperant tres minuts per a que el servidor DynDNS tingui en compte la nova clau…",
|
||||
"migrate_tsig_wait_2": "2 minuts…",
|
||||
"migrate_tsig_wait_3": "1 minut…",
|
||||
"migrate_tsig_wait_4": "30 segons…",
|
||||
"migrate_tsig_not_needed": "Sembla que no s'utilitza cap domini DynDNS, no és necessari fer cap migració.",
|
||||
"migration_description_0001_change_cert_group_to_sslcert": "Canvia els permisos del grup dels certificats de «metronome» a «ssl-cert»",
|
||||
"migration_description_0002_migrate_to_tsig_sha256": "Millora la seguretat de DynDNS TSIG utilitzant SHA-512 en lloc de MD5",
|
||||
"migration_description_0003_migrate_to_stretch": "Actualització del sistema a Debian Stretch i YunoHost 3.0",
|
||||
"migration_description_0004_php5_to_php7_pools": "Tornar a configurar els pools PHP per utilitzar PHP 7 en lloc de PHP 5",
|
||||
"migration_description_0005_postgresql_9p4_to_9p6": "Migració de les bases de dades de PostgreSQL 9.4 a 9.6",
|
||||
"migration_description_0006_sync_admin_and_root_passwords": "Sincronitzar les contrasenyes admin i root",
|
||||
"migration_description_0007_ssh_conf_managed_by_yunohost_step1": "La configuració SSH serà gestionada per YunoHost (pas 1, automàtic)",
|
||||
"migration_description_0008_ssh_conf_managed_by_yunohost_step2": "La configuració SSH serà gestionada per YunoHost (pas 2, manual)",
|
||||
"migration_description_0009_decouple_regenconf_from_services": "Desvincula el mecanisme regen-conf dels serveis",
|
||||
"migration_description_0010_migrate_to_apps_json": "Elimina els catàlegs d'aplicacions obsolets i utilitza la nova llista unificada «apps.json» en el seu lloc (obsolet, substituït per la migració 13)",
|
||||
"migration_0003_start": "Ha començat la migració a Stretch. Els registres estaran disponibles a {logfile}.",
|
||||
"migration_0003_patching_sources_list": "Modificant el fitxer sources.lists…",
|
||||
"migration_0003_main_upgrade": "Començant l'actualització principal…",
|
||||
"migration_0003_fail2ban_upgrade": "Començant l'actualització de Fail2Ban…",
|
||||
"migration_0003_restoring_origin_nginx_conf": "El fitxer /etc/nginx/nginx.conf ha estat editat. La migració el tornarà al seu estat original... El fitxer anterior estarà disponible com a {backup_dest}.",
|
||||
"migration_0003_yunohost_upgrade": "Començant l'actualització del paquet YunoHost... La migració acabarà, però l'actualització actual es farà just després. Després de completar aquesta operació, pot ser que us hagueu de tornar a connectar a la web d'administració.",
|
||||
"migration_0003_not_jessie": "La distribució Debian actual no és Jessie!",
|
||||
"migration_0003_system_not_fully_up_to_date": "El vostre sistema no està completament actualitzat. S'ha de fer una actualització normal abans de fer la migració a Stretch.",
|
||||
"migration_0003_still_on_jessie_after_main_upgrade": "Hi ha hagut un problema durant l'actualització principal: El sistema encara està amb Jessie? Per investigar el problema, mireu el registres a {log}:s…",
|
||||
"migration_0003_general_warning": "Tingueu en compte que la migració és una operació delicada. L'equip de YunoHost a fet els possibles per revisar-la i provar-la, però la migració pot provocar errors en parts del sistema o aplicacions.\n\nPer tant, es recomana:\n - Fer una còpia de seguretat de les dades o aplicacions importants. Més informació a https://yunohost.org/backup;\n - Sigueu pacient un cop llençada la migració: en funció de la connexió a internet i el maquinari, pot trigar fins a unes hores per actualitzar-ho tot.\n\nD'altra banda, el port per SMTP, utilitzat per clients de correu externs (com Thunderbird o K9-Mail) ha canviat de 465 (SSL/TLS) a 587 (STARTTLS). L'antic port (465) serà tancat automàticament, i el nou port (587) serà obert en el tallafocs. Tots els usuaris *hauran* d'adaptar la configuració dels clients de correu en acord amb aquests canvis.",
|
||||
"migration_0003_problematic_apps_warning": "Tingueu en compte que s'han detectat les aplicacions, possiblement, problemàtiques següents. Sembla que aquestes no s'han instal·lat des d'un catàleg d'aplicacions, o que no estan marcades com a «working». Per conseqüent, no podem garantir que segueixin funcionant després de l'actualització: {problematic_apps}",
|
||||
"migration_0003_modified_files": "Tingueu en compte que s'han detectat els següents fitxers que han estat modificats manualment i podrien sobreescriure's al final de l'actualització: {manually_modified_files}",
|
||||
"migration_0005_postgresql_94_not_installed": "PostgreSQL no està instal·lat en el sistema. No hi ha res per fer.",
|
||||
"migration_0005_postgresql_96_not_installed": "PostgreSQL 9.4 està instal·lat, però no PostgreSQL 9.6? Alguna cosa estranya a passat en el sistema :( …",
|
||||
"migration_0005_not_enough_space": "Creu espai disponible en {path} per executar la migració.",
|
||||
"migration_0006_disclaimer": "YunoHost esperar que les contrasenyes de admin i root estiguin sincronitzades. Aquesta migració canvia la contrasenya root per la contrasenya admin.",
|
||||
"migration_0007_cancelled": "No s'ha pogut millorar la gestió de la configuració SSH.",
|
||||
"migration_0007_cannot_restart": "No es pot reiniciar SSH després d'haver intentat cancel·lar la migració numero 6.",
|
||||
"migration_0008_general_disclaimer": "Per millorar la seguretat del servidor, es recomana que sigui YunoHost qui gestioni la configuració SSH. La configuració SSH actual és diferent a la configuració recomanada. Si deixeu que YunoHost ho reconfiguri, la manera de connectar-se al servidor mitjançant SSH canviarà de la següent manera:",
|
||||
"migration_0008_port": "• La connexió es farà utilitzant el port 22 en lloc del port SSH personalitzat actual. Es pot reconfigurar;",
|
||||
"migration_0008_root": "• No es podrà connectar com a root a través de SSH. S'haurà d'utilitzar l'usuari admin per fer-ho;",
|
||||
"migration_0008_dsa": "• Es desactivarà la clau DSA. Per tant, es podria haver d'invalidar un missatge esgarrifós del client SSH, i tornar a verificar l'empremta digital del servidor;",
|
||||
"migration_0008_warning": "Si heu entès els avisos i voleu que YunoHost sobreescrigui la configuració actual, comenceu la migració. Sinó, podeu saltar-vos la migració, tot i que no està recomanat.",
|
||||
"migration_0008_no_warning": "Hauria de ser segur sobreescriure la configuració SSH, però no es pot estar del tot segur! Executeu la migració per sobreescriure-la. Sinó, podeu saltar-vos la migració, tot i que no està recomanat.",
|
||||
"migration_0009_not_needed": "Sembla que ja s'ha fet aquesta migració… (?) Ometent.",
|
||||
"migrations_cant_reach_migration_file": "No s'ha pogut accedir als fitxers de migració al camí «%s»",
|
||||
"migrations_list_conflict_pending_done": "No es pot utilitzar «--previous» i «--done» al mateix temps.",
|
||||
"migrations_loading_migration": "Carregant la migració {id}...",
|
||||
|
@ -294,9 +230,7 @@
|
|||
"migrations_skip_migration": "Saltant migració {id}...",
|
||||
"migrations_to_be_ran_manually": "La migració {id} s'ha de fer manualment. Aneu a Eines → Migracions a la interfície admin, o executeu «yunohost tools migrations run».",
|
||||
"migrations_need_to_accept_disclaimer": "Per fer la migració {id}, heu d'acceptar aquesta clàusula de no responsabilitat:\n---\n{disclaimer}\n---\nSi accepteu fer la migració, torneu a executar l'ordre amb l'opció «--accept-disclaimer».",
|
||||
"no_internet_connection": "El servidor no està connectat a Internet",
|
||||
"not_enough_disk_space": "No hi ha prou espai en «{path:s}»",
|
||||
"package_unknown": "Paquet desconegut «{pkgname}»",
|
||||
"packages_upgrade_failed": "No s'han pogut actualitzar tots els paquets",
|
||||
"pattern_backup_archive_name": "Ha de ser un nom d'arxiu vàlid amb un màxim de 30 caràcters, compost per caràcters alfanumèrics i -_. exclusivament",
|
||||
"pattern_domain": "Ha de ser un nom de domini vàlid (ex.: el-meu-domini.cat)",
|
||||
|
@ -359,8 +293,6 @@
|
|||
"service_description_metronome": "Gestiona els comptes de missatgeria instantània XMPP",
|
||||
"service_description_mysql": "Guarda les dades de les aplicacions (base de dades SQL)",
|
||||
"service_description_nginx": "Serveix o permet l'accés a totes les pàgines web allotjades en el servidor",
|
||||
"service_description_nslcd": "Gestiona les connexions shell dels usuaris YunoHost",
|
||||
"service_description_php7.0-fpm": "Executa les aplicacions escrites en PHP amb NGINX",
|
||||
"service_description_postfix": "Utilitzat per enviar i rebre correus",
|
||||
"service_description_redis-server": "Una base de dades especialitzada per l'accés ràpid a dades, files d'espera i comunicació entre programes",
|
||||
"service_description_rspamd": "Filtra el correu brossa, i altres funcionalitats relacionades amb el correu",
|
||||
|
@ -421,10 +353,7 @@
|
|||
"user_unknown": "Usuari desconegut: {user:s}",
|
||||
"user_update_failed": "No s'ha pogut actualitzar l'usuari {user}: {error}",
|
||||
"user_updated": "S'ha canviat la informació de l'usuari",
|
||||
"users_available": "Usuaris disponibles:",
|
||||
"yunohost_already_installed": "YunoHost ja està instal·lat",
|
||||
"yunohost_ca_creation_failed": "No s'ha pogut crear l'autoritat de certificació",
|
||||
"yunohost_ca_creation_success": "S'ha creat l'autoritat de certificació local.",
|
||||
"yunohost_configured": "YunoHost està configurat",
|
||||
"yunohost_installing": "Instal·lació de YunoHost...",
|
||||
"yunohost_not_installed": "YunoHost no està instal·lat correctament. Executeu «yunohost tools postinstall»",
|
||||
|
@ -439,17 +368,6 @@
|
|||
"log_user_group_delete": "Eliminar grup «{}»",
|
||||
"log_user_group_update": "Actualitzar grup «{}»",
|
||||
"mailbox_disabled": "La bústia de correu està desactivada per al usuari {user:s}",
|
||||
"migration_description_0011_setup_group_permission": "Configurar els grups d'usuaris i els permisos per les aplicacions i els serveis",
|
||||
"migration_0011_backup_before_migration": "Creant una còpia de seguretat de la base de dades LDAP i la configuració de les aplicacions abans d'efectuar la migració.",
|
||||
"migration_0011_can_not_backup_before_migration": "No s'ha pogut completar la còpia de seguretat abans de que la migració fallés. Error: {error:s}",
|
||||
"migration_0011_create_group": "Creant un grup per a cada usuari...",
|
||||
"migration_0011_done": "Migració completada. Ja podeu gestionar grups d'usuaris.",
|
||||
"migration_0011_LDAP_update_failed": "No s'ha pogut actualitzar LDAP. Error: {error:s}",
|
||||
"migration_0011_migrate_permission": "Fent la migració dels permisos de la configuració de les aplicacions a LDAP...",
|
||||
"migration_0011_migration_failed_trying_to_rollback": "No s'ha pogut fer la migració… s'intenta tornar el sistema a l'estat anterior.",
|
||||
"migration_0011_rollback_success": "S'ha tornat el sistema a l'estat anterior.",
|
||||
"migration_0011_update_LDAP_database": "Actualitzant la base de dades LDAP...",
|
||||
"migration_0011_update_LDAP_schema": "Actualitzant l'esquema LDAP...",
|
||||
"permission_already_exist": "El permís «{permission:s}» ja existeix",
|
||||
"permission_created": "S'ha creat el permís «{permission:s}»",
|
||||
"permission_creation_failed": "No s'ha pogut crear el permís «{permission}»: {error}",
|
||||
|
@ -458,8 +376,6 @@
|
|||
"permission_not_found": "No s'ha trobat el permís «{permission:s}»",
|
||||
"permission_update_failed": "No s'ha pogut actualitzar el permís «{permission}»: {error}",
|
||||
"permission_updated": "S'ha actualitzat el permís «{permission:s}»",
|
||||
"permission_update_nothing_to_do": "No hi ha cap permís per actualitzar",
|
||||
"migration_description_0012_postgresql_password_to_md5_authentication": "Força l'autenticació PostgreSQL a fer servir MD5 per a les connexions locals",
|
||||
"app_full_domain_unavailable": "Aquesta aplicació ha de ser instal·lada en el seu propi domini, però ja hi ha altres aplicacions instal·lades en el domini «{domain}». Podeu utilitzar un subdomini dedicat a aquesta aplicació.",
|
||||
"migrations_not_pending_cant_skip": "Aquestes migracions no estan pendents, així que no poden ser omeses: {ids}",
|
||||
"app_action_broke_system": "Aquesta acció sembla haver trencat els següents serveis importants: {services}",
|
||||
|
@ -486,7 +402,6 @@
|
|||
"group_user_not_in_group": "L'usuari {user} no està en el grup {group}",
|
||||
"log_permission_create": "Crear el permís «{}»",
|
||||
"log_permission_delete": "Eliminar el permís «{}»",
|
||||
"migration_0011_failed_to_remove_stale_object": "No s'ha pogut eliminar l'objecte obsolet {dn}: {error}",
|
||||
"permission_already_allowed": "El grup «{group}» ja té el permís «{permission}» activat",
|
||||
"permission_cannot_remove_main": "No es permet eliminar un permís principal",
|
||||
"user_already_exists": "L'usuari «{user}» ja existeix",
|
||||
|
@ -496,7 +411,6 @@
|
|||
"group_cannot_edit_visitors": "El grup «visitors» no es pot editar manualment. És un grup especial que representa els visitants anònims",
|
||||
"group_cannot_edit_primary_group": "El grup «{group}» no es pot editar manualment. És el grup principal destinat a contenir un usuari específic.",
|
||||
"log_permission_url": "Actualització de la URL associada al permís «{}»",
|
||||
"migration_0011_slapd_config_will_be_overwritten": "Sembla que heu modificat manualment la configuració de sldap. Per aquesta migració crítica, YunoHost ha de forçar l'actualització de la configuració sldap. Es farà una còpia de seguretat a {conf_backup_folder}.",
|
||||
"permission_already_up_to_date": "No s'ha actualitzat el permís perquè la petició d'afegir/eliminar ja corresponent a l'estat actual.",
|
||||
"permission_currently_allowed_for_all_users": "El permís ha el té el grup de tots els usuaris (all_users) a més d'altres grups. Segurament s'hauria de revocar el permís a «all_users» o eliminar els altres grups als que s'ha atribuït.",
|
||||
"permission_require_account": "El permís {permission} només té sentit per als usuaris que tenen un compte, i per tant no es pot activar per als visitants.",
|
||||
|
@ -513,9 +427,7 @@
|
|||
"diagnosis_basesystem_kernel": "El servidor funciona amb el nucli de Linux {kernel_version}",
|
||||
"diagnosis_basesystem_ynh_single_version": "{package} versió: {version}({repo})",
|
||||
"diagnosis_basesystem_ynh_inconsistent_versions": "Esteu utilitzant versions inconsistents dels paquets de YunoHost… probablement a causa d'una actualització fallida o parcial.",
|
||||
"diagnosis_display_tip_web": "Podeu anar a la secció de Diagnòstics (en la pantalla principal) per veure els errors que s'han trobat.",
|
||||
"diagnosis_failed_for_category": "Ha fallat el diagnòstic per la categoria «{category}»: {error}",
|
||||
"diagnosis_display_tip_cli": "Podeu executar «yunohost diagnosis show --issues --human-readable» per mostrar els errors que s'han trobat.",
|
||||
"diagnosis_cache_still_valid": "(La memòria cau encara és vàlida pel diagnòstic de {category}. No es tornar a diagnosticar de moment!)",
|
||||
"diagnosis_cant_run_because_of_dep": "No es pot fer el diagnòstic per {category} mentre hi ha problemes importants relacionats amb {dep}.",
|
||||
"diagnosis_ignored_issues": "(+ {nb_ignored} problema(es) ignorat(s))",
|
||||
|
@ -548,9 +460,6 @@
|
|||
"diagnosis_swap_ok": "El sistema té {total} de swap!",
|
||||
"diagnosis_regenconf_allgood": "Tots els fitxers de configuració estan en acord amb la configuració recomanada!",
|
||||
"diagnosis_regenconf_manually_modified_details": "No hauria de ser cap problema sempre i quan sapigueu el que esteu fent! YunoHost deixarà d'actualitzar aquest fitxer de manera automàtica… Però tingueu en compte que les actualitzacions de YunoHost podrien tenir canvis recomanats importants. Si voleu podeu mirar les diferències amb <cmd>yunohost tools regen-conf {category} --dry-run --with-diff</cmd> i forçar el restabliment de la configuració recomanada amb <cmd>yunohost tools regen-conf {category} --force</cmd>",
|
||||
"diagnosis_regenconf_manually_modified_debian": "El fitxer de configuració {file} ha estat modificat manualment respecte al fitxer per defecte de Debian.",
|
||||
"diagnosis_regenconf_manually_modified_debian_details": "No hauria de ser cap problema, però ho haureu de vigilar...",
|
||||
"diagnosis_security_all_good": "No s'ha trobat cap vulnerabilitat de seguretat crítica.",
|
||||
"diagnosis_security_vulnerable_to_meltdown": "Sembla que el sistema és vulnerable a la vulnerabilitat de seguretat crítica Meltdown",
|
||||
"diagnosis_description_basesystem": "Sistema de base",
|
||||
"diagnosis_description_ip": "Connectivitat a Internet",
|
||||
|
@ -559,7 +468,6 @@
|
|||
"diagnosis_description_systemresources": "Recursos del sistema",
|
||||
"diagnosis_description_ports": "Exposició dels ports",
|
||||
"diagnosis_description_regenconf": "Configuració del sistema",
|
||||
"diagnosis_description_security": "Verificacions de seguretat",
|
||||
"diagnosis_ports_could_not_diagnose": "No s'ha pogut diagnosticar si els ports són accessibles des de l'exterior.",
|
||||
"diagnosis_ports_could_not_diagnose_details": "Error: {error}",
|
||||
"diagnosis_ports_unreachable": "El port {port} no és accessible des de l'exterior.",
|
||||
|
@ -572,10 +480,8 @@
|
|||
"apps_catalog_failed_to_download": "No s'ha pogut descarregar el catàleg d'aplicacions {apps_catalog}: {error}",
|
||||
"apps_catalog_obsolete_cache": "La memòria cau del catàleg d'aplicacions és buida o obsoleta.",
|
||||
"apps_catalog_update_success": "S'ha actualitzat el catàleg d'aplicacions!",
|
||||
"diagnosis_mail_ougoing_port_25_ok": "El port de sortida 25 no està bloquejat i els correus es poden enviar a altres servidors.",
|
||||
"diagnosis_mail_outgoing_port_25_blocked": "Sembla que el port de sortida 25 està bloquejat. Hauríeu d'intentar desbloquejar-lo al panell de configuració del proveïdor d'accés a internet (o allotjador). Mentrestant, el servidor no podrà enviar correus a altres servidors.",
|
||||
"diagnosis_description_mail": "Correu electrònic",
|
||||
"migration_description_0013_futureproof_apps_catalog_system": "Migrar al nou sistema de catàleg d'aplicacions resistent al pas del temps",
|
||||
"app_upgrade_script_failed": "Hi ha hagut un error en el script d'actualització de l'aplicació",
|
||||
"diagnosis_services_bad_status_tip": "Podeu intentar <a href='#/services/{service}'>reiniciar el servei</a>, i si no funciona, podeu mirar <a href='#/services/{service}'>els registres a la pàgina web d'administració</a> (des de la línia de comandes, ho podeu fer utilitzant <cmd>yunohost service restart {service}</cmd> i <cmd>yunohost service log {service}</cmd>).",
|
||||
"diagnosis_ports_forwarding_tip": "Per arreglar aquest problema, segurament s'ha de configurar el reenviament de ports en el router tal i com s'explica a <a href='https://yunohost.org/isp_box_config'>https://yunohost.org/isp_box_config</a>",
|
||||
|
@ -584,7 +490,6 @@
|
|||
"diagnosis_http_timeout": "S'ha exhaurit el temps d'esperar intentant connectar amb el servidor des de l'exterior.<br>1. La causa més probable per a aquest problema és que el port 80 (i 443) <a href='https://yunohost.org/isp_box_config'>no reenvien correctament cap al vostre servidor</a>.<br>2. També us hauríeu d'assegurar que el servei nginx estigui funcionant<br>3. En configuracions més complexes: assegureu-vos que no hi ha cap tallafoc o reverse-proxy interferint.",
|
||||
"diagnosis_http_connection_error": "Error de connexió: no s'ha pogut connectar amb el domini demanat, segurament és inaccessible.",
|
||||
"yunohost_postinstall_end_tip": "S'ha completat la post-instal·lació. Per acabar la configuració, considereu:\n - afegir un primer usuari a través de la secció «Usuaris» a la pàgina web d'administració (o emprant «yunohost user create <username>» a la línia d'ordres);\n - diagnosticar possibles problemes a través de la secció «Diagnòstics» a la pàgina web d'administració (o emprant «yunohost diagnosis run» a la línia d'ordres);\n - llegir les seccions «Finalizing your setup» i «Getting to know Yunohost» a la documentació per administradors: https://yunohost.org/admindoc.",
|
||||
"migration_description_0014_remove_app_status_json": "Eliminar els fitxers d'aplicació status.json heretats",
|
||||
"diagnosis_services_running": "El servei {service} s'està executant!",
|
||||
"diagnosis_services_conf_broken": "La configuració pel servei {service} està trencada!",
|
||||
"diagnosis_ports_needed_by": "És necessari exposar aquest port per a les funcions {category} (servei {service})",
|
||||
|
@ -594,7 +499,6 @@
|
|||
"log_app_config_apply": "Afegeix la configuració a l'aplicació «{}»",
|
||||
"diagnosis_never_ran_yet": "Sembla que el servidor s'ha configurat recentment i encara no hi cap informe de diagnòstic per mostrar. S'ha d'executar un diagnòstic complet primer, ja sigui des de la pàgina web d'administració o utilitzant la comanda «yunohost diagnosis run» al terminal.",
|
||||
"diagnosis_description_web": "Web",
|
||||
"diagnosis_basesystem_hardware_board": "El model de la targeta del servidor és {model}",
|
||||
"diagnosis_basesystem_hardware": "L'arquitectura del maquinari del servidor és {virt} {arch}",
|
||||
"group_already_exist_on_system_but_removing_it": "El grup {group} ja existeix en els grups del sistema, però YunoHost l'eliminarà...",
|
||||
"certmanager_warning_subdomain_dns_record": "El subdomini «{subdomain:s}» no resol a la mateixa adreça IP que «{domain:s}». Algunes funcions no estaran disponibles fins que no s'hagi arreglat i s'hagi regenerat el certificat.",
|
||||
|
@ -718,4 +622,4 @@
|
|||
"postinstall_low_rootfsspace": "El sistema de fitxers arrel té un total de menys de 10 GB d'espai, el que es preocupant! És molt probable que us quedeu sense espai ràpidament! Es recomana tenir un mínim de 16 GB per al sistema de fitxers arrel. Si voleu instal·lar YunoHost tot i aquest avís, torneu a executar la postinstal·lació amb --force-diskspace",
|
||||
"diagnosis_rootfstotalspace_critical": "El sistema de fitxers arrel només té {space} en total i és preocupant! És molt probable que us quedeu sense espai ràpidament! Es recomanar tenir un mínim de 16 GB per al sistema de fitxers arrel.",
|
||||
"diagnosis_rootfstotalspace_warning": "El sistema de fitxers arrel només té {space} en total. Això no hauria de causar cap problema, però haureu de parar atenció ja que us podrieu quedar sense espai ràpidament… Es recomanar tenir un mínim de 16 GB per al sistema de fitxers arrel."
|
||||
}
|
||||
}
|
|
@ -10,4 +10,4 @@
|
|||
"additional_urls_already_added": "Dotatečný odkaz '{url:s}' byl již přidán v dodatečných odkazech pro oprávnění '{permission:s}'",
|
||||
"action_invalid": "Nesprávné akce '{action:s}'",
|
||||
"aborting": "Přerušení."
|
||||
}
|
||||
}
|
|
@ -17,7 +17,6 @@
|
|||
"app_unknown": "Unbekannte App",
|
||||
"app_upgrade_failed": "{app:s} konnte nicht aktualisiert werden: {error}",
|
||||
"app_upgraded": "{app:s} aktualisiert",
|
||||
"ask_email": "E-Mail-Adresse",
|
||||
"ask_firstname": "Vorname",
|
||||
"ask_lastname": "Nachname",
|
||||
"ask_main_domain": "Hauptdomain",
|
||||
|
@ -33,7 +32,6 @@
|
|||
"backup_delete_error": "Pfad '{path:s}' konnte nicht gelöscht werden",
|
||||
"backup_deleted": "Backup wurde entfernt",
|
||||
"backup_hook_unknown": "Der Datensicherungshook '{hook:s}' unbekannt",
|
||||
"backup_invalid_archive": "Dies ist kein Backup-Archiv",
|
||||
"backup_nothings_done": "Keine Änderungen zur Speicherung",
|
||||
"backup_output_directory_forbidden": "Wähle ein anderes Ausgabeverzeichnis. Datensicherungen können nicht in /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var oder in Unterordnern von /home/yunohost.backup/archives erstellt werden",
|
||||
"backup_output_directory_not_empty": "Der gewählte Ausgabeordner sollte leer sein",
|
||||
|
@ -52,17 +50,12 @@
|
|||
"domain_unknown": "Unbekannte Domain",
|
||||
"done": "Erledigt",
|
||||
"downloading": "Wird heruntergeladen…",
|
||||
"dyndns_cron_installed": "DynDNS Cronjob erfolgreich erstellt",
|
||||
"dyndns_cron_remove_failed": "Der DynDNS Cronjob konnte aufgrund dieses Fehlers nicht entfernt werden: {error}",
|
||||
"dyndns_cron_removed": "DynDNS-Cronjob gelöscht",
|
||||
"dyndns_ip_update_failed": "Konnte die IP-Adresse für DynDNS nicht aktualisieren",
|
||||
"dyndns_ip_updated": "Aktualisierung Ihrer IP-Adresse bei DynDNS",
|
||||
"dyndns_key_generating": "Generierung des DNS-Schlüssels..., das könnte eine Weile dauern.",
|
||||
"dyndns_registered": "DynDNS Domain registriert",
|
||||
"dyndns_registration_failed": "DynDNS Domain konnte nicht registriert werden: {error:s}",
|
||||
"dyndns_unavailable": "Die Domäne {domain:s} ist nicht verfügbar.",
|
||||
"executing_command": "Führe den Behfehl '{command:s}' aus…",
|
||||
"executing_script": "Skript '{script:s}' wird ausgeührt…",
|
||||
"extracting": "Wird entpackt...",
|
||||
"field_invalid": "Feld '{:s}' ist unbekannt",
|
||||
"firewall_reload_failed": "Firewall konnte nicht neu geladen werden",
|
||||
|
@ -82,7 +75,6 @@
|
|||
"mail_forward_remove_failed": "Die Weiterleitungs-E-Mail '{mail:s}' konnte nicht gelöscht werden",
|
||||
"main_domain_change_failed": "Die Hauptdomain konnte nicht geändert werden",
|
||||
"main_domain_changed": "Die Hauptdomain wurde geändert",
|
||||
"no_internet_connection": "Der Server ist nicht mit dem Internet verbunden",
|
||||
"packages_upgrade_failed": "Es konnten nicht alle Pakete aktualisiert werden",
|
||||
"pattern_backup_archive_name": "Ein gültiger Dateiname kann nur aus maximal 30 alphanumerischen sowie -_. Zeichen bestehen",
|
||||
"pattern_domain": "Muss ein gültiger Domainname sein (z.B. meine-domain.org)",
|
||||
|
@ -96,7 +88,6 @@
|
|||
"port_already_closed": "Der Port {port:d} wurde bereits für {ip_version:s} Verbindungen geschlossen",
|
||||
"port_already_opened": "Der Port {port:d} wird bereits von {ip_version:s} benutzt",
|
||||
"restore_already_installed_app": "Es ist bereits eine App mit der ID '{app:s}' installiet",
|
||||
"restore_app_failed": "'{app:s}' konnte nicht wiederhergestellt werden: {error:s}",
|
||||
"restore_cleaning_failed": "Das temporäre Dateiverzeichnis für Systemrestaurierung konnte nicht gelöscht werden",
|
||||
"restore_complete": "Vollständig wiederhergestellt",
|
||||
"restore_confirm_yunohost_installed": "Möchtest du die Wiederherstellung wirklich starten? [{answers:s}]",
|
||||
|
@ -145,7 +136,6 @@
|
|||
"user_update_failed": "Benutzer kann nicht aktualisiert werden",
|
||||
"user_updated": "Der Benutzer wurde aktualisiert",
|
||||
"yunohost_already_installed": "YunoHost ist bereits installiert",
|
||||
"yunohost_ca_creation_failed": "Zertifikatsstelle konnte nicht erstellt werden",
|
||||
"yunohost_configured": "YunoHost wurde konfiguriert",
|
||||
"yunohost_installing": "YunoHost wird installiert…",
|
||||
"yunohost_not_installed": "YunoHost ist nicht oder unvollständig installiert worden. Bitte 'yunohost tools postinstall' ausführen",
|
||||
|
@ -163,15 +153,12 @@
|
|||
"dyndns_no_domain_registered": "Keine Domain mit DynDNS registriert",
|
||||
"ldap_init_failed_to_create_admin": "Die LDAP-Initialisierung konnte keinen admin-Benutzer erstellen",
|
||||
"mailbox_used_space_dovecot_down": "Der Dovecot Mailbox Dienst muss gestartet sein, wenn du den von der Mailbox belegten Speicher angezeigen lassen willst",
|
||||
"package_unknown": "Unbekanntes Paket '{pkgname}'",
|
||||
"certmanager_attempt_to_replace_valid_cert": "Du versuchst gerade eine richtiges und gültiges Zertifikat der Domain {domain:s} zu überschreiben! (Benutze --force , um diese Nachricht zu umgehen)",
|
||||
"certmanager_domain_unknown": "Unbekannte Domain '{domain:s}'",
|
||||
"certmanager_domain_cert_not_selfsigned": "Das Zertifikat der Domain {domain:s} ist kein selbstsigniertes Zertifikat. Sind Sie sich sicher, dass Sie es ersetzen wollen? (Benutzen Sie dafür '--force')",
|
||||
"certmanager_certificate_fetching_or_enabling_failed": "Die Aktivierung des neuen Zertifikats für die {domain:s} ist fehlgeschlagen...",
|
||||
"certmanager_attempt_to_renew_nonLE_cert": "Das Zertifikat der Domain '{domain:s}' wurde nicht von Let's Encrypt ausgestellt. Es kann nicht automatisch erneuert werden!",
|
||||
"certmanager_attempt_to_renew_valid_cert": "Das Zertifikat der Domain {domain:s} läuft nicht in Kürze ab! (Benutze --force um diese Nachricht zu umgehen)",
|
||||
"certmanager_domain_http_not_working": "Es scheint so, dass die Domain {domain:s} nicht über HTTP erreicht werden kann. Bitte überprüfe, ob deine DNS und nginx Konfiguration in Ordnung ist. (Wenn du weißt was du tust, nutze \"--no-checks\" um die überprüfung zu überspringen.)",
|
||||
"certmanager_error_no_A_record": "Kein DNS 'A' Eintrag für die Domain {domain:s} gefunden. Dein Domainname muss auf diese Maschine weitergeleitet werden, um ein Let's Encrypt Zertifikat installieren zu können! (Wenn du weißt was du tust, kannst du --no-checks benutzen, um diese Überprüfung zu überspringen. )",
|
||||
"certmanager_domain_dns_ip_differs_from_public_ip": "Der DNS-A-Eintrag der Domain {domain:s} unterscheidet sich von dieser Server-IP. Für weitere Informationen überprüfen Sie bitte die 'DNS records' (basic) Kategorie in der Diagnose. Wenn Sie gerade Ihren A-Eintrag verändert haben, warten Sie bitte etwas, damit die Änderungen wirksam werden (Sie können die DNS-Propagation mittels Website überprüfen) (Wenn Sie wissen was Sie tun, können Sie --no-checks benutzen, um diese Überprüfung zu überspringen.)",
|
||||
"certmanager_cannot_read_cert": "Es ist ein Fehler aufgetreten, als es versucht wurde das aktuelle Zertifikat für die Domain {domain:s} zu öffnen (Datei: {file:s}), Grund: {reason:s}",
|
||||
"certmanager_cert_install_success_selfsigned": "Ein selbstsigniertes Zertifikat für die Domain {domain:s} wurde erfolgreich installiert",
|
||||
|
@ -180,15 +167,11 @@
|
|||
"certmanager_hit_rate_limit": "Es wurden innerhalb kurzer Zeit zu viele Zertifikate für dieselbe Domain {domain:s} ausgestellt. Bitte versuchen Sie es später nochmal. Besuchen Sie https://letsencrypt.org/docs/rate-limits/ für mehr Informationen",
|
||||
"certmanager_cert_signing_failed": "Das neue Zertifikat konnte nicht signiert werden",
|
||||
"certmanager_no_cert_file": "Die Zertifikatsdatei für die Domain {domain:s} (Datei: {file:s}) konnte nicht gelesen werden",
|
||||
"certmanager_conflicting_nginx_file": "Die Domain konnte nicht für die ACME challenge vorbereitet werden: Die nginx Konfigurationsdatei {filepath:s} verursacht Probleme und sollte vorher entfernt werden",
|
||||
"domain_cannot_remove_main": "Die primäre Domain konnten nicht entfernt werden. Lege zuerst einen neue primäre Domain Sie können die Domäne '{domain:s}' nicht entfernen, weil Sie die Hauptdomäne ist. Sie müssen zuerst eine andere Domäne als Hauptdomäne festlegen. Sie können das mit dem Befehl <cmd>'yunohost domain main-domain -n <another-domain></cmd> tun. Hier ist eine Liste der möglichen Domänen: {other_domains:s}",
|
||||
"certmanager_self_ca_conf_file_not_found": "Die Konfigurationsdatei der Zertifizierungsstelle für selbstsignierte Zertifikate wurde nicht gefunden (Datei {file:s})",
|
||||
"certmanager_acme_not_configured_for_domain": "Die ACME Challenge kann im Moment nicht für {domain} ausgeführt werden, weil in ihrer nginx conf das entsprechende Code-Snippet fehlt... Bitte stellen Sie sicher, dass Ihre nginx-Konfiguration mit 'yunohost tools regen-conf nginx --dry-run --with-diff' auf dem neuesten Stand ist.",
|
||||
"certmanager_unable_to_parse_self_CA_name": "Der Name der Zertifizierungsstelle für selbstsignierte Zertifikate konnte nicht aufgelöst werden (Datei: {file:s})",
|
||||
"certmanager_http_check_timeout": "Eine Zeitüberschreitung ist aufgetreten, als der Server versuchte sich selbst über HTTP mit der öffentlichen IP (Domain '{domain:s}' mit der IP '{ip:s}') zu erreichen. Möglicherweise ist dafür hairpinning oder eine falsch konfigurierte Firewall/Router deines Servers dafür verantwortlich.",
|
||||
"certmanager_couldnt_fetch_intermediate_cert": "Eine Zeitüberschreitung ist aufgetreten als der Server versuchte die Teilzertifikate von Let's Encrypt zusammenzusetzen. Die Installation/Erneuerung des Zertifikats wurde abgebrochen — bitte versuche es später erneut.",
|
||||
"domain_hostname_failed": "Sie können keinen neuen Hostnamen verwenden. Das kann zukünftige Probleme verursachen (es kann auch sein, dass es funktioniert).",
|
||||
"yunohost_ca_creation_success": "Die lokale Zertifizierungs-Authorität wurde angelegt.",
|
||||
"app_already_installed_cant_change_url": "Diese Application ist bereits installiert. Die URL kann durch diese Funktion nicht modifiziert werden. Überprüfe ob `app changeurl` verfügbar ist.",
|
||||
"app_change_url_failed_nginx_reload": "NGINX konnte nicht neu gestartet werden. Hier ist der Output von 'nginx -t':\n{nginx_errors:s}",
|
||||
"app_change_url_identical_domains": "Die alte und neue domain/url_path sind identisch: ('{domain:s} {path:s}'). Es gibt nichts zu tun.",
|
||||
|
@ -202,7 +185,6 @@
|
|||
"backup_archive_system_part_not_available": "Der System-Teil '{part:s}' ist in diesem Backup nicht enthalten",
|
||||
"backup_archive_writing_error": "Die Dateien '{source:s} (im Ordner '{dest:s}') konnten nicht in das komprimierte Archiv-Backup '{archive:s}' hinzugefügt werden",
|
||||
"app_change_url_success": "{app:s} URL ist nun {domain:s}{path:s}",
|
||||
"backup_applying_method_borg": "Sende alle Dateien zur Sicherung ins borg-backup repository...",
|
||||
"global_settings_bad_type_for_setting": "Falscher Typ der Einstellung {setting:s}. Empfangen: {received_type:s}, aber erwarteter Typ: {expected_type:s}",
|
||||
"global_settings_bad_choice_for_enum": "Wert des Einstellungsparameters {setting:s} ungültig. Der Wert den Sie eingegeben haben: '{choice:s}', die gültigen Werte für diese Einstellung: {available_choices:s}",
|
||||
"file_does_not_exist": "Die Datei {path: s} existiert nicht.",
|
||||
|
@ -225,12 +207,10 @@
|
|||
"backup_method_tar_finished": "Tar-Backup-Archiv erstellt",
|
||||
"backup_method_custom_finished": "Benutzerdefinierte Sicherungsmethode '{method:s}' beendet",
|
||||
"backup_method_copy_finished": "Sicherungskopie beendet",
|
||||
"backup_method_borg_finished": "Backup in Borg beendet",
|
||||
"backup_custom_mount_error": "Bei der benutzerdefinierten Sicherungsmethode ist beim Arbeitsschritt \"Einhängen/Verbinden\" ein Fehler aufgetreten",
|
||||
"backup_custom_backup_error": "Bei der benutzerdefinierten Sicherungsmethode ist beim Arbeitsschritt \"Sicherung\" ein Fehler aufgetreten",
|
||||
"backup_csv_creation_failed": "Die zur Wiederherstellung erforderliche CSV-Datei kann nicht erstellt werden",
|
||||
"backup_couldnt_bind": "{src:s} konnte nicht an {dest:s} angebunden werden.",
|
||||
"backup_borg_not_implemented": "Die Borg-Sicherungsmethode ist noch nicht implementiert",
|
||||
"backup_ask_for_copying_if_needed": "Möchten Sie die Sicherung mit {size:s}MB temporär durchführen? (Dieser Weg wird verwendet, da einige Dateien nicht mit einer effizienteren Methode vorbereitet werden konnten.)",
|
||||
"backup_actually_backuping": "Erstellt ein Backup-Archiv aus den gesammelten Dateien...",
|
||||
"ask_new_path": "Neuer Pfad",
|
||||
|
@ -263,19 +243,14 @@
|
|||
"log_does_exists": "Es gibt kein Operationsprotokoll mit dem Namen'{log}', verwende 'yunohost log list', um alle verfügbaren Operationsprotokolle anzuzeigen",
|
||||
"log_operation_unit_unclosed_properly": "Die Operationseinheit wurde nicht richtig geschlossen",
|
||||
"global_settings_setting_security_postfix_compatibility": "Kompatibilität vs. Sicherheitskompromiss für den Postfix-Server. Beeinflusst die Chiffren (und andere sicherheitsrelevante Aspekte)",
|
||||
"log_category_404": "Die Log-Kategorie '{category}' existiert nicht",
|
||||
"global_settings_unknown_type": "Unerwartete Situation, die Einstellung {setting:s} scheint den Typ {unknown_type:s} zu haben, ist aber kein vom System unterstützter Typ.",
|
||||
"dpkg_is_broken": "Du kannst das gerade nicht tun, weil dpkg/APT (der Systempaketmanager) in einem defekten Zustand zu sein scheint.... Du kannst versuchen, dieses Problem zu lösen, indem du dich über SSH verbindest und `sudo apt install --fix-broken` sowie/oder `sudo dpkg --configure -a` ausführst.",
|
||||
"global_settings_unknown_setting_from_settings_file": "Unbekannter Schlüssel in den Einstellungen: '{setting_key:s}', verwerfen und speichern in /etc/yunohost/settings-unknown.json",
|
||||
"log_link_to_log": "Vollständiges Log dieser Operation: '<a href=\"#/tools/logs/{name}\" style=\"text-decoration:underline\">{desc}</a>'",
|
||||
"global_settings_setting_example_bool": "Beispiel einer booleschen Option",
|
||||
"log_help_to_get_log": "Um das Protokoll der Operation '{desc}' anzuzeigen, verwende den Befehl 'yunohost log show {name}{name}'",
|
||||
"global_settings_setting_security_nginx_compatibility": "Kompatibilität vs. Sicherheitskompromiss für den Webserver NGINX. Beeinflusst die Chiffren (und andere sicherheitsrelevante Aspekte)",
|
||||
"backup_php5_to_php7_migration_may_fail": "Dein Archiv konnte nicht für PHP 7 konvertiert werden, Du kannst deine PHP-Anwendungen möglicherweise nicht wiederherstellen (Grund: {error:s})",
|
||||
"global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Erlaubt die Verwendung eines (veralteten) DSA-Hostkeys für die SSH-Daemon-Konfiguration",
|
||||
"global_settings_setting_example_string": "Beispiel einer string Option",
|
||||
"log_app_remove": "Entferne die Applikation '{}'",
|
||||
"global_settings_setting_example_int": "Beispiel einer int Option",
|
||||
"global_settings_cant_open_settings": "Einstellungsdatei konnte nicht geöffnet werden, Grund: {reason:s}",
|
||||
"global_settings_cant_write_settings": "Einstellungsdatei konnte nicht gespeichert werden, Grund: {reason:s}",
|
||||
"log_app_install": "Installiere die Applikation '{}'",
|
||||
|
@ -289,7 +264,6 @@
|
|||
"log_app_change_url": "Ändere die URL der Applikation '{}'",
|
||||
"global_settings_setting_security_password_user_strength": "Stärke des Benutzerpassworts",
|
||||
"good_practices_about_user_password": "Sie sind dabei, ein neues Benutzerpasswort zu definieren. Das Passwort sollte mindestens 8 Zeichen lang sein, obwohl es ratsam ist, ein längeres Passwort (z.B. eine Passphrase) und/oder eine Variation von Zeichen (Groß- und Kleinschreibung, Ziffern und Sonderzeichen) zu verwenden.",
|
||||
"global_settings_setting_example_enum": "Beispiel einer enum Option",
|
||||
"log_link_to_failed_log": "Der Vorgang konnte nicht abgeschlossen werden '{desc}'. Bitte gib das vollständige Protokoll dieser Operation mit <a href=\"#/tools/logs/{name}\">Klicken Sie hier</a> an, um Hilfe zu erhalten",
|
||||
"backup_cant_mount_uncompress_archive": "Das unkomprimierte Archiv konnte nicht als schreibgeschützt gemountet werden",
|
||||
"backup_csv_addition_failed": "Es konnten keine Dateien zur Sicherung in die CSV-Datei hinzugefügt werden",
|
||||
|
@ -307,14 +281,12 @@
|
|||
"diagnosis_basesystem_ynh_single_version": "{package} Version: {version} ({repo})",
|
||||
"diagnosis_basesystem_ynh_main_version": "Server läuft YunoHost {main_version} ({repo})",
|
||||
"diagnosis_basesystem_ynh_inconsistent_versions": "Sie verwenden inkonsistente Versionen der YunoHost-Pakete... wahrscheinlich wegen eines fehlgeschlagenen oder teilweisen Upgrades.",
|
||||
"diagnosis_display_tip_web": "Sie können den Abschnitt Diagnose (im Startbildschirm) aufrufen, um die gefundenen Probleme anzuzeigen.",
|
||||
"apps_catalog_init_success": "App-Katalogsystem initialisiert!",
|
||||
"apps_catalog_updating": "Aktualisierung des Applikationskatalogs…",
|
||||
"apps_catalog_failed_to_download": "Der {apps_catalog} App-Katalog kann nicht heruntergeladen werden: {error}",
|
||||
"apps_catalog_obsolete_cache": "Der Cache des App-Katalogs ist leer oder veraltet.",
|
||||
"apps_catalog_update_success": "Der Apps-Katalog wurde aktualisiert!",
|
||||
"password_too_simple_1": "Das Passwort muss mindestens 8 Zeichen lang sein",
|
||||
"diagnosis_display_tip_cli": "Sie können 'yunohost diagnosis show --issues --human-readable' ausführen, um die gefundenen Probleme anzuzeigen.",
|
||||
"diagnosis_everything_ok": "Alles schaut gut aus für {category}!",
|
||||
"diagnosis_failed": "Kann Diagnose-Ergebnis für die Kategorie '{category}' nicht abrufen: {error}",
|
||||
"diagnosis_ip_connected_ipv4": "Der Server ist mit dem Internet über IPv4 verbunden!",
|
||||
|
@ -333,7 +305,6 @@
|
|||
"diagnosis_dns_good_conf": "Die DNS-Einträge für die Domäne {domain} (Kategorie {category}) sind korrekt konfiguriert",
|
||||
"diagnosis_ignored_issues": "(+ {nb_ignored} ignorierte(s) Problem(e))",
|
||||
"diagnosis_basesystem_hardware": "Server Hardware Architektur ist {virt} {arch}",
|
||||
"diagnosis_basesystem_hardware_board": "Server Platinen Modell ist {model}",
|
||||
"diagnosis_found_errors": "Habe {errors} erhebliche(s) Problem(e) in Verbindung mit {category} gefunden!",
|
||||
"diagnosis_found_warnings": "Habe {warnings} Ding(e) gefunden, die verbessert werden könnten für {category}.",
|
||||
"diagnosis_ip_dnsresolution_working": "Domänen-Namens-Auflösung funktioniert!",
|
||||
|
@ -345,12 +316,6 @@
|
|||
"certmanager_domain_not_diagnosed_yet": "Für {domain} gibt es noch keine Diagnose-Resultate. Bitte wiederholen Sie die Diagnose für die Kategorien 'DNS records' und 'Web' im Diagnose-Bereich um zu überprüfen ob die Domain für Let's Encrypt bereit ist. (Oder wenn Sie wissen was Sie tun, verwenden Sie '--no-checks' um diese Überprüfungen abzuschalten.",
|
||||
"migration_0015_patching_sources_list": "sources.lists wird repariert...",
|
||||
"migration_0015_start": "Start der Migration auf Buster",
|
||||
"migration_0011_failed_to_remove_stale_object": "Abgelaufenes Objekt konne nicht entfernt werden. {dn}: {error}",
|
||||
"migration_0011_update_LDAP_schema": "Das LDAP-Schema aktualisieren...",
|
||||
"migration_0011_update_LDAP_database": "Die LDAP-Datenbank aktualisieren...",
|
||||
"migration_0011_migrate_permission": "Berechtigungen der Applikationen von den Einstellungen zu LDAP migrieren...",
|
||||
"migration_0011_LDAP_update_failed": "LDAP konnte nicht aktualisiert werden. Fehler:n{error:s}",
|
||||
"migration_0011_create_group": "Eine Gruppe für jeden Benutzer erstellen…",
|
||||
"migration_description_0015_migrate_to_buster": "Auf Debian Buster und YunoHost 4.x upgraden",
|
||||
"mail_unavailable": "Diese E-Mail Adresse ist reserviert und wird dem ersten Benutzer automatisch zugewiesen",
|
||||
"diagnosis_services_conf_broken": "Die Konfiguration für den Dienst {service} ist fehlerhaft!",
|
||||
|
@ -621,4 +586,4 @@
|
|||
"regenconf_need_to_explicitly_specify_ssh": "Die SSH-Konfiguration wurde manuell modifiziert, aber Sie müssen explizit die Kategorie 'SSH' mit --force spezifizieren, um die Änderungen tatsächlich anzuwenden.",
|
||||
"migration_update_LDAP_schema": "Aktualisiere das LDAP-Schema...",
|
||||
"log_backup_create": "Erstelle ein Backup-Archiv"
|
||||
}
|
||||
}
|
|
@ -1,3 +1,3 @@
|
|||
{
|
||||
"password_too_simple_1": "Ο κωδικός πρόσβασης πρέπει να έχει τουλάχιστον 8 χαρακτήρες"
|
||||
}
|
||||
}
|
|
@ -95,6 +95,7 @@
|
|||
"backup_copying_to_organize_the_archive": "Copying {size:s}MB to organize the archive",
|
||||
"backup_couldnt_bind": "Could not bind {src:s} to {dest:s}.",
|
||||
"backup_created": "Backup created",
|
||||
"backup_create_size_estimation": "The archive will contain about {size} of data.",
|
||||
"backup_creation_failed": "Could not create the backup archive",
|
||||
"backup_csv_addition_failed": "Could not add files to backup into the CSV file",
|
||||
"backup_csv_creation_failed": "Could not create the CSV file needed for restoration",
|
||||
|
@ -269,6 +270,9 @@
|
|||
"diagnosis_unknown_categories": "The following categories are unknown: {categories}",
|
||||
"diagnosis_never_ran_yet": "It looks like this server was setup recently and there's no diagnosis report to show yet. You should start by running a full diagnosis, either from the webadmin or using 'yunohost diagnosis run' from the command line.",
|
||||
"diagnosis_processes_killed_by_oom_reaper": "Some processes were recently killed by the system because it ran out of memory. This is typically symptomatic of a lack of memory on the system or of a process that ate up to much memory. Summary of the processes killed:\n{kills_summary}",
|
||||
"diagnosis_sshd_config_insecure": "The SSH configuration appears to have been manually modified, and is insecure because it contains no 'AllowGroups' or 'AllowUsers' directive to limit access to authorized users.",
|
||||
"diagnosis_sshd_config_inconsistent": "It looks like the SSH port was manually modified in /etc/ssh/sshd_config. Since Yunohost 4.2, a new global setting 'security.ssh.port' is available to avoid manually editing the configuration.",
|
||||
"diagnosis_sshd_config_inconsistent_details": "Please run <cmd>yunohost settings set security.ssh.port -v YOUR_SSH_PORT</cmd> to define the SSH port, and check <cmd>yunohost tools regen-conf ssh --dry-run --with-diff</cmd> and <cmd>yunohost tools regen-conf ssh --force</cmd> to reset your conf to the Yunohost recommendation.",
|
||||
"domain_cannot_remove_main": "You cannot remove '{domain:s}' since it's the main domain, you first need to set another domain as the main domain using 'yunohost domain main-domain -n <another-domain>'; here is the list of candidate domains: {other_domains:s}",
|
||||
"domain_cannot_add_xmpp_upload": "You cannot add domains starting with 'xmpp-upload.'. This kind of name is reserved for the XMPP upload feature integrated in YunoHost.",
|
||||
"domain_cannot_remove_main_add_new_one": "You cannot remove '{domain:s}' since it's the main domain and your only domain, you need to first add another domain using 'yunohost domain add <another-domain.com>', then set is as the main domain using 'yunohost domain main-domain -n <another-domain.com>' and then you can remove the domain '{domain:s}' using 'yunohost domain remove {domain:s}'.'",
|
||||
|
@ -323,6 +327,7 @@
|
|||
"global_settings_setting_security_password_user_strength": "User password strength",
|
||||
"global_settings_setting_security_ssh_compatibility": "Compatibility vs. security tradeoff for the SSH server. Affects the ciphers (and other security-related aspects)",
|
||||
"global_settings_setting_security_postfix_compatibility": "Compatibility vs. security tradeoff for the Postfix server. Affects the ciphers (and other security-related aspects)",
|
||||
"global_settings_setting_security_ssh_port": "SSH port",
|
||||
"global_settings_unknown_setting_from_settings_file": "Unknown key in settings: '{setting_key:s}', discard it and save it in /etc/yunohost/settings-unknown.json",
|
||||
"global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Allow the use of (deprecated) DSA hostkey for the SSH daemon configuration",
|
||||
"global_settings_setting_ssowat_panel_overlay_enabled": "Enable SSOwat panel overlay",
|
||||
|
@ -423,6 +428,11 @@
|
|||
"migration_description_0017_postgresql_9p6_to_11": "Migrate databases from PostgreSQL 9.6 to 11",
|
||||
"migration_description_0018_xtable_to_nftable": "Migrate old network traffic rules to the new nftable system",
|
||||
"migration_description_0019_extend_permissions_features": "Extend/rework the app permission management system",
|
||||
"migration_description_0020_ssh_sftp_permissions": "Add SSH and SFTP permissions support",
|
||||
"migration_ldap_backup_before_migration": "Creating a backup of LDAP database and apps settings prior to the actual migration.",
|
||||
"migration_ldap_can_not_backup_before_migration": "The backup of the system could not be completed before the migration failed. Error: {error:s}",
|
||||
"migration_ldap_migration_failed_trying_to_rollback": "Could not migrate... trying to roll back the system.",
|
||||
"migration_ldap_rollback_success": "System rolled back.",
|
||||
"migration_update_LDAP_schema": "Updating LDAP schema...",
|
||||
"migration_0015_start" : "Starting migration to Buster",
|
||||
"migration_0015_patching_sources_list": "Patching the sources.lists...",
|
||||
|
@ -444,10 +454,6 @@
|
|||
"migration_0018_failed_to_migrate_iptables_rules": "Failed to migrate legacy iptables rules to nftables: {error}",
|
||||
"migration_0018_failed_to_reset_legacy_rules": "Failed to reset legacy iptables rules: {error}",
|
||||
"migration_0019_add_new_attributes_in_ldap": "Add new attributes for permissions in LDAP database",
|
||||
"migration_0019_backup_before_migration": "Creating a backup of LDAP database and apps settings prior to the actual migration.",
|
||||
"migration_0019_can_not_backup_before_migration": "The backup of the system could not be completed before the migration failed. Error: {error:s}",
|
||||
"migration_0019_migration_failed_trying_to_rollback": "Could not migrate... trying to roll back the system.",
|
||||
"migration_0019_rollback_success": "System rolled back.",
|
||||
"migration_0019_slapd_config_will_be_overwritten": "It looks like you manually edited the slapd configuration. For this critical migration, YunoHost needs to force the update of the slapd configuration. The original files will be backuped in {conf_backup_folder}.",
|
||||
"migrations_already_ran": "Those migrations are already done: {ids}",
|
||||
"migrations_cant_reach_migration_file": "Could not access migrations files at the path '%s'",
|
||||
|
@ -496,6 +502,7 @@
|
|||
"permission_created": "Permission '{permission:s}' created",
|
||||
"permission_creation_failed": "Could not create permission '{permission}': {error}",
|
||||
"permission_currently_allowed_for_all_users": "This permission is currently granted to all users in addition to other groups. You probably want to either remove the 'all_users' permission or remove the other groups it is currently granted to.",
|
||||
"permission_cant_add_to_all_users": "The permission {permission} can not be added to all users.",
|
||||
"permission_deleted": "Permission '{permission:s}' deleted",
|
||||
"permission_deletion_failed": "Could not delete permission '{permission}': {error}",
|
||||
"permission_not_found": "Permission '{permission:s}' not found",
|
||||
|
|
|
@ -10,16 +10,11 @@
|
|||
"app_id_invalid": "Nevalida apo ID",
|
||||
"app_install_files_invalid": "Ĉi tiuj dosieroj ne povas esti instalitaj",
|
||||
"user_updated": "Uzantinformoj ŝanĝis",
|
||||
"users_available": "Uzantoj disponeblaj :",
|
||||
"yunohost_already_installed": "YunoHost estas jam instalita",
|
||||
"yunohost_ca_creation_failed": "Ne povis krei atestan aŭtoritaton",
|
||||
"yunohost_ca_creation_success": "Loka atestila aŭtoritato kreiĝis.",
|
||||
"yunohost_installing": "Instalante YunoHost…",
|
||||
"service_description_metronome": "Mastrumas XMPP tujmesaĝilon kontojn",
|
||||
"service_description_mysql": "Butikigas datumojn de programoj (SQL datumbazo)",
|
||||
"service_description_nginx": "Servas aŭ permesas atingi ĉiujn retejojn gastigita sur via servilo",
|
||||
"service_description_nslcd": "Mastrumas Yunohost uzantojn konektojn per komanda linio",
|
||||
"service_description_php7.0-fpm": "Ekzekutas programojn skribitajn en PHP kun NGINX",
|
||||
"service_description_postfix": "Uzita por sendi kaj ricevi retpoŝtojn",
|
||||
"service_description_redis-server": "Specialita datumbazo uzita por rapida datumo atingo, atendovicoj kaj komunikadoj inter programoj",
|
||||
"service_description_rspamd": "Filtras trudmesaĝojn, kaj aliaj funkcioj rilate al retpoŝto",
|
||||
|
@ -42,11 +37,9 @@
|
|||
"backup_archive_system_part_not_available": "Sistemo parto '{part:s}' ne haveblas en ĉi tiu rezervo",
|
||||
"backup_abstract_method": "Ĉi tiu rezerva metodo ankoraŭ efektiviĝis",
|
||||
"apps_already_up_to_date": "Ĉiuj aplikoj estas jam ĝisdatigitaj",
|
||||
"backup_borg_not_implemented": "La kopia metodo de Borg ankoraŭ ne estas efektivigita",
|
||||
"app_location_unavailable": "Ĉi tiu URL aŭ ne haveblas, aŭ konfliktas kun la jam instalita (j) apliko (j):\n{apps:s}",
|
||||
"backup_archive_app_not_found": "Ne povis trovi la programon '{app:s}' en la rezerva ar archiveivo",
|
||||
"backup_actually_backuping": "Krei rezervan ar archiveivon el la kolektitaj dosieroj …",
|
||||
"backup_method_borg_finished": "Sekurkopio en Borg finiĝis",
|
||||
"app_change_url_no_script": "La app '{app_name:s}' ankoraŭ ne subtenas URL-modifon. Eble vi devus altgradigi ĝin.",
|
||||
"app_start_install": "Instali la programon '{app}' …",
|
||||
"backup_created": "Sekurkopio kreita",
|
||||
|
@ -61,7 +54,6 @@
|
|||
"app_upgrade_app_name": "Nun ĝisdatiganta {app} …",
|
||||
"app_manifest_invalid": "Io misas pri la aplika manifesto: {error}",
|
||||
"backup_cleaning_failed": "Ne povis purigi la provizoran rezervan dosierujon",
|
||||
"backup_invalid_archive": "Ĉi tio ne estas rezerva ar archiveivo",
|
||||
"backup_creation_failed": "Ne povis krei la rezervan ar archiveivon",
|
||||
"backup_hook_unknown": "La rezerva hoko '{hook:s}' estas nekonata",
|
||||
"backup_custom_backup_error": "Propra rezerva metodo ne povis preterpasi la paŝon \"sekurkopio\"",
|
||||
|
@ -92,7 +84,6 @@
|
|||
"app_start_remove": "Forigo de la apliko '{app}' …",
|
||||
"backup_output_directory_not_empty": "Vi devas elekti malplenan eligitan dosierujon",
|
||||
"backup_archive_writing_error": "Ne povis aldoni la dosierojn '{source:s}' (nomitaj en la ar theivo '{dest:s}') por esti rezervitaj en la kunpremita arkivo '{archive:s}'",
|
||||
"ask_email": "Retpoŝta adreso",
|
||||
"app_start_restore": "Restarigi la programon '{app}' …",
|
||||
"backup_applying_method_copy": "Kopiante ĉiujn dosierojn al sekurkopio …",
|
||||
"backup_couldnt_bind": "Ne povis ligi {src:s} al {dest:s}.",
|
||||
|
@ -103,7 +94,6 @@
|
|||
"backup_mount_archive_for_restore": "Preparante arkivon por restarigo …",
|
||||
"backup_csv_creation_failed": "Ne povis krei la CSV-dosieron bezonatan por restarigo",
|
||||
"backup_archive_name_unknown": "Nekonata loka rezerva ar archiveivo nomata '{name:s}'",
|
||||
"backup_applying_method_borg": "Sendado de ĉiuj dosieroj al sekurkopio en borg-rezerva deponejo …",
|
||||
"app_sources_fetch_failed": "Ne povis akiri fontajn dosierojn, ĉu la URL estas ĝusta?",
|
||||
"ask_new_domain": "Nova domajno",
|
||||
"app_unknown": "Nekonata apliko",
|
||||
|
@ -113,41 +103,27 @@
|
|||
"backup_deleted": "Rezerva forigita",
|
||||
"backup_csv_addition_failed": "Ne povis aldoni dosierojn al sekurkopio en la CSV-dosiero",
|
||||
"dpkg_lock_not_available": "Ĉi tiu komando ne povas funkcii nun ĉar alia programo uzas la seruron de dpkg (la administrilo de paka sistemo)",
|
||||
"migration_0003_yunohost_upgrade": "Komencante la ĝisdatigon de la pakaĵo YunoHost ... La migrado finiĝos, sed la efektiva ĝisdatigo okazos tuj poste. Post kiam la operacio finiĝos, vi eble devos ensaluti al la retpaĝo.",
|
||||
"domain_dyndns_root_unknown": "Nekonata radika domajno DynDNS",
|
||||
"field_invalid": "Nevalida kampo '{:s}'",
|
||||
"log_app_makedefault": "Faru '{}' la defaŭlta apliko",
|
||||
"migration_0003_still_on_jessie_after_main_upgrade": "Io okazis malbone dum la ĉefa ĝisdatigo: Ĉu la sistemo ankoraŭ estas en Jessie‽ Por esplori la aferon, bonvolu rigardi {log}:s …",
|
||||
"migration_0011_can_not_backup_before_migration": "La sekurkopio de la sistemo ne povis finiĝi antaŭ ol la migrado malsukcesis. Eraro: {error:s}",
|
||||
"migration_0011_create_group": "Krei grupon por ĉiu uzanto…",
|
||||
"backup_system_part_failed": "Ne eblis sekurkopi la sistemon de '{part:s}'",
|
||||
"global_settings_setting_security_postfix_compatibility": "Kongruo vs sekureca kompromiso por la Postfix-servilo. Afektas la ĉifradojn (kaj aliajn aspektojn pri sekureco)",
|
||||
"group_unknown": "La grupo '{group:s}' estas nekonata",
|
||||
"mailbox_disabled": "Retpoŝto malŝaltita por uzanto {user:s}",
|
||||
"migration_description_0011_setup_group_permission": "Agordu uzantajn grupojn kaj permesojn por programoj kaj servoj",
|
||||
"migration_0011_backup_before_migration": "Krei sekurkopion de LDAP-datumbazo kaj agordojn antaŭ la efektiva migrado.",
|
||||
"migration_0011_migrate_permission": "Migrado de permesoj de agordoj al aplikoj al LDAP…",
|
||||
"migration_0011_migration_failed_trying_to_rollback": "Ne povis migri ... provante redakti la sistemon.",
|
||||
"migrations_dependencies_not_satisfied": "Rulu ĉi tiujn migradojn: '{dependencies_id}', antaŭ migrado {id}.",
|
||||
"migrations_failed_to_load_migration": "Ne povis ŝarĝi migradon {id}: {error}",
|
||||
"migrations_exclusive_options": "'--auto', '--skip' kaj '--force-rerun' estas reciproke ekskluzivaj ebloj.",
|
||||
"migrations_must_provide_explicit_targets": "Vi devas provizi eksplicitajn celojn kiam vi uzas '--skip' aŭ '--force-rerun'",
|
||||
"permission_update_failed": "Ne povis ĝisdatigi permeson '{permission}': {error}",
|
||||
"permission_updated": "Ĝisdatigita \"{permission:s}\" rajtigita",
|
||||
"permission_update_nothing_to_do": "Neniuj permesoj ĝisdatigi",
|
||||
"tools_upgrade_cant_hold_critical_packages": "Ne povis teni kritikajn pakojn…",
|
||||
"upnp_dev_not_found": "Neniu UPnP-aparato trovita",
|
||||
"migration_description_0012_postgresql_password_to_md5_authentication": "Devigu PostgreSQL-aŭtentigon uzi MD5 por lokaj ligoj",
|
||||
"migration_0011_done": "Migrado finiĝis. Vi nun kapablas administri uzantajn grupojn.",
|
||||
"migration_0011_LDAP_update_failed": "Ne povis ĝisdatigi LDAP. Eraro: {error:s}",
|
||||
"pattern_password": "Devas esti almenaŭ 3 signoj longaj",
|
||||
"root_password_desynchronized": "La pasvorta administranto estis ŝanĝita, sed YunoHost ne povis propagandi ĉi tion al la radika pasvorto!",
|
||||
"service_remove_failed": "Ne povis forigi la servon '{service:s}'",
|
||||
"migration_0003_fail2ban_upgrade": "Komenci la ĝisdatigon Fail2Ban…",
|
||||
"backup_permission": "Rezerva permeso por app {app:s}",
|
||||
"log_user_group_delete": "Forigi grupon '{}'",
|
||||
"log_user_group_update": "Ĝisdatigi grupon '{}'",
|
||||
"migration_0005_postgresql_94_not_installed": "PostgreSQL ne estis instalita en via sistemo. Nenio por fari.",
|
||||
"dyndns_provider_unreachable": "Ne povas atingi la provizanton DynDNS {provider}: ĉu via YunoHost ne estas ĝuste konektita al la interreto aŭ la dyneta servilo malŝaltiĝas.",
|
||||
"good_practices_about_user_password": "Vi nun estas por difini novan uzantan pasvorton. La pasvorto devas esti almenaŭ 8 signojn - kvankam estas bone praktiki uzi pli longan pasvorton (t.e. pasfrazon) kaj/aŭ variaĵon de signoj (majuskloj, minuskloj, ciferoj kaj specialaj signoj).",
|
||||
"group_updated": "Ĝisdatigita \"{group}\" grupo",
|
||||
|
@ -158,17 +134,12 @@
|
|||
"group_user_already_in_group": "Uzanto {user} jam estas en grupo {group}",
|
||||
"group_user_not_in_group": "Uzanto {user} ne estas en grupo {group}",
|
||||
"installation_complete": "Kompleta instalado",
|
||||
"log_category_404": "La loga kategorio '{category}' ne ekzistas",
|
||||
"log_permission_create": "Krei permeson '{}'",
|
||||
"log_permission_delete": "Forigi permeson '{}'",
|
||||
"log_user_group_create": "Krei grupon '{}'",
|
||||
"log_user_permission_update": "Mise à jour des accès pour la permission '{}'",
|
||||
"log_user_permission_reset": "Restarigi permeson '{}'",
|
||||
"mail_forward_remove_failed": "Ne povis forigi retpoŝton plusendante '{mail:s}'",
|
||||
"migration_0011_rollback_success": "Sistemo ruliĝis reen.",
|
||||
"migration_0011_update_LDAP_database": "Ĝisdatigante LDAP-datumbazon…",
|
||||
"migration_0011_update_LDAP_schema": "Ĝisdatigante LDAP-skemon…",
|
||||
"migration_0011_failed_to_remove_stale_object": "Ne povis forigi neuzatan objekton {dn}: {error}",
|
||||
"migrations_already_ran": "Tiuj migradoj estas jam faritaj: {ids}",
|
||||
"migrations_no_such_migration": "Estas neniu migrado nomata '{id}'",
|
||||
"permission_already_allowed": "Grupo '{group}' jam havas rajtigitan permeson '{permission}'",
|
||||
|
@ -195,7 +166,6 @@
|
|||
"migrations_not_pending_cant_skip": "Tiuj migradoj ankoraŭ ne estas pritraktataj, do ne eblas preterlasi: {ids}",
|
||||
"permission_already_exist": "Permesita '{permission}' jam ekzistas",
|
||||
"domain_created": "Domajno kreita",
|
||||
"migrate_tsig_wait_2": "2 minutoj …",
|
||||
"log_user_create": "Aldonu uzanton '{}'",
|
||||
"ip6tables_unavailable": "Vi ne povas ludi kun ip6tabloj ĉi tie. Vi estas en ujo aŭ via kerno ne subtenas ĝin",
|
||||
"mail_unavailable": "Ĉi tiu retpoŝta adreso estas rezervita kaj aŭtomate estos atribuita al la unua uzanto",
|
||||
|
@ -207,8 +177,6 @@
|
|||
"certmanager_cert_install_success_selfsigned": "Mem-subskribita atestilo nun instalita por la domajno '{domain:s}'",
|
||||
"global_settings_unknown_setting_from_settings_file": "Nekonata ŝlosilo en agordoj: '{setting_key:s}', forĵetu ĝin kaj konservu ĝin en /etc/yunohost/settings-unknown.json",
|
||||
"regenconf_file_backed_up": "Agordodosiero '{conf}' estis rezervita al '{backup}'",
|
||||
"migration_0007_cannot_restart": "SSH ne rekomencas post provi nuligi la migradan numeron 6.",
|
||||
"migration_description_0006_sync_admin_and_root_passwords": "Sinkronigu admin kaj radikajn pasvortojn",
|
||||
"iptables_unavailable": "Vi ne povas ludi kun iptables ĉi tie. Vi estas en ujo aŭ via kerno ne subtenas ĝin",
|
||||
"global_settings_cant_write_settings": "Ne eblis konservi agordojn, tial: {reason:s}",
|
||||
"service_added": "La servo '{service:s}' estis aldonita",
|
||||
|
@ -216,14 +184,11 @@
|
|||
"service_started": "Servo '{service:s}' komenciĝis",
|
||||
"port_already_opened": "Haveno {port:d} estas jam malfermita por {ip_version:s} rilatoj",
|
||||
"installation_failed": "Io okazis malbone kun la instalado",
|
||||
"migrate_tsig_wait_3": "1 minuto …",
|
||||
"certmanager_conflicting_nginx_file": "Ne povis prepari domajnon por ACME-defio: la agordo de NGINX {filepath:s} konfliktas kaj unue devas esti forigita",
|
||||
"upgrading_packages": "Ĝisdatigi pakojn…",
|
||||
"custom_app_url_required": "Vi devas provizi URL por altgradigi vian kutimon app {app:s}",
|
||||
"service_reload_failed": "Ne povis reŝargi la servon '{service:s}'\n\nLastatempaj servaj protokoloj: {logs:s}",
|
||||
"packages_upgrade_failed": "Ne povis ĝisdatigi ĉiujn pakojn",
|
||||
"hook_json_return_error": "Ne povis legi revenon de hoko {path:s}. Eraro: {msg:s}. Kruda enhavo: {raw_content}",
|
||||
"dyndns_cron_removed": "DynDNS cron-laboro forigita",
|
||||
"dyndns_key_not_found": "DNS-ŝlosilo ne trovita por la domajno",
|
||||
"tools_upgrade_regular_packages_failed": "Ne povis ĝisdatigi pakojn: {packages_list}",
|
||||
"service_start_failed": "Ne povis komenci la servon '{service:s}'\n\nLastatempaj servaj protokoloj: {logs:s}",
|
||||
|
@ -231,51 +196,37 @@
|
|||
"system_upgraded": "Sistemo ĝisdatigita",
|
||||
"domain_deleted": "Domajno forigita",
|
||||
"certmanager_acme_not_configured_for_domain": "Atestilo por la domajno '{domain:s}' ne ŝajnas esti ĝuste instalita. Bonvolu ekzekuti 'cert-instali' por ĉi tiu regado unue.",
|
||||
"migration_description_0009_decouple_regenconf_from_services": "Malkonstruu la regen-konf-mekanismon de servoj",
|
||||
"user_update_failed": "Ne povis ĝisdatigi uzanton {user}: {error}",
|
||||
"migration_description_0008_ssh_conf_managed_by_yunohost_step2": "Lasu la SSH-agordon estu administrata de YunoHost (paŝo 2, manlibro)",
|
||||
"restore_confirm_yunohost_installed": "Ĉu vi vere volas restarigi jam instalitan sistemon? [{answers:s}]",
|
||||
"pattern_positive_number": "Devas esti pozitiva nombro",
|
||||
"certmanager_error_no_A_record": "Neniu DNS 'A' rekordo trovita por '{domain:s}'. Vi bezonas atentigi vian domajnan nomon al via maŝino por povi instali atestilon Lasu-Ĉifri. (Se vi scias, kion vi faras, uzu '--no-checks' por malŝalti tiujn ĉekojn.)",
|
||||
"update_apt_cache_failed": "Ne eblis ĝisdatigi la kaŝmemoron de APT (paka administranto de Debian). Jen rubujo de la sources.list-linioj, kiuj povus helpi identigi problemajn liniojn:\n{sourceslist}",
|
||||
"migrations_no_migrations_to_run": "Neniuj migradoj por funkcii",
|
||||
"executing_command": "Plenumanta komandon '{command:s}' …",
|
||||
"certmanager_attempt_to_renew_nonLE_cert": "La atestilo por la domajno '{domain:s}' ne estas elsendita de Let's Encrypt. Ne eblas renovigi ĝin aŭtomate!",
|
||||
"global_settings_setting_example_bool": "Ekzemplo bulea elekto",
|
||||
"domain_dyndns_already_subscribed": "Vi jam abonis DynDNS-domajnon",
|
||||
"log_letsencrypt_cert_renew": "Renovigu '{}' Let's Encrypt atestilon",
|
||||
"migrate_tsig_start": "Detektita ŝlosila algoritmo nesufiĉa por TSIG-subskribo de la domajno '{domain}', komencanta migradon al la pli sekura HMAC-SHA-512",
|
||||
"ldap_init_failed_to_create_admin": "LDAP-iniciato ne povis krei administran uzanton",
|
||||
"backup_output_directory_required": "Vi devas provizi elirejan dosierujon por la sekurkopio",
|
||||
"tools_upgrade_cant_unhold_critical_packages": "Ne povis malŝalti kritikajn pakojn…",
|
||||
"log_link_to_log": "Plena ŝtipo de ĉi tiu operacio: '<a href=\"#/tools/logs/{name}\" style=\"text-decoration:underline\">{desc} </a>'",
|
||||
"global_settings_cant_serialize_settings": "Ne eblis serialigi datumojn pri agordoj, motivo: {reason:s}",
|
||||
"backup_running_hooks": "Kurado de apogaj hokoj …",
|
||||
"certmanager_domain_unknown": "Nekonata domajno '{domain:s}'",
|
||||
"unexpected_error": "Io neatendita iris malbone: {error}",
|
||||
"password_listed": "Ĉi tiu pasvorto estas inter la plej uzataj pasvortoj en la mondo. Bonvolu elekti ion pli unikan.",
|
||||
"migration_description_0007_ssh_conf_managed_by_yunohost_step1": "Lasu la SSH-agordon estu administrata de YunoHost (paŝo 1, aŭtomata)",
|
||||
"migration_0009_not_needed": "Ĉi tiu migrado jam iel okazis ... (?) Saltado.",
|
||||
"ssowat_conf_generated": "SSOwat-agordo generita",
|
||||
"migrate_tsig_wait": "Atendante tri minutojn por ke la servilo DynDNS enkalkulu la novan ŝlosilon …",
|
||||
"log_remove_on_failed_restore": "Forigu '{}' post malsukcesa restarigo de rezerva ar archiveivo",
|
||||
"dpkg_is_broken": "Vi ne povas fari ĉi tion nun ĉar dpkg/APT (la administrantoj pri pakaĵaj sistemoj) ŝajnas esti rompita stato ... Vi povas provi solvi ĉi tiun problemon per konekto per SSH kaj funkcianta `sudo dpkg --configure -a`.",
|
||||
"certmanager_cert_signing_failed": "Ne povis subskribi la novan atestilon",
|
||||
"migration_description_0003_migrate_to_stretch": "Altgradigu la sistemon al Debian Stretch kaj YunoHost 3.0",
|
||||
"log_tools_upgrade": "Ĝisdatigu sistemajn pakaĵojn",
|
||||
"log_available_on_yunopaste": "Ĉi tiu protokolo nun haveblas per {url}",
|
||||
"certmanager_http_check_timeout": "Ekdifinita kiam servilo provis kontakti sin per HTTP per publika IP-adreso (domajno '{domain:s}' kun IP '{ip:s}'). Vi eble spertas haŭtoproblemon, aŭ la fajroŝirmilo / enkursigilo antaŭ via servilo miskonfiguras.",
|
||||
"pattern_port_or_range": "Devas esti valida haveno-nombro (t.e. 0-65535) aŭ gamo da havenoj (t.e. 100:200)",
|
||||
"migrations_loading_migration": "Ŝarĝante migradon {id}…",
|
||||
"pattern_mailbox_quota": "Devas esti grandeco kun la sufikso b/k/M/G/T aŭ 0 por ne havi kvoton",
|
||||
"migration_0008_general_disclaimer": "Por plibonigi la sekurecon de via servilo, rekomendas lasi YunoHost administri la SSH-agordon. Via nuna SSH-aranĝo diferencas de la rekomendo. Se vi lasas YunoHost agordi ĝin, la maniero per kiu vi konektas al via servilo per SSH ŝanĝiĝos tiel:",
|
||||
"user_deletion_failed": "Ne povis forigi uzanton {user}: {error}",
|
||||
"backup_with_no_backup_script_for_app": "La app '{app:s}' ne havas sekretan skripton. Ignorante.",
|
||||
"service_regen_conf_is_deprecated": "'yunohost service regen-conf' malakceptas! Bonvolu uzi anstataŭe 'yunohost tools regen-conf'.",
|
||||
"global_settings_key_doesnt_exists": "La ŝlosilo '{settings_key:s}' ne ekzistas en la tutmondaj agordoj, vi povas vidi ĉiujn disponeblajn klavojn per uzado de 'yunohost settings list'",
|
||||
"dyndns_no_domain_registered": "Neniu domajno registrita ĉe DynDNS",
|
||||
"dyndns_could_not_check_available": "Ne povis kontroli ĉu {domain:s} haveblas sur {provider:s}.",
|
||||
"global_settings_setting_example_enum": "Ekzemplo enum elekto",
|
||||
"hook_exec_not_terminated": "Skripto ne finiĝis ĝuste: {path:s}",
|
||||
"service_stopped": "Servo '{service:s}' ĉesis",
|
||||
"restore_failed": "Ne povis restarigi sistemon",
|
||||
|
@ -290,26 +241,19 @@
|
|||
"updating_apt_cache": "Akirante haveblajn ĝisdatigojn por sistemaj pakoj…",
|
||||
"tools_upgrade_at_least_one": "Bonvolu specifi '--apps' aŭ '--system'",
|
||||
"service_already_stopped": "La servo '{service:s}' jam ĉesis",
|
||||
"migration_0003_modified_files": "Bonvolu noti, ke la jenaj dosieroj estis trovitaj mane kaj modifitaj kaj povus esti anstataŭigitaj sekve de la ĝisdatigo: {manually_modified_files}",
|
||||
"tools_upgrade_cant_both": "Ne eblas ĝisdatigi ambaŭ sistemon kaj programojn samtempe",
|
||||
"restore_extracting": "Eltirante bezonatajn dosierojn el la ar theivo…",
|
||||
"upnp_port_open_failed": "Ne povis malfermi havenon per UPnP",
|
||||
"log_app_upgrade": "Ĝisdatigu la aplikon '{}'",
|
||||
"log_help_to_get_failed_log": "La operacio '{desc}' ne povis finiĝi. Bonvolu dividi la plenan ŝtipon de ĉi tiu operacio per la komando 'yunohost log share {name}' por akiri helpon",
|
||||
"migration_description_0002_migrate_to_tsig_sha256": "Plibonigu sekurecon de DynDNS TSIG-ĝisdatigoj per SHA-512 anstataŭ MD5",
|
||||
"port_already_closed": "Haveno {port:d} estas jam fermita por {ip_version:s} rilatoj",
|
||||
"hook_name_unknown": "Nekonata hoko-nomo '{name:s}'",
|
||||
"migration_0003_system_not_fully_up_to_date": "Via sistemo ne estas plene ĝisdata. Bonvolu plenumi regulan ĝisdatigon antaŭ ol ruli la migradon al Stretch.",
|
||||
"dyndns_could_not_check_provide": "Ne povis kontroli ĉu {provider:s} povas provizi {domain:s}.",
|
||||
"dyndns_cron_remove_failed": "Ne povis forigi la cron-laboron DynDNS ĉar: {error}",
|
||||
"restore_nothings_done": "Nenio estis restarigita",
|
||||
"log_tools_postinstall": "Afiŝu vian servilon YunoHost",
|
||||
"dyndns_unavailable": "La domajno '{domain:s}' ne haveblas.",
|
||||
"experimental_feature": "Averto: Ĉi tiu funkcio estas eksperimenta kaj ne konsiderata stabila, vi ne uzu ĝin krom se vi scias kion vi faras.",
|
||||
"root_password_replaced_by_admin_password": "Via radika pasvorto estis anstataŭigita per via administra pasvorto.",
|
||||
"migration_description_0005_postgresql_9p4_to_9p6": "Migru datumbazojn de PostgreSQL 9.4 al 9.6",
|
||||
"migration_0008_root": "• Vi ne povos konekti kiel radiko per SSH. Anstataŭe vi uzu la administran uzanton;",
|
||||
"package_unknown": "Nekonata pako '{pkgname}'",
|
||||
"domain_unknown": "Nekonata domajno",
|
||||
"global_settings_setting_security_password_user_strength": "Uzanto pasvorta forto",
|
||||
"restore_may_be_not_enough_disk_space": "Via sistemo ne ŝajnas havi sufiĉe da spaco (libera: {free_space:d} B, necesa spaco: {needed_space:d} B, sekureca marĝeno: {margin:d} B)",
|
||||
|
@ -323,17 +267,13 @@
|
|||
"service_description_fail2ban": "Protektas kontraŭ bruta forto kaj aliaj specoj de atakoj de la interreto",
|
||||
"file_does_not_exist": "La dosiero {path:s} ne ekzistas.",
|
||||
"yunohost_not_installed": "YunoHost ne estas ĝuste instalita. Bonvolu prilabori 'yunohost tools postinstall'",
|
||||
"migration_0005_postgresql_96_not_installed": "PostgreSQL 9.4 estas instalita, sed ne postgresql 9.6‽ Io stranga eble okazis en via sistemo :(…",
|
||||
"restore_removing_tmp_dir_failed": "Ne povis forigi malnovan provizoran dosierujon",
|
||||
"certmanager_cannot_read_cert": "Io malbona okazis, kiam mi provis malfermi aktualan atestilon por domajno {domain:s} (dosiero: {file:s}), kialo: {reason:s}",
|
||||
"service_removed": "Servo '{service:s}' forigita",
|
||||
"certmanager_hit_rate_limit": "Tro multaj atestiloj jam eldonitaj por ĉi tiu ĝusta aro de domajnoj {domain:s} antaŭ nelonge. Bonvolu reprovi poste. Vidu https://letsencrypt.org/docs/rate-limits/ por pliaj detaloj",
|
||||
"migration_0005_not_enough_space": "Disponigu sufiĉan spacon en {path} por ruli la migradon.",
|
||||
"pattern_firstname": "Devas esti valida antaŭnomo",
|
||||
"migration_description_0010_migrate_to_apps_json": "Forigu malvalorigitajn katalogajn programojn kaj uzu anstataŭe la novan unuigitan liston de \"apps.json\" (malaktuale anstataŭita per migrado 13)",
|
||||
"domain_cert_gen_failed": "Ne povis generi atestilon",
|
||||
"regenconf_file_kept_back": "La agorda dosiero '{conf}' estas atendita forigi per regen-conf (kategorio {category}), sed ĝi estis konservita.",
|
||||
"migrate_tsig_wait_4": "30 sekundoj …",
|
||||
"backup_with_no_restore_script_for_app": "La apliko \"{app:s}\" ne havas restarigan skripton, vi ne povos aŭtomate restarigi la sekurkopion de ĉi tiu apliko.",
|
||||
"log_letsencrypt_cert_install": "Instalu atestilon Let's Encrypt sur '{}' regado",
|
||||
"log_dyndns_update": "Ĝisdatigu la IP asociita kun via subdominio YunoHost '{}'",
|
||||
|
@ -342,24 +282,19 @@
|
|||
"log_user_delete": "Forigi uzanton '{}'",
|
||||
"dyndns_ip_updated": "Ĝisdatigis vian IP sur DynDNS",
|
||||
"regenconf_up_to_date": "La agordo jam estas ĝisdatigita por kategorio '{category}'",
|
||||
"migration_0003_patching_sources_list": "Patching the sources.lists …",
|
||||
"global_settings_setting_security_ssh_compatibility": "Kongruo vs sekureca kompromiso por la SSH-servilo. Afektas la ĉifradojn (kaj aliajn aspektojn pri sekureco)",
|
||||
"migrations_need_to_accept_disclaimer": "Por funkciigi la migradon {id}, via devas akcepti la sekvan malakcepton:\n---\n{disclaimer}\n---\nSe vi akceptas funkcii la migradon, bonvolu rekonduki la komandon kun la opcio '--accept-disclaimer'.",
|
||||
"regenconf_file_remove_failed": "Ne povis forigi la agordodosieron '{conf}'",
|
||||
"not_enough_disk_space": "Ne sufiĉe libera spaco sur '{path:s}'",
|
||||
"migration_0006_disclaimer": "YunoHost nun atendas, ke la pasvortoj de admin kaj radiko estos sinkronigitaj. Ĉi tiu migrado anstataŭigas vian radikan pasvorton kun la administran pasvorton.",
|
||||
"dyndns_ip_update_failed": "Ne povis ĝisdatigi IP-adreson al DynDNS",
|
||||
"migration_description_0004_php5_to_php7_pools": "Rekonfigu la PHP-naĝejojn por uzi PHP 7 anstataŭ 5",
|
||||
"ssowat_conf_updated": "SSOwat-agordo ĝisdatigita",
|
||||
"log_link_to_failed_log": "Ne povis plenumi la operacion '{desc}'. Bonvolu provizi la plenan protokolon de ĉi tiu operacio per <a href=\"#/tools/logs/{name}\">alklakante ĉi tie </a> por akiri helpon",
|
||||
"user_home_creation_failed": "Ne povis krei dosierujon \"home\" por uzanto",
|
||||
"pattern_backup_archive_name": "Devas esti valida dosiernomo kun maksimume 30 signoj, alfanombraj kaj -_. signoj nur",
|
||||
"restore_cleaning_failed": "Ne eblis purigi la adresaron de provizora restarigo",
|
||||
"dyndns_registration_failed": "Ne povis registri DynDNS-domajnon: {error:s}",
|
||||
"migration_0003_not_jessie": "La nuna Debian-distribuo ne estas Jessie!",
|
||||
"user_unknown": "Nekonata uzanto: {user:s}",
|
||||
"migrations_to_be_ran_manually": "Migrado {id} devas funkcii permane. Bonvolu iri al Iloj → Migradoj en la retpaĝa paĝo, aŭ kuri `yunohost tools migrations run`.",
|
||||
"migration_0008_warning": "Se vi komprenas tiujn avertojn kaj volas ke YunoHost preterlasu vian nunan agordon, faru la migradon. Alie, vi ankaŭ povas salti la migradon, kvankam ĝi ne rekomendas.",
|
||||
"certmanager_cert_renew_success": "Ni Ĉifru atestilon renovigitan por la domajno '{domain:s}'",
|
||||
"global_settings_reset_success": "Antaŭaj agordoj nun estas rezervitaj al {path:s}",
|
||||
"pattern_domain": "Devas esti valida domajna nomo (t.e. mia-domino.org)",
|
||||
|
@ -369,8 +304,6 @@
|
|||
"regenconf_file_removed": "Agordodosiero '{conf}' forigita",
|
||||
"log_tools_shutdown": "Enŝaltu vian servilon",
|
||||
"password_too_simple_3": "La pasvorto bezonas almenaŭ 8 signojn kaj enhavas ciferon, majusklon, pli malaltan kaj specialajn signojn",
|
||||
"migration_0003_general_warning": "Bonvolu noti, ke ĉi tiu migrado estas delikata operacio. La teamo de YunoHost faris sian plej bonan revizii kaj testi ĝin, sed la migrado eble ankoraŭ rompos partojn de la sistemo aŭ ĝiaj programoj.\n\nTial oni rekomendas al:\n - Elfari kopion de iuj kritikaj datumoj aŭ app. Pliaj informoj pri https://yunohost.org/backup;\n - Paciencu post lanĉo de la migrado: Depende de via interreta konekto kaj aparataro, eble daŭros kelkaj horoj ĝis ĉio ĝisdatigi.\n\nAldone, la haveno por SMTP, uzata de eksteraj retpoŝtaj klientoj (kiel Thunderbird aŭ K9-Mail) estis ŝanĝita de 465 (SSL / TLS) al 587 (STARTTLS). La malnova haveno (465) aŭtomate fermiĝos, kaj la nova haveno (587) malfermiĝos en la fajrejo. Vi kaj viaj uzantoj * devos adapti la agordon de viaj retpoŝtaj klientoj laŭe.",
|
||||
"global_settings_setting_example_int": "Ekzemple int elekto",
|
||||
"backup_output_symlink_dir_broken": "Via arkiva dosierujo '{path:s}' estas rompita ligilo. Eble vi forgesis restarigi aŭ munti aŭ enŝovi la stokadon, al kiu ĝi notas.",
|
||||
"good_practices_about_admin_password": "Vi nun estas por difini novan administran pasvorton. La pasvorto devas esti almenaŭ 8 signojn - kvankam estas bone praktiki uzi pli longan pasvorton (t.e. pasfrazon) kaj/aŭ uzi variaĵon de signoj (majuskloj, minuskloj, ciferoj kaj specialaj signoj).",
|
||||
"certmanager_attempt_to_renew_valid_cert": "La atestilo por la domajno '{domain:s}' ne finiĝos! (Vi eble uzos --force se vi scias kion vi faras)",
|
||||
|
@ -378,7 +311,6 @@
|
|||
"regenconf_pending_applying": "Aplikante pritraktata agordo por kategorio '{category}'…",
|
||||
"service_description_dovecot": "Permesas al retpoŝtaj klientoj aliri / serĉi retpoŝton (per IMAP kaj POP3)",
|
||||
"domain_dns_conf_is_just_a_recommendation": "Ĉi tiu komando montras al vi la *rekomenditan* agordon. Ĝi efektive ne agordas la DNS-agordon por vi. Via respondeco agordi vian DNS-zonon en via registristo laŭ ĉi tiu rekomendo.",
|
||||
"backup_php5_to_php7_migration_may_fail": "Ne povis konverti vian ar archiveivon por subteni PHP 7, vi eble ne povas restarigi viajn PHP-programojn (kialo: {error:s})",
|
||||
"log_backup_restore_system": "Restarigi sistemon de rezerva arkivo",
|
||||
"log_app_change_url": "Ŝanĝu la URL de la apliko '{}'",
|
||||
"service_already_started": "La servo '{service:s}' jam funkcias",
|
||||
|
@ -395,16 +327,10 @@
|
|||
"restore_hook_unavailable": "Restariga skripto por '{part:s}' ne haveblas en via sistemo kaj ankaŭ ne en la ar theivo",
|
||||
"log_dyndns_subscribe": "Aboni al YunoHost-subdominio '{}'",
|
||||
"password_too_simple_4": "La pasvorto bezonas almenaŭ 12 signojn kaj enhavas ciferon, majuskle, pli malaltan kaj specialajn signojn",
|
||||
"migration_0003_main_upgrade": "Komencanta ĉefa ĝisdatigo …",
|
||||
"regenconf_file_updated": "Agordodosiero '{conf}' ĝisdatigita",
|
||||
"log_help_to_get_log": "Por vidi la protokolon de la operacio '{desc}', uzu la komandon 'yunohost log show {name}{name}'",
|
||||
"global_settings_setting_security_nginx_compatibility": "Kongruo vs sekureca kompromiso por la TTT-servilo NGINX. Afektas la ĉifradojn (kaj aliajn aspektojn pri sekureco)",
|
||||
"no_internet_connection": "La servilo ne estas konektita al la interreto",
|
||||
"migration_0008_dsa": "• La DSA-ŝlosilo estos malŝaltita. Tial vi eble bezonos nuligi spuran averton de via SSH-kliento kaj revizii la fingrospuron de via servilo;",
|
||||
"migration_0003_restoring_origin_nginx_conf": "Fileia dosiero /etc/nginx/nginx.conf estis iel redaktita. La migrado unue restarigos ĝin al sia originala stato ... La antaŭa dosiero estos havebla kiel {backup_dest}.",
|
||||
"migrate_tsig_end": "Migrado al HMAC-SHA-512 finiĝis",
|
||||
"restore_complete": "Restarigita",
|
||||
"certmanager_couldnt_fetch_intermediate_cert": "Ekvilibrigita kiam vi provis ricevi interajn atestilojn de Let's Encrypt. Atestita instalado / renovigo nuligita - bonvolu reprovi poste.",
|
||||
"hook_exec_failed": "Ne povis funkcii skripto: {path:s}",
|
||||
"global_settings_cant_open_settings": "Ne eblis malfermi agordojn, tial: {reason:s}",
|
||||
"user_created": "Uzanto kreita",
|
||||
|
@ -414,7 +340,6 @@
|
|||
"update_apt_cache_warning": "Io iris malbone dum la ĝisdatigo de la kaŝmemoro de APT (paka administranto de Debian). Jen rubujo de la sources.list-linioj, kiuj povus helpi identigi problemajn liniojn:\n{sourceslist}",
|
||||
"regenconf_dry_pending_applying": "Kontrolado de pritraktata agordo, kiu estus aplikita por kategorio '{category}'…",
|
||||
"regenconf_file_copy_failed": "Ne povis kopii la novan agordodosieron '{new}' al '{conf}'",
|
||||
"global_settings_setting_example_string": "Ekzemple korda elekto",
|
||||
"restore_already_installed_app": "App kun la ID '{app:s}' estas jam instalita",
|
||||
"mail_domain_unknown": "Nevalida retadreso por domajno '{domain:s}'. Bonvolu uzi domajnon administritan de ĉi tiu servilo.",
|
||||
"migrations_cant_reach_migration_file": "Ne povis aliri migrajn dosierojn ĉe la vojo '% s'",
|
||||
|
@ -422,9 +347,7 @@
|
|||
"mail_alias_remove_failed": "Ne povis forigi retpoŝton alias '{mail:s}'",
|
||||
"regenconf_file_manually_removed": "La dosiero de agordo '{conf}' estis forigita permane, kaj ne estos kreita",
|
||||
"domain_exists": "La domajno jam ekzistas",
|
||||
"migration_description_0001_change_cert_group_to_sslcert": "Ŝanĝu grupajn permesojn de 'metronomo' al 'ssl-cert'",
|
||||
"ldap_initialized": "LDAP inicializis",
|
||||
"migrate_tsig_not_needed": "Vi ne ŝajnas uzi DynDNS-domajnon, do neniu migrado necesas.",
|
||||
"certmanager_domain_cert_not_selfsigned": "La atestilo por domajno {domain:s} ne estas mem-subskribita. Ĉu vi certas, ke vi volas anstataŭigi ĝin? (Uzu '--force' por fari tion.)",
|
||||
"certmanager_unable_to_parse_self_CA_name": "Ne povis trapasi nomon de mem-subskribinta aŭtoritato (dosiero: {file:s})",
|
||||
"log_selfsigned_cert_install": "Instalu mem-subskribitan atestilon sur '{}' domajno",
|
||||
|
@ -433,19 +356,16 @@
|
|||
"global_settings_bad_choice_for_enum": "Malbona elekto por agordo {setting:s}, ricevita '{choice:s}', sed disponeblaj elektoj estas: {available_choices:s}",
|
||||
"server_shutdown": "La servilo haltos",
|
||||
"log_tools_migrations_migrate_forward": "Kuru migradoj",
|
||||
"migration_0008_no_warning": "Supersalti vian SSH-agordon estu sekura, kvankam tio ne povas esti promesita! Ekfunkciu la migradon por superregi ĝin. Alie, vi ankaŭ povas salti la migradon, kvankam ĝi ne rekomendas.",
|
||||
"regenconf_now_managed_by_yunohost": "La agorda dosiero '{conf}' nun estas administrata de YunoHost (kategorio {category}).",
|
||||
"server_reboot_confirm": "Ĉu la servilo rekomencos tuj, ĉu vi certas? [{answers:s}]",
|
||||
"log_app_install": "Instalu la aplikon '{}'",
|
||||
"service_description_dnsmasq": "Traktas rezolucion de domajna nomo (DNS)",
|
||||
"global_settings_unknown_type": "Neatendita situacio, la agordo {setting:s} ŝajnas havi la tipon {unknown_type:s} sed ĝi ne estas tipo subtenata de la sistemo.",
|
||||
"migration_0003_problematic_apps_warning": "Bonvolu noti, ke la sekvaj eventuale problemaj instalitaj programoj estis detektitaj. Ŝajnas, ke tiuj ne estis instalitaj el aplika katalogo aŭ ne estas markitaj kiel \"funkciantaj\". Tial ne eblas garantii, ke ili ankoraŭ funkcios post la ĝisdatigo: {problematic_apps}",
|
||||
"domain_hostname_failed": "Ne povis agordi novan gastigilon. Ĉi tio eble kaŭzos problemon poste (eble bone).",
|
||||
"server_reboot": "La servilo rekomenciĝos",
|
||||
"regenconf_failed": "Ne povis regeneri la agordon por kategorio(j): {categories}",
|
||||
"domain_uninstall_app_first": "Unu aŭ pluraj programoj estas instalitaj en ĉi tiu domajno. Bonvolu malinstali ilin antaŭ ol daŭrigi la domajnan forigon",
|
||||
"service_unknown": "Nekonata servo '{service:s}'",
|
||||
"migration_0003_start": "Komencante migradon al Stretch. La protokoloj haveblos en {logfile}.",
|
||||
"domain_deletion_failed": "Ne eblas forigi domajnon {domain}: {error}",
|
||||
"log_user_update": "Ĝisdatigu uzantinformojn de '{}'",
|
||||
"user_creation_failed": "Ne povis krei uzanton {user}: {error}",
|
||||
|
@ -458,14 +378,10 @@
|
|||
"dyndns_domain_not_provided": "Provizanto DynDNS {provider:s} ne povas provizi domajnon {domain:s}.",
|
||||
"backup_unable_to_organize_files": "Ne povis uzi la rapidan metodon por organizi dosierojn en la ar archiveivo",
|
||||
"password_too_simple_2": "La pasvorto bezonas almenaŭ 8 signojn kaj enhavas ciferon, majusklojn kaj minusklojn",
|
||||
"executing_script": "Plenumanta skripto '{script:s}' …",
|
||||
"service_cmd_exec_failed": "Ne povis plenumi la komandon '{command:s}'",
|
||||
"migration_0007_cancelled": "Ne povis plibonigi la manieron kiel via SSH-agordo estas administrita.",
|
||||
"migrate_tsig_failed": "Ne povis migri la DynDNS-domajnon '{domain}' al HMAC-SHA-512, ruliĝante. Eraro: {error_code}, {error}",
|
||||
"pattern_lastname": "Devas esti valida familinomo",
|
||||
"service_enabled": "La servo '{service:s}' nun aŭtomate komenciĝos dum sistemaj botoj.",
|
||||
"certmanager_no_cert_file": "Ne povis legi la atestan dosieron por la domajno {domain:s} (dosiero: {file:s})",
|
||||
"migration_0008_port": "• Vi devos konekti uzante la havenon 22 anstataŭ via nuna kutimo SSH-haveno. Sentu vin libera reconfiguri ĝin;",
|
||||
"domain_creation_failed": "Ne eblas krei domajnon {domain}: {error}",
|
||||
"certmanager_domain_http_not_working": "Ŝajnas ke la domajno {domain:s} ne atingeblas per HTTP. Kontrolu, ke via DNS kaj NGINX-agordo ĝustas",
|
||||
"domain_cannot_remove_main": "Vi ne povas forigi '{domain:s}' ĉar ĝi estas la ĉefa domajno, vi bezonas unue agordi alian domajnon kiel la ĉefan domajnon per uzado de 'yunohost domain main-domain -n <another-domain>', jen la listo de kandidataj domajnoj. : {other_domains:s}",
|
||||
|
@ -473,7 +389,6 @@
|
|||
"log_domain_add": "Aldonu '{}' domajnon en sisteman agordon",
|
||||
"global_settings_bad_type_for_setting": "Malbona tipo por agordo {setting:s}, ricevita {received_type:s}, atendata {expected_type:s}",
|
||||
"unlimit": "Neniu kvoto",
|
||||
"dyndns_cron_installed": "Kreita laboro DynDNS cron",
|
||||
"system_username_exists": "Uzantnomo jam ekzistas en la listo de uzantoj de sistemo",
|
||||
"firewall_reloaded": "Fajroŝirmilo reŝarĝis",
|
||||
"service_restarted": "Servo '{service:s}' rekomencis",
|
||||
|
@ -487,7 +402,6 @@
|
|||
"firewall_rules_cmd_failed": "Iuj komandoj pri fajroŝirmilo malsukcesis. Pliaj informoj en ensaluto.",
|
||||
"certmanager_certificate_fetching_or_enabling_failed": "Provante uzi la novan atestilon por {domain:s} ne funkciis …",
|
||||
"app_full_domain_unavailable": "Bedaŭrinde, ĉi tiu app devas esti instalita sur propra domajno, sed aliaj programoj jam estas instalitaj sur la domajno '{domain}'. Vi povus uzi subdominon dediĉitan al ĉi tiu app anstataŭe.",
|
||||
"migration_0011_slapd_config_will_be_overwritten": "Ŝajnas ke vi permane redaktis la slapd-agordon. Por ĉi tiu kritika migrado, YunoHost bezonas devigi la ĝisdatigon de la slapd-agordo. La originalaj dosieroj estos rezervitaj en {conf_backup_folder}.",
|
||||
"group_cannot_edit_all_users": "La grupo 'all_users' ne povas esti redaktita permane. Ĝi estas speciala grupo celita enhavi ĉiujn uzantojn registritajn en YunoHost",
|
||||
"group_cannot_edit_visitors": "La grupo 'vizitantoj' ne povas esti redaktita permane. Ĝi estas speciala grupo reprezentanta anonimajn vizitantojn",
|
||||
"group_cannot_edit_primary_group": "La grupo '{group}' ne povas esti redaktita permane. Ĝi estas la primara grupo celita enhavi nur unu specifan uzanton.",
|
||||
|
@ -507,10 +421,8 @@
|
|||
"diagnosis_basesystem_ynh_single_version": "{package} versio: {version} ({repo})",
|
||||
"diagnosis_basesystem_ynh_main_version": "Servilo funkcias YunoHost {main_version} ({repo})",
|
||||
"diagnosis_basesystem_ynh_inconsistent_versions": "Vi prizorgas malkonsekvencajn versiojn de la YunoHost-pakoj... plej probable pro malsukcesa aŭ parta ĝisdatigo.",
|
||||
"diagnosis_display_tip_web": "Vi povas iri al la sekcio Diagnozo (en la hejmekrano) por vidi la trovitajn problemojn.",
|
||||
"diagnosis_cache_still_valid": "(La kaŝmemoro ankoraŭ validas por {category} diagnozo. Vi ankoraŭ ne diagnozas ĝin!)",
|
||||
"diagnosis_cant_run_because_of_dep": "Ne eblas fari diagnozon por {category} dum estas gravaj problemoj rilataj al {dep}.",
|
||||
"diagnosis_display_tip_cli": "Vi povas aranĝi 'yunohost diagnosis show --issues --human-readable' por aperigi la trovitajn problemojn.",
|
||||
"diagnosis_failed_for_category": "Diagnozo malsukcesis por kategorio '{category}': {error}",
|
||||
"app_upgrade_script_failed": "Eraro okazis en la skripto pri ĝisdatiga programo",
|
||||
"diagnosis_diskusage_verylow": "Stokado <code>{mountpoint}</code> (sur aparato <code> {device} </code>) nur restas {free} ({free_percent}%) spaco restanta (el {total}). Vi vere konsideru purigi iom da spaco !",
|
||||
|
@ -519,7 +431,6 @@
|
|||
"diagnosis_http_bad_status_code": "Ĝi aspektas kiel alia maŝino (eble via interreta enkursigilo) respondita anstataŭ via servilo.<br>1. La plej ofta kaŭzo por ĉi tiu afero estas, ke la haveno 80 (kaj 443) <a href='https://yunohost.org/isp_box_config'> ne estas ĝuste senditaj al via servilo </a>.<br>2. Pri pli kompleksaj agordoj: certigu, ke neniu fajroŝirmilo aŭ reverso-prokuro ne interbatalas.",
|
||||
"main_domain_changed": "La ĉefa domajno estis ŝanĝita",
|
||||
"yunohost_postinstall_end_tip": "La post-instalado finiĝis! Por fini vian agordon, bonvolu konsideri:\n - aldonado de unua uzanto tra la sekcio 'Uzantoj' de la retadreso (aŭ 'uzanto de yunohost kreu <uzantnomon>' en komandlinio);\n - diagnozi eblajn problemojn per la sekcio 'Diagnozo' de la reteja administrado (aŭ 'diagnoza yunohost-ekzekuto' en komandlinio);\n - legante la partojn 'Finigi vian agordon' kaj 'Ekkoni Yunohost' en la administra dokumentado: https://yunohost.org/admindoc.",
|
||||
"migration_description_0014_remove_app_status_json": "Forigi heredajn dosierojn",
|
||||
"diagnosis_ip_connected_ipv4": "La servilo estas konektita al la interreto per IPv4 !",
|
||||
"diagnosis_ip_no_ipv4": "La servilo ne havas funkciantan IPv4.",
|
||||
"diagnosis_ip_connected_ipv6": "La servilo estas konektita al la interreto per IPv6 !",
|
||||
|
@ -534,9 +445,6 @@
|
|||
"diagnosis_swap_none": "La sistemo tute ne havas interŝanĝon. Vi devus pripensi aldoni almenaŭ {recommended} da interŝanĝo por eviti situaciojn en kiuj la sistemo restas sen memoro.",
|
||||
"diagnosis_swap_notsomuch": "La sistemo havas nur {total}-interŝanĝon. Vi konsideru havi almenaŭ {recommended} por eviti situaciojn en kiuj la sistemo restas sen memoro.",
|
||||
"diagnosis_regenconf_manually_modified_details": "Ĉi tio probable estas bona, se vi scias, kion vi faras! YunoHost ĉesigos ĝisdatigi ĉi tiun dosieron aŭtomate ... Sed atentu, ke YunoHost-ĝisdatigoj povus enhavi gravajn rekomendajn ŝanĝojn. Se vi volas, vi povas inspekti la diferencojn per <cmd>yyunohost tools regen-conf {category} --dry-run --with-diff</cmd> kaj devigi la reset al la rekomendita agordo per <cmd>yunohost tools regen-conf {category} --force</cmd>",
|
||||
"diagnosis_regenconf_manually_modified_debian": "Agordodosiero {file} estis modifita permane kompare kun la defaŭlta Debian.",
|
||||
"diagnosis_regenconf_manually_modified_debian_details": "Ĉi tio probable estas bona, sed devas observi ĝin...",
|
||||
"diagnosis_security_all_good": "Neniu kritika sekureca vundebleco estis trovita.",
|
||||
"diagnosis_security_vulnerable_to_meltdown": "Vi ŝajnas vundebla al la kritiko-vundebleco de Meltdown",
|
||||
"diagnosis_no_cache": "Neniu diagnoza kaŝmemoro por kategorio '{category}'",
|
||||
"diagnosis_ip_broken_dnsresolution": "Rezolucio pri domajna nomo rompiĝas pro iu kialo... Ĉu fajroŝirmilo blokas DNS-petojn ?",
|
||||
|
@ -547,14 +455,12 @@
|
|||
"diagnosis_services_bad_status": "Servo {service} estas {status} :(",
|
||||
"diagnosis_ram_low": "La sistemo havas {available} ({available_percent}%) RAM forlasita de {total}. Estu zorgema.",
|
||||
"diagnosis_swap_ok": "La sistemo havas {total} da interŝanĝoj!",
|
||||
"diagnosis_mail_ougoing_port_25_ok": "Eliranta haveno 25 ne estas blokita kaj retpoŝto povas esti sendita al aliaj serviloj.",
|
||||
"diagnosis_regenconf_allgood": "Ĉiuj agordaj dosieroj kongruas kun la rekomendita agordo!",
|
||||
"diagnosis_regenconf_manually_modified": "Agordodosiero <code>{file}</code> ŝajnas esti permane modifita.",
|
||||
"diagnosis_description_ip": "Interreta konektebleco",
|
||||
"diagnosis_description_dnsrecords": "Registroj DNS",
|
||||
"diagnosis_description_services": "Servo kontrolas staton",
|
||||
"diagnosis_description_systemresources": "Rimedaj sistemoj",
|
||||
"diagnosis_description_security": "Sekurecaj kontroloj",
|
||||
"diagnosis_ports_could_not_diagnose": "Ne povis diagnozi, ĉu haveblaj havenoj de ekstere.",
|
||||
"diagnosis_ports_could_not_diagnose_details": "Eraro: {error}",
|
||||
"diagnosis_services_bad_status_tip": "Vi povas provi <a href='#/services/{service}'>rekomenci la servon </a>, kaj se ĝi ne funkcias, rigardu <a href='#/services/{service}'>La servaj registroj en reteja</a> (el la komandlinio, vi povas fari tion per <cmd>yunohost service restart {service}</cmd> kaj<cmd>yunohost service log {service}</cmd>).",
|
||||
|
@ -565,7 +471,6 @@
|
|||
"log_domain_main_domain": "Faru de '{}' la ĉefa domajno",
|
||||
"diagnosis_http_timeout": "Tempolimigita dum provado kontakti vian servilon de ekstere. Ĝi ŝajnas esti neatingebla.<br>1. La plej ofta kaŭzo por ĉi tiu afero estas, ke la haveno 80 (kaj 443) <a href='https://yunohost.org/isp_box_config'>ne estas ĝuste senditaj al via servilo</a>.<br>2. Vi ankaŭ devas certigi, ke la servo nginx funkcias<br>3. Pri pli kompleksaj agordoj: certigu, ke neniu fajroŝirmilo aŭ reverso-prokuro ne interbatalas.",
|
||||
"diagnosis_http_connection_error": "Rilata eraro: ne povis konektiĝi al la petita domajno, tre probable ĝi estas neatingebla.",
|
||||
"migration_description_0013_futureproof_apps_catalog_system": "Migru al la nova katalogosistemo pri estontecaj programoj",
|
||||
"diagnosis_ignored_issues": "(+ {nb_ignored} ignorataj aferoj))",
|
||||
"diagnosis_found_errors": "Trovis {errors} signifa(j) afero(j) rilata al {category}!",
|
||||
"diagnosis_found_errors_and_warnings": "Trovis {errors} signifaj problemo (j) (kaj {warnings} averto) rilataj al {category}!",
|
||||
|
@ -595,7 +500,6 @@
|
|||
"diagnosis_never_ran_yet": "Ŝajnas, ke ĉi tiu servilo estis instalita antaŭ nelonge kaj estas neniu diagnoza raporto por montri. Vi devas komenci kurante plenan diagnozon, ĉu de la retadministro aŭ uzante 'yunohost diagnosis run' el la komandlinio.",
|
||||
"certmanager_warning_subdomain_dns_record": "Subdominio '{subdomain:s}' ne solvas al la sama IP-adreso kiel '{domain:s}'. Iuj funkcioj ne estos haveblaj ĝis vi riparos ĉi tion kaj regeneros la atestilon.",
|
||||
"diagnosis_basesystem_hardware": "Arkitekturo de servila aparataro estas {virt} {arch}",
|
||||
"diagnosis_basesystem_hardware_board": "Servilo-tabulo-modelo estas {model}",
|
||||
"diagnosis_description_web": "Reta",
|
||||
"domain_cannot_add_xmpp_upload": "Vi ne povas aldoni domajnojn per 'xmpp-upload'. Ĉi tiu speco de nomo estas rezervita por la XMPP-alŝuta funkcio integrita en YunoHost.",
|
||||
"group_already_exist_on_system_but_removing_it": "Grupo {group} jam ekzistas en la sistemaj grupoj, sed YunoHost forigos ĝin …",
|
||||
|
@ -637,4 +541,4 @@
|
|||
"diagnosis_http_nginx_conf_not_up_to_date": "La nginx-agordo de ĉi tiu domajno ŝajnas esti modifita permane, kaj malhelpas YunoHost diagnozi ĉu ĝi atingeblas per HTTP.",
|
||||
"diagnosis_http_nginx_conf_not_up_to_date_details": "Por solvi la situacion, inspektu la diferencon per la komandlinio per <cmd>yunohost tools regen-conf nginx --dry-run --with-diff</cmd> kaj se vi aranĝas, apliku la ŝanĝojn per <cmd>yunohost tools regen-conf nginx --force</cmd>.",
|
||||
"global_settings_setting_smtp_allow_ipv6": "Permesu la uzon de IPv6 por ricevi kaj sendi poŝton"
|
||||
}
|
||||
}
|
101
locales/es.json
101
locales/es.json
|
@ -22,7 +22,6 @@
|
|||
"app_unsupported_remote_type": "Tipo remoto no soportado por la aplicación",
|
||||
"app_upgrade_failed": "No se pudo actualizar {app:s}: {error}",
|
||||
"app_upgraded": "Actualizado {app:s}",
|
||||
"ask_email": "Dirección de correo electrónico",
|
||||
"ask_firstname": "Nombre",
|
||||
"ask_lastname": "Apellido",
|
||||
"ask_main_domain": "Dominio principal",
|
||||
|
@ -39,7 +38,6 @@
|
|||
"backup_delete_error": "No se pudo eliminar «{path:s}»",
|
||||
"backup_deleted": "Eliminada la copia de seguridad",
|
||||
"backup_hook_unknown": "El gancho «{hook:s}» de la copia de seguridad es desconocido",
|
||||
"backup_invalid_archive": "Esto no es un archivo de respaldo",
|
||||
"backup_nothings_done": "Nada que guardar",
|
||||
"backup_output_directory_forbidden": "Elija un directorio de salida diferente. Las copias de seguridad no se pueden crear en /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var o /home/yunohost.backup/archives subcarpetas",
|
||||
"backup_output_directory_not_empty": "Debe elegir un directorio de salida vacío",
|
||||
|
@ -58,9 +56,6 @@
|
|||
"domain_unknown": "Dominio desconocido",
|
||||
"done": "Hecho.",
|
||||
"downloading": "Descargando…",
|
||||
"dyndns_cron_installed": "Creado el trabajo de cron de DynDNS",
|
||||
"dyndns_cron_remove_failed": "No se pudo eliminar el trabajo de cron de DynDNS por: {error}",
|
||||
"dyndns_cron_removed": "Eliminado el trabajo de cron de DynDNS",
|
||||
"dyndns_ip_update_failed": "No se pudo actualizar la dirección IP en DynDNS",
|
||||
"dyndns_ip_updated": "Actualizada su IP en DynDNS",
|
||||
"dyndns_key_generating": "Generando la clave del DNS. Esto podría tardar un rato.",
|
||||
|
@ -69,8 +64,6 @@
|
|||
"dyndns_registered": "Registrado dominio de DynDNS",
|
||||
"dyndns_registration_failed": "No se pudo registrar el dominio de DynDNS: {error:s}",
|
||||
"dyndns_unavailable": "El dominio «{domain:s}» no está disponible.",
|
||||
"executing_command": "Ejecutando la orden «{command:s}»…",
|
||||
"executing_script": "Ejecutando el guión «{script:s}»…",
|
||||
"extracting": "Extrayendo…",
|
||||
"field_invalid": "Campo no válido '{:s}'",
|
||||
"firewall_reload_failed": "No se pudo recargar el cortafuegos",
|
||||
|
@ -90,9 +83,7 @@
|
|||
"mail_forward_remove_failed": "No se pudo eliminar el reenvío de correo «{mail:s}»",
|
||||
"main_domain_change_failed": "No se pudo cambiar el dominio principal",
|
||||
"main_domain_changed": "El dominio principal ha cambiado",
|
||||
"no_internet_connection": "El servidor no está conectado a Internet",
|
||||
"not_enough_disk_space": "No hay espacio libre suficiente en «{path:s}»",
|
||||
"package_unknown": "Paquete desconocido '{pkgname}'",
|
||||
"packages_upgrade_failed": "No se pudieron actualizar todos los paquetes",
|
||||
"pattern_backup_archive_name": "Debe ser un nombre de archivo válido con un máximo de 30 caracteres, solo se admiten caracteres alfanuméricos y los caracteres -_. (guiones y punto)",
|
||||
"pattern_domain": "El nombre de dominio debe ser válido (por ejemplo mi-dominio.org)",
|
||||
|
@ -156,20 +147,17 @@
|
|||
"user_update_failed": "No se pudo actualizar el usuario {user}: {error}",
|
||||
"user_updated": "Cambiada la información de usuario",
|
||||
"yunohost_already_installed": "YunoHost ya está instalado",
|
||||
"yunohost_ca_creation_failed": "No se pudo crear la autoridad de certificación",
|
||||
"yunohost_configured": "YunoHost está ahora configurado",
|
||||
"yunohost_installing": "Instalando YunoHost…",
|
||||
"yunohost_not_installed": "YunoHost no está correctamente instalado. Ejecute «yunohost tools postinstall»",
|
||||
"ldap_init_failed_to_create_admin": "La inicialización de LDAP no pudo crear el usuario «admin»",
|
||||
"mailbox_used_space_dovecot_down": "El servicio de buzón Dovecot debe estar activo si desea recuperar el espacio usado del buzón",
|
||||
"certmanager_attempt_to_replace_valid_cert": "Está intentando sobrescribir un certificado correcto y válido para el dominio {domain:s}! (Use --force para omitir este mensaje)",
|
||||
"certmanager_domain_unknown": "Dominio desconocido «{domain:s}»",
|
||||
"certmanager_domain_cert_not_selfsigned": "El certificado para el dominio {domain:s} no es un certificado autofirmado. ¿Está seguro de que quiere reemplazarlo? (Use «--force» para hacerlo)",
|
||||
"certmanager_certificate_fetching_or_enabling_failed": "El intento de usar el nuevo certificado para {domain:s} no ha funcionado…",
|
||||
"certmanager_attempt_to_renew_nonLE_cert": "El certificado para el dominio «{domain:s}» no ha sido emitido por Let's Encrypt. ¡No se puede renovar automáticamente!",
|
||||
"certmanager_attempt_to_renew_valid_cert": "¡El certificado para el dominio «{domain:s}» no está a punto de expirar! (Puede usar --force si sabe lo que está haciendo)",
|
||||
"certmanager_domain_http_not_working": "Parece que no se puede acceder al dominio {domain:s} a través de HTTP. Por favor compruebe en los diagnósticos la categoría 'Web'para más información. (Si sabe lo que está haciendo, utilice '--no-checks' para no realizar estas comprobaciones.)",
|
||||
"certmanager_error_no_A_record": "No se ha encontrado un registro DNS «A» para el dominio {domain:s}. Debe hacer que su nombre de dominio apunte a su máquina para poder instalar un certificado de 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}' es diferente de la IP de este servidor. Por favor comprueba los 'registros DNS' (básicos) la categoría de diagnósticos para mayor información. Si recientemente modificó su registro 'A', espere a que se propague (algunos verificadores de propagación de DNS están disponibles en línea). (Si sabe lo que está haciendo, use '--no-checks' para desactivar esos cheques)",
|
||||
"certmanager_cannot_read_cert": "Se ha producido un error al intentar abrir el certificado actual para el dominio {domain:s} (archivo: {file:s}), razón: {reason:s}",
|
||||
"certmanager_cert_install_success_selfsigned": "Instalado correctamente un certificado autofirmado para el dominio «{domain:s}»",
|
||||
|
@ -178,17 +166,13 @@
|
|||
"certmanager_hit_rate_limit": "Se han emitido demasiados certificados recientemente para este conjunto exacto de dominios {domain:s}. Pruebe de nuevo más tarde. Vea para más detalles https://letsencrypt.org/docs/rate-limits/",
|
||||
"certmanager_cert_signing_failed": "No se pudo firmar el nuevo certificado",
|
||||
"certmanager_no_cert_file": "No se pudo leer el certificado para el dominio {domain:s} (archivo: {file:s})",
|
||||
"certmanager_conflicting_nginx_file": "No se pudo preparar el dominio para el desafío ACME: el archivo de configuración de NGINX {filepath:s} está en conflicto y debe ser eliminado primero",
|
||||
"domain_cannot_remove_main": "No puede eliminar '{domain:s}' ya que es el dominio principal, primero debe configurar otro dominio como el dominio principal usando 'yunohost domain main-domain -n <otro dominio>'; Aquí está la lista de dominios candidatos: {other_domains:s}",
|
||||
"certmanager_self_ca_conf_file_not_found": "No se pudo encontrar el archivo de configuración para la autoridad de autofirma (archivo: {file:s})",
|
||||
"certmanager_unable_to_parse_self_CA_name": "No se pudo procesar el nombre de la autoridad de autofirma (archivo: {file:s})",
|
||||
"domains_available": "Dominios disponibles:",
|
||||
"backup_archive_broken_link": "No se pudo acceder al archivo de respaldo (enlace roto a {path:s})",
|
||||
"certmanager_acme_not_configured_for_domain": "El reto ACME no ha podido ser realizado para {domain} porque su configuración de nginx no tiene el el código correcto... Por favor, asegurate que la configuración de nginx es correcta ejecutando en el terminal `yunohost tools regen-conf nginx --dry-run --with-diff`.",
|
||||
"certmanager_http_check_timeout": "Tiempo de espera agotado cuando el servidor intentaba conectarse consigo mismo a través de HTTP usando una dirección IP pública (dominio «{domain:s}» con IP «{ip:s}»). Puede que esté experimentando un problema de redirección («hairpinning»), o que el cortafuegos o el enrutador de su servidor esté mal configurado.",
|
||||
"certmanager_couldnt_fetch_intermediate_cert": "Tiempo de espera agotado intentando obtener el certificado intermedio de Let's Encrypt. Cancelada la instalación o renovación del certificado. Vuelva a intentarlo más tarde.",
|
||||
"domain_hostname_failed": "No se pudo establecer un nuevo nombre de anfitrión («hostname»). Esto podría causar problemas más tarde (no es seguro... podría ir bien).",
|
||||
"yunohost_ca_creation_success": "Creada la autoridad de certificación local.",
|
||||
"app_already_installed_cant_change_url": "Esta aplicación ya está instalada. La URL no se puede cambiar solo con esta función. Marque `app changeurl` si está disponible.",
|
||||
"app_change_url_failed_nginx_reload": "No se pudo recargar NGINX. Esta es la salida de «nginx -t»:\n{nginx_errors:s}",
|
||||
"app_change_url_identical_domains": "El antiguo y nuevo dominio/url_path son idénticos ('{domain:s} {path:s}'), no se realizarán cambios.",
|
||||
|
@ -200,14 +184,12 @@
|
|||
"app_make_default_location_already_used": "No pudo hacer que la aplicación «{app}» sea la predeterminada en el dominio, «{domain}» ya está siendo usado por la aplicación «{other_app}»",
|
||||
"app_upgrade_app_name": "Ahora actualizando {app}…",
|
||||
"backup_abstract_method": "Este método de respaldo aún no se ha implementado",
|
||||
"backup_applying_method_borg": "Enviando todos los archivos para la copia de seguridad al repositorio de borg-backup…",
|
||||
"backup_applying_method_copy": "Copiando todos los archivos en la copia de respaldo…",
|
||||
"backup_applying_method_custom": "Llamando al método de copia de seguridad personalizado «{method:s}»…",
|
||||
"backup_applying_method_tar": "Creando el archivo TAR de respaldo…",
|
||||
"backup_archive_system_part_not_available": "La parte del sistema «{part:s}» no está disponible en esta copia de seguridad",
|
||||
"backup_archive_writing_error": "No se pudieron añadir los archivos «{source:s}» (llamados en el archivo «{dest:s}») para ser respaldados en el archivo comprimido «{archive:s}»",
|
||||
"backup_ask_for_copying_if_needed": "¿Quiere realizar la copia de seguridad usando {size:s}MB temporalmente? (Se usa este modo ya que algunos archivos no se pudieron preparar usando un método más eficiente.)",
|
||||
"backup_borg_not_implemented": "El método de respaldo de Borg aún no ha sido implementado",
|
||||
"backup_cant_mount_uncompress_archive": "No se pudo montar el archivo descomprimido como protegido contra escritura",
|
||||
"backup_copying_to_organize_the_archive": "Copiando {size:s}MB para organizar el archivo",
|
||||
"backup_couldnt_bind": "No se pudo enlazar {src:s} con {dest:s}.",
|
||||
|
@ -215,7 +197,6 @@
|
|||
"backup_csv_creation_failed": "No se pudo crear el archivo CSV necesario para la restauración",
|
||||
"backup_custom_mount_error": "El método de respaldo personalizado no pudo superar el paso «mount»",
|
||||
"backup_no_uncompress_archive_dir": "No existe tal directorio de archivos sin comprimir",
|
||||
"backup_php5_to_php7_migration_may_fail": "No se pudo convertir su archivo para que sea compatible con PHP 7, puede que no pueda restaurar sus aplicaciones de PHP (motivo: {error:s})",
|
||||
"backup_system_part_failed": "No se pudo respaldar la parte del sistema «{part:s}»",
|
||||
"backup_with_no_backup_script_for_app": "La aplicación «{app:s}» no tiene un guión de respaldo. Omitiendo.",
|
||||
"backup_with_no_restore_script_for_app": "«{app:s}» no tiene un script de restauración, no podá restaurar automáticamente la copia de seguridad de esta aplicación.",
|
||||
|
@ -228,7 +209,6 @@
|
|||
"password_too_simple_2": "La contraseña tiene que ser de al menos 8 caracteres de longitud e incluir un número y caracteres en mayúsculas y minúsculas",
|
||||
"password_too_simple_3": "La contraseña tiene que ser de al menos 8 caracteres de longitud e incluir un número, mayúsculas, minúsculas y caracteres especiales",
|
||||
"password_too_simple_4": "La contraseña tiene que ser de al menos 12 caracteres de longitud e incluir un número, mayúsculas, minúsculas y caracteres especiales",
|
||||
"users_available": "Usuarios disponibles:",
|
||||
"update_apt_cache_warning": "Algo fue mal durante la actualización de la caché de APT (gestor de paquetes de Debian). Aquí tiene un volcado de las líneas de sources.list que podría ayudarle a identificar las líneas problemáticas:\n{sourceslist}",
|
||||
"update_apt_cache_failed": "No se pudo actualizar la caché de APT (gestor de paquetes de Debian). Aquí tiene un volcado de las líneas de sources.list que podría ayudarle a identificar las líneas problemáticas:\n{sourceslist}",
|
||||
"tools_upgrade_special_packages_completed": "Actualización de paquetes de YunoHost completada.\nPulse [Intro] para regresar a la línea de órdenes",
|
||||
|
@ -255,8 +235,6 @@
|
|||
"service_description_rspamd": "Filtra correo no deseado y otras características relacionadas con el correo",
|
||||
"service_description_redis-server": "Una base de datos especializada usada para el acceso rápido de datos, cola de tareas y comunicación entre programas",
|
||||
"service_description_postfix": "Usado para enviar y recibir correos",
|
||||
"service_description_php7.0-fpm": "Ejecuta aplicaciones escritas en PHP con NGINX",
|
||||
"service_description_nslcd": "Maneja la conexión del intérprete de órdenes («shell») de usuario de YunoHost",
|
||||
"service_description_nginx": "Sirve o proporciona acceso a todos los sitios web alojados en su servidor",
|
||||
"service_description_mysql": "Almacena los datos de la aplicación (base de datos SQL)",
|
||||
"service_description_metronome": "Gestionar las cuentas XMPP de mensajería instantánea",
|
||||
|
@ -273,7 +251,6 @@
|
|||
"restore_system_part_failed": "No se pudo restaurar la parte del sistema «{part:s}»",
|
||||
"restore_removing_tmp_dir_failed": "No se pudo eliminar un directorio temporal antiguo",
|
||||
"restore_not_enough_disk_space": "Espacio insuficiente (espacio: {free_space:d} B, espacio necesario: {needed_space:d} B, margen de seguridad: {margin:d} B)",
|
||||
"restore_mounting_archive": "Montando archivo en «{path:s}»",
|
||||
"restore_may_be_not_enough_disk_space": "Parece que su sistema no tiene suficiente espacio libre (libre: {free_space:d} B, espacio necesario: {needed_space:d} B, margen de seguridad: {margin:d} B)",
|
||||
"restore_extracting": "Extrayendo los archivos necesarios para el archivo…",
|
||||
"regenconf_pending_applying": "Aplicando la configuración pendiente para la categoría «{category}»…",
|
||||
|
@ -291,11 +268,8 @@
|
|||
"regenconf_file_kept_back": "Se espera que el archivo de configuración «{conf}» sea eliminado por regen-conf (categoría {category}) pero ha sido retenido.",
|
||||
"regenconf_file_copy_failed": "No se pudo copiar el nuevo archivo de configuración «{new}» a «{conf}»",
|
||||
"regenconf_file_backed_up": "Archivo de configuración «{conf}» respaldado en «{backup}»",
|
||||
"permission_update_nothing_to_do": "No hay permisos para actualizar",
|
||||
"permission_updated": "Actualizado el permiso «{permission:s}»",
|
||||
"permission_generated": "Actualizada la base de datos de permisos",
|
||||
"permission_update_failed": "No se pudo actualizar el permiso '{permission}': {error}",
|
||||
"permission_name_not_valid": "Elija un nombre de permiso permitido para «{permission:s}",
|
||||
"permission_not_found": "No se encontró el permiso «{permission:s}»",
|
||||
"permission_deletion_failed": "No se pudo eliminar el permiso «{permission}»: {error}",
|
||||
"permission_deleted": "Eliminado el permiso «{permission:s}»",
|
||||
|
@ -321,61 +295,6 @@
|
|||
"migrations_dependencies_not_satisfied": "Ejecutar estas migraciones: «{dependencies_id}» antes de migrar {id}.",
|
||||
"migrations_cant_reach_migration_file": "No se pudo acceder a los archivos de migración en la ruta «%s»",
|
||||
"migrations_already_ran": "Esas migraciones ya se han realizado: {ids}",
|
||||
"migration_0011_update_LDAP_schema": "Actualizando el esquema de LDAP…",
|
||||
"migration_0011_update_LDAP_database": "Actualizando la base de datos de LDAP…",
|
||||
"migration_0011_rollback_success": "Sistema revertido.",
|
||||
"migration_0011_migration_failed_trying_to_rollback": "No se pudo migrar… intentando revertir el sistema.",
|
||||
"migration_0011_migrate_permission": "Migrando permisos desde la configuración de las aplicaciones a LDAP…",
|
||||
"migration_0011_LDAP_update_failed": "No se pudo actualizar LDAP. Error: {error:s}",
|
||||
"migration_0011_done": "Migración finalizada. Ahora puede gestionar los grupos de usuarios.",
|
||||
"migration_0011_create_group": "Creando un grupo para cada usuario…",
|
||||
"migration_0011_can_not_backup_before_migration": "El respaldo del sistema no se pudo completar antes de que la migración fallase. Error: {error:s}",
|
||||
"migration_0011_backup_before_migration": "Creando un respaldo de la base de datos de LDAP y de la configuración de las aplicaciones antes de la migración real.",
|
||||
"migration_0009_not_needed": "La migración ya ocurrió de algún modo… (?) Omitiendo.",
|
||||
"migration_0008_no_warning": "Sobre escribir su configuración SSH debería ser seguro ¡aunque esto no se puede prometer! Ejecute la migración para ignorarla. Por otra parte puede omitir la migración, aunque no se recomienda.",
|
||||
"migration_0008_warning": "Si entiende esos avisos y quiere que YunoHost ignore su configuración actual, ejecute la migración. Por otra parte puede omitir la migración, aunque no se recomienda.",
|
||||
"migration_0008_dsa": "• Se desactivará la clave DSA. Así que podría tener que anular un aviso espeluznante de su cliente SSH y volver a comprobar la huella de su servidor;",
|
||||
"migration_0008_root": "• No podrá conectarse como «root» a través de SSH. En su lugar debe usar el usuario «admin»;",
|
||||
"migration_0008_port": "• Tendrá que conectarse usando el puerto 22 en vez de su actual puerto SSH personalizado. No dude en reconfigurarlo;",
|
||||
"migration_0008_general_disclaimer": "Para mejorar la seguridad de su servidor, es recomendable permitir a YunoHost gestionar la configuración de SSH. Su actual configuración de SSH difiere de la recomendación. Si permite a YunoHost reconfigurarla, la manera en la que conecta con su servidor a través de SSH cambiará así:",
|
||||
"migration_0007_cannot_restart": "No se puede reiniciar SSH después de intentar cancelar la migración número 6.",
|
||||
"migration_0007_cancelled": "No se pudo mejorar el modo en el que se gestiona su configuración de SSH.",
|
||||
"migration_0006_disclaimer": "YunoHost espera ahora que las contraseñas de «admin» y «root» estén sincronizadas. Esta migración reemplaza su contraseña de «root» por la contraseña de «admin».",
|
||||
"migration_0005_not_enough_space": "Tenga suficiente espacio libre disponible en {path} para ejecutar la migración.",
|
||||
"migration_0005_postgresql_96_not_installed": "PostgreSQL 9.4 está instalado pero no PostgreSQL 9.6. Algo raro podría haber ocurrido en su sistema:(…",
|
||||
"migration_0005_postgresql_94_not_installed": "PostgreSQL no estaba instalado en su sistema. Nada que hacer.",
|
||||
"migration_0003_modified_files": "Tenga en cuenta que se encontró que los siguientes archivos fueron modificados manualmente y podrían ser sobrescritos después de la actualización: {manually_modified_files}",
|
||||
"migration_0003_problematic_apps_warning": "Tenga en cuenta que se detectaron las siguientes aplicaciones instaladas posiblemente problemáticas. Parece que no se instalaron desde un catálogo de aplicaciones, o no se marcan como \"en funcionamiento\". En consecuencia, no se puede garantizar que seguirán funcionando después de la actualización: {problematic_apps}",
|
||||
"migration_0003_general_warning": "Tenga en cuenta que esta migración es una operación delicada. El equipo de YunoHost ha hecho todo lo posible para revisarla y probarla, pero la migración aún podría romper parte del sistema o de sus aplicaciones.\n\nPor lo tanto, se recomienda que:\n - Realice una copia de seguridad de cualquier dato crítico o aplicación. Más información en https://yunohost.org/backup;\n - Tenga paciencia tras iniciar la migración: dependiendo de su conexión a Internet y de su hardware, podría tardar unas cuantas horas hasta que todo se actualice.\n\nAdemás, el puerto para SMTP usado por los clientes de correo externos (como Thunderbird o K9-Mail) cambió de 465 (SSL/TLS) a 587 (STARTTLS). El antiguo puerto (465) se cerrará automáticamente y el nuevo puerto (587) se abrirá en el cortafuegos. Todos los usuarios *tendrán* que adaptar la configuración de sus clientes de correo por lo tanto.",
|
||||
"migration_0003_still_on_jessie_after_main_upgrade": "Algo fue mal durante la actualización principal: ⸘el sistema está aún en Jessie‽ Para investigar el problema, vea {log}:s…",
|
||||
"migration_0003_system_not_fully_up_to_date": "Su sistema no está totalmente actualizado. Realice una actualización normal antes de ejecutar la migración a Stretch.",
|
||||
"migration_0003_not_jessie": "¡La distribución de Debian actual no es Jessie!",
|
||||
"migration_0003_yunohost_upgrade": "Iniciando la actualización del paquete YunoHost… la actualización ocurrirá inmediatamente después de que la migración finalizará. Después de que la operación esté completada, podría tener que iniciar sesión en la página de administración de nuevo.",
|
||||
"migration_0003_restoring_origin_nginx_conf": "Su archivo /etc/nginx/nginx.conf ha sido editado. La migración lo devolverá a su estado original… El archivo anterior estará disponible como {backup_dest}.",
|
||||
"migration_0003_fail2ban_upgrade": "Iniciando la actualización de Fail2Ban…",
|
||||
"migration_0003_main_upgrade": "Iniciando la actualización principal…",
|
||||
"migration_0003_patching_sources_list": "Corrigiendo «sources.lists»…",
|
||||
"migration_0003_start": "Iniciando migración a Stretch. El registro estará disponible en {logfile}.",
|
||||
"migration_description_0012_postgresql_password_to_md5_authentication": "Forzar a la autentificación de PostgreSQL a usar MD5 para las conexiones locales",
|
||||
"migration_description_0011_setup_group_permission": "Configurar grupo de usuario y permisos para aplicaciones y servicios",
|
||||
"migration_description_0010_migrate_to_apps_json": "Elimine los catálogos de aplicaciones obsoletas y use la nueva lista unificada de 'apps.json' en su lugar (desactualizada, reemplazada por la migración 13)",
|
||||
"migration_description_0009_decouple_regenconf_from_services": "Separar el mecanismo «regen-conf» de los servicios",
|
||||
"migration_description_0008_ssh_conf_managed_by_yunohost_step2": "Permitir que la configuración de SSH la gestione YunoHost (paso 2, manual)",
|
||||
"migration_description_0007_ssh_conf_managed_by_yunohost_step1": "Permitir que la configuración de SSH la gestione YunoHost (paso 1, automático)",
|
||||
"migration_description_0006_sync_admin_and_root_passwords": "Sincronizar las contraseñas de «admin» y «root»",
|
||||
"migration_description_0005_postgresql_9p4_to_9p6": "Migrar las bases de datos de PostgreSQL 9.4 a 9.6",
|
||||
"migration_description_0004_php5_to_php7_pools": "Reconfigurar los «pools» de PHP para usar PHP 7 en vez de 5",
|
||||
"migration_description_0003_migrate_to_stretch": "Actualizar el sistema a Debian Stretch y YunoHost 3.0",
|
||||
"migration_description_0002_migrate_to_tsig_sha256": "Mejore la seguridad de las actualizaciones de TSIG de DynDNS usando SHA-512 en vez de MD5",
|
||||
"migration_description_0001_change_cert_group_to_sslcert": "Cambiar los permisos de grupo de certificados de «metronome» a «ssl-cert»",
|
||||
"migrate_tsig_not_needed": "Parece que no usa un dominio de DynDNS, así que no es necesario migrar.",
|
||||
"migrate_tsig_wait_4": "30 segundos…",
|
||||
"migrate_tsig_wait_3": "1 min. …",
|
||||
"migrate_tsig_wait_2": "2 min. …",
|
||||
"migrate_tsig_wait": "Esperando tres minutos para que el servidor de DynDNS tenga en cuenta la nueva clave…",
|
||||
"migrate_tsig_start": "Detectado algoritmo de clave insuficientemente seguro para la firma TSIG del dominio «{domain}», iniciando migración al más seguro HMAC-SHA-512",
|
||||
"migrate_tsig_failed": "No se pudo migrar el dominio de DynDNS «{domain}» a HMAC-SHA-512, revertiendo. Error: {error_code}, {error}",
|
||||
"migrate_tsig_end": "Terminada la migración a HMAC-SHA-512",
|
||||
"mail_unavailable": "Esta dirección de correo está reservada y será asignada automáticamente al primer usuario",
|
||||
"mailbox_disabled": "Correo desactivado para usuario {user:s}",
|
||||
"log_tools_reboot": "Reiniciar el servidor",
|
||||
|
@ -412,7 +331,6 @@
|
|||
"log_link_to_failed_log": "No se pudo completar la operación «{desc}». Para obtener ayuda, proporcione el registro completo de esta operación <a href=\"#/tools/logs/{name}\">pulsando aquí</a>",
|
||||
"log_help_to_get_log": "Para ver el registro de la operación «{desc}», ejecute la orden «yunohost log show {name}{name}»",
|
||||
"log_link_to_log": "Registro completo de esta operación: «<a href=\"#/tools/logs/{name}\" style=\"text-decoration:underline\">{desc}</a>»",
|
||||
"log_category_404": "La categoría de registro «{category}» no existe",
|
||||
"log_corrupted_md_file": "El archivo de metadatos YAML asociado con el registro está dañado: «{md_file}\nError: {error}»",
|
||||
"hook_json_return_error": "No se pudo leer la respuesta del gancho {path:s}. Error: {msg:s}. Contenido sin procesar: {raw_content}",
|
||||
"group_update_failed": "No se pudo actualizar el grupo «{group}»: {error}",
|
||||
|
@ -431,10 +349,6 @@
|
|||
"global_settings_setting_security_password_user_strength": "Seguridad de la contraseña de usuario",
|
||||
"global_settings_setting_security_password_admin_strength": "Seguridad de la contraseña del administrador",
|
||||
"global_settings_setting_security_nginx_compatibility": "Compromiso entre compatibilidad y seguridad para el servidor web NGINX. Afecta al cifrado (y otros aspectos relacionados con la seguridad)",
|
||||
"global_settings_setting_example_string": "Ejemplo de opción de cadena",
|
||||
"global_settings_setting_example_int": "Ejemplo de opción «int»",
|
||||
"global_settings_setting_example_enum": "Ejemplo de opción «enum»",
|
||||
"global_settings_setting_example_bool": "Ejemplo de opción booleana",
|
||||
"global_settings_reset_success": "Respaldada la configuración previa en {path:s}",
|
||||
"global_settings_key_doesnt_exists": "La clave «{settings_key:s}» no existe en la configuración global, puede ver todas las claves disponibles ejecutando «yunohost settings list»",
|
||||
"global_settings_cant_write_settings": "No se pudo guardar el archivo de configuración, motivo: {reason:s}",
|
||||
|
@ -457,7 +371,6 @@
|
|||
"backup_method_tar_finished": "Creado el archivo TAR de respaldo",
|
||||
"backup_method_custom_finished": "Terminado el método «{method:s}» de respaldo personalizado",
|
||||
"backup_method_copy_finished": "Terminada la copia de seguridad",
|
||||
"backup_method_borg_finished": "Terminado el respaldo en Borg",
|
||||
"backup_custom_backup_error": "El método de respaldo personalizado no pudo superar el paso de «copia de seguridad»",
|
||||
"backup_actually_backuping": "Creando un archivo de respaldo de los archivos obtenidos…",
|
||||
"ask_new_path": "Nueva ruta",
|
||||
|
@ -486,7 +399,6 @@
|
|||
"log_user_group_create": "Crear grupo «{}»",
|
||||
"log_user_permission_update": "Actualizar los accesos para el permiso «{}»",
|
||||
"log_user_permission_reset": "Restablecer permiso «{}»",
|
||||
"migration_0011_failed_to_remove_stale_object": "No se pudo eliminar el objeto obsoleto {dn}: {error}",
|
||||
"permission_already_allowed": "El grupo «{group}» ya tiene el permiso «{permission}» activado",
|
||||
"permission_already_disallowed": "El grupo '{group}' ya tiene el permiso '{permission}' deshabilitado",
|
||||
"permission_cannot_remove_main": "No está permitido eliminar un permiso principal",
|
||||
|
@ -498,7 +410,6 @@
|
|||
"group_cannot_edit_visitors": "El grupo «visitors» no se puede editar manualmente. Es un grupo especial que representa a los visitantes anónimos",
|
||||
"group_cannot_edit_primary_group": "El grupo «{group}» no se puede editar manualmente. Es el grupo primario destinado a contener solo un usuario específico.",
|
||||
"log_permission_url": "Actualizar la URL relacionada con el permiso «{}»",
|
||||
"migration_0011_slapd_config_will_be_overwritten": "Parece que ha editado manualmente la configuración de slapd. Para esta migración crítica, YunoHost necesita forzar la actualización de la configuración de slapd. Los archivos originales se respaldarán en {conf_backup_folder}.",
|
||||
"permission_already_up_to_date": "El permiso no se ha actualizado porque las peticiones de incorporación o eliminación ya coinciden con el estado actual.",
|
||||
"permission_currently_allowed_for_all_users": "Este permiso se concede actualmente a todos los usuarios además de los otros grupos. Probablemente quiere o eliminar el permiso de «all_users» o eliminar los otros grupos a los que está otorgado actualmente.",
|
||||
"permission_require_account": "El permiso {permission} solo tiene sentido para usuarios con una cuenta y, por lo tanto, no se puede activar para visitantes.",
|
||||
|
@ -511,8 +422,6 @@
|
|||
"diagnosis_failed_for_category": "Error de diagnóstico para la categoría '{category}': {error}",
|
||||
"diagnosis_cache_still_valid": "(Caché aún válida para el diagnóstico de {category}. ¡No se volvera a comprobar de momento!)",
|
||||
"diagnosis_found_errors_and_warnings": "¡Encontrado(s) error(es) significativo(s) {errors} (y aviso(s) {warnings}) relacionado(s) con {category}!",
|
||||
"diagnosis_display_tip_web": "Puede ir a la sección de diagnóstico (en la pantalla principal) para ver los problemas encontrados.",
|
||||
"diagnosis_display_tip_cli": "Puede ejecutar «yunohost diagnosis show --issues --human-readable» para mostrar los problemas encontrados.",
|
||||
"apps_catalog_init_success": "¡Sistema de catálogo de aplicaciones inicializado!",
|
||||
"apps_catalog_updating": "Actualizando el catálogo de aplicaciones…",
|
||||
"apps_catalog_failed_to_download": "No se puede descargar el catálogo de aplicaciones {apps_catalog}: {error}",
|
||||
|
@ -553,14 +462,10 @@
|
|||
"diagnosis_ram_ok": "El sistema aun tiene {available} ({available_percent}%) de RAM de un total de {total}.",
|
||||
"diagnosis_swap_none": "El sistema no tiene mas espacio de intercambio. Considera agregar por lo menos {recommended} de espacio de intercambio para evitar que el sistema se quede sin memoria.",
|
||||
"diagnosis_swap_notsomuch": "Al sistema le queda solamente {total} de espacio de intercambio. Considera agregar al menos {recommended} para evitar que el sistema se quede sin memoria.",
|
||||
"diagnosis_mail_ougoing_port_25_ok": "El puerto de salida 25 no esta bloqueado y los correos electrónicos pueden ser enviados a otros servidores.",
|
||||
"diagnosis_mail_outgoing_port_25_blocked": "El puerto de salida 25 parece estar bloqueado. Intenta desbloquearlo con el panel de configuración de tu proveedor de servicios de Internet (o proveedor de halbergue). Mientras tanto, el servidor no podrá enviar correos electrónicos a otros servidores.",
|
||||
"diagnosis_regenconf_allgood": "Todos los archivos de configuración están en linea con la configuración recomendada!",
|
||||
"diagnosis_regenconf_manually_modified": "El archivo de configuración {file} parece que ha sido modificado manualmente.",
|
||||
"diagnosis_regenconf_manually_modified_details": "¡Esto probablemente esta BIEN si sabes lo que estás haciendo! YunoHost dejará de actualizar este fichero automáticamente... Pero ten en cuenta que las actualizaciones de YunoHost pueden contener importantes cambios que están recomendados. Si quieres puedes comprobar las diferencias mediante <cmd>yunohost tools regen-conf {category} --dry-run --with-diff</cmd> o puedes forzar el volver a las opciones recomendadas mediante el comando <cmd>yunohost tools regen-conf {category} --force</cmd>",
|
||||
"diagnosis_regenconf_manually_modified_debian": "El archivos de configuración {file} fue modificado manualmente comparado con el valor predeterminado de Debian.",
|
||||
"diagnosis_regenconf_manually_modified_debian_details": "Esto este probablemente BIEN, pero igual no lo pierdas de vista...",
|
||||
"diagnosis_security_all_good": "Ninguna vulnerabilidad critica de seguridad fue encontrada.",
|
||||
"diagnosis_security_vulnerable_to_meltdown": "Pareces vulnerable a el colapso de vulnerabilidad critica de seguridad",
|
||||
"diagnosis_description_basesystem": "Sistema de base",
|
||||
"diagnosis_description_ip": "Conectividad a Internet",
|
||||
|
@ -574,14 +479,10 @@
|
|||
"diagnosis_ports_unreachable": "El puerto {port} no es accesible desde internet.",
|
||||
"diagnosis_ports_could_not_diagnose": "No se puede comprobar si los puertos están accesibles desde el exterior.",
|
||||
"diagnosis_ports_could_not_diagnose_details": "Error: {error}",
|
||||
"diagnosis_description_security": "Validación de seguridad",
|
||||
"diagnosis_description_regenconf": "Configuraciones de sistema",
|
||||
"diagnosis_description_mail": "Correo electrónico",
|
||||
"diagnosis_description_web": "Web",
|
||||
"diagnosis_basesystem_hardware_board": "El modelo de placa del servidor es {model}",
|
||||
"diagnosis_basesystem_hardware": "La arquitectura material del servidor es {virt} {arch}",
|
||||
"migration_description_0014_remove_app_status_json": "Supresión del archivo de aplicaciones heredado status.json",
|
||||
"migration_description_0013_futureproof_apps_catalog_system": "Migración hacia el nuevo sistema de catalogo de aplicación a prueba del futuro",
|
||||
"log_domain_main_domain": "Hacer de '{}' el dominio principal",
|
||||
"log_app_config_apply": "Aplica la configuración de la aplicación '{}'",
|
||||
"log_app_config_show_panel": "Muestra el panel de configuración de la aplicación '{}'",
|
||||
|
@ -689,4 +590,4 @@
|
|||
"diagnosis_basesystem_hardware_model": "El modelo de servidor es {model}",
|
||||
"additional_urls_already_removed": "La URL adicional «{url:s}» ya se ha eliminado para el permiso «{permission:s}»",
|
||||
"additional_urls_already_added": "La URL adicional «{url:s}» ya se ha añadido para el permiso «{permission:s}»"
|
||||
}
|
||||
}
|
|
@ -1,3 +1,3 @@
|
|||
{
|
||||
"password_too_simple_1": "Pasahitzak gutxienez 8 karaktere izan behar ditu"
|
||||
}
|
||||
}
|
|
@ -22,7 +22,6 @@
|
|||
"app_unsupported_remote_type": "Ce type de commande à distance utilisé pour cette application n’est pas supporté",
|
||||
"app_upgrade_failed": "Impossible de mettre à jour {app:s} : {error}",
|
||||
"app_upgraded": "{app:s} mis à jour",
|
||||
"ask_email": "Adresse de courriel",
|
||||
"ask_firstname": "Prénom",
|
||||
"ask_lastname": "Nom",
|
||||
"ask_main_domain": "Domaine principal",
|
||||
|
@ -39,7 +38,6 @@
|
|||
"backup_delete_error": "Impossible de supprimer '{path:s}'",
|
||||
"backup_deleted": "La sauvegarde a été supprimée",
|
||||
"backup_hook_unknown": "Script de sauvegarde '{hook:s}' inconnu",
|
||||
"backup_invalid_archive": "Archive de sauvegarde invalide",
|
||||
"backup_nothings_done": "Il n’y a rien à sauvegarder",
|
||||
"backup_output_directory_forbidden": "Choisissez un répertoire de destination différent. Les sauvegardes ne peuvent pas être créées dans les sous-dossiers /bin, /boot, /dev, /etc, /lib, /root, /run, /sbin, /sys, /usr, /var ou /home/yunohost.backup/archives",
|
||||
"backup_output_directory_not_empty": "Le répertoire de destination n’est pas vide",
|
||||
|
@ -58,9 +56,6 @@
|
|||
"domain_unknown": "Domaine inconnu",
|
||||
"done": "Terminé",
|
||||
"downloading": "Téléchargement en cours …",
|
||||
"dyndns_cron_installed": "La tâche cron pour le domaine DynDNS a été créée",
|
||||
"dyndns_cron_remove_failed": "Impossible de supprimer la tâche cron DynDNS parce que : {error}",
|
||||
"dyndns_cron_removed": "La tâche cron pour le domaine DynDNS a été enlevée",
|
||||
"dyndns_ip_update_failed": "Impossible de mettre à jour l’adresse IP sur le domaine DynDNS",
|
||||
"dyndns_ip_updated": "Mise à jour de votre IP pour le domaine DynDNS",
|
||||
"dyndns_key_generating": "Génération de la clé DNS..., cela peut prendre un certain temps.",
|
||||
|
@ -69,8 +64,6 @@
|
|||
"dyndns_registered": "Domaine DynDNS enregistré",
|
||||
"dyndns_registration_failed": "Impossible d’enregistrer le domaine DynDNS : {error:s}",
|
||||
"dyndns_unavailable": "Le domaine {domain:s} est indisponible.",
|
||||
"executing_command": "Exécution de la commande '{command:s}'...",
|
||||
"executing_script": "Exécution du script '{script:s}'...",
|
||||
"extracting": "Extraction en cours...",
|
||||
"field_invalid": "Champ incorrect : '{:s}'",
|
||||
"firewall_reload_failed": "Impossible de recharger le pare-feu",
|
||||
|
@ -90,9 +83,7 @@
|
|||
"mail_forward_remove_failed": "Impossible de supprimer le courriel de transfert '{mail:s}'",
|
||||
"main_domain_change_failed": "Impossible de modifier le domaine principal",
|
||||
"main_domain_changed": "Le domaine principal a été modifié",
|
||||
"no_internet_connection": "Le serveur n’est pas connecté à Internet",
|
||||
"not_enough_disk_space": "L’espace disque est insuffisant sur '{path:s}'",
|
||||
"package_unknown": "Le paquet '{pkgname}' est inconnu",
|
||||
"packages_upgrade_failed": "Impossible de mettre à jour tous les paquets",
|
||||
"pattern_backup_archive_name": "Doit être un nom de fichier valide avec un maximum de 30 caractères, et composé de caractères alphanumériques et -_. uniquement",
|
||||
"pattern_domain": "Doit être un nom de domaine valide (ex : mon-domaine.fr)",
|
||||
|
@ -156,18 +147,15 @@
|
|||
"user_update_failed": "Impossible de mettre à jour l’utilisateur {user} : {error}",
|
||||
"user_updated": "L’utilisateur a été modifié",
|
||||
"yunohost_already_installed": "YunoHost est déjà installé",
|
||||
"yunohost_ca_creation_failed": "Impossible de créer l’autorité de certification",
|
||||
"yunohost_configured": "YunoHost est maintenant configuré",
|
||||
"yunohost_installing": "L’installation de YunoHost est en cours...",
|
||||
"yunohost_not_installed": "YunoHost n’est pas correctement installé. Veuillez exécuter 'yunohost tools postinstall'",
|
||||
"certmanager_attempt_to_replace_valid_cert": "Vous êtes en train de vouloir remplacer un certificat correct et valide pour le domaine {domain:s} ! (Utilisez --force pour contourner cela)",
|
||||
"certmanager_domain_unknown": "Domaine {domain:s} inconnu",
|
||||
"certmanager_domain_cert_not_selfsigned": "Le certificat du domaine {domain:s} n’est pas auto-signé. Voulez-vous vraiment le remplacer ? (Utilisez --force pour cela)",
|
||||
"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 émis par Let’s Encrypt. Impossible de le renouveler automatiquement !",
|
||||
"certmanager_attempt_to_renew_valid_cert": "Le certificat pour le domaine {domain:s} n’est pas sur le point d’expirer ! (Vous pouvez utiliser --force si vous savez ce que vous faites)",
|
||||
"certmanager_domain_http_not_working": "Le domaine {domain:s} ne semble pas être accessible via HTTP. Merci de vérifier la catégorie 'Web' dans le diagnostic pour plus d'informations. (Ou si vous savez ce que vous faites, utilisez '--no-checks' pour désactiver la vérification.)",
|
||||
"certmanager_error_no_A_record": "Aucun enregistrement DNS 'A' n’a été trouvé pour {domain:s}. Vous devez faire pointer votre nom de domaine vers votre machine pour être en mesure 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 du domaine {domain:s} est différent de l’adresse IP de ce serveur. Pour plus d'informations, veuillez consulter la catégorie \"Enregistrements DNS\" dans la section diagnostic. Si vous avez récemment modifié votre enregistrement 'A', veuillez attendre sa propagation (des vérificateurs de propagation DNS 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}), la cause est : {reason:s}",
|
||||
"certmanager_cert_install_success_selfsigned": "Le certificat auto-signé est maintenant installé pour le domaine « {domain:s} »",
|
||||
|
@ -175,7 +163,6 @@
|
|||
"certmanager_cert_renew_success": "Certificat Let’s Encrypt renouvelé pour le domaine '{domain:s}'",
|
||||
"certmanager_cert_signing_failed": "Impossible de signer le nouveau certificat",
|
||||
"certmanager_no_cert_file": "Impossible de lire le fichier du certificat pour le domaine {domain:s} (fichier : {file:s})",
|
||||
"certmanager_conflicting_nginx_file": "Impossible de préparer le domaine pour le défi ACME : le fichier de configuration NGINX {filepath:s} est en conflit et doit être préalablement retiré",
|
||||
"certmanager_hit_rate_limit": "Trop de certificats ont déjà été émis récemment pour ce même ensemble de domaines {domain:s}. Veuillez réessayer plus tard. Lisez https://letsencrypt.org/docs/rate-limits/ pour obtenir plus de détails sur les ratios et limitations",
|
||||
"ldap_init_failed_to_create_admin": "L’initialisation de l’annuaire LDAP n’a pas réussi à créer l’utilisateur admin",
|
||||
"domain_cannot_remove_main": "Vous ne pouvez pas supprimer '{domain:s}' car il s’agit du domaine principal. Vous devez d’abord définir un autre domaine comme domaine principal à l’aide de 'yunohost domain main-domain -n <another-domain>', voici la liste des domaines candidats : {other_domains:s}",
|
||||
|
@ -185,10 +172,7 @@
|
|||
"domains_available": "Domaines disponibles :",
|
||||
"backup_archive_broken_link": "Impossible d’accéder à l’archive de sauvegarde (lien invalide vers {path:s})",
|
||||
"certmanager_acme_not_configured_for_domain": "Le challenge ACME n'a pas pu être validé pour le domaine {domain} pour le moment car le code de la configuration nginx est manquant... Merci de vérifier que votre configuration nginx est à jour avec la commande: `yunohost tools regen-conf nginx --dry-run --with-diff`.",
|
||||
"certmanager_http_check_timeout": "Expiration du délai lorsque le serveur a essayé de se contacter lui-même via HTTP en utilisant l’adresse IP public {ip:s} du domaine {domain:s}. Vous rencontrez peut-être un problème d’hairpinning ou alors le pare-feu/routeur en amont de votre serveur est mal configuré.",
|
||||
"certmanager_couldnt_fetch_intermediate_cert": "Expiration du délai lors de la tentative de récupération du certificat intermédiaire depuis Let’s Encrypt. L’installation ou le renouvellement du certificat a été annulé. Veuillez réessayer plus tard.",
|
||||
"domain_hostname_failed": "Échec de l’utilisation d’un nouveau nom d’hôte. Cela pourrait causer des soucis plus tard (cela n’en causera peut-être pas).",
|
||||
"yunohost_ca_creation_success": "L'autorité de certification locale a été créée.",
|
||||
"app_already_installed_cant_change_url": "Cette application est déjà installée. L’URL ne peut pas être changé simplement par cette fonction. Vérifiez si cela est disponible avec `app changeurl`.",
|
||||
"app_change_url_failed_nginx_reload": "Le redémarrage de NGINX a échoué. Voici la sortie de 'nginx -t' :\n{nginx_errors:s}",
|
||||
"app_change_url_identical_domains": "L’ancien et le nouveau couple domaine/chemin_de_l’URL sont identiques pour ('{domain:s}{path:s}'), rien à faire.",
|
||||
|
@ -202,21 +186,15 @@
|
|||
"global_settings_cant_write_settings": "Échec d’écriture du fichier de configurations car : {reason:s}",
|
||||
"global_settings_key_doesnt_exists": "La clef '{settings_key:s}' n’existe pas dans les configurations générales, vous pouvez voir toutes les clefs disponibles en saisissant 'yunohost settings list'",
|
||||
"global_settings_reset_success": "Vos configurations précédentes ont été sauvegardées dans {path:s}",
|
||||
"global_settings_setting_example_bool": "Exemple d’option booléenne",
|
||||
"global_settings_setting_example_int": "Exemple d’option de type entier",
|
||||
"global_settings_setting_example_string": "Exemple d’option de type chaîne",
|
||||
"global_settings_setting_example_enum": "Exemple d’option de type énumération",
|
||||
"global_settings_unknown_type": "Situation inattendue : la configuration {setting:s} semble avoir le type {unknown_type:s} mais celui-ci n’est pas pris en charge par le système.",
|
||||
"global_settings_unknown_setting_from_settings_file": "Clé inconnue dans les paramètres : '{setting_key:s}', rejet de cette clé et sauvegarde de celle-ci dans /etc/yunohost/unkown_settings.json",
|
||||
"backup_abstract_method": "Cette méthode de sauvegarde reste à implémenter",
|
||||
"backup_applying_method_tar": "Création de l’archive TAR de la sauvegarde...",
|
||||
"backup_applying_method_copy": "Copie de tous les fichiers à sauvegarder...",
|
||||
"backup_applying_method_borg": "Envoi de tous les fichiers à sauvegarder dans le répertoire borg-backup...",
|
||||
"backup_applying_method_custom": "Appel de la méthode de sauvegarde personnalisée '{method:s}'...",
|
||||
"backup_archive_system_part_not_available": "La partie '{part:s}' du système n’est pas disponible dans cette sauvegarde",
|
||||
"backup_archive_writing_error": "Impossible d’ajouter des fichiers '{source:s}' (nommés dans l’archive : '{dest:s}') à sauvegarder dans l’archive compressée '{archive:s}'",
|
||||
"backup_ask_for_copying_if_needed": "Voulez-vous effectuer la sauvegarde en utilisant {size:s}Mo temporairement ? (Cette méthode est utilisée car certains fichiers n’ont pas pu être préparés avec une méthode plus efficace.)",
|
||||
"backup_borg_not_implemented": "La méthode de sauvegarde Borg n’est pas encore implémentée",
|
||||
"backup_cant_mount_uncompress_archive": "Impossible de monter en lecture seule le dossier de l’archive décompressée",
|
||||
"backup_copying_to_organize_the_archive": "Copie de {size:s} Mo pour organiser l’archive",
|
||||
"backup_csv_creation_failed": "Impossible de créer le fichier CSV nécessaire à la restauration",
|
||||
|
@ -226,7 +204,6 @@
|
|||
"backup_no_uncompress_archive_dir": "Ce dossier d’archive décompressée n’existe pas",
|
||||
"backup_method_tar_finished": "L’archive TAR de la sauvegarde a été créée",
|
||||
"backup_method_copy_finished": "La copie de la sauvegarde est terminée",
|
||||
"backup_method_borg_finished": "La sauvegarde dans Borg est terminée",
|
||||
"backup_method_custom_finished": "La méthode de sauvegarde personnalisée '{method:s}' est terminée",
|
||||
"backup_system_part_failed": "Impossible de sauvegarder la partie '{part:s}' du système",
|
||||
"backup_unable_to_organize_files": "Impossible d’utiliser la méthode rapide pour organiser les fichiers dans l’archive",
|
||||
|
@ -265,7 +242,6 @@
|
|||
"service_description_metronome": "Gère les comptes de messagerie instantanée XMPP",
|
||||
"service_description_mysql": "Stocke les données des applications (bases de données SQL)",
|
||||
"service_description_nginx": "Sert ou permet l’accès à tous les sites web hébergés sur votre serveur",
|
||||
"service_description_nslcd": "Gère la connexion en ligne de commande des utilisateurs YunoHost",
|
||||
"service_description_postfix": "Utilisé pour envoyer et recevoir des courriels",
|
||||
"service_description_redis-server": "Une base de données spécialisée utilisée pour l’accès rapide aux données, les files d’attentes et la communication entre les programmes",
|
||||
"service_description_rspamd": "Filtre le pourriel, et d’autres fonctionnalités liées au courriel",
|
||||
|
@ -275,11 +251,9 @@
|
|||
"service_description_yunohost-firewall": "Gère l’ouverture et la fermeture des ports de connexion aux services",
|
||||
"experimental_feature": "Attention : cette fonctionnalité est expérimentale et ne doit pas être considérée comme stable, vous ne devriez pas l’utiliser à moins que vous ne sachiez ce que vous faites.",
|
||||
"log_corrupted_md_file": "Le fichier YAML de métadonnées associé aux logs est corrompu : '{md_file}'\nErreur : {error}",
|
||||
"log_category_404": "Le journal de la catégorie '{category}' n’existe pas",
|
||||
"log_link_to_log": "Journal complet de cette opération : '<a href=\"#/tools/logs/{name}\" style=\"text-decoration:underline\"> {desc} </a>'",
|
||||
"log_help_to_get_log": "Pour voir le journal de cette opération '{desc}', utilisez la commande 'yunohost log show {name}{name}'",
|
||||
"log_link_to_failed_log": "L’opération '{desc}' a échoué ! Pour obtenir de l’aide, merci de partager le journal de l’opération en <a href=\"#/tools/logs/{name}\">cliquant ici</a>",
|
||||
"backup_php5_to_php7_migration_may_fail": "Impossible de convertir votre archive pour prendre en charge PHP 7, vous pourriez ne plus pouvoir restaurer vos applications PHP (cause : {error:s})",
|
||||
"log_help_to_get_failed_log": "L’opération '{desc}' a échoué ! Pour obtenir de l’aide, merci de partager le journal de l’opération en utilisant la commande 'yunohost log share {name}'",
|
||||
"log_does_exists": "Il n’y a pas de journal des opérations avec le nom '{log}', utilisez 'yunohost log list' pour voir tous les journaux d’opérations disponibles",
|
||||
"log_operation_unit_unclosed_properly": "L’opération ne s’est pas terminée correctement",
|
||||
|
@ -310,17 +284,8 @@
|
|||
"log_tools_shutdown": "Éteindre votre serveur",
|
||||
"log_tools_reboot": "Redémarrer votre serveur",
|
||||
"mail_unavailable": "Cette adresse de courriel est réservée et doit être automatiquement attribuée au tout premier utilisateur",
|
||||
"migration_description_0004_php5_to_php7_pools": "Reconfigurer l'ensemble PHP pour utiliser PHP 7 au lieu de PHP 5",
|
||||
"migration_description_0005_postgresql_9p4_to_9p6": "Migration des bases de données de PostgreSQL 9.4 vers PostgreSQL 9.6",
|
||||
"migration_0005_postgresql_94_not_installed": "PostgreSQL n’a pas été installé sur votre système. Rien à faire !",
|
||||
"migration_0005_postgresql_96_not_installed": "PostgreSQL 9.4 est installé, mais pas PostgreSQL 9.6 ‽ Quelque chose de bizarre aurait pu se produire sur votre système :(…",
|
||||
"migration_0005_not_enough_space": "Laissez suffisamment d’espace disponible dans {path} pour exécuter la migration.",
|
||||
"service_description_php7.0-fpm": "Exécute des applications écrites en PHP avec NGINX",
|
||||
"users_available": "Liste des utilisateurs disponibles :",
|
||||
"good_practices_about_admin_password": "Vous êtes sur le point de définir un nouveau mot de passe d'administration. Le mot de passe doit comporter au moins 8 caractères, bien qu'il soit recommandé d'utiliser un mot de passe plus long (c'est-à-dire une phrase de passe) et / ou d'utiliser une variation de caractères (majuscule, minuscule, chiffres et caractères spéciaux).",
|
||||
"good_practices_about_user_password": "Vous êtes sur le point de définir un nouveau mot de passe utilisateur. Le mot de passe doit comporter au moins 8 caractères, bien qu'il soit recommandé d'utiliser un mot de passe plus long (c'est-à-dire une phrase secrète) et / ou une variation de caractères (majuscule, minuscule, chiffres et caractères spéciaux).",
|
||||
"migration_description_0006_sync_admin_and_root_passwords": "Synchroniser les mots de passe admin et root",
|
||||
"migration_0006_disclaimer": "YunoHost s’attend maintenant à ce que les mots de passe administrateur et racine soient synchronisés. Cette migration remplace votre mot de passe root par le mot de passe administrateur.",
|
||||
"password_listed": "Ce mot de passe fait partie des mots de passe les plus utilisés au monde. Veuillez choisir quelque chose de plus unique.",
|
||||
"password_too_simple_1": "Le mot de passe doit comporter au moins 8 caractères",
|
||||
"password_too_simple_2": "Le mot de passe doit comporter au moins 8 caractères et contenir des chiffres, des majuscules et des minuscules",
|
||||
|
@ -348,17 +313,6 @@
|
|||
"global_settings_setting_security_password_user_strength": "Qualité du mot de passe de l’utilisateur",
|
||||
"global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Autoriser l’utilisation de la clé hôte DSA (obsolète) pour la configuration du service SSH",
|
||||
"hook_json_return_error": "Échec de la lecture au retour du script {path:s}. Erreur : {msg:s}. Contenu brut : {raw_content}",
|
||||
"migration_description_0007_ssh_conf_managed_by_yunohost_step1": "La configuration SSH sera gérée par YunoHost (étape 1, automatique)",
|
||||
"migration_description_0008_ssh_conf_managed_by_yunohost_step2": "La configuration SSH sera gérée par YunoHost (étape 2, manuelle)",
|
||||
"migration_0007_cancelled": "Impossible d’améliorer la gestion de votre configuration SSH.",
|
||||
"migration_0007_cannot_restart": "SSH ne peut pas être redémarré après avoir essayé d’annuler la migration numéro 6.",
|
||||
"migration_0008_general_disclaimer": "Pour améliorer la sécurité de votre serveur, il est recommandé de laisser YunoHost gérer la configuration SSH. Votre configuration SSH actuelle diffère de la configuration recommandée. Si vous laissez YunoHost la reconfigurer, la façon dont vous vous connectez à votre serveur via SSH changera comme suit :",
|
||||
"migration_0008_port": "- Vous devrez vous connecter en utilisant le port 22 au lieu de votre actuel port SSH personnalisé. N’hésitez pas à le reconfigurer ;",
|
||||
"migration_0008_root": "- Vous ne pourrez pas vous connecter en tant que root via SSH. Au lieu de cela, vous devrez utiliser l’utilisateur admin ;",
|
||||
"migration_0008_dsa": "- La clé DSA sera désactivée. Par conséquent, il se peut que vous ayez besoin d’invalider un avertissement effrayant de votre client SSH afin de revérifier l’empreinte de votre serveur ;",
|
||||
"migration_0008_warning": "Si vous comprenez ces avertissements et souhaitez que YunoHost écrase votre configuration actuelle, exécutez la migration. Sinon, vous pouvez également ignorer la migration, bien que cela ne soit pas recommandé.",
|
||||
"migration_0008_no_warning": "Remplacer votre configuration SSH ne devrait pas poser de problème, bien qu'il soit difficile de le promettre ! Exécutez la migration pour la remplacer. Sinon, vous pouvez également ignorer la migration, bien que cela ne soit pas recommandé.",
|
||||
"migrations_success": "Migration {number} {name} réussie !",
|
||||
"pattern_password_app": "Désolé, les mots de passe ne peuvent pas contenir les caractères suivants : {forbidden_chars}",
|
||||
"root_password_replaced_by_admin_password": "Votre mot de passe root a été remplacé par votre mot de passe administrateur.",
|
||||
"service_reload_failed": "Impossible de recharger le service '{service:s}'.\n\nJournaux historisés récents de ce service : {logs:s}",
|
||||
|
@ -371,7 +325,6 @@
|
|||
"app_action_cannot_be_ran_because_required_services_down": "Ces services requis doivent être en cours d’exécution pour exécuter cette action : {services}. Essayez de les redémarrer pour continuer (et éventuellement rechercher pourquoi ils sont en panne).",
|
||||
"admin_password_too_long": "Veuillez choisir un mot de passe comportant moins de 127 caractères",
|
||||
"log_regen_conf": "Régénérer les configurations du système '{}'",
|
||||
"migration_0009_not_needed": "Cette migration semble avoir déjà été jouée ? On l’ignore.",
|
||||
"regenconf_file_backed_up": "Le fichier de configuration '{conf}' a été sauvegardé sous '{backup}'",
|
||||
"regenconf_file_copy_failed": "Impossible de copier le nouveau fichier de configuration '{new}' vers '{conf}'",
|
||||
"regenconf_file_manually_modified": "Le fichier de configuration '{conf}' a été modifié manuellement et ne sera pas mis à jour",
|
||||
|
@ -385,8 +338,6 @@
|
|||
"global_settings_setting_security_nginx_compatibility": "Compatibilité versus compromis sécuritaire pour le serveur web Nginx. Affecte les cryptogrammes (et d’autres aspects liés à la sécurité)",
|
||||
"global_settings_setting_security_ssh_compatibility": "Compatibilité versus compromis sécuritaire pour le serveur SSH. Affecte les cryptogrammes (et d’autres aspects liés à la sécurité)",
|
||||
"global_settings_setting_security_postfix_compatibility": "Compatibilité versus compromis sécuritaire pour le serveur Postfix. Affecte les cryptogrammes (et d’autres aspects liés à la sécurité)",
|
||||
"migration_description_0009_decouple_regenconf_from_services": "Dissocier le mécanisme « regen-conf » des services",
|
||||
"migration_description_0010_migrate_to_apps_json": "Supprimer les catalogues d’applications obsolètes afin d’utiliser la nouvelle liste unifiée 'apps.json' à la place (les anciens catalogues seront remplacés durant la migration 13)",
|
||||
"regenconf_file_kept_back": "Le fichier de configuration '{conf}' devait être supprimé par « regen-conf » (catégorie {category}) mais a été conservé.",
|
||||
"regenconf_updated": "La configuration a été mise à jour pour '{category}'",
|
||||
"regenconf_would_be_updated": "La configuration aurait dû être mise à jour pour la catégorie '{category}'",
|
||||
|
@ -419,26 +370,15 @@
|
|||
"mailbox_disabled": "La boîte aux lettres est désactivée pour l’utilisateur {user:s}",
|
||||
"app_action_broke_system": "Cette action semble avoir cassé des services importants : {services}",
|
||||
"apps_already_up_to_date": "Toutes les applications sont déjà à jour",
|
||||
"migration_0011_create_group": "Création d'un groupe pour chaque utilisateur…",
|
||||
"migration_0011_done": "Migration terminée. Vous êtes maintenant en mesure de gérer des groupes d’utilisateurs.",
|
||||
"migrations_must_provide_explicit_targets": "Vous devez fournir des cibles explicites lorsque vous utilisez '--skip' ou '--force-rerun'",
|
||||
"migrations_no_such_migration": "Il n’y a pas de migration appelée '{id}'",
|
||||
"migrations_pending_cant_rerun": "Ces migrations étant toujours en attente, vous ne pouvez pas les exécuter à nouveau : {ids}",
|
||||
"migration_description_0012_postgresql_password_to_md5_authentication": "Forcer l’authentification PostgreSQL à utiliser MD5 pour les connexions locales",
|
||||
"migrations_exclusive_options": "'auto', '--skip' et '--force-rerun' sont des options mutuellement exclusives.",
|
||||
"migrations_not_pending_cant_skip": "Ces migrations ne sont pas en attente et ne peuvent donc pas être ignorées : {ids}",
|
||||
"migration_0011_can_not_backup_before_migration": "La sauvegarde du système n’a pas pu être terminée avant l’échec de la migration. Erreur : {error:s}",
|
||||
"migration_0011_migrate_permission": "Migration des autorisations des paramètres des applications vers LDAP...",
|
||||
"migration_0011_migration_failed_trying_to_rollback": "La migration a échoué… Tentative de restauration du système.",
|
||||
"migration_0011_rollback_success": "Système restauré.",
|
||||
"migration_0011_update_LDAP_database": "Mise à jour de la base de données LDAP...",
|
||||
"migration_0011_backup_before_migration": "Création d’une sauvegarde des paramètres de la base de données LDAP et des applications avant la migration.",
|
||||
"permission_not_found": "Permission '{permission:s}' introuvable",
|
||||
"permission_update_failed": "Impossible de mettre à jour la permission '{permission}' : {error}",
|
||||
"permission_updated": "Permission '{permission:s}' mise à jour",
|
||||
"permission_update_nothing_to_do": "Aucune permission à mettre à jour",
|
||||
"dyndns_provider_unreachable": "Impossible d’atteindre le fournisseur DynDNS {provider} : votre YunoHost n’est pas correctement connecté à Internet ou le serveur Dynette est en panne.",
|
||||
"migration_0011_update_LDAP_schema": "Mise à jour du schéma LDAP...",
|
||||
"migrations_already_ran": "Ces migrations sont déjà effectuées : {ids}",
|
||||
"migrations_dependencies_not_satisfied": "Exécutez ces migrations : '{dependencies_id}', avant migration {id}.",
|
||||
"migrations_failed_to_load_migration": "Impossible de charger la migration {id} : {error}",
|
||||
|
@ -450,8 +390,6 @@
|
|||
"permission_creation_failed": "Impossible de créer l’autorisation '{permission}' : {error}",
|
||||
"permission_deleted": "Permission '{permission:s}' supprimée",
|
||||
"permission_deletion_failed": "Impossible de supprimer la permission '{permission}' : {error}",
|
||||
"migration_description_0011_setup_group_permission": "Initialiser les groupes d’utilisateurs et autorisations pour les applications et les services",
|
||||
"migration_0011_LDAP_update_failed": "Impossible de mettre à jour LDAP. Erreur : {error:s}",
|
||||
"group_already_exist": "Le groupe {group} existe déjà",
|
||||
"group_already_exist_on_system": "Le groupe {group} existe déjà dans les groupes système",
|
||||
"group_cannot_be_deleted": "Le groupe {group} ne peut pas être supprimé manuellement.",
|
||||
|
@ -462,7 +400,6 @@
|
|||
"log_user_group_create": "Créer le groupe '{}'",
|
||||
"log_user_permission_update": "Mise à jour des accès pour la permission '{}'",
|
||||
"log_user_permission_reset": "Réinitialiser la permission '{}'",
|
||||
"migration_0011_failed_to_remove_stale_object": "Impossible de supprimer un objet périmé {dn} : {error}",
|
||||
"permission_already_allowed": "Le groupe '{group}' a déjà l’autorisation '{permission}' activée",
|
||||
"permission_already_disallowed": "Le groupe '{group}' a déjà l’autorisation '{permission}' désactivé",
|
||||
"permission_cannot_remove_main": "Supprimer une autorisation principale n’est pas autorisé",
|
||||
|
@ -472,14 +409,12 @@
|
|||
"group_cannot_edit_visitors": "Le groupe 'visiteurs' ne peut pas être édité manuellement. C’est un groupe spécial représentant les visiteurs anonymes",
|
||||
"group_cannot_edit_primary_group": "Le groupe '{group}' ne peut pas être édité manuellement. C’est le groupe principal destiné à ne contenir qu’un utilisateur spécifique.",
|
||||
"log_permission_url": "Mise à jour de l’URL associée à l’autorisation '{}'",
|
||||
"migration_0011_slapd_config_will_be_overwritten": "Il semble que vous ayez modifié manuellement la configuration de slapd. Pour cette migration critique, YunoHost doit forcer la mise à jour de la configuration de slapd. Les fichiers originaux seront sauvegardés dans {conf_backup_folder}.",
|
||||
"permission_already_up_to_date": "L’autorisation n’a pas été mise à jour car les demandes d’ajout/suppression correspondent déjà à l’état actuel.",
|
||||
"permission_currently_allowed_for_all_users": "Cette autorisation est actuellement accordée à tous les utilisateurs en plus des autres groupes. Vous voudrez probablement soit supprimer l’autorisation 'all_users', soit supprimer les autres groupes auxquels il est actuellement autorisé.",
|
||||
"app_install_failed": "Impossible d’installer {app} : {error}",
|
||||
"app_install_script_failed": "Une erreur est survenue dans le script d’installation de l’application",
|
||||
"permission_require_account": "Permission {permission} n’a de sens que pour les utilisateurs ayant un compte et ne peut donc pas être activé pour les visiteurs.",
|
||||
"app_remove_after_failed_install": "Supprimer l’application après l’échec de l’installation...",
|
||||
"diagnosis_display_tip_web": "Vous pouvez aller à la section Diagnostic (dans l’écran d’accueil) pour voir les problèmes rencontrés.",
|
||||
"diagnosis_cant_run_because_of_dep": "Impossible d’exécuter le diagnostic pour {category} alors qu’il existe des problèmes importants liés à {dep}.",
|
||||
"diagnosis_found_errors": "Trouvé {errors} problème(s) significatif(s) lié(s) à {category} !",
|
||||
"diagnosis_found_errors_and_warnings": "Trouvé {errors} problème(s) significatif(s) (et {warnings} (avertissement(s)) en relation avec {category} !",
|
||||
|
@ -496,7 +431,6 @@
|
|||
"diagnosis_basesystem_ynh_single_version": "{package} version : {version} ({repo})",
|
||||
"diagnosis_basesystem_ynh_main_version": "Le serveur utilise YunoHost {main_version} ({repo})",
|
||||
"diagnosis_basesystem_ynh_inconsistent_versions": "Vous exécutez des versions incohérentes des packages YunoHost ... très probablement en raison d’une mise à niveau échouée ou partielle.",
|
||||
"diagnosis_display_tip_cli": "Vous pouvez exécuter 'yunohost diagnosis show --issues --human-readable' pour afficher les problèmes détectés.",
|
||||
"diagnosis_failed_for_category": "Échec du diagnostic pour la catégorie '{category}': {error}",
|
||||
"diagnosis_cache_still_valid": "(Le cache est encore valide pour le diagnostic {category}. Il ne sera pas re-diagnostiqué pour le moment!)",
|
||||
"diagnosis_ignored_issues": "(+ {nb_ignored} problème(s) ignoré(s))",
|
||||
|
@ -522,9 +456,7 @@
|
|||
"diagnosis_swap_notsomuch": "Le système ne dispose que de {total} de swap. Vous devez envisager d’avoir au moins {recommended} pour éviter les situations où le système manque de mémoire.",
|
||||
"diagnosis_swap_ok": "Le système dispose de {total} de swap !",
|
||||
"diagnosis_regenconf_manually_modified": "Le fichier de configuration <code>{file}</code> semble avoir été modifié manuellement.",
|
||||
"diagnosis_regenconf_manually_modified_debian": "Le fichier de configuration {file} a été modifié manuellement par rapport à celui par défaut de Debian.",
|
||||
"diagnosis_regenconf_manually_modified_details": "C’est probablement OK si vous savez ce que vous faites ! YunoHost cessera de mettre à jour ce fichier automatiquement ... Mais attention, les mises à jour de YunoHost pourraient contenir d’importantes modifications recommandées. Si vous le souhaitez, vous pouvez inspecter les différences avec <cmd>yunohost tools regen-conf {category} --dry-run --with-diff</cmd> et forcer la réinitialisation à la configuration recommandée avec <cmd>yunohost tools regen-conf {category} --force</cmd>",
|
||||
"diagnosis_regenconf_manually_modified_debian_details": "Cela peut probablement être OK, mais il faut garder un œil dessus …",
|
||||
"apps_catalog_init_success": "Système de catalogue d’applications initialisé !",
|
||||
"apps_catalog_failed_to_download": "Impossible de télécharger le catalogue des applications {apps_catalog} : {error}",
|
||||
"diagnosis_mail_outgoing_port_25_blocked": "Le port sortant 25 semble être bloqué. Vous devriez essayer de le débloquer dans le panneau de configuration de votre fournisseur de services Internet (ou hébergeur). En attendant, le serveur ne pourra pas envoyer des courriels à d’autres serveurs.",
|
||||
|
@ -537,13 +469,11 @@
|
|||
"diagnosis_description_systemresources": "Ressources système",
|
||||
"diagnosis_description_ports": "Exposition des ports",
|
||||
"diagnosis_description_regenconf": "Configurations système",
|
||||
"diagnosis_description_security": "Contrôles de sécurité",
|
||||
"diagnosis_ports_could_not_diagnose": "Impossible de diagnostiquer si les ports sont accessibles de l'extérieur.",
|
||||
"diagnosis_ports_could_not_diagnose_details": "Erreur : {error}",
|
||||
"apps_catalog_updating": "Mise à jour du catalogue d’applications…",
|
||||
"apps_catalog_obsolete_cache": "Le cache du catalogue d'applications est vide ou obsolète.",
|
||||
"apps_catalog_update_success": "Le catalogue des applications a été mis à jour !",
|
||||
"diagnosis_mail_ougoing_port_25_ok": "Le port sortant 25 n’est pas bloqué et le courrier électronique peut être envoyé à d’autres serveurs.",
|
||||
"diagnosis_description_mail": "E-mail",
|
||||
"diagnosis_ports_unreachable": "Le port {port} n’est pas accessible de l’extérieur.",
|
||||
"diagnosis_ports_ok": "Le port {port} est accessible de l’extérieur.",
|
||||
|
@ -552,9 +482,7 @@
|
|||
"diagnosis_http_ok": "Le domaine {domain} est accessible en HTTP depuis l’extérieur.",
|
||||
"diagnosis_http_unreachable": "Le domaine {domain} est inaccessible en HTTP depuis l’extérieur.",
|
||||
"diagnosis_unknown_categories": "Les catégories suivantes sont inconnues : {categories}",
|
||||
"migration_description_0013_futureproof_apps_catalog_system": "Migrer vers le nouveau système de catalogue d’applications à l’épreuve du temps",
|
||||
"app_upgrade_script_failed": "Une erreur s’est produite durant l’exécution du script de mise à niveau de l’application",
|
||||
"migration_description_0014_remove_app_status_json": "Supprimer les anciens fichiers d’application status.json",
|
||||
"diagnosis_services_running": "Le service {service} est en cours de fonctionnement !",
|
||||
"diagnosis_services_conf_broken": "La configuration est cassée pour le service {service} !",
|
||||
"diagnosis_ports_needed_by": "Rendre ce port accessible est nécessaire pour les fonctionnalités de type {category} (service {service})",
|
||||
|
@ -571,7 +499,6 @@
|
|||
"log_app_config_apply": "Appliquer la configuration à l’application '{}'",
|
||||
"diagnosis_never_ran_yet": "Il apparaît que le serveur a été installé récemment et qu’il n’y a pas encore eu de diagnostic. Vous devriez en lancer un depuis la web-admin ou en utilisant 'yunohost diagnosis run' depuis la ligne de commande.",
|
||||
"diagnosis_description_web": "Web",
|
||||
"diagnosis_basesystem_hardware_board": "Le modèle de carte du serveur est {model}",
|
||||
"diagnosis_basesystem_hardware": "L’architecture du serveur est {virt} {arch}",
|
||||
"group_already_exist_on_system_but_removing_it": "Le groupe {group} est déjà présent dans les groupes du système, mais YunoHost va le supprimer...",
|
||||
"certmanager_warning_subdomain_dns_record": "Le sous-domaine '{subdomain:s}' ne résout pas vers la même adresse IP que '{domain:s}'. Certaines fonctionnalités seront indisponibles tant que vous n’aurez pas corrigé cela et regénéré le certificat.",
|
||||
|
@ -594,7 +521,6 @@
|
|||
"diagnosis_mail_queue_unavailable_details": "Erreur : {error}",
|
||||
"diagnosis_mail_queue_too_big": "Trop d’e-mails en attente dans la file d'attente ({nb_pending} e-mails)",
|
||||
"global_settings_setting_smtp_allow_ipv6": "Autoriser l'utilisation d’IPv6 pour recevoir et envoyer du courrier",
|
||||
"diagnosis_security_all_good": "Aucune vulnérabilité de sécurité critique n’a été trouvée.",
|
||||
"diagnosis_display_tip": "Pour voir les problèmes détectés, vous pouvez accéder à la section Diagnostic du webadmin ou exécuter « yunohost diagnosis show --issues --human-readable» à partir de la ligne de commande.",
|
||||
"diagnosis_ip_global": "IP globale : <code>{global}</code>",
|
||||
"diagnosis_ip_local": "IP locale : <code>{local}</code>",
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
"app_unsupported_remote_type": "एप्लीकेशन के लिए उन्सुपपोर्टेड रिमोट टाइप इस्तेमाल किया गया",
|
||||
"app_upgrade_failed": "{app:s} अपडेट करने में असमर्थ",
|
||||
"app_upgraded": "{app:s} अपडेट हो गयी हैं",
|
||||
"ask_email": "ईमेल का पता",
|
||||
"ask_firstname": "नाम",
|
||||
"ask_lastname": "अंतिम नाम",
|
||||
"ask_main_domain": "मुख्य डोमेन",
|
||||
|
@ -39,7 +38,6 @@
|
|||
"backup_delete_error": "'{path:s}' डिलीट करने में असमर्थ",
|
||||
"backup_deleted": "इस बैकअप को डिलीट दिया गया है",
|
||||
"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": "आउटपुट डायरेक्टरी खाली नहीं है",
|
||||
|
|
|
@ -3,11 +3,9 @@
|
|||
"app_extraction_failed": "Impossibile estrarre i file di installazione",
|
||||
"app_not_installed": "Impossibile trovare l'applicazione {app:s} nell'elenco delle applicazioni installate: {all_apps}",
|
||||
"app_unknown": "Applicazione sconosciuta",
|
||||
"ask_email": "Indirizzo email",
|
||||
"ask_password": "Password",
|
||||
"backup_archive_name_exists": "Il nome dell'archivio del backup è già esistente.",
|
||||
"backup_created": "Backup completo",
|
||||
"backup_invalid_archive": "Archivio di backup non valido",
|
||||
"backup_output_directory_not_empty": "Dovresti scegliere una cartella di output vuota",
|
||||
"domain_created": "Dominio creato",
|
||||
"domain_exists": "Il dominio esiste già",
|
||||
|
@ -74,9 +72,6 @@
|
|||
"done": "Terminato",
|
||||
"domains_available": "Domini disponibili:",
|
||||
"downloading": "Scaricamento…",
|
||||
"dyndns_cron_installed": "Cronjob DynDNS creato",
|
||||
"dyndns_cron_remove_failed": "Impossibile rimuovere il cronjob DynDNS perchè: {error}",
|
||||
"dyndns_cron_removed": "Cronjob DynDNS rimosso",
|
||||
"dyndns_ip_update_failed": "Impossibile aggiornare l'indirizzo IP in DynDNS",
|
||||
"dyndns_ip_updated": "Il tuo indirizzo IP è stato aggiornato su DynDNS",
|
||||
"dyndns_key_generating": "Generando la chiave DNS... Potrebbe richiedere del tempo.",
|
||||
|
@ -85,8 +80,6 @@
|
|||
"dyndns_registered": "Dominio DynDNS registrato",
|
||||
"dyndns_registration_failed": "Non è possibile registrare il dominio DynDNS: {error:s}",
|
||||
"dyndns_unavailable": "Il dominio {domain:s} non disponibile.",
|
||||
"executing_command": "Esecuzione del comando '{command:s}'…",
|
||||
"executing_script": "Esecuzione dello script '{script:s}'…",
|
||||
"extracting": "Estrazione...",
|
||||
"field_invalid": "Campo '{:s}' non valido",
|
||||
"firewall_reload_failed": "Impossibile ricaricare il firewall",
|
||||
|
@ -106,9 +99,7 @@
|
|||
"mailbox_used_space_dovecot_down": "La casella di posta elettronica Dovecot deve essere attivato se vuoi recuperare lo spazio usato dalla posta elettronica",
|
||||
"main_domain_change_failed": "Impossibile cambiare il dominio principale",
|
||||
"main_domain_changed": "Il dominio principale è stato cambiato",
|
||||
"no_internet_connection": "Il server non è collegato a Internet",
|
||||
"not_enough_disk_space": "Non c'è abbastanza spazio libero in '{path:s}'",
|
||||
"package_unknown": "Pacchetto '{pkgname}' sconosciuto",
|
||||
"packages_upgrade_failed": "Impossibile aggiornare tutti i pacchetti",
|
||||
"pattern_backup_archive_name": "Deve essere un nome di file valido di massimo 30 caratteri di lunghezza, con caratteri alfanumerici e \"-_.\" come unica punteggiatura",
|
||||
"pattern_domain": "Deve essere un nome di dominio valido (es. il-mio-dominio.org)",
|
||||
|
@ -159,13 +150,11 @@
|
|||
"user_unknown": "Utente sconosciuto: {user:s}",
|
||||
"user_updated": "Info dell'utente cambiate",
|
||||
"yunohost_already_installed": "YunoHost è già installato",
|
||||
"yunohost_ca_creation_failed": "Impossibile creare una certificate authority",
|
||||
"yunohost_configured": "YunoHost ora è configurato",
|
||||
"yunohost_installing": "Installazione di YunoHost...",
|
||||
"yunohost_not_installed": "YunoHost non è correttamente installato. Esegui 'yunohost tools postinstall'",
|
||||
"domain_cert_gen_failed": "Impossibile generare il certificato",
|
||||
"certmanager_attempt_to_replace_valid_cert": "Stai provando a sovrascrivere un certificato buono e valido per il dominio {domain:s}! (Usa --force per ignorare)",
|
||||
"certmanager_domain_unknown": "Dominio {domain:s} sconosciuto",
|
||||
"certmanager_domain_cert_not_selfsigned": "Il certificato per il dominio {domain:s} non è auto-firmato. Sei sicuro di volere sostituirlo? (Usa '--force')",
|
||||
"certmanager_certificate_fetching_or_enabling_failed": "Il tentativo di usare il nuovo certificato per {domain:s} non funziona...",
|
||||
"certmanager_attempt_to_renew_nonLE_cert": "Il certificato per il dominio {domain:s} non è emesso da Let's Encrypt. Impossibile rinnovarlo automaticamente!",
|
||||
|
@ -182,14 +171,12 @@
|
|||
"app_upgrade_app_name": "Aggiornamento di {app}...",
|
||||
"app_upgrade_some_app_failed": "Alcune applicazioni non possono essere aggiornate",
|
||||
"backup_abstract_method": "Questo metodo di backup deve essere ancora implementato",
|
||||
"backup_applying_method_borg": "Invio di tutti i file del backup nel deposito borg-backup...",
|
||||
"backup_applying_method_copy": "Copiando tutti i files nel backup...",
|
||||
"backup_applying_method_custom": "Chiamando il metodo di backup personalizzato '{method:s}'...",
|
||||
"backup_applying_method_tar": "Creando l'archivio TAR del backup...",
|
||||
"backup_archive_system_part_not_available": "La parte di sistema '{part:s}' non è disponibile in questo backup",
|
||||
"backup_archive_writing_error": "Impossibile aggiungere i file '{source:s}' (indicati nell'archivio '{dest:s}') al backup nell'archivio compresso '{archive:s}'",
|
||||
"backup_ask_for_copying_if_needed": "Vuoi effettuare il backup usando {size:s}MB temporaneamente? (È necessario usare questo sistema poiché alcuni file non possono essere preparati in un modo più efficiente)",
|
||||
"backup_borg_not_implemented": "Il metodo di backup Borg non è ancora stato implementato",
|
||||
"backup_cant_mount_uncompress_archive": "Impossibile montare in modalità sola lettura la cartella di archivio non compressa",
|
||||
"backup_copying_to_organize_the_archive": "Copiando {size:s}MB per organizzare l'archivio",
|
||||
"backup_couldnt_bind": "Impossibile legare {src:s} a {dest:s}.",
|
||||
|
@ -197,12 +184,10 @@
|
|||
"backup_csv_creation_failed": "Impossibile creare il file CVS richiesto per le operazioni di ripristino",
|
||||
"backup_custom_backup_error": "Il metodo di backup personalizzato è fallito allo step 'backup'",
|
||||
"backup_custom_mount_error": "Il metodo di backup personalizzato è fallito allo step 'mount'",
|
||||
"backup_method_borg_finished": "Backup in borg terminato",
|
||||
"backup_method_copy_finished": "Copia di backup terminata",
|
||||
"backup_method_custom_finished": "Metodo di backup personalizzato '{method:s}' terminato",
|
||||
"backup_method_tar_finished": "Archivio TAR di backup creato",
|
||||
"backup_no_uncompress_archive_dir": "La cartella di archivio non compressa non esiste",
|
||||
"backup_php5_to_php7_migration_may_fail": "Conversione del tuo archivio per supportare php7 non riuscita, le tue app php potrebbero fallire in fase di ripristino (motivo: {error:s})",
|
||||
"backup_system_part_failed": "Impossibile creare il backup della parte di sistema '{part:s}'",
|
||||
"backup_unable_to_organize_files": "Impossibile organizzare i file nell'archivio con il metodo veloce",
|
||||
"backup_with_no_backup_script_for_app": "L'app {app:s} non ha script di backup. Ignorata.",
|
||||
|
@ -231,16 +216,10 @@
|
|||
"password_too_simple_2": "La password deve essere lunga almeno 8 caratteri e contenere numeri, maiuscole e minuscole",
|
||||
"password_too_simple_3": "La password deve essere lunga almeno 8 caratteri e contenere numeri, maiuscole e minuscole e simboli",
|
||||
"password_too_simple_4": "La password deve essere lunga almeno 12 caratteri e contenere numeri, maiuscole e minuscole",
|
||||
"users_available": "Utenti disponibili:",
|
||||
"yunohost_ca_creation_success": "Autorità di certificazione locale creata.",
|
||||
"app_action_cannot_be_ran_because_required_services_down": "I seguenti servizi dovrebbero essere in funzione per completare questa azione: {services}. Prova a riavviarli per proseguire (e possibilmente cercare di capire come ma non funzionano più).",
|
||||
"backup_output_symlink_dir_broken": "La tua cartella d'archivio '{path:s}' è un link simbolico interrotto. Probabilmente hai dimenticato di montare o montare nuovamente il supporto al quale punta il link.",
|
||||
"certmanager_conflicting_nginx_file": "Impossibile preparare il dominio per il controllo ACME: il file di configurazione nginx {filepath:s} è in conflitto e dovrebbe essere prima rimosso",
|
||||
"certmanager_couldnt_fetch_intermediate_cert": "Tempo scaduto durante il tentativo di recupero di un certificato intermedio da Let's Encrypt. Installazione/rinnovo non riuscito - per favore riprova più tardi.",
|
||||
"certmanager_domain_dns_ip_differs_from_public_ip": "I record DNS per il dominio '{domain:s}' è diverso dall'IP di questo server. Controlla la sezione (basic) 'Record DNS' nella diagnosi per maggiori informazioni. Se hai modificato recentemente il tuo valore A, attendi che si propaghi (esistono online alcuni siti per il controllo della propagazione DNS). (Se sai cosa stai facendo, usa '--no-checks' per disattivare i controlli.)",
|
||||
"certmanager_error_no_A_record": "Nessun valore DNS 'A' trovato per {domain:s}. Devi far puntare il tuo nome di dominio verso la tua macchina per essere in grado di installare un certificato Let's Encrypt! (Se sai cosa stai facendo, usa --no-checks per disabilitare quei controlli.)",
|
||||
"certmanager_hit_rate_limit": "Troppi certificati già rilasciati per questa esatta serie di domini {domain:s} recentemente. Per favore riprova più tardi. Guarda https://letsencrypt.org/docs/rate-limits/ per maggiori dettagli",
|
||||
"certmanager_http_check_timeout": "Tempo scaduto durante il tentativo di contatto del tuo server a se stesso attraverso HTTP utilizzando l'indirizzo IP pubblico (dominio {domain:s} con ip {ip:s}). Potresti avere un problema di hairpinning o il firewall/router davanti al tuo server non è correttamente configurato.",
|
||||
"certmanager_no_cert_file": "Impossibile leggere il file di certificato per il dominio {domain:s} (file: {file:s})",
|
||||
"certmanager_self_ca_conf_file_not_found": "File di configurazione non trovato per l'autorità di auto-firma (file: {file:s})",
|
||||
"certmanager_unable_to_parse_self_CA_name": "Impossibile analizzare il nome dell'autorità di auto-firma (file: {file:s})",
|
||||
|
@ -262,11 +241,7 @@
|
|||
"global_settings_cant_write_settings": "Scrittura del file delle impostazioni non riuscita, motivo: {reason:s}",
|
||||
"global_settings_key_doesnt_exists": "La chiave '{settings_key:s}' non esiste nelle impostazioni globali, puoi vedere tutte le chiavi disponibili eseguendo 'yunohost settings list'",
|
||||
"global_settings_reset_success": "Le impostazioni precedenti sono state salvate in {path:s}",
|
||||
"global_settings_setting_example_bool": "Esempio di opzione booleana",
|
||||
"global_settings_setting_example_enum": "Esempio di opzione enum",
|
||||
"already_up_to_date": "Niente da fare. Tutto è già aggiornato.",
|
||||
"global_settings_setting_example_int": "Esempio di opzione int",
|
||||
"global_settings_setting_example_string": "Esempio di opzione string",
|
||||
"global_settings_setting_security_nginx_compatibility": "Bilanciamento tra compatibilità e sicurezza per il server web NGIX. Riguarda gli algoritmi di cifratura (e altri aspetti legati alla sicurezza)",
|
||||
"global_settings_setting_security_password_admin_strength": "Complessità della password di amministratore",
|
||||
"global_settings_setting_security_password_user_strength": "Complessità della password utente",
|
||||
|
@ -276,7 +251,6 @@
|
|||
"global_settings_unknown_type": "Situazione inaspettata, l'impostazione {setting:s} sembra essere di tipo {unknown_type:s} ma non è un tipo supportato dal sistema.",
|
||||
"good_practices_about_admin_password": "Stai per definire una nuova password di amministratore. La password deve essere almeno di 8 caratteri - anche se è buona pratica utilizzare password più lunghe (es. una frase, una serie di parole) e/o utilizzare vari tipi di caratteri (maiuscole, minuscole, numeri e simboli).",
|
||||
"log_corrupted_md_file": "Il file dei metadati YAML associato con i registri è danneggiato: '{md_file}'\nErrore: {error}",
|
||||
"log_category_404": "La categoria di registrazione '{category}' non esiste",
|
||||
"log_link_to_log": "Registro completo di questa operazione: '<a href=\"#/tools/logs/{name}\" style=\"text-decoration:underline\">{desc}</a>'",
|
||||
"log_help_to_get_log": "Per vedere il registro dell'operazione '{desc}', usa il comando 'yunohost log show {name}{name}'",
|
||||
"global_settings_setting_security_postfix_compatibility": "Bilanciamento tra compatibilità e sicurezza per il server Postfix. Riguarda gli algoritmi di cifratura (e altri aspetti legati alla sicurezza)",
|
||||
|
@ -311,29 +285,6 @@
|
|||
"log_tools_shutdown": "Spegni il tuo server",
|
||||
"log_tools_reboot": "Riavvia il tuo server",
|
||||
"mail_unavailable": "Questo indirizzo email è riservato e dovrebbe essere automaticamente assegnato al primo utente",
|
||||
"migrate_tsig_end": "Migrazione a hmac-sha512 terminata",
|
||||
"migrate_tsig_failed": "Migrazione del dominio dyndns {domain} verso hmac-sha512 fallita, torno indetro. Errore: {error_code} - {error}",
|
||||
"migrate_tsig_start": "Trovato un algoritmo di chiave non abbastanza sicuro per la firma TSIG del dominio '{domain}', inizio della migrazione verso la più sicura hmac-sha512",
|
||||
"migrate_tsig_wait": "Aspetta 3 minuti che il server dyndns prenda la nuova chiave in gestione…",
|
||||
"migrate_tsig_wait_2": "2 minuti…",
|
||||
"migrate_tsig_wait_3": "1 minuto…",
|
||||
"migrate_tsig_wait_4": "30 secondi…",
|
||||
"migrate_tsig_not_needed": "Non sembra tu stia utilizzando un dominio dyndns, quindi non è necessaria nessuna migrazione!",
|
||||
"migration_description_0001_change_cert_group_to_sslcert": "Cambia permessi del gruppo di certificati da 'metronome' a 'ssl-cert'",
|
||||
"migration_description_0002_migrate_to_tsig_sha256": "Migliora la sicurezza del TSIG dyndns utilizzando SHA512 invece di MD5",
|
||||
"migration_description_0003_migrate_to_stretch": "Aggiorna il sistema a Debian Stretch e YunoHost 3.0",
|
||||
"migration_description_0004_php5_to_php7_pools": "Riconfigura le PHP pools ad utilizzare PHP 7 invece di 5",
|
||||
"migration_description_0005_postgresql_9p4_to_9p6": "Migra i database da postgresql 9.4 a 9.6",
|
||||
"migration_description_0006_sync_admin_and_root_passwords": "Sincronizza password di amministratore e root",
|
||||
"migration_description_0010_migrate_to_apps_json": "Rimuovi gli elenchi di app deprecati ed usa invece il nuovo elenco unificato 'apps.json'",
|
||||
"migration_0003_start": "Migrazione a Stretch iniziata. I registri saranno disponibili in {logfile}.",
|
||||
"migration_0003_patching_sources_list": "Sistemando il file sources.lists…",
|
||||
"migration_0003_main_upgrade": "Iniziando l'aggiornamento principale…",
|
||||
"migration_0003_fail2ban_upgrade": "Iniziando l'aggiornamento di fail2ban…",
|
||||
"migration_0003_restoring_origin_nginx_conf": "Il tuo file /etc/nginx/nginx.conf è stato modificato in qualche modo. La migrazione lo riporterà al suo stato originale… Il file precedente sarà disponibile come {backup_dest}.",
|
||||
"migration_0003_yunohost_upgrade": "Iniziando l'aggiornamento dei pacchetti yunohost… La migrazione terminerà, ma l'aggiornamento attuale avverrà subito dopo. Dopo che l'operazione sarà completata, probabilmente dovrai riaccedere all'interfaccia di amministrazione.",
|
||||
"migration_0003_not_jessie": "La distribuzione attuale non è Jessie!",
|
||||
"migration_0003_system_not_fully_up_to_date": "Il tuo sistema non è completamente aggiornato. Per favore prima esegui un aggiornamento normale prima di migrare a stretch.",
|
||||
"this_action_broke_dpkg": "Questa azione ha danneggiato dpkg/APT (i gestori di pacchetti del sistema)... Puoi provare a risolvere questo problema connettendoti via SSH ed eseguendo `sudo apt install --fix-broken` e/o `sudo dpkg --configure -a`.",
|
||||
"app_action_broke_system": "Questa azione sembra avere rotto questi servizi importanti: {services}",
|
||||
"app_remove_after_failed_install": "Rimozione dell'applicazione a causa del fallimento dell'installazione...",
|
||||
|
@ -365,7 +316,6 @@
|
|||
"diagnosis_basesystem_ynh_single_version": "Versione {package}: {version} ({repo})",
|
||||
"diagnosis_basesystem_kernel": "Il server sta eseguendo Linux kernel {kernel_version}",
|
||||
"diagnosis_basesystem_host": "Il server sta eseguendo Debian {debian_version}",
|
||||
"diagnosis_basesystem_hardware_board": "Il modello della scheda server è {model}",
|
||||
"diagnosis_basesystem_hardware": "L'architettura hardware del server è {virt} {arch}",
|
||||
"certmanager_warning_subdomain_dns_record": "Il sottodominio '{subdomain:s}' non si risolve nello stesso indirizzo IP di '{domain:s}'. Alcune funzioni non saranno disponibili finchè questa cosa non verrà sistemata e rigenerato il certificato.",
|
||||
"app_label_deprecated": "Questo comando è deprecato! Utilizza il nuovo comando 'yunohost user permission update' per gestire la label dell'app.",
|
||||
|
@ -574,12 +524,6 @@
|
|||
"migration_0015_main_upgrade": "Inizio l'aggiornamento principale...",
|
||||
"migration_0015_patching_sources_list": "Applico le patch a sources.lists...",
|
||||
"migration_0015_start": "Inizio migrazione a Buster",
|
||||
"migration_0011_failed_to_remove_stale_object": "Impossibile rimuovere l'oggetto {dn}: {error}",
|
||||
"migration_0011_update_LDAP_schema": "Aggiornado lo schema LDAP...",
|
||||
"migration_0011_update_LDAP_database": "Aggiornando il database LDAP...",
|
||||
"migration_0011_migrate_permission": "Migrando permessi dalle impostazioni delle app a LDAP...",
|
||||
"migration_0011_LDAP_update_failed": "Impossibile aggiornare LDAP. Errore: {error:s}",
|
||||
"migration_0011_create_group": "Sto creando un gruppo per ogni utente...",
|
||||
"migration_description_0019_extend_permissions_features": "Estendi il sistema di gestione dei permessi app",
|
||||
"migration_description_0018_xtable_to_nftable": "Migra le vecchie regole di traffico network sul nuovo sistema nftable",
|
||||
"migration_description_0017_postgresql_9p6_to_11": "Migra i database da PostgreSQL 9.6 a 11",
|
||||
|
@ -679,4 +623,4 @@
|
|||
"domain_remove_confirm_apps_removal": "Rimuovere questo dominio rimuoverà anche le seguenti applicazioni:\n{apps}\n\nSei sicuro di voler continuare? [{answers}]",
|
||||
"diagnosis_rootfstotalspace_critical": "La radice del filesystem ha un totale di solo {space}, ed è piuttosto preoccupante! Probabilmente consumerai tutta la memoria molto velocemente! Raccomandiamo di avere almeno 16 GB per la radice del filesystem.",
|
||||
"diagnosis_rootfstotalspace_warning": "La radice del filesystem ha un totale di solo {space}. Potrebbe non essere un problema, ma stai attento perché potresti consumare tutta la memoria velocemente... Raccomandiamo di avere almeno 16 GB per la radice del filesystem."
|
||||
}
|
||||
}
|
|
@ -9,7 +9,6 @@
|
|||
"app_argument_invalid": "Velg en gydlig verdi for argumentet '{name:s}': {error:s}",
|
||||
"app_argument_required": "Argumentet '{name:s}' er påkrevd",
|
||||
"app_id_invalid": "Ugyldig program-ID",
|
||||
"dyndns_cron_remove_failed": "Kunne ikke fjerne cron-jobb for DynDNS: {error}",
|
||||
"dyndns_key_not_found": "Fant ikke DNS-nøkkel for domenet",
|
||||
"app_not_correctly_installed": "{app:s} ser ikke ut til å ha blitt installert på riktig måte",
|
||||
"dyndns_provider_unreachable": "Kunne ikke nå DynDNS-tilbyder {provider}: Enten har du ikke satt opp din YunoHost rett, dynette-tjeneren er nede, eller du mangler nett.",
|
||||
|
@ -35,7 +34,6 @@
|
|||
"dyndns_could_not_check_provide": "Kunne ikke sjekke om {provider:s} kan tilby {domain:s}.",
|
||||
"dyndns_could_not_check_available": "Kunne ikke sjekke om {domain:s} er tilgjengelig på {provider:s}.",
|
||||
"mail_domain_unknown": "Ukjent e-postadresse for domenet '{domain:s}'",
|
||||
"migrate_tsig_wait_2": "2 min…",
|
||||
"log_remove_on_failed_restore": "Fjern '{}' etter mislykket gjenoppretting fra sikkerhetskopiarkiv",
|
||||
"log_letsencrypt_cert_install": "Installer et Let's Encrypt-sertifikat på '{}'-domenet",
|
||||
"log_letsencrypt_cert_renew": "Forny '{}'-Let's Encrypt-sertifikat",
|
||||
|
@ -54,27 +52,19 @@
|
|||
"app_start_remove": "Fjerner programmet '{app}'…",
|
||||
"app_start_backup": "Samler inn filer for sikkerhetskopiering for {app}…",
|
||||
"backup_applying_method_copy": "Kopier alle filer til sikkerhetskopi…",
|
||||
"backup_borg_not_implemented": "Borg-sikkerhetskopimetoden er ikke implementert enda",
|
||||
"backup_creation_failed": "Kunne ikke opprette sikkerhetskopiarkiv",
|
||||
"backup_couldnt_bind": "Kunne ikke binde {src:s} til {dest:s}.",
|
||||
"backup_csv_addition_failed": "Kunne ikke legge til filer for sikkerhetskopi inn i CSV-filen",
|
||||
"backup_deleted": "Sikkerhetskopi slettet",
|
||||
"backup_no_uncompress_archive_dir": "Det finnes ingen slik utpakket arkivmappe",
|
||||
"backup_delete_error": "Kunne ikke slette '{path:s}'",
|
||||
"certmanager_domain_unknown": "Ukjent domene '{domain:s}'",
|
||||
"certmanager_cert_signing_failed": "Kunne ikke signere det nye sertifikatet",
|
||||
"executing_command": "Kjører kommendoen '{command:s}'…",
|
||||
"executing_script": "Kjører skriptet '{script:s}'…",
|
||||
"extracting": "Pakker ut…",
|
||||
"log_domain_add": "Legg til '{}'-domenet i systemoppsett",
|
||||
"log_domain_remove": "Fjern '{}'-domenet fra systemoppsett",
|
||||
"log_dyndns_subscribe": "Abonner på YunoHost-underdomenet '{}'",
|
||||
"log_dyndns_update": "Oppdater IP-adressen tilknyttet ditt YunoHost-underdomene '{}'",
|
||||
"migrate_tsig_wait_3": "1 min…",
|
||||
"migrate_tsig_wait_4": "30 sekunder…",
|
||||
"backup_invalid_archive": "Dette er ikke et sikkerhetskopiarkiv",
|
||||
"backup_nothings_done": "Ingenting å lagre",
|
||||
"backup_method_borg_finished": "Sikkerhetskopi inn i Borg fullført",
|
||||
"field_invalid": "Ugyldig felt '{:s}'",
|
||||
"firewall_reloaded": "Brannmur gjeninnlastet",
|
||||
"log_app_change_url": "Endre nettadresse for '{}'-programmet",
|
||||
|
@ -94,8 +84,6 @@
|
|||
"domain_creation_failed": "Kunne ikke opprette domene",
|
||||
"domain_dyndns_root_unknown": "Ukjent DynDNS-rotdomene",
|
||||
"domain_unknown": "Ukjent domene",
|
||||
"dyndns_cron_installed": "Opprettet cron-jobb for DynDNS",
|
||||
"dyndns_cron_removed": "Fjernet cron-jobb for DynDNS",
|
||||
"dyndns_ip_update_failed": "Kunne ikke oppdatere IP-adresse til DynDNS",
|
||||
"dyndns_ip_updated": "Oppdaterte din IP på DynDNS",
|
||||
"dyndns_key_generating": "Oppretter DNS-nøkkel… Dette kan ta en stund.",
|
||||
|
@ -112,13 +100,11 @@
|
|||
"log_user_group_update": "Oppdater '{}' gruppe",
|
||||
"ldap_init_failed_to_create_admin": "LDAP-igangsettelse kunne ikke opprette admin-bruker",
|
||||
"ldap_initialized": "LDAP-igangsatt",
|
||||
"migration_description_0003_migrate_to_stretch": "Oppgrader systemet til Debian Stretch og YunoHost 3.0",
|
||||
"app_unknown": "Ukjent program",
|
||||
"app_upgrade_app_name": "Oppgraderer {app}…",
|
||||
"app_upgrade_failed": "Kunne ikke oppgradere {app:s}",
|
||||
"app_upgrade_some_app_failed": "Noen programmer kunne ikke oppgraderes",
|
||||
"app_upgraded": "{app:s} oppgradert",
|
||||
"ask_email": "E-postadresse",
|
||||
"ask_firstname": "Fornavn",
|
||||
"ask_lastname": "Etternavn",
|
||||
"ask_main_domain": "Hoveddomene",
|
||||
|
@ -130,7 +116,6 @@
|
|||
"domain_deleted": "Domene slettet",
|
||||
"domain_deletion_failed": "Kunne ikke slette domene",
|
||||
"domain_dyndns_already_subscribed": "Du har allerede abonnement på et DynDNS-domene",
|
||||
"log_category_404": "Loggkategorien '{category}' finnes ikke",
|
||||
"log_link_to_log": "Full logg for denne operasjonen: '<a href=\"#/tools/logs/{name}\" style=\"text-decoration:underline\">{desc}</a>'",
|
||||
"log_help_to_get_log": "For å vise loggen for operasjonen '{desc}', bruk kommandoen 'yunohost log show {name}{name}'",
|
||||
"log_user_create": "Legg til '{}' bruker",
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
{
|
||||
"password_too_simple_1": "पासवर्ड कम्तिमा characters अक्षर लामो हुनु आवश्यक छ"
|
||||
}
|
||||
}
|
|
@ -15,14 +15,12 @@
|
|||
"app_unknown": "Onbekende app",
|
||||
"app_upgrade_failed": "Kan app {app:s} niet updaten",
|
||||
"app_upgraded": "{app:s} succesvol geüpgraded",
|
||||
"ask_email": "Email-adres",
|
||||
"ask_firstname": "Voornaam",
|
||||
"ask_lastname": "Achternaam",
|
||||
"ask_new_admin_password": "Nieuw administratorwachtwoord",
|
||||
"ask_password": "Wachtwoord",
|
||||
"backup_archive_name_exists": "Een backuparchief met dezelfde naam bestaat al",
|
||||
"backup_cleaning_failed": "Kan tijdelijke backup map niet leeg maken",
|
||||
"backup_invalid_archive": "Ongeldig backup archief",
|
||||
"backup_output_directory_not_empty": "Doelmap is niet leeg",
|
||||
"custom_app_url_required": "U moet een URL opgeven om uw aangepaste app {app:s} bij te werken",
|
||||
"domain_cert_gen_failed": "Kan certificaat niet genereren",
|
||||
|
@ -37,18 +35,15 @@
|
|||
"domain_unknown": "Onbekend domein",
|
||||
"done": "Voltooid",
|
||||
"downloading": "Downloaden...",
|
||||
"dyndns_cron_remove_failed": "De cron-job voor DynDNS kon niet worden verwijderd",
|
||||
"dyndns_ip_update_failed": "Kan het IP adres niet updaten bij DynDNS",
|
||||
"dyndns_ip_updated": "IP adres is aangepast bij DynDNS",
|
||||
"dyndns_key_generating": "DNS sleutel word aangemaakt, wacht een moment...",
|
||||
"dyndns_unavailable": "DynDNS subdomein is niet beschikbaar",
|
||||
"executing_script": "Script uitvoeren...",
|
||||
"extracting": "Uitpakken...",
|
||||
"installation_complete": "Installatie voltooid",
|
||||
"installation_failed": "Installatie gefaald",
|
||||
"ldap_initialized": "LDAP is klaar voor gebruik",
|
||||
"mail_alias_remove_failed": "Kan mail-alias '{mail:s}' niet verwijderen",
|
||||
"no_internet_connection": "Server is niet verbonden met het internet",
|
||||
"pattern_email": "Moet een geldig emailadres bevatten (bv. abc@example.org)",
|
||||
"pattern_mailbox_quota": "Mailbox quota moet een waarde bevatten met b/k/M/G/T erachter of 0 om geen quota in te stellen",
|
||||
"pattern_password": "Wachtwoord moet tenminste 3 karakters lang zijn",
|
||||
|
@ -122,4 +117,4 @@
|
|||
"app_start_backup": "Bestanden aan het verzamelen voor de backup van {app}...",
|
||||
"app_start_restore": "{app} herstellen...",
|
||||
"app_upgrade_several_apps": "De volgende apps zullen worden geüpgraded: {apps}"
|
||||
}
|
||||
}
|
|
@ -16,7 +16,6 @@
|
|||
"app_upgrade_failed": "Impossible d’actualizar {app:s} : {error}",
|
||||
"app_upgrade_some_app_failed": "D’aplicacions se pòdon pas actualizar",
|
||||
"app_upgraded": "{app:s} es estada actualizada",
|
||||
"ask_email": "Adreça de corrièl",
|
||||
"ask_firstname": "Prenom",
|
||||
"ask_lastname": "Nom",
|
||||
"ask_main_domain": "Domeni màger",
|
||||
|
@ -54,8 +53,6 @@
|
|||
"backup_delete_error": "Supression impossibla de « {path:s} »",
|
||||
"backup_deleted": "La salvagarda es estada suprimida",
|
||||
"backup_hook_unknown": "Script de salvagarda « {hook:s} » desconegut",
|
||||
"backup_invalid_archive": "Aquò es pas un archiu de salvagarda",
|
||||
"backup_method_borg_finished": "La salvagarda dins Borg es acabada",
|
||||
"backup_method_copy_finished": "La còpia de salvagarda es acabada",
|
||||
"backup_method_tar_finished": "L’archiu TAR de la salvagarda es estat creat",
|
||||
"backup_output_directory_not_empty": "Devètz causir un dorsièr de sortida void",
|
||||
|
@ -65,7 +62,6 @@
|
|||
"app_requirements_unmeet": "Las condicions requesidas per {app} son pas complidas, lo paquet {pkgname} ({version}) deu èsser {spec}",
|
||||
"backup_abstract_method": "Aqueste metòde de salvagarda es pas encara implementat",
|
||||
"backup_applying_method_custom": "Crida del metòde de salvagarda personalizat « {method:s} »...",
|
||||
"backup_borg_not_implemented": "Lo metòde de salvagarda Bord es pas encara implementat",
|
||||
"backup_couldnt_bind": "Impossible de ligar {src:s} amb {dest:s}.",
|
||||
"backup_csv_addition_failed": "Impossible d’ajustar de fichièrs a la salvagarda dins lo fichièr CSV",
|
||||
"backup_custom_backup_error": "Fracàs del metòde de salvagarda personalizat a l’etapa « backup »",
|
||||
|
@ -85,7 +81,6 @@
|
|||
"yunohost_already_installed": "YunoHost es ja installat",
|
||||
"yunohost_configured": "YunoHost es estat configurat",
|
||||
"yunohost_installing": "Installacion de YunoHost…",
|
||||
"backup_applying_method_borg": "Mandadís de totes los fichièrs a la salvagarda dins lo repertòri borg-backup…",
|
||||
"backup_csv_creation_failed": "Creacion impossibla del fichièr CSV necessari a las operacions futuras de restauracion",
|
||||
"backup_output_symlink_dir_broken": "Vòstre repertòri d’archiu « {path:s} » es un ligam simbolic copat. Saique oblidèretz de re/montar o de connectar supòrt.",
|
||||
"backup_with_no_backup_script_for_app": "L’aplicacion {app:s} a pas cap de script de salvagarda. I fasèm pas cas.",
|
||||
|
@ -100,7 +95,6 @@
|
|||
"certmanager_domain_cert_not_selfsigned": "Lo certificat pel domeni {domain:s} es pas auto-signat. Volètz vertadièrament lo remplaçar ? (Utilizatz « --force » per o far)",
|
||||
"certmanager_domain_dns_ip_differs_from_public_ip": "L’enregistrament DNS « A » pel domeni {domain:s} es diferent de l’adreça IP d’aqueste servidor. Se fa pauc qu’avètz modificat l’enregistrament « A », mercés d’esperar l’espandiment (qualques verificadors d’espandiment son disponibles en linha). (Se sabètz çò que fasèm, utilizatz --no-checks per desactivar aqueles contraròtles)",
|
||||
"certmanager_domain_http_not_working": "Sembla que lo domeni {domain:s} es pas accessible via HTTP. Mercés de verificar que las configuracions DNS e NGINK son corrèctas",
|
||||
"certmanager_domain_unknown": "Domeni desconegut « {domain:s} »",
|
||||
"certmanager_no_cert_file": "Lectura impossibla del fichièr del certificat pel domeni {domain:s} (fichièr : {file:s})",
|
||||
"certmanager_self_ca_conf_file_not_found": "Impossible de trobar lo fichièr de configuracion per l’autoritat del certificat auto-signat (fichièr : {file:s})",
|
||||
"certmanager_unable_to_parse_self_CA_name": "Analisi impossibla del nom de l’autoritat del certificat auto-signat (fichièr : {file:s})",
|
||||
|
@ -119,9 +113,6 @@
|
|||
"done": "Acabat",
|
||||
"downloading": "Telecargament…",
|
||||
"dyndns_could_not_check_provide": "Impossible de verificar se {provider:s} pòt provesir {domain:s}.",
|
||||
"dyndns_cron_installed": "Tasca cron pel domeni DynDNS creada",
|
||||
"dyndns_cron_remove_failed": "Impossible de levar la tasca cron pel domeni DynDNS : {error}",
|
||||
"dyndns_cron_removed": "Tasca cron pel domeni DynDNS levada",
|
||||
"dyndns_ip_update_failed": "Impossible d’actualizar l’adreça IP sul domeni DynDNS",
|
||||
"dyndns_ip_updated": "Vòstra adreça IP actualizada pel domeni DynDNS",
|
||||
"dyndns_key_generating": "La clau DNS es a se generar… pòt trigar una estona.",
|
||||
|
@ -136,29 +127,15 @@
|
|||
"global_settings_cant_open_settings": "Fracàs de la dobertura del fichièr de configuracion, rason : {reason:s}",
|
||||
"global_settings_key_doesnt_exists": "La clau « {settings_key:s} » existís pas dins las configuracions globalas, podètz veire totas las claus disponiblas en executant « yunohost settings list »",
|
||||
"global_settings_reset_success": "Configuracion precedenta ara salvagarda dins {path:s}",
|
||||
"global_settings_setting_example_bool": "Exemple d’opcion booleana",
|
||||
"global_settings_unknown_setting_from_settings_file": "Clau desconeguda dins los paramètres : {setting_key:s}, apartada e salvagardada dins /etc/yunohost/settings-unknown.json",
|
||||
"installation_failed": "Quicòm a trucat e l’installacion a pas reüssit",
|
||||
"ldap_initialized": "L’annuari LDAP es inicializat",
|
||||
"main_domain_change_failed": "Modificacion impossibla del domeni màger",
|
||||
"main_domain_changed": "Lo domeni màger es estat modificat",
|
||||
"migrate_tsig_end": "La migracion cap a HMAC-SHA512 es acabada",
|
||||
"migrate_tsig_wait_2": "2 minutas…",
|
||||
"migrate_tsig_wait_3": "1 minuta…",
|
||||
"migrate_tsig_wait_4": "30 segondas…",
|
||||
"migration_description_0002_migrate_to_tsig_sha256": "Melhora la seguretat de DynDNS TSIG en utilizar SHA512 allòc de MD5",
|
||||
"migration_description_0003_migrate_to_stretch": "Mesa a nivèl del sistèma cap a Debian Stretch e YunoHost 3.0",
|
||||
"migration_0003_start": "Aviada de la migracion cap a Stretech. Los jornals seràn disponibles dins {logfile}.",
|
||||
"migration_0003_patching_sources_list": "Petaçatge de sources.lists…",
|
||||
"migration_0003_main_upgrade": "Aviada de la mesa a nivèl màger…",
|
||||
"migration_0003_fail2ban_upgrade": "Aviada de la mesa a nivèl de Fail2Ban…",
|
||||
"migration_0003_not_jessie": "La distribucion Debian actuala es pas Jessie !",
|
||||
"migrations_cant_reach_migration_file": "Impossible d’accedir als fichièrs de migracion amb lo camin %s",
|
||||
"migrations_list_conflict_pending_done": "Podètz pas utilizar --previous e --done a l’encòp.",
|
||||
"migrations_loading_migration": "Cargament de la migracion {id}…",
|
||||
"migrations_no_migrations_to_run": "Cap de migracion de lançar",
|
||||
"no_internet_connection": "Lo servidor es pas connectat a Internet",
|
||||
"package_unknown": "Paquet « {pkgname} » desconegut",
|
||||
"packages_upgrade_failed": "Actualizacion de totes los paquets impossibla",
|
||||
"pattern_domain": "Deu èsser un nom de domeni valid (ex : mon-domeni.org)",
|
||||
"pattern_email": "Deu èsser una adreça electronica valida (ex : escais@domeni.org)",
|
||||
|
@ -177,11 +154,7 @@
|
|||
"certmanager_attempt_to_replace_valid_cert": "Sètz a remplaçar un certificat corrècte e valid pel domeni {domain:s} ! (Utilizatz --force per cortcircuitar)",
|
||||
"certmanager_cert_renew_success": "Renovèlament capitat d’un certificat Let’s Encrypt pel domeni « {domain:s} »",
|
||||
"certmanager_certificate_fetching_or_enabling_failed": "Sembla qu’utilizar lo nòu certificat per {domain:s} fonciona pas...",
|
||||
"certmanager_conflicting_nginx_file": "Impossible de preparar lo domeni pel desfís ACME : lo fichièr de configuracion NGINX {filepath:s} es en conflicte e deu èsser levat d’en primièr",
|
||||
"certmanager_couldnt_fetch_intermediate_cert": "Expiracion del relambi pendent l’ensag de recuperacion del certificat intermediari dins de Let’s Encrypt. L’installacion / lo renovèlament es estat interromput - tornatz ensajar mai tard.",
|
||||
"certmanager_error_no_A_record": "Cap d’enregistrament DNS « A » pas trobat per {domain:s}. Vos cal indicar que lo nom de domeni mene a vòstra maquina per poder installar un certificat Let’S Encrypt ! (Se sabètz çò que fasètz, utilizatz --no-checks per desactivar las verificacions.)",
|
||||
"certmanager_hit_rate_limit": "Tròp de certificats son ja estats demandats recentament per aqueste ensem de domeni {domain:s}. Mercés de tornar ensajar mai tard. Legissètz https://letsencrypt.org/docs/rate-limits/ per mai detalhs",
|
||||
"certmanager_http_check_timeout": "Expiracion del relambi d’ensag del servidor de se contactar via HTTP amb son adreça IP publica {domain:s} amb l’adreça {ip:s}. Coneissètz benlèu de problèmas d’hairpinning o lo parafuòc/router amont de vòstre servidor es mal configurat.",
|
||||
"domain_dns_conf_is_just_a_recommendation": "Aqueste pagina mòstra la configuracion *recomandada*. Non configura *pas* lo DNS per vos. Sètz responsable de la configuracion de vòstra zòna DNS en çò de vòstre registrar DNS amb aquesta recomandacion.",
|
||||
"domain_dyndns_already_subscribed": "Avètz ja soscrich a un domeni DynDNS",
|
||||
"domain_uninstall_app_first": "Una o mantuna aplicacions son installadas sus aqueste domeni. Mercés de las desinstallar d’en primièr abans de suprimir aqueste domeni",
|
||||
|
@ -191,9 +164,6 @@
|
|||
"global_settings_bad_choice_for_enum": "La valor del paramètre {setting:s} es incorrècta. Recebut : {choice:s}, mas las opcions esperadas son : {available_choices:s}",
|
||||
"global_settings_bad_type_for_setting": "Lo tipe del paramètre {setting:s} es incorrècte, recebut : {received_type:s}, esperat {expected_type:s}",
|
||||
"global_settings_cant_write_settings": "Fracàs de l’escritura del fichièr de configuracion, rason : {reason:s}",
|
||||
"global_settings_setting_example_enum": "Exemple d’opcion de tipe enumeracion",
|
||||
"global_settings_setting_example_int": "Exemple d’opcion de tipe entièr",
|
||||
"global_settings_setting_example_string": "Exemple d’opcion de tipe cadena",
|
||||
"global_settings_unknown_type": "Situacion inesperada, la configuracion {setting:s} sembla d’aver lo tipe {unknown_type:s} mas es pas un tipe pres en carga pel sistèma.",
|
||||
"hook_exec_failed": "Fracàs de l’execucion del script : « {path:s} »",
|
||||
"hook_exec_not_terminated": "Lo escript « {path:s} » a pas acabat corrèctament",
|
||||
|
@ -202,12 +172,6 @@
|
|||
"ldap_init_failed_to_create_admin": "L’inicializacion de LDAP a pas pogut crear l’utilizaire admin",
|
||||
"mail_domain_unknown": "Lo domeni de corrièl « {domain:s} » es desconegut",
|
||||
"mailbox_used_space_dovecot_down": "Lo servici corrièl Dovecot deu èsser aviat, se volètz conéisser l’espaci ocupat per la messatjariá",
|
||||
"migrate_tsig_failed": "La migracion del domeni DynDNS {domain} cap a HMAC-SHA512 a pas capitat, anullacion de las modificacions. Error : {error_code} - {error}",
|
||||
"migrate_tsig_wait": "Esperem 3 minutas que lo servidor DynDNS prenga en compte la novèla clau…",
|
||||
"migrate_tsig_not_needed": "Sembla qu’utilizatz pas un domeni DynDNS, donc cap de migracion es pas necessària.",
|
||||
"migration_0003_yunohost_upgrade": "Aviada de la mesa a nivèl del paquet YunoHost… La migracion acabarà, mas l’actualizacion reala se realizarà tot bèl aprèp. Un còp acabada, poiretz vos reconnectar a l’administracion web.",
|
||||
"migration_0003_system_not_fully_up_to_date": "Lo sistèma es pas complètament a jorn. Mercés de lançar una mesa a jorn classica abans de començar la migracion per Stretch.",
|
||||
"migration_0003_modified_files": "Mercés de notar que los fichièrs seguents son estats detectats coma modificats manualament e poiràn èsser escafats a la fin de la mesa a nivèl : {manually_modified_files}",
|
||||
"service_disable_failed": "Impossible de desactivar lo servici « {service:s} »↵\n↵\nJornals recents : {logs:s}",
|
||||
"service_disabled": "Lo servici « {service:s} » es desactivat",
|
||||
"service_enable_failed": "Impossible d’activar lo servici « {service:s} »↵\n↵\nJornals recents : {logs:s}",
|
||||
|
@ -232,8 +196,6 @@
|
|||
"user_unknown": "Utilizaire « {user:s} » desconegut",
|
||||
"user_update_failed": "Modificacion impossibla de l’utilizaire",
|
||||
"user_updated": "L’utilizaire es estat modificat",
|
||||
"yunohost_ca_creation_failed": "Creacion impossibla de l’autoritat de certificacion",
|
||||
"yunohost_ca_creation_success": "L’autoritat de certificacion locala es creada.",
|
||||
"service_description_avahi-daemon": "permet d’aténher vòstre servidor via yunohost.local sus vòstre ret local",
|
||||
"service_description_dnsmasq": "gerís la resolucion dels noms de domeni (DNS)",
|
||||
"updating_apt_cache": "Actualizacion de la lista dels paquets disponibles…",
|
||||
|
@ -266,19 +228,11 @@
|
|||
"service_description_ssh": "vos permet de vos connectar a distància a vòstre servidor via un teminal (protocòl SSH)",
|
||||
"service_description_yunohost-api": "permet las interaccions entre l’interfàcia web de YunoHost e le sistèma",
|
||||
"service_description_yunohost-firewall": "gerís los pòrts de connexion dobèrts e tampats als servicis",
|
||||
"executing_command": "Execucion de la comanda « {command:s} »…",
|
||||
"executing_script": "Execucion del script « {script:s} »…",
|
||||
"global_settings_cant_serialize_settings": "Fracàs de la serializacion de las donadas de parametratge, rason : {reason:s}",
|
||||
"ip6tables_unavailable": "Podètz pas jogar amb ip6tables aquí. Siá sèts dins un contenedor, siá vòstre nuclèu es pas compatible amb aquela opcion",
|
||||
"iptables_unavailable": "Podètz pas jogar amb iptables aquí. Siá sèts dins un contenedor, siá vòstre nuclèu es pas compatible amb aquela opcion",
|
||||
"mail_alias_remove_failed": "Supression impossibla de l’alias de corrièl « {mail:s} »",
|
||||
"mail_forward_remove_failed": "Supression impossibla del corrièl de transferiment « {mail:s} »",
|
||||
"migrate_tsig_start": "L’algorisme de generacion de claus es pas pro securizat per la signatura TSIG del domeni « {domain} », lançament de la migracion cap a un mai segur HMAC-SHA-512",
|
||||
"migration_description_0001_change_cert_group_to_sslcert": "Càmbia las permissions de grop dels certificats de « metronome » per « ssl-cert »",
|
||||
"migration_0003_restoring_origin_nginx_conf": "Vòstre fichièr /etc/nginx/nginx.conf es estat modificat manualament. La migracion reïnicializarà d’en primièr son estat origina… Lo fichièr precedent serà disponible coma {backup_dest}.",
|
||||
"migration_0003_still_on_jessie_after_main_upgrade": "Quicòm a trucat pendent la mesa a nivèl màger : lo sistèma es encara jos Jessie ?!? Per trobar lo problèma, agachatz {log}…",
|
||||
"migration_0003_general_warning": "Notatz qu’aquesta migracion es una operacion delicata. Encara que la còla YunoHost aguèsse fach çò melhor per la tornar legir e provar, la migracion poiriá copar de parts del sistèma o de las aplicacions.\n\nEn consequéncia, vos recomandam :\n· · · · - de lançar una salvagarda de vòstras donadas o aplicacions criticas. Mai d’informacions a https://yunohost.org/backup ;\n· · · · - d’èsser pacient aprèp aver lançat la migracion : segon vòstra connexion Internet e material, pòt trigar qualques oras per que tot siá mes al nivèl.\n\nEn mai, lo pòrt per SMTP, utilizat pels clients de corrièls extèrns (coma Thunderbird o K9-Mail per exemple) foguèt cambiat de 465 (SSL/TLS) per 587 (STARTTLS). L’ancian pòrt 465 serà automaticament tampat e lo nòu pòrt 587 serà dobèrt dins lo parafuòc. Vosautres e vòstres utilizaires *auretz* d’adaptar la configuracion de vòstre client de corrièl segon aqueles cambiaments !",
|
||||
"migration_0003_problematic_apps_warning": "Notatz que las aplicacions seguentas, saique problematicas, son estadas desactivadas. Semblan d’aver estadas installadas d’una lista d’aplicacions o que son pas marcadas coma «working ». En consequéncia, podèm pas assegurar que tendràn de foncionar aprèp la mesa a nivèl : {problematic_apps}",
|
||||
"migrations_migration_has_failed": "La migracion {id} a pas capitat, abandon. Error : {exception}",
|
||||
"migrations_skip_migration": "Passatge de la migracion {id}…",
|
||||
"migrations_to_be_ran_manually": "La migracion {id} deu èsser lançada manualament. Mercés d’anar a Aisinas > Migracion dins l’interfàcia admin, o lançar « yunohost tools migrations run ».",
|
||||
|
@ -288,7 +242,6 @@
|
|||
"service_description_fail2ban": "protegís contra los atacs brute-force e d’autres atacs venents d’Internet",
|
||||
"service_description_metronome": "gerís los comptes de messatjariás instantanèas XMPP",
|
||||
"service_description_nginx": "fornís o permet l’accès a totes los sites web albergats sus vòstre servidor",
|
||||
"service_description_nslcd": "gerís la connexion en linha de comanda dels utilizaires YunoHost",
|
||||
"service_description_redis-server": "una basa de donadas especializada per un accès rapid a las donadas, las filas d’espèra e la comunicacion entre programas",
|
||||
"service_description_rspamd": "filtra lo corrièl pas desirat e mai foncionalitats ligadas al corrièl",
|
||||
"pattern_mailbox_quota": "Deu èsser una talha amb lo sufixe b/k/M/G/T o 0 per desactivar la quòta",
|
||||
|
@ -298,10 +251,8 @@
|
|||
"pattern_username": "Deu èsser compausat solament de caractèrs alfanumerics en letras minusculas e de tirets basses",
|
||||
"experimental_feature": "Atencion : aquesta foncionalitat es experimentala e deu pas èsser considerada coma establa, deuriatz pas l’utilizar levat que sapiatz çò que fasètz.",
|
||||
"log_corrupted_md_file": "Lo fichièr YAML de metadonadas ligat als jornals d’audit es damatjat : « {md_file} »\nError : {error:s}",
|
||||
"log_category_404": "La categoria de jornals d’audit « {category} » existís pas",
|
||||
"log_link_to_log": "Jornal complèt d’aquesta operacion : <a href=\"#/tools/logs/{name}\" style=\"text-decoration:underline\">{desc}</a>",
|
||||
"log_help_to_get_log": "Per veire lo jornal d’aquesta operacion « {desc} », utilizatz la comanda « yunohost log show {name}{name} »",
|
||||
"backup_php5_to_php7_migration_may_fail": "Impossible de convertir vòstre archiu per prendre en carga PHP 7, la restauracion de vòstras aplicacions PHP pòt reüssir pas a restaurar vòstras aplicacions PHP (rason : {error:s})",
|
||||
"log_link_to_failed_log": "L’operacion « {desc} » a pas capitat ! Per obténer d’ajuda, mercés <a href=\"#/tools/logs/{name}\"> de fornir lo jornal complèt de l’operacion</a>",
|
||||
"log_help_to_get_failed_log": "L’operacion « {desc} » a pas reüssit ! Per obténer d’ajuda, mercés de partejar lo jornal d’audit complèt d’aquesta operacion en utilizant la comanda « yunohost log share {name} »",
|
||||
"log_does_exists": "I a pas cap de jornal d’audit per l’operacion amb lo nom « {log} », utilizatz « yunohost log list » per veire totes los jornals d’operacion disponibles",
|
||||
|
@ -333,17 +284,8 @@
|
|||
"log_tools_shutdown": "Atudar lo servidor",
|
||||
"log_tools_reboot": "Reaviar lo servidor",
|
||||
"mail_unavailable": "Aquesta adreça electronica es reservada e deu èsser automaticament atribuida al tot bèl just primièr utilizaire",
|
||||
"migration_description_0004_php5_to_php7_pools": "Tornar configurar lo pools PHP per utilizar PHP 7 allòc del 5",
|
||||
"migration_description_0005_postgresql_9p4_to_9p6": "Migracion de las basas de donadas de PostgreSQL9.4 cap a 9.6",
|
||||
"migration_0005_postgresql_94_not_installed": "PostgreSQL es pas installat sul sistèma. I a pas res per far.",
|
||||
"migration_0005_postgresql_96_not_installed": "Avèm trobat que Postgresql 9.4 es installat, mas cap de version de Postgresql 9.6 pas trobada !? Quicòm d’estranh a degut arribar a vòstre sistèma :( …",
|
||||
"migration_0005_not_enough_space": "I a pas pro d’espaci disponible sus {path} per lançar la migracion d’aquela passa :(.",
|
||||
"service_description_php7.0-fpm": "executa d’aplicacions escrichas en PHP amb nginx",
|
||||
"users_available": "Lista dels utilizaires disponibles :",
|
||||
"good_practices_about_admin_password": "Sètz per definir un nòu senhal per l’administracion. Lo senhal deu almens conténer 8 caractèrs - encara que siá de bon far d’utilizar un senhal mai long qu’aquò (ex. una passafrasa) e/o d’utilizar mantun tipe de caractèrs (majuscula, minuscula, nombre e caractèrs especials).",
|
||||
"good_practices_about_user_password": "Sètz a mand de definir un nòu senhal d’utilizaire. Lo nòu senhal deu conténer almens 8 caractèrs, es de bon far d’utilizar un senhal mai long (es a dire una frasa de senhal) e/o utilizar mantun tipe de caractèrs (majusculas, minusculas, nombres e caractèrs especials).",
|
||||
"migration_description_0006_sync_admin_and_root_passwords": "Sincronizar los senhals admin e root",
|
||||
"migration_0006_disclaimer": "Ara YunoHost s’espèra que los senhals admin e root sián sincronizats. En lançant aquesta migracion, vòstre senhal root serà remplaçat pel senhal admin.",
|
||||
"password_listed": "Aqueste senhal es un dels mai utilizats al monde. Se vos plai utilizatz-ne un mai unic.",
|
||||
"password_too_simple_1": "Lo senhal deu conténer almens 8 caractèrs",
|
||||
"password_too_simple_2": "Lo senhal deu conténer almens 8 caractèrs e numbres, majusculas e minusculas",
|
||||
|
@ -365,13 +307,9 @@
|
|||
"file_does_not_exist": "Lo camin {path:s} existís pas.",
|
||||
"global_settings_setting_security_password_admin_strength": "Fòrça del senhal administrator",
|
||||
"global_settings_setting_security_password_user_strength": "Fòrça del senhal utilizaire",
|
||||
"migration_description_0007_ssh_conf_managed_by_yunohost_step1": "La configuracion SSH serà gerada per YunoHost (etapa 1, automatica)",
|
||||
"migration_description_0008_ssh_conf_managed_by_yunohost_step2": "Daissar YunoHost gerir la configuracion SSH (etapa 2, manuala)",
|
||||
"migration_0007_cancelled": "Impossible de melhorar lo biais de gerir la configuracion SSH.",
|
||||
"root_password_replaced_by_admin_password": "Lo senhal root es estat remplaçat pel senhal administrator.",
|
||||
"service_restarted": "Lo servici '{service:s}' es estat reaviat",
|
||||
"admin_password_too_long": "Causissètz un senhal d’almens 127 caractèrs",
|
||||
"migration_0007_cannot_restart": "SSH pòt pas èsser reavit aprèp aver ensajat d’anullar la migracion numèro 6.",
|
||||
"service_reloaded": "Lo servici « {service:s} » es estat tornat cargar",
|
||||
"already_up_to_date": "I a pas res a far ! Tot es ja a jorn !",
|
||||
"app_action_cannot_be_ran_because_required_services_down": "Aquestas aplicacions necessitan d’èsser lançadas per poder executar aquesta accion : {services}. Abans de contunhar deuriatz ensajar de reaviar los servicis seguents (e tanben cercar perque son tombats en pana) : {services}",
|
||||
|
@ -385,10 +323,7 @@
|
|||
"tools_upgrade_special_packages_completed": "L’actualizacion dels paquets de YunoHost es acabada !\nQuichatz [Entrada] per tornar a la linha de comanda",
|
||||
"dpkg_is_broken": "Podètz pas far aquò pel moment perque dpkg/APT (los gestionaris de paquets del sistèma) sembla èsser mal configurat… Podètz ensajar de solucionar aquò en vos connectar via SSH e en executar « sudo dpkg --configure -a ».",
|
||||
"global_settings_setting_service_ssh_allow_deprecated_dsa_hostkey": "Autorizar l’utilizacion de la clau òst DSA (obsolèta) per la configuracion del servici SSH",
|
||||
"migration_0008_general_disclaimer": "Per melhorar la seguretat del servidor, es recomandat de daissar YunoHost gerir la configuracion SSH. Vòstra configuracion actuala es diferenta de la configuracion recomandada. Se daissatz YunoHost la reconfigurar, lo biais de vos connectar al servidor via SSH cambiarà coma aquò :",
|
||||
"hook_json_return_error": "Fracàs de la lectura del retorn de l’script {path:s}. Error : {msg:s}. Contengut brut : {raw_content}",
|
||||
"migration_0008_port": " - vos cal vos connectar en utilizar lo pòrt 22 allòc de vòstre pòrt SSH actual personalizat. Esitetz pas a lo reconfigurar ;",
|
||||
"migration_0009_not_needed": "Sembla qu’i aguèt ja una migracion. Passem.",
|
||||
"pattern_password_app": "O planhèm, los senhals devon pas conténer los caractèrs seguents : {forbidden_chars}",
|
||||
"regenconf_file_backed_up": "Lo fichièr de configuracion « {conf} » es estat salvagardat dins « {backup} »",
|
||||
"regenconf_file_copy_failed": "Còpia impossibla del nòu fichièr de configuracion « {new} » cap a « {conf} »",
|
||||
|
@ -409,16 +344,10 @@
|
|||
"global_settings_setting_security_nginx_compatibility": "Solucion de compromés entre compatibilitat e seguretat pel servidor web NGINX Afècta los criptografs (e d’autres aspèctes ligats amb la seguretat)",
|
||||
"global_settings_setting_security_ssh_compatibility": "Solucion de compromés entre compatibilitat e seguretat pel servidor SSH. Afècta los criptografs (e d’autres aspèctes ligats amb la seguretat)",
|
||||
"global_settings_setting_security_postfix_compatibility": "Solucion de compromés entre compatibilitat e seguretat pel servidor Postfix. Afècta los criptografs (e d’autres aspèctes ligats amb la seguretat)",
|
||||
"migration_description_0010_migrate_to_apps_json": "Levar las appslists despreciadas e utilizar la nòva lista unificada « apps.json » allòc",
|
||||
"migration_0008_root": " - vos poiretz pas vos connectar coma root via SSH. Allòc auretz d’utilizar l’utilizaire admin;",
|
||||
"migration_0008_warning": "Se comprenètz aquestes avertiments e qu’acceptatz de daissar YunoHost remplaçar la configuracion actuala, començatz la migracion. Autrament podètz tanben passar la migracion, encara que non siá pas recomandat.",
|
||||
"service_regen_conf_is_deprecated": "« yunohost service regen-conf » es despreciat ! Utilizatz « yunohost tools regen-conf » allòc.",
|
||||
"service_reload_failed": "Impossible de recargar lo servici « {service:s} »\n\nJornal d’audit recent : {logs:s}",
|
||||
"service_restart_failed": "Impossible de reaviar lo servici « {service:s} »\n\nJornal d’audit recent : {logs:s}",
|
||||
"service_reload_or_restart_failed": "Impossible de recargar o reaviar lo servici « {service:s} »\n\nJornal d’audit recent : {logs:s}",
|
||||
"migration_description_0009_decouple_regenconf_from_services": "Desassociar lo mecanisme de regen-conf dels servicis",
|
||||
"migration_0008_dsa": " - la clau DSA serà desactivada. En consequéncia, poiriatz aver d’invalidar un messatge espaurugant del client SSH, e tornar verificar l’emprunta del servidor;",
|
||||
"migration_0008_no_warning": "Cap de risc important es estat detectat per remplaçar e la configuracion SSH, mas podèm pas n’èsser totalament segur ;) Se acceptatz que YunoHost remplace la configuracion actuala, començatz la migracion. Autrament, podètz passar la migracion, tot ben que non siá pas recomandat.",
|
||||
"regenconf_file_kept_back": "S’espèra que lo fichièr de configuracion « {conf} » siá suprimit per regen-conf (categoria {category} mas es estat mantengut.",
|
||||
"this_action_broke_dpkg": "Aquesta accion a copat dpkg/apt (los gestionaris de paquets del sistèma)… Podètz ensajar de resòlver aqueste problèma en vos connectant amb SSH e executant « sudo dpkg --configure -a ».",
|
||||
"tools_upgrade_at_least_one": "Especificatz --apps O --system",
|
||||
|
@ -435,20 +364,9 @@
|
|||
"group_deletion_failed": "Fracàs de la supression del grop « {group} » : {error}",
|
||||
"group_unknown": "Lo grop « {group} » es desconegut",
|
||||
"log_user_group_delete": "Suprimir lo grop « {} »",
|
||||
"migration_0011_backup_before_migration": "Creacion d’una còpia de seguretat de la basa de donadas LDAP e de la configuracion de las aplicacions abans d’efectuar la migracion.",
|
||||
"migration_0011_create_group": "Creacion d’un grop per cada utilizaire…",
|
||||
"migration_0011_done": "Migracion complèta. Ara podètz gerir de grops d’utilizaires.",
|
||||
"migration_0011_LDAP_update_failed": "Actualizacion impossibla de LDAP. Error : {error:s}",
|
||||
"migration_0011_migration_failed_trying_to_rollback": "La migracion a fracassat… ensag de tornar lo sistèma a l’estat anterio.",
|
||||
"migration_0011_rollback_success": "Restauracion del sistèma reüssida.",
|
||||
"group_updated": "Lo grop « {group} » es estat actualizat",
|
||||
"group_update_failed": "Actualizacion impossibla del grop « {group} » : {error}",
|
||||
"log_user_group_update": "Actualizar lo grop « {} »",
|
||||
"migration_description_0011_setup_group_permission": "Configurar lo grop d’utilizaire e las permission de las aplicacions e dels servicis",
|
||||
"migration_0011_can_not_backup_before_migration": "La salvagarda del sistèma abans la migracion a pas capitat. La migracion a fracassat. Error : {error:s}",
|
||||
"migration_0011_migrate_permission": "Migracion de las permission dels paramètres d’aplicacion a LDAP…",
|
||||
"migration_0011_update_LDAP_database": "Actualizacion de la basa de donadas LDAP…",
|
||||
"migration_0011_update_LDAP_schema": "Actualizacion de l’esquèma LDAP…",
|
||||
"permission_already_exist": "La permission « {permission:s} » existís ja",
|
||||
"permission_created": "Permission « {permission:s} » creada",
|
||||
"permission_creation_failed": "Creacion impossibla de la permission",
|
||||
|
@ -457,9 +375,7 @@
|
|||
"permission_not_found": "Permission « {permission:s} » pas trobada",
|
||||
"permission_update_failed": "Fracàs de l’actualizacion de la permission",
|
||||
"permission_updated": "La permission « {permission:s} » es estada actualizada",
|
||||
"permission_update_nothing_to_do": "Cap de permission d’actualizar",
|
||||
"mailbox_disabled": "La bóstia de las letras es desactivada per l’utilizaire {user:s}",
|
||||
"migration_description_0012_postgresql_password_to_md5_authentication": "Forçar l’autentificacion PostgreSQL a utilizar MD5 per las connexions localas",
|
||||
"migrations_success_forward": "Migracion {id} corrèctament realizada !",
|
||||
"migrations_running_forward": "Execucion de la migracion {id}…",
|
||||
"migrations_must_provide_explicit_targets": "Devètz fornir una cibla explicita quand utilizatz using --skip o --force-rerun",
|
||||
|
@ -471,10 +387,8 @@
|
|||
"migrations_no_such_migration": "I a pas cap de migracion apelada « {id} »",
|
||||
"migrations_not_pending_cant_skip": "Aquestas migracions son pas en espèra, las podètz pas doncas ignorar : {ids}",
|
||||
"app_action_broke_system": "Aquesta accion sembla aver copat de servicis importants : {services}",
|
||||
"diagnosis_display_tip_web": "Podètz anar a la seccion Diagnostic (dins l’ecran d’acuèlh) per veire los problèmas trobats.",
|
||||
"diagnosis_ip_no_ipv6": "Lo servidor a pas d’adreça IPv6 activa.",
|
||||
"diagnosis_ip_not_connected_at_all": "Lo servidor sembla pas connectat a Internet ?!",
|
||||
"diagnosis_security_all_good": "Cap de vulnerabilitat de seguretat critica pas trobada.",
|
||||
"diagnosis_description_regenconf": "Configuracion sistèma",
|
||||
"diagnosis_http_ok": "Lo domeni {domain} accessible de l’exterior.",
|
||||
"app_full_domain_unavailable": "Aquesta aplicacion a d’èsser installada sul seu pròpri domeni, mas i a d’autras aplicacions installadas sus aqueste domeni « {domain} ». Podètz utilizar allòc un josdomeni dedicat a aquesta aplicacion.",
|
||||
|
@ -487,7 +401,6 @@
|
|||
"log_permission_url": "Actualizacion de l’URL ligada a la permission « {} »",
|
||||
"app_install_failed": "Installacion impossibla de {app} : {error}",
|
||||
"app_install_script_failed": "Una error s’es producha en installar lo script de l’aplicacion",
|
||||
"migration_0011_failed_to_remove_stale_object": "Supression impossibla d’un objècte obsolèt {dn} : {error}",
|
||||
"apps_already_up_to_date": "Totas las aplicacions son ja al jorn",
|
||||
"app_remove_after_failed_install": "Supression de l’aplicacion aprèp fracàs de l’installacion...",
|
||||
"group_already_exist": "Lo grop {group} existís ja",
|
||||
|
@ -499,7 +412,6 @@
|
|||
"diagnosis_basesystem_kernel": "Lo servidor fonciona amb lo nuclèu Linuxl {kernel_version}",
|
||||
"diagnosis_basesystem_ynh_single_version": "{package} version : {version} ({repo})",
|
||||
"diagnosis_basesystem_ynh_inconsistent_versions": "Utilizatz de versions inconsistentas dels paquets de YunoHost… probablament a causa d'una actualizacion fracassada o parciala.",
|
||||
"diagnosis_display_tip_cli": "Podètz executar « yunohost diagnosis show --issues --human-readable » per mostrar las errors trobadas.",
|
||||
"diagnosis_ignored_issues": "(+ {nb_ignored} problèma(es) ignorat(s))",
|
||||
"diagnosis_everything_ok": "Tot sembla corrècte per {category} !",
|
||||
"diagnosis_ip_connected_ipv4": "Lo servidor es connectat a Internet via IPv4 !",
|
||||
|
@ -522,13 +434,11 @@
|
|||
"diagnosis_description_services": "Verificacion d’estat de servicis",
|
||||
"diagnosis_description_systemresources": "Resorgas sistèma",
|
||||
"diagnosis_description_ports": "Exposicion dels pòrts",
|
||||
"diagnosis_description_security": "Verificacion de seguretat",
|
||||
"diagnosis_ports_unreachable": "Lo pòrt {port} es pas accessible de l’exterior.",
|
||||
"diagnosis_ports_ok": "Lo pòrt {port} es accessible de l’exterior.",
|
||||
"diagnosis_http_unreachable": "Lo domeni {domain} es pas accessible via HTTP de l’exterior.",
|
||||
"diagnosis_unknown_categories": "La categorias seguentas son desconegudas : {categories}",
|
||||
"diagnosis_ram_low": "Lo sistèma a {available} ({available_percent}%) de memòria RAM disponibla d’un total de {total}). Atencion.",
|
||||
"diagnosis_regenconf_manually_modified_debian": "Lo fichier de configuracion {file} foguèt modificat manualament respècte al fichièr per defaut de Debian.",
|
||||
"log_permission_create": "Crear la permission « {} »",
|
||||
"log_permission_delete": "Suprimir la permission « {} »",
|
||||
"log_user_group_create": "Crear lo grop « {} »",
|
||||
|
@ -538,7 +448,6 @@
|
|||
"diagnosis_found_warnings": "Trobat {warnings} element(s) que se poirián melhorar per {category}.",
|
||||
"diagnosis_dns_missing_record": "Segon la configuracion DNS recomandada, vos calriá ajustar un enregistrament DNS\ntipe: {type}\nnom: {name}\nvalor: {value}",
|
||||
"diagnosis_dns_discrepancy": "La configuracion DNS seguenta sembla pas la configuracion recomandada : <br>Tipe : <code>{type}</code><br>Nom : <code>{name}</code><br>Valors actualas :<code> {current]</code><br>Valor esperada : <code>{value}</code>",
|
||||
"diagnosis_regenconf_manually_modified_debian_details": "Es pas problematic, mas car téner d’agacher...",
|
||||
"diagnosis_ports_could_not_diagnose": "Impossible de diagnosticar se los pòrts son accessibles de l’exterior.",
|
||||
"diagnosis_ports_could_not_diagnose_details": "Error : {error}",
|
||||
"diagnosis_http_could_not_diagnose": "Impossible de diagnosticar se lo domeni es accessible de l’exterior.",
|
||||
|
@ -547,7 +456,6 @@
|
|||
"apps_catalog_failed_to_download": "Telecargament impossible del catalòg d’aplicacions {apps_catalog} : {error}",
|
||||
"apps_catalog_obsolete_cache": "La memòria cache del catalòg d’aplicacion es voida o obsolèta.",
|
||||
"apps_catalog_update_success": "Lo catalòg d’aplicacions es a jorn !",
|
||||
"diagnosis_mail_ougoing_port_25_ok": "Lo pòrt de sortida 25 es pas blocat e lo corrièr electronic pòt partir als autres servidors.",
|
||||
"diagnosis_description_mail": "Corrièl",
|
||||
"app_upgrade_script_failed": "Una error s’es producha pendent l’execucion de l’script de mesa a nivèl de l’aplicacion",
|
||||
"diagnosis_cant_run_because_of_dep": "Execucion impossibla del diagnostic per {category} mentre que i a de problèmas importants ligats amb {dep}.",
|
||||
|
@ -560,7 +468,6 @@
|
|||
"diagnosis_services_conf_broken": "La configuracion es copada pel servici {service} !",
|
||||
"diagnosis_ports_needed_by": "Es necessari qu’aqueste pòrt siá accessible pel servici {service}",
|
||||
"diagnosis_diskusage_low": "Lo lòc d’emmagazinatge <code>{mountpoint}</code> (sul periferic <code>{device}</code>) a solament {free} ({free_percent}%). Siatz prudent.",
|
||||
"migration_description_0014_remove_app_status_json": "Suprimir los fichièrs d’aplicacion status.json eretats",
|
||||
"dyndns_provider_unreachable": "Impossible d’atenher lo provesidor Dyndns : siá vòstre YunoHost es pas corrèctament connectat a Internet siá lo servidor dynette es copat.",
|
||||
"diagnosis_services_bad_status_tip": "Podètz ensajar de <a href='#/services/{service}'>reaviar lo servici</a>, e se non fonciona pas, podètz agachar <a href='#/services/{service}'>los jornals de servici a la pagina web d’administracion</a>(en linha de comanda podètz utilizar <cmd>yunohost service restart {service}</cmd> e <cmd>yunohost service log {service}</cmd>).",
|
||||
"diagnosis_http_connection_error": "Error de connexion : connexion impossibla al domeni demandat, benlèu qu’es pas accessible.",
|
||||
|
@ -578,7 +485,6 @@
|
|||
"diagnosis_mail_ehlo_could_not_diagnose_details": "Error : {error}",
|
||||
"diagnosis_mail_queue_unavailable_details": "Error : {error}",
|
||||
"diagnosis_basesystem_hardware": "L’arquitectura del servidor es {virt} {arch}",
|
||||
"diagnosis_basesystem_hardware_board": "Lo modèl de carta del servidor es {model}",
|
||||
"backup_archive_corrupted": "Sembla que l’archiu de la salvagarda « {archive} » es corromput : {error}",
|
||||
"diagnosis_domain_expires_in": "{domain} expiraà d’aquí {days} jorns.",
|
||||
"migration_0015_cleaning_up": "Netejatge de la memòria cache e dels paquets pas mai necessaris…",
|
||||
|
@ -608,4 +514,4 @@
|
|||
"diagnosis_basesystem_hardware_model": "Lo modèl del servidor es {model}",
|
||||
"backup_archive_cant_retrieve_info_json": "Obtencion impossibla de las informacions de l’archiu « {archive} »... Se pòt pas recuperar lo fichièr info.json (o es pas un fichièr json valid).",
|
||||
"app_packaging_format_not_supported": "Se pòt pas installar aquesta aplicacion pr’amor que son format es pas pres en carga per vòstra version de YunoHost. Deuriatz considerar actualizar lo sistèma."
|
||||
}
|
||||
}
|
|
@ -9,4 +9,4 @@
|
|||
"admin_password": "Hasło administratora",
|
||||
"action_invalid": "Nieprawidłowa operacja '{action:s}'",
|
||||
"aborting": "Przerywanie."
|
||||
}
|
||||
}
|
|
@ -14,14 +14,12 @@
|
|||
"app_unknown": "Aplicação desconhecida",
|
||||
"app_upgrade_failed": "Não foi possível atualizar {app:s}",
|
||||
"app_upgraded": "{app:s} atualizada com sucesso",
|
||||
"ask_email": "Endereço de Email",
|
||||
"ask_firstname": "Primeiro nome",
|
||||
"ask_lastname": "Último nome",
|
||||
"ask_main_domain": "Domínio principal",
|
||||
"ask_new_admin_password": "Nova senha de administração",
|
||||
"ask_password": "Senha",
|
||||
"backup_created": "Backup completo",
|
||||
"backup_invalid_archive": "Arquivo de backup inválido",
|
||||
"backup_output_directory_not_empty": "A pasta de destino não se encontra vazia",
|
||||
"custom_app_url_required": "Deve fornecer um link para atualizar a sua aplicação personalizada {app:s}",
|
||||
"domain_cert_gen_failed": "Não foi possível gerar o certificado",
|
||||
|
@ -36,16 +34,12 @@
|
|||
"domain_unknown": "Domínio desconhecido",
|
||||
"done": "Concluído.",
|
||||
"downloading": "Transferência em curso...",
|
||||
"dyndns_cron_installed": "Gestor de tarefas cron DynDNS instalado com êxito",
|
||||
"dyndns_cron_remove_failed": "Não foi possível remover o gestor de tarefas cron DynDNS",
|
||||
"dyndns_cron_removed": "Gestor de tarefas cron DynDNS removido com êxito",
|
||||
"dyndns_ip_update_failed": "Não foi possível atualizar o endereço IP a partir de DynDNS",
|
||||
"dyndns_ip_updated": "Endereço IP atualizado com êxito a partir de DynDNS",
|
||||
"dyndns_key_generating": "A chave DNS está a ser gerada, isto pode demorar um pouco...",
|
||||
"dyndns_registered": "Dom+inio DynDNS registado com êxito",
|
||||
"dyndns_registration_failed": "Não foi possível registar o domínio DynDNS: {error:s}",
|
||||
"dyndns_unavailable": "Subdomínio DynDNS indisponível",
|
||||
"executing_script": "A executar o script...",
|
||||
"extracting": "Extração em curso...",
|
||||
"field_invalid": "Campo inválido '{:s}'",
|
||||
"firewall_reloaded": "Firewall recarregada com êxito",
|
||||
|
@ -58,7 +52,6 @@
|
|||
"mail_forward_remove_failed": "Não foi possível remover o reencaminhamento de correio '{mail:s}'",
|
||||
"main_domain_change_failed": "Incapaz alterar o domínio raiz",
|
||||
"main_domain_changed": "Domínio raiz alterado com êxito",
|
||||
"no_internet_connection": "O servidor não está ligado à Internet",
|
||||
"packages_upgrade_failed": "Não foi possível atualizar todos os pacotes",
|
||||
"pattern_domain": "Deve ser um nome de domínio válido (p.e. meu-dominio.org)",
|
||||
"pattern_email": "Deve ser um endereço de correio válido (p.e. alguem@dominio.org)",
|
||||
|
@ -99,7 +92,6 @@
|
|||
"user_update_failed": "Não foi possível atualizar o utilizador",
|
||||
"user_updated": "Utilizador atualizado com êxito",
|
||||
"yunohost_already_installed": "AYunoHost já está instalado",
|
||||
"yunohost_ca_creation_failed": "Incapaz criar o certificado de autoridade",
|
||||
"yunohost_configured": "YunoHost configurada com êxito",
|
||||
"yunohost_installing": "A instalar a YunoHost...",
|
||||
"yunohost_not_installed": "YunoHost ainda não está corretamente configurado. Por favor execute as 'ferramentas pós-instalação yunohost'.",
|
||||
|
@ -134,11 +126,10 @@
|
|||
"backup_archive_name_unknown": "Desconhece-se o arquivo local de backup de nome '{name:s}'",
|
||||
"backup_archive_system_part_not_available": "A seção do sistema '{part:s}' está indisponivel neste backup",
|
||||
"backup_ask_for_copying_if_needed": "Alguns arquivos não consiguiram ser preparados para backup utilizando o metodo que não gasta espaço de disco temporariamente. Para realizar o backup {size:s}MB precisam ser usados temporariamente. Você concorda?",
|
||||
"backup_borg_not_implemented": "O método de backup Borg ainda não foi implementado.",
|
||||
"backup_cant_mount_uncompress_archive": "Não foi possível montar em modo leitura o diretorio de arquivos não comprimido",
|
||||
"backup_copying_to_organize_the_archive": "Copiando {size:s}MB para organizar o arquivo",
|
||||
"app_change_url_identical_domains": "O antigo e o novo domínio / url_path são idênticos ('{domain:s}{path:s}'), nada para fazer.",
|
||||
"password_too_simple_1": "A senha precisa ter pelo menos 8 caracteres",
|
||||
"admin_password_too_long": "Escolha uma senha que contenha menos de 127 caracteres",
|
||||
"aborting": "Abortando."
|
||||
}
|
||||
}
|
|
@ -13,4 +13,4 @@
|
|||
"app_start_restore": "正在恢复{app}……",
|
||||
"action_invalid": "无效操作 '{action:s}'",
|
||||
"ask_lastname": "姓"
|
||||
}
|
||||
}
|
|
@ -3,12 +3,14 @@ addopts = -s -v
|
|||
norecursedirs = dist doc build .tox .eggs
|
||||
testpaths = tests/
|
||||
markers =
|
||||
with_system_archive_from_2p4
|
||||
with_system_archive_from_3p8
|
||||
with_backup_recommended_app_installed
|
||||
clean_opt_dir
|
||||
with_wordpress_archive_from_2p4
|
||||
with_wordpress_archive_from_3p8
|
||||
with_legacy_app_installed
|
||||
with_backup_recommended_app_installed_with_ynh_restore
|
||||
with_permission_app_installed
|
||||
other_domains
|
||||
with_custom_domain
|
||||
filterwarnings =
|
||||
ignore::urllib3.exceptions.InsecureRequestWarning
|
|
@ -90,56 +90,54 @@ def init_logging(interface="cli", debug=False, quiet=False, logdir="/var/log/yun
|
|||
os.makedirs(logdir, 0o750)
|
||||
|
||||
logging_configuration = {
|
||||
'version': 1,
|
||||
'disable_existing_loggers': True,
|
||||
'formatters': {
|
||||
'console': {
|
||||
'format': '%(relativeCreated)-5d %(levelname)-8s %(name)s %(funcName)s - %(fmessage)s'
|
||||
"version": 1,
|
||||
"disable_existing_loggers": True,
|
||||
"formatters": {
|
||||
"console": {
|
||||
"format": "%(relativeCreated)-5d %(levelname)-8s %(name)s %(funcName)s - %(fmessage)s"
|
||||
},
|
||||
'tty-debug': {
|
||||
'format': '%(relativeCreated)-4d %(fmessage)s'
|
||||
},
|
||||
'precise': {
|
||||
'format': '%(asctime)-15s %(levelname)-8s %(name)s %(funcName)s - %(fmessage)s'
|
||||
"tty-debug": {"format": "%(relativeCreated)-4d %(fmessage)s"},
|
||||
"precise": {
|
||||
"format": "%(asctime)-15s %(levelname)-8s %(name)s %(funcName)s - %(fmessage)s"
|
||||
},
|
||||
},
|
||||
'filters': {
|
||||
'action': {
|
||||
'()': 'moulinette.utils.log.ActionFilter',
|
||||
"filters": {
|
||||
"action": {
|
||||
"()": "moulinette.utils.log.ActionFilter",
|
||||
},
|
||||
},
|
||||
'handlers': {
|
||||
'cli': {
|
||||
'level': 'DEBUG' if debug else 'INFO',
|
||||
'class': 'moulinette.interfaces.cli.TTYHandler',
|
||||
'formatter': 'tty-debug' if debug else '',
|
||||
"handlers": {
|
||||
"cli": {
|
||||
"level": "DEBUG" if debug else "INFO",
|
||||
"class": "moulinette.interfaces.cli.TTYHandler",
|
||||
"formatter": "tty-debug" if debug else "",
|
||||
},
|
||||
'api': {
|
||||
'level': 'DEBUG' if debug else 'INFO',
|
||||
'class': 'moulinette.interfaces.api.APIQueueHandler',
|
||||
"api": {
|
||||
"level": "DEBUG" if debug else "INFO",
|
||||
"class": "moulinette.interfaces.api.APIQueueHandler",
|
||||
},
|
||||
'file': {
|
||||
'class': 'logging.FileHandler',
|
||||
'formatter': 'precise',
|
||||
'filename': logfile,
|
||||
'filters': ['action'],
|
||||
"file": {
|
||||
"class": "logging.FileHandler",
|
||||
"formatter": "precise",
|
||||
"filename": logfile,
|
||||
"filters": ["action"],
|
||||
},
|
||||
},
|
||||
'loggers': {
|
||||
'yunohost': {
|
||||
'level': 'DEBUG',
|
||||
'handlers': ['file', interface] if not quiet else ['file'],
|
||||
'propagate': False,
|
||||
"loggers": {
|
||||
"yunohost": {
|
||||
"level": "DEBUG",
|
||||
"handlers": ["file", interface] if not quiet else ["file"],
|
||||
"propagate": False,
|
||||
},
|
||||
'moulinette': {
|
||||
'level': 'DEBUG',
|
||||
'handlers': ['file', interface] if not quiet else ['file'],
|
||||
'propagate': False,
|
||||
"moulinette": {
|
||||
"level": "DEBUG",
|
||||
"handlers": ["file", interface] if not quiet else ["file"],
|
||||
"propagate": False,
|
||||
},
|
||||
},
|
||||
'root': {
|
||||
'level': 'DEBUG',
|
||||
'handlers': ['file', interface] if debug else ['file'],
|
||||
"root": {
|
||||
"level": "DEBUG",
|
||||
"handlers": ["file", interface] if debug else ["file"],
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -150,7 +148,9 @@ def init_logging(interface="cli", debug=False, quiet=False, logdir="/var/log/yun
|
|||
# Logging configuration for API #
|
||||
else:
|
||||
# We use a WatchedFileHandler instead of regular FileHandler to possibly support log rotation etc
|
||||
logging_configuration["handlers"]["file"]["class"] = 'logging.handlers.WatchedFileHandler'
|
||||
logging_configuration["handlers"]["file"][
|
||||
"class"
|
||||
] = "logging.handlers.WatchedFileHandler"
|
||||
|
||||
# This is for when launching yunohost-api in debug mode, we want to display stuff in the console
|
||||
if debug:
|
||||
|
|
|
@ -33,9 +33,11 @@ import re
|
|||
import subprocess
|
||||
import glob
|
||||
import urllib.parse
|
||||
import tempfile
|
||||
from collections import OrderedDict
|
||||
|
||||
from moulinette import msignals, m18n, msettings
|
||||
from moulinette.core import MoulinetteError
|
||||
from moulinette.utils.log import getActionLogger
|
||||
from moulinette.utils.network import download_json
|
||||
from moulinette.utils.process import run_commands, check_output
|
||||
|
@ -57,10 +59,8 @@ from yunohost.log import is_unit_operation, OperationLogger
|
|||
|
||||
logger = getActionLogger("yunohost.app")
|
||||
|
||||
APPS_PATH = "/usr/share/yunohost/apps"
|
||||
APPS_SETTING_PATH = "/etc/yunohost/apps/"
|
||||
INSTALL_TMP = "/var/cache/yunohost"
|
||||
APP_TMP_FOLDER = INSTALL_TMP + "/from_file"
|
||||
APP_TMP_WORKDIRS = "/var/cache/yunohost/app_tmp_work_dirs"
|
||||
|
||||
APPS_CATALOG_CACHE = "/var/cache/yunohost/repo"
|
||||
APPS_CATALOG_CONF = "/etc/yunohost/apps_catalog.yml"
|
||||
|
@ -144,7 +144,7 @@ def app_fetchlist():
|
|||
)
|
||||
from yunohost.tools import tools_update
|
||||
|
||||
tools_update(apps=True)
|
||||
tools_update(target="apps")
|
||||
|
||||
|
||||
def app_list(full=False, installed=False, filter=None):
|
||||
|
@ -194,7 +194,9 @@ def app_info(app, full=False):
|
|||
)
|
||||
|
||||
local_manifest = _get_manifest_of_app(os.path.join(APPS_SETTING_PATH, app))
|
||||
permissions = user_permission_list(full=True, absolute_urls=True, apps=[app])["permissions"]
|
||||
permissions = user_permission_list(full=True, absolute_urls=True, apps=[app])[
|
||||
"permissions"
|
||||
]
|
||||
|
||||
settings = _get_app_settings(app)
|
||||
|
||||
|
@ -324,9 +326,11 @@ def app_map(app=None, raw=False, user=None):
|
|||
app,
|
||||
]
|
||||
else:
|
||||
apps = os.listdir(APPS_SETTING_PATH)
|
||||
apps = _installed_apps()
|
||||
|
||||
permissions = user_permission_list(full=True, absolute_urls=True)["permissions"]
|
||||
permissions = user_permission_list(full=True, absolute_urls=True, apps=apps)[
|
||||
"permissions"
|
||||
]
|
||||
for app_id in apps:
|
||||
app_settings = _get_app_settings(app_id)
|
||||
if not app_settings:
|
||||
|
@ -459,34 +463,12 @@ def app_change_url(operation_logger, app, domain, path):
|
|||
operation_logger.extra.update({"env": env_dict})
|
||||
operation_logger.start()
|
||||
|
||||
if os.path.exists(os.path.join(APP_TMP_FOLDER, "scripts")):
|
||||
shutil.rmtree(os.path.join(APP_TMP_FOLDER, "scripts"))
|
||||
|
||||
shutil.copytree(
|
||||
os.path.join(APPS_SETTING_PATH, app, "scripts"),
|
||||
os.path.join(APP_TMP_FOLDER, "scripts"),
|
||||
)
|
||||
|
||||
if os.path.exists(os.path.join(APP_TMP_FOLDER, "conf")):
|
||||
shutil.rmtree(os.path.join(APP_TMP_FOLDER, "conf"))
|
||||
|
||||
shutil.copytree(
|
||||
os.path.join(APPS_SETTING_PATH, app, "conf"),
|
||||
os.path.join(APP_TMP_FOLDER, "conf"),
|
||||
)
|
||||
tmp_workdir_for_app = _make_tmp_workdir_for_app(app=app)
|
||||
change_url_script = os.path.join(tmp_workdir_for_app, "scripts/change_url")
|
||||
|
||||
# Execute App change_url script
|
||||
os.system("chown -R admin: %s" % INSTALL_TMP)
|
||||
os.system("chmod +x %s" % os.path.join(os.path.join(APP_TMP_FOLDER, "scripts")))
|
||||
os.system(
|
||||
"chmod +x %s"
|
||||
% os.path.join(os.path.join(APP_TMP_FOLDER, "scripts", "change_url"))
|
||||
)
|
||||
|
||||
if (
|
||||
hook_exec(os.path.join(APP_TMP_FOLDER, "scripts/change_url"), env=env_dict)[0]
|
||||
!= 0
|
||||
):
|
||||
ret = hook_exec(change_url_script, env=env_dict)[0]
|
||||
if ret != 0:
|
||||
msg = "Failed to change '%s' url." % app
|
||||
logger.error(msg)
|
||||
operation_logger.error(msg)
|
||||
|
@ -496,6 +478,7 @@ def app_change_url(operation_logger, app, domain, path):
|
|||
app_setting(app, "domain", value=old_domain)
|
||||
app_setting(app, "path", value=old_path)
|
||||
return
|
||||
shutil.rmtree(tmp_workdir_for_app)
|
||||
|
||||
# this should idealy be done in the change_url script but let's avoid common mistakes
|
||||
app_setting(app, "domain", value=domain)
|
||||
|
@ -620,7 +603,7 @@ def app_upgrade(app=[], url=None, file=None, force=False):
|
|||
_check_manifest_requirements(manifest, app_instance_name=app_instance_name)
|
||||
_assert_system_is_sane_for_app(manifest, "pre")
|
||||
|
||||
app_setting_path = APPS_SETTING_PATH + "/" + app_instance_name
|
||||
app_setting_path = os.path.join(APPS_SETTING_PATH, app_instance_name)
|
||||
|
||||
# Retrieve arguments list for upgrade script
|
||||
# TODO: Allow to specify arguments
|
||||
|
@ -646,9 +629,6 @@ def app_upgrade(app=[], url=None, file=None, force=False):
|
|||
operation_logger = OperationLogger("app_upgrade", related_to, env=env_dict)
|
||||
operation_logger.start()
|
||||
|
||||
# Execute App upgrade script
|
||||
os.system("chown -hR admin: %s" % INSTALL_TMP)
|
||||
|
||||
# Execute the app upgrade script
|
||||
upgrade_failed = True
|
||||
try:
|
||||
|
@ -775,6 +755,12 @@ def app_upgrade(app=[], url=None, file=None, force=False):
|
|||
% (extracted_app_folder, file_to_copy, app_setting_path)
|
||||
)
|
||||
|
||||
# Clean and set permissions
|
||||
shutil.rmtree(extracted_app_folder)
|
||||
os.system("chmod 600 %s" % app_setting_path)
|
||||
os.system("chmod 400 %s/settings.yml" % app_setting_path)
|
||||
os.system("chown -R root: %s" % app_setting_path)
|
||||
|
||||
# So much win
|
||||
logger.success(m18n.n("app_upgraded", app=app_instance_name))
|
||||
|
||||
|
@ -786,6 +772,22 @@ def app_upgrade(app=[], url=None, file=None, force=False):
|
|||
logger.success(m18n.n("upgrade_complete"))
|
||||
|
||||
|
||||
def app_manifest(app):
|
||||
|
||||
raw_app_list = _load_apps_catalog()["apps"]
|
||||
|
||||
if app in raw_app_list or ("@" in app) or ("http://" in app) or ("https://" in app):
|
||||
manifest, extracted_app_folder = _fetch_app_from_git(app)
|
||||
elif os.path.exists(app):
|
||||
manifest, extracted_app_folder = _extract_app_from_file(app)
|
||||
else:
|
||||
raise YunohostValidationError("app_unknown")
|
||||
|
||||
shutil.rmtree(extracted_app_folder)
|
||||
|
||||
return manifest
|
||||
|
||||
|
||||
@is_unit_operation()
|
||||
def app_install(
|
||||
operation_logger,
|
||||
|
@ -816,10 +818,6 @@ def app_install(
|
|||
)
|
||||
from yunohost.regenconf import manually_modified_files
|
||||
|
||||
# Fetch or extract sources
|
||||
if not os.path.exists(INSTALL_TMP):
|
||||
os.makedirs(INSTALL_TMP)
|
||||
|
||||
def confirm_install(confirm):
|
||||
# Ignore if there's nothing for confirm (good quality app), if --force is used
|
||||
# or if request on the API (confirm already implemented on the API side)
|
||||
|
@ -953,10 +951,6 @@ def app_install(
|
|||
}
|
||||
_set_app_settings(app_instance_name, app_settings)
|
||||
|
||||
os.system("chown -R admin: " + extracted_app_folder)
|
||||
|
||||
# Execute App install script
|
||||
os.system("chown -hR admin: %s" % INSTALL_TMP)
|
||||
# Move scripts and manifest to the right place
|
||||
if os.path.exists(os.path.join(extracted_app_folder, "manifest.json")):
|
||||
os.system("cp %s/manifest.json %s" % (extracted_app_folder, app_setting_path))
|
||||
|
@ -1118,10 +1112,7 @@ def app_install(
|
|||
|
||||
permission_sync_to_user()
|
||||
|
||||
raise YunohostError(
|
||||
failure_message_with_debug_instructions,
|
||||
raw_msg=True
|
||||
)
|
||||
raise YunohostError(failure_message_with_debug_instructions, raw_msg=True)
|
||||
|
||||
# Clean hooks and add new ones
|
||||
hook_remove(app_instance_name)
|
||||
|
@ -1131,9 +1122,9 @@ def app_install(
|
|||
|
||||
# Clean and set permissions
|
||||
shutil.rmtree(extracted_app_folder)
|
||||
os.system("chmod -R 400 %s" % app_setting_path)
|
||||
os.system("chmod 600 %s" % app_setting_path)
|
||||
os.system("chmod 400 %s/settings.yml" % app_setting_path)
|
||||
os.system("chown -R root: %s" % app_setting_path)
|
||||
os.system("chown -R admin: %s/scripts" % app_setting_path)
|
||||
|
||||
logger.success(m18n.n("installation_complete"))
|
||||
|
||||
|
@ -1212,13 +1203,7 @@ def app_remove(operation_logger, app):
|
|||
|
||||
logger.info(m18n.n("app_start_remove", app=app))
|
||||
|
||||
app_setting_path = APPS_SETTING_PATH + app
|
||||
|
||||
# TODO: display fail messages from script
|
||||
try:
|
||||
shutil.rmtree("/tmp/yunohost_remove")
|
||||
except Exception:
|
||||
pass
|
||||
app_setting_path = os.path.join(APPS_SETTING_PATH, app)
|
||||
|
||||
# Attempt to patch legacy helpers ...
|
||||
_patch_legacy_helpers(app_setting_path)
|
||||
|
@ -1228,13 +1213,8 @@ def app_remove(operation_logger, app):
|
|||
_patch_legacy_php_versions(app_setting_path)
|
||||
|
||||
manifest = _get_manifest_of_app(app_setting_path)
|
||||
|
||||
os.system(
|
||||
"cp -a %s /tmp/yunohost_remove && chown -hR admin: /tmp/yunohost_remove"
|
||||
% app_setting_path
|
||||
)
|
||||
os.system("chown -R admin: /tmp/yunohost_remove")
|
||||
os.system("chmod -R u+rX /tmp/yunohost_remove")
|
||||
tmp_workdir_for_app = _make_tmp_workdir_for_app(app=app)
|
||||
remove_script = f"{tmp_workdir_for_app}/scripts/remove"
|
||||
|
||||
env_dict = {}
|
||||
app_id, app_instance_nb = _parse_app_instance_name(app)
|
||||
|
@ -1246,7 +1226,7 @@ def app_remove(operation_logger, app):
|
|||
operation_logger.flush()
|
||||
|
||||
try:
|
||||
ret = hook_exec("/tmp/yunohost_remove/scripts/remove", env=env_dict)[0]
|
||||
ret = hook_exec(remove_script, env=env_dict)[0]
|
||||
# Here again, calling hook_exec could fail miserably, or get
|
||||
# manually interrupted (by mistake or because script was stuck)
|
||||
# In that case we still want to proceed with the rest of the
|
||||
|
@ -1256,6 +1236,8 @@ def app_remove(operation_logger, app):
|
|||
import traceback
|
||||
|
||||
logger.error(m18n.n("unexpected_error", error="\n" + traceback.format_exc()))
|
||||
finally:
|
||||
shutil.rmtree(tmp_workdir_for_app)
|
||||
|
||||
if ret == 0:
|
||||
logger.success(m18n.n("app_removed", app=app))
|
||||
|
@ -1263,15 +1245,14 @@ def app_remove(operation_logger, app):
|
|||
else:
|
||||
logger.warning(m18n.n("app_not_properly_removed", app=app))
|
||||
|
||||
# Remove all permission in LDAP
|
||||
for permission_name in user_permission_list(apps=[app])["permissions"].keys():
|
||||
permission_delete(permission_name, force=True, sync_perm=False)
|
||||
|
||||
if os.path.exists(app_setting_path):
|
||||
shutil.rmtree(app_setting_path)
|
||||
shutil.rmtree("/tmp/yunohost_remove")
|
||||
hook_remove(app)
|
||||
|
||||
# Remove all permission in LDAP
|
||||
for permission_name in user_permission_list()["permissions"].keys():
|
||||
if permission_name.startswith(app + "."):
|
||||
permission_delete(permission_name, force=True, sync_perm=False)
|
||||
hook_remove(app)
|
||||
|
||||
permission_sync_to_user()
|
||||
_assert_system_is_sane_for_app(manifest, "post")
|
||||
|
@ -1718,7 +1699,6 @@ def app_action_run(operation_logger, app, action, args=None):
|
|||
logger.warning(m18n.n("experimental_feature"))
|
||||
|
||||
from yunohost.hook import hook_exec
|
||||
import tempfile
|
||||
|
||||
# will raise if action doesn't exist
|
||||
actions = app_action_list(app)["actions"]
|
||||
|
@ -1756,8 +1736,9 @@ def app_action_run(operation_logger, app, action, args=None):
|
|||
if action_declaration.get("cwd"):
|
||||
cwd = action_declaration["cwd"].replace("$app", app)
|
||||
else:
|
||||
cwd = "/etc/yunohost/apps/" + app
|
||||
cwd = os.path.join(APPS_SETTING_PATH, app)
|
||||
|
||||
# FIXME: this should probably be ran in a tmp workdir...
|
||||
retcode = hook_exec(
|
||||
path,
|
||||
env=env_dict,
|
||||
|
@ -1812,6 +1793,7 @@ def app_config_show_panel(operation_logger, app):
|
|||
"YNH_APP_INSTANCE_NUMBER": str(app_instance_nb),
|
||||
}
|
||||
|
||||
# FIXME: this should probably be ran in a tmp workdir...
|
||||
return_code, parsed_values = hook_exec(
|
||||
config_script, args=["show"], env=env, return_format="plain_dict"
|
||||
)
|
||||
|
@ -1924,6 +1906,7 @@ def app_config_apply(operation_logger, app, args):
|
|||
"Ignore key '%s' from arguments because it is not in the config", key
|
||||
)
|
||||
|
||||
# FIXME: this should probably be ran in a tmp workdir...
|
||||
return_code = hook_exec(
|
||||
config_script,
|
||||
args=["apply"],
|
||||
|
@ -2238,43 +2221,32 @@ def _set_app_settings(app_id, settings):
|
|||
yaml.safe_dump(settings, f, default_flow_style=False)
|
||||
|
||||
|
||||
def _extract_app_from_file(path, remove=False):
|
||||
def _extract_app_from_file(path):
|
||||
"""
|
||||
Unzip or untar application tarball in APP_TMP_FOLDER, or copy it from a directory
|
||||
Unzip / untar / copy application tarball or directory to a tmp work directory
|
||||
|
||||
Keyword arguments:
|
||||
path -- Path of the tarball or directory
|
||||
remove -- Remove the tarball after extraction
|
||||
|
||||
Returns:
|
||||
Dict manifest
|
||||
|
||||
"""
|
||||
logger.debug(m18n.n("extracting"))
|
||||
|
||||
if os.path.exists(APP_TMP_FOLDER):
|
||||
shutil.rmtree(APP_TMP_FOLDER)
|
||||
os.makedirs(APP_TMP_FOLDER)
|
||||
|
||||
path = os.path.abspath(path)
|
||||
|
||||
extracted_app_folder = _make_tmp_workdir_for_app()
|
||||
|
||||
if ".zip" in path:
|
||||
extract_result = os.system(
|
||||
"unzip %s -d %s > /dev/null 2>&1" % (path, APP_TMP_FOLDER)
|
||||
f"unzip '{path}' -d {extracted_app_folder} > /dev/null 2>&1"
|
||||
)
|
||||
if remove:
|
||||
os.remove(path)
|
||||
elif ".tar" in path:
|
||||
extract_result = os.system(
|
||||
"tar -xf %s -C %s > /dev/null 2>&1" % (path, APP_TMP_FOLDER)
|
||||
f"tar -xf '{path}' -C {extracted_app_folder} > /dev/null 2>&1"
|
||||
)
|
||||
if remove:
|
||||
os.remove(path)
|
||||
elif os.path.isdir(path):
|
||||
shutil.rmtree(APP_TMP_FOLDER)
|
||||
shutil.rmtree(extracted_app_folder)
|
||||
if path[-1] != "/":
|
||||
path = path + "/"
|
||||
extract_result = os.system('cp -a "%s" %s' % (path, APP_TMP_FOLDER))
|
||||
extract_result = os.system(f"cp -a '{path}' {extracted_app_folder}")
|
||||
else:
|
||||
extract_result = 1
|
||||
|
||||
|
@ -2282,7 +2254,6 @@ def _extract_app_from_file(path, remove=False):
|
|||
raise YunohostError("app_extraction_failed")
|
||||
|
||||
try:
|
||||
extracted_app_folder = APP_TMP_FOLDER
|
||||
if len(os.listdir(extracted_app_folder)) == 1:
|
||||
for folder in os.listdir(extracted_app_folder):
|
||||
extracted_app_folder = extracted_app_folder + "/" + folder
|
||||
|
@ -2509,24 +2480,11 @@ def _get_git_last_commit_hash(repository, reference="HEAD"):
|
|||
|
||||
def _fetch_app_from_git(app):
|
||||
"""
|
||||
Unzip or untar application tarball in APP_TMP_FOLDER
|
||||
Unzip or untar application tarball to a tmp directory
|
||||
|
||||
Keyword arguments:
|
||||
app -- App_id or git repo URL
|
||||
|
||||
Returns:
|
||||
Dict manifest
|
||||
|
||||
"""
|
||||
extracted_app_folder = APP_TMP_FOLDER
|
||||
|
||||
app_tmp_archive = "{0}.zip".format(extracted_app_folder)
|
||||
if os.path.exists(extracted_app_folder):
|
||||
shutil.rmtree(extracted_app_folder)
|
||||
if os.path.exists(app_tmp_archive):
|
||||
os.remove(app_tmp_archive)
|
||||
|
||||
logger.debug(m18n.n("downloading"))
|
||||
|
||||
# Extract URL, branch and revision to download
|
||||
if ("@" in app) or ("http://" in app) or ("https://" in app):
|
||||
|
@ -2550,6 +2508,10 @@ def _fetch_app_from_git(app):
|
|||
branch = app_info["git"]["branch"]
|
||||
revision = str(app_info["git"]["revision"])
|
||||
|
||||
extracted_app_folder = _make_tmp_workdir_for_app()
|
||||
|
||||
logger.debug(m18n.n("downloading"))
|
||||
|
||||
# Download only this commit
|
||||
try:
|
||||
# We don't use git clone because, git clone can't download
|
||||
|
@ -2791,7 +2753,9 @@ class YunoHostArgumentFormatParser(object):
|
|||
# we don't have an answer, check optional and default_value
|
||||
if question.value is None or question.value == "":
|
||||
if not question.optional and question.default is None:
|
||||
raise YunohostValidationError("app_argument_required", name=question.name)
|
||||
raise YunohostValidationError(
|
||||
"app_argument_required", name=question.name
|
||||
)
|
||||
else:
|
||||
question.value = (
|
||||
getattr(self, "default_value", None)
|
||||
|
@ -2849,7 +2813,9 @@ class PasswordArgumentParser(YunoHostArgumentFormatParser):
|
|||
)
|
||||
|
||||
if question.default is not None:
|
||||
raise YunohostValidationError("app_argument_password_no_default", name=question.name)
|
||||
raise YunohostValidationError(
|
||||
"app_argument_password_no_default", name=question.name
|
||||
)
|
||||
|
||||
return question
|
||||
|
||||
|
@ -3159,7 +3125,9 @@ def _assert_no_conflicting_apps(domain, path, ignore_app=None, full_domain=False
|
|||
if full_domain:
|
||||
raise YunohostValidationError("app_full_domain_unavailable", domain=domain)
|
||||
else:
|
||||
raise YunohostValidationError("app_location_unavailable", apps="\n".join(apps))
|
||||
raise YunohostValidationError(
|
||||
"app_location_unavailable", apps="\n".join(apps)
|
||||
)
|
||||
|
||||
|
||||
def _make_environment_for_app_script(app, args={}, args_prefix="APP_ARG_"):
|
||||
|
@ -3386,6 +3354,36 @@ def _load_apps_catalog():
|
|||
#
|
||||
|
||||
|
||||
def _make_tmp_workdir_for_app(app=None):
|
||||
|
||||
# Create parent dir if it doesn't exists yet
|
||||
if not os.path.exists(APP_TMP_WORKDIRS):
|
||||
os.makedirs(APP_TMP_WORKDIRS)
|
||||
|
||||
now = int(time.time())
|
||||
|
||||
# Cleanup old dirs (if any)
|
||||
for dir_ in os.listdir(APP_TMP_WORKDIRS):
|
||||
path = os.path.join(APP_TMP_WORKDIRS, dir_)
|
||||
# We only delete folders older than an arbitary 12 hours
|
||||
# This is to cover the stupid case of upgrades
|
||||
# Where many app will call 'yunohost backup create'
|
||||
# from the upgrade script itself,
|
||||
# which will also call this function while the upgrade
|
||||
# script itself is running in one of those dir...
|
||||
# It could be that there are other edge cases
|
||||
# such as app-install-during-app-install
|
||||
if os.stat(path).st_mtime < now - 12 * 3600:
|
||||
shutil.rmtree(path)
|
||||
tmpdir = tempfile.mkdtemp(prefix="app_", dir=APP_TMP_WORKDIRS)
|
||||
|
||||
# Copy existing app scripts, conf, ... if an app arg was provided
|
||||
if app:
|
||||
os.system(f"cp -a {APPS_SETTING_PATH}/{app}/* {tmpdir}")
|
||||
|
||||
return tmpdir
|
||||
|
||||
|
||||
def is_true(arg):
|
||||
"""
|
||||
Convert a string into a boolean
|
||||
|
@ -3453,11 +3451,16 @@ def _assert_system_is_sane_for_app(manifest, when):
|
|||
if not any(s for s in services if service_status(s)["status"] == "reloading"):
|
||||
break
|
||||
time.sleep(0.5)
|
||||
test_nb+=1
|
||||
test_nb += 1
|
||||
|
||||
# List services currently down and raise an exception if any are found
|
||||
services_status = {s:service_status(s) for s in services}
|
||||
faulty_services = [f"{s} ({status['status']})" for s, status in services_status.items() if status['status'] != "running"]
|
||||
services_status = {s: service_status(s) for s in services}
|
||||
faulty_services = [
|
||||
f"{s} ({status['status']})"
|
||||
for s, status in services_status.items()
|
||||
if status["status"] != "running"
|
||||
]
|
||||
|
||||
if faulty_services:
|
||||
if when == "pre":
|
||||
raise YunohostValidationError(
|
||||
|
@ -3627,7 +3630,11 @@ def _patch_legacy_helpers(app_folder):
|
|||
if not os.path.isfile(filename):
|
||||
continue
|
||||
|
||||
content = read_file(filename)
|
||||
try:
|
||||
content = read_file(filename)
|
||||
except MoulinetteError:
|
||||
continue
|
||||
|
||||
replaced_stuff = False
|
||||
show_warning = False
|
||||
|
||||
|
|
|
@ -53,6 +53,7 @@ from yunohost.app import (
|
|||
_patch_legacy_php_versions,
|
||||
_patch_legacy_php_versions_in_settings,
|
||||
LEGACY_PHP_VERSION_REPLACEMENTS,
|
||||
_make_tmp_workdir_for_app,
|
||||
)
|
||||
from yunohost.hook import (
|
||||
hook_list,
|
||||
|
@ -61,7 +62,11 @@ from yunohost.hook import (
|
|||
hook_exec,
|
||||
CUSTOM_HOOK_FOLDER,
|
||||
)
|
||||
from yunohost.tools import tools_postinstall, _tools_migrations_run_after_system_restore, _tools_migrations_run_before_app_restore
|
||||
from yunohost.tools import (
|
||||
tools_postinstall,
|
||||
_tools_migrations_run_after_system_restore,
|
||||
_tools_migrations_run_before_app_restore,
|
||||
)
|
||||
from yunohost.regenconf import regen_conf
|
||||
from yunohost.log import OperationLogger, is_unit_operation
|
||||
from yunohost.utils.error import YunohostError, YunohostValidationError
|
||||
|
@ -538,8 +543,8 @@ class BackupManager:
|
|||
# Add unlisted files from backup tmp dir
|
||||
self._add_to_list_to_backup("backup.csv")
|
||||
self._add_to_list_to_backup("info.json")
|
||||
if len(self.apps_return) > 0:
|
||||
self._add_to_list_to_backup("apps")
|
||||
for app in self.apps_return.keys():
|
||||
self._add_to_list_to_backup(f"apps/{app}")
|
||||
if os.path.isdir(os.path.join(self.work_dir, "conf")):
|
||||
self._add_to_list_to_backup("conf")
|
||||
if os.path.isdir(os.path.join(self.work_dir, "data")):
|
||||
|
@ -644,7 +649,7 @@ class BackupManager:
|
|||
|
||||
restore_hooks_dir = os.path.join(self.work_dir, "hooks", "restore")
|
||||
if not os.path.exists(restore_hooks_dir):
|
||||
filesystem.mkdir(restore_hooks_dir, mode=0o750, parents=True, uid="admin")
|
||||
filesystem.mkdir(restore_hooks_dir, mode=0o700, parents=True, uid="root")
|
||||
|
||||
restore_hooks = hook_list("restore")["hooks"]
|
||||
|
||||
|
@ -663,7 +668,7 @@ class BackupManager:
|
|||
self.targets.set_result("system", part, "Error")
|
||||
|
||||
def _collect_apps_files(self):
|
||||
""" Prepare backup for each selected apps """
|
||||
"""Prepare backup for each selected apps"""
|
||||
|
||||
apps_targets = self.targets.list("apps", exclude=["Skipped"])
|
||||
|
||||
|
@ -705,33 +710,27 @@ class BackupManager:
|
|||
settings_dir = os.path.join(self.work_dir, "apps", app, "settings")
|
||||
|
||||
logger.info(m18n.n("app_start_backup", app=app))
|
||||
tmp_folder = tempfile.mkdtemp()
|
||||
tmp_workdir_for_app = _make_tmp_workdir_for_app(app=app)
|
||||
try:
|
||||
# Prepare backup directory for the app
|
||||
filesystem.mkdir(tmp_app_bkp_dir, 0o750, True, uid="admin")
|
||||
filesystem.mkdir(tmp_app_bkp_dir, 0o700, True, uid="root")
|
||||
|
||||
# Copy the app settings to be able to call _common.sh
|
||||
shutil.copytree(app_setting_path, settings_dir)
|
||||
|
||||
# Copy app backup script in a temporary folder and execute it
|
||||
app_script = os.path.join(app_setting_path, "scripts/backup")
|
||||
tmp_script = os.path.join(tmp_folder, "backup")
|
||||
subprocess.call(["install", "-Dm555", app_script, tmp_script])
|
||||
|
||||
hook_exec(
|
||||
tmp_script, raise_on_error=True, chdir=tmp_app_bkp_dir, env=env_dict
|
||||
f"{tmp_workdir_for_app}/scripts/backup",
|
||||
raise_on_error=True,
|
||||
chdir=tmp_app_bkp_dir,
|
||||
env=env_dict,
|
||||
)[0]
|
||||
|
||||
self._import_to_list_to_backup(env_dict["YNH_BACKUP_CSV"])
|
||||
|
||||
# backup permissions
|
||||
logger.debug(m18n.n("backup_permission", app=app))
|
||||
permissions = user_permission_list(full=True)["permissions"]
|
||||
this_app_permissions = {
|
||||
name: infos
|
||||
for name, infos in permissions.items()
|
||||
if name.startswith(app + ".")
|
||||
}
|
||||
permissions = user_permission_list(full=True, apps=[app])["permissions"]
|
||||
this_app_permissions = {name: infos for name, infos in permissions.items()}
|
||||
write_to_yaml("%s/permissions.yml" % settings_dir, this_app_permissions)
|
||||
|
||||
except Exception:
|
||||
|
@ -751,8 +750,7 @@ class BackupManager:
|
|||
|
||||
# Remove tmp files in all situations
|
||||
finally:
|
||||
if tmp_folder and os.path.exists(tmp_folder):
|
||||
shutil.rmtree(tmp_folder)
|
||||
shutil.rmtree(tmp_workdir_for_app)
|
||||
filesystem.rm(env_dict["YNH_BACKUP_CSV"], force=True)
|
||||
|
||||
#
|
||||
|
@ -793,25 +791,28 @@ class BackupManager:
|
|||
self.size_details["apps"][app_key] = 0
|
||||
|
||||
for row in self.paths_to_backup:
|
||||
if row["dest"] != "info.json":
|
||||
size = disk_usage(row["source"])
|
||||
if row["dest"] == "info.json":
|
||||
continue
|
||||
|
||||
# Add size to apps details
|
||||
splitted_dest = row["dest"].split("/")
|
||||
category = splitted_dest[0]
|
||||
if category == "apps":
|
||||
for app_key in self.apps_return:
|
||||
if row["dest"].startswith("apps/" + app_key):
|
||||
self.size_details["apps"][app_key] += size
|
||||
break
|
||||
# OR Add size to the correct system element
|
||||
elif category == "data" or category == "conf":
|
||||
for system_key in self.system_return:
|
||||
if row["dest"].startswith(system_key.replace("_", "/")):
|
||||
self.size_details["system"][system_key] += size
|
||||
break
|
||||
size = disk_usage(row["source"])
|
||||
|
||||
self.size += size
|
||||
# Add size to apps details
|
||||
splitted_dest = row["dest"].split("/")
|
||||
category = splitted_dest[0]
|
||||
if category == "apps":
|
||||
for app_key in self.apps_return:
|
||||
if row["dest"].startswith("apps/" + app_key):
|
||||
self.size_details["apps"][app_key] += size
|
||||
break
|
||||
|
||||
# OR Add size to the correct system element
|
||||
elif category == "data" or category == "conf":
|
||||
for system_key in self.system_return:
|
||||
if row["dest"].startswith(system_key.replace("_", "/")):
|
||||
self.size_details["system"][system_key] += size
|
||||
break
|
||||
|
||||
self.size += size
|
||||
|
||||
return self.size
|
||||
|
||||
|
@ -859,7 +860,9 @@ class RestoreManager:
|
|||
# FIXME this way to get the info is not compatible with copy or custom
|
||||
# backup methods
|
||||
self.info = backup_info(name, with_details=True)
|
||||
if not self.info["from_yunohost_version"] or version.parse(self.info["from_yunohost_version"]) < version.parse("3.8.0"):
|
||||
if not self.info["from_yunohost_version"] or version.parse(
|
||||
self.info["from_yunohost_version"]
|
||||
) < version.parse("3.8.0"):
|
||||
raise YunohostValidationError("restore_backup_too_old")
|
||||
|
||||
self.archive_path = self.info["path"]
|
||||
|
@ -1211,7 +1214,7 @@ class RestoreManager:
|
|||
writer.writerow(row)
|
||||
|
||||
def _restore_system(self):
|
||||
""" Restore user and system parts """
|
||||
"""Restore user and system parts"""
|
||||
|
||||
system_targets = self.targets.list("system", exclude=["Skipped"])
|
||||
|
||||
|
@ -1281,7 +1284,9 @@ class RestoreManager:
|
|||
|
||||
regen_conf()
|
||||
|
||||
_tools_migrations_run_after_system_restore(backup_version=self.info["from_yunohost_version"])
|
||||
_tools_migrations_run_after_system_restore(
|
||||
backup_version=self.info["from_yunohost_version"]
|
||||
)
|
||||
|
||||
# Remove all permission for all app still in the LDAP
|
||||
for permission_name in user_permission_list(ignore_system_perms=True)[
|
||||
|
@ -1403,17 +1408,17 @@ class RestoreManager:
|
|||
filesystem.chown(app_scripts_new_path, "root", None, True)
|
||||
|
||||
# Copy the app scripts to a writable temporary folder
|
||||
# FIXME : use 'install -Dm555' or something similar to what's done
|
||||
# in the backup method ?
|
||||
tmp_folder_for_app_restore = tempfile.mkdtemp(prefix="restore")
|
||||
copytree(app_scripts_in_archive, tmp_folder_for_app_restore)
|
||||
filesystem.chmod(tmp_folder_for_app_restore, 0o550, 0o550, True)
|
||||
filesystem.chown(tmp_folder_for_app_restore, "root", None, True)
|
||||
restore_script = os.path.join(tmp_folder_for_app_restore, "restore")
|
||||
tmp_workdir_for_app = _make_tmp_workdir_for_app()
|
||||
copytree(app_scripts_in_archive, tmp_workdir_for_app)
|
||||
filesystem.chmod(tmp_workdir_for_app, 0o700, 0o700, True)
|
||||
filesystem.chown(tmp_workdir_for_app, "root", None, True)
|
||||
restore_script = os.path.join(tmp_workdir_for_app, "restore")
|
||||
|
||||
# Restore permissions
|
||||
if not os.path.isfile("%s/permissions.yml" % app_settings_new_path):
|
||||
raise YunohostError("Didnt find a permssions.yml for the app !?", raw_msg=True)
|
||||
raise YunohostError(
|
||||
"Didnt find a permssions.yml for the app !?", raw_msg=True
|
||||
)
|
||||
|
||||
permissions = read_yaml("%s/permissions.yml" % app_settings_new_path)
|
||||
existing_groups = user_group_list()["groups"]
|
||||
|
@ -1428,9 +1433,7 @@ class RestoreManager:
|
|||
should_be_allowed = ["all_users"]
|
||||
else:
|
||||
should_be_allowed = [
|
||||
g
|
||||
for g in permission_infos["allowed"]
|
||||
if g in existing_groups
|
||||
g for g in permission_infos["allowed"] if g in existing_groups
|
||||
]
|
||||
|
||||
perm_name = permission_name.split(".")[1]
|
||||
|
@ -1452,9 +1455,13 @@ class RestoreManager:
|
|||
|
||||
os.remove("%s/permissions.yml" % app_settings_new_path)
|
||||
|
||||
_tools_migrations_run_before_app_restore(backup_version=self.info["from_yunohost_version"], app_id=app_instance_name)
|
||||
_tools_migrations_run_before_app_restore(
|
||||
backup_version=self.info["from_yunohost_version"],
|
||||
app_id=app_instance_name,
|
||||
)
|
||||
except Exception:
|
||||
import traceback
|
||||
|
||||
error = m18n.n("unexpected_error", error="\n" + traceback.format_exc())
|
||||
msg = m18n.n("app_restore_failed", app=app_instance_name, error=error)
|
||||
logger.error(msg)
|
||||
|
@ -1464,7 +1471,7 @@ class RestoreManager:
|
|||
|
||||
# Cleanup
|
||||
shutil.rmtree(app_settings_new_path, ignore_errors=True)
|
||||
shutil.rmtree(tmp_folder_for_app_restore, ignore_errors=True)
|
||||
shutil.rmtree(tmp_workdir_for_app, ignore_errors=True)
|
||||
|
||||
return
|
||||
|
||||
|
@ -1497,24 +1504,31 @@ class RestoreManager:
|
|||
restore_failed = True if restore_retcode != 0 else False
|
||||
if restore_failed:
|
||||
error = m18n.n("app_restore_script_failed")
|
||||
logger.error(m18n.n("app_restore_failed", app=app_instance_name, error=error))
|
||||
logger.error(
|
||||
m18n.n("app_restore_failed", app=app_instance_name, error=error)
|
||||
)
|
||||
failure_message_with_debug_instructions = operation_logger.error(error)
|
||||
if msettings.get("interface") != "api":
|
||||
dump_app_log_extract_for_debugging(operation_logger)
|
||||
# Script got manually interrupted ... N.B. : KeyboardInterrupt does not inherit from Exception
|
||||
except (KeyboardInterrupt, EOFError):
|
||||
error = m18n.n("operation_interrupted")
|
||||
logger.error(m18n.n("app_restore_failed", app=app_instance_name, error=error))
|
||||
logger.error(
|
||||
m18n.n("app_restore_failed", app=app_instance_name, error=error)
|
||||
)
|
||||
failure_message_with_debug_instructions = operation_logger.error(error)
|
||||
# Something wrong happened in Yunohost's code (most probably hook_exec)
|
||||
except Exception:
|
||||
import traceback
|
||||
|
||||
error = m18n.n("unexpected_error", error="\n" + traceback.format_exc())
|
||||
logger.error(m18n.n("app_restore_failed", app=app_instance_name, error=error))
|
||||
logger.error(
|
||||
m18n.n("app_restore_failed", app=app_instance_name, error=error)
|
||||
)
|
||||
failure_message_with_debug_instructions = operation_logger.error(error)
|
||||
finally:
|
||||
# Cleaning temporary scripts directory
|
||||
shutil.rmtree(tmp_folder_for_app_restore, ignore_errors=True)
|
||||
shutil.rmtree(tmp_workdir_for_app, ignore_errors=True)
|
||||
|
||||
if not restore_failed:
|
||||
self.targets.set_result("apps", app_instance_name, "Success")
|
||||
|
@ -1555,6 +1569,7 @@ class RestoreManager:
|
|||
|
||||
logger.error(failure_message_with_debug_instructions)
|
||||
|
||||
|
||||
#
|
||||
# Backup methods #
|
||||
#
|
||||
|
@ -1857,7 +1872,7 @@ class CopyBackupMethod(BackupMethod):
|
|||
method_name = "copy"
|
||||
|
||||
def backup(self):
|
||||
""" Copy prepared files into a the repo """
|
||||
"""Copy prepared files into a the repo"""
|
||||
# Check free space in output
|
||||
self._check_is_enough_free_space()
|
||||
|
||||
|
@ -1870,7 +1885,7 @@ class CopyBackupMethod(BackupMethod):
|
|||
|
||||
dest_parent = os.path.dirname(dest)
|
||||
if not os.path.exists(dest_parent):
|
||||
filesystem.mkdir(dest_parent, 0o750, True, uid="admin")
|
||||
filesystem.mkdir(dest_parent, 0o700, True, uid="admin")
|
||||
|
||||
if os.path.isdir(source):
|
||||
shutil.copytree(source, dest)
|
||||
|
@ -2167,7 +2182,13 @@ class CustomBackupMethod(BackupMethod):
|
|||
@is_unit_operation()
|
||||
def backup_create(
|
||||
operation_logger,
|
||||
name=None, description=None, methods=[], output_directory=None, system=[], apps=[]
|
||||
name=None,
|
||||
description=None,
|
||||
methods=[],
|
||||
output_directory=None,
|
||||
system=[],
|
||||
apps=[],
|
||||
dry_run=False,
|
||||
):
|
||||
"""
|
||||
Create a backup local archive
|
||||
|
@ -2249,8 +2270,20 @@ def backup_create(
|
|||
# Collect files to be backup (by calling app backup script / system hooks)
|
||||
backup_manager.collect_files()
|
||||
|
||||
if dry_run:
|
||||
return {
|
||||
"size": backup_manager.size,
|
||||
"size_details": backup_manager.size_details,
|
||||
}
|
||||
|
||||
# Apply backup methods on prepared files
|
||||
logger.info(m18n.n("backup_actually_backuping"))
|
||||
logger.info(
|
||||
m18n.n(
|
||||
"backup_create_size_estimation",
|
||||
size=binary_to_human(backup_manager.size) + "B",
|
||||
)
|
||||
)
|
||||
backup_manager.backup()
|
||||
|
||||
logger.success(m18n.n("backup_created"))
|
||||
|
@ -2288,9 +2321,9 @@ def backup_restore(name, system=[], apps=[], force=False):
|
|||
#
|
||||
|
||||
if name.endswith(".tar.gz"):
|
||||
name = name[:-len(".tar.gz")]
|
||||
name = name[: -len(".tar.gz")]
|
||||
elif name.endswith(".tar"):
|
||||
name = name[:-len(".tar")]
|
||||
name = name[: -len(".tar")]
|
||||
|
||||
restore_manager = RestoreManager(name)
|
||||
|
||||
|
@ -2404,7 +2437,9 @@ def backup_download(name):
|
|||
|
||||
# Raise exception if link is broken (e.g. on unmounted external storage)
|
||||
if not os.path.exists(archive_file):
|
||||
raise YunohostValidationError("backup_archive_broken_link", path=archive_file)
|
||||
raise YunohostValidationError(
|
||||
"backup_archive_broken_link", path=archive_file
|
||||
)
|
||||
|
||||
# We return a raw bottle HTTPresponse (instead of serializable data like
|
||||
# list/dict, ...), which is gonna be picked and used directly by moulinette
|
||||
|
@ -2426,9 +2461,9 @@ def backup_info(name, with_details=False, human_readable=False):
|
|||
"""
|
||||
|
||||
if name.endswith(".tar.gz"):
|
||||
name = name[:-len(".tar.gz")]
|
||||
name = name[: -len(".tar.gz")]
|
||||
elif name.endswith(".tar"):
|
||||
name = name[:-len(".tar")]
|
||||
name = name[: -len(".tar")]
|
||||
|
||||
archive_file = "%s/%s.tar" % (ARCHIVES_PATH, name)
|
||||
|
||||
|
@ -2444,7 +2479,9 @@ def backup_info(name, with_details=False, human_readable=False):
|
|||
|
||||
# Raise exception if link is broken (e.g. on unmounted external storage)
|
||||
if not os.path.exists(archive_file):
|
||||
raise YunohostValidationError("backup_archive_broken_link", path=archive_file)
|
||||
raise YunohostValidationError(
|
||||
"backup_archive_broken_link", path=archive_file
|
||||
)
|
||||
|
||||
info_file = "%s/%s.info.json" % (ARCHIVES_PATH, name)
|
||||
|
||||
|
@ -2589,7 +2626,7 @@ def backup_delete(name):
|
|||
|
||||
|
||||
def _create_archive_dir():
|
||||
""" Create the YunoHost archives directory if doesn't exist """
|
||||
"""Create the YunoHost archives directory if doesn't exist"""
|
||||
if not os.path.isdir(ARCHIVES_PATH):
|
||||
if os.path.lexists(ARCHIVES_PATH):
|
||||
raise YunohostError("backup_output_symlink_dir_broken", path=ARCHIVES_PATH)
|
||||
|
@ -2600,7 +2637,7 @@ def _create_archive_dir():
|
|||
|
||||
|
||||
def _call_for_each_path(self, callback, csv_path=None):
|
||||
""" Call a callback for each path in csv """
|
||||
"""Call a callback for each path in csv"""
|
||||
if csv_path is None:
|
||||
csv_path = self.csv_path
|
||||
with open(csv_path, "r") as backup_file:
|
||||
|
|
|
@ -432,7 +432,7 @@ def certificate_renew(
|
|||
|
||||
stack = StringIO()
|
||||
traceback.print_exc(file=stack)
|
||||
msg = "Certificate renewing for %s failed !" % (domain)
|
||||
msg = "Certificate renewing for %s failed!" % (domain)
|
||||
if no_checks:
|
||||
msg += (
|
||||
"\nPlease consider checking the 'DNS records' (basic) and 'Web' categories of the diagnosis to check for possible issues that may prevent installing a Let's Encrypt certificate on domain %s."
|
||||
|
@ -455,6 +455,7 @@ def certificate_renew(
|
|||
# Back-end stuff #
|
||||
#
|
||||
|
||||
|
||||
def _email_renewing_failed(domain, exception_message, stack=""):
|
||||
from_ = "certmanager@%s (Certificate Manager)" % domain
|
||||
to_ = "root"
|
||||
|
@ -872,7 +873,9 @@ def _check_domain_is_ready_for_ACME(domain):
|
|||
)
|
||||
|
||||
if not dnsrecords or not httpreachable:
|
||||
raise YunohostValidationError("certmanager_domain_not_diagnosed_yet", domain=domain)
|
||||
raise YunohostValidationError(
|
||||
"certmanager_domain_not_diagnosed_yet", domain=domain
|
||||
)
|
||||
|
||||
# Check if IP from DNS matches public IP
|
||||
if not dnsrecords.get("status") in [
|
||||
|
@ -885,7 +888,9 @@ def _check_domain_is_ready_for_ACME(domain):
|
|||
|
||||
# Check if domain seems to be accessible through HTTP?
|
||||
if not httpreachable.get("status") == "SUCCESS":
|
||||
raise YunohostValidationError("certmanager_domain_http_not_working", domain=domain)
|
||||
raise YunohostValidationError(
|
||||
"certmanager_domain_http_not_working", domain=domain
|
||||
)
|
||||
|
||||
|
||||
# FIXME / TODO : ideally this should not be needed. There should be a proper
|
||||
|
|
|
@ -43,7 +43,7 @@ class MyMigration(Migration):
|
|||
#
|
||||
logger.info(m18n.n("migration_0015_patching_sources_list"))
|
||||
self.patch_apt_sources_list()
|
||||
tools_update(system=True)
|
||||
tools_update(target="system")
|
||||
|
||||
# Tell libc6 it's okay to restart system stuff during the upgrade
|
||||
os.system(
|
||||
|
@ -88,7 +88,7 @@ class MyMigration(Migration):
|
|||
|
||||
apps_packages = self.get_apps_equivs_packages()
|
||||
self.hold(apps_packages)
|
||||
tools_upgrade(system=True, allow_yunohost_upgrade=False)
|
||||
tools_upgrade(target="system", allow_yunohost_upgrade=False)
|
||||
|
||||
if self.debian_major_version() == 9:
|
||||
raise YunohostError("migration_0015_still_on_stretch_after_main_upgrade")
|
||||
|
@ -103,7 +103,7 @@ class MyMigration(Migration):
|
|||
#
|
||||
logger.info(m18n.n("migration_0015_yunohost_upgrade"))
|
||||
self.unhold(apps_packages)
|
||||
tools_upgrade(system=True)
|
||||
tools_upgrade(target="system")
|
||||
|
||||
def debian_major_version(self):
|
||||
# The python module "platform" and lsb_release are not reliable because
|
||||
|
@ -141,7 +141,7 @@ class MyMigration(Migration):
|
|||
# (but we don't if 'stretch' is already in the sources.list ...
|
||||
# which means maybe a previous upgrade crashed and we're re-running it)
|
||||
if " buster " not in read_file("/etc/apt/sources.list"):
|
||||
tools_update(system=True)
|
||||
tools_update(target="system")
|
||||
upgradable_system_packages = list(_list_upgradable_apt_packages())
|
||||
if upgradable_system_packages:
|
||||
raise YunohostError("migration_0015_system_not_fully_up_to_date")
|
||||
|
|
|
@ -1,8 +1,4 @@
|
|||
import time
|
||||
import os
|
||||
|
||||
from moulinette import m18n
|
||||
from yunohost.utils.error import YunohostError
|
||||
from moulinette.utils.log import getActionLogger
|
||||
|
||||
from yunohost.tools import Migration
|
||||
|
@ -17,7 +13,14 @@ class MyMigration(Migration):
|
|||
Add protected attribute in LDAP permission
|
||||
"""
|
||||
|
||||
required = True
|
||||
@Migration.ldap_migration
|
||||
def run(self, backup_folder):
|
||||
|
||||
# Update LDAP database
|
||||
self.add_new_ldap_attributes()
|
||||
|
||||
# Migrate old settings
|
||||
migrate_legacy_permission_settings()
|
||||
|
||||
def add_new_ldap_attributes(self):
|
||||
|
||||
|
@ -84,7 +87,7 @@ class MyMigration(Migration):
|
|||
# Update LDAP database
|
||||
self.add_new_ldap_attributes()
|
||||
|
||||
def run_before_system_restore(self, app_id):
|
||||
def run_before_app_restore(self, app_id):
|
||||
from yunohost.app import app_setting
|
||||
from yunohost.utils.legacy import migrate_legacy_permission_settings
|
||||
|
||||
|
@ -102,56 +105,3 @@ class MyMigration(Migration):
|
|||
for setting in legacy_permission_settings
|
||||
):
|
||||
migrate_legacy_permission_settings(app=app_id)
|
||||
|
||||
|
||||
def run(self):
|
||||
|
||||
# FIXME : what do we really want to do here ...
|
||||
# Imho we should just force-regen the conf in all case, and maybe
|
||||
# just display a warning if we detect that the conf was manually modified
|
||||
|
||||
# Backup LDAP and the apps settings before to do the migration
|
||||
logger.info(m18n.n("migration_0019_backup_before_migration"))
|
||||
try:
|
||||
backup_folder = "/home/yunohost.backup/premigration/" + time.strftime(
|
||||
"%Y%m%d-%H%M%S", time.gmtime()
|
||||
)
|
||||
os.makedirs(backup_folder, 0o750)
|
||||
os.system("systemctl stop slapd")
|
||||
os.system("cp -r --preserve /etc/ldap %s/ldap_config" % backup_folder)
|
||||
os.system("cp -r --preserve /var/lib/ldap %s/ldap_db" % backup_folder)
|
||||
os.system(
|
||||
"cp -r --preserve /etc/yunohost/apps %s/apps_settings" % backup_folder
|
||||
)
|
||||
except Exception as e:
|
||||
raise YunohostError(
|
||||
"migration_0019_can_not_backup_before_migration", error=e
|
||||
)
|
||||
finally:
|
||||
os.system("systemctl start slapd")
|
||||
|
||||
try:
|
||||
# Update LDAP database
|
||||
self.add_new_ldap_attributes()
|
||||
|
||||
# Migrate old settings
|
||||
migrate_legacy_permission_settings()
|
||||
|
||||
except Exception:
|
||||
logger.warn(m18n.n("migration_0019_migration_failed_trying_to_rollback"))
|
||||
os.system("systemctl stop slapd")
|
||||
os.system(
|
||||
"rm -r /etc/ldap/slapd.d"
|
||||
) # To be sure that we don't keep some part of the old config
|
||||
os.system("cp -r --preserve %s/ldap_config/. /etc/ldap/" % backup_folder)
|
||||
os.system("cp -r --preserve %s/ldap_db/. /var/lib/ldap/" % backup_folder)
|
||||
os.system(
|
||||
"cp -r --preserve %s/apps_settings/. /etc/yunohost/apps/"
|
||||
% backup_folder
|
||||
)
|
||||
os.system("systemctl start slapd")
|
||||
os.system("rm -r " + backup_folder)
|
||||
logger.info(m18n.n("migration_0019_rollback_success"))
|
||||
raise
|
||||
else:
|
||||
os.system("rm -r " + backup_folder)
|
||||
|
|
87
src/yunohost/data_migrations/0020_ssh_sftp_permissions.py
Normal file
87
src/yunohost/data_migrations/0020_ssh_sftp_permissions.py
Normal file
|
@ -0,0 +1,87 @@
|
|||
import subprocess
|
||||
import os
|
||||
|
||||
from moulinette import m18n
|
||||
from moulinette.utils.log import getActionLogger
|
||||
from moulinette.utils.filesystem import read_yaml
|
||||
|
||||
from yunohost.tools import Migration
|
||||
from yunohost.permission import user_permission_update, permission_sync_to_user
|
||||
from yunohost.regenconf import manually_modified_files
|
||||
|
||||
logger = getActionLogger("yunohost.migration")
|
||||
|
||||
###################################################
|
||||
# Tools used also for restoration
|
||||
###################################################
|
||||
|
||||
|
||||
class MyMigration(Migration):
|
||||
"""
|
||||
Add new permissions around SSH/SFTP features
|
||||
"""
|
||||
|
||||
introduced_in_version = "4.2.2"
|
||||
dependencies = ["extend_permissions_features"]
|
||||
|
||||
@Migration.ldap_migration
|
||||
def run(self, *args):
|
||||
|
||||
from yunohost.utils.ldap import _get_ldap_interface
|
||||
|
||||
ldap = _get_ldap_interface()
|
||||
|
||||
existing_perms_raw = ldap.search(
|
||||
"ou=permission,dc=yunohost,dc=org", "(objectclass=permissionYnh)", ["cn"]
|
||||
)
|
||||
existing_perms = [perm["cn"][0] for perm in existing_perms_raw]
|
||||
|
||||
# Add SSH and SFTP permissions
|
||||
ldap_map = read_yaml(
|
||||
"/usr/share/yunohost/yunohost-config/moulinette/ldap_scheme.yml"
|
||||
)
|
||||
|
||||
if "sftp.main" not in existing_perms:
|
||||
ldap.add(
|
||||
"cn=sftp.main,ou=permission",
|
||||
ldap_map["depends_children"]["cn=sftp.main,ou=permission"],
|
||||
)
|
||||
|
||||
if "ssh.main" not in existing_perms:
|
||||
ldap.add(
|
||||
"cn=ssh.main,ou=permission",
|
||||
ldap_map["depends_children"]["cn=ssh.main,ou=permission"],
|
||||
)
|
||||
|
||||
# Add a bash terminal to each users
|
||||
users = ldap.search(
|
||||
"ou=users,dc=yunohost,dc=org",
|
||||
filter="(loginShell=*)",
|
||||
attrs=["dn", "uid", "loginShell"],
|
||||
)
|
||||
for user in users:
|
||||
if user["loginShell"][0] == "/bin/false":
|
||||
dn = user["dn"][0].replace(",dc=yunohost,dc=org", "")
|
||||
ldap.update(dn, {"loginShell": ["/bin/bash"]})
|
||||
else:
|
||||
user_permission_update(
|
||||
"ssh.main", add=user["uid"][0], sync_perm=False
|
||||
)
|
||||
|
||||
permission_sync_to_user()
|
||||
|
||||
# Somehow this is needed otherwise the PAM thing doesn't forget about the
|
||||
# old loginShell value ?
|
||||
subprocess.call(["nscd", "-i", "passwd"])
|
||||
|
||||
if (
|
||||
"/etc/ssh/sshd_config" in manually_modified_files()
|
||||
and os.system(
|
||||
"grep -q '^ *AllowGroups\\|^ *AllowUsers' /etc/ssh/sshd_config"
|
||||
)
|
||||
!= 0
|
||||
):
|
||||
logger.error(m18n.n("diagnosis_sshd_config_insecure"))
|
||||
|
||||
def run_after_system_restore(self):
|
||||
self.run()
|
|
@ -59,7 +59,9 @@ def diagnosis_get(category, item):
|
|||
all_categories_names = [c for c, _ in all_categories]
|
||||
|
||||
if category not in all_categories_names:
|
||||
raise YunohostValidationError("diagnosis_unknown_categories", categories=category)
|
||||
raise YunohostValidationError(
|
||||
"diagnosis_unknown_categories", categories=category
|
||||
)
|
||||
|
||||
if isinstance(item, list):
|
||||
if any("=" not in criteria for criteria in item):
|
||||
|
@ -221,7 +223,15 @@ def diagnosis_run(
|
|||
logger.warning(m18n.n("diagnosis_display_tip"))
|
||||
|
||||
|
||||
def diagnosis_ignore(add_filter=None, remove_filter=None, list=False):
|
||||
def diagnosis_ignore(filter, list=False):
|
||||
return _diagnosis_ignore(add_filter=filter, list=list)
|
||||
|
||||
|
||||
def diagnosis_unignore(filter):
|
||||
return _diagnosis_ignore(remove_filter=filter)
|
||||
|
||||
|
||||
def _diagnosis_ignore(add_filter=None, remove_filter=None, list=False):
|
||||
"""
|
||||
This action is meant for the admin to ignore issues reported by the
|
||||
diagnosis system if they are known and understood by the admin. For
|
||||
|
|
|
@ -99,6 +99,7 @@ def domain_add(operation_logger, domain, dyndns=False):
|
|||
from yunohost.hook import hook_callback
|
||||
from yunohost.app import app_ssowatconf
|
||||
from yunohost.utils.ldap import _get_ldap_interface
|
||||
from yunohost.certificate import _certificate_install_selfsigned
|
||||
|
||||
if domain.startswith("xmpp-upload."):
|
||||
raise YunohostValidationError("domain_cannot_add_xmpp_upload")
|
||||
|
@ -121,7 +122,7 @@ def domain_add(operation_logger, domain, dyndns=False):
|
|||
|
||||
# Do not allow to subscribe to multiple dyndns domains...
|
||||
if _guess_current_dyndns_domain("dyndns.yunohost.org") != (None, None):
|
||||
raise YunohostValidationError('domain_dyndns_already_subscribed')
|
||||
raise YunohostValidationError("domain_dyndns_already_subscribed")
|
||||
|
||||
# Check that this domain can effectively be provided by
|
||||
# dyndns.yunohost.org. (i.e. is it a nohost.me / noho.st)
|
||||
|
@ -132,14 +133,13 @@ def domain_add(operation_logger, domain, dyndns=False):
|
|||
|
||||
if dyndns:
|
||||
from yunohost.dyndns import dyndns_subscribe
|
||||
|
||||
# Actually subscribe
|
||||
dyndns_subscribe(domain=domain)
|
||||
|
||||
_certificate_install_selfsigned([domain], False)
|
||||
|
||||
try:
|
||||
import yunohost.certificate
|
||||
|
||||
yunohost.certificate._certificate_install_selfsigned([domain], False)
|
||||
|
||||
attr_dict = {
|
||||
"objectClass": ["mailDomain", "top"],
|
||||
"virtualdomain": domain,
|
||||
|
@ -166,13 +166,13 @@ def domain_add(operation_logger, domain, dyndns=False):
|
|||
regen_conf(names=["nginx", "metronome", "dnsmasq", "postfix", "rspamd"])
|
||||
app_ssowatconf()
|
||||
|
||||
except Exception:
|
||||
except Exception as e:
|
||||
# Force domain removal silently
|
||||
try:
|
||||
domain_remove(domain, force=True)
|
||||
except Exception:
|
||||
pass
|
||||
raise
|
||||
raise e
|
||||
|
||||
hook_callback("post_domain_add", args=[domain])
|
||||
|
||||
|
@ -198,8 +198,8 @@ def domain_remove(operation_logger, domain, remove_apps=False, force=False):
|
|||
# the 'force' here is related to the exception happening in domain_add ...
|
||||
# we don't want to check the domain exists because the ldap add may have
|
||||
# failed
|
||||
if not force and domain not in domain_list()['domains']:
|
||||
raise YunohostValidationError('domain_name_unknown', domain=domain)
|
||||
if not force and domain not in domain_list()["domains"]:
|
||||
raise YunohostValidationError("domain_name_unknown", domain=domain)
|
||||
|
||||
# Check domain is not the main domain
|
||||
if domain == _get_maindomain():
|
||||
|
@ -213,7 +213,9 @@ def domain_remove(operation_logger, domain, remove_apps=False, force=False):
|
|||
other_domains="\n * " + ("\n * ".join(other_domains)),
|
||||
)
|
||||
else:
|
||||
raise YunohostValidationError("domain_cannot_remove_main_add_new_one", domain=domain)
|
||||
raise YunohostValidationError(
|
||||
"domain_cannot_remove_main_add_new_one", domain=domain
|
||||
)
|
||||
|
||||
# Check if apps are installed on the domain
|
||||
apps_on_that_domain = []
|
||||
|
@ -222,21 +224,37 @@ def domain_remove(operation_logger, domain, remove_apps=False, force=False):
|
|||
settings = _get_app_settings(app)
|
||||
label = app_info(app)["name"]
|
||||
if settings.get("domain") == domain:
|
||||
apps_on_that_domain.append((app, " - %s \"%s\" on https://%s%s" % (app, label, domain, settings["path"]) if "path" in settings else app))
|
||||
apps_on_that_domain.append(
|
||||
(
|
||||
app,
|
||||
' - %s "%s" on https://%s%s'
|
||||
% (app, label, domain, settings["path"])
|
||||
if "path" in settings
|
||||
else app,
|
||||
)
|
||||
)
|
||||
|
||||
if apps_on_that_domain:
|
||||
if remove_apps:
|
||||
if msettings.get('interface') == "cli" and not force:
|
||||
answer = msignals.prompt(m18n.n('domain_remove_confirm_apps_removal',
|
||||
apps="\n".join([x[1] for x in apps_on_that_domain]),
|
||||
answers='y/N'), color="yellow")
|
||||
if msettings.get("interface") == "cli" and not force:
|
||||
answer = msignals.prompt(
|
||||
m18n.n(
|
||||
"domain_remove_confirm_apps_removal",
|
||||
apps="\n".join([x[1] for x in apps_on_that_domain]),
|
||||
answers="y/N",
|
||||
),
|
||||
color="yellow",
|
||||
)
|
||||
if answer.upper() != "Y":
|
||||
raise YunohostError("aborting")
|
||||
|
||||
for app, _ in apps_on_that_domain:
|
||||
app_remove(app)
|
||||
else:
|
||||
raise YunohostValidationError('domain_uninstall_app_first', apps="\n".join([x[1] for x in apps_on_that_domain]))
|
||||
raise YunohostValidationError(
|
||||
"domain_uninstall_app_first",
|
||||
apps="\n".join([x[1] for x in apps_on_that_domain]),
|
||||
)
|
||||
|
||||
operation_logger.start()
|
||||
|
||||
|
@ -249,7 +267,7 @@ def domain_remove(operation_logger, domain, remove_apps=False, force=False):
|
|||
os.system("rm -rf /etc/yunohost/certs/%s" % domain)
|
||||
|
||||
# Delete dyndns keys for this domain (if any)
|
||||
os.system('rm -rf /etc/yunohost/dyndns/K%s.+*' % domain)
|
||||
os.system("rm -rf /etc/yunohost/dyndns/K%s.+*" % domain)
|
||||
|
||||
# Sometime we have weird issues with the regenconf where some files
|
||||
# appears as manually modified even though they weren't touched ...
|
||||
|
|
|
@ -124,7 +124,7 @@ def dyndns_subscribe(
|
|||
"""
|
||||
|
||||
if _guess_current_dyndns_domain(subscribe_host) != (None, None):
|
||||
raise YunohostValidationError('domain_dyndns_already_subscribed')
|
||||
raise YunohostValidationError("domain_dyndns_already_subscribed")
|
||||
|
||||
if domain is None:
|
||||
domain = _get_maindomain()
|
||||
|
@ -192,12 +192,14 @@ def dyndns_subscribe(
|
|||
|
||||
# Add some dyndns update in 2 and 4 minutes from now such that user should
|
||||
# not have to wait 10ish minutes for the conf to propagate
|
||||
cmd = "at -M now + {t} >/dev/null 2>&1 <<< \"/bin/bash -c 'yunohost dyndns update'\""
|
||||
cmd = (
|
||||
"at -M now + {t} >/dev/null 2>&1 <<< \"/bin/bash -c 'yunohost dyndns update'\""
|
||||
)
|
||||
# For some reason subprocess doesn't like the redirections so we have to use bash -c explicity...
|
||||
subprocess.check_call(["bash", "-c", cmd.format(t="2 min")])
|
||||
subprocess.check_call(["bash", "-c", cmd.format(t="4 min")])
|
||||
|
||||
logger.success(m18n.n('dyndns_registered'))
|
||||
logger.success(m18n.n("dyndns_registered"))
|
||||
|
||||
|
||||
@is_unit_operation()
|
||||
|
@ -231,7 +233,7 @@ def dyndns_update(
|
|||
(domain, key) = _guess_current_dyndns_domain(dyn_host)
|
||||
|
||||
if domain is None:
|
||||
raise YunohostValidationError('dyndns_no_domain_registered')
|
||||
raise YunohostValidationError("dyndns_no_domain_registered")
|
||||
|
||||
# If key is not given, pick the first file we find with the domain given
|
||||
else:
|
||||
|
@ -374,11 +376,15 @@ def dyndns_update(
|
|||
|
||||
|
||||
def dyndns_installcron():
|
||||
logger.warning("This command is deprecated. The dyndns cron job should automatically be added/removed by the regenconf depending if there's a private key in /etc/yunohost/dyndns. You can run the regenconf yourself with 'yunohost tools regen-conf yunohost'.")
|
||||
logger.warning(
|
||||
"This command is deprecated. The dyndns cron job should automatically be added/removed by the regenconf depending if there's a private key in /etc/yunohost/dyndns. You can run the regenconf yourself with 'yunohost tools regen-conf yunohost'."
|
||||
)
|
||||
|
||||
|
||||
def dyndns_removecron():
|
||||
logger.warning("This command is deprecated. The dyndns cron job should automatically be added/removed by the regenconf depending if there's a private key in /etc/yunohost/dyndns. You can run the regenconf yourself with 'yunohost tools regen-conf yunohost'.")
|
||||
logger.warning(
|
||||
"This command is deprecated. The dyndns cron job should automatically be added/removed by the regenconf depending if there's a private key in /etc/yunohost/dyndns. You can run the regenconf yourself with 'yunohost tools regen-conf yunohost'."
|
||||
)
|
||||
|
||||
|
||||
def _guess_current_dyndns_domain(dyn_host):
|
||||
|
|
|
@ -188,11 +188,17 @@ def firewall_list(raw=False, by_ip_version=False, list_forwarded=False):
|
|||
for i in ["ipv4", "ipv6"]:
|
||||
f = firewall[i]
|
||||
# Combine TCP and UDP ports
|
||||
ports[i] = sorted(set(f["TCP"]) | set(f["UDP"]), key=lambda p: int(p.split(':')[0]) if isinstance(p, str) else p)
|
||||
ports[i] = sorted(
|
||||
set(f["TCP"]) | set(f["UDP"]),
|
||||
key=lambda p: int(p.split(":")[0]) if isinstance(p, str) else p,
|
||||
)
|
||||
|
||||
if not by_ip_version:
|
||||
# Combine IPv4 and IPv6 ports
|
||||
ports = sorted(set(ports["ipv4"]) | set(ports["ipv6"]), key=lambda p: int(p.split(':')[0]) if isinstance(p, str) else p)
|
||||
ports = sorted(
|
||||
set(ports["ipv4"]) | set(ports["ipv6"]),
|
||||
key=lambda p: int(p.split(":")[0]) if isinstance(p, str) else p,
|
||||
)
|
||||
|
||||
# Format returned dict
|
||||
ret = {"opened_ports": ports}
|
||||
|
@ -200,7 +206,7 @@ def firewall_list(raw=False, by_ip_version=False, list_forwarded=False):
|
|||
# Combine TCP and UDP forwarded ports
|
||||
ret["forwarded_ports"] = sorted(
|
||||
set(firewall["uPnP"]["TCP"]) | set(firewall["uPnP"]["UDP"]),
|
||||
key=lambda p: int(p.split(':')[0]) if isinstance(p, str) else p
|
||||
key=lambda p: int(p.split(":")[0]) if isinstance(p, str) else p,
|
||||
)
|
||||
return ret
|
||||
|
||||
|
|
|
@ -340,9 +340,9 @@ def is_unit_operation(
|
|||
# Indeed, we use convention naming in this decorator and we need to
|
||||
# know name of each args (so we need to use kwargs instead of args)
|
||||
if len(args) > 0:
|
||||
from inspect import getargspec
|
||||
from inspect import signature
|
||||
|
||||
keys = getargspec(func).args
|
||||
keys = list(signature(func).parameters.keys())
|
||||
if "operation_logger" in keys:
|
||||
keys.remove("operation_logger")
|
||||
for k, arg in enumerate(args):
|
||||
|
@ -414,8 +414,15 @@ class RedactingFormatter(Formatter):
|
|||
# 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=")
|
||||
# Some names like "key" or "manifest_key" are ignored, used in helpers like ynh_app_setting_set or ynh_read_manifest
|
||||
match = re.search(r'(pwd|pass|password|passphrase|secret\w*|\w+key|token)=(\S{3,})$', record.strip())
|
||||
if match and match.group(2) not in self.data_to_redact and match.group(1) not in ["key", "manifest_key"]:
|
||||
match = re.search(
|
||||
r"(pwd|pass|password|passphrase|secret\w*|\w+key|token)=(\S{3,})$",
|
||||
record.strip(),
|
||||
)
|
||||
if (
|
||||
match
|
||||
and match.group(2) not in self.data_to_redact
|
||||
and match.group(1) not in ["key", "manifest_key"]
|
||||
):
|
||||
self.data_to_redact.append(match.group(2))
|
||||
except Exception as e:
|
||||
logger.warning(
|
||||
|
@ -636,7 +643,11 @@ class OperationLogger(object):
|
|||
# we want to inject the log ref in the exception, such that it may be
|
||||
# transmitted to the webadmin which can then redirect to the appropriate
|
||||
# log page
|
||||
if self.started_at and isinstance(error, Exception) and not isinstance(error, YunohostValidationError):
|
||||
if (
|
||||
self.started_at
|
||||
and isinstance(error, Exception)
|
||||
and not isinstance(error, YunohostValidationError)
|
||||
):
|
||||
error.log_ref = self.name
|
||||
|
||||
if self.ended_at is not None or self.started_at is None:
|
||||
|
|
|
@ -74,13 +74,15 @@ def user_permission_list(
|
|||
)
|
||||
|
||||
# Parse / organize information to be outputed
|
||||
if apps:
|
||||
ignore_system_perms = True
|
||||
apps = apps if apps else sorted(_installed_apps())
|
||||
installed_apps = sorted(_installed_apps())
|
||||
filter_ = apps
|
||||
apps = filter_ if filter_ else installed_apps
|
||||
apps_base_path = {
|
||||
app: app_setting(app, "domain") + app_setting(app, "path")
|
||||
for app in apps
|
||||
if app_setting(app, "domain") and app_setting(app, "path")
|
||||
if app in installed_apps
|
||||
and app_setting(app, "domain")
|
||||
and app_setting(app, "path")
|
||||
}
|
||||
|
||||
permissions = {}
|
||||
|
@ -89,10 +91,9 @@ def user_permission_list(
|
|||
name = infos["cn"][0]
|
||||
app = name.split(".")[0]
|
||||
|
||||
if app in SYSTEM_PERMS:
|
||||
if ignore_system_perms:
|
||||
continue
|
||||
elif app not in apps:
|
||||
if ignore_system_perms and app in SYSTEM_PERMS:
|
||||
continue
|
||||
if filter_ and app not in apps:
|
||||
continue
|
||||
|
||||
perm = {}
|
||||
|
@ -180,7 +181,9 @@ def user_permission_update(
|
|||
|
||||
# Refuse to add "visitors" to mail, xmpp ... they require an account to make sense.
|
||||
if add and "visitors" in add and permission.split(".")[0] in SYSTEM_PERMS:
|
||||
raise YunohostValidationError("permission_require_account", permission=permission)
|
||||
raise YunohostValidationError(
|
||||
"permission_require_account", permission=permission
|
||||
)
|
||||
|
||||
# Refuse to add "visitors" to protected permission
|
||||
if (
|
||||
|
@ -189,6 +192,16 @@ def user_permission_update(
|
|||
) and not force:
|
||||
raise YunohostValidationError("permission_protected", permission=permission)
|
||||
|
||||
# Refuse to add "all_users" to ssh/sftp permissions
|
||||
if (
|
||||
permission.split(".")[0] in ["ssh", "sftp"]
|
||||
and (add and "all_users" in add)
|
||||
and not force
|
||||
):
|
||||
raise YunohostValidationError(
|
||||
"permission_cant_add_to_all_users", permission=permission
|
||||
)
|
||||
|
||||
# Fetch currently allowed groups for this permission
|
||||
|
||||
current_allowed_groups = existing_permission["allowed"]
|
||||
|
|
|
@ -9,6 +9,7 @@ from moulinette import m18n
|
|||
from yunohost.utils.error import YunohostError, YunohostValidationError
|
||||
from moulinette.utils.log import getActionLogger
|
||||
from yunohost.regenconf import regen_conf
|
||||
from yunohost.firewall import firewall_reload
|
||||
|
||||
logger = getActionLogger("yunohost.settings")
|
||||
|
||||
|
@ -71,6 +72,10 @@ DEFAULTS = OrderedDict(
|
|||
"choices": ["intermediate", "modern"],
|
||||
},
|
||||
),
|
||||
(
|
||||
"security.ssh.port",
|
||||
{"type": "int", "default": 22},
|
||||
),
|
||||
(
|
||||
"security.nginx.compatibility",
|
||||
{
|
||||
|
@ -98,6 +103,7 @@ DEFAULTS = OrderedDict(
|
|||
]
|
||||
)
|
||||
|
||||
|
||||
def settings_get(key, full=False):
|
||||
"""
|
||||
Get an entry value in the settings
|
||||
|
@ -109,7 +115,9 @@ def settings_get(key, full=False):
|
|||
settings = _get_settings()
|
||||
|
||||
if key not in settings:
|
||||
raise YunohostValidationError("global_settings_key_doesnt_exists", settings_key=key)
|
||||
raise YunohostValidationError(
|
||||
"global_settings_key_doesnt_exists", settings_key=key
|
||||
)
|
||||
|
||||
if full:
|
||||
return settings[key]
|
||||
|
@ -137,7 +145,9 @@ def settings_set(key, value):
|
|||
settings = _get_settings()
|
||||
|
||||
if key not in settings:
|
||||
raise YunohostValidationError("global_settings_key_doesnt_exists", settings_key=key)
|
||||
raise YunohostValidationError(
|
||||
"global_settings_key_doesnt_exists", settings_key=key
|
||||
)
|
||||
|
||||
key_type = settings[key]["type"]
|
||||
|
||||
|
@ -214,7 +224,9 @@ def settings_reset(key):
|
|||
settings = _get_settings()
|
||||
|
||||
if key not in settings:
|
||||
raise YunohostValidationError("global_settings_key_doesnt_exists", settings_key=key)
|
||||
raise YunohostValidationError(
|
||||
"global_settings_key_doesnt_exists", settings_key=key
|
||||
)
|
||||
|
||||
settings[key]["value"] = settings[key]["default"]
|
||||
_save_settings(settings)
|
||||
|
@ -376,6 +388,7 @@ def trigger_post_change_hook(setting_name, old_value, new_value):
|
|||
#
|
||||
# ===========================================
|
||||
|
||||
|
||||
@post_change_hook("ssowat.panel_overlay.enabled")
|
||||
@post_change_hook("security.nginx.compatibility")
|
||||
def reconfigure_nginx(setting_name, old_value, new_value):
|
||||
|
@ -389,6 +402,13 @@ def reconfigure_ssh(setting_name, old_value, new_value):
|
|||
regen_conf(names=["ssh"])
|
||||
|
||||
|
||||
@post_change_hook("security.ssh.port")
|
||||
def reconfigure_ssh_and_fail2ban(setting_name, old_value, new_value):
|
||||
if old_value != new_value:
|
||||
regen_conf(names=["ssh", "fail2ban"])
|
||||
firewall_reload()
|
||||
|
||||
|
||||
@post_change_hook("smtp.allow_ipv6")
|
||||
@post_change_hook("smtp.relay.host")
|
||||
@post_change_hook("smtp.relay.port")
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
import re
|
||||
import os
|
||||
import pwd
|
||||
import subprocess
|
||||
|
||||
from yunohost.utils.error import YunohostValidationError
|
||||
from moulinette.utils.filesystem import read_file, write_to_file, chown, chmod, mkdir
|
||||
|
@ -11,54 +10,10 @@ from moulinette.utils.filesystem import read_file, write_to_file, chown, chmod,
|
|||
SSHD_CONFIG_PATH = "/etc/ssh/sshd_config"
|
||||
|
||||
|
||||
def user_ssh_allow(username):
|
||||
"""
|
||||
Allow YunoHost user connect as ssh.
|
||||
|
||||
Keyword argument:
|
||||
username -- User username
|
||||
"""
|
||||
# TODO it would be good to support different kind of shells
|
||||
|
||||
if not _get_user_for_ssh(username):
|
||||
raise YunohostValidationError("user_unknown", user=username)
|
||||
|
||||
from yunohost.utils.ldap import _get_ldap_interface
|
||||
|
||||
ldap = _get_ldap_interface()
|
||||
ldap.update("uid=%s,ou=users" % username, {"loginShell": ["/bin/bash"]})
|
||||
|
||||
# Somehow this is needed otherwise the PAM thing doesn't forget about the
|
||||
# old loginShell value ?
|
||||
subprocess.call(["nscd", "-i", "passwd"])
|
||||
|
||||
|
||||
def user_ssh_disallow(username):
|
||||
"""
|
||||
Disallow YunoHost user connect as ssh.
|
||||
|
||||
Keyword argument:
|
||||
username -- User username
|
||||
"""
|
||||
# TODO it would be good to support different kind of shells
|
||||
|
||||
if not _get_user_for_ssh(username):
|
||||
raise YunohostValidationError("user_unknown", user=username)
|
||||
|
||||
from yunohost.utils.ldap import _get_ldap_interface
|
||||
|
||||
ldap = _get_ldap_interface()
|
||||
ldap.update("uid=%s,ou=users" % username, {"loginShell": ["/bin/false"]})
|
||||
|
||||
# Somehow this is needed otherwise the PAM thing doesn't forget about the
|
||||
# old loginShell value ?
|
||||
subprocess.call(["nscd", "-i", "passwd"])
|
||||
|
||||
|
||||
def user_ssh_list_keys(username):
|
||||
user = _get_user_for_ssh(username, ["homeDirectory"])
|
||||
if not user:
|
||||
raise Exception("User with username '%s' doesn't exists" % username)
|
||||
raise YunohostValidationError("user_unknown", user=username)
|
||||
|
||||
authorized_keys_file = os.path.join(
|
||||
user["homeDirectory"][0], ".ssh", "authorized_keys"
|
||||
|
@ -95,7 +50,7 @@ def user_ssh_list_keys(username):
|
|||
def user_ssh_add_key(username, key, comment):
|
||||
user = _get_user_for_ssh(username, ["homeDirectory", "uid"])
|
||||
if not user:
|
||||
raise Exception("User with username '%s' doesn't exists" % username)
|
||||
raise YunohostValidationError("user_unknown", user=username)
|
||||
|
||||
authorized_keys_file = os.path.join(
|
||||
user["homeDirectory"][0], ".ssh", "authorized_keys"
|
||||
|
@ -135,21 +90,24 @@ def user_ssh_add_key(username, key, comment):
|
|||
def user_ssh_remove_key(username, key):
|
||||
user = _get_user_for_ssh(username, ["homeDirectory", "uid"])
|
||||
if not user:
|
||||
raise Exception("User with username '%s' doesn't exists" % username)
|
||||
raise YunohostValidationError("user_unknown", user=username)
|
||||
|
||||
authorized_keys_file = os.path.join(
|
||||
user["homeDirectory"][0], ".ssh", "authorized_keys"
|
||||
)
|
||||
|
||||
if not os.path.exists(authorized_keys_file):
|
||||
raise Exception(
|
||||
"this key doesn't exists ({} dosesn't exists)".format(authorized_keys_file)
|
||||
raise YunohostValidationError(
|
||||
"this key doesn't exists ({} dosesn't exists)".format(authorized_keys_file),
|
||||
raw_msg=True,
|
||||
)
|
||||
|
||||
authorized_keys_content = read_file(authorized_keys_file)
|
||||
|
||||
if key not in authorized_keys_content:
|
||||
raise Exception("Key '{}' is not present in authorized_keys".format(key))
|
||||
raise YunohostValidationError(
|
||||
"Key '{}' is not present in authorized_keys".format(key), raw_msg=True
|
||||
)
|
||||
|
||||
# don't delete the previous comment because we can't verify if it's legit
|
||||
|
||||
|
@ -196,8 +154,6 @@ def _get_user_for_ssh(username, attrs=None):
|
|||
"username": "root",
|
||||
"fullname": "",
|
||||
"mail": "",
|
||||
"ssh_allowed": ssh_root_login_status()["PermitRootLogin"],
|
||||
"shell": root_unix.pw_shell,
|
||||
"home_path": root_unix.pw_dir,
|
||||
}
|
||||
|
||||
|
@ -207,8 +163,6 @@ def _get_user_for_ssh(username, attrs=None):
|
|||
"username": "admin",
|
||||
"fullname": "",
|
||||
"mail": "",
|
||||
"ssh_allowed": admin_unix.pw_shell.strip() != "/bin/false",
|
||||
"shell": admin_unix.pw_shell,
|
||||
"home_path": admin_unix.pw_dir,
|
||||
}
|
||||
|
||||
|
|
|
@ -56,7 +56,9 @@ def clean():
|
|||
shutil.rmtree(folderpath, ignore_errors=True)
|
||||
|
||||
os.system("bash -c \"mysql -B 2>/dev/null <<< 'DROP DATABASE %s' \"" % test_app)
|
||||
os.system("bash -c \"mysql -B 2>/dev/null <<< 'DROP USER %s@localhost'\"" % test_app)
|
||||
os.system(
|
||||
"bash -c \"mysql -B 2>/dev/null <<< 'DROP USER %s@localhost'\"" % test_app
|
||||
)
|
||||
|
||||
# Reset failed quota for service to avoid running into start-limit rate ?
|
||||
os.system("systemctl reset-failed nginx")
|
||||
|
|
|
@ -1206,7 +1206,6 @@ def test_parse_args_in_yunohost_format_user_empty():
|
|||
"some_user": {
|
||||
"ssh_allowed": False,
|
||||
"username": "some_user",
|
||||
"shell": "/bin/false",
|
||||
"mailbox-quota": "0",
|
||||
"mail": "p@ynh.local",
|
||||
"fullname": "the first name the last name",
|
||||
|
@ -1232,7 +1231,6 @@ def test_parse_args_in_yunohost_format_user():
|
|||
username: {
|
||||
"ssh_allowed": False,
|
||||
"username": "some_user",
|
||||
"shell": "/bin/false",
|
||||
"mailbox-quota": "0",
|
||||
"mail": "p@ynh.local",
|
||||
"fullname": "the first name the last name",
|
||||
|
@ -1261,7 +1259,6 @@ def test_parse_args_in_yunohost_format_user_two_users():
|
|||
username: {
|
||||
"ssh_allowed": False,
|
||||
"username": "some_user",
|
||||
"shell": "/bin/false",
|
||||
"mailbox-quota": "0",
|
||||
"mail": "p@ynh.local",
|
||||
"fullname": "the first name the last name",
|
||||
|
@ -1269,7 +1266,6 @@ def test_parse_args_in_yunohost_format_user_two_users():
|
|||
other_user: {
|
||||
"ssh_allowed": False,
|
||||
"username": "some_user",
|
||||
"shell": "/bin/false",
|
||||
"mailbox-quota": "0",
|
||||
"mail": "z@ynh.local",
|
||||
"fullname": "john doe",
|
||||
|
@ -1304,7 +1300,6 @@ def test_parse_args_in_yunohost_format_user_two_users_wrong_answer():
|
|||
username: {
|
||||
"ssh_allowed": False,
|
||||
"username": "some_user",
|
||||
"shell": "/bin/false",
|
||||
"mailbox-quota": "0",
|
||||
"mail": "p@ynh.local",
|
||||
"fullname": "the first name the last name",
|
||||
|
@ -1312,7 +1307,6 @@ def test_parse_args_in_yunohost_format_user_two_users_wrong_answer():
|
|||
other_user: {
|
||||
"ssh_allowed": False,
|
||||
"username": "some_user",
|
||||
"shell": "/bin/false",
|
||||
"mailbox-quota": "0",
|
||||
"mail": "z@ynh.local",
|
||||
"fullname": "john doe",
|
||||
|
@ -1339,7 +1333,6 @@ def test_parse_args_in_yunohost_format_user_two_users_no_default():
|
|||
username: {
|
||||
"ssh_allowed": False,
|
||||
"username": "some_user",
|
||||
"shell": "/bin/false",
|
||||
"mailbox-quota": "0",
|
||||
"mail": "p@ynh.local",
|
||||
"fullname": "the first name the last name",
|
||||
|
@ -1347,7 +1340,6 @@ def test_parse_args_in_yunohost_format_user_two_users_no_default():
|
|||
other_user: {
|
||||
"ssh_allowed": False,
|
||||
"username": "some_user",
|
||||
"shell": "/bin/false",
|
||||
"mailbox-quota": "0",
|
||||
"mail": "z@ynh.local",
|
||||
"fullname": "john doe",
|
||||
|
@ -1369,7 +1361,6 @@ def test_parse_args_in_yunohost_format_user_two_users_default_input():
|
|||
username: {
|
||||
"ssh_allowed": False,
|
||||
"username": "some_user",
|
||||
"shell": "/bin/false",
|
||||
"mailbox-quota": "0",
|
||||
"mail": "p@ynh.local",
|
||||
"fullname": "the first name the last name",
|
||||
|
@ -1377,7 +1368,6 @@ def test_parse_args_in_yunohost_format_user_two_users_default_input():
|
|||
other_user: {
|
||||
"ssh_allowed": False,
|
||||
"username": "some_user",
|
||||
"shell": "/bin/false",
|
||||
"mailbox-quota": "0",
|
||||
"mail": "z@ynh.local",
|
||||
"fullname": "john doe",
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import os
|
||||
import json
|
||||
import glob
|
||||
import pytest
|
||||
|
||||
from yunohost.utils.error import YunohostError
|
||||
|
@ -28,6 +29,8 @@ def setup_function(function):
|
|||
|
||||
def teardown_function(function):
|
||||
os.system("mv /etc/yunohost/settings.json.saved /etc/yunohost/settings.json")
|
||||
for filename in glob.glob("/etc/yunohost/settings-*.json"):
|
||||
os.remove(filename)
|
||||
|
||||
|
||||
def test_settings_get_bool():
|
||||
|
|
|
@ -28,6 +28,7 @@ import os
|
|||
import yaml
|
||||
import subprocess
|
||||
import pwd
|
||||
import time
|
||||
from importlib import import_module
|
||||
from packaging import version
|
||||
|
||||
|
@ -405,22 +406,34 @@ def tools_regen_conf(
|
|||
return regen_conf(names, with_diff, force, dry_run, list_pending)
|
||||
|
||||
|
||||
def tools_update(apps=False, system=False):
|
||||
def tools_update(target=None, apps=False, system=False):
|
||||
"""
|
||||
Update apps & system package cache
|
||||
|
||||
Keyword arguments:
|
||||
system -- Fetch available system packages upgrades (equivalent to apt update)
|
||||
apps -- Fetch the application list to check which apps can be upgraded
|
||||
"""
|
||||
|
||||
# If neither --apps nor --system specified, do both
|
||||
if not apps and not system:
|
||||
apps = True
|
||||
system = True
|
||||
# Legacy options (--system, --apps)
|
||||
if apps or system:
|
||||
logger.warning(
|
||||
"Using 'yunohost tools update' with --apps / --system is deprecated, just write 'yunohost tools update apps system' (no -- prefix anymore)"
|
||||
)
|
||||
if apps and system:
|
||||
target = "all"
|
||||
elif apps:
|
||||
target = "apps"
|
||||
else:
|
||||
target = "system"
|
||||
|
||||
elif not target:
|
||||
target = "all"
|
||||
|
||||
if target not in ["system", "apps", "all"]:
|
||||
raise YunohostError(
|
||||
"Unknown target %s, should be 'system', 'apps' or 'all'" % target,
|
||||
raw_msg=True,
|
||||
)
|
||||
|
||||
upgradable_system_packages = []
|
||||
if system:
|
||||
if target in ["system", "all"]:
|
||||
|
||||
# Update APT cache
|
||||
# LC_ALL=C is here to make sure the results are in english
|
||||
|
@ -468,7 +481,7 @@ def tools_update(apps=False, system=False):
|
|||
logger.debug(m18n.n("done"))
|
||||
|
||||
upgradable_apps = []
|
||||
if apps:
|
||||
if target in ["apps", "all"]:
|
||||
try:
|
||||
_update_apps_catalog()
|
||||
except YunohostError as e:
|
||||
|
@ -519,7 +532,7 @@ def _list_upgradable_apps():
|
|||
|
||||
@is_unit_operation()
|
||||
def tools_upgrade(
|
||||
operation_logger, apps=None, system=False, allow_yunohost_upgrade=True
|
||||
operation_logger, target=None, apps=False, system=False, allow_yunohost_upgrade=True
|
||||
):
|
||||
"""
|
||||
Update apps & package cache, then display changelog
|
||||
|
@ -537,26 +550,38 @@ def tools_upgrade(
|
|||
if not packages.dpkg_lock_available():
|
||||
raise YunohostValidationError("dpkg_lock_not_available")
|
||||
|
||||
if system is not False and apps is not None:
|
||||
raise YunohostValidationError("tools_upgrade_cant_both")
|
||||
# Legacy options management (--system, --apps)
|
||||
if target is None:
|
||||
|
||||
if system is False and apps is None:
|
||||
raise YunohostValidationError("tools_upgrade_at_least_one")
|
||||
logger.warning(
|
||||
"Using 'yunohost tools upgrade' with --apps / --system is deprecated, just write 'yunohost tools upgrade apps' or 'system' (no -- prefix anymore)"
|
||||
)
|
||||
|
||||
if (system, apps) == (True, True):
|
||||
raise YunohostValidationError("tools_upgrade_cant_both")
|
||||
|
||||
if (system, apps) == (False, False):
|
||||
raise YunohostValidationError("tools_upgrade_at_least_one")
|
||||
|
||||
target = "apps" if apps else "system"
|
||||
|
||||
if target not in ["apps", "system"]:
|
||||
raise Exception(
|
||||
"Uhoh ?! tools_upgrade should have 'apps' or 'system' value for argument target"
|
||||
)
|
||||
|
||||
#
|
||||
# Apps
|
||||
# This is basically just an alias to yunohost app upgrade ...
|
||||
#
|
||||
|
||||
if apps is not None:
|
||||
if target == "apps":
|
||||
|
||||
# Make sure there's actually something to upgrade
|
||||
|
||||
upgradable_apps = [app["id"] for app in _list_upgradable_apps()]
|
||||
|
||||
if not upgradable_apps or (
|
||||
len(apps) and all(app not in upgradable_apps for app in apps)
|
||||
):
|
||||
if not upgradable_apps:
|
||||
logger.info(m18n.n("apps_already_up_to_date"))
|
||||
return
|
||||
|
||||
|
@ -574,7 +599,7 @@ def tools_upgrade(
|
|||
# System
|
||||
#
|
||||
|
||||
if system is True:
|
||||
if target == "system":
|
||||
|
||||
# Check that there's indeed some packages to upgrade
|
||||
upgradables = list(_list_upgradable_apt_packages())
|
||||
|
@ -898,9 +923,13 @@ def tools_migrations_run(
|
|||
pending = [t.id for t in targets if t.state == "pending"]
|
||||
|
||||
if skip and done:
|
||||
raise YunohostValidationError("migrations_not_pending_cant_skip", ids=", ".join(done))
|
||||
raise YunohostValidationError(
|
||||
"migrations_not_pending_cant_skip", ids=", ".join(done)
|
||||
)
|
||||
if force_rerun and pending:
|
||||
raise YunohostValidationError("migrations_pending_cant_rerun", ids=", ".join(pending))
|
||||
raise YunohostValidationError(
|
||||
"migrations_pending_cant_rerun", ids=", ".join(pending)
|
||||
)
|
||||
if not (skip or force_rerun) and done:
|
||||
raise YunohostValidationError("migrations_already_ran", ids=", ".join(done))
|
||||
|
||||
|
@ -1106,10 +1135,18 @@ def _tools_migrations_run_after_system_restore(backup_version):
|
|||
|
||||
all_migrations = _get_migrations_list()
|
||||
|
||||
current_version = version.parse(ynh_packages_version()["yunohost"]["version"])
|
||||
backup_version = version.parse(backup_version)
|
||||
|
||||
if backup_version == current_version:
|
||||
return
|
||||
|
||||
for migration in all_migrations:
|
||||
if hasattr(migration, "introduced_in_version") \
|
||||
and version.parse(migration.introduced_in_version) > version.parse(backup_version) \
|
||||
and hasattr(migration, "run_after_system_restore"):
|
||||
if (
|
||||
hasattr(migration, "introduced_in_version")
|
||||
and version.parse(migration.introduced_in_version) > backup_version
|
||||
and hasattr(migration, "run_after_system_restore")
|
||||
):
|
||||
try:
|
||||
logger.info(m18n.n("migrations_running_forward", id=migration.id))
|
||||
migration.run_after_system_restore()
|
||||
|
@ -1125,10 +1162,18 @@ def _tools_migrations_run_before_app_restore(backup_version, app_id):
|
|||
|
||||
all_migrations = _get_migrations_list()
|
||||
|
||||
current_version = version.parse(ynh_packages_version()["yunohost"]["version"])
|
||||
backup_version = version.parse(backup_version)
|
||||
|
||||
if backup_version == current_version:
|
||||
return
|
||||
|
||||
for migration in all_migrations:
|
||||
if hasattr(migration, "introduced_in_version") \
|
||||
and version.parse(migration.introduced_in_version) > version.parse(backup_version) \
|
||||
and hasattr(migration, "run_before_app_restore"):
|
||||
if (
|
||||
hasattr(migration, "introduced_in_version")
|
||||
and version.parse(migration.introduced_in_version) > backup_version
|
||||
and hasattr(migration, "run_before_app_restore")
|
||||
):
|
||||
try:
|
||||
logger.info(m18n.n("migrations_running_forward", id=migration.id))
|
||||
migration.run_before_app_restore(app_id)
|
||||
|
@ -1164,3 +1209,49 @@ class Migration(object):
|
|||
@property
|
||||
def description(self):
|
||||
return m18n.n("migration_description_%s" % self.id)
|
||||
|
||||
def ldap_migration(run):
|
||||
def func(self):
|
||||
|
||||
# Backup LDAP before the migration
|
||||
logger.info(m18n.n("migration_ldap_backup_before_migration"))
|
||||
try:
|
||||
backup_folder = "/home/yunohost.backup/premigration/" + time.strftime(
|
||||
"%Y%m%d-%H%M%S", time.gmtime()
|
||||
)
|
||||
os.makedirs(backup_folder, 0o750)
|
||||
os.system("systemctl stop slapd")
|
||||
os.system(f"cp -r --preserve /etc/ldap {backup_folder}/ldap_config")
|
||||
os.system(f"cp -r --preserve /var/lib/ldap {backup_folder}/ldap_db")
|
||||
os.system(
|
||||
f"cp -r --preserve /etc/yunohost/apps {backup_folder}/apps_settings"
|
||||
)
|
||||
except Exception as e:
|
||||
raise YunohostError(
|
||||
"migration_ldap_can_not_backup_before_migration", error=str(e)
|
||||
)
|
||||
finally:
|
||||
os.system("systemctl start slapd")
|
||||
|
||||
try:
|
||||
run(self, backup_folder)
|
||||
except Exception:
|
||||
logger.warning(
|
||||
m18n.n("migration_ldap_migration_failed_trying_to_rollback")
|
||||
)
|
||||
os.system("systemctl stop slapd")
|
||||
# To be sure that we don't keep some part of the old config
|
||||
os.system("rm -r /etc/ldap/slapd.d")
|
||||
os.system(f"cp -r --preserve {backup_folder}/ldap_config/. /etc/ldap/")
|
||||
os.system(f"cp -r --preserve {backup_folder}/ldap_db/. /var/lib/ldap/")
|
||||
os.system(
|
||||
f"cp -r --preserve {backup_folder}/apps_settings/. /etc/yunohost/apps/"
|
||||
)
|
||||
os.system("systemctl start slapd")
|
||||
os.system(f"rm -r {backup_folder}")
|
||||
logger.info(m18n.n("migration_ldap_rollback_success"))
|
||||
raise
|
||||
else:
|
||||
os.system(f"rm -r {backup_folder}")
|
||||
|
||||
return func
|
||||
|
|
|
@ -53,7 +53,6 @@ def user_list(fields=None):
|
|||
"cn": "fullname",
|
||||
"mail": "mail",
|
||||
"maildrop": "mail-forward",
|
||||
"loginShell": "shell",
|
||||
"homeDirectory": "home_path",
|
||||
"mailuserquota": "mailbox-quota",
|
||||
}
|
||||
|
@ -69,7 +68,7 @@ def user_list(fields=None):
|
|||
else:
|
||||
raise YunohostError("field_invalid", attr)
|
||||
else:
|
||||
attrs = ["uid", "cn", "mail", "mailuserquota", "loginShell"]
|
||||
attrs = ["uid", "cn", "mail", "mailuserquota"]
|
||||
|
||||
ldap = _get_ldap_interface()
|
||||
result = ldap.search(
|
||||
|
@ -82,12 +81,6 @@ def user_list(fields=None):
|
|||
entry = {}
|
||||
for attr, values in user.items():
|
||||
if values:
|
||||
if attr == "loginShell":
|
||||
if values[0].strip() == "/bin/false":
|
||||
entry["ssh_allowed"] = False
|
||||
else:
|
||||
entry["ssh_allowed"] = True
|
||||
|
||||
entry[user_attrs[attr]] = values[0]
|
||||
|
||||
uid = entry[user_attrs["uid"]]
|
||||
|
@ -125,7 +118,9 @@ def user_create(
|
|||
# Validate domain used for email address/xmpp account
|
||||
if domain is None:
|
||||
if msettings.get("interface") == "api":
|
||||
raise YunohostValidationError("Invalid usage, you should specify a domain argument")
|
||||
raise YunohostValidationError(
|
||||
"Invalid usage, you should specify a domain argument"
|
||||
)
|
||||
else:
|
||||
# On affiche les differents domaines possibles
|
||||
msignals.display(m18n.n("domains_available"))
|
||||
|
@ -206,7 +201,7 @@ def user_create(
|
|||
"gidNumber": [uid],
|
||||
"uidNumber": [uid],
|
||||
"homeDirectory": ["/home/" + username],
|
||||
"loginShell": ["/bin/false"],
|
||||
"loginShell": ["/bin/bash"],
|
||||
}
|
||||
|
||||
# If it is the first user, add some aliases
|
||||
|
@ -230,7 +225,9 @@ def user_create(
|
|||
logger.warning(m18n.n("user_home_creation_failed"), exc_info=1)
|
||||
|
||||
try:
|
||||
subprocess.check_call(["setfacl", "-m", "g:all_users:---", "/home/%s" % username])
|
||||
subprocess.check_call(
|
||||
["setfacl", "-m", "g:all_users:---", "/home/%s" % username]
|
||||
)
|
||||
except subprocess.CalledProcessError:
|
||||
logger.warning("Failed to protect /home/%s" % username, exc_info=1)
|
||||
|
||||
|
@ -419,7 +416,9 @@ def user_update(
|
|||
try:
|
||||
ldap.validate_uniqueness({"mail": mail})
|
||||
except Exception as e:
|
||||
raise YunohostValidationError("user_update_failed", user=username, error=e)
|
||||
raise YunohostValidationError(
|
||||
"user_update_failed", user=username, error=e
|
||||
)
|
||||
if mail[mail.find("@") + 1 :] not in domains:
|
||||
raise YunohostValidationError(
|
||||
"mail_domain_unknown", domain=mail[mail.find("@") + 1 :]
|
||||
|
@ -656,7 +655,9 @@ def user_group_create(
|
|||
"sed --in-place '/^%s:/d' /etc/group" % groupname, shell=True
|
||||
)
|
||||
else:
|
||||
raise YunohostValidationError("group_already_exist_on_system", group=groupname)
|
||||
raise YunohostValidationError(
|
||||
"group_already_exist_on_system", group=groupname
|
||||
)
|
||||
|
||||
if not gid:
|
||||
# Get random GID
|
||||
|
@ -765,7 +766,9 @@ def user_group_update(
|
|||
elif groupname == "visitors":
|
||||
raise YunohostValidationError("group_cannot_edit_visitors")
|
||||
elif groupname in existing_users:
|
||||
raise YunohostValidationError("group_cannot_edit_primary_group", group=groupname)
|
||||
raise YunohostValidationError(
|
||||
"group_cannot_edit_primary_group", group=groupname
|
||||
)
|
||||
|
||||
# We extract the uid for each member of the group to keep a simple flat list of members
|
||||
current_group = user_group_info(groupname)["members"]
|
||||
|
@ -862,6 +865,32 @@ def user_group_info(groupname):
|
|||
}
|
||||
|
||||
|
||||
def user_group_add(groupname, usernames, force=False, sync_perm=True):
|
||||
"""
|
||||
Add user(s) to a group
|
||||
|
||||
Keyword argument:
|
||||
groupname -- Groupname to update
|
||||
usernames -- User(s) to add in the group
|
||||
|
||||
"""
|
||||
return user_group_update(groupname, add=usernames, force=force, sync_perm=sync_perm)
|
||||
|
||||
|
||||
def user_group_remove(groupname, usernames, force=False, sync_perm=True):
|
||||
"""
|
||||
Remove user(s) from a group
|
||||
|
||||
Keyword argument:
|
||||
groupname -- Groupname to update
|
||||
usernames -- User(s) to remove from the group
|
||||
|
||||
"""
|
||||
return user_group_update(
|
||||
groupname, remove=usernames, force=force, sync_perm=sync_perm
|
||||
)
|
||||
|
||||
|
||||
#
|
||||
# Permission subcategory
|
||||
#
|
||||
|
@ -870,21 +899,34 @@ def user_group_info(groupname):
|
|||
def user_permission_list(short=False, full=False, apps=[]):
|
||||
import yunohost.permission
|
||||
|
||||
return yunohost.permission.user_permission_list(short, full, absolute_urls=True, apps=apps)
|
||||
return yunohost.permission.user_permission_list(
|
||||
short, full, absolute_urls=True, apps=apps
|
||||
)
|
||||
|
||||
|
||||
def user_permission_update(
|
||||
permission, add=None, remove=None, label=None, show_tile=None, sync_perm=True
|
||||
def user_permission_update(permission, label=None, show_tile=None, sync_perm=True):
|
||||
import yunohost.permission
|
||||
|
||||
return yunohost.permission.user_permission_update(
|
||||
permission, label=label, show_tile=show_tile, sync_perm=sync_perm
|
||||
)
|
||||
|
||||
|
||||
def user_permission_add(permission, names, protected=None, force=False, sync_perm=True):
|
||||
import yunohost.permission
|
||||
|
||||
return yunohost.permission.user_permission_update(
|
||||
permission, add=names, protected=protected, force=force, sync_perm=sync_perm
|
||||
)
|
||||
|
||||
|
||||
def user_permission_remove(
|
||||
permission, names, protected=None, force=False, sync_perm=True
|
||||
):
|
||||
import yunohost.permission
|
||||
|
||||
return yunohost.permission.user_permission_update(
|
||||
permission,
|
||||
add=add,
|
||||
remove=remove,
|
||||
label=label,
|
||||
show_tile=show_tile,
|
||||
sync_perm=sync_perm,
|
||||
permission, remove=names, protected=protected, force=force, sync_perm=sync_perm
|
||||
)
|
||||
|
||||
|
||||
|
@ -906,14 +948,6 @@ def user_permission_info(permission):
|
|||
import yunohost.ssh
|
||||
|
||||
|
||||
def user_ssh_allow(username):
|
||||
return yunohost.ssh.user_ssh_allow(username)
|
||||
|
||||
|
||||
def user_ssh_disallow(username):
|
||||
return yunohost.ssh.user_ssh_disallow(username)
|
||||
|
||||
|
||||
def user_ssh_list_keys(username):
|
||||
return yunohost.ssh.user_ssh_list_keys(username)
|
||||
|
||||
|
|
22
tests/test_helpers.d/ynhtest_network.sh
Normal file
22
tests/test_helpers.d/ynhtest_network.sh
Normal file
|
@ -0,0 +1,22 @@
|
|||
ynhtest_port_80_aint_available() {
|
||||
! ynh_port_available 80
|
||||
}
|
||||
|
||||
ynhtest_port_12345_is_available() {
|
||||
ynh_port_available 12345
|
||||
}
|
||||
|
||||
ynhtest_port_12345_is_booked_by_other_app() {
|
||||
|
||||
ynh_port_available 12345
|
||||
ynh_port_available 12346
|
||||
|
||||
mkdir -p /etc/yunohost/apps/block_port/
|
||||
echo "port: '12345'" > /etc/yunohost/apps/block_port/settings.yml
|
||||
! ynh_port_available 12345
|
||||
|
||||
echo "other_port: '12346'" > /etc/yunohost/apps/block_port/settings.yml
|
||||
! ynh_port_available 12346
|
||||
|
||||
rm -rf /etc/yunohost/apps/block_port
|
||||
}
|
Loading…
Add table
Reference in a new issue