Add uberspace supervisord support
This commit is contained in:
		
							
								
								
									
										18
									
								
								bundles/uberspace-supervisord/items.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								bundles/uberspace-supervisord/items.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| uberspaceify = repo.libs.uberspace.Uberspaceify(node) | ||||
|  | ||||
| directories = uberspaceify.directories({ | ||||
|     f'/home/{node.username}/etc/services.d': { | ||||
|         "purge": True, | ||||
|         "triggers": [ | ||||
|             "action:supervisord-reread", | ||||
|         ], | ||||
|     }, | ||||
| }) | ||||
|  | ||||
| actions["supervisord-reread"] = { | ||||
|     "command": "supervisorctl reread", | ||||
|     "triggered": True, | ||||
|     "needed_by": [ | ||||
|         "svc_uberspace_supervisord:", | ||||
|     ], | ||||
| } | ||||
							
								
								
									
										80
									
								
								items/svc_uberspace_supervisord.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								items/svc_uberspace_supervisord.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| from shlex import quote | ||||
|  | ||||
| from bundlewrap.exceptions import BundleError | ||||
| from bundlewrap.items import Item | ||||
|  | ||||
|  | ||||
| def svc_start(node, svcname): | ||||
|     return node.run("supervisorctl start {}".format(quote(svcname)), may_fail=True) | ||||
|  | ||||
| def svc_running(node, svcname): | ||||
|     result = node.run("supervisorctl status {}".format(quote(svcname)), may_fail=True) | ||||
|     return result.return_code == 0 | ||||
|  | ||||
| def svc_stop(node, svcname): | ||||
|     return node.run("supervisorctl stop {}".format(quote(svcname)), may_fail=True) | ||||
|  | ||||
|  | ||||
| class SvcSystemd(Item): | ||||
|     """ | ||||
|     A service managed by supervisord in uberspace. | ||||
|     """ | ||||
|     BUNDLE_ATTRIBUTE_NAME = "svc_uberspace_supervisord" | ||||
|     ITEM_ATTRIBUTES = { | ||||
|         'running': True, | ||||
|     } | ||||
|     ITEM_TYPE_NAME = "svc_uberspace_supervisord" | ||||
|  | ||||
|     def __repr__(self): | ||||
|         return "<SvcUberspaceSupervisord name:{} running:{}>".format( | ||||
|             self.name, | ||||
|             self.attributes['running'], | ||||
|         ) | ||||
|  | ||||
|     def cdict(self): | ||||
|         cdict = {} | ||||
|         for option, value in self.attributes.items(): | ||||
|             if value is not None: | ||||
|                 cdict[option] = value | ||||
|         return cdict | ||||
|  | ||||
|     def fix(self, status): | ||||
|         if 'running' in status.keys_to_fix: | ||||
|             if self.attributes['running']: | ||||
|                 svc_start(self.node, self.name) | ||||
|             else: | ||||
|                 svc_stop(self.node, self.name) | ||||
|  | ||||
|     def get_canned_actions(self): | ||||
|         return { | ||||
|             'stop': { | ||||
|                 'command': "supervisorctl stop {}".format(self.name), | ||||
|                 'needed_by': {self.id}, | ||||
|             }, | ||||
|             'restart': { | ||||
|                 'command': "supervisorctl restart {}".format(self.name), | ||||
|                 'needs': {self.id}, | ||||
|             }, | ||||
|             'update': { | ||||
|                 'command': "supervisorctl update {}".format(self.name), | ||||
|                 'needs': {self.id}, | ||||
|             }, | ||||
|         } | ||||
|  | ||||
|     def sdict(self): | ||||
|         return { | ||||
|             'running': svc_running(self.node, self.name), | ||||
|         } | ||||
|  | ||||
|     @classmethod | ||||
|     def validate_attributes(cls, bundle, item_id, attributes): | ||||
|         for attribute in ('running'): | ||||
|             if attributes.get(attribute, None) not in (True, False, None): | ||||
|                 raise BundleError(_( | ||||
|                     "expected boolean or None for '{attribute}' on {item} in bundle '{bundle}'" | ||||
|                 ).format( | ||||
|                     attribute=attribute, | ||||
|                     bundle=bundle.name, | ||||
|                     item=item_id, | ||||
|                 )) | ||||
|  | ||||
		Reference in New Issue
	
	Block a user