90 lines
2.2 KiB
Python
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()
|