diff --git a/utils/rider_location_cache/daemon.py b/utils/rider_location_cache/daemon.py new file mode 100644 index 00000000..f371720d --- /dev/null +++ b/utils/rider_location_cache/daemon.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python + +import sys, os, time, atexit +from signal import SIGTERM + +class Daemon: + """ + A generic daemon class. + + Usage: subclass the Daemon class and override the run() method + """ + def __init__(self, pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): + self.stdin = stdin + self.stdout = stdout + self.stderr = stderr + self.pidfile = pidfile + + def daemonize(self): + """ + do the UNIX double-fork magic, see Stevens' "Advanced + Programming in the UNIX Environment" for details (ISBN 0201563177) + http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16 + """ + try: + pid = os.fork() + if pid > 0: + # exit first parent + sys.exit(0) + except OSError, e: + sys.stderr.write("fork #1 failed: %d (%s)\n" % (e.errno, e.strerror)) + sys.exit(1) + + # decouple from parent environment + os.chdir("/") + os.setsid() + os.umask(0) + + # do second fork + try: + pid = os.fork() + if pid > 0: + # exit from second parent + sys.exit(0) + except OSError, e: + sys.stderr.write("fork #2 failed: %d (%s)\n" % (e.errno, e.strerror)) + sys.exit(1) + + # redirect standard file descriptors + sys.stdout.flush() + sys.stderr.flush() + si = file(self.stdin, 'r') + so = file(self.stdout, 'a+') + se = file(self.stderr, 'a+', 0) + os.dup2(si.fileno(), sys.stdin.fileno()) + os.dup2(so.fileno(), sys.stdout.fileno()) + os.dup2(se.fileno(), sys.stderr.fileno()) + + # write pidfile + atexit.register(self.delpid) + pid = str(os.getpid()) + file(self.pidfile,'w+').write("%s\n" % pid) + + def delpid(self): + os.remove(self.pidfile) + + def start(self): + """ + Start the daemon + """ + # Check for a pidfile to see if the daemon already runs + try: + pf = file(self.pidfile,'r') + pid = int(pf.read().strip()) + pf.close() + except IOError: + pid = None + + if pid: + message = "pidfile %s already exist. Daemon already running?\n" + sys.stderr.write(message % self.pidfile) + sys.exit(1) + + # Start the daemon + self.daemonize() + self.run() + + def stop(self): + """ + Stop the daemon + """ + # Get the pid from the pidfile + try: + pf = file(self.pidfile,'r') + pid = int(pf.read().strip()) + pf.close() + except IOError: + pid = None + + if not pid: + message = "pidfile %s does not exist. Daemon not running?\n" + sys.stderr.write(message % self.pidfile) + return # not an error in a restart + + # Try killing the daemon process + try: + while 1: + os.kill(pid, SIGTERM) + time.sleep(0.1) + except OSError, err: + err = str(err) + if err.find("No such process") > 0: + if os.path.exists(self.pidfile): + os.remove(self.pidfile) + else: + print str(err) + sys.exit(1) + + def restart(self): + """ + Restart the daemon + """ + self.stop() + self.start() + + def run(self): + """ + You should override this method when you subclass Daemon. It will be called after the process has been + daemonized by start() or restart(). + """ diff --git a/utils/rider_location_cache/daemon.pyc b/utils/rider_location_cache/daemon.pyc new file mode 100644 index 00000000..51504185 Binary files /dev/null and b/utils/rider_location_cache/daemon.pyc differ diff --git a/utils/rider_location_cache/rider_location_cache.py b/utils/rider_location_cache/rider_location_cache.py index d1a3de15..e96cba0e 100644 --- a/utils/rider_location_cache/rider_location_cache.py +++ b/utils/rider_location_cache/rider_location_cache.py @@ -1,6 +1,7 @@ import paho.mqtt.client as mqtt import ssl from threading import Thread +from daemon import Daemon import redis import time import signal @@ -8,6 +9,34 @@ import sys import os import json +class RiderLocationCache(object): + + def run(self): + global client, redis_conn + client = mqtt.Client() + client.on_connect = on_connect + # client.on_publish = on_publish + client.on_message = on_message + + redis_conn = redis.StrictRedis(host='localhost', port=6379, db=0) + + #client.tls_set( + # "/etc/letsencrypt/live/resqaws.jankstudio.com/fullchain.pem", cert_reqs=ssl.CERT_NONE, + # tls_version=ssl.PROTOCOL_TLSv1) + #client.tls_set( + # "/root/aws_ssl_keys/fullchain.pem", cert_reqs=ssl.CERT_NONE, + # tls_version=ssl.PROTOCOL_TLSv1) + #client.connect("resqaws.jankstudio.com", 8883, 60) + client.connect("localhost", 1883, 60) + + #t = Thread(target=getRedis, args=(1,)) + + #t.start() + + #signal.signal(signal.SIGINT, sigint_handler) + client.loop_forever() + + def init_subscriptions(client): print "subscribing to wildcard" client.subscribe('#') @@ -60,29 +89,3 @@ def sigint_handler(signal, frame): print 'Interrupted' sys.exit(0) - - -client = mqtt.Client() -client.on_connect = on_connect -# client.on_publish = on_publish -client.on_message = on_message - -redis_conn = redis.StrictRedis(host='localhost', port=6379, db=0) - - -#client.tls_set( -# "/etc/letsencrypt/live/resqaws.jankstudio.com/fullchain.pem", cert_reqs=ssl.CERT_NONE, -# tls_version=ssl.PROTOCOL_TLSv1) -#client.tls_set( -# "/root/aws_ssl_keys/fullchain.pem", cert_reqs=ssl.CERT_NONE, -# tls_version=ssl.PROTOCOL_TLSv1) -#client.connect("resqaws.jankstudio.com", 8883, 60) -client.connect("localhost", 1883, 60) - - -#t = Thread(target=getRedis, args=(1,)) - -#t.start() - -#signal.signal(signal.SIGINT, sigint_handler) -client.loop_forever() diff --git a/utils/rider_location_cache/rider_location_daemon.py b/utils/rider_location_cache/rider_location_daemon.py new file mode 100644 index 00000000..6889628f --- /dev/null +++ b/utils/rider_location_cache/rider_location_daemon.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +import sys +import time +from daemon import Daemon +import rider_location_cache + +class RiderLocationDaemon(Daemon): + def run(self): + print "mogol in daemon" + rider_location = rider_location_cache.RiderLocationCache() + rider_location.run() + +if __name__ == "__main__": + daemon = RiderLocationDaemon('/tmp/rider_location_daemon.pid') + if len(sys.argv) == 2: + if 'start' == sys.argv[1]: + daemon.start() + elif 'stop' == sys.argv[1]: + daemon.stop() + elif 'restart' == sys.argv[1]: + daemon.restart() + elif 'foreground' == sys.argv[1]: + daemon.run() + else: + print "Unknown command" + sys.exit(2) + sys.exit(0) + else: + print "usage: %s start|stop|restart" % sys.argv[0] + sys.exit(2)