On 12/05/2012 11:17 AM, Alexander Bokovoy wrote: > On Wed, 05 Dec 2012, Martin Kosek wrote: >> 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 > NACK. > > My main objection is that it is Fedora 18 feature but you are > incorporating it into fedora16 platform code. > > Perhaps we need to split out to fedora18 platform with this change > and make sure we build with 'fedora18' platform on Fedora 18? > > 'fedora18' platform would inherit from fedora16 code and only override > these two methods. >
That makes sense. I did that + moved restore_hostname function from platform files because it does not differ between platform versions. Updated patch attached. Martin
From a4b4f4196865baef7d4fd2a29d236596c2b73d3d Mon Sep 17 00:00:00 2001 From: Martin Kosek <mko...@redhat.com> Date: Wed, 5 Dec 2012 10:50:05 +0100 Subject: [PATCH] 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 --- freeipa.spec.in | 13 +++- install/tools/ipa-server-install | 9 +-- ipa-client/ipa-install/ipa-client-install | 10 +-- ipapython/ipautil.py | 12 ++++ ipapython/platform/fedora16.py | 7 +- ipapython/platform/fedora18.py | 110 ++++++++++++++++++++++++++++++ ipapython/platform/redhat.py | 11 ++- 7 files changed, 154 insertions(+), 18 deletions(-) create mode 100644 ipapython/platform/fedora18.py diff --git a/freeipa.spec.in b/freeipa.spec.in index 870aaa62c968aef232fd80ae200b044ad93e7614..8a095db41d26ddf6d09c34d4619ec9605652612a 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 35b65f66229345255eae233f64d24b0fea3cdf1d..92e9dcf2fb2c4c30f1b4145e7368262f89eac6fd 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 612bdc658870fa680f8d7c5b30d8111a6a316c66..cdcc6ad2948c402a29b443ce89e076092b2dda94 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 10ad2c34191599448a7ae869925df481cc3cf3b3..1053fc66597a6525269a3f3b540fcf743b12c33e 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 83bb11574e698776d549ff87cf08afb4d23b2332..8609e4c4bf2379bf2156c9df0c4e77dba4a16d7b 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 0000000000000000000000000000000000000000..c6d32866ffe6677cfcaa9ee2536ee6c0558b46de --- /dev/null +++ b/ipapython/platform/fedora18.py @@ -0,0 +1,110 @@ +# Author: Martin Kosek <mko...@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 1de035568265aeac2a6ab10d2575e2cbeb3579dc..389785c7bb00ec5fbc31e20706545108d207927c 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 -- 1.7.11.7
_______________________________________________ Freeipa-devel mailing list Freeipa-devel@redhat.com https://www.redhat.com/mailman/listinfo/freeipa-devel