Last month I needed to install runit in some servers to supervise a couple of services. Unfortunately my management interface cannot handle the services anymore, so I decided to write a small module in python to solve this handicap, and that is the result!.
With this module you can handle in python environment a number of runit scripts. I think that this might be work for daemontools too, but I do not test yet. Let’s see an example 😀
>>> import supervise >>> c = supervise.Service("/var/service/httpd") >>> print s.status() {'action': None, 'status': 0, 'uptime': 300L, 'pid': None} >>> if s.status()['status'] == supervise.STATUS_DOWN: print "service down" service down >>> s.start() >>> if s.status()['status'] == supervise.STATUS_UP: print "service up" service up
Personally I use this module with rpyc library to manage remotely the services running in a host, but it too easy making a web interface, for example using bottle:
import supervise import simplejson from bottle import route, run @route('/service/status/:name') def service_status(name): """ Return a json with service status """ return simplejson.dumps( supervise.Service("/var/service/" + name).status() ) @route('/service/up/:name') def service_up(name): """ Start the service and return OK """ c = supervise.Service("/var/service/" + name) c.start() return "OK UP" @route('/service/down/:name') def service_down(name): """ Stop the service and return OK """ c = supervise.Service("/var/service/" + name) c.down() return "OK DOWN" from bottle import PasteServer run(server=PasteServer)
Now you can stop your service just only point your browser http://localhost/service/down/httpd (to down http service in this case).
Enjoy!
Just FYI: this script is not as-is compatible with djb-flavor daemontools: runit appears to have extended the format of the supervise status struct by two bytes, and this script will fail when reading the 18-byte djb version. The fix is, obviously, pretty straightforward. 🙂
This is an incredibly useful tool however, and I’d hate for it to be lost if pastebin has an outage. Would you mind if I threw a copy up on github? And do you have a license that you would prefer to distribute this under?
Oh crap! That’s true… It’s not DJB compatible
I’ll update the script shortly.
About the link, indeed I already had a version in github (I’ve updated the link in the article), but of course you can post any new version or modification. I usually post these snips licensed as MIT, I hope that’s fine for any pourpose.
Enjoy! 🙂
Hm, the new gist link is to your uschedule handler. 🙂
Really? I don’t think so 😉
FYI: The uschedule handler is, of course, also MIT licensed.