Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/archinstall/lib/user_interaction/save_conf.py
blob: e05b9afeea2f967c6bdaf5c6991006092bcefce7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
from __future__ import annotations

import logging

from pathlib import Path
from typing import Any, Dict, TYPE_CHECKING

from ..general import SysCommand
from ..menu import Menu
from ..menu.menu import MenuSelectionType
from ..output import log
from ..configuration import ConfigurationOutput

if TYPE_CHECKING:
	_: Any


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',
	]

	log('Ignore configuration option folders: ' + ','.join(dirs_to_exclude), level=logging.DEBUG)
	log(_('Finding possible directories to save configuration files ...'), level=logging.INFO)

	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

	log(f'Saving {saving_key} configuration files to {save_dirs}', level=logging.DEBUG)

	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)