2014-05-21 07:38:57 -05:00
|
|
|
# Authors:
|
2014-05-26 06:01:49 -05:00
|
|
|
# Alexander Bokovoy <abokovoy@redhat.com>
|
2014-05-21 07:38:57 -05:00
|
|
|
# Tomas Babej <tbabej@redhat.com>
|
|
|
|
#
|
2014-05-26 06:01:49 -05:00
|
|
|
# Copyright (C) 2011-2014 Red Hat
|
2014-05-21 07:38:57 -05:00
|
|
|
# see file 'COPYING' for use and warranty information
|
|
|
|
#
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty 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, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
'''
|
|
|
|
This module contains default platform-specific implementations of system tasks.
|
|
|
|
'''
|
2014-05-26 06:01:49 -05:00
|
|
|
|
2014-10-22 08:07:44 -05:00
|
|
|
import pwd
|
|
|
|
import grp
|
2015-04-10 08:42:58 -05:00
|
|
|
|
|
|
|
from pkg_resources import parse_version
|
|
|
|
|
2014-05-26 06:01:49 -05:00
|
|
|
from ipaplatform.paths import paths
|
2014-10-22 08:07:44 -05:00
|
|
|
from ipapython.ipa_log_manager import log_mgr
|
|
|
|
from ipapython import ipautil
|
|
|
|
|
|
|
|
log = log_mgr.get_logger(__name__)
|
2014-05-26 06:01:49 -05:00
|
|
|
|
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
class BaseTaskNamespace(object):
|
2014-06-13 09:20:14 -05:00
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
def restore_context(self, filepath):
|
2014-06-13 09:20:14 -05:00
|
|
|
"""
|
|
|
|
Restore SELinux security context on the given filepath.
|
|
|
|
|
|
|
|
No return value expected.
|
|
|
|
"""
|
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
return
|
2014-05-26 06:01:49 -05:00
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
def backup_and_replace_hostname(self, fstore, statestore, hostname):
|
2014-06-13 09:20:14 -05:00
|
|
|
"""
|
|
|
|
Backs up the current hostname in the statestore (so that it can be
|
|
|
|
restored by the restore_network_configuration platform task).
|
|
|
|
|
|
|
|
Makes sure that new hostname (passed via hostname argument) is set
|
|
|
|
as a new pemanent hostname for this host.
|
|
|
|
|
|
|
|
No return value expected.
|
|
|
|
"""
|
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
return
|
2014-05-26 06:01:49 -05:00
|
|
|
|
2014-11-10 10:24:22 -06:00
|
|
|
def reload_systemwide_ca_store(self):
|
|
|
|
"""
|
|
|
|
Reloads the systemwide CA store.
|
|
|
|
|
|
|
|
Returns True if the operation succeeded, False otherwise.
|
|
|
|
"""
|
|
|
|
|
|
|
|
return True
|
|
|
|
|
2014-06-12 10:20:19 -05:00
|
|
|
def insert_ca_certs_into_systemwide_ca_store(self, ca_certs):
|
2014-06-13 09:20:14 -05:00
|
|
|
"""
|
2014-06-12 10:20:19 -05:00
|
|
|
Adds CA certificates from 'ca_certs' to the systemwide CA store
|
2014-06-13 09:20:14 -05:00
|
|
|
(if available on the platform).
|
|
|
|
|
|
|
|
Returns True if the operation succeeded, False otherwise.
|
|
|
|
"""
|
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
return True
|
2014-05-26 06:01:49 -05:00
|
|
|
|
2014-06-12 10:20:19 -05:00
|
|
|
def remove_ca_certs_from_systemwide_ca_store(self):
|
2014-06-13 09:20:14 -05:00
|
|
|
"""
|
2014-06-12 10:20:19 -05:00
|
|
|
Removes IPA CA certificates from the systemwide CA store
|
|
|
|
(if available on the platform).
|
2014-06-13 09:20:14 -05:00
|
|
|
|
|
|
|
Returns True if the operation succeeded, False otherwise.
|
|
|
|
"""
|
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
return True
|
2014-05-26 06:01:49 -05:00
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
def get_svc_list_file(self):
|
2014-06-13 09:20:14 -05:00
|
|
|
"""
|
|
|
|
Returns the path to the IPA service list file.
|
|
|
|
"""
|
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
return paths.SVC_LIST_FILE
|
2014-05-26 06:01:49 -05:00
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
def check_selinux_status(self):
|
2014-06-13 09:20:14 -05:00
|
|
|
"""
|
|
|
|
Checks if SELinux is available on the platform. If it is, this task
|
|
|
|
also makes sure that restorecon tool is available.
|
|
|
|
|
|
|
|
If SELinux is available, but restorcon tool is not installed, raises
|
|
|
|
an RuntimeError, which suggest installing the package containing
|
|
|
|
restorecon and rerunning the installation.
|
|
|
|
"""
|
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
return
|
2014-05-26 06:01:49 -05:00
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
def restore_network_configuration(self, fstore, statestore):
|
2014-06-13 09:20:14 -05:00
|
|
|
"""
|
|
|
|
Restores the original hostname as backed up in the
|
|
|
|
backup_and_replace_hostname platform task.
|
|
|
|
"""
|
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
return
|
2014-05-26 06:01:49 -05:00
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
def restore_pre_ipa_client_configuration(self, fstore, statestore,
|
|
|
|
was_sssd_installed,
|
|
|
|
was_sssd_configured):
|
2014-06-13 09:20:14 -05:00
|
|
|
"""
|
|
|
|
Restores the pre-ipa-client configuration that was modified by the
|
|
|
|
following platform tasks:
|
|
|
|
modify_nsswitch_pam_stack
|
|
|
|
modify_pam_to_use_krb5
|
|
|
|
"""
|
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
return
|
2014-05-26 06:01:49 -05:00
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
def set_nisdomain(self, nisdomain):
|
2014-06-13 09:20:14 -05:00
|
|
|
"""
|
|
|
|
Sets the NIS domain name to 'nisdomain'.
|
|
|
|
"""
|
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
return
|
2014-05-26 06:01:49 -05:00
|
|
|
|
2014-06-16 11:49:47 -05:00
|
|
|
def modify_nsswitch_pam_stack(self, sssd, mkhomedir, statestore):
|
2014-06-13 09:20:14 -05:00
|
|
|
"""
|
|
|
|
If sssd flag is true, configure pam and nsswtich so that SSSD is used
|
|
|
|
for retrieving user information and authentication.
|
|
|
|
|
|
|
|
Otherwise, configure pam and nsswitch to leverage pure LDAP.
|
|
|
|
"""
|
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
return
|
2014-05-26 06:01:49 -05:00
|
|
|
|
2014-06-16 11:49:47 -05:00
|
|
|
def modify_pam_to_use_krb5(self, statestore):
|
2014-06-13 09:20:14 -05:00
|
|
|
"""
|
|
|
|
Configure pam stack to allow kerberos authentication.
|
|
|
|
"""
|
|
|
|
|
2014-06-03 09:17:16 -05:00
|
|
|
return
|
2014-05-26 06:07:09 -05:00
|
|
|
|
2014-08-14 10:14:07 -05:00
|
|
|
def set_selinux_booleans(self, required_settings, backup_func=None):
|
|
|
|
"""Set the specified SELinux booleans
|
|
|
|
|
|
|
|
:param required_settings: A dictionary mapping the boolean names
|
|
|
|
to desired_values.
|
2014-11-18 03:40:31 -06:00
|
|
|
The desired value can be 'on' or 'off',
|
|
|
|
or None to leave the setting unchanged.
|
2014-08-14 10:14:07 -05:00
|
|
|
|
|
|
|
:param backup_func: A function called for each boolean with two
|
|
|
|
arguments: the name and the previous value
|
|
|
|
|
|
|
|
If SELinux is disabled, return False; on success returns True.
|
|
|
|
|
|
|
|
If setting the booleans fails,
|
|
|
|
an ipapython.errors.SetseboolError is raised.
|
|
|
|
"""
|
|
|
|
|
|
|
|
return
|
|
|
|
|
2014-10-22 08:07:44 -05:00
|
|
|
def create_system_user(self, name, group, homedir, shell, uid = None, gid = None, comment = None):
|
|
|
|
"""Create a system user with a corresponding group"""
|
|
|
|
try:
|
|
|
|
grp.getgrnam(group)
|
|
|
|
except KeyError:
|
|
|
|
log.debug('Adding group %s', group)
|
|
|
|
args = [paths.GROUPADD, '-r', group]
|
|
|
|
if gid:
|
|
|
|
args += ['-g', str(gid)]
|
|
|
|
try:
|
|
|
|
ipautil.run(args)
|
|
|
|
log.debug('Done adding group')
|
|
|
|
except ipautil.CalledProcessError as e:
|
|
|
|
log.critical('Failed to add group: %s', e)
|
|
|
|
raise
|
|
|
|
else:
|
|
|
|
log.debug('group %s exists', group)
|
|
|
|
|
|
|
|
try:
|
|
|
|
pwd.getpwnam(name)
|
|
|
|
except KeyError:
|
|
|
|
log.debug('Adding user %s', name)
|
|
|
|
args = [
|
|
|
|
paths.USERADD,
|
|
|
|
'-g', group,
|
|
|
|
'-d', homedir,
|
|
|
|
'-s', shell,
|
|
|
|
'-M', '-r', name,
|
|
|
|
]
|
|
|
|
if uid:
|
|
|
|
args += ['-u', str(uid)]
|
|
|
|
if comment:
|
|
|
|
args += ['-c', comment]
|
|
|
|
try:
|
|
|
|
ipautil.run(args)
|
|
|
|
log.debug('Done adding user')
|
|
|
|
except ipautil.CalledProcessError as e:
|
|
|
|
log.critical('Failed to add user: %s', e)
|
|
|
|
raise
|
|
|
|
else:
|
|
|
|
log.debug('user %s exists', name)
|
|
|
|
|
2015-04-10 08:42:58 -05:00
|
|
|
def parse_ipa_version(self, version):
|
|
|
|
"""
|
|
|
|
:param version: textual version
|
|
|
|
:return: object implementing proper __cmp__ method for version compare
|
|
|
|
"""
|
|
|
|
return parse_version(version)
|