mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
Change network configuration file
Fedora+systemd changed deprecated /etc/sysconfig/network which was used by IPA to store static hostname for the IPA machine. See https://bugzilla.redhat.com/show_bug.cgi?id=881785 for details. Change Fedora platform files to store the hostname to /etc/hostname instead. https://fedorahosted.org/freeipa/ticket/3279
This commit is contained in:
parent
c6efd4c7aa
commit
3896bf370a
@ -280,8 +280,13 @@ package.
|
||||
%build
|
||||
export CFLAGS="$CFLAGS %{optflags}"
|
||||
export CPPFLAGS="$CPPFLAGS %{optflags}"
|
||||
# use fedora16 platform which introduced systemd support
|
||||
%if 0%{?fedora} >= 18
|
||||
# use fedora18 platform which is based on fedora16 platform with systemd
|
||||
# support + fedora18 changes
|
||||
export SUPPORTED_PLATFORM=fedora18
|
||||
%else
|
||||
export SUPPORTED_PLATFORM=fedora16
|
||||
%endif
|
||||
# Force re-generate of platform support
|
||||
rm -f ipapython/services.py
|
||||
make version-update
|
||||
@ -302,7 +307,13 @@ make IPA_VERSION_IS_GIT_SNAPSHOT=no %{?_smp_mflags} client
|
||||
|
||||
%install
|
||||
rm -rf %{buildroot}
|
||||
%if 0%{?fedora} >= 18
|
||||
# use fedora18 platform which is based on fedora16 platform with systemd
|
||||
# support + fedora18 changes
|
||||
export SUPPORTED_PLATFORM=fedora18
|
||||
%else
|
||||
export SUPPORTED_PLATFORM=fedora16
|
||||
%endif
|
||||
# Force re-generate of platform support
|
||||
rm -f ipapython/services.py
|
||||
%if ! %{ONLY_CLIENT}
|
||||
|
@ -497,6 +497,7 @@ def uninstall():
|
||||
krbinstance.KrbInstance(fstore).uninstall()
|
||||
dsinstance.DsInstance(fstore=fstore).uninstall()
|
||||
memcacheinstance.MemcacheInstance().uninstall()
|
||||
ipaservices.restore_network_configuration(fstore, sstore)
|
||||
fstore.restore_all_files()
|
||||
try:
|
||||
os.remove(ANSWER_CACHE)
|
||||
@ -510,13 +511,7 @@ def uninstall():
|
||||
|
||||
ipaservices.knownservices.ipa.disable()
|
||||
|
||||
old_hostname = sstore.restore_state('network','hostname')
|
||||
system_hostname = get_fqdn()
|
||||
if old_hostname is not None and old_hostname != system_hostname:
|
||||
try:
|
||||
ipautil.run(['/bin/hostname', old_hostname])
|
||||
except CalledProcessError, e:
|
||||
print >>sys.stderr, "Failed to set this machine hostname back to %s (%s)." % (old_hostname, str(e))
|
||||
ipautil.restore_hostname(sstore)
|
||||
|
||||
# remove upgrade state file
|
||||
sysupgrade.remove_upgrade_file()
|
||||
|
@ -451,16 +451,10 @@ def uninstall(options, env):
|
||||
|
||||
if fstore.has_files():
|
||||
root_logger.info("Restoring client configuration files")
|
||||
ipaservices.restore_network_configuration(fstore, statestore)
|
||||
fstore.restore_all_files()
|
||||
|
||||
old_hostname = statestore.restore_state('network', 'hostname')
|
||||
if old_hostname is not None and old_hostname != hostname:
|
||||
try:
|
||||
ipautil.run(['/bin/hostname', old_hostname])
|
||||
except CalledProcessError, e:
|
||||
root_logger.error(
|
||||
"Failed to set this machine's hostname to %s (%s).",
|
||||
old_hostname, str(e))
|
||||
ipautil.restore_hostname(statestore)
|
||||
|
||||
nscd = ipaservices.knownservices.nscd
|
||||
if nscd.is_installed():
|
||||
|
@ -1162,3 +1162,15 @@ def dn_attribute_property(private_name):
|
||||
return value
|
||||
|
||||
return property(getter, setter)
|
||||
|
||||
def restore_hostname(statestore):
|
||||
"""
|
||||
Restore hostname of a machine, if it was set before
|
||||
"""
|
||||
old_hostname = statestore.restore_state('network','hostname')
|
||||
system_hostname = socket.gethostname()
|
||||
if old_hostname is not None and old_hostname != system_hostname:
|
||||
try:
|
||||
run(['/bin/hostname', old_hostname])
|
||||
except CalledProcessError, e:
|
||||
print >>sys.stderr, "Failed to set this machine hostname back to %s: %s" % (old_hostname, str(e))
|
||||
|
@ -36,11 +36,15 @@ from ipalib import api
|
||||
# names are ipapython.services.wellknownservices
|
||||
# backup_and_replace_hostname -- platform-specific way to set hostname and
|
||||
# make it persistent over reboots
|
||||
# restore_network_configuration -- platform-specific way of restoring network
|
||||
# configuration (e.g. static hostname)
|
||||
# restore_context -- platform-sepcific way to restore security context, if
|
||||
# applicable
|
||||
# check_selinux_status -- platform-specific way to see if SELinux is enabled
|
||||
# and restorecon is installed.
|
||||
__all__ = ['authconfig', 'service', 'knownservices', 'backup_and_replace_hostname', 'restore_context', 'check_selinux_status']
|
||||
__all__ = ['authconfig', 'service', 'knownservices',
|
||||
'backup_and_replace_hostname', 'restore_context', 'check_selinux_status',
|
||||
'restore_network_configuration']
|
||||
|
||||
# For beginning just remap names to add .service
|
||||
# As more services will migrate to systemd, unit names will deviate and
|
||||
@ -204,3 +208,4 @@ authconfig = redhat.authconfig
|
||||
service = f16_service
|
||||
knownservices = Fedora16Services()
|
||||
backup_and_replace_hostname = redhat.backup_and_replace_hostname
|
||||
restore_network_configuration = redhat.restore_network_configuration
|
||||
|
110
ipapython/platform/fedora18.py
Normal file
110
ipapython/platform/fedora18.py
Normal file
@ -0,0 +1,110 @@
|
||||
# Author: Martin Kosek <mkosek@redhat.com>
|
||||
#
|
||||
# Copyright (C) 2012 Red Hat
|
||||
# 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/>.
|
||||
#
|
||||
|
||||
import stat
|
||||
import sys
|
||||
import socket
|
||||
import os
|
||||
|
||||
from ipapython import ipautil
|
||||
from ipapython.platform import fedora16
|
||||
|
||||
# All what we allow exporting directly from this module
|
||||
# Everything else is made available through these symbols when they are
|
||||
# directly imported into ipapython.services:
|
||||
# authconfig -- class reference for platform-specific implementation of
|
||||
# authconfig(8)
|
||||
# service -- class reference for platform-specific implementation of a
|
||||
# PlatformService class
|
||||
# knownservices -- factory instance to access named services IPA cares about,
|
||||
# names are ipapython.services.wellknownservices
|
||||
# backup_and_replace_hostname -- platform-specific way to set hostname and
|
||||
# make it persistent over reboots
|
||||
# restore_network_configuration -- platform-specific way of restoring network
|
||||
# configuration (e.g. static hostname)
|
||||
# restore_context -- platform-sepcific way to restore security context, if
|
||||
# applicable
|
||||
# check_selinux_status -- platform-specific way to see if SELinux is enabled
|
||||
# and restorecon is installed.
|
||||
__all__ = ['authconfig', 'service', 'knownservices',
|
||||
'backup_and_replace_hostname', 'restore_context', 'check_selinux_status',
|
||||
'restore_network_configuration']
|
||||
|
||||
def backup_and_replace_hostname(fstore, statestore, hostname):
|
||||
old_hostname = socket.gethostname()
|
||||
try:
|
||||
ipautil.run(['/bin/hostname', hostname])
|
||||
except ipautil.CalledProcessError, e:
|
||||
print >>sys.stderr, "Failed to set this machine hostname to %s (%s)." % (hostname, str(e))
|
||||
|
||||
filepath = '/etc/hostname'
|
||||
if os.path.exists(filepath):
|
||||
# read old hostname
|
||||
with open(filepath, 'r') as f:
|
||||
for line in f.readlines():
|
||||
line = line.strip()
|
||||
if not line or line.startswith('#'):
|
||||
# skip comment or empty line
|
||||
continue
|
||||
old_hostname = line
|
||||
break
|
||||
fstore.backup_file(filepath)
|
||||
|
||||
with open(filepath, 'w') as f:
|
||||
f.write("%s\n" % hostname)
|
||||
os.chmod(filepath, stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH)
|
||||
os.chown(filepath, 0, 0)
|
||||
restore_context(filepath)
|
||||
|
||||
# store old hostname
|
||||
statestore.backup_state('network', 'hostname', old_hostname)
|
||||
|
||||
def restore_network_configuration(fstore, statestore):
|
||||
old_filepath = '/etc/sysconfig/network'
|
||||
old_hostname = statestore.get_state('network', 'hostname')
|
||||
hostname_was_configured = False
|
||||
|
||||
if fstore.has_file(old_filepath):
|
||||
# This is Fedora >=18 instance that was upgraded from previous
|
||||
# Fedora version which held network configuration
|
||||
# in /etc/sysconfig/network
|
||||
old_filepath_restore = '/etc/sysconfig/network.ipabkp'
|
||||
fstore.restore_file(old_filepath, old_filepath_restore)
|
||||
print "Deprecated configuration file '%s' was restored to '%s'" \
|
||||
% (old_filepath, old_filepath_restore)
|
||||
hostname_was_configured = True
|
||||
|
||||
filepath = '/etc/hostname'
|
||||
if fstore.has_file(filepath):
|
||||
fstore.restore_file(filepath)
|
||||
hostname_was_configured = True
|
||||
|
||||
if not hostname_was_configured and old_hostname:
|
||||
# hostname was not configured before but was set by IPA. Delete
|
||||
# /etc/hostname to restore previous configuration
|
||||
try:
|
||||
os.remove(filepath)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
authconfig = fedora16.authconfig
|
||||
service = fedora16.service
|
||||
knownservices = fedora16.knownservices
|
||||
restore_context = fedora16.restore_context
|
||||
check_selinux_status = fedora16.check_selinux_status
|
@ -44,11 +44,15 @@ from ipalib import api
|
||||
# names are ipapython.services.wellknownservices
|
||||
# backup_and_replace_hostname -- platform-specific way to set hostname and
|
||||
# make it persistent over reboots
|
||||
# restore_network_configuration -- platform-specific way of restoring network
|
||||
# configuration (e.g. static hostname)
|
||||
# restore_context -- platform-sepcific way to restore security context, if
|
||||
# applicable
|
||||
# check_selinux_status -- platform-specific way to see if SELinux is enabled
|
||||
# and restorecon is installed.
|
||||
__all__ = ['authconfig', 'service', 'knownservices', 'backup_and_replace_hostname', 'restore_context', 'check_selinux_status']
|
||||
__all__ = ['authconfig', 'service', 'knownservices',
|
||||
'backup_and_replace_hostname', 'restore_context', 'check_selinux_status',
|
||||
'restore_network_configuration']
|
||||
|
||||
class RedHatService(base.PlatformService):
|
||||
def __wait_for_open_ports(self, instance_name=""):
|
||||
@ -225,6 +229,11 @@ def backup_and_replace_hostname(fstore, statestore, hostname):
|
||||
else:
|
||||
statestore.backup_state('network', 'hostname', old_hostname)
|
||||
|
||||
def restore_network_configuration(fstore, statestore):
|
||||
filepath = '/etc/sysconfig/network'
|
||||
if fstore.has_file(filepath):
|
||||
fstore.restore_file(filepath)
|
||||
|
||||
def check_selinux_status(restorecon='/sbin/restorecon'):
|
||||
"""
|
||||
We don't have a specific package requirement for policycoreutils
|
||||
|
Loading…
Reference in New Issue
Block a user