Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/archinstall/lib/configuration.py
diff options
context:
space:
mode:
Diffstat (limited to 'archinstall/lib/configuration.py')
-rw-r--r--archinstall/lib/configuration.py114
1 files changed, 106 insertions, 8 deletions
diff --git a/archinstall/lib/configuration.py b/archinstall/lib/configuration.py
index 22c41c0d..c3af3a83 100644
--- a/archinstall/lib/configuration.py
+++ b/archinstall/lib/configuration.py
@@ -1,13 +1,13 @@
import os
import json
import stat
-import logging
from pathlib import Path
from typing import Optional, Dict, Any, TYPE_CHECKING
+from .menu import Menu, MenuSelectionType
from .storage import storage
-from .general import JSON, UNSAFE_JSON
-from .output import log
+from .general import JSON, UNSAFE_JSON, SysCommand
+from .output import debug, info, warn
if TYPE_CHECKING:
_: Any
@@ -69,18 +69,18 @@ class ConfigurationOutput:
def show(self):
print(_('\nThis is your chosen configuration:'))
- log(" -- Chosen configuration --", level=logging.DEBUG)
+ debug(" -- Chosen configuration --")
user_conig = self.user_config_to_json()
- log(user_conig, level=logging.INFO)
+ info(user_conig)
print()
def _is_valid_path(self, dest_path: Path) -> bool:
if (not dest_path.exists()) or not (dest_path.is_dir()):
- log(
- 'Destination directory {} does not exist or is not a directory,\n Configuration files can not be saved'.format(dest_path.resolve()),
- fg="yellow"
+ warn(
+ f'Destination directory {dest_path.resolve()} does not exist or is not a directory\n.',
+ 'Configuration files can not be saved'
)
return False
return True
@@ -111,3 +111,101 @@ class ConfigurationOutput:
if self._is_valid_path(dest_path):
self.save_user_config(dest_path)
self.save_user_creds(dest_path)
+
+
+def save_config(config: Dict):
+ def preview(selection: str):
+ if options['user_config'] == selection:
+ serialized = config_output.user_config_to_json()
+ return f'{config_output.user_configuration_file}\n{serialized}'
+ elif options['user_creds'] == selection:
+ if maybe_serial := config_output.user_credentials_to_json():
+ return f'{config_output.user_credentials_file}\n{maybe_serial}'
+ else:
+ return str(_('No configuration'))
+ elif options['all'] == selection:
+ output = f'{config_output.user_configuration_file}\n'
+ if config_output.user_credentials_to_json():
+ output += f'{config_output.user_credentials_file}\n'
+ return output[:-1]
+ return None
+
+ config_output = ConfigurationOutput(config)
+
+ options = {
+ 'user_config': str(_('Save user configuration')),
+ 'user_creds': str(_('Save user credentials')),
+ 'disk_layout': str(_('Save disk layout')),
+ 'all': str(_('Save all'))
+ }
+
+ choice = Menu(
+ _('Choose which configuration to save'),
+ list(options.values()),
+ sort=False,
+ skip=True,
+ preview_size=0.75,
+ preview_command=preview
+ ).run()
+
+ if choice.type_ == MenuSelectionType.Skip:
+ return
+
+ save_config_value = choice.single_value
+ saving_key = [k for k, v in options.items() if v == save_config_value][0]
+
+ dirs_to_exclude = [
+ '/bin',
+ '/dev',
+ '/lib',
+ '/lib64',
+ '/lost+found',
+ '/opt',
+ '/proc',
+ '/run',
+ '/sbin',
+ '/srv',
+ '/sys',
+ '/usr',
+ '/var',
+ ]
+
+ debug('Ignore configuration option folders: ' + ','.join(dirs_to_exclude))
+ info(_('Finding possible directories to save configuration files ...'))
+
+ find_exclude = '-path ' + ' -prune -o -path '.join(dirs_to_exclude) + ' -prune '
+ file_picker_command = f'find / {find_exclude} -o -type d -print0'
+
+ directories = SysCommand(file_picker_command).decode()
+
+ if directories is None:
+ raise ValueError('Failed to retrieve possible configuration directories')
+
+ possible_save_dirs = list(filter(None, directories.split('\x00')))
+
+ selection = Menu(
+ _('Select directory (or directories) for saving configuration files'),
+ possible_save_dirs,
+ multi=True,
+ skip=True,
+ allow_reset=False,
+ ).run()
+
+ match selection.type_:
+ case MenuSelectionType.Skip:
+ return
+
+ save_dirs = selection.multi_value
+
+ debug(f'Saving {saving_key} configuration files to {save_dirs}')
+
+ if save_dirs is not None:
+ for save_dir_str in save_dirs:
+ save_dir = Path(save_dir_str)
+ if options['user_config'] == save_config_value:
+ config_output.save_user_config(save_dir)
+ elif options['user_creds'] == save_config_value:
+ config_output.save_user_creds(save_dir)
+ elif options['all'] == save_config_value:
+ config_output.save_user_config(save_dir)
+ config_output.save_user_creds(save_dir)