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

Reply via email to