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
From d35d23e45d2f5db4b7a3339ccff7bcd287b33ed9 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
---
 install/tools/ipa-server-install          |  9 +----
 ipa-client/ipa-install/ipa-client-install | 10 +----
 ipapython/platform/fedora16.py            | 63 ++++++++++++++++++++++++++++++-
 ipapython/platform/redhat.py              | 18 ++++++++-
 4 files changed, 82 insertions(+), 18 deletions(-)

diff --git a/install/tools/ipa-server-install b/install/tools/ipa-server-install
index 35b65f66229345255eae233f64d24b0fea3cdf1d..705e789b78b197a6d79b6752b4fe1e55c3edea92 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))
+    ipaservices.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..70f2141535a3679f121784883ba77d3fce9eff4b 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))
+    ipaservices.restore_hostname(statestore)
 
     nscd = ipaservices.knownservices.nscd
     if nscd.is_installed():
diff --git a/ipapython/platform/fedora16.py b/ipapython/platform/fedora16.py
index 83bb11574e698776d549ff87cf08afb4d23b2332..5b81478a2ad8a821806694212cffb428734f9811 100644
--- a/ipapython/platform/fedora16.py
+++ b/ipapython/platform/fedora16.py
@@ -19,6 +19,9 @@
 
 import os
 import time
+import stat
+import socket
+import sys
 
 from ipapython import ipautil, dogtag
 from ipapython.platform import base, redhat, systemd
@@ -40,7 +43,9 @@ from ipalib import api
 #                    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', 'restore_hostname']
 
 # For beginning just remap names to add .service
 # As more services will migrate to systemd, unit names will deviate and
@@ -200,7 +205,61 @@ def restore_context(filepath, restorecon='/usr/sbin/restorecon'):
 def check_selinux_status(restorecon='/usr/sbin/restorecon'):
     return redhat.check_selinux_status(restorecon)
 
+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):
+        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 = redhat.authconfig
 service = f16_service
 knownservices = Fedora16Services()
-backup_and_replace_hostname = redhat.backup_and_replace_hostname
+restore_hostname = redhat.restore_hostname
diff --git a/ipapython/platform/redhat.py b/ipapython/platform/redhat.py
index 1de035568265aeac2a6ab10d2575e2cbeb3579dc..0016658b414f6d1e4c5664138b207948f8270068 100644
--- a/ipapython/platform/redhat.py
+++ b/ipapython/platform/redhat.py
@@ -48,7 +48,9 @@ from ipalib import api
 #                    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', 'restore_hostname']
 
 class RedHatService(base.PlatformService):
     def __wait_for_open_ports(self, instance_name=""):
@@ -225,6 +227,20 @@ def backup_and_replace_hostname(fstore, statestore, hostname):
     else:
         statestore.backup_state('network', 'hostname', old_hostname)
 
+def restore_hostname(statestore):
+    old_hostname = statestore.restore_state('network','hostname')
+    system_hostname = socket.gethostname()
+    if old_hostname is not None and old_hostname != system_hostname:
+        try:
+            ipautil.run(['/bin/hostname', old_hostname])
+        except ipautil.CalledProcessError, e:
+            print >>sys.stderr, "Failed to set this machine hostname back to %s: %s" % (old_hostname, str(e))
+
+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