Example #1
0
    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
Example #2
0
    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")
Example #3
0
    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"
            )
Example #4
0
    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")
Example #5
0
    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")
Example #6
0
    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"])
Example #7
0
    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)
Example #8
0
    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)