From 16e8783bdd51302521ef37202f115dbec64a32ff Mon Sep 17 00:00:00 2001 From: Gordon Messmer Date: Tue, 24 Feb 2015 15:04:33 -0800 Subject: Improve systemd module so that it resembles more mature modules. --- src/lib/Bcfg2/Client/Tools/Systemd.py | 58 +++++++++++++++++++++++++++-------- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/src/lib/Bcfg2/Client/Tools/Systemd.py b/src/lib/Bcfg2/Client/Tools/Systemd.py index 3b60c8285..58574f241 100644 --- a/src/lib/Bcfg2/Client/Tools/Systemd.py +++ b/src/lib/Bcfg2/Client/Tools/Systemd.py @@ -26,31 +26,63 @@ class Systemd(Bcfg2.Client.Tools.SvcTool): def get_svc_command(self, service, action): return "/bin/systemctl %s %s" % (action, self.get_svc_name(service)) + def verify_bootstatus(self, entry, bootstatus): + """Verify bootstatus for entry.""" + cmd = self.get_svc_command(entry, 'is-enabled') + rv = self.cmd.run(cmd) + + if rv.stdout.strip() == 'enabled': + return bootstatus == 'on' + else: + return bootstatus == 'off' + def VerifyService(self, entry, _): """Verify Service status for entry.""" - if entry.get('status') == 'ignore': + entry.set('target_status', entry.get('status')) # for reporting + + bootstatus = self.get_bootstatus(entry) + if bootstatus is None: + # bootstatus is unspecified and status is ignore return True - cmd = "/bin/systemctl status %s" % (self.get_svc_name(entry)) - rv = self.cmd.run(cmd) + current_bootstatus = self.verify_bootstatus(entry, bootstatus) + if entry.get('status') == 'ignore': + return current_bootstatus - if 'Loaded: error' in rv.stdout: - entry.set('current_status', 'off') - return False - elif 'Active: active' in rv.stdout: + cmd = self.get_svc_command(entry, 'show') + ' -p ActiveState' + rv = self.cmd.run(cmd) + if rv.stdout.strip() in ('ActiveState=active', 'ActiveState=activating', + 'ActiveState=reloading'): entry.set('current_status', 'on') - return entry.get('status') == 'on' + return entry.get('status') == 'on' and current_bootstatus else: entry.set('current_status', 'off') - return entry.get('status') == 'off' + return entry.get('status') == 'off' and current_bootstatus def InstallService(self, entry): """Install Service entry.""" - if entry.get('status') == 'on': + self.logger.info("Installing Service %s" % (entry.get('name'))) + bootstatus = self.get_bootstatus(entry) + if bootstatus is None: + # bootstatus is unspecified and status is ignore + return True + + if bootstatus == 'on': rv = self.cmd.run(self.get_svc_command(entry, 'enable')).success - rv &= self.cmd.run(self.get_svc_command(entry, 'start')).success else: - rv = self.cmd.run(self.get_svc_command(entry, 'stop')).success - rv &= self.cmd.run(self.get_svc_command(entry, 'disable')).success + rv = self.cmd.run(self.get_svc_command(entry, 'disable')).success + + if Bcfg2.Options.setup.servicemode == 'disabled': + # 'disabled' means we don't attempt to modify running svcs + return rv + elif Bcfg2.Options.setup.servicemode == 'build': + # 'build' means we attempt to stop all services started + if entry.get('current_status') == 'on': + rv &= self.cmd.run(self.get_svc_command(entry, 'stop')).success + else: + if entry.get('status') == 'on': + rv &= self.cmd.run(self.get_svc_command(entry, 'start')).success + else: + rv &= self.cmd.run(self.get_svc_command(entry, 'stop')).success return rv -- cgit v1.2.3-1-g7c22 From 3201e1d55b3c2d8552981c3810479852358edc3f Mon Sep 17 00:00:00 2001 From: Gordon Messmer Date: Thu, 26 Feb 2015 18:13:22 -0800 Subject: Fix long lines and additional changes for readability. --- src/lib/Bcfg2/Client/Tools/Systemd.py | 50 +++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/src/lib/Bcfg2/Client/Tools/Systemd.py b/src/lib/Bcfg2/Client/Tools/Systemd.py index 58574f241..462e07194 100644 --- a/src/lib/Bcfg2/Client/Tools/Systemd.py +++ b/src/lib/Bcfg2/Client/Tools/Systemd.py @@ -26,16 +26,6 @@ class Systemd(Bcfg2.Client.Tools.SvcTool): def get_svc_command(self, service, action): return "/bin/systemctl %s %s" % (action, self.get_svc_name(service)) - def verify_bootstatus(self, entry, bootstatus): - """Verify bootstatus for entry.""" - cmd = self.get_svc_command(entry, 'is-enabled') - rv = self.cmd.run(cmd) - - if rv.stdout.strip() == 'enabled': - return bootstatus == 'on' - else: - return bootstatus == 'off' - def VerifyService(self, entry, _): """Verify Service status for entry.""" entry.set('target_status', entry.get('status')) # for reporting @@ -45,19 +35,24 @@ class Systemd(Bcfg2.Client.Tools.SvcTool): # bootstatus is unspecified and status is ignore return True - current_bootstatus = self.verify_bootstatus(entry, bootstatus) + if self.cmd.run(self.get_svc_command(entry, 'is-enabled')): + current_bootstatus = 'on' + else: + current_bootstatus = 'off' + if entry.get('status') == 'ignore': - return current_bootstatus + return current_bootstatus == bootstatus cmd = self.get_svc_command(entry, 'show') + ' -p ActiveState' rv = self.cmd.run(cmd) if rv.stdout.strip() in ('ActiveState=active', 'ActiveState=activating', 'ActiveState=reloading'): - entry.set('current_status', 'on') - return entry.get('status') == 'on' and current_bootstatus + current_status = 'on' else: - entry.set('current_status', 'off') - return entry.get('status') == 'off' and current_bootstatus + current_status = 'off' + entry.set('current_status', current_status) + return (entry.get('status') == current_status and + bootstatus == current_bootstatus) def InstallService(self, entry): """Install Service entry.""" @@ -67,22 +62,31 @@ class Systemd(Bcfg2.Client.Tools.SvcTool): # bootstatus is unspecified and status is ignore return True + # Enable or disable the service if bootstatus == 'on': - rv = self.cmd.run(self.get_svc_command(entry, 'enable')).success + cmd = self.get_svc_command(entry, 'enable') else: - rv = self.cmd.run(self.get_svc_command(entry, 'disable')).success + cmd = self.get_svc_command(entry, 'disable') + if not self.cmd.run(cmd).success: + # Return failure immediately and do not start/stop the service. + return False + # Start or stop the service, depending on the current servicemode + cmd = None if Bcfg2.Options.setup.servicemode == 'disabled': # 'disabled' means we don't attempt to modify running svcs - return rv + pass elif Bcfg2.Options.setup.servicemode == 'build': # 'build' means we attempt to stop all services started if entry.get('current_status') == 'on': - rv &= self.cmd.run(self.get_svc_command(entry, 'stop')).success + cmd = self.get_svc_command(entry, 'stop') else: if entry.get('status') == 'on': - rv &= self.cmd.run(self.get_svc_command(entry, 'start')).success + cmd = self.get_svc_command(entry, 'start') else: - rv &= self.cmd.run(self.get_svc_command(entry, 'stop')).success + cmd = self.get_svc_command(entry, 'stop') - return rv + if cmd: + return self.cmd.run(cmd).success + else: + return True \ No newline at end of file -- cgit v1.2.3-1-g7c22 From 1085f508668547c22c03b04013c90cb1d5bcf5a9 Mon Sep 17 00:00:00 2001 From: Gordon Messmer Date: Fri, 27 Feb 2015 09:38:36 -0800 Subject: Add newline to fix test suite. --- src/lib/Bcfg2/Client/Tools/Systemd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/Bcfg2/Client/Tools/Systemd.py b/src/lib/Bcfg2/Client/Tools/Systemd.py index 462e07194..29b5c07d3 100644 --- a/src/lib/Bcfg2/Client/Tools/Systemd.py +++ b/src/lib/Bcfg2/Client/Tools/Systemd.py @@ -89,4 +89,4 @@ class Systemd(Bcfg2.Client.Tools.SvcTool): if cmd: return self.cmd.run(cmd).success else: - return True \ No newline at end of file + return True -- cgit v1.2.3-1-g7c22 From 173acdf16e3fd526eef5073381a1bb59ee4474cb Mon Sep 17 00:00:00 2001 From: Gordon Messmer Date: Fri, 27 Feb 2015 10:19:16 -0800 Subject: Fix long line for test suite. --- src/lib/Bcfg2/Client/Tools/Systemd.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/Bcfg2/Client/Tools/Systemd.py b/src/lib/Bcfg2/Client/Tools/Systemd.py index 29b5c07d3..f7e5b1b0b 100644 --- a/src/lib/Bcfg2/Client/Tools/Systemd.py +++ b/src/lib/Bcfg2/Client/Tools/Systemd.py @@ -45,7 +45,8 @@ class Systemd(Bcfg2.Client.Tools.SvcTool): cmd = self.get_svc_command(entry, 'show') + ' -p ActiveState' rv = self.cmd.run(cmd) - if rv.stdout.strip() in ('ActiveState=active', 'ActiveState=activating', + if rv.stdout.strip() in ('ActiveState=active', + 'ActiveState=activating', 'ActiveState=reloading'): current_status = 'on' else: -- cgit v1.2.3-1-g7c22