from daemonize import Daemonize from apns import APNs, Frame, Payload import redis import time import signal import sys import os import logging import socket import ssl import struct import binascii def sigint_handler(signal, frame): sys.exit(0) os._exit(0) def redisLoop(apns, logger): r = redis.StrictRedis(host='localhost', port=6379, db=0) while 1: #logger.info("Checking queue for messages to send...") time.sleep(0) data = r.brpop("apns_push", 10) if data: info = data[1].split('|') logger.info("Token: " + info[0] + " message: " + info[1]) try: apns.sendNotification(info[0], info[1], "notification") except TypeError: logger.info("Invalid token: " + info[0]) def sigint_handler(signal, frame): sys.exit(0) def get_logger(): logger = logging.getLogger("apns_logger") logger.setLevel(logging.INFO) fh = logging.FileHandler("/tmp/apns_sender.log") fmt = '%(asctime)s - %(threadName)s - %(levelname)s - %(message)s' formatter = logging.Formatter(fmt) fh.setFormatter(formatter) logger.addHandler(fh) return logger class APNSClient(): def __init__(self, title, cert_file, logger): self.title = title self.cert_file = cert_file self.logger = logger # connect self.apns = APNs(cert_file=self.cert_file) def sendNotification(self, token, body, notif_type): # apns packet alert = {"title" : self.title, "body" : body, "type" : notif_type} payload = Payload(alert=alert, sound="default", badge=1, content_available=True) self.apns.gateway_server.send_notification(token, payload) def main(): logger = get_logger() logger.info("Starting apns_sender") #apns = APNs(use_sandbox=False, cert_file=cert_file) #apns = setup_apns() # TODO: load from config file cert_file = "/root/ios_push_test/ios_prod.pem" apns = APNSClient("Motolite Res-q", cert_file, logger) logger.info("Starting redis loop") redisLoop(apns, logger) signal.signal(signal.SIGINT, sigint_handler) pid = "/tmp/apns_sender.pid" #daemon = Daemonize(app="apns_sender", pid=pid, action=main) #daemon.start() main()