Change in vdsm[master]: vdsm-tool: add service management utilities
zhshzhou at linux.vnet.ibm.com
zhshzhou at linux.vnet.ibm.com
Mon Apr 8 12:02:43 UTC 2013
Zhou Zheng Sheng has uploaded a new change for review.
Change subject: vdsm-tool: add service management utilities
......................................................................
vdsm-tool: add service management utilities
Change-Id: Idd1cbcf5fd00bb1ec73c5970be012e294b3b4c55
Signed-off-by: Zhou Zheng Sheng <zhshzhou at linux.vnet.ibm.com>
---
M lib/vdsm/tool/Makefile.am
A lib/vdsm/tool/service.py
M vdsm.spec.in
3 files changed, 277 insertions(+), 0 deletions(-)
git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/01/13701/1
diff --git a/lib/vdsm/tool/Makefile.am b/lib/vdsm/tool/Makefile.am
index 49c067c..31704cc 100644
--- a/lib/vdsm/tool/Makefile.am
+++ b/lib/vdsm/tool/Makefile.am
@@ -33,4 +33,5 @@
__init__.py \
passwd.py \
seboolsetup.py \
+ service.py
$(NULL)
diff --git a/lib/vdsm/tool/service.py b/lib/vdsm/tool/service.py
new file mode 100644
index 0000000..c7d705c
--- /dev/null
+++ b/lib/vdsm/tool/service.py
@@ -0,0 +1,275 @@
+# Copyright 2013 IBM, Inc.
+#
+# 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# Refer to the README and COPYING files for full details of the license
+#
+
+'''
+System service management utlities.
+'''
+
+import os
+import subprocess
+import functools
+import re
+
+from vdsm.tool import expose
+from vdsm.utils import CommandPath
+
+
+def execCmd(argv):
+ p = subprocess.Popen(argv, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ out, err = p.communicate()
+ rc = p.returncode
+ return (rc, out, err)
+
+
+_SYSTEMCTL = CommandPath("systemctl",
+ "/bin/systemctl",
+ "/usr/bin/systemctl",
+ )
+
+_INITCTL = CommandPath("initctl",
+ "/sbin/initctl",
+ )
+
+_SERVICE = CommandPath("service",
+ "/sbin/service",
+ "/usr/sbin/service",
+ )
+
+_CHKCONFIG = CommandPath("chkconfig",
+ "/sbin/chkconfig",
+ )
+
+_UPDATERC = CommandPath("update-rc.d",
+ "/usr/sbin/update-rc.d",
+ )
+
+_srvStartAlts = []
+_srvStopAlts = []
+_srvStatusAlts = []
+_srvRestartAlts = []
+_srvDisableAlts = []
+
+try:
+ _SYSTEMCTL.cmd
+except OSError:
+ pass
+else:
+ def _systemctlNative(systemctlFun):
+ @functools.wraps(systemctlFun)
+ def wrapper(srvName):
+ cmd = [_SYSTEMCTL.cmd, "--no-pager", "list-unit-files"]
+ rc, out, err = execCmd(cmd)
+ if rc != 0:
+ return (rc, out, err)
+ lines = out.splitlines()
+ for line in lines:
+ if srvName + ".service" == line.split(" ", 1):
+ return systemctlFun(srvName)
+ return (1, "", "%s is not native systemctl service")
+ return wrapper
+
+ @_systemctlNative
+ def _systemctlStart(srvName):
+ cmd = [_SYSTEMCTL.cmd, "start", srvName]
+ return execCmd(cmd)
+
+ @_systemctlNative
+ def _systemctlStop(srvName):
+ cmd = [_SYSTEMCTL.cmd, "stop", srvName]
+ return execCmd(cmd)
+
+ @_systemctlNative
+ def _systemctlStatus(srvName):
+ cmd = [_SYSTEMCTL.cmd, "status", srvName]
+ return execCmd(cmd)
+
+ @_systemctlNative
+ def _systemctlRestart(srvName):
+ cmd = [_SYSTEMCTL.cmd, "restart", srvName]
+ return execCmd(cmd)
+
+ @_systemctlNative
+ def _systemctlDisable(srvName):
+ cmd = [_SYSTEMCTL.cmd, "disable", srvName]
+ return execCmd(cmd)
+
+ _srvStartAlts.append(_systemctlStart)
+ _srvStopAlts.append(_systemctlStop)
+ _srvStatusAlts.append(_systemctlStatus)
+ _srvRestartAlts.append(_systemctlRestart)
+ _srvDisableAlts.append(_systemctlDisable)
+
+
+def _isStopped(message):
+ stopRegex = r"\Wstopped\W|\Wstop\W|\Wwaiting\W|\Wnot running\W"
+ return re.search(stopRegex, message, re.MULTILINE) is not None
+
+try:
+ _INITCTL.cmd
+except OSError:
+ pass
+else:
+ def _initctlStart(srvName):
+ cmd = [_INITCTL.cmd, "start", srvName]
+ return execCmd(cmd)
+
+ def _initctlStop(srvName):
+ cmd = [_INITCTL.cmd, "stop", srvName]
+ return execCmd(cmd)
+
+ def _initctlStatus(srvName):
+ cmd = [_INITCTL.cmd, "status", srvName]
+ rc, out, err = execCmd(cmd)
+ if rc == 0:
+ # initctl rc is 0 even though the service is stopped
+ rc = _isStopped(out)
+ return (rc, out, err)
+
+ def _initctlRestart(srvName):
+ cmd = [_INITCTL.cmd, "restart", srvName]
+ return execCmd(cmd)
+
+ def _initctlDisable(srvName):
+ if not os.path.isfile("/etc/init/%s.conf" % srvName):
+ return 1, "", ""
+ with open("/etc/init/%s.override" % srvName, "a") as f:
+ f.write("manual\n")
+ return 0, "", ""
+
+ _srvStartAlts.append(_initctlStart)
+ _srvStopAlts.append(_initctlStop)
+ _srvStatusAlts.append(_initctlStatus)
+ _srvRestartAlts.append(_initctlRestart)
+ _srvDisableAlts.append(_initctlDisable)
+
+
+try:
+ _SERVICE.cmd
+except OSError:
+ pass
+else:
+ def _serviceStart(srvName):
+ cmd = [_SERVICE.cmd, srvName, "start"]
+ return execCmd(cmd)
+
+ def _serviceStop(srvName):
+ cmd = [_SERVICE.cmd, srvName, "stop"]
+ return execCmd(cmd)
+
+ def _serviceStatus(srvName):
+ cmd = [_SERVICE.cmd, srvName, "status"]
+ rc, out, err = execCmd(cmd)
+ if rc == 0:
+ # certain service rc is 0 even though the service is stopped
+ rc = _isStopped(out)
+ return (rc, out, err)
+
+ def _serviceRestart(srvName):
+ cmd = [_SERVICE.cmd, srvName, "restart"]
+ return execCmd(cmd)
+
+ _srvStartAlts.append(_serviceStart)
+ _srvStopAlts.append(_serviceStop)
+ _srvRestartAlts.append(_serviceRestart)
+ _srvStatusAlts.append(_serviceStatus)
+
+
+try:
+ _CHKCONFIG.cmd
+except OSError:
+ pass
+else:
+ def _chkconfigDisable(srvName):
+ cmd = [_CHKCONFIG.cmd, srvName, "off"]
+ return execCmd(cmd)
+
+ _srvDisableAlts.append(_chkconfigDisable)
+
+
+try:
+ _UPDATERC.cmd
+except OSError:
+ pass
+else:
+ def _updatercDisable(srvName):
+ cmd = [_UPDATERC.cmd, srvName, "disable"]
+ return execCmd(cmd)
+
+ _srvDisableAlts.append(_updatercDisable)
+
+
+def _runAlts(alts, *args, **kwarg):
+ errors = {}
+ for alt in alts:
+ try:
+ rc, out, err = alt(*args, **kwarg)
+ except Exception as e:
+ errors[alt.func_name] = e
+ else:
+ if rc == 0:
+ return
+ else:
+ errors[alt.func_name] = (rc, out, err)
+ raise RuntimeError("Tried all alternatives but failed:\n%s" % errors)
+
+
+ at expose("service_start")
+def service_start(srvName):
+ """
+ Start a system service
+ """
+ _runAlts(_srvStartAlts, srvName)
+ return 0
+
+
+ at expose("service_stop")
+def service_stop(srvName):
+ """
+ Stop a system service
+ """
+ _runAlts(_srvStopAlts, srvName)
+ return 0
+
+
+ at expose("service_status")
+def service_status(srvName):
+ """
+ Get status of a system service
+ """
+ _runAlts(_srvStatusAlts, srvName)
+ return 0
+
+
+ at expose("service_restart")
+def service_restart(srvName):
+ """
+ Get status of a system service
+ """
+ _runAlts(_srvRestartAlts, srvName)
+ return 0
+
+
+ at expose("service_disable")
+def service_disable(srvName):
+ """
+ Disable a system service
+ """
+ _runAlts(_srvDisableAlts, srvName)
+ return 0
diff --git a/vdsm.spec.in b/vdsm.spec.in
index da2546f..4350140 100644
--- a/vdsm.spec.in
+++ b/vdsm.spec.in
@@ -900,6 +900,7 @@
%endif
%{python_sitearch}/%{vdsm_name}/tool/passwd.py*
%{python_sitearch}/%{vdsm_name}/tool/seboolsetup.py*
+%{python_sitearch}/%{vdsm_name}/tool/service.py*
%{python_sitearch}/%{vdsm_name}/tool/validate_ovirt_certs.py*
%files tests
--
To view, visit http://gerrit.ovirt.org/13701
To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Idd1cbcf5fd00bb1ec73c5970be012e294b3b4c55
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Zhou Zheng Sheng <zhshzhou at linux.vnet.ibm.com>
More information about the vdsm-patches
mailing list