mirror of
https://github.com/YunoHost/yunohost.git
synced 2024-09-03 20:06:10 +02:00
commit
0d83d35c4d
5 changed files with 45 additions and 44 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -32,3 +32,6 @@ pip-log.txt
|
||||||
|
|
||||||
# moulinette lib
|
# moulinette lib
|
||||||
src/yunohost/locales
|
src/yunohost/locales
|
||||||
|
|
||||||
|
# Test
|
||||||
|
src/yunohost/tests/apps
|
||||||
|
|
|
@ -194,6 +194,8 @@
|
||||||
"global_settings_setting_example_enum": "Example enum option",
|
"global_settings_setting_example_enum": "Example enum option",
|
||||||
"global_settings_setting_example_int": "Example int option",
|
"global_settings_setting_example_int": "Example int option",
|
||||||
"global_settings_setting_example_string": "Example string option",
|
"global_settings_setting_example_string": "Example string option",
|
||||||
|
"global_settings_setting_security_password_admin_strength": "Admin password strength",
|
||||||
|
"global_settings_setting_security_password_user_strength": "User password strength",
|
||||||
"global_settings_unknown_setting_from_settings_file": "Unknown key in settings: '{setting_key:s}', discarding it and save it in /etc/yunohost/unkown_settings.json",
|
"global_settings_unknown_setting_from_settings_file": "Unknown key in settings: '{setting_key:s}', discarding it and save it in /etc/yunohost/unkown_settings.json",
|
||||||
"global_settings_unknown_type": "Unexpected situation, the setting {setting:s} appears to have the type {unknown_type:s} but it's not a type supported by the system.",
|
"global_settings_unknown_type": "Unexpected situation, the setting {setting:s} appears to have the type {unknown_type:s} but it's not a type supported by the system.",
|
||||||
"good_practices_about_admin_password": "You are now about to define a new administration password. The password should be at least 8 characters - though it is good practice to use longer password (i.e. a passphrase) and/or to use various kind of characters (uppercase, lowercase, digits and special characters).",
|
"good_practices_about_admin_password": "You are now about to define a new administration password. The password should be at least 8 characters - though it is good practice to use longer password (i.e. a passphrase) and/or to use various kind of characters (uppercase, lowercase, digits and special characters).",
|
||||||
|
|
|
@ -96,7 +96,12 @@ def settings_set(key, value):
|
||||||
elif key_type == "int":
|
elif key_type == "int":
|
||||||
if not isinstance(value, int) or isinstance(value, bool):
|
if not isinstance(value, int) or isinstance(value, bool):
|
||||||
if isinstance(value, str):
|
if isinstance(value, str):
|
||||||
|
try:
|
||||||
value=int(value)
|
value=int(value)
|
||||||
|
except:
|
||||||
|
raise MoulinetteError(errno.EINVAL, m18n.n(
|
||||||
|
'global_settings_bad_type_for_setting', setting=key,
|
||||||
|
received_type=type(value).__name__, expected_type=key_type))
|
||||||
else:
|
else:
|
||||||
raise MoulinetteError(errno.EINVAL, m18n.n(
|
raise MoulinetteError(errno.EINVAL, m18n.n(
|
||||||
'global_settings_bad_type_for_setting', setting=key,
|
'global_settings_bad_type_for_setting', setting=key,
|
||||||
|
|
|
@ -15,7 +15,7 @@ from yunohost.domain import _get_maindomain
|
||||||
from moulinette.core import MoulinetteError
|
from moulinette.core import MoulinetteError
|
||||||
|
|
||||||
# Get main domain
|
# Get main domain
|
||||||
maindomain = _get_maindomain()
|
maindomain = ""
|
||||||
|
|
||||||
# Instantiate LDAP Authenticator
|
# Instantiate LDAP Authenticator
|
||||||
AUTH_IDENTIFIER = ('ldap', 'ldap-anonymous')
|
AUTH_IDENTIFIER = ('ldap', 'ldap-anonymous')
|
||||||
|
@ -24,6 +24,9 @@ auth = None
|
||||||
|
|
||||||
def setup_function(function):
|
def setup_function(function):
|
||||||
|
|
||||||
|
global maindomain
|
||||||
|
maindomain = _get_maindomain()
|
||||||
|
|
||||||
print ""
|
print ""
|
||||||
|
|
||||||
global auth
|
global auth
|
||||||
|
@ -195,7 +198,7 @@ def add_archive_system_from_2p4():
|
||||||
def test_backup_only_ldap():
|
def test_backup_only_ldap():
|
||||||
|
|
||||||
# Create the backup
|
# Create the backup
|
||||||
backup_create(ignore_system=False, ignore_apps=True, system=["conf_ldap"])
|
backup_create(system=["conf_ldap"], apps=None)
|
||||||
|
|
||||||
archives = backup_list()["archives"]
|
archives = backup_list()["archives"]
|
||||||
assert len(archives) == 1
|
assert len(archives) == 1
|
||||||
|
@ -212,7 +215,7 @@ def test_backup_system_part_that_does_not_exists(mocker):
|
||||||
|
|
||||||
# Create the backup
|
# Create the backup
|
||||||
with pytest.raises(MoulinetteError):
|
with pytest.raises(MoulinetteError):
|
||||||
backup_create(ignore_system=False, ignore_apps=True, system=["yolol"])
|
backup_create(system=["yolol"], apps=None)
|
||||||
|
|
||||||
m18n.n.assert_any_call('backup_hook_unknown', hook="yolol")
|
m18n.n.assert_any_call('backup_hook_unknown', hook="yolol")
|
||||||
m18n.n.assert_any_call('backup_nothings_done')
|
m18n.n.assert_any_call('backup_nothings_done')
|
||||||
|
@ -224,7 +227,7 @@ def test_backup_system_part_that_does_not_exists(mocker):
|
||||||
def test_backup_and_restore_all_sys():
|
def test_backup_and_restore_all_sys():
|
||||||
|
|
||||||
# Create the backup
|
# Create the backup
|
||||||
backup_create(ignore_system=False, ignore_apps=True)
|
backup_create(system=[], apps=None)
|
||||||
|
|
||||||
archives = backup_list()["archives"]
|
archives = backup_list()["archives"]
|
||||||
assert len(archives) == 1
|
assert len(archives) == 1
|
||||||
|
@ -241,7 +244,7 @@ def test_backup_and_restore_all_sys():
|
||||||
|
|
||||||
# Restore the backup
|
# Restore the backup
|
||||||
backup_restore(auth, name=archives[0], force=True,
|
backup_restore(auth, name=archives[0], force=True,
|
||||||
ignore_system=False, ignore_apps=True)
|
system=[], apps=None)
|
||||||
|
|
||||||
# Check ssowat conf is back
|
# Check ssowat conf is back
|
||||||
assert os.path.exists("/etc/ssowat/conf.json")
|
assert os.path.exists("/etc/ssowat/conf.json")
|
||||||
|
@ -255,21 +258,21 @@ def test_backup_and_restore_all_sys():
|
||||||
def test_restore_system_from_Ynh2p4(monkeypatch, mocker):
|
def test_restore_system_from_Ynh2p4(monkeypatch, mocker):
|
||||||
|
|
||||||
# Backup current system
|
# Backup current system
|
||||||
backup_create(ignore_system=False, ignore_apps=True)
|
backup_create(system=[], apps=None)
|
||||||
archives = backup_list()["archives"]
|
archives = backup_list()["archives"]
|
||||||
assert len(archives) == 2
|
assert len(archives) == 2
|
||||||
|
|
||||||
# Restore system archive from 2.4
|
# Restore system archive from 2.4
|
||||||
try:
|
try:
|
||||||
backup_restore(auth, name=backup_list()["archives"][1],
|
backup_restore(auth, name=backup_list()["archives"][1],
|
||||||
ignore_system=False,
|
system=[],
|
||||||
ignore_apps=True,
|
apps=None,
|
||||||
force=True)
|
force=True)
|
||||||
finally:
|
finally:
|
||||||
# Restore system as it was
|
# Restore system as it was
|
||||||
backup_restore(auth, name=backup_list()["archives"][0],
|
backup_restore(auth, name=backup_list()["archives"][0],
|
||||||
ignore_system=False,
|
system=[],
|
||||||
ignore_apps=True,
|
apps=None,
|
||||||
force=True)
|
force=True)
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
@ -293,7 +296,7 @@ def test_backup_script_failure_handling(monkeypatch, mocker):
|
||||||
mocker.spy(m18n, "n")
|
mocker.spy(m18n, "n")
|
||||||
|
|
||||||
with pytest.raises(MoulinetteError):
|
with pytest.raises(MoulinetteError):
|
||||||
backup_create(ignore_system=True, ignore_apps=False, apps=["backup_recommended_app"])
|
backup_create(system=None, apps=["backup_recommended_app"])
|
||||||
|
|
||||||
m18n.n.assert_any_call('backup_app_failed', app='backup_recommended_app')
|
m18n.n.assert_any_call('backup_app_failed', app='backup_recommended_app')
|
||||||
|
|
||||||
|
@ -313,7 +316,7 @@ def test_backup_not_enough_free_space(monkeypatch, mocker):
|
||||||
mocker.spy(m18n, "n")
|
mocker.spy(m18n, "n")
|
||||||
|
|
||||||
with pytest.raises(MoulinetteError):
|
with pytest.raises(MoulinetteError):
|
||||||
backup_create(ignore_system=True, ignore_apps=False, apps=["backup_recommended_app"])
|
backup_create(system=None, apps=["backup_recommended_app"])
|
||||||
|
|
||||||
m18n.n.assert_any_call('not_enough_disk_space', path=ANY)
|
m18n.n.assert_any_call('not_enough_disk_space', path=ANY)
|
||||||
|
|
||||||
|
@ -325,7 +328,7 @@ def test_backup_app_not_installed(mocker):
|
||||||
mocker.spy(m18n, "n")
|
mocker.spy(m18n, "n")
|
||||||
|
|
||||||
with pytest.raises(MoulinetteError):
|
with pytest.raises(MoulinetteError):
|
||||||
backup_create(ignore_system=True, ignore_apps=False, apps=["wordpress"])
|
backup_create(system=None, apps=["wordpress"])
|
||||||
|
|
||||||
m18n.n.assert_any_call("unbackup_app", app="wordpress")
|
m18n.n.assert_any_call("unbackup_app", app="wordpress")
|
||||||
m18n.n.assert_any_call('backup_nothings_done')
|
m18n.n.assert_any_call('backup_nothings_done')
|
||||||
|
@ -341,7 +344,7 @@ def test_backup_app_with_no_backup_script(mocker):
|
||||||
mocker.spy(m18n, "n")
|
mocker.spy(m18n, "n")
|
||||||
|
|
||||||
with pytest.raises(MoulinetteError):
|
with pytest.raises(MoulinetteError):
|
||||||
backup_create(ignore_system=True, ignore_apps=False, apps=["backup_recommended_app"])
|
backup_create(system=None, apps=["backup_recommended_app"])
|
||||||
|
|
||||||
m18n.n.assert_any_call("backup_with_no_backup_script_for_app", app="backup_recommended_app")
|
m18n.n.assert_any_call("backup_with_no_backup_script_for_app", app="backup_recommended_app")
|
||||||
m18n.n.assert_any_call('backup_nothings_done')
|
m18n.n.assert_any_call('backup_nothings_done')
|
||||||
|
@ -359,7 +362,7 @@ def test_backup_app_with_no_restore_script(mocker):
|
||||||
# Backuping an app with no restore script will only display a warning to the
|
# Backuping an app with no restore script will only display a warning to the
|
||||||
# user...
|
# user...
|
||||||
|
|
||||||
backup_create(ignore_system=True, ignore_apps=False, apps=["backup_recommended_app"])
|
backup_create(system=None, apps=["backup_recommended_app"])
|
||||||
|
|
||||||
m18n.n.assert_any_call("backup_with_no_restore_script_for_app", app="backup_recommended_app")
|
m18n.n.assert_any_call("backup_with_no_restore_script_for_app", app="backup_recommended_app")
|
||||||
|
|
||||||
|
@ -368,7 +371,7 @@ def test_backup_app_with_no_restore_script(mocker):
|
||||||
def test_backup_with_different_output_directory():
|
def test_backup_with_different_output_directory():
|
||||||
|
|
||||||
# Create the backup
|
# Create the backup
|
||||||
backup_create(ignore_system=False, ignore_apps=True, system=["conf_ssh"],
|
backup_create(system=["conf_ssh"], apps=None,
|
||||||
output_directory="/opt/test_backup_output_directory",
|
output_directory="/opt/test_backup_output_directory",
|
||||||
name="backup")
|
name="backup")
|
||||||
|
|
||||||
|
@ -385,7 +388,7 @@ def test_backup_with_different_output_directory():
|
||||||
@pytest.mark.clean_opt_dir
|
@pytest.mark.clean_opt_dir
|
||||||
def test_backup_with_no_compress():
|
def test_backup_with_no_compress():
|
||||||
# Create the backup
|
# Create the backup
|
||||||
backup_create(ignore_system=False, ignore_apps=True, system=["conf_nginx"],
|
backup_create(system=["conf_nginx"], apps=None,
|
||||||
output_directory="/opt/test_backup_output_directory",
|
output_directory="/opt/test_backup_output_directory",
|
||||||
no_compress=True,
|
no_compress=True,
|
||||||
name="backup")
|
name="backup")
|
||||||
|
@ -400,9 +403,7 @@ def test_backup_with_no_compress():
|
||||||
@pytest.mark.with_wordpress_archive_from_2p4
|
@pytest.mark.with_wordpress_archive_from_2p4
|
||||||
def test_restore_app_wordpress_from_Ynh2p4():
|
def test_restore_app_wordpress_from_Ynh2p4():
|
||||||
|
|
||||||
backup_restore(auth, name=backup_list()["archives"][0],
|
backup_restore(auth, system=None, name=backup_list()["archives"][0],
|
||||||
ignore_system=True,
|
|
||||||
ignore_apps=False,
|
|
||||||
apps=["wordpress"])
|
apps=["wordpress"])
|
||||||
|
|
||||||
|
|
||||||
|
@ -420,9 +421,7 @@ def test_restore_app_script_failure_handling(monkeypatch, mocker):
|
||||||
assert not _is_installed("wordpress")
|
assert not _is_installed("wordpress")
|
||||||
|
|
||||||
with pytest.raises(MoulinetteError):
|
with pytest.raises(MoulinetteError):
|
||||||
backup_restore(auth, name=backup_list()["archives"][0],
|
backup_restore(auth, system=None, name=backup_list()["archives"][0],
|
||||||
ignore_system=True,
|
|
||||||
ignore_apps=False,
|
|
||||||
apps=["wordpress"])
|
apps=["wordpress"])
|
||||||
|
|
||||||
m18n.n.assert_any_call('restore_app_failed', app='wordpress')
|
m18n.n.assert_any_call('restore_app_failed', app='wordpress')
|
||||||
|
@ -443,9 +442,7 @@ def test_restore_app_not_enough_free_space(monkeypatch, mocker):
|
||||||
assert not _is_installed("wordpress")
|
assert not _is_installed("wordpress")
|
||||||
|
|
||||||
with pytest.raises(MoulinetteError):
|
with pytest.raises(MoulinetteError):
|
||||||
backup_restore(auth, name=backup_list()["archives"][0],
|
backup_restore(auth, system=None, name=backup_list()["archives"][0],
|
||||||
ignore_system=True,
|
|
||||||
ignore_apps=False,
|
|
||||||
apps=["wordpress"])
|
apps=["wordpress"])
|
||||||
|
|
||||||
m18n.n.assert_any_call('restore_not_enough_disk_space',
|
m18n.n.assert_any_call('restore_not_enough_disk_space',
|
||||||
|
@ -464,9 +461,7 @@ def test_restore_app_not_in_backup(mocker):
|
||||||
mocker.spy(m18n, "n")
|
mocker.spy(m18n, "n")
|
||||||
|
|
||||||
with pytest.raises(MoulinetteError):
|
with pytest.raises(MoulinetteError):
|
||||||
backup_restore(auth, name=backup_list()["archives"][0],
|
backup_restore(auth, system=None, name=backup_list()["archives"][0],
|
||||||
ignore_system=True,
|
|
||||||
ignore_apps=False,
|
|
||||||
apps=["yoloswag"])
|
apps=["yoloswag"])
|
||||||
|
|
||||||
m18n.n.assert_any_call('backup_archive_app_not_found', app="yoloswag")
|
m18n.n.assert_any_call('backup_archive_app_not_found', app="yoloswag")
|
||||||
|
@ -479,18 +474,14 @@ def test_restore_app_already_installed(mocker):
|
||||||
|
|
||||||
assert not _is_installed("wordpress")
|
assert not _is_installed("wordpress")
|
||||||
|
|
||||||
backup_restore(auth, name=backup_list()["archives"][0],
|
backup_restore(auth, system=None, name=backup_list()["archives"][0],
|
||||||
ignore_system=True,
|
|
||||||
ignore_apps=False,
|
|
||||||
apps=["wordpress"])
|
apps=["wordpress"])
|
||||||
|
|
||||||
assert _is_installed("wordpress")
|
assert _is_installed("wordpress")
|
||||||
|
|
||||||
mocker.spy(m18n, "n")
|
mocker.spy(m18n, "n")
|
||||||
with pytest.raises(MoulinetteError):
|
with pytest.raises(MoulinetteError):
|
||||||
backup_restore(auth, name=backup_list()["archives"][0],
|
backup_restore(auth, system=None, name=backup_list()["archives"][0],
|
||||||
ignore_system=True,
|
|
||||||
ignore_apps=False,
|
|
||||||
apps=["wordpress"])
|
apps=["wordpress"])
|
||||||
|
|
||||||
m18n.n.assert_any_call('restore_already_installed_app', app="wordpress")
|
m18n.n.assert_any_call('restore_already_installed_app', app="wordpress")
|
||||||
|
@ -520,7 +511,7 @@ def test_backup_and_restore_with_ynh_restore():
|
||||||
def _test_backup_and_restore_app(app):
|
def _test_backup_and_restore_app(app):
|
||||||
|
|
||||||
# Create a backup of this app
|
# Create a backup of this app
|
||||||
backup_create(ignore_system=True, ignore_apps=False, apps=[app])
|
backup_create(system=None, apps=[app])
|
||||||
|
|
||||||
archives = backup_list()["archives"]
|
archives = backup_list()["archives"]
|
||||||
assert len(archives) == 1
|
assert len(archives) == 1
|
||||||
|
@ -535,8 +526,8 @@ def _test_backup_and_restore_app(app):
|
||||||
assert not app_is_installed(app)
|
assert not app_is_installed(app)
|
||||||
|
|
||||||
# Restore the app
|
# Restore the app
|
||||||
backup_restore(auth, name=archives[0], ignore_system=True,
|
backup_restore(auth, system=None, name=archives[0],
|
||||||
ignore_apps=False, apps=[app])
|
apps=[app])
|
||||||
|
|
||||||
assert app_is_installed(app)
|
assert app_is_installed(app)
|
||||||
|
|
||||||
|
@ -554,8 +545,7 @@ def test_restore_archive_with_no_json(mocker):
|
||||||
|
|
||||||
mocker.spy(m18n, "n")
|
mocker.spy(m18n, "n")
|
||||||
with pytest.raises(MoulinetteError):
|
with pytest.raises(MoulinetteError):
|
||||||
backup_restore(auth, name="badbackup", force=True,
|
backup_restore(auth, name="badbackup", force=True)
|
||||||
ignore_system=False, ignore_apps=False)
|
|
||||||
m18n.n.assert_any_call('backup_invalid_archive')
|
m18n.n.assert_any_call('backup_invalid_archive')
|
||||||
|
|
||||||
|
|
||||||
|
@ -565,9 +555,10 @@ def test_backup_binds_are_readonly(monkeypatch):
|
||||||
self.manager = backup_manager
|
self.manager = backup_manager
|
||||||
self._organize_files()
|
self._organize_files()
|
||||||
|
|
||||||
|
|
||||||
confssh = os.path.join(self.work_dir, "conf/ssh")
|
confssh = os.path.join(self.work_dir, "conf/ssh")
|
||||||
output = subprocess.check_output("touch %s/test 2>&1 || true" % confssh,
|
output = subprocess.check_output("touch %s/test 2>&1 || true" % confssh,
|
||||||
shell=True)
|
shell=True, env={'LANG' : 'en_US.UTF-8'})
|
||||||
|
|
||||||
assert "Read-only file system" in output
|
assert "Read-only file system" in output
|
||||||
|
|
||||||
|
@ -580,4 +571,4 @@ def test_backup_binds_are_readonly(monkeypatch):
|
||||||
custom_mount_and_backup)
|
custom_mount_and_backup)
|
||||||
|
|
||||||
# Create the backup
|
# Create the backup
|
||||||
backup_create(ignore_system=False, ignore_apps=True)
|
backup_create(system=[])
|
||||||
|
|
|
@ -38,7 +38,7 @@ def check_changeurl_app(path):
|
||||||
|
|
||||||
assert appmap[maindomain][path + "/"]["id"] == "change_url_app"
|
assert appmap[maindomain][path + "/"]["id"] == "change_url_app"
|
||||||
|
|
||||||
r = requests.get("https://%s%s/" % (maindomain, path), verify=False)
|
r = requests.get("https://127.0.0.1%s/" % path, headers={"domain": maindomain}, verify=False)
|
||||||
assert r.status_code == 200
|
assert r.status_code == 200
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue