# # Kickstart module for the services. # # Copyright (C) 2018 Red Hat, Inc. # # This copyrighted material is made available to anyone wishing to use, # modify, copy, or redistribute it subject to the terms and conditions of # the GNU General Public License v.2, or (at your option) any later version. # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY expressed or implied, including the implied warranties of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General # Public License for more details. You should have received a copy of the # GNU General Public License along with this program; if not, write to the # Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. Any Red Hat trademarks that are incorporated in the # source code or documentation are not subject to the GNU General Public # License and may only be used or replicated with the express permission of # Red Hat, Inc. # from pykickstart.constants import FIRSTBOOT_DEFAULT, FIRSTBOOT_SKIP, FIRSTBOOT_RECONFIG from pyanaconda.core.configuration.anaconda import conf from pyanaconda.core.constants import TEXT_ONLY_TARGET, GRAPHICAL_TARGET from pyanaconda.core.dbus import DBus from pyanaconda.core.signal import Signal from pyanaconda.modules.common.base import KickstartService from pyanaconda.modules.common.constants.services import SERVICES from pyanaconda.modules.common.containers import TaskContainer from pyanaconda.modules.services.constants import SetupOnBootAction from pyanaconda.modules.services.kickstart import ServicesKickstartSpecification from pyanaconda.modules.services.services_interface import ServicesInterface from pyanaconda.modules.services.installation import ConfigureInitialSetupTask, \ ConfigurePostInstallationToolsTask, ConfigureServicesTask, ConfigureSystemdDefaultTargetTask, \ ConfigureDefaultDesktopTask from pyanaconda.anaconda_loggers import get_module_logger log = get_module_logger(__name__) class ServicesService(KickstartService): """The Services service.""" # list of systemd targets that we support as default targets SUPPORTED_SYSTEMD_TARGETS = [TEXT_ONLY_TARGET, GRAPHICAL_TARGET] def __init__(self): super().__init__() self.enabled_services_changed = Signal() self._enabled_services = list() self.disabled_services_changed = Signal() self._disabled_services = list() self.default_target_changed = Signal() self._default_target = "" self.default_desktop_changed = Signal() self._default_desktop = "" self.setup_on_boot_changed = Signal() self._setup_on_boot = SetupOnBootAction.DEFAULT self.post_install_tools_enabled_changed = Signal() self._post_install_tools_enabled = True def publish(self): """Publish the module.""" TaskContainer.set_namespace(SERVICES.namespace) DBus.publish_object(SERVICES.object_path, ServicesInterface(self)) DBus.register_service(SERVICES.service_name) @property def kickstart_specification(self): """Return the kickstart specification.""" return ServicesKickstartSpecification def process_kickstart(self, data): """Process the kickstart data.""" self.set_enabled_services(data.services.enabled) self.set_disabled_services(data.services.disabled) if data.skipx.skipx: self.set_default_target(TEXT_ONLY_TARGET) elif data.xconfig.startX: self.set_default_target(GRAPHICAL_TARGET) self.set_default_desktop(data.xconfig.defaultdesktop) setup_on_boot = self._map_firstboot(data.firstboot.firstboot) self.set_setup_on_boot(setup_on_boot) # If "firstboot --disable" is present in the input kickstart # then the post_install_tools_enabled property is set to False. # # The property state is then reflected in the user interaction config file, # which is parsed by Gnome Initial Setup. # # This way it is possible to disable both Initial Setup and # Gnome Initial Setup with a single kickstart command. if data.firstboot.firstboot == FIRSTBOOT_SKIP: self.set_post_install_tools_enabled(False) def setup_kickstart(self, data): """Set up the kickstart data.""" data.services.enabled = self.enabled_services data.services.disabled = self.disabled_services if self.default_target == TEXT_ONLY_TARGET: data.skipx.skipx = True elif self.default_target == GRAPHICAL_TARGET: data.xconfig.startX = True data.xconfig.defaultdesktop = self.default_desktop firstboot = self._map_firstboot(self.setup_on_boot, reverse=True) data.firstboot.firstboot = firstboot def _map_firstboot(self, value, reverse=False): """Convert the firstboot value to the setup on boot value. :param value: a value of the action :param reverse: reverse the direction :return: a converted value of the action """ mapping = { None: SetupOnBootAction.DEFAULT, FIRSTBOOT_SKIP: SetupOnBootAction.DISABLED, FIRSTBOOT_DEFAULT: SetupOnBootAction.ENABLED, FIRSTBOOT_RECONFIG: SetupOnBootAction.RECONFIG, } if reverse: mapping = {v: k for k, v in mapping.items()} return mapping[value] @property def enabled_services(self): """List of enabled services.""" return self._enabled_services def set_enabled_services(self, services): """Set the enabled services. :param services: a list of service names """ self._enabled_services = list(services) self.enabled_services_changed.emit() log.debug("Enabled services are set to %s.", services) @property def disabled_services(self): """List of disabled services.""" return self._disabled_services def set_disabled_services(self, services): """Set the disabled services. :param services: a list of service names """ self._disabled_services = list(services) self.disabled_services_changed.emit() log.debug("Disabled services are set to %s.", services) @property def default_target(self): """Default target of the installed system.""" return self._default_target def set_default_target(self, target): """Set the default target of the installed system. :param target: a string with the target """ if target not in self.SUPPORTED_SYSTEMD_TARGETS: msg = "Unsupported systemd default target: {} Specify one of: {}".format( target, self.SUPPORTED_SYSTEMD_TARGETS ) raise ValueError(msg) self._default_target = target self.default_target_changed.emit() log.debug("Default target is set to %s.", target) @property def default_desktop(self): """Default desktop of the installed system.""" return self._default_desktop def set_default_desktop(self, desktop): """Set the default desktop of the installed system. :param desktop: a string with the desktop """ self._default_desktop = desktop self.default_desktop_changed.emit() log.debug("Default desktop is set to %s.", desktop) @property def setup_on_boot(self): """Set up the installed system on the first boot.""" return self._setup_on_boot def set_setup_on_boot(self, value): """Set up the installed system on the first boot. :param value: an action """ self._setup_on_boot = value self.setup_on_boot_changed.emit() log.debug("Setup on boot is set to %s.", value) @property def post_install_tools_enabled(self): """Should all post installation tools be disabled ? If set to True both Initial Setup and Gnome Initial Setup will not start after the installation. :return: True if post inst tools should be disabled, False otherwise :rtype: bool """ return self._post_install_tools_enabled def set_post_install_tools_enabled(self, post_install_tools_enabled): """Set if post install tools should be disabled. Setting this property to False will result in the post_install_tools_disabled key being written to the user interaction config file with the value of 1. Setting this property to True (the default value) will not result in the post_install_tools_disabled key being written into th user interaction config file. :param bool post_install_tools_enabled: set to False to disable post install tools """ self._post_install_tools_enabled = post_install_tools_enabled self.post_install_tools_enabled_changed.emit() if self.post_install_tools_enabled: log.debug("Post installation tools will be enabled.") else: log.debug("Post installation tools will be disabled.") def install_with_tasks(self): """Return the installation tasks of this module. :returns: list of installation tasks """ return [ ConfigureInitialSetupTask( sysroot=conf.target.system_root, setup_on_boot=self.setup_on_boot ), ConfigurePostInstallationToolsTask( sysroot=conf.target.system_root, tools_enabled=self.post_install_tools_enabled ), ConfigureServicesTask( sysroot=conf.target.system_root, disabled_services=self.disabled_services, enabled_services=self.enabled_services ), ConfigureSystemdDefaultTargetTask( sysroot=conf.target.system_root, default_target=self.default_target ), ConfigureDefaultDesktopTask( sysroot=conf.target.system_root, default_desktop=self.default_desktop ), ]