diff options
-rwxr-xr-x | install/tools/ipa-server-install | 27 | ||||
-rwxr-xr-x | install/tools/ipactl | 3 | ||||
-rw-r--r-- | ipaserver/install/dsinstance.py | 60 | ||||
-rw-r--r-- | ipaserver/install/installutils.py | 49 |
4 files changed, 96 insertions, 43 deletions
diff --git a/install/tools/ipa-server-install b/install/tools/ipa-server-install index c87ba9e00..3828a9c48 100755 --- a/install/tools/ipa-server-install +++ b/install/tools/ipa-server-install @@ -428,6 +428,8 @@ def check_dirsrv(unattended): def uninstall(): + rv = 0 + print "Shutting down all IPA services" try: (stdout, stderr, rc) = run(["/usr/sbin/ipactl", "stop"], raiseonerr=False) @@ -441,6 +443,7 @@ def uninstall(): logging.debug("ipa-client-install returned %d" % rc) raise RuntimeError(stdout) except Exception, e: + rv = 1 print "Uninstall of client side components failed!" print "ipa-client-install returned: " + str(e) @@ -474,12 +477,32 @@ def uninstall(): ipautil.run(["/usr/sbin/groupdel", dsinstance.DS_GROUP]) except ipautil.CalledProcessError, e: logging.critical("failed to delete group %s" % e) + rv = 1 except KeyError: logging.info("Group %s already removed", dsinstance.DS_GROUP) service.chkconfig_off('ipa') - return 0 + # Now for some sanity checking. Make sure everything was really + # uninstalled. + serverids = dsinstance.check_existing_installation() + if len(serverids): + rv = 1 + logging.error('IPA cannot be re-installed without removing existing 389-ds instance(s)') + + if fstore.has_files(): + logging.error('Some files have not been restored, see /var/lib/ipa/sysrestore/sysrestore.index') + has_state = False + for module in IPA_MODULES: # from installutils + if sstore.has_state(module): + logging.error('Some installation state for %s has not been restored, see /var/lib/ipa/sysrestore/sysrestore.state' % module) + has_state = True + rv = 1 + + if has_state: + logging.warn('Some installation state has not been restored.\nThis will cause re-installation to fail.\nIt should be safe to remove /var/lib/ipa/sysrestore.state but it may\nmean your system hasn\'t be restored to its pre-installation state.') + + return rv def set_subject_in_config(realm_name, dm_password, suffix, subject_base): @@ -518,7 +541,7 @@ def main(): else: standard_logging_setup("/var/log/ipaserver-install.log", options.debug) print "\nThe log file for this installation can be found in /var/log/ipaserver-install.log" - if not options.external_ca and not options.external_cert_file and (dsinstance.DsInstance().is_configured() or cainstance.CADSInstance().is_configured()): + if not options.external_ca and not options.external_cert_file and is_ipa_configured(): sys.exit("IPA server is already configured on this system.\n" + "If you want to reinstall the IPA server please uninstall it first.") diff --git a/install/tools/ipactl b/install/tools/ipactl index 313b87662..f7b2adcfd 100755 --- a/install/tools/ipactl +++ b/install/tools/ipactl @@ -23,6 +23,7 @@ try: import os from ipaserver.install import service from ipaserver.install.dsinstance import config_dirname, realm_to_serverid + from ipaserver.install.installutils import is_ipa_configured from ipapython import sysrestore from ipapython import config from ipalib import api, errors @@ -51,7 +52,7 @@ class IpactlError(StandardError): return self.msg def check_IPA_configuration(): - if not sysrestore.FileStore('/var/lib/ipa/sysrestore').has_files(): + if not is_ipa_configured(): # LSB status code 6: program is not configured raise IpactlError("IPA is not configured " + "(see man pages of ipa-server-install for help)", 6) diff --git a/ipaserver/install/dsinstance.py b/ipaserver/install/dsinstance.py index 50060832e..7ca5db216 100644 --- a/ipaserver/install/dsinstance.py +++ b/ipaserver/install/dsinstance.py @@ -66,42 +66,24 @@ def schema_dirname(serverid): return config_dirname(serverid) + "/schema/" def erase_ds_instance_data(serverid): - try: - shutil.rmtree("/etc/dirsrv/slapd-%s" % serverid) - except: - pass - try: - shutil.rmtree("/usr/lib/dirsrv/slapd-%s" % serverid) - except: - pass - try: - shutil.rmtree("/usr/lib64/dirsrv/slapd-%s" % serverid) - except: - pass - try: - shutil.rmtree("/var/lib/dirsrv/slapd-%s" % serverid) - except: - pass - try: - shutil.rmtree("/var/lock/dirsrv/slapd-%s" % serverid) - except: - pass - try: - os.unlink("/var/run/slapd-%s.socket" % serverid) - except: - pass - try: - shutil.rmtree("/var/lib/dirsrv/scripts-%s" % serverid) - except: - pass - try: - os.unlink("/etc/dirsrv/ds.keytab") - except: - pass - try: - os.unlink("/etc/sysconfig/dirsrv-%s" % serverid) - except: - pass + installutils.rmtree("/etc/dirsrv/slapd-%s" % serverid) + + installutils.rmtree("/usr/lib/dirsrv/slapd-%s" % serverid) + + installutils.rmtree("/usr/lib64/dirsrv/slapd-%s" % serverid) + + installutils.rmtree("/var/lib/dirsrv/slapd-%s" % serverid) + + installutils.rmtree("/var/lock/dirsrv/slapd-%s" % serverid) + + installutils.remove_file("/var/run/slapd-%s.socket" % serverid) + + installutils.rmtree("/var/lib/dirsrv/scripts-%s" % serverid) + + installutils.remove_file("/etc/dirsrv/ds.keytab") + + installutils.remove_file("/etc/sysconfig/dirsrv-%s" % serverid) + # try: # shutil.rmtree("/var/log/dirsrv/slapd-%s" % serverid) # except: @@ -114,6 +96,7 @@ def check_existing_installation(): serverids = [] for d in dirs: + logging.debug('Found existing 389-ds instance %s' % d) serverids.append(os.path.basename(d).split("slapd-", 1)[1]) return serverids @@ -672,10 +655,7 @@ class DsInstance(service.Service): if user_exists == False: pent = pwd.getpwnam(DS_USER) - try: - os.unlink("/var/tmp/ldap_%d" % pent.pw_uid) - except: - pass + installutils.remove_file("/var/tmp/ldap_%d" % pent.pw_uid) try: ipautil.run(["/usr/sbin/userdel", DS_USER]) except ipautil.CalledProcessError, e: diff --git a/ipaserver/install/installutils.py b/ipaserver/install/installutils.py index df63b8e8c..d7eb65104 100644 --- a/ipaserver/install/installutils.py +++ b/ipaserver/install/installutils.py @@ -30,10 +30,14 @@ import fcntl import netaddr import time import tempfile +import shutil from ConfigParser import SafeConfigParser from ipapython import ipautil, dnsclient, sysrestore +# Used to determine install status +IPA_MODULES = ['httpd', 'ipa_kpasswd', 'dirsrv', 'pki-cad', 'pkids', 'install', 'krb5kdc', 'ntpd', 'named'] + class HostnameLocalhost(Exception): pass @@ -508,3 +512,48 @@ def check_server_configuration(): server_fstore = sysrestore.FileStore('/var/lib/ipa/sysrestore') if not server_fstore.has_files(): raise RuntimeError("IPA is not configured on this system.") + +def remove_file(filename): + """ + Remove a file and log any exceptions raised. + """ + try: + if os.path.exists(filename): + os.unlink(filename) + except Exception, e: + logging.error('Error removing %s: %s' % (filename, str(e))) + +def rmtree(path): + """ + Remove a directory structure and log any exceptions raised. + """ + try: + if os.path.exists(path): + shutil.rmtree(path) + except Exception, e: + logging.error('Error removing %s: %s' % (path, str(e))) + +def is_ipa_configured(): + """ + Using the state and index install files determine if IPA is already + configured. + """ + installed = False + + sstore = sysrestore.StateFile('/var/lib/ipa/sysrestore') + fstore = sysrestore.FileStore('/var/lib/ipa/sysrestore') + + for module in IPA_MODULES: + if sstore.has_state(module): + logging.debug('%s is configured' % module) + installed = True + else: + logging.debug('%s is not configured' % module) + + if fstore.has_files(): + logging.debug('filestore has files') + installed = True + else: + logging.debug('filestore is tracking no files') + + return installed |