We need to have YNH_MANIFEST_VERSION also defined during backup/restore (#1088)

* We need to have YNH_MANIFEST_VERSION also defined during backup/restore

Co-authored-by: Kayou <pierre@kayou.io>
This commit is contained in:
Alexandre Aubin 2020-11-30 23:20:13 +01:00 committed by GitHub
parent 199cc50f66
commit 74272de52c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 78 deletions

View file

@ -360,13 +360,7 @@ def app_change_url(operation_logger, app, domain, path):
args_list.append(app) args_list.append(app)
# Prepare env. var. to pass to script # Prepare env. var. to pass to script
env_dict = _make_environment_dict(args_odict) env_dict = _make_environment_for_app_script(app, args=args_odict)
app_id, app_instance_nb = _parse_app_instance_name(app)
env_dict["YNH_APP_ID"] = app_id
env_dict["YNH_APP_INSTANCE_NAME"] = app
env_dict["YNH_APP_INSTANCE_NUMBER"] = str(app_instance_nb)
env_dict["YNH_APP_MANIFEST_VERSION"] = manifest.get("version", "?")
env_dict["YNH_APP_OLD_DOMAIN"] = old_domain env_dict["YNH_APP_OLD_DOMAIN"] = old_domain
env_dict["YNH_APP_OLD_PATH"] = old_path env_dict["YNH_APP_OLD_PATH"] = old_path
env_dict["YNH_APP_NEW_DOMAIN"] = domain env_dict["YNH_APP_NEW_DOMAIN"] = domain
@ -528,11 +522,7 @@ def app_upgrade(app=[], url=None, file=None, force=False):
args_list.append(app_instance_name) args_list.append(app_instance_name)
# Prepare env. var. to pass to script # Prepare env. var. to pass to script
env_dict = _make_environment_dict(args_odict) env_dict = _make_environment_for_app_script(app_instance_name, args=args_odict)
app_id, app_instance_nb = _parse_app_instance_name(app_instance_name)
env_dict["YNH_APP_ID"] = app_id
env_dict["YNH_APP_INSTANCE_NAME"] = app_instance_name
env_dict["YNH_APP_INSTANCE_NUMBER"] = str(app_instance_nb)
env_dict["YNH_APP_UPGRADE_TYPE"] = upgrade_type env_dict["YNH_APP_UPGRADE_TYPE"] = upgrade_type
env_dict["YNH_APP_MANIFEST_VERSION"] = str(app_new_version) env_dict["YNH_APP_MANIFEST_VERSION"] = str(app_new_version)
env_dict["YNH_APP_CURRENT_VERSION"] = str(app_current_version) env_dict["YNH_APP_CURRENT_VERSION"] = str(app_current_version)
@ -762,20 +752,6 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu
# Apply dirty patch to make php5 apps compatible with php7 # Apply dirty patch to make php5 apps compatible with php7
_patch_legacy_php_versions(extracted_app_folder) _patch_legacy_php_versions(extracted_app_folder)
# Prepare env. var. to pass to script
env_dict = _make_environment_dict(args_odict)
env_dict["YNH_APP_ID"] = app_id
env_dict["YNH_APP_INSTANCE_NAME"] = app_instance_name
env_dict["YNH_APP_INSTANCE_NUMBER"] = str(instance_number)
env_dict["YNH_APP_MANIFEST_VERSION"] = manifest.get("version", "?")
env_dict_for_logging = env_dict.copy()
for arg_name, arg_value_and_type in args_odict.items():
if arg_value_and_type[1] == "password":
del env_dict_for_logging["YNH_APP_ARG_%s" % arg_name.upper()]
operation_logger.extra.update({'env': env_dict_for_logging})
# We'll check that the app didn't brutally edit some system configuration # We'll check that the app didn't brutally edit some system configuration
manually_modified_files_before_install = manually_modified_files() manually_modified_files_before_install = manually_modified_files()
@ -827,6 +803,16 @@ def app_install(operation_logger, app, label=None, args=None, no_remove_on_failu
# will be enabled during the app install. C.f. 'app_register_url()' below. # will be enabled during the app install. C.f. 'app_register_url()' below.
permission_create(app_instance_name + ".main", allowed=["all_users"], label=label, show_tile=False, protected=False) permission_create(app_instance_name + ".main", allowed=["all_users"], label=label, show_tile=False, protected=False)
# Prepare env. var. to pass to script
env_dict = _make_environment_for_app_script(app_instance_name, args=args_odict)
env_dict_for_logging = env_dict.copy()
for arg_name, arg_value_and_type in args_odict.items():
if arg_value_and_type[1] == "password":
del env_dict_for_logging["YNH_APP_ARG_%s" % arg_name.upper()]
operation_logger.extra.update({'env': env_dict_for_logging})
# Execute the app install script # Execute the app install script
install_failed = True install_failed = True
try: try:
@ -1476,12 +1462,7 @@ def app_action_run(operation_logger, app, action, args=None):
args_odict = _parse_args_for_action(actions[action], args=args_dict) args_odict = _parse_args_for_action(actions[action], args=args_dict)
args_list = [value[0] for value in args_odict.values()] args_list = [value[0] for value in args_odict.values()]
app_id, app_instance_nb = _parse_app_instance_name(app) env_dict = _make_environment_for_app_script(app, args=args_odict, args_prefix="ACTION_")
env_dict = _make_environment_dict(args_odict, prefix="ACTION_")
env_dict["YNH_APP_ID"] = app_id
env_dict["YNH_APP_INSTANCE_NAME"] = app
env_dict["YNH_APP_INSTANCE_NUMBER"] = str(app_instance_nb)
env_dict["YNH_ACTION"] = action env_dict["YNH_ACTION"] = action
_, path = tempfile.mkstemp() _, path = tempfile.mkstemp()
@ -1492,7 +1473,7 @@ def app_action_run(operation_logger, app, action, args=None):
os.chmod(path, 700) os.chmod(path, 700)
if action_declaration.get("cwd"): if action_declaration.get("cwd"):
cwd = action_declaration["cwd"].replace("$app", app_id) cwd = action_declaration["cwd"].replace("$app", app)
else: else:
cwd = "/etc/yunohost/apps/" + app cwd = "/etc/yunohost/apps/" + app
@ -2778,18 +2759,23 @@ def _assert_no_conflicting_apps(domain, path, ignore_app=None, full_domain=False
raise YunohostError('app_location_unavailable', apps="\n".join(apps)) raise YunohostError('app_location_unavailable', apps="\n".join(apps))
def _make_environment_dict(args_dict, prefix="APP_ARG_"): def _make_environment_for_app_script(app, args={}, args_prefix="APP_ARG_"):
"""
Convert a dictionnary containing manifest arguments
to a dictionnary of env. var. to be passed to scripts
Keyword arguments: app_setting_path = os.path.join(APPS_SETTING_PATH, app)
arg -- A key/value dictionnary of manifest arguments
manifest = _get_manifest_of_app(app_setting_path)
app_id, app_instance_nb = _parse_app_instance_name(app)
env_dict = {
"YNH_APP_ID": app_id,
"YNH_APP_INSTANCE_NAME": app,
"YNH_APP_INSTANCE_NUMBER": str(app_instance_nb),
"YNH_APP_MANIFEST_VERSION": manifest.get("version", "?")
}
for arg_name, arg_value_and_type in args.items():
env_dict["YNH_%s%s" % (args_prefix, arg_name.upper())] = arg_value_and_type[0]
"""
env_dict = {}
for arg_name, arg_value_and_type in args_dict.items():
env_dict["YNH_%s%s" % (prefix, arg_name.upper())] = arg_value_and_type[0]
return env_dict return env_dict

View file

@ -44,7 +44,7 @@ from moulinette.utils.filesystem import read_file, mkdir, write_to_yaml, read_ya
from yunohost.app import ( from yunohost.app import (
app_info, _is_installed, app_info, _is_installed,
_parse_app_instance_name, _make_environment_for_app_script,
dump_app_log_extract_for_debugging, dump_app_log_extract_for_debugging,
_patch_legacy_helpers, _patch_legacy_helpers,
_patch_legacy_php_versions, _patch_legacy_php_versions,
@ -553,13 +553,8 @@ class BackupManager():
env_var['YNH_BACKUP_CSV'] = tmp_csv env_var['YNH_BACKUP_CSV'] = tmp_csv
if app is not None: if app is not None:
app_id, app_instance_nb = _parse_app_instance_name(app) env_var.update(_make_environment_for_app_script(app))
env_var["YNH_APP_ID"] = app_id env_var["YNH_APP_BACKUP_DIR"] = os.path.join(self.work_dir, 'apps', app, 'backup')
env_var["YNH_APP_INSTANCE_NAME"] = app
env_var["YNH_APP_INSTANCE_NUMBER"] = str(app_instance_nb)
tmp_app_dir = os.path.join('apps/', app)
tmp_app_bkp_dir = os.path.join(self.work_dir, tmp_app_dir, 'backup')
env_var["YNH_APP_BACKUP_DIR"] = tmp_app_bkp_dir
return env_var return env_var
@ -1165,7 +1160,10 @@ class RestoreManager():
logger.debug(m18n.n('restore_running_hooks')) logger.debug(m18n.n('restore_running_hooks'))
env_dict = self._get_env_var() env_dict = {
'YNH_BACKUP_DIR': self.work_dir,
'YNH_BACKUP_CSV': os.path.join(self.work_dir, "backup.csv")
}
operation_logger.extra['env'] = env_dict operation_logger.extra['env'] = env_dict
operation_logger.flush() operation_logger.flush()
ret = hook_callback('restore', ret = hook_callback('restore',
@ -1372,7 +1370,12 @@ class RestoreManager():
migrate_legacy_permission_settings(app=app_instance_name) migrate_legacy_permission_settings(app=app_instance_name)
# Prepare env. var. to pass to script # Prepare env. var. to pass to script
env_dict = self._get_env_var(app_instance_name) env_dict = _make_environment_for_app_script(app_instance_name)
env_dict.update({
'YNH_BACKUP_DIR': self.work_dir,
'YNH_BACKUP_CSV': os.path.join(self.work_dir, "backup.csv"),
'YNH_APP_BACKUP_DIR': os.path.join(self.work_dir, 'apps', app_instance_name, 'backup')
})
operation_logger.extra['env'] = env_dict operation_logger.extra['env'] = env_dict
operation_logger.flush() operation_logger.flush()
@ -1396,11 +1399,7 @@ class RestoreManager():
remove_script = os.path.join(app_scripts_in_archive, 'remove') remove_script = os.path.join(app_scripts_in_archive, 'remove')
# Setup environment for remove script # Setup environment for remove script
app_id, app_instance_nb = _parse_app_instance_name(app_instance_name) env_dict_remove = _make_environment_for_app_script(app_instance_name)
env_dict_remove = {}
env_dict_remove["YNH_APP_ID"] = app_id
env_dict_remove["YNH_APP_INSTANCE_NAME"] = app_instance_name
env_dict_remove["YNH_APP_INSTANCE_NUMBER"] = str(app_instance_nb)
operation_logger = OperationLogger('remove_on_failed_restore', operation_logger = OperationLogger('remove_on_failed_restore',
[('app', app_instance_name)], [('app', app_instance_name)],
@ -1432,26 +1431,6 @@ class RestoreManager():
# Cleaning temporary scripts directory # Cleaning temporary scripts directory
shutil.rmtree(tmp_folder_for_app_restore, ignore_errors=True) shutil.rmtree(tmp_folder_for_app_restore, ignore_errors=True)
def _get_env_var(self, app=None):
""" Define environment variable for hooks call """
env_var = {}
env_var['YNH_BACKUP_DIR'] = self.work_dir
env_var['YNH_BACKUP_CSV'] = os.path.join(self.work_dir, "backup.csv")
if app is not None:
app_dir_in_archive = os.path.join(self.work_dir, 'apps', app)
app_backup_in_archive = os.path.join(app_dir_in_archive, 'backup')
# Parse app instance name and id
app_id, app_instance_nb = _parse_app_instance_name(app)
env_var["YNH_APP_ID"] = app_id
env_var["YNH_APP_INSTANCE_NAME"] = app
env_var["YNH_APP_INSTANCE_NUMBER"] = str(app_instance_nb)
env_var["YNH_APP_BACKUP_DIR"] = app_backup_in_archive
return env_var
# #
# Backup methods # # Backup methods #
# #