Example #1
0
 def getAgent(self, bc, prot, userid, passwd):
     ma = ManageAgent(bc.dbconn, bc.cacheconn)
     if ma.resolveProtocol(prot) != userid:
         return False
     x = ma.verifyAgent(userid, passwd)
     if x['code'] == agent.AGST_FOUND:
         return x['agent']
     return False
Example #2
0
 def web_trx(self, agent_id, product, msisdn, pin):
     bc = AgentNotifier()
     ma = ManageAgent(bc.dbconn, bc.cacheconn)
     hlrmap = HLRMap(bc.dbconn, bc.cacheconn)
     x = ma.verifyAgent(agent_id, '1234', True, False)
     if x['code'] in (agent.AGST_NOTFOUND, agent.AGST_NOTACTIVE):
         return json.dumps({'success': 0, 'reason': 'Agent not registered / not active'})
     prod_c = DBCache(const.PRODUCT_PREFIX, config.DEFAULT_EXPIRE,
                          const.PRODUCT_SQL)
     prod = prod_c.get(bc.dbconn, bc.cacheconn, product)
     if not prod:
         return json.dumps({'success': 0, 'reason': 'Invalid product id'})
     msisdn = sanitizeMSISDN(msisdn)
     method = firstMethod(hlrmap, prod, msisdn)
     tran_id = self.topup(bc, x['agent'], msisdn, prod, method)
     return json.dumps({'success': 1, 'reason': '', 'tranid': tran_id})
Example #3
0
class TopupParser(ProcessNotifyIn):
    def __init__(self):
        super(TopupParser, self).__init__('UNKN', 'INVL', 'TopupParser')
        self.agent_manager = ManageAgent(self.dbconn, self.cacheconn)
        self.dm = DepositMutation(5, self.dbconn, self.cacheconn)
        self.um = UnitMutation(5, self.dbconn, self.cacheconn)
        self.hlrmap = HLRMap(self.dbconn, self.cacheconn)
        cdf = config.DEFAULT_EXPIRE
        self.c_product = DBCache(const.PRODUCT_PREFIX, cdf, const.PRODUCT_SQL)
        self.c_price = DBCache(const.AGENTPRICE_PREFIX, cdf, const.AGENTPRICE_SQL)
        self.c_operator = DBCache(const.OPERATOR_PREFIX, cdf, const.OPERATOR_SQL,
                                  user_func={'prefix': lambda x: x.split(',')})
        map(lambda x: x.setConn(self.dbconn, self.cacheconn), [
                self.c_product,
                self.c_price,
                self.c_operator,
            ])
        self.rx_check, self.rx_topup, self.rx_separator = (None, None, None)
        self._init2()
        self.log = mylogger('TopupParser', 'topupparser.log')
        self.to_db = []
        self.parsed = []
        self.handler = [
                self.check,
            ]
        self.processUNKN = self.process
    
    def _init2(self):
        c = self.dbconn.cursor(MySQLdb.cursors.DictCursor)
        c.execute('SELECT `regex`,`separator` from `parse` where `name`=' \
                  '"topup" LIMIT 1')
        tmp = c.fetchone()
        self.rx_topup, self.rx_separator = tmp['regex'], tmp['separator']
        c.execute('SELECT `regex` from `parse` where `name`=' \
                  '"initial_check" LIMIT 1')
        tmp = c.fetchone()
        self.rx_check = tmp['regex']
        c.close()
    
    def check(self, r, tmp):
        def timeDifference(t):
            tmp = datetime.now() - datetime.strptime(t, '%y/%m/%d %H:%M:%S')
            if tmp.days >= 0:
                return tmp.seconds
            else:
                return -tmp.seconds
        
        parse_obj = re.match(self.rx_check, r['parameters'], re.IGNORECASE)
        if not parse_obj:
            return True
        parse_result = parse_obj.groupdict()
        if timeDifference(parse_result['time_sent']) > \
                    config.REQUEST_VALID_PERIOD:
            raise Timeout(self, r, tmp)
        prot = parse_result['protocol']
        agent_id = self.agent_manager.resolveProtocol(prot)
        if not agent_id:
            self.writeNotifyOut(prot, 'agent_invalid')
            print 'AGST_NOTFOUND {0}'.format(prot)
            return True
        ag = self.agent_manager.verifyAgent(agent_id, 'xxxx')
        if ag['code'] == AGST_NOTFOUND or ag['code'] == AGST_NOTACTIVE:
            self.writeNotifyOut(prot, 'agent_invalid')
            print 'Reject non-active agent {0}'.format(agent_id)
            return True
        x = self.cmdList()
        _, _, _, _, msg = r['parameters'].split(',', 4)
        for c in x:
            cmd, _, _ = msg.partition(x[c])
            if cmd.upper() == c:
                raise UNMS(self, r, tmp)
        parse_obj = re.match(self.rx_topup, r['parameters'], re.IGNORECASE)
        if not parse_obj:
            raise UNMS(self, r, tmp)
        parse_result = parse_obj.groupdict()
        try:
            self._topup(r['id'], agent_id, parse_result)
        except Error, e:
            if e.msg == AGST_NOTFOUND:
                self.writeNotifyOut(prot, 'agent_invalid')
            elif e.msg == AGST_NOTACTIVE:
                self.writeNotifyOut(prot, 'agent_invalid')
            elif e.msg == AGST_WRONGPIN:
                self.writeNotifyOut(prot, 'wrong_pin')
            elif e.msg == WRONG_REQ_FORMAT:
                self.writeNotifyOut(prot, 'wrong_req_format')
        finally: