def thread_sender(self, mobile_numbers_to_send, json_data, priority, sourceip, xforwardedfor): if isinstance(sourceip, tuple): sourceip = str(sourceip[0]) if isinstance(xforwardedfor, tuple): xforwardedfor = str(xforwardedfor[0]) for targetnr in mobile_numbers_to_send: # this is used for parameter extraction # Create sms data object and make sure that it has a smsid sms_uuid = str(uuid.uuid1()) sms = Smstransfer(content=json_data.get('content'), targetnr=targetnr, priority=priority, appid=json_data.get('appid'), sourceip=sourceip, xforwardedfor=xforwardedfor, smsid=sms_uuid) smsgwglobals.wislogger.debug("WIS: sendsms interface " + str(sms.getjson())) # process sms to insert it into database try: Helper.processsms(sms) smsid = sms.smstransfer["sms"]["smsid"] SMS_QUEUE.put(smsid) except apperror.NoRoutesFoundError: self.triggerwatchdog() pass except apperror.NotAllowedTimeFrame: self.triggerwatchdog() pass
def sendsms(self, **params): # this is used for parameter extraction # Create sms data object sms = Smstransfer(content=cherrypy.request.params.get('content'), targetnr=cherrypy.request.params.get('mobile'), priority=int(cherrypy.request.params.get('priority')), appid=cherrypy.request.params.get('appid'), sourceip=cherrypy.request.headers.get('Remote-Addr'), xforwardedfor=cherrypy.request.headers.get( 'X-Forwarded-For')) # check if parameters are given resp = XMLResponse() if not sms.smsdict["content"]: self.triggerwatchdog() return resp.errorxml("0001") if not sms.smsdict["targetnr"]: self.triggerwatchdog() return resp.errorxml("0001") if not sms.smsdict["priority"]: self.triggerwatchdog() return resp.errorxml("0001") smsgwglobals.wislogger.debug(sms.getjson()) # process sms to insert it into database try: Helper.processsms(sms) except apperror.NoRoutesFoundError: self.triggerwatchdog() return resp.errorxml("0001") self.triggerwatchdog() return resp.successxml("0001")
def reprocess_orphaned_sms(self): # Read and filter SMS with status 0 but statustime < our own start time # This can happen when wis failed and restarted - so definitely no sending happened # So mark SMS as NOPossibleRoutes - they will be reprocessed next run of reprocess_sms job zero_status_sms = self.db.read_sms(status=0) orphaned_sms = [ sms for sms in zero_status_sms if datetime.strptime(sms["statustime"], '%Y-%m-%d %H:%M:%S.%f') < wisglobals.scriptstarttime ] if orphaned_sms: for sms in orphaned_sms: smsgwglobals.wislogger.debug( "REPROCESS_ORPHANED_SMS job: processing: " + str(sms)) #wisglobals.rdb.descrease_sms_count(sms.get('modemid')) smstrans = Smstransfer(content=sms.get('content'), targetnr=sms.get('targetnr'), priority=sms.get('priority'), appid=sms.get('appid'), sourceip=sms.get('sourceip'), xforwardedfor=sms.get('xforwardedfor'), smsid=sms.get('smsid')) smstrans.smsdict["status"] = 104 smstrans.smsdict["modemid"] = "NoPossibleRoutes" smstrans.smsdict["imsi"] = "" smstrans.smsdict["statustime"] = datetime.utcnow() smstrans.writetodb() else: smsgwglobals.wislogger.debug( "REPROCESS_ORPHANED_SMS job: skipping. NO OPRHANED SMS to process" )
def reprocess_sms(self): if self.allowed_time(): # Read SMS with statuses NoRoutes + NoPossibleRoutes + NotAllowedTimeframe smsen = self.db.read_sms(status=104) smsen = smsen + self.db.read_sms(status=105) if smsen: for sms in smsen: smsgwglobals.wislogger.debug( "REPROCESS_SMS job: processing: " + str(sms)) smstrans = Smstransfer( content=sms.get('content'), targetnr=sms.get('targetnr'), priority=sms.get('priority'), appid=sms.get('appid'), sourceip=sms.get('sourceip'), xforwardedfor=sms.get('xforwardedfor'), smsid=sms.get('smsid')) try: Helper.processsms(smstrans) except apperror.NoRoutesFoundError: pass else: # Add sms to global queue wisglobals.watchdogThread.queue.put( smstrans.smsdict["smsid"]) wisglobals.watchdogThreadNotify.set() else: smsgwglobals.wislogger.debug( "REPROCESS_SMS job: skipping. NO SMS to process") else: smsgwglobals.wislogger.debug( "REPROCESS_SMS job: skipping. Not allowed timeframe")
def sendsms(self, **params): # all parameters to lower case cherrypy.request.params = dict([(x[0].lower(), x[1]) for x in cherrypy.request.params.items()]) priority = 1 if 'priority' in cherrypy.request.params: priority = int(cherrypy.request.params.get('priority')) # this is used for parameter extraction # Create sms data object and make sure that it has a smsid sms = Smstransfer(content=cherrypy.request.params.get('content'), targetnr=cherrypy.request.params.get('mobile'), priority=priority, appid=cherrypy.request.params.get('appid'), sourceip=cherrypy.request.headers.get('Remote-Addr'), xforwardedfor=cherrypy.request.headers.get( 'X-Forwarded-For'), smsid=str(uuid.uuid1())) # check if parameters are given resp = XMLResponse() if not sms.smsdict["content"]: self.triggerwatchdog() return resp.errorxml("0001") if not sms.smsdict["targetnr"]: self.triggerwatchdog() return resp.errorxml("0001") if not sms.smsdict["priority"]: self.triggerwatchdog() return resp.errorxml("0001") smsgwglobals.wislogger.debug("WIS: sendsms iterface " + str(sms.getjson())) # process sms to insert it into database try: Helper.processsms(sms) except apperror.NoRoutesFoundError: self.triggerwatchdog() return resp.errorxml("0001") self.triggerwatchdog() return resp.successxml("0001")
def process(self, sms_id): try: db = database.Database() smsen = db.read_sms(smsid=sms_id) if not smsen: smsgwglobals.wislogger.debug("WATCHDOG: no SMS with ID: " + sms_id + " in DB") # Add sms_id back to the queue self.queue.put(sms_id) except error.DatabaseError as e: smsgwglobals.wislogger.debug(e.message) # Add sms_id back to the queue self.queue.put(sms_id) # we have sms, just process sms = smsen[0] smsgwglobals.wislogger.debug("WATCHDOG: Process SMS: " + str(sms)) # create smstrans object for easy handling smstrans = Smstransfer(**sms) route = wisglobals.rdb.read_routing(smstrans.smsdict["modemid"]) if route is None or len(route) == 0: smsgwglobals.wislogger.debug("WATCHDOG: ALERT ROUTE LOST") # try to reprocess route try: smstrans.updatedb() Helper.processsms(smstrans) except apperror.NoRoutesFoundError: pass else: self.queue.put(smstrans.smsdict["smsid"]) elif route[0]["wisid"] != wisglobals.wisid: self.deligate(smstrans, route) else: # we have a route, this wis is the correct one # therefore give the sms to the PIS # this is a bad hack to ignore obsolete routes # this may lead to an error, fixme route[:] = [d for d in route if d['obsolete'] < 1] smsgwglobals.wislogger.debug("WATCHDOG: process with route %s ", str(route)) smsgwglobals.wislogger.debug("WATCHDOG: Sending to PIS %s", str(sms)) # only continue if route contains data if len(route) > 0: self.dispatch_sms(smstrans, route) else: # Reprocess try: smstrans.updatedb() Helper.processsms(smstrans) except apperror.NoRoutesFoundError: pass else: self.queue.put(smstrans.smsdict["smsid"])
def api(self, arg, **params): cl = cherrypy.request.headers['Content-Length'] rawbody = cherrypy.request.body.read(int(cl)) smsgwglobals.wislogger.debug(rawbody) plaintext = GlobalHelper.decodeAES(rawbody) smsgwglobals.wislogger.debug(plaintext) data = json.loads(plaintext) if arg == "watchdog": if data["run"] == "True": self.triggerwatchdog() else: cherrypy.response.status = 400 if arg == "heartbeat": if "routingid" in data: smsgwglobals.wislogger.debug(data["routingid"]) try: count = wisglobals.rdb.raise_heartbeat(data["routingid"]) if count == 0: smsgwglobals.wislogger.debug("COUNT: " + str(count)) cherrypy.response.status = 400 except error.DatabaseError: cherrypy.response.status = 400 else: cherrypy.response.status = 400 if arg == "receiverouting": try: wisglobals.rdb.merge_routing(data) except error.DatabaseError as e: smsgwglobals.wislogger.debug(e.message) if arg == "requestrouting": if data["get"] != "peers": cherrypy.response.status = 400 return smsgwglobals.wislogger.debug("Sending routing table to you") try: erg = wisglobals.rdb.read_routing() jerg = json.dumps(erg) data = GlobalHelper.encodeAES(jerg) return data except error.DatabaseError as e: smsgwglobals.wislogger.debug(e.message) if arg == "managemodem": try: if data["action"] == "register": smsgwglobals.wislogger.debug("managemodem register") smsgwglobals.wislogger.debug(wisglobals.wisid) # add wisid to data object data["wisid"] = wisglobals.wisid # store date in routing table wisglobals.rdb.write_routing(data) # call receiverouting to distribute routing Helper.receiverouting() elif data["action"] == "unregister": smsgwglobals.wislogger.debug("managemodem unregister") routingid = data["routingid"] wisglobals.rdb.change_obsolete(routingid, 14) if routingid in wisglobals.watchdogRouteThread: wisglobals.watchdogRouteThread[routingid].terminate() wisglobals.watchdogRouteThread.pop(routingid) wisglobals.watchdogRouteThreadNotify.pop(routingid) wisglobals.watchdogRouteThreadQueue.pop(routingid) Helper.receiverouting() else: return False except error.DatabaseError as e: smsgwglobals.wislogger.debug(e.message) if arg == "deligatesms": if "sms" in data: smsgwglobals.wislogger.debug(data["sms"]) try: sms = Smstransfer(**data["sms"]) sms.smsdict["status"] = -1 sms.writetodb() self.triggerwatchdog() except error.DatabaseError: cherrypy.response.status = 400 else: cherrypy.response.status = 400 if arg == "router": if data["action"] == "status": smsgwglobals.wislogger.debug("API: " + data["action"]) if wisglobals.routerThread is None: cherrypy.response.status = 200 data = GlobalHelper.encodeAES('{"ROUTER":"noobject"}') return data if wisglobals.routerThread.isAlive(): cherrypy.response.status = 200 data = GlobalHelper.encodeAES('{"ROUTER":"alive"}') return data else: cherrypy.response.status = 200 data = GlobalHelper.encodeAES('{"ROUTER":"dead"}') return data if arg == "getsms": if data["get"] != "sms": cherrypy.response.status = 400 return if "date" in data: date = data["date"] smsgwglobals.wislogger.debug("API: " + date) else: date = None smsgwglobals.wislogger.debug("Sending SMS Table") smsgwglobals.wislogger.debug("Sending SMS Table date: " + str(date)) try: db = Database() erg = db.read_sms_date(date=date) jerg = json.dumps(erg) data = GlobalHelper.encodeAES(jerg) return data except error.DatabaseError as e: smsgwglobals.wislogger.debug(e.message) if arg == "get_sms_stats": if data["get"] != "sms": cherrypy.response.status = 400 return try: db = Database() erg = db.read_sms_stats() jerg = json.dumps(erg) data = GlobalHelper.encodeAES(jerg) return data except error.DatabaseError as e: smsgwglobals.wislogger.debug(e.message)
def api(self, arg, **params): cl = cherrypy.request.headers['Content-Length'] rawbody = cherrypy.request.body.read(int(cl)) smsgwglobals.wislogger.debug(rawbody) plaintext = GlobalHelper.decodeAES(rawbody) smsgwglobals.wislogger.debug(plaintext) data = json.loads(plaintext) if arg == "watchdog": if data["run"] == "True": self.triggerwatchdog() else: cherrypy.response.status = 400 if arg == "heartbeat": if "routingid" in data: smsgwglobals.wislogger.debug(data["routingid"]) try: count = wisglobals.rdb.raise_heartbeat(data["routingid"]) if count == 0: smsgwglobals.wislogger.debug("COUNT: " + str(count)) cherrypy.response.status = 400 except error.DatabaseError: cherrypy.response.status = 400 else: cherrypy.response.status = 400 if arg == "receiverouting": try: wisglobals.rdb.merge_routing(data) except error.DatabaseError as e: smsgwglobals.wislogger.debug(e.message) if arg == "requestrouting": if data["get"] != "peers": cherrypy.response.status = 400 return smsgwglobals.wislogger.debug("Sending routing table to you") try: erg = wisglobals.rdb.read_routing() jerg = json.dumps(erg) data = GlobalHelper.encodeAES(jerg) return data except error.DatabaseError as e: smsgwglobals.wislogger.debug(e.message) if arg == "managemodem": try: if data["action"] == "register": smsgwglobals.wislogger.debug("managemodem register") smsgwglobals.wislogger.debug(wisglobals.wisid) # add wisid to data object data["wisid"] = wisglobals.wisid # store date in routing table wisglobals.rdb.write_routing(data) # call receiverouting to distribute routing Helper.receiverouting() elif data["action"] == "unregister": smsgwglobals.wislogger.debug("managemodem unregister") wisglobals.rdb.change_obsolete(data["routingid"], 14) Helper.receiverouting() else: return False except error.DatabaseError as e: smsgwglobals.wislogger.debug(e.message) if arg == "deligatesms": if "sms" in data: smsgwglobals.wislogger.debug(data["sms"]) try: sms = Smstransfer(**data["sms"]) sms.smsdict["status"] = 1 sms.writetodb() self.triggerwatchdog() except error.DatabaseError: cherrypy.response.status = 400 else: cherrypy.response.status = 400 if arg == "router": if data["action"] == "status": smsgwglobals.wislogger.debug("API: " + data["action"]) if wisglobals.routerThread is None: cherrypy.response.status = 200 data = GlobalHelper.encodeAES('{"ROUTER":"noobject"}') return data if wisglobals.routerThread.isAlive(): cherrypy.response.status = 200 data = GlobalHelper.encodeAES('{"ROUTER":"alive"}') return data else: cherrypy.response.status = 200 data = GlobalHelper.encodeAES('{"ROUTER":"dead"}') return data if arg == "getsms": if data["get"] != "sms": cherrypy.response.status = 400 return if "date" in data: date = data["date"] smsgwglobals.wislogger.debug("API: " + date) else: date = None smsgwglobals.wislogger.debug("Sending SMS Table") smsgwglobals.wislogger.debug("Sending SMS Table date: " + str(date)) try: db = Database() erg = db.read_sms_date(date=date) jerg = json.dumps(erg) data = GlobalHelper.encodeAES(jerg) return data except error.DatabaseError as e: smsgwglobals.wislogger.debug(e.message)