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:
authorDaniel <blackrabbit256@gmail.com>2022-03-01 03:03:37 +1100
committerGitHub <noreply@github.com>2022-02-28 17:03:37 +0100
commit35a19a616aee602a849097411cc0254a27c3f9b7 (patch)
tree5b1db96f151fae55f7b76e06066fc747daf6b070 /archinstall/lib/configuration.py
parent04e3880d8f41a87889690609e20ab1220700c163 (diff)
Menu option save config (#1009)
* Add new save config menu option * Update * Fixed issue with merging * Fixed merge issue (I think) Co-authored-by: Daniel Girtler <girtler.daniel@gmail.com> Co-authored-by: Anton Hvornum <anton.feeds@gmail.com>
Diffstat (limited to 'archinstall/lib/configuration.py')
-rw-r--r--archinstall/lib/configuration.py168
1 files changed, 113 insertions, 55 deletions
diff --git a/archinstall/lib/configuration.py b/archinstall/lib/configuration.py
index bb8c7aab..c971768f 100644
--- a/archinstall/lib/configuration.py
+++ b/archinstall/lib/configuration.py
@@ -1,64 +1,122 @@
import json
-import pathlib
import logging
+from pathlib import Path
+from typing import Optional, Dict
+
from .storage import storage
from .general import JSON, UNSAFE_JSON
from .output import log
-def output_configs(area :dict, show :bool = True, save :bool = True):
- """ Show on the screen the configuration data (except credentials) and/or save them on a json file
- :param area: a dictionary to be shown/save (basically archinstall.arguments, but needed to be passed explictly to avoid circular references
- :type area: dict
- :param show:Determines if the config data will be displayed on screen in Json format
- :type show: bool
- :param save:Determines if the config data will we written as a Json file
- :type save:bool
- """
- user_credentials = {}
- disk_layout = {}
- user_config = {}
- for key in area:
- if key in ['!users','!superusers','!encryption-password']:
- user_credentials[key] = area[key]
- elif key == 'disk_layouts':
- disk_layout = area[key]
- elif key in ['abort','install','config','creds','dry_run']:
- pass
- else:
- user_config[key] = area[key]
-
- user_configuration_json = json.dumps({
- 'config_version': storage['__version__'], # Tells us what version was used to generate the config
- **user_config, # __version__ will be overwritten by old version definition found in config
- 'version': storage['__version__']
- } , indent=4, sort_keys=True, cls=JSON)
- if disk_layout:
- disk_layout_json = json.dumps(disk_layout, indent=4, sort_keys=True, cls=JSON)
- if user_credentials:
- user_credentials_json = json.dumps(user_credentials, indent=4, sort_keys=True, cls=UNSAFE_JSON)
-
- if save:
- dest_path = pathlib.Path(storage.get('LOG_PATH','.'))
- if (not dest_path.exists()) or not (dest_path.is_dir()):
- log(f"Destination directory {dest_path.resolve()} does not exist or is not a directory,\n Configuration files can't be saved",fg="yellow",)
- input("Press enter to continue")
- else:
- with (dest_path / "user_configuration.json").open('w') as config_file:
- config_file.write(user_configuration_json)
- if user_credentials:
- target = dest_path / "user_credentials.json"
- with target.open('w') as config_file:
- config_file.write(user_credentials_json)
- if disk_layout:
- target = dest_path / "user_disk_layout.json"
- with target.open('w') as config_file:
- config_file.write(disk_layout_json)
- if show:
- print()
- print('This is your chosen configuration:')
- log("-- Guided template chosen (with below config) --", level=logging.DEBUG)
- log(user_configuration_json, level=logging.INFO)
+class ConfigurationOutput:
+ def __init__(self, config: Dict):
+ """
+ Configuration output handler to parse the existing configuration data structure and prepare for output on the
+ console and for saving it to configuration files
+
+ :param config: A dictionary containing configurations (basically archinstall.arguments)
+ :type config: Dict
+ """
+ self._config = config
+ self._user_credentials = {}
+ self._disk_layout = None
+ self._user_config = {}
+ self._default_save_path = Path(storage.get('LOG_PATH', '.'))
+ self._user_config_file = 'user_configuration.json'
+ self._user_creds_file = "user_credentials.json"
+ self._disk_layout_file = "user_disk_layout.json"
+
+ self._sensitive = ['!users', '!superusers', '!encryption-password']
+ self._ignore = ['abort', 'install', 'config', 'creds', 'dry_run']
+
+ self._process_config()
+
+ @property
+ def user_credentials_file(self):
+ return self._user_creds_file
+
+ @property
+ def user_configuration_file(self):
+ return self._user_config_file
+
+ @property
+ def disk_layout_file(self):
+ return self._disk_layout_file
+
+ def _process_config(self):
+ for key in self._config:
+ if key in self._sensitive:
+ self._user_credentials[key] = self._config[key]
+ elif key == 'disk_layouts':
+ self._disk_layout = self._config[key]
+ elif key in self._ignore:
+ pass
+ else:
+ self._user_config[key] = self._config[key]
+
+ def user_config_to_json(self) -> str:
+ return json.dumps({
+ 'config_version': storage['__version__'], # Tells us what version was used to generate the config
+ **self._user_config, # __version__ will be overwritten by old version definition found in config
+ 'version': storage['__version__']
+ }, indent=4, sort_keys=True, cls=JSON)
+
+ def disk_layout_to_json(self) -> Optional[str]:
+ if self._disk_layout:
+ return json.dumps(self._disk_layout, indent=4, sort_keys=True, cls=JSON)
+ return None
+
+ def user_credentials_to_json(self) -> Optional[str]:
+ if self._user_credentials:
+ return json.dumps(self._user_credentials, indent=4, sort_keys=True, cls=UNSAFE_JSON)
+ return None
+
+ def show(self):
+ print(_('\nThis is your chosen configuration:'))
+ log(" -- Chosen configuration --", level=logging.DEBUG)
+
+ user_conig = self.user_config_to_json()
+ disk_layout = self.disk_layout_to_json()
+ log(user_conig, level=logging.INFO)
+
if disk_layout:
- log(disk_layout_json, level=logging.INFO)
+ log(disk_layout, level=logging.INFO)
+
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"
+ )
+ return False
+ return True
+
+ def save_user_config(self, dest_path :Path = None):
+ if self._is_valid_path(dest_path):
+ with open(dest_path / self._user_config_file, 'w') as config_file:
+ config_file.write(self.user_config_to_json())
+
+ def save_user_creds(self, dest_path :Path = None):
+ if self._is_valid_path(dest_path):
+ if user_creds := self.user_credentials_to_json():
+ target = dest_path / self._user_creds_file
+ with open(target, 'w') as config_file:
+ config_file.write(user_creds)
+
+ def save_disk_layout(self, dest_path :Path = None):
+ if self._is_valid_path(dest_path):
+ if disk_layout := self.disk_layout_to_json():
+ target = dest_path / self._disk_layout_file
+ with target.open('w') as config_file:
+ config_file.write(disk_layout)
+
+ def save(self, dest_path :Path = None):
+ if not dest_path:
+ dest_path = self._default_save_path
+
+ if self._is_valid_path(dest_path):
+ self.save_user_config(dest_path)
+ self.save_user_creds(dest_path)
+ self.save_disk_layout(dest_path)