def recv_once(self): frame = self.socket_client.recv() ID = frame.ID log(title='CMPP2_RECEIVE_FRAME_%s_%s_%s' % (self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode(), Cmpp2FrameHandler.ID_TO_NAME[frame.ID]), content=frame.ID == 0x00000005 and [frame.__dict__, frame.status_report.__dict__] or frame.__dict__, logger='sms', level='debug') if ID == CMPP2_TERMINATE.ID: terminate = frame terminate_resp = CMPP2_TERMINATE_RESP() self.send_queue_put(terminate_resp, terminate) elif ID == CMPP2_DELIVER.ID: deliver = frame deliver_resp = self.recv_sms(frame) self.send_queue_put(deliver_resp, deliver) elif ID == CMPP2_ACTIVE_TEST: active_test = frame active_test_resp = CMPP2_ACTIVE_TEST_RESP() active_test_resp.reserve = 0 self.send_queue_put(active_test_resp, active_test) elif ID == CMPP2_TERMINATE_RESP.ID: self.socket_client.close() raise Cmpp2TerminateException('TERMINATE') elif ID == CMPP2_SUBMIT_RESP.ID: cmpp_submit_resp = CMPP2_SUBMIT_RESP cmpp_submit_resp = frame sequence_Id = cmpp_submit_resp.sequence_Id msg = self.commit_resp_wait_list_get(sequence_Id) if msg: if cmpp_submit_resp.result == 8: self.commit_queue.put( (msg.get('sms_obj'), False)) # True 一次重发 else: msg['msg_id'] = cmpp_submit_resp.msg_id msg['result'] = cmpp_submit_resp.result self.handler.sms_ack(self, msg) else: log(title='CMPP2_SUBMIT_RESP_MATCH_NO_SEQID_%s_%s' % (self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode()), content=frame.ID == 0x00000005 and [frame.__dict__, frame.status_report.__dict__] or frame.__dict__, logger='sms', level='debug') elif ID in (CMPP2_CONNECT.ID, CMPP2_CONNECT_RESP.ID, CMPP2_SUBMIT.ID, CMPP2_DELIVER_RESP.ID, CMPP2_QUERY.ID, CMPP2_QUERY_RESP.ID, CMPP2_CANCEL.ID, CMPP2_CANCEL_RESP.ID, CMPP2_ACTIVE_TEST_RESP.ID): pass else: raise Cmpp2UnknownCommandIDException("bad id = 0x%08x" % ID) return frame
def decorator(*args, **kwargs): try: return function(*args, **kwargs) except: log(title='SMS_EXCEPTION', content=[function, args, kwargs], logger='sms', level='error')
def exec_func(self, func, *args, **kwargs): try: return func(*args, **kwargs) except: log(title='WORKER_EXCEPTION', content=[func, args, kwargs], logger='sms', level='error') return func(*args, **kwargs)
def decorator(*args, **kwargs): try: return function(*args, **kwargs) except: log( title='SMS_EXCEPTION', content=[function, args, kwargs], logger='sms', level='error' )
def exec_func(self, func, *args, **kwargs): try: return func(*args, **kwargs) except: log( title='WORKER_EXCEPTION', content=[func, args, kwargs], logger='sms', level='error' ) return func(*args, **kwargs)
def commit_resp_wait_list_put(self, seq_id, msg): try: self.commit_resp_wait_list[seq_id] = msg except Exception, _e: log( title='CMPP2_COMMIT_RESP_WAIT_LIST_PUT_ERROR_%s_%s' % ( self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode()), content={'msg': [seq_id, msg], 'wait_list': self.commit_resp_wait_list}, logger='sms', level='error' )
def load_cls(path): try: if path not in Factory.class_dict: Factory.class_dict[path] = load_cls(path) return Factory.class_dict[path] except: log(title='LOAD_CLS_EXCEPTION_%s' % path, content=None, logger='sms', level='error') return None
def commit_resp_wait_list_get(self, seq_id, raise_error=True): try: return self.commit_resp_wait_list.pop(seq_id) except Exception, _e: if raise_error: log( title='CMPP2_COMMIT_RESP_WAIT_LIST_GET_ERROR_%s_%s' % ( self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode()), content={'msg': [seq_id], 'wait_list': self.commit_resp_wait_list}, logger='sms', level='error' )
def start_serv(self): while self.reconnect: self.reset_environment() self.auto_connect() self.start_send_daemon() self.recv_daemon() log(title='CMPP2_SERV_CONTINUE_%s_%s_RECONNECT=%s' % (self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode(), self.reconnect), content=None, logger='sms', level='error')
def start_serv(self): while self.reconnect: self.reset_environment() self.auto_connect() self.start_send_daemon() self.recv_daemon() log( title='CMPP2_SERV_CONTINUE_%s_%s_RECONNECT=%s' % ( self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode(), self.reconnect), content=None, logger='sms', level='error' )
def commit_resp_wait_list_put(self, seq_id, msg): try: self.commit_resp_wait_list[seq_id] = msg except Exception, _e: log(title='CMPP2_COMMIT_RESP_WAIT_LIST_PUT_ERROR_%s_%s' % (self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode()), content={ 'msg': [seq_id, msg], 'wait_list': self.commit_resp_wait_list }, logger='sms', level='error')
def stop_serv(self, sleep_time=1.0): self.reconnect = False self.cmpp_terminate() sleep(sleep_time / 5) sleep(sleep_time / 5) sleep(sleep_time / 5) sleep(sleep_time / 5) sleep(sleep_time / 5) self.socket_client.close() log(title='CMPP2_STOP_SERV_%s_%s' % (self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode()), content=None, logger='sms', level='error')
def load_cls(path): try: if path not in Factory.class_dict: Factory.class_dict[path] = load_cls(path) return Factory.class_dict[path] except: log( title='LOAD_CLS_EXCEPTION_%s' % path, content=None, logger='sms', level='error' ) return None
def run(self): django_setup() import sms.serv.smstools task_loader = sms.serv.smstools.CommonSendTaskLoader() while True: try: self.cust_check() task_loader.fetch_new_task() except: log("SMS_MANAGER_ERROR", logger='sms', level='error') # traceback.print_exc() pass sleep(1)
def commit_resp_wait_list_get(self, seq_id, raise_error=True): try: return self.commit_resp_wait_list.pop(seq_id) except Exception, _e: if raise_error: log(title='CMPP2_COMMIT_RESP_WAIT_LIST_GET_ERROR_%s_%s' % (self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode()), content={ 'msg': [seq_id], 'wait_list': self.commit_resp_wait_list }, logger='sms', level='error')
def send_once(self): if self.send_queue.qsize() <= 0: self.submit_one_sms() if self.send_queue.qsize() <= 0: self.cmpp_active_test() return None frame = self.send_queue.get() log(title='CMPP2_SEND_FRAME_%s_%s_%s' % (self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode(), Cmpp2FrameHandler.ID_TO_NAME[frame.ID]), content=frame.__dict__, logger='sms', level='debug') self.socket_client.send(frame) return frame
def stop_serv(self, sleep_time=1.0): self.reconnect = False self.cmpp_terminate() sleep(sleep_time / 5) sleep(sleep_time / 5) sleep(sleep_time / 5) sleep(sleep_time / 5) sleep(sleep_time / 5) self.socket_client.close() log( title='CMPP2_STOP_SERV_%s_%s' % (self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode()), content=None, logger='sms', level='error' )
def auto_connect(self): status = -1 while self.reconnect and status != 0: try: self.socket_client.connect() status = self.cmpp_connect() except: log(title='CMPP2_AUTO_CONNECT_%s_%s' % (self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode()), content=None, logger='sms', level='error') sleep(self.reconnect_interval) self.cmpp_status = status return status
def recv_daemon(self): try: while True: self.recv_once() except: # import traceback # traceback.print_exc() pass finally: self.socket_client.close() log(title='CMPP2_SOCK_RECV_STOP_%s_%s' % (self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode()), content=None, logger='sms', level='error')
def send_once(self): if self.send_queue.qsize() <= 0: self.submit_one_sms() if self.send_queue.qsize() <= 0: self.cmpp_active_test() return None frame = self.send_queue.get() log( title='CMPP2_SEND_FRAME_%s_%s_%s' % ( self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode(), Cmpp2FrameHandler.ID_TO_NAME[frame.ID]), content=frame.__dict__, logger='sms', level='debug' ) self.socket_client.send(frame) return frame
def recv_daemon(self): try: while True: self.recv_once() except: # import traceback # traceback.print_exc() pass finally: self.socket_client.close() log( title='CMPP2_SOCK_RECV_STOP_%s_%s' % ( self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode()), content=None, logger='sms', level='error' )
def auto_connect(self): status = -1 while self.reconnect and status != 0: try: self.socket_client.connect() status = self.cmpp_connect() except: log( title='CMPP2_AUTO_CONNECT_%s_%s' % ( self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode()), content=None, logger='sms', level='error' ) sleep(self.reconnect_interval) self.cmpp_status = status return status
def send_daemon(self): sock = self.socket_client.sock try: while True: if sock != self.socket_client.sock: break if self.cmpp_status not in (0, 0.5): break self.send_once() except: self.socket_client.close() finally: log(title='CMPP2_SOCK_SEND_STOP_%s_%s' % (self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode()), content=None, logger='sms', level='error')
def send_daemon(self): sock = self.socket_client.sock try: while True: if sock != self.socket_client.sock: break if self.cmpp_status not in (0, 0.5): break self.send_once() except: self.socket_client.close() finally: log( title='CMPP2_SOCK_SEND_STOP_%s_%s' % ( self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode()), content=None, logger='sms', level='error' )
def sms_decode(self, fmt, data): try: if fmt == 0: # ascii return data.decode('ascii') elif fmt == 1: # writecard return ''.join([len(hex(ord(c))) == 3 and '0' + hex(ord(c))[2:] or hex(ord(c))[2:] for c in data]) elif fmt == 4: # bin return ''.join([len(hex(ord(c))) == 3 and '0' + hex(ord(c))[2:] or hex(ord(c))[2:] for c in data]) elif fmt == 8: return data.decode('UTF-16BE') elif fmt == 15: return data.decode('gbk') return data except: log( title='CMPP2_SMS_DECODE_%s_%s' % (fmt, base64.b64encode(data)), content=None, logger='sms', level='error' ) return ''
def send_task_prepare(task_id): task = SendTask.objects.get(id=task_id) success = False try: with transaction.atomic(): loader = TaskLoader(task) msg_count = loader.sms_size id_list = [] log('SEND_TASK_PREPARE', 'ID:%s,MSG_COUNT_ALL:%s' % (task.id, msg_count), 'celery', 'debug') count_1 = 0 while True: msg_list = loader.fetch_msg(100) if msg_list: MsgSend.objects.bulk_create(msg_list) else: break count_1 += len(msg_list) log('SEND_TASK_PREPARE', 'ID:%s,MSG_COUNT_DONE:%s' % (task.id, count_1), 'celery', 'debug') task.stat = 'pre.end' task.count = msg_count task.save() success = True except: log('SEND_TASK_PREPARE', 'ID:%s' % (task.id), 'celery', 'error') if not success: task.stat = 'pre.fail' task.save()
def cmpp_connect(self): sp_id = self.config.cmpp_sp_id.encode() sp_pwd = self.config.cmpp_sp_pwd.encode() version = (self.config.cmpp_version_1, self.config.cmpp_version_2) str_timestamp = time.strftime('%m%d%H%M%S') timestamp = long(str_timestamp) authenticatorSource = hashlib.md5(sp_id + ('\0' * 9) + sp_pwd + str_timestamp).digest() version = version[0] * (1 << 4) + version[1] * (1 ^ 0) connect = CMPP2_CONNECT() connect.sequence_Id = self.frm_seq.get_next() connect.sp_id = sp_id connect.authenticatorSource = authenticatorSource connect.version = version connect.timestamp = timestamp frame = connect log( title='CMPP2_SEND_FRAME_%s_%s_%s' % ( self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode(), Cmpp2FrameHandler.ID_TO_NAME[frame.ID]), content=frame.__dict__, logger='sms', level='debug' ) self.socket_client.send(connect) # connect_resp=CMPP2_CONNECT_RESP connect_resp = self.socket_client.recv() frame = connect_resp log( title='CMPP2_RECEIVE_FRAME_%s_%s_%s' % ( self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode(), Cmpp2FrameHandler.ID_TO_NAME[frame.ID]), content=frame.ID == 0x00000005 and [frame.__dict__, frame.status_report.__dict__] or frame.__dict__, logger='sms', level='debug' ) return connect_resp.status
def cmpp_connect(self): sp_id = self.config.cmpp_sp_id.encode() sp_pwd = self.config.cmpp_sp_pwd.encode() version = (self.config.cmpp_version_1, self.config.cmpp_version_2) str_timestamp = time.strftime('%m%d%H%M%S') timestamp = long(str_timestamp) authenticatorSource = hashlib.md5(sp_id + ('\0' * 9) + sp_pwd + str_timestamp).digest() version = version[0] * (1 << 4) + version[1] * (1 ^ 0) connect = CMPP2_CONNECT() connect.sequence_Id = self.frm_seq.get_next() connect.sp_id = sp_id connect.authenticatorSource = authenticatorSource connect.version = version connect.timestamp = timestamp frame = connect log(title='CMPP2_SEND_FRAME_%s_%s_%s' % (self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode(), Cmpp2FrameHandler.ID_TO_NAME[frame.ID]), content=frame.__dict__, logger='sms', level='debug') self.socket_client.send(connect) # connect_resp=CMPP2_CONNECT_RESP connect_resp = self.socket_client.recv() frame = connect_resp log(title='CMPP2_RECEIVE_FRAME_%s_%s_%s' % (self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode(), Cmpp2FrameHandler.ID_TO_NAME[frame.ID]), content=frame.ID == 0x00000005 and [frame.__dict__, frame.status_report.__dict__] or frame.__dict__, logger='sms', level='debug') return connect_resp.status
def start_serv(self): self.status = 'running' while self.status: try: client = Client(self.config.qtpp_wsdl_url.encode()) self.sms_mt = client.service.smsMt break except: log( title='QTPP_START_SERV_ERROR', content=self.config.__dict__, logger='sms', level='error' ) while self.status: sms_list = self.task_queue.fetch_sms(self.fetch_size) if sms_list: for sms in sms_list: self.send_one(sms) else: sleep(self.fetch_interval)
def send_one(self, msg): # ack 暂时不支持群发 mobile_list = msg.mobile.encode().split(',') resultcode = '-1' result_list = [] try: req_xml = self.get_req_xml(msg) log( title='QTPP_SEND_REQ_XML_%s' % msg.ec_code, content=req_xml, logger='sms', level='debug' ) rsp_xml = self.sms_mt(req_xml) rsp_xml = unicode(rsp_xml).encode('utf8') log( title='QTPP_SEND_RSP_XML_%s' % msg.ec_code, content=rsp_xml, logger='sms', level='debug' ) resultcode, result_list = self.parse_rsp_xml(rsp_xml) except: log( title='QTPP_SEND_ERROR_%s' % msg.ec_code, content=None, logger='sms', level='error' ) for result in result_list: mobile = result.get('mobile') mobile_list.remove(mobile) result['sms_obj'] = msg self.handler.sms_ack(self, result) for mobile in mobile_list: result = {'mobile': mobile, 'oprnum': msg.id, 'resultcode': resultcode, 'sms_obj': msg} self.handler.sms_ack(self, result)
def recv_once(self): frame = self.socket_client.recv() ID = frame.ID log( title='CMPP2_RECEIVE_FRAME_%s_%s_%s' % ( self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode(), Cmpp2FrameHandler.ID_TO_NAME[frame.ID]), content=frame.ID == 0x00000005 and [frame.__dict__, frame.status_report.__dict__] or frame.__dict__, logger='sms', level='debug' ) if ID == CMPP2_TERMINATE.ID: terminate = frame terminate_resp = CMPP2_TERMINATE_RESP() self.send_queue_put(terminate_resp, terminate) elif ID == CMPP2_DELIVER.ID: deliver = frame deliver_resp = self.recv_sms(frame) self.send_queue_put(deliver_resp, deliver) elif ID == CMPP2_ACTIVE_TEST: active_test = frame active_test_resp = CMPP2_ACTIVE_TEST_RESP() active_test_resp.reserve = 0 self.send_queue_put(active_test_resp, active_test) elif ID == CMPP2_TERMINATE_RESP.ID: self.socket_client.close() raise Cmpp2TerminateException('TERMINATE') elif ID == CMPP2_SUBMIT_RESP.ID: cmpp_submit_resp = CMPP2_SUBMIT_RESP cmpp_submit_resp = frame sequence_Id = cmpp_submit_resp.sequence_Id msg = self.commit_resp_wait_list_get(sequence_Id) if msg: if cmpp_submit_resp.result == 8: self.commit_queue.put((msg.get('sms_obj'), False)) # True 一次重发 else: msg['msg_id'] = cmpp_submit_resp.msg_id msg['result'] = cmpp_submit_resp.result self.handler.sms_ack(self, msg) else: log( title='CMPP2_SUBMIT_RESP_MATCH_NO_SEQID_%s_%s' % ( self.config.cmpp_sp_id.encode(), self.config.cmpp_src_id.encode()), content=frame.ID == 0x00000005 and [frame.__dict__, frame.status_report.__dict__] or frame.__dict__, logger='sms', level='debug' ) elif ID in ( CMPP2_CONNECT.ID, CMPP2_CONNECT_RESP.ID, CMPP2_SUBMIT.ID, CMPP2_DELIVER_RESP.ID, CMPP2_QUERY.ID, CMPP2_QUERY_RESP.ID, CMPP2_CANCEL.ID, CMPP2_CANCEL_RESP.ID, CMPP2_ACTIVE_TEST_RESP.ID ): pass else: raise Cmpp2UnknownCommandIDException("bad id = 0x%08x" % ID) return frame