Update sysvinit function to support ubuntu
In ubuntu system, we can't find 'chkconfig' command, it use "update-rc.d" or "sysv-rc-conf" for instead. _handle_sysv_command function will pick up the right command to enable service for ubuntu or fedora or redhat, and also map systemd to _handle_sysv_command and remove _handle_systemd_command. Change-Id: I5b7ceb7541e989f6b11fc1a5acf94275c1d2e75b Closes-Bug: #1318481
This commit is contained in:
parent
cd39c89a80
commit
0fab4170ff
|
@ -643,37 +643,47 @@ class ServicesHandler(object):
|
|||
self.hooks = hooks
|
||||
|
||||
def _handle_sysv_command(self, service, command):
|
||||
service_exe = "/sbin/service"
|
||||
enable_exe = "/sbin/chkconfig"
|
||||
cmd = ""
|
||||
if "enable" == command:
|
||||
cmd = "%s %s on" % (enable_exe, service)
|
||||
elif "disable" == command:
|
||||
cmd = "%s %s off" % (enable_exe, service)
|
||||
elif "start" == command:
|
||||
cmd = "%s %s start" % (service_exe, service)
|
||||
elif "stop" == command:
|
||||
cmd = "%s %s stop" % (service_exe, service)
|
||||
elif "status" == command:
|
||||
cmd = "%s %s status" % (service_exe, service)
|
||||
command = CommandRunner(cmd)
|
||||
command.run()
|
||||
return command
|
||||
if os.path.exists("/bin/systemctl"):
|
||||
service_exe = "/bin/systemctl"
|
||||
service = '%s.service' % service
|
||||
service_start = '%s start %s'
|
||||
service_status = '%s status %s'
|
||||
service_stop = '%s stop %s'
|
||||
elif os.path.exists("/sbin/service"):
|
||||
service_exe = "/sbin/service"
|
||||
service_start = '%s %s start'
|
||||
service_status = '%s %s status'
|
||||
service_stop = '%s %s stop'
|
||||
else:
|
||||
service_exe = "/usr/sbin/service"
|
||||
service_start = '%s %s start'
|
||||
service_status = '%s %s status'
|
||||
service_stop = '%s %s stop'
|
||||
|
||||
if os.path.exists("/bin/systemctl"):
|
||||
enable_exe = "/bin/systemctl"
|
||||
enable_on = '%s enable %s'
|
||||
enable_off = '%s disable %s'
|
||||
elif os.path.exists("/sbin/chkconfig"):
|
||||
enable_exe = "/sbin/chkconfig"
|
||||
enable_on = '%s %s on'
|
||||
enable_off = '%s %s off'
|
||||
else:
|
||||
enable_exe = "/usr/sbin/update-rc.d"
|
||||
enable_on = '%s %s enable'
|
||||
enable_off = '%s %s disable'
|
||||
|
||||
def _handle_systemd_command(self, service, command):
|
||||
exe = "/bin/systemctl"
|
||||
cmd = ""
|
||||
service = '%s.service' % service
|
||||
if "enable" == command:
|
||||
cmd = "%s enable %s" % (exe, service)
|
||||
cmd = enable_on % (enable_exe, service)
|
||||
elif "disable" == command:
|
||||
cmd = "%s disable %s" % (exe, service)
|
||||
cmd = enable_off % (enable_exe, service)
|
||||
elif "start" == command:
|
||||
cmd = "%s start %s" % (exe, service)
|
||||
cmd = service_start % (service_exe, service)
|
||||
elif "stop" == command:
|
||||
cmd = "%s stop %s" % (exe, service)
|
||||
cmd = service_stop % (service_exe, service)
|
||||
elif "status" == command:
|
||||
cmd = "%s status %s" % (exe, service)
|
||||
cmd = service_status % (service_exe, service)
|
||||
command = CommandRunner(cmd)
|
||||
command.run()
|
||||
return command
|
||||
|
@ -725,7 +735,7 @@ class ServicesHandler(object):
|
|||
# map of function pointers to various service handlers
|
||||
_service_handlers = {
|
||||
"sysvinit": _handle_sysv_command,
|
||||
"systemd": _handle_systemd_command
|
||||
"systemd": _handle_sysv_command
|
||||
}
|
||||
|
||||
def _service_handler(self, manager_name):
|
||||
|
|
|
@ -129,6 +129,8 @@ class TestPackages(MockPopenTestCase):
|
|||
class TestServicesHandler(MockPopenTestCase):
|
||||
|
||||
def test_services_handler_systemd(self):
|
||||
self.m.StubOutWithMock(os.path, 'exists')
|
||||
os.path.exists('/bin/systemctl').MultipleTimes().AndReturn(True)
|
||||
# apply_services
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/bin/systemctl enable httpd.service']
|
||||
|
@ -205,6 +207,8 @@ class TestServicesHandler(MockPopenTestCase):
|
|||
self.m.VerifyAll()
|
||||
|
||||
def test_services_handler_systemd_disabled(self):
|
||||
self.m.StubOutWithMock(os.path, 'exists')
|
||||
os.path.exists('/bin/systemctl').MultipleTimes().AndReturn(True)
|
||||
# apply_services
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/bin/systemctl disable httpd.service']
|
||||
|
@ -246,7 +250,11 @@ class TestServicesHandler(MockPopenTestCase):
|
|||
|
||||
self.m.VerifyAll()
|
||||
|
||||
def test_services_handler_sysv(self):
|
||||
def test_services_handler_sysv_service_chkconfig(self):
|
||||
self.m.StubOutWithMock(os.path, 'exists')
|
||||
os.path.exists('/bin/systemctl').MultipleTimes().AndReturn(False)
|
||||
os.path.exists('/sbin/service').MultipleTimes().AndReturn(True)
|
||||
os.path.exists('/sbin/chkconfig').MultipleTimes().AndReturn(True)
|
||||
# apply_services
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/sbin/chkconfig httpd on']
|
||||
|
@ -257,15 +265,6 @@ class TestServicesHandler(MockPopenTestCase):
|
|||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/sbin/service httpd start']
|
||||
).AndReturn(FakePOpen())
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/sbin/chkconfig mysqld on']
|
||||
).AndReturn(FakePOpen())
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/sbin/service mysqld status']
|
||||
).AndReturn(FakePOpen(returncode=-1))
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/sbin/service mysqld start']
|
||||
).AndReturn(FakePOpen())
|
||||
|
||||
# monitor_services not running
|
||||
self.mock_cmd_run(
|
||||
|
@ -277,30 +276,16 @@ class TestServicesHandler(MockPopenTestCase):
|
|||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/bin/services_restarted']
|
||||
).AndReturn(FakePOpen())
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/sbin/service mysqld status']
|
||||
).AndReturn(FakePOpen(returncode=-1))
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/sbin/service mysqld start']
|
||||
).AndReturn(FakePOpen())
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/bin/services_restarted']
|
||||
).AndReturn(FakePOpen())
|
||||
|
||||
# monitor_services running
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/sbin/service httpd status']
|
||||
).AndReturn(FakePOpen())
|
||||
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/sbin/service mysqld status']
|
||||
).AndReturn(FakePOpen())
|
||||
|
||||
self.m.ReplayAll()
|
||||
|
||||
services = {
|
||||
"sysvinit": {
|
||||
"mysqld": {"enabled": "true", "ensureRunning": "true"},
|
||||
"httpd": {"enabled": "true", "ensureRunning": "true"}
|
||||
}
|
||||
}
|
||||
|
@ -322,7 +307,11 @@ class TestServicesHandler(MockPopenTestCase):
|
|||
|
||||
self.m.VerifyAll()
|
||||
|
||||
def test_services_handler_sysv_disabled(self):
|
||||
def test_services_handler_sysv_disabled_service_chkconfig(self):
|
||||
self.m.StubOutWithMock(os.path, 'exists')
|
||||
os.path.exists('/bin/systemctl').MultipleTimes().AndReturn(False)
|
||||
os.path.exists('/sbin/service').MultipleTimes().AndReturn(True)
|
||||
os.path.exists('/sbin/chkconfig').MultipleTimes().AndReturn(True)
|
||||
# apply_services
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/sbin/chkconfig httpd off']
|
||||
|
@ -333,21 +322,193 @@ class TestServicesHandler(MockPopenTestCase):
|
|||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/sbin/service httpd stop']
|
||||
).AndReturn(FakePOpen())
|
||||
|
||||
self.m.ReplayAll()
|
||||
|
||||
services = {
|
||||
"sysvinit": {
|
||||
"httpd": {"enabled": "false", "ensureRunning": "false"}
|
||||
}
|
||||
}
|
||||
hooks = [
|
||||
cfn_helper.Hook(
|
||||
'hook1',
|
||||
'service.restarted',
|
||||
'Resources.resource1.Metadata',
|
||||
'root',
|
||||
'/bin/services_restarted')
|
||||
]
|
||||
sh = cfn_helper.ServicesHandler(services, 'resource1', hooks)
|
||||
sh.apply_services()
|
||||
|
||||
self.m.VerifyAll()
|
||||
|
||||
def test_services_handler_sysv_systemctl(self):
|
||||
self.m.StubOutWithMock(os.path, 'exists')
|
||||
os.path.exists('/bin/systemctl').MultipleTimes().AndReturn(True)
|
||||
# apply_services
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/sbin/chkconfig mysqld off']
|
||||
['su', 'root', '-c', '/bin/systemctl enable httpd.service']
|
||||
).AndReturn(FakePOpen())
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/sbin/service mysqld status']
|
||||
['su', 'root', '-c', '/bin/systemctl status httpd.service']
|
||||
).AndReturn(FakePOpen(returncode=-1))
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/bin/systemctl start httpd.service']
|
||||
).AndReturn(FakePOpen())
|
||||
|
||||
# monitor_services not running
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/bin/systemctl status httpd.service']
|
||||
).AndReturn(FakePOpen(returncode=-1))
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/bin/systemctl start httpd.service']
|
||||
).AndReturn(FakePOpen())
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/sbin/service mysqld stop']
|
||||
['su', 'root', '-c', '/bin/services_restarted']
|
||||
).AndReturn(FakePOpen())
|
||||
|
||||
# monitor_services running
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/bin/systemctl status httpd.service']
|
||||
).AndReturn(FakePOpen())
|
||||
|
||||
self.m.ReplayAll()
|
||||
|
||||
services = {
|
||||
"sysvinit": {
|
||||
"httpd": {"enabled": "true", "ensureRunning": "true"}
|
||||
}
|
||||
}
|
||||
hooks = [
|
||||
cfn_helper.Hook(
|
||||
'hook1',
|
||||
'service.restarted',
|
||||
'Resources.resource1.Metadata',
|
||||
'root',
|
||||
'/bin/services_restarted')
|
||||
]
|
||||
sh = cfn_helper.ServicesHandler(services, 'resource1', hooks)
|
||||
sh.apply_services()
|
||||
# services not running
|
||||
sh.monitor_services()
|
||||
|
||||
# services running
|
||||
sh.monitor_services()
|
||||
|
||||
self.m.VerifyAll()
|
||||
|
||||
def test_services_handler_sysv_disabled_systemctl(self):
|
||||
self.m.StubOutWithMock(os.path, 'exists')
|
||||
os.path.exists('/bin/systemctl').MultipleTimes().AndReturn(True)
|
||||
# apply_services
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/bin/systemctl disable httpd.service']
|
||||
).AndReturn(FakePOpen())
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/bin/systemctl status httpd.service']
|
||||
).AndReturn(FakePOpen())
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/bin/systemctl stop httpd.service']
|
||||
).AndReturn(FakePOpen())
|
||||
|
||||
self.m.ReplayAll()
|
||||
|
||||
services = {
|
||||
"sysvinit": {
|
||||
"httpd": {"enabled": "false", "ensureRunning": "false"}
|
||||
}
|
||||
}
|
||||
hooks = [
|
||||
cfn_helper.Hook(
|
||||
'hook1',
|
||||
'service.restarted',
|
||||
'Resources.resource1.Metadata',
|
||||
'root',
|
||||
'/bin/services_restarted')
|
||||
]
|
||||
sh = cfn_helper.ServicesHandler(services, 'resource1', hooks)
|
||||
sh.apply_services()
|
||||
|
||||
self.m.VerifyAll()
|
||||
|
||||
def test_services_handler_sysv_service_updaterc(self):
|
||||
self.m.StubOutWithMock(os.path, 'exists')
|
||||
os.path.exists('/bin/systemctl').MultipleTimes().AndReturn(False)
|
||||
os.path.exists('/sbin/service').MultipleTimes().AndReturn(False)
|
||||
os.path.exists('/sbin/chkconfig').MultipleTimes().AndReturn(False)
|
||||
# apply_services
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/usr/sbin/update-rc.d httpd enable']
|
||||
).AndReturn(FakePOpen())
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/usr/sbin/service httpd status']
|
||||
).AndReturn(FakePOpen(returncode=-1))
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/usr/sbin/service httpd start']
|
||||
).AndReturn(FakePOpen())
|
||||
|
||||
# monitor_services not running
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/usr/sbin/service httpd status']
|
||||
).AndReturn(FakePOpen(returncode=-1))
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/usr/sbin/service httpd start']
|
||||
).AndReturn(FakePOpen())
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/bin/services_restarted']
|
||||
).AndReturn(FakePOpen())
|
||||
|
||||
# monitor_services running
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/usr/sbin/service httpd status']
|
||||
).AndReturn(FakePOpen())
|
||||
|
||||
self.m.ReplayAll()
|
||||
|
||||
services = {
|
||||
"sysvinit": {
|
||||
"httpd": {"enabled": "true", "ensureRunning": "true"}
|
||||
}
|
||||
}
|
||||
hooks = [
|
||||
cfn_helper.Hook(
|
||||
'hook1',
|
||||
'service.restarted',
|
||||
'Resources.resource1.Metadata',
|
||||
'root',
|
||||
'/bin/services_restarted')
|
||||
]
|
||||
sh = cfn_helper.ServicesHandler(services, 'resource1', hooks)
|
||||
sh.apply_services()
|
||||
# services not running
|
||||
sh.monitor_services()
|
||||
|
||||
# services running
|
||||
sh.monitor_services()
|
||||
|
||||
self.m.VerifyAll()
|
||||
|
||||
def test_services_handler_sysv_disabled_service_updaterc(self):
|
||||
self.m.StubOutWithMock(os.path, 'exists')
|
||||
os.path.exists('/bin/systemctl').MultipleTimes().AndReturn(False)
|
||||
os.path.exists('/sbin/service').MultipleTimes().AndReturn(False)
|
||||
os.path.exists('/sbin/chkconfig').MultipleTimes().AndReturn(False)
|
||||
# apply_services
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/usr/sbin/update-rc.d httpd disable']
|
||||
).AndReturn(FakePOpen())
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/usr/sbin/service httpd status']
|
||||
).AndReturn(FakePOpen())
|
||||
self.mock_cmd_run(
|
||||
['su', 'root', '-c', '/usr/sbin/service httpd stop']
|
||||
).AndReturn(FakePOpen())
|
||||
|
||||
self.m.ReplayAll()
|
||||
|
||||
services = {
|
||||
"sysvinit": {
|
||||
"mysqld": {"enabled": "false", "ensureRunning": "false"},
|
||||
"httpd": {"enabled": "false", "ensureRunning": "false"}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue