Subversion Repositories SmartDukaan

Rev

Rev 22768 | 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
import datetime

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', datetime.datetime.now()
        self.sms_schedular = sched.scheduler(time.time, time.sleep)
        self.time_to_sleep = 60
        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' : '91'+str(mobileNo),  'uname' : 'srlsaholic', 'passwd' : 'sr18mar' , 'cli' : 'SAHOLC', 'message' : smsText }
                url_params = { 'Mobile' : '91'+mobileNo,  'Username' : 'srlsaholic', 'Password' : 'sr18mar' , 'MessageType' : 'txt', 'SenderID' : 'SMTDKN', 'Message' : smsText }
                encoded_url_params = urllib.urlencode(url_params)
                url = 'http://103.15.179.45:8085/MessagingGateway/SendTransSMS?' + encoded_url_params
                print url
                req = urllib2.Request(url)
                response = urllib2.urlopen(req)
                response_str = response.read()
                print response_str
                if "SMS Sent successfully to " in response_str:
                    response_str_vals = response_str.split('#')
                    userSms = UserSms()
                    userSms.id= sms.id
                    userSms.user_id = sms.user_id
                    userSms.mobileNumber = sms.mobileNumber
                    userSms.attempts = sms.attempts
                    userSms.createdTimestamp = sms.createdTimestamp
                    userSms.smsText = sms.smsText
                    userSms.status = sms.status
                    userSms.type = sms.type
                    userSms.responseId = response_str_vals[0]
                    userSms.responseText = response_str_vals[1]
                    userSms.deliveryStatus = SmsDeliveryStatus.SENT_TO_OPERATOR
                    listSmsSentToOperator.append(userSms)
                
                if "Please use valid 10 digit mobile number" in response_str:
                    userSms = UserSms()
                    userSms.id= sms.id
                    userSms.user_id = sms.user_id
                    userSms.mobileNumber = sms.mobileNumber
                    userSms.attempts = sms.attempts
                    userSms.createdTimestamp = sms.createdTimestamp
                    userSms.smsText = sms.smsText
                    userSms.status = SmsStatus.INVALID_NUMBER
                    userSms.type = sms.type
                    userSms.responseId = "No_Response"
                    userSms.responseText = response_str
                    userSms.deliveryStatus = SmsDeliveryStatus.SENT_TO_OPERATOR
                    listSmsSentToOperator.append(userSms)
                    
                if "Invalid Mobile number" in response_str:
                    userSms = UserSms()
                    userSms.id= sms.id
                    userSms.user_id = sms.user_id
                    userSms.mobileNumber = sms.mobileNumber
                    userSms.attempts = sms.attempts
                    userSms.createdTimestamp = sms.createdTimestamp
                    userSms.smsText = sms.smsText
                    userSms.status = SmsStatus.INVALID_NUMBER
                    userSms.type = sms.type
                    userSms.responseId = "No_Response"
                    userSms.responseText = response_str
                    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()
        print "listSmsSentToOperator {0}".format(listSmsSentToOperator)
        marked = helper_client.markMessagesAsSentToOperator(listSmsSentToOperator)
        
        if marked:
            print 'Messages sent successfully to Operator'
            return "success"
        else:
            return "error"
        
    def send(self):
        
        if self.count > 100:
            print str(self.count)
            print "Number of failed attempts is more than 100. Exiting"
            #sys.exit()
            
        for smsId in self.exceptionCount.keys() :
            if self.exceptionCount[smsId] > 100:
                print "Number of exceptions for sms id : " + str(smsId) + " is : " + str(self.exceptionCount[smsId]) + ". Exiting"
                #sys.exit()
        
        print "Despatch stared at ", datetime.datetime.now()
        helperServiceClient = HelperClient()
        helper_client = helperServiceClient.get_client()
        
        listSmsToGetDeliveryInfo = helper_client.listSmsToGetDeliveryInfo()
        
        listSmsMarkedAsSubmittedToSmsc = []
        listSmsMarkedAsSent = []
        listSmsMarkedAsRetry = []
        
        for userSms in listSmsToGetDeliveryInfo:
            if userSms.responseId == "No_Response":
                sms = UserSms()
                sms.id= userSms.id
                sms.user_id = userSms.user_id
                sms.mobileNumber = userSms.mobileNumber
                sms.attempts = userSms.attempts
                sms.createdTimestamp = userSms.createdTimestamp
                sms.smsText = userSms.smsText
                sms.status = SmsStatus.INVALID_NUMBER
                sms.type = userSms.type
                sms.responseId = "No_Response"
                sms.responseText = userSms.responseText
                sms.deliveryStatus = SmsDeliveryStatus.GOT_STATUS_CODE
                listSmsMarkedAsSent.append(sms)
                continue
            
            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
            print "Delivery Report Url-",del_det_url
            try:
                del_req = urllib2.Request(del_det_url)
                del_response = urllib2.urlopen(del_req)
                del_response_str = del_response.read()
            except Exception as e:
                continue
            
            print del_response_str
            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.createdTimestamp
                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] == '0' :
                    sms = UserSms()
                    sms.id= userSms.id
                    sms.user_id = userSms.user_id
                    sms.mobileNumber = userSms.mobileNumber
                    sms.attempts = userSms.attempts
                    sms.createdTimestamp = userSms.createdTimestamp
                    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 ('4', '6', '100' ):
                    sms = UserSms()
                    sms.id= userSms.id
                    sms.user_id = userSms.user_id
                    sms.mobileNumber = userSms.mobileNumber
                    sms.attempts = userSms.attempts
                    sms.createdTimestamp = userSms.createdTimestamp
                    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 ('1', '7'):
                    sms = UserSms()
                    sms.id= userSms.id
                    sms.user_id = userSms.user_id
                    sms.mobileNumber = userSms.mobileNumber
                    sms.attempts = userSms.attempts
                    sms.createdTimestamp = userSms.createdTimestamp
                    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] == '2':
                    sms = UserSms()
                    sms.id= userSms.id
                    sms.user_id = userSms.user_id
                    sms.mobileNumber = userSms.mobileNumber
                    sms.attempts = userSms.attempts+1
                    sms.createdTimestamp = userSms.createdTimestamp
                    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] == '3':
                    sms = UserSms()
                    sms.id= userSms.id
                    sms.user_id = userSms.user_id
                    sms.mobileNumber = userSms.mobileNumber
                    sms.attempts = userSms.attempts+1
                    sms.createdTimestamp = userSms.createdTimestamp
                    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] == '5':
                    sms = UserSms()
                    sms.id= userSms.id
                    sms.user_id = userSms.user_id
                    sms.mobileNumber = userSms.mobileNumber
                    sms.attempts = userSms.attempts+1
                    sms.createdTimestamp = userSms.createdTimestamp
                    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] == '9':
                    sms = UserSms()
                    sms.id= userSms.id
                    sms.user_id = userSms.user_id
                    sms.mobileNumber = userSms.mobileNumber
                    sms.attempts = userSms.attempts
                    sms.createdTimestamp = userSms.createdTimestamp
                    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 del_response_vals[7][:-2] in ('549', '550'):
                    sms = UserSms()
                    sms.id= userSms.id
                    sms.user_id = userSms.user_id
                    sms.mobileNumber = userSms.mobileNumber
                    sms.attempts = userSms.attempts
                    sms.createdTimestamp = userSms.createdTimestamp
                    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] == '155':
                    sms = UserSms()
                    sms.id= userSms.id
                    sms.user_id = userSms.user_id
                    sms.mobileNumber = userSms.mobileNumber
                    sms.attempts = userSms.attempts
                    sms.createdTimestamp = userSms.createdTimestamp
                    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.createdTimestamp
                    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 "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.createdTimestamp
                sms.smsText = userSms.smsText
                sms.status = SmsStatus.UNDELIVERED
                sms.type = userSms.type
                sms.responseId = userSms.responseId
                sms.responseText = del_response_str
                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.createdTimestamp
                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)