resq/utils/apns_sender/new_sender.py

90 lines
2.2 KiB
Python

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()