Пример #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
Пример #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")
Пример #3
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")
Пример #4
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"])
Пример #5
0
    def checkpassword(self, **params):
        username = cherrypy.request.params.get('username').lower()
        password = cherrypy.request.params.get('password')

        # check if password is empty
        if not password:
            smsgwglobals.wislogger.debug("FRONT: No password on login")
            raise cherrypy.HTTPRedirect("/smsgateway")

        # check if username is valid
        if not username:
            smsgwglobals.wislogger.debug("FRONT: No username on login")
            raise cherrypy.HTTPRedirect("/smsgateway")

        if len(username) > wisglobals.validusernamelength:
            smsgwglobals.wislogger.debug("FRONT: Username to long on login")
            raise cherrypy.HTTPRedirect("/smsgateway")

        if (re.compile(wisglobals.validusernameregex).findall(username)):
            smsgwglobals.wislogger.debug("FRONT: Username is not valid login")
            raise cherrypy.HTTPRedirect("/smsgateway")

        if 'root' in username:
            smsgwglobals.wislogger.debug("FRONT: ROOT Login " + username)
            try:
                if Helper.checkpassword(username, password) is True:
                    cherrypy.session['logon'] = True
                    raise cherrypy.HTTPRedirect("/smsgateway/main")
                else:
                    raise cherrypy.HTTPRedirect("/smsgateway")
            except error.UserNotFoundError:
                raise cherrypy.HTTPRedirect("/smsgateway")
        else:
            try:
                smsgwglobals.wislogger.debug("FRONT: Ldap Login " + username)
                if wisglobals.ldapenabled is None or 'true' not in wisglobals.ldapenabled.lower():
                    smsgwglobals.wislogger.debug("FRONT: Ldap Login disabled " + username)
                    raise cherrypy.HTTPRedirect("/smsgateway")

                smsgwglobals.wislogger.debug("FRONT: Ldap Login " + username)
                smsgwglobals.wislogger.debug("FRONT: Ldap Users " + str(wisglobals.ldapusers))
                if username not in wisglobals.ldapusers:
                    smsgwglobals.wislogger.debug("FRONT: Ldap username not in ldapusers")
                    raise cherrypy.HTTPRedirect("/smsgateway")

                smsgwglobals.wislogger.debug("FRONT: Ldap Server " + wisglobals.ldapserver)
                s = Server(wisglobals.ldapserver, get_info=ALL)
                userdn = 'cn=' + username + ',' + wisglobals.ldapbasedn
                c = Connection(s, user=userdn, password=password)

                if c.bind():
                    smsgwglobals.wislogger.debug("FRONT: Ldap login successful " + username)
                    cherrypy.session['logon'] = True
                    raise cherrypy.HTTPRedirect("/smsgateway/main")
                else:
                    raise cherrypy.HTTPRedirect("/smsgateway")
            except error.UserNotFoundError:
                raise cherrypy.HTTPRedirect("/smsgateway")
Пример #6
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")
Пример #7
0
    def checkpassword(self, **params):
        username = cherrypy.request.params.get('username').lower()
        password = cherrypy.request.params.get('password')

        if 'root' in username:
            smsgwglobals.wislogger.debug("FRONT: ROOT Login " + username)
            try:
                if Helper.checkpassword(username, password) is True:
                    cherrypy.session['logon'] = True
                    raise cherrypy.HTTPRedirect("/smsgateway/main")
                else:
                    raise cherrypy.HTTPRedirect("/smsgateway")
            except error.UserNotFoundError:
                raise cherrypy.HTTPRedirect("/smsgateway")
        else:
            try:
                smsgwglobals.wislogger.debug("FRONT: Ldap Login " + username)
                if wisglobals.ldapenabled is None or 'true' not in wisglobals.ldapenabled.lower():
                    smsgwglobals.wislogger.debug("FRONT: Ldap Login disabled " + username)
                    raise cherrypy.HTTPRedirect("/smsgateway")

                smsgwglobals.wislogger.debug("FRONT: Ldap Login " + username)
                smsgwglobals.wislogger.debug("FRONT: Ldap Users " + str(wisglobals.ldapusers))
                if username not in wisglobals.ldapusers:
                    smsgwglobals.wislogger.debug("FRONT: Ldap username not in ldapusers")
                    raise cherrypy.HTTPRedirect("/smsgateway")

                smsgwglobals.wislogger.debug("FRONT: Ldap Server " + wisglobals.ldapserver)
                s = Server(wisglobals.ldapserver, get_info=ALL)
                userdn = 'cn=' + username + ',' + wisglobals.ldapbasedn
                c = Connection(s, user=userdn, password=password)

                if c.bind():
                    cherrypy.session['logon'] = True
                    raise cherrypy.HTTPRedirect("/smsgateway/main")
                else:
                    raise cherrypy.HTTPRedirect("/smsgateway")
            except error.UserNotFoundError:
                raise cherrypy.HTTPRedirect("/smsgateway")
