def _make_installconfig(script, osobj, unattended_data, arch, hostname, url): """ Build a Libosinfo.InstallConfig instance """ def get_timezone(): TZ_FILE = "/etc/localtime" linkpath = os.path.realpath(TZ_FILE) tokens = linkpath.split("zoneinfo/") if len(tokens) > 1: return tokens[1] def get_language(): return locale.getlocale()[0] config = Libosinfo.InstallConfig() # Set user login and name based on the one from the system config.set_user_login(getpass.getuser()) config.set_user_realname(pwd.getpwnam(getpass.getuser()).pw_gecos) # Set user-password. # In case it's required and not passed, just raise a RuntimeError. if (script.requires_user_password() and not unattended_data.get_user_password()): raise RuntimeError( _("%s requires the user-password to be set.") % osobj.name) config.set_user_password(unattended_data.get_user_password() or "") # Set the admin-password: # In case it's required and not passed, just raise a RuntimeError. if (script.requires_admin_password() and not unattended_data.get_admin_password()): raise RuntimeError( _("%s requires the admin-password to be set.") % osobj.name) config.set_admin_password(unattended_data.get_admin_password() or "") # Set the target disk. # virtiodisk is the preferred way, in case it's supported, otherwise # just fallback to scsi. # # Note: this is linux specific and will require some changes whenever # support for Windows will be added. tgt = "/dev/vda" if osobj.supports_virtiodisk() else "/dev/sda" if osobj.is_windows(): tgt = "C" config.set_target_disk(tgt) # Set hardware architecture and hostname config.set_hardware_arch(arch) config.set_hostname(hostname) # Try to guess the timezone from '/etc/localtime', in case it's not # possible 'America/New_York' will be used. timezone = get_timezone() if timezone: config.set_l10n_timezone(timezone) # Try to guess to language and keyboard layout from the system's # language. # # This method has flaws as it's quite common to have language and # keyboard layout not matching. Otherwise, there's no easy way to guess # the keyboard layout without relying on a set of APIs of an specific # Desktop Environment. language = get_language() if language: config.set_l10n_language(language) config.set_l10n_keyboard(language) if url: config.set_installation_url(url) # pylint: disable=no-member if unattended_data.product_key: config.set_reg_product_key(unattended_data.product_key) log.debug("InstallScriptConfig created with the following params:") log.debug("username: %s", config.get_user_login()) log.debug("realname: %s", config.get_user_realname()) log.debug("target disk: %s", config.get_target_disk()) log.debug("hardware arch: %s", config.get_hardware_arch()) log.debug("hostname: %s", config.get_hostname()) log.debug("timezone: %s", config.get_l10n_timezone()) log.debug("language: %s", config.get_l10n_language()) log.debug("keyboard: %s", config.get_l10n_keyboard()) log.debug("url: %s", config.get_installation_url()) # pylint: disable=no-member log.debug("product-key: %s", config.get_reg_product_key()) return config
def _make_installconfig(script, osobj, unattended_data, arch, hostname, url): """ Build a Libosinfo.InstallConfig instance """ def get_timezone(): TZ_FILE = "/etc/localtime" localtime = Gio.File.new_for_path(TZ_FILE) if not localtime.query_exists(): return None info = localtime.query_info(Gio.FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET, Gio.FileQueryInfoFlags.NOFOLLOW_SYMLINKS) if not info: return None target = info.get_symlink_target() if not target: return None tokens = target.split("zoneinfo/") if not tokens or len(tokens) < 2: return None return tokens[1] def get_language(): names = GLib.get_language_names() if not names or len(names) < 2: return None return names[1] config = Libosinfo.InstallConfig() # Set user login and name based on the one from the system config.set_user_login(GLib.get_user_name()) config.set_user_realname(GLib.get_real_name()) # Set user-password. # In case it's required and not passed, just raise a RuntimeError. if script.requires_user_password() and not unattended_data.user_password: raise RuntimeError( _("%s requires the user-password to be set.") % osobj.name) config.set_user_password( unattended_data.user_password if unattended_data.user_password else "") # Set the admin-password: # In case it's required and not passed, just raise a RuntimeError. if script.requires_admin_password() and not unattended_data.admin_password: raise RuntimeError( _("%s requires the admin-password to be set.") % osobj.name) config.set_admin_password(unattended_data.admin_password if unattended_data.admin_password else "") # Set the target disk. # virtiodisk is the preferred way, in case it's supported, otherwise # just fallback to scsi. # # Note: this is linux specific and will require some changes whenever # support for Windows will be added. tgt = "/dev/vda" if osobj.supports_virtiodisk() else "/dev/sda" config.set_target_disk(tgt) # Set hardware architecture and hostname config.set_hardware_arch(arch) config.set_hostname(hostname) # Try to guess the timezone from '/etc/localtime', in case it's not # possible 'America/New_York' will be used. timezone = get_timezone() if timezone: config.set_l10n_timezone(timezone) else: logging.warning( _("'America/New_York' timezone will be used for this " "unattended installation.")) # Try to guess to language and keyboard layout from the system's # language. # # This method has flows as it's quite common to have language and # keyboard layout not matching. Otherwise, there's no easy way to guess # the keyboard layout without relying on a set of APIs of an specific # Desktop Environment. language = get_language() if language: config.set_l10n_language(language) config.set_l10n_keyboard(language) else: logging.warning( _("'en_US' will be used as both language and keyboard layout " "for unattended installation.")) if url: config.set_installation_url(url) # pylint: disable=no-member logging.debug("InstallScriptConfig created with the following params:") logging.debug("username: %s", config.get_user_login()) logging.debug("realname: %s", config.get_user_realname()) logging.debug("user password: %s", config.get_user_password()) logging.debug("admin password: %s", config.get_admin_password()) logging.debug("target disk: %s", config.get_target_disk()) logging.debug("hardware arch: %s", config.get_hardware_arch()) logging.debug("hostname: %s", config.get_hostname()) logging.debug("timezone: %s", config.get_l10n_timezone()) logging.debug("language: %s", config.get_l10n_language()) logging.debug("keyboard: %s", config.get_l10n_keyboard()) logging.debug("url: %s", config.get_installation_url()) # pylint: disable=no-member return config
def _make_installconfig(script, osobj, unattended_data, arch, hostname, url): """ Build a Libosinfo.InstallConfig instance """ def get_timezone(): TZ_FILE = "/etc/localtime" linkpath = os.path.realpath(TZ_FILE) tokens = linkpath.split("zoneinfo/") if len(tokens) > 1: return tokens[1] def get_language(): return locale.getlocale()[0] def is_user_login_safe(login): return login != "root" config = Libosinfo.InstallConfig() # Set user login and name # In case it's specified via command-line, use the specified one as login # and realname. Otherwise, fallback fto the one from the system login = unattended_data.user_login realname = unattended_data.user_login if not login: hostuser = getpass.getuser() if is_user_login_safe(hostuser): login = getpass.getuser() realname = pwd.getpwnam(login).pw_gecos if login: login = login.lower() if not is_user_login_safe(login): raise RuntimeError( _("%s cannot use '%s' as user-login.") % (osobj.name, login)) config.set_user_login(login) config.set_user_realname(realname) # Set user-password. # In case it's required and not passed, just raise a RuntimeError. if (script.requires_user_password() and not unattended_data.get_user_password()): raise RuntimeError( _("%s requires the user-password to be set.") % osobj.name) config.set_user_password(unattended_data.get_user_password() or "") # Set the admin-password: # In case it's required and not passed, just raise a RuntimeError. if (script.requires_admin_password() and not unattended_data.get_admin_password()): raise RuntimeError( _("%s requires the admin-password to be set.") % osobj.name) config.set_admin_password(unattended_data.get_admin_password() or "") # Set the target disk. # virtiodisk is the preferred way, in case it's supported, otherwise # just fallback to scsi. # # Note: this is linux specific and will require some changes whenever # support for Windows will be added. tgt = "/dev/vda" if osobj.supports_virtiodisk() else "/dev/sda" if osobj.is_windows(): tgt = "C" config.set_target_disk(tgt) # Set hardware architecture and hostname config.set_hardware_arch(arch) # Some installations will bail if the Computer's name contains one of the # following characters: "[{|}~[\\]^':; <=>?@!\"#$%`()+/.,*&]". # In order to take a safer path, let's ensure that we never set those, # replacing them by "-". hostname = re.sub("[{|}~[\\]^':; <=>?@!\"#$%`()+/.,*&]", "-", hostname) config.set_hostname(hostname) # Try to guess the timezone from '/etc/localtime', in case it's not # possible 'America/New_York' will be used. timezone = get_timezone() if timezone: config.set_l10n_timezone(timezone) # Try to guess to language and keyboard layout from the system's # language. # # This method has flaws as it's quite common to have language and # keyboard layout not matching. Otherwise, there's no easy way to guess # the keyboard layout without relying on a set of APIs of an specific # Desktop Environment. language = get_language() if language: config.set_l10n_language(language) config.set_l10n_keyboard(language) if url: config.set_installation_url(url) # pylint: disable=no-member if unattended_data.product_key: config.set_reg_product_key(unattended_data.product_key) log.debug("InstallScriptConfig created with the following params:") log.debug("username: %s", config.get_user_login()) log.debug("realname: %s", config.get_user_realname()) log.debug("target disk: %s", config.get_target_disk()) log.debug("hardware arch: %s", config.get_hardware_arch()) log.debug("hostname: %s", config.get_hostname()) log.debug("timezone: %s", config.get_l10n_timezone()) log.debug("language: %s", config.get_l10n_language()) log.debug("keyboard: %s", config.get_l10n_keyboard()) if hasattr(config, "get_installation_url"): log.debug("url: %s", config.get_installation_url()) # pylint: disable=no-member log.debug("product-key: %s", config.get_reg_product_key()) return config