Ejemplo n.º 1
0
	def exit_callback(self):
		if self._data_store.get('ntp',False):
			archinstall.log("Hardware time and other post-configuration steps might be required in order for NTP to work. For more information, please check the Arch wiki.", fg="yellow")
			archinstall.SysCommand('timedatectl set-ntp true')
		if self._data_store.get('mode',None):
			archinstall.arguments['mode'] = self._data_store['mode']
			archinstall.log(f"Archinstall will execute under {archinstall.arguments['mode']} mode")
		if self._data_store.get('LC_ALL',None):
			archinstall.storage['CMD_LOCALE'] = {'LC_ALL':self._data_store['LC_ALL']}
		else:
			exec_locale = {}
			for item in ['LC_COLLATE','LC_CTYPE','LC_MESSAGES','LC_NUMERIC','LC_TIME']:
				if self._data_store.get(item,None):
					exec_locale[item] = self._data_store[item]
			archinstall.storage['CMD_LOCALE'] = exec_locale
		archinstall.log(f"Archinstall will execute with {archinstall.storage.get('CMD_LOCALE',None)} locale")
Ejemplo n.º 2
0
def ask_user_questions(mode):
	"""
		First, we'll ask the user for a bunch of user input.
		Not until we're satisfied with what we want to install
		will we continue with the actual installation steps.
	"""
	if archinstall.arguments.get('advanced',None):
		# 3.9 syntax. former x = {**y,**z} or x.update(y)
		set_cmd_locale(charset='es_ES.utf8',collate='es_ES.utf8')
		setup_area = archinstall.storage.get('CMD_LOCALE',{}) | {}
		with SetupMenu(setup_area) as setup:
			if mode == 'lineal':
				for entry in setup.list_enabled_options():
					if entry in ('continue','abort'):
						continue
					if not setup.option(entry).enabled:
						continue
					setup.exec_option(entry)
			else:
				setup.run()
		archinstall.arguments['archinstall-language'] = setup_area.get('archinstall-language')
	else:
		archinstall.log("Hardware time and other post-configuration steps might be required in order for NTP to work. For more information, please check the Arch wiki.", fg="yellow")
		archinstall.SysCommand('timedatectl set-ntp true')

	with MyMenu(data_store=archinstall.arguments,mode=mode) as global_menu:

		if mode == 'lineal':
			for entry in global_menu.list_enabled_options():
				if entry in ('install','abort'):
					continue
				global_menu.exec_option(entry)
				archinstall.arguments[entry] = global_menu.option(entry).get_selection()
		else:
			global_menu.set_option('install',
							archinstall.Selector(
								global_menu._install_text(mode),
								exec_func=lambda n,v: True if global_menu._missing_configs(mode) == 0 else False,
								enabled=True))

			global_menu.run()
Ejemplo n.º 3
0
def ask_user_questions():
    """
		First, we'll ask the user for a bunch of user input.
		Not until we're satisfied with what we want to install
		will we continue with the actual installation steps.
	"""

    global_menu = archinstall.GlobalMenu()
    global_menu.enable('keyboard-layout')

    if not archinstall.arguments.get('ntp', False):
        archinstall.arguments['ntp'] = input(
            "Would you like to use automatic time synchronization (NTP) with the default time servers? [Y/n]: "
        ).strip().lower() in ('y', 'yes', '')
        if archinstall.arguments['ntp']:
            archinstall.log(
                "Hardware time and other post-configuration steps might be required in order for NTP to work. For more information, please check the Arch wiki.",
                fg="yellow")
            archinstall.SysCommand('timedatectl set-ntp true')

    # Set which region to download packages from during the installation
    global_menu.enable('mirror-region')

    if archinstall.arguments.get('advanced', False):
        global_menu.enable('sys-language', True)
        global_menu.enable('sys-encoding', True)

    # Ask which harddrives/block-devices we will install to
    # and convert them into archinstall.BlockDevice() objects.
    global_menu.enable('harddrives')

    global_menu.enable('disk_layouts')

    # Get disk encryption password (or skip if blank)
    global_menu.enable('!encryption-password')

    # Ask which boot-loader to use (will only ask if we're in BIOS (non-efi) mode)
    global_menu.enable('bootloader')

    global_menu.enable('swap')

    # Get the hostname for the machine
    global_menu.enable('hostname')

    # Ask for a root password (optional, but triggers requirement for super-user if skipped)
    global_menu.enable('!root-password')

    global_menu.enable('!superusers')
    global_menu.enable('!users')

    # Ask for archinstall-specific profiles (such as desktop environments etc)
    global_menu.enable('profile')

    # Ask about audio server selection if one is not already set
    global_menu.enable('audio')

    # Ask for preferred kernel:
    global_menu.enable('kernels')

    global_menu.enable('packages')

    # Ask or Call the helper function that asks the user to optionally configure a network.
    global_menu.enable('nic')

    global_menu.enable('timezone')

    global_menu.enable('ntp')

    global_menu.run()
