From f903c2d5bff3e420519f7bbf026b9bfcc5460fb0 Mon Sep 17 00:00:00 2001 From: Martin Basti Date: May 26 2015 11:30:15 +0000 Subject: Fix: use DS socket check only for upgrade To detect if DS server is running, use the slapd socket for upgrade, and the LDAP port for installation. Without enabled LDAPi socket checking doesnt work. https://fedorahosted.org/freeipa/ticket/4904 Reviewed-By: Fraser Tweedale --- diff --git a/ipaplatform/redhat/services.py b/ipaplatform/redhat/services.py index 565bf1f..757908f 100644 --- a/ipaplatform/redhat/services.py +++ b/ipaplatform/redhat/services.py @@ -25,6 +25,7 @@ Contains Red Hat OS family-specific service class implementations. import os import time import xml.dom.minidom +import contextlib from ipaplatform.tasks import tasks from ipaplatform.base import services as base_services @@ -124,7 +125,8 @@ class RedHatDirectoryService(RedHatService): return True - def restart(self, instance_name="", capture_output=True, wait=True): + def restart(self, instance_name="", capture_output=True, wait=True, + ldapi=False): # We need to explicitly enable instances to install proper symlinks as # dirsrv.target.wants/ dependencies. Standard systemd service class does it # on enable() method call. Unfortunately, ipa-server-install does not do @@ -150,22 +152,35 @@ class RedHatDirectoryService(RedHatService): os.unlink(srv_lnk) os.symlink(srv_etc, srv_lnk) - super(RedHatDirectoryService, self).restart(instance_name, - capture_output=capture_output, wait=wait) - - def wait_for_open_ports(self, instance_name=""): - if instance_name.endswith('.service'): - instance_name = instance_name[:-8] - if instance_name.startswith('dirsrv@'): - instance_name = instance_name[7:] - - if instance_name: - - ipautil.wait_for_open_socket( - paths.SLAPD_INSTANCE_SOCKET_TEMPLATE % instance_name, - self.api.env.startup_timeout) + with self.__wait(instance_name, wait, ldapi) as wait: + super(RedHatDirectoryService, self).restart( + instance_name, capture_output=capture_output, wait=wait) + + def start(self, instance_name="", capture_output=True, wait=True, + ldapi=False): + with self.__wait(instance_name, wait, ldapi) as wait: + super(RedHatDirectoryService, self).start( + instance_name, capture_output=capture_output, wait=wait) + + @contextlib.contextmanager + def __wait(self, instance_name, wait, ldapi): + if ldapi: + instance_name = self.service_instance(instance_name) + if instance_name.endswith('.service'): + instance_name = instance_name[:-8] + if instance_name.startswith('dirsrv'): + # this is intentional, return the empty string if the instance + # name is 'dirsrv' + instance_name = instance_name[7:] + if not instance_name: + ldapi = False + if ldapi: + yield False + socket_name = paths.SLAPD_INSTANCE_SOCKET_TEMPLATE % instance_name + ipautil.wait_for_open_socket(socket_name, + self.api.env.startup_timeout) else: - super(RedHatDirectoryService, self).wait_for_open_ports() + yield wait class RedHatIPAService(RedHatService): diff --git a/ipaserver/install/upgradeinstance.py b/ipaserver/install/upgradeinstance.py index d58c934..10f7c2c 100644 --- a/ipaserver/install/upgradeinstance.py +++ b/ipaserver/install/upgradeinstance.py @@ -24,6 +24,7 @@ import shutil import random import traceback from ipaplatform.paths import paths +from ipaplatform import services from ipapython.ipa_log_manager import * from ipapython import ipaldap @@ -172,7 +173,7 @@ class IPAUpgrade(service.Service): self.realm = realm_name def __start(self): - super(IPAUpgrade, self).start() + services.service(self.service_name).start(self.serverid, ldapi=True) def __stop_instance(self): """Stop only the main DS instance"""