Subversion Repositories SmartDukaan

Rev

Rev 12871 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

from shop2020.clients.HelperClient import HelperClient
from shop2020.clients.TransactionClient import TransactionClient
from shop2020.thriftpy.utils.ttypes import UserSms, UserSmsInfo
from shop2020.thriftpy.utils.ttypes import SmsStatus, SmsType, SmsDeliveryStatus
from shop2020.utils.daemon import Daemon
import optparse
import sched
import sys
import time
import os
import urllib
import urllib2

class SmsSender(Daemon):
    def __init__(self, logfile='/var/log/utils/smssender/smssender.log', pidfile='/var/run/sms-sender.pid', count = 0):
        Daemon.__init__(self, pidfile, stdout=logfile, stderr=logfile)
        print 'SmsSender initiated at', time.time()
        self.sms_schedular = sched.scheduler(time.time, time.sleep)
        self.time_to_sleep = 600
        self.count = count
        self.exceptionCount = {}
        
    def sendSms(self, userSmsList):
        listSmsSentToOperator = []
        for sms in userSmsList:
            try:
                mobileNo = sms.mobileNumber
                smsText = sms.smsText
                #'This is a test sms, please ignore the same.'
                url_params = { 'ani' : mobileNo,  'uname' : 'srlsaholic', 'passwd' : 'sr18mar' , 'cli' : 'SMSSDL', 'message' : smsText }
                encoded_url_params = urllib.urlencode(url_params)
                url = 'http://125.19.68.54:8085/SMSGateway/sendingSMS?' + encoded_url_params
                print url
                req = urllib2.Request(url)
                response = urllib2.urlopen(req)
                response_str = response.read()
                print response_str
                if "Message sent successfully to " in response_str:
                    response_str_vals = response_str.split('#')
                    userSms = UserSms()
                    userSms.id= userSms.id
                    userSms.user_id = userSms.user_id
                    userSms.mobileNumber = userSms.mobileNumber
                    userSms.attempts = userSms.attempts
                    userSms.createdTimestamp = userSms.createdTimstamp
                    userSms.smsText = userSms.smsText
                    userSms.status = userSms.status
                    userSms.type = userSms.type
                    userSms.responseId = response_str_vals[1]
                    userSms.responseText = response_str_vals[2]
                    userSms.deliveryStatus = SmsDeliveryStatus.SENT_TO_OPERATOR
                    listSmsSentToOperator.append(userSms)
            except Exception as e:
                print sys.exc_info()[0]
                print e
                print 'Error occurred sending sms with id - ' + str(sms.id)
                if self.exceptionCount.has_key(sms.id) :
                    self.exceptionCount[sms.id] = self.exceptionCount[sms.id] + 1
                else :
                    self.exceptionCount[sms.id] = 1
                continue
        
        helperServiceClient = HelperClient()
        helper_client = helperServiceClient.get_client()
        marked = helper_client.markMessagesAsSentToOperator(listSmsSentToOperator)
        
        if marked:
            print 'Messages sent successfully to Operator'
            return "success"
        else:
            return "error"
        
    def send(self):
        
        if self.count > 10:
            print str(self.count)
            print "Number of failed attempts is more than 10. Exiting"
            sys.exit()
            
        for smsId in self.exceptionCount.keys() :
            if self.exceptionCount[smsId] > 10:
                print "Number of exceptions for sms id : " + str(smsId) + " is : " + str(self.exceptionCount[smsId]) + ". Exiting"
                sys.exit()
        
        print "Despatch stared at ", time.time()
        helperServiceClient = HelperClient()
        helper_client = helperServiceClient.get_client()
        
        listSmsToGetDeliveryInfo = helper_client.listSmsToGetDeliveryInfo()
        
        listSmsMarkedAsSubmittedToSmsc = []
        listSmsMarkedAsSent = []
        listSmsMarkedAsRetry = []
        
        for userSms in listSmsToGetDeliveryInfo:
            del_det_params = {'uname' : 'srlsaholic', 'passwd' : 'sr18mar' , 'messageid' : userSms.responseId}
            encoded_del_det_params = urllib.urlencode(del_det_params)
            del_det_url = 'http://103.15.179.45:8085/SMSGateway/getApiReport?' + encoded_del_det_params
            del_req = urllib2.Request(del_det_url)
            del_response = urllib2.urlopen(del_req)
            del_response_str = del_response.read()
            
            del_response_vals = del_response_str.split(' ')
            
            if "Submitted to SMSC" in del_response_str:
                sms = UserSms()
                sms.id= userSms.id
                sms.user_id = userSms.user_id
                sms.mobileNumber = userSms.mobileNumber
                sms.attempts = userSms.attempts
                sms.createdTimestamp = userSms.createdTimstamp
                sms.smsText = userSms.smsText
                sms.status = userSms.status
                sms.type = userSms.type
                sms.responseId = del_response_vals[1]
                sms.responseText = del_response_vals[2]
                sms.deliveryStatus = SmsDeliveryStatus.SUBMITTED_TO_SMSC
                listSmsMarkedAsSubmittedToSmsc.append(sms)
                
            elif len(del_response_vals) == 8:
                if del_response_vals[7][:-2] == '000' :
                    sms = UserSms()
                    sms.id= userSms.id
                    sms.user_id = userSms.user_id
                    sms.mobileNumber = userSms.mobileNumber
                    sms.attempts = userSms.attempts
                    sms.createdTimestamp = userSms.createdTimstamp
                    sms.smsText = userSms.smsText
                    sms.status = SmsStatus.DELIVERED
                    sms.type = userSms.type
                    sms.responseId = del_response_vals[1]
                    sms.responseText = "Status Code: " +del_response_vals[7][:-2]+" Status: "+ del_response_vals[5]
                    sms.deliveryStatus = SmsDeliveryStatus.GOT_STATUS_CODE
                    listSmsMarkedAsSent.append(sms)
                    
                elif del_response_vals[7][:-2] in ('004', '006', '100' ):
                    sms = UserSms()
                    sms.id= userSms.id
                    sms.user_id = userSms.user_id
                    sms.mobileNumber = userSms.mobileNumber
                    sms.attempts = userSms.attempts
                    sms.createdTimestamp = userSms.createdTimstamp
                    sms.smsText = userSms.smsText
                    sms.status = SmsStatus.UNDELIVERED
                    sms.type = userSms.type
                    sms.responseId = del_response_vals[1]
                    sms.responseText = "Status Code: " +del_response_vals[7][:-2]+" Status: "+ del_response_vals[5]
                    sms.deliveryStatus = SmsDeliveryStatus.GOT_STATUS_CODE
                    listSmsMarkedAsSent.append(sms)
                    
                elif del_response_vals[7][:-2] in ('001', '007'):
                    sms = UserSms()
                    sms.id= userSms.id
                    sms.user_id = userSms.user_id
                    sms.mobileNumber = userSms.mobileNumber
                    sms.attempts = userSms.attempts
                    sms.createdTimestamp = userSms.createdTimstamp
                    sms.smsText = userSms.smsText
                    sms.status = SmsStatus.INVALID_NUMBER
                    sms.type = userSms.type
                    sms.responseId = del_response_vals[1]
                    sms.responseText = "Status Code: " +del_response_vals[7][:-2]+" Status: "+ del_response_vals[5]
                    sms.deliveryStatus = SmsDeliveryStatus.GOT_STATUS_CODE
                    listSmsMarkedAsSent.append(sms)
                
                elif del_response_vals[7][:-2] == '002':
                    sms = UserSms()
                    sms.id= userSms.id
                    sms.user_id = userSms.user_id
                    sms.mobileNumber = userSms.mobileNumber
                    sms.attempts = userSms.attempts
                    sms.createdTimestamp = userSms.createdTimstamp
                    sms.smsText = userSms.smsText
                    sms.status = SmsStatus.USER_ABSENT
                    sms.type = userSms.type
                    sms.responseId = del_response_vals[1]
                    sms.responseText = "Status Code: " +del_response_vals[7][:-2]+" Status: "+ del_response_vals[5]
                    sms.deliveryStatus = SmsDeliveryStatus.GOT_STATUS_CODE
                    listSmsMarkedAsRetry.append(sms)
                
                elif del_response_vals[7][:-2] == '003':
                    sms = UserSms()
                    sms.id= userSms.id
                    sms.user_id = userSms.user_id
                    sms.mobileNumber = userSms.mobileNumber
                    sms.attempts = userSms.attempts
                    sms.createdTimestamp = userSms.createdTimstamp
                    sms.smsText = userSms.smsText
                    sms.status = SmsStatus.MEMORY_FULL
                    sms.type = userSms.type
                    sms.responseId = del_response_vals[1]
                    sms.responseText = "Status Code: " +del_response_vals[7][:-2]+" Status: "+ del_response_vals[5]
                    sms.deliveryStatus = SmsDeliveryStatus.GOT_STATUS_CODE
                    listSmsMarkedAsRetry.append(sms)
                    
                elif del_response_vals[7][:-2] == '005':
                    sms = UserSms()
                    sms.id= userSms.id
                    sms.user_id = userSms.user_id
                    sms.mobileNumber = userSms.mobileNumber
                    sms.attempts = userSms.attempts
                    sms.createdTimestamp = userSms.createdTimstamp
                    sms.smsText = userSms.smsText
                    sms.status = SmsStatus.SERVICE_ERROR
                    sms.type = userSms.type
                    sms.responseId = del_response_vals[1]
                    sms.responseText = "Status Code: " +del_response_vals[7][:-2]+" Status: "+ del_response_vals[5]
                    sms.deliveryStatus = SmsDeliveryStatus.GOT_STATUS_CODE
                    listSmsMarkedAsRetry.append(sms)
                
                elif del_response_vals[7][:-2] == '009':
                    sms = UserSms()
                    sms.id= userSms.id
                    sms.user_id = userSms.user_id
                    sms.mobileNumber = userSms.mobileNumber
                    sms.attempts = userSms.attempts
                    sms.createdTimestamp = userSms.createdTimstamp
                    sms.smsText = userSms.smsText
                    sms.status = SmsStatus.NDLC_FAIL
                    sms.type = userSms.type
                    sms.responseId = del_response_vals[1]
                    sms.responseText = "Status Code: " +del_response_vals[7][:-2]+" Status: "+ del_response_vals[5]
                    sms.deliveryStatus = SmsDeliveryStatus.GOT_STATUS_CODE
                    listSmsMarkedAsSent.append(sms)
                    
            elif "No message submitted with MessageID" in del_response_str:
                sms = UserSms()
                sms.id= userSms.id
                sms.user_id = userSms.user_id
                sms.mobileNumber = userSms.mobileNumber
                sms.attempts = userSms.attempts
                sms.createdTimestamp = userSms.createdTimstamp
                sms.smsText = userSms.smsText
                sms.status = SmsStatus.UNDELIVERED
                sms.type = userSms.type
                sms.responseId = del_response_vals[1]
                sms.responseText = "Status Code: " +del_response_vals[7][:-2]+" Status: "+ del_response_vals[5]
                sms.deliveryStatus = SmsDeliveryStatus.GOT_STATUS_CODE
                listSmsMarkedAsSent.append(sms)
            
            else:
                sms = UserSms()
                sms.id= userSms.id
                sms.user_id = userSms.user_id
                sms.mobileNumber = userSms.mobileNumber
                sms.attempts = userSms.attempts
                sms.createdTimestamp = userSms.createdTimstamp
                sms.smsText = userSms.smsText
                sms.status = SmsStatus.UNDELIVERED
                sms.type = userSms.type
                sms.responseId = del_response_vals[1]
                sms.responseText = "Status Code: " +del_response_vals[7][:-2]+" Status: "+ del_response_vals[5]
                sms.deliveryStatus = SmsDeliveryStatus.GOT_STATUS_CODE
                listSmsMarkedAsSent.append(sms)
            
        if len(listSmsMarkedAsSubmittedToSmsc) > 0:
            if not helper_client.isAlive() :
                helper_client = helperServiceClient.get_client()
            
            markedSmsc =helper_client.markMessagesAsSubmittedToSmsc(listSmsMarkedAsSubmittedToSmsc)
            if markedSmsc:
                print 'Sms marked submitted to SMSC successfully'
            else:
                print 'Sms marked submitted to SMSC failed'
        
        time.sleep(5)
        
        if len(listSmsMarkedAsSent) > 0:
            if not helper_client.isAlive() :
                helper_client = helperServiceClient.get_client()
                
            markedSent = helper_client.markMessagesAsSent(listSmsMarkedAsSent)
            
            if markedSent:
                print 'Sms marked Sent successfully'
            else:
                print 'Sms marked Sent failed'
        
        time.sleep(5)
        
        if len(listSmsMarkedAsRetry) > 0:
            if not helper_client.isAlive() :
                helper_client = helperServiceClient.get_client()
            
            markedRetry = helper_client.markMessagesAsRetry(listSmsMarkedAsRetry)
            if markedRetry:
                print 'Sms marked Retry successfully'
            else:
                print 'Sms marked Retry failed'
        
        time.sleep(5)
        
        if not helper_client.isAlive() :
            helper_client = helperServiceClient.get_client()
        
        sms_to_be_dispatched = helper_client.getSmsToBeSent()        
        
        print len(sms_to_be_dispatched)
        send_result = "error"
        try:
            send_result = self.sendSms(sms_to_be_dispatched)
        except Exception as e:
            if send_result in ("error" ) :
                print 'Marked Sms sent to Operator Failed '
                self.count = self.count + 1
            pass
        self.sms_schedular.enter(self.time_to_sleep, 1, self.send, ())
                
        
        
    def run(self):
        self.sms_schedular.enter(self.time_to_sleep, 1, self.send, ())
        self.sms_schedular.run()
        
if __name__ == "__main__":
    parser = optparse.OptionParser()
    parser.add_option("-l", "--logfile", dest="logfile",
                      type="string",
                      help="Log all output to LOG_FILE",
                      )
    parser.add_option("-i", "--pidfile", dest="pidfile",
                      type="string",
                      help="Write the PID to pidfile")
    (options, args) = parser.parse_args()
    daemon = SmsSender(options.logfile, options.pidfile, 0)
    if len(args) == 0:
        daemon.run()
    elif len(args) == 1:
        if 'start' == args[0]:
            daemon.start()
        elif 'stop' == args[0]:
            daemon.stop()
        elif 'restart' == args[0]:
            daemon.restart()
        else:
            print "Unknown command"
            sys.exit(2)
        sys.exit(0)
    else:
        print "usage: %s start|stop|restart" % sys.argv[0]
        sys.exit(2)