Ejemplo n.º 4
0
def list_installed_locales() -> list[str]:
	lista = []
	for line in archinstall.SysCommand('locale -a'):
		lista.append(line.decode('UTF-8').strip())
	return lista
Ejemplo n.º 5
0
def perform_installation(mountpoint):
    """
	Performs the installation steps on a block device.
	Only requirement is that the block devices are
	formatted and setup prior to entering this function.
	"""
    with archinstall.Installer(mountpoint,
                               kernels=archinstall.arguments.get(
                                   'kernels', ['linux'])) as installation:
        # Mount all the drives to the desired mountpoint
        # This *can* be done outside of the installation, but the installer can deal with it.
        if archinstall.arguments.get('disk_layouts'):
            installation.mount_ordered_layout(
                archinstall.arguments['disk_layouts'])

        # Placing /boot check during installation because this will catch both re-use and wipe scenarios.
        for partition in installation.partitions:
            if partition.mountpoint == installation.target + '/boot':
                if partition.size < 0.19:  # ~200 MiB in GiB
                    raise archinstall.DiskError(
                        f"The selected /boot partition in use is not large enough to properly install a boot loader. Please resize it to at least 200MiB and re-run the installation."
                    )

        # if len(mirrors):
        # Certain services might be running that affects the system during installation.
        # Currently, only one such service is "reflector.service" which updates /etc/pacman.d/mirrorlist
        # We need to wait for it before we continue since we opted in to use a custom mirror/region.
        installation.log(
            'Waiting for automatic mirror selection (reflector) to complete.',
            level=logging.INFO)
        while archinstall.service_state('reflector') not in ('dead', 'failed'):
            time.sleep(1)

        # If we've activated NTP, make sure it's active in the ISO too and
        # make sure at least one time-sync finishes before we continue with the installation
        if archinstall.arguments.get('ntp', False):
            # Activate NTP in the ISO
            archinstall.SysCommand('timedatectl set-ntp true')

            # TODO: This block might be redundant, but this service is not activated unless
            # `timedatectl set-ntp true` is executed.
            logged = False
            while archinstall.service_state(
                    'dbus-org.freedesktop.timesync1.service') not in (
                        'running'):
                if not logged:
                    installation.log(
                        f"Waiting for dbus-org.freedesktop.timesync1.service to enter running state",
                        level=logging.INFO)
                    logged = True
                time.sleep(1)

            logged = False
            while 'Server: n/a' in archinstall.SysCommand(
                    'timedatectl timesync-status --no-pager --property=Server --value'
            ):
                if not logged:
                    installation.log(
                        f"Waiting for timedatectl timesync-status to report a timesync against a server",
                        level=logging.INFO)
                    logged = True
                time.sleep(1)

        # Set mirrors used by pacstrap (outside of installation)
        if archinstall.arguments.get('mirror-region', None):
            archinstall.use_mirrors(archinstall.arguments['mirror-region']
                                    )  # Set the mirrors for the live medium

        # Retrieve list of additional repositories and set boolean values appropriately
        enable_testing = 'testing' in archinstall.arguments.get(
            'additional-repositories', None)
        enable_multilib = 'multilib' in archinstall.arguments.get(
            'additional-repositories', None)

        if installation.minimal_installation(testing=enable_testing,
                                             multilib=enable_multilib):
            installation.set_locale(
                archinstall.arguments['sys-language'],
                archinstall.arguments['sys-encoding'].upper())
            installation.set_hostname(archinstall.arguments['hostname'])
            if archinstall.arguments['mirror-region'].get("mirrors",
                                                          None) is not None:
                installation.set_mirrors(
                    archinstall.arguments['mirror-region']
                )  # Set the mirrors in the installation medium
            if archinstall.arguments['swap']:
                installation.setup_swap('zram')
            if archinstall.arguments[
                    "bootloader"] == "grub-install" and archinstall.has_uefi():
                installation.add_additional_packages("grub")
            installation.add_bootloader(archinstall.arguments["bootloader"])

            # If user selected to copy the current ISO network configuration
            # Perform a copy of the config
            network_config = archinstall.arguments.get('nic', None)

            if network_config:
                handler = NetworkConfigurationHandler(network_config)
                handler.config_installer(installation)

            if archinstall.arguments.get('audio', None) is not None:
                installation.log(
                    f"This audio server will be used: {archinstall.arguments.get('audio', None)}",
                    level=logging.INFO)
                if archinstall.arguments.get('audio', None) == 'pipewire':
                    archinstall.Application(installation, 'pipewire').install()
                elif archinstall.arguments.get('audio', None) == 'pulseaudio':
                    print('Installing pulseaudio ...')
                    installation.add_additional_packages("pulseaudio")
            else:
                installation.log("No audio server will be installed.",
                                 level=logging.INFO)

            if archinstall.arguments.get('packages',
                                         None) and archinstall.arguments.get(
                                             'packages', None)[0] != '':
                installation.add_additional_packages(
                    archinstall.arguments.get('packages', None))

            if archinstall.arguments.get('profile', None):
                installation.install_profile(
                    archinstall.arguments.get('profile', None))

            if archinstall.arguments.get('!users', {}):
                for user, user_info in archinstall.arguments.get('!users',
                                                                 {}).items():
                    installation.user_create(user,
                                             user_info["!password"],
                                             sudo=False)

            if archinstall.arguments.get('!superusers', {}):
                for superuser, user_info in archinstall.arguments.get(
                        '!superusers', {}).items():
                    installation.user_create(superuser,
                                             user_info["!password"],
                                             sudo=True)

            if timezone := archinstall.arguments.get('timezone', None):
                installation.set_timezone(timezone)

            if archinstall.arguments.get('ntp', False):
                installation.activate_time_syncronization()

            if archinstall.accessibility_tools_in_use():
                installation.enable_espeakup()

            if (root_pw := archinstall.arguments.get('!root-password',
                                                     None)) and len(root_pw):
                installation.user_set_pw('root', root_pw)

            # This step must be after profile installs to allow profiles to install language pre-requisits.
            # After which, this step will set the language both for console and x11 if x11 was installed for instance.
            installation.set_keyboard_language(
                archinstall.arguments['keyboard-layout'])

            if archinstall.arguments['profile'] and archinstall.arguments[
                    'profile'].has_post_install():
                with archinstall.arguments['profile'].load_instructions(
                        namespace=
                        f"{archinstall.arguments['profile'].namespace}.py"
                ) as imported:
                    if not imported._post_install():
                        archinstall.log(
                            ' * Profile\'s post configuration requirements was not fulfilled.',
                            fg='red')
                        exit(1)