Пример #8
0
    def run(self):
        # counter to timeout split horzion
        checkround = 0

        # the follwing is like the RIP protocol
        # like Bellman-Ford-Algorithmus
        smsgwglobals.wislogger.debug("ROUTER: Starting")

        # 1. request routing
        # if we could not get anything, shit happens
        Helper.requestrouting(initial=True)

        # 2. startup update timer
        while not self.e.isSet():

            # starting router run
            smsgwglobals.wislogger.debug("ROUTER: Starting router run")

            # raise timeouts
            smsgwglobals.wislogger.debug("ROUTER: Starting raise obsolete")
            wisglobals.rdb.raise_obsolete()

            # check local table if there are obsoletes
            smsgwglobals.wislogger.debug("ROUTER: Starting delete obsolete")
            wisglobals.rdb.delete_routing()

            # send out table
            smsgwglobals.wislogger.debug("ROUTER: Starting sending table")
            Helper.receiverouting()

            # remove dead direcly connected
            smsgwglobals.wislogger.debug("ROUTER: Starting delete directly")
            if checkround == 4:
                checkround == 0
                Helper.checkrouting()
            else:
                checkround = checkround + 1

            smsgwglobals.wislogger.debug("ROUTER: Starting sleep")

            time.sleep(25)

            smsgwglobals.wislogger.debug("ROUTER: Finishing router run")

        smsgwglobals.wislogger.debug("ROUTER: Stopped")
Пример #9
0
    def run(self):
        # counter to timeout split horzion
        checkround = 0

        # the follwing is like the RIP protocol
        # like Bellman-Ford-Algorithmus
        smsgwglobals.wislogger.debug("ROUTER: Starting")

        # 1. request routing
        # if we could not get anything, shit happens
        Helper.requestrouting(initial=True)

        # 2. startup update timer
        while not self.e.isSet():

            # starting router run
            smsgwglobals.wislogger.debug("ROUTER: Starting router run")

            # raise timeouts
            smsgwglobals.wislogger.debug("ROUTER: Starting raise obsolete")
            wisglobals.rdb.raise_obsolete()

            # check local table if there are obsoletes
            smsgwglobals.wislogger.debug("ROUTER: Starting delete obsolete")
            wisglobals.rdb.delete_routing()

            # send out table
            smsgwglobals.wislogger.debug("ROUTER: Starting sending table")
            Helper.receiverouting()

            # remove dead direcly connected
            smsgwglobals.wislogger.debug("ROUTER: Starting delete directly")
            if checkround == 4:
                checkround == 0
                Helper.checkrouting()
            else:
                checkround = checkround + 1

            smsgwglobals.wislogger.debug("ROUTER: Starting sleep")

            time.sleep(25)

            smsgwglobals.wislogger.debug("ROUTER: Finishing router run")

        smsgwglobals.wislogger.debug("ROUTER: Stopped")
Пример #10
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)
Пример #11
0
    def process(self):
        smsgwglobals.wislogger.debug("WATCHDOG: processing sms")

        # check if we have SMS to work on
        smscount = 0

        try:
            db = database.Database()

            # cleanup old sms
            db.delete_old_sms(wisglobals.cleanupseconds)

            smsen = db.read_sms(status=0)
            smsen = smsen + db.read_sms(status=1)
            smscount = len(smsen)
            if smscount == 0:
                smsgwglobals.wislogger.debug("WATCHDOG: " +
                                             "no SMS to process")
                return
        except error.DatabaseError as e:
            smsgwglobals.wislogger.debug(e.message)

        # we have sms, just process
        while smscount > 0:
            for sms in smsen:
                smsgwglobals.wislogger.debug("WATCHDOG: " + str(sms))

                # create smstrans object for easy handling
                smstrans = smstransfer.Smstransfer(**sms)

                # check if we have routes
                # if we have no routes, set error code and
                # continue with the next sms
                routes = wisglobals.rdb.read_routing()
                if routes is None or len(routes) == 0:
                    smstrans.smsdict["statustime"] = datetime.utcnow()
                    smstrans.smsdict["status"] = 100
                    smsgwglobals.wislogger.debug(smstrans.smsdict)
                    smstrans.updatedb()
                    continue

                # check if modemid exists in routing
                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
                    smstrans.smsdict["status"] = 106
                    smstrans.updatedb()
                    Helper.processsms(smstrans)
                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'] < 13]
                    smsgwglobals.wislogger.debug("WATCHDOG: process with route %s ", str(route))
                    smsgwglobals.wislogger.debug("WATCHDOG: " +
                                                 " Sending to PIS")
                    self.send(sms, route)

            smsen = db.read_sms(status=0)
            smsen = smsen + db.read_sms(status=1)
            smscount = len(smsen)
Пример #12
0
    def send(self, sms):
        smstrans = sms["sms"]
        route = sms["route"]
        # encode to json
        jdata = json.dumps(smstrans.smsdict, default=str)
        data = GlobalHelper.encodeAES(jdata)

        request = \
            urllib.request.Request(
                route[0]["pisurl"] +
                "/sendsms")

        request.add_header("Content-Type", "application/json;charset=utf-8")

        try:
            smsgwglobals.wislogger.debug("WATCHDOG [route: " +
                                         str(self.routingid) + "] " +
                                         "Sending VIA " +
                                         smstrans.smsdict["modemid"] +
                                         route[0]["pisurl"] + "/sendsms")
            f = urllib.request.urlopen(request,
                                       data,
                                       timeout=wisglobals.pissendtimeout)
            smsgwglobals.wislogger.debug("WATCHDOG [route: " +
                                         str(self.routingid) +
                                         "] SMS send to PIS returncode:" +
                                         str(f.getcode()))
            # if all is OK set the sms status to SENT
            smstrans.smsdict["statustime"] = datetime.utcnow()
            if f.getcode() == 200:
                status_code = f.read()

                if int(status_code) == 1:
                    if smstrans.smsdict["status"] == -1:
                        smstrans.smsdict["status"] = 101
                        smsgwglobals.wislogger.debug("WATCHDOG [route: " +
                                                     str(self.routingid) +
                                                     "] SEND deligated:" +
                                                     str(smstrans.smsdict))
                    else:
                        smstrans.smsdict["status"] = 1
                        smsgwglobals.wislogger.debug("WATCHDOG [route: " +
                                                     str(self.routingid) +
                                                     "] SEND direct:" +
                                                     str(smstrans.smsdict))
                    smsgwglobals.wislogger.debug("WATCHDOG [route: " +
                                                 str(self.routingid) +
                                                 "] SEND Update DB SUCCESS:" +
                                                 str(smstrans.smsdict))
                    smstrans.updatedb()
                elif int(status_code) == 2000 or int(status_code) == 31 or int(
                        status_code) == 27 or int(status_code) == 69:
                    # PIS doesn't have modem endpoint - reprocess SMS and choose different route) - Error 2000
                    # Modem fail - reprocess SMS and choose different route) - Error 31 (can't read SMSC nummber, 99.99% - we just lost connection)
                    # Modem fail - reprocess SMS and choose different route) - Error 27 ( no money or SIM card blocked)
                    # Modem fail - reprocess SMS and choose different route) - Error 69 (can't read SMSC nummber, 99.99% - we just lost connection)
                    # BUT use same smsid (after new route will be choosed it will decrease sms_count on route (IMSI)
                    smsgwglobals.wislogger.debug("WATCHDOG [route: " +
                                                 str(self.routingid) +
                                                 "] PIS can't reach PID: " +
                                                 str(smstrans.smsdict))
                    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:
                    if smstrans.smsdict["status"] == 0:
                        smstrans.smsdict["status"] = int(status_code)
                        smsgwglobals.wislogger.debug("WATCHDOG [route: " +
                                                     str(self.routingid) +
                                                     "] SEND direct ERROR:" +
                                                     str(smstrans.smsdict))
                    else:
                        smstrans.smsdict["status"] = 100 + int(status_code)
                        smsgwglobals.wislogger.debug(
                            "WATCHDOG [route: " + str(self.routingid) +
                            "] SEND deligated ERROR:" + str(smstrans.smsdict))
                    smsgwglobals.wislogger.debug("WATCHDOG [route: " +
                                                 str(self.routingid) +
                                                 "] SEND Update DB ERROR:" +
                                                 str(smstrans.smsdict))
                    smstrans.updatedb()
        except urllib.error.URLError as e:
            if smstrans.smsdict["status"] == -1:
                smstrans.smsdict["status"] = 300
            else:
                smstrans.smsdict["status"] = 200

            smsgwglobals.wislogger.debug("WATCHDOG [route: " +
                                         str(self.routingid) +
                                         "] SEND EXCEPTION " +
                                         str(smstrans.smsdict))
            smstrans.updatedb()
            # set SMS to not send!!!
            smsgwglobals.wislogger.debug(e)
            smsgwglobals.wislogger.debug("WA3TCHDOG [route: " +
                                         str(self.routingid) +
                                         "] SEND Get peers NOTOK")

            # On 500 error - (probably PID/route died - try to reprocess sms)
            try:
                Helper.processsms(smstrans)
            except apperror.NoRoutesFoundError:
                pass
            else:
                # Add sms to global queue
                wisglobals.watchdogThread.queue.put(smstrans.smsdict["smsid"])
                wisglobals.watchdogThreadNotify.set()
        except socket.timeout as e:
            smstrans.smsdict["status"] = 400
            smstrans.updatedb()
            smsgwglobals.wislogger.debug(e)
            smsgwglobals.wislogger.debug("WATCHDOG [route: " +
                                         str(self.routingid) +
                                         "] SEND Socket connection timeout")

            # On 400 error - (probably PID/route died - try to reprocess sms)
            try:
                Helper.processsms(smstrans)
            except apperror.NoRoutesFoundError:
                pass
            else:
                # Add sms to global queue
                wisglobals.watchdogThread.queue.put(smstrans.smsdict["smsid"])
                wisglobals.watchdogThreadNotify.set()
Пример #13
0
    def process(self):
        smsgwglobals.wislogger.debug("WATCHDOG: processing sms")

        # check if we have SMS to work on
        smscount = 0

        try:
            db = database.Database()

            # cleanup old sms
            db.delete_old_sms(wisglobals.cleanupseconds)

            smsen = db.read_sms(status=0)
            smsen = smsen + db.read_sms(status=1)
            smscount = len(smsen)
            if smscount == 0:
                smsgwglobals.wislogger.debug("WATCHDOG: " +
                                             "no SMS to process")
                return
        except error.DatabaseError as e:
            smsgwglobals.wislogger.debug(e.message)

        # we have sms, just process
        smsgwglobals.wislogger.debug("WATCHDOG: Count to process: %s",
                                     str(smscount))
        while smscount > 0:
            for sms in smsen:
                smsgwglobals.wislogger.debug("WATCHDOG: Process SMS: " +
                                             str(sms))

                # create smstrans object for easy handling
                smstrans = smstransfer.Smstransfer(**sms)

                # check if we have routes
                # if we have no routes, set error code and
                # continue with the next sms
                routes = wisglobals.rdb.read_routing()
                if routes is None or len(routes) == 0:
                    smstrans.smsdict["statustime"] = datetime.utcnow()
                    smstrans.smsdict["status"] = 100
                    smsgwglobals.wislogger.debug(
                        "WATCHDOG: NO routes to process SMS: " +
                        str(smstrans.smsdict))
                    smstrans.updatedb()
                    continue

                # check if modemid exists in routing
                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
                    smstrans.smsdict["status"] = 106
                    smstrans.updatedb()
                    Helper.processsms(smstrans)
                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'] < 13]
                    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.send(smstrans, route)

            smsen = db.read_sms(status=0)
            smsen = smsen + db.read_sms(status=1)
            smscount = len(smsen)
Пример #14
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)