diff options
author | Martin Kosek <mkosek@redhat.com> | 2012-12-05 10:50:05 +0100 |
---|---|---|
committer | Martin Kosek <mkosek@redhat.com> | 2012-12-05 13:30:31 +0100 |
commit | 3896bf370a142eb95a4341e381ee7b1ff0f0c3e2 (patch) | |
tree | f6f803315b928cd73d9c2115a93ee0f593d252f7 | |
parent | c6efd4c7aaf6961142b6fae5d30dd9691a493447 (diff) | |
download | freeipa-3896bf370a142eb95a4341e381ee7b1ff0f0c3e2.tar.gz freeipa-3896bf370a142eb95a4341e381ee7b1ff0f0c3e2.tar.xz freeipa-3896bf370a142eb95a4341e381ee7b1ff0f0c3e2.zip |
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
-rw-r--r-- | freeipa.spec.in | 13 | ||||
-rwxr-xr-x | install/tools/ipa-server-install | 9 | ||||
-rwxr-xr-x | ipa-client/ipa-install/ipa-client-install | 10 | ||||
-rw-r--r-- | ipapython/ipautil.py | 12 | ||||
-rw-r--r-- | ipapython/platform/fedora16.py | 7 | ||||
-rw-r--r-- | ipapython/platform/fedora18.py | 110 | ||||
-rw-r--r-- | ipapython/platform/redhat.py | 11 |
7 files changed, 154 insertions, 18 deletions
diff --git a/freeipa.spec.in b/freeipa.spec.in index 870aaa62c..8a095db41 100644 --- a/freeipa.spec.in +++ b/freeipa.spec.in @@ -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} diff --git a/install/tools/ipa-server-install b/install/tools/ipa-server-install index 35b65f662..92e9dcf2f 100755 --- a/install/tools/ipa-server-install +++ b/install/tools/ipa-server-install @@ -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() diff --git a/ipa-client/ipa-install/ipa-client-install b/ipa-client/ipa-install/ipa-client-install index 612bdc658..cdcc6ad29 100755 --- a/ipa-client/ipa-install/ipa-client-install +++ b/ipa-client/ipa-install/ipa-client-install @@ -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(): diff --git a/ipapython/ipautil.py b/ipapython/ipautil.py index 10ad2c341..1053fc665 100644 --- a/ipapython/ipautil.py +++ b/ipapython/ipautil.py @@ -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)) diff --git a/ipapython/platform/fedora16.py b/ipapython/platform/fedora16.py index 83bb11574..8609e4c4b 100644 --- a/ipapython/platform/fedora16.py +++ b/ipapython/platform/fedora16.py @@ -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 diff --git a/ipapython/platform/fedora18.py b/ipapython/platform/fedora18.py new file mode 100644 index 000000000..c6d32866f --- /dev/null +++ b/ipapython/platform/fedora18.py @@ -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 diff --git a/ipapython/platform/redhat.py b/ipapython/platform/redhat.py index 1de035568..389785c7b 100644 --- a/ipapython/platform/redhat.py +++ b/ipapython/platform/redhat.py @@ -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 |