Example #1
0
class UserManagerService(ServiceBase):
    @rpc(User, _returns=Integer)
    def add_user(ctx, user):
        print id(user.permissions[0].__class__), id(Permission)
        ctx.udc.session.add(user)
        ctx.udc.session.flush()

        return user.user_id

    @rpc(Integer, _returns=User)
    def get_user(ctx, user_id):
        return ctx.udc.session.query(User).filter_by(user_id=user_id).one()

    @rpc(User)
    def set_user(ctx, user):
        ctx.udc.session.merge(user)

    @rpc(Integer)
    def del_user(ctx, user_id):
        ctx.udc.session.query(User).filter_by(user_id=user_id).delete()

    @rpc(_returns=Iterable(User))
    def get_all_user(ctx):
        return ctx.udc.session.query(User)
Example #2
0
class Service_submitseq(ServiceBase):
    @rpc(Unicode,  Unicode, Unicode, Unicode,  _returns=Iterable(Unicode))
# submit job to the front-end
    def submitjob(ctx, seq="", fixtop="", jobname="", email=""):#{{{
        seq = seq + "\n" #force add a new line for correct parsing the fasta file
        seqinfo = {}
        filtered_seq = webcom.ValidateSeq(seq, seqinfo, g_params)
        # ValidateFixtop(fixtop) #to be implemented
        jobid = "None"
        url = "None"
        numseq_str = "%d"%(seqinfo['numseq'])
        warninfo = seqinfo['warninfo']
        errinfo = ""
#         print "\n\nreq\n", dir(ctx.transport.req) #debug
#         print "\n\n", ctx.transport.req.META['REMOTE_ADDR'] #debug
#         print "\n\n", ctx.transport.req.META['HTTP_HOST']   #debug
        if filtered_seq == "":
            errinfo = seqinfo['errinfo']
        else:
            soap_req = ctx.transport.req
            try:
                client_ip = soap_req.META['REMOTE_ADDR']
            except:
                client_ip = ""

            try:
                hostname = soap_req.META['HTTP_HOST']
            except:
                hostname = ""
#             print client_ip
#             print hostname
            seqinfo['jobname'] = jobname
            seqinfo['email'] = email
            seqinfo['fixtop'] = fixtop
            seqinfo['date'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            seqinfo['client_ip'] = client_ip
            seqinfo['hostname'] = hostname
            seqinfo['method_submission'] = "wsdl"
            seqinfo['isForceRun'] = False  # disable isForceRun if submitted by WSDL
            jobid = RunQuery_wsdl(seq, filtered_seq, seqinfo)
            if jobid == "":
                errinfo = "Failed to submit your job to the queue\n"+seqinfo['errinfo']
            else:
                log_record = "%s\t%s\t%s\t%s\t%d\t%s\t%s\t%s\n"%(seqinfo['date'], jobid,
                        seqinfo['client_ip'], seqinfo['numseq'],
                        len(seq),seqinfo['jobname'], seqinfo['email'],
                        seqinfo['method_submission'])
                main_logfile_query = "%s/%s/%s"%(SITE_ROOT, "static/log", "submitted_seq.log")
                myfunc.WriteFile(log_record, main_logfile_query, "a")

                divided_logfile_query =  "%s/%s/%s"%(SITE_ROOT, "static/log/divided",
                        "%s_submitted_seq.log"%(seqinfo['client_ip']))
                if seqinfo['client_ip'] != "":
                    myfunc.WriteFile(log_record, divided_logfile_query, "a")

                url = "http://" + hostname + g_params['BASEURL'] + "result/%s"%(jobid)

                file_seq_warning = "%s/%s/%s/%s"%(SITE_ROOT, "static/result", jobid, "query.warn.txt")
                if seqinfo['warninfo'] != "":
                    myfunc.WriteFile(seqinfo['warninfo'], file_seq_warning, "a")
                errinfo = seqinfo['errinfo']

        for s in [jobid, url, numseq_str, errinfo, warninfo]:
            yield s
#}}}

    @rpc(Unicode,  Unicode, Unicode, Unicode, Unicode, Unicode, _returns=Iterable(Unicode))
# submitted_remote will be called by the daemon
# sequences are submitted one by one by the daemon, but the numseq_of_job is
# for the number of sequences of the whole job submitted to the front end
# isforcerun is set as string, "true" or "false", case insensitive
    def submitjob_remote(ctx, seq="", fixtop="", jobname="", email="",#{{{
            numseq_this_user="", isforcerun=""):
        seq = seq + "\n" #force add a new line for correct parsing the fasta file
        seqinfo = {}
        filtered_seq = webcom.ValidateSeq(seq, seqinfo, g_params)
        # ValidateFixtop(fixtop) #to be implemented
        if numseq_this_user != "" and numseq_this_user.isdigit():
            seqinfo['numseq_this_user'] = int(numseq_this_user)
        else:
            seqinfo['numseq_this_user'] = 1

        numseq_str = "%d"%(seqinfo['numseq'])
        warninfo = seqinfo['warninfo']
#         print "\n\nreq\n", dir(ctx.transport.req) #debug
#         print "\n\n", ctx.transport.req.META['REMOTE_ADDR'] #debug
#         print "\n\n", ctx.transport.req.META['HTTP_HOST']   #debug
        jobid = "None"
        url = "None"
        if filtered_seq == "":
            errinfo = seqinfo['errinfo']
        else:
            soap_req = ctx.transport.req
            try:
                client_ip = soap_req.META['REMOTE_ADDR']
            except:
                client_ip = ""

            try:
                hostname = soap_req.META['HTTP_HOST']
            except:
                hostname = ""
#             print client_ip
#             print hostname
            seqinfo['jobname'] = jobname
            seqinfo['email'] = email
            seqinfo['fixtop'] = fixtop
            seqinfo['date'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            seqinfo['client_ip'] = client_ip
            seqinfo['hostname'] = hostname
            seqinfo['method_submission'] = "wsdl"
            # for this method, wsdl is called only by the daemon script, isForceRun can be
            # set by the argument
            if isforcerun.upper()[:1] == "T":
                seqinfo['isForceRun'] = True
            else:
                seqinfo['isForceRun'] = False
            jobid = RunQuery_wsdl_local(seq, filtered_seq, seqinfo)
            if jobid == "":
                errinfo = "Failed to submit your job to the queue\n"+seqinfo['errinfo']
            else:
                log_record = "%s\t%s\t%s\t%s\t%d\t%s\t%s\t%s\n"%(seqinfo['date'], jobid,
                        seqinfo['client_ip'], seqinfo['numseq'],
                        len(seq),seqinfo['jobname'], seqinfo['email'],
                        seqinfo['method_submission'])
                main_logfile_query = "%s/%s/%s"%(SITE_ROOT, "static/log", "submitted_seq.log")
                myfunc.WriteFile(log_record, main_logfile_query, "a")

                divided_logfile_query =  "%s/%s/%s"%(SITE_ROOT, "static/log/divided",
                        "%s_submitted_seq.log"%(seqinfo['client_ip']))
                if seqinfo['client_ip'] != "":
                    myfunc.WriteFile(log_record, divided_logfile_query, "a")

                url = "http://" + hostname + g_params['BASEURL'] + "result/%s"%(jobid)

                file_seq_warning = "%s/%s/%s/%s"%(SITE_ROOT, "static/result", jobid, "query.warn.txt")
                if seqinfo['warninfo'] != "":
                    myfunc.WriteFile(seqinfo['warninfo'], file_seq_warning, "a")
                errinfo = seqinfo['errinfo']

        for s in [jobid, url, numseq_str, errinfo, warninfo]:
            yield s
#}}}

    @rpc(Unicode, _returns=Iterable(Unicode))
    def checkjob(ctx, jobid=""):#{{{
        rstdir = "%s/%s"%(path_result, jobid)
        soap_req = ctx.transport.req
        hostname = soap_req.META['HTTP_HOST']
        result_url = "http://" + hostname + "/static/" + "result/%s/%s.zip"%(jobid, jobid)
        status = "None"
        url = ""
        errinfo = ""
        if not os.path.exists(rstdir):
            status = "None"
            errinfo = "Error! jobid %s does not exist."%(jobid)
        else:
            starttagfile = "%s/%s"%(rstdir, "runjob.start")
            finishtagfile = "%s/%s"%(rstdir, "runjob.finish")
            failtagfile = "%s/%s"%(rstdir, "runjob.failed")
            errfile = "%s/%s"%(rstdir, "runjob.err")
            if os.path.exists(failtagfile):
                status = "Failed"
                errinfo = ""
                if os.path.exists(errfile):
                    errinfo = myfunc.ReadFile(errfile)
            elif os.path.exists(finishtagfile):
                status = "Finished"
                url = result_url
                errinfo = ""
            elif os.path.exists(starttagfile):
                status = "Running"
            else:
                status = "Wait"
        for s in [status, url, errinfo]:
            yield s
#}}}
    @rpc(Unicode, _returns=Iterable(Unicode))
    def deletejob(ctx, jobid=""):#{{{
        rstdir = "%s/%s"%(path_result, jobid)
        status = "None"
        errinfo = ""
        try: 
            shutil.rmtree(rstdir)
            status = "Succeeded"
        except OSError as e:
            errinfo = str(e)
            status = "Failed"
        for s in [status, errinfo]:
            yield s
Example #3
0
 class SomeService(Service):
     @srpc(Iterable(Unicode), _returns=Iterable(Unicode))
     def some_call(s):
         return s
Example #4
0
 class SomeService(Service):
     @srpc(_returns=Iterable(Integer))
     def some_call():
         return iter(range(1000))
Example #5
0
 class SomeService(ServiceBase):
     @srpc(Integer, _returns=Iterable(Integer))
     def some_call(yo):
         return range(yo)
Example #6
0
 class SomeService(ServiceBase):
     @srpc(Iterable(ECM), _returns=Iterable(ECM))
     def some_call(ecm):
         return ecm
Example #7
0
class HelloWorldService(Service):
    @rpc(Unicode, Integer, _returns=Iterable(Unicode))
    def say_hello(self, name, times):
        print("Hlloe")
        for i in range(times):
            yield 'Hello, %s' % name
Example #8
0
class PlaceManagerService(ServiceBase):
    @rpc(Mandatory.UnsignedInteger32, _returns=Place)
    def get_place(ctx, place_id):
        return ctx.udc.session.query(Place).filter_by(id=place_id).one()

    @rpc(Place, _returns=UnsignedInteger32)
    def put_place(ctx, place):
        if place.id is None:
            ctx.udc.session.add(place)
            ctx.udc.session.flush()  # so that we get the place.id value

        else:
            if ctx.udc.session.query(Place).get(place.id) is None:
                # this is to prevent the client from setting the primary key
                # of a new object instead of the database's own primary-key
                # generator.
                # Instead of raising an exception, you can also choose to
                # ignore the primary key set by the client by silently doing
                # place.id = None
                raise ResourceNotFoundError('place.id=%d' % place.id)

            else:
                ctx.udc.session.merge(place)

        return place.id

    @rpc(Mandatory.UnsignedInteger32)
    def del_place(ctx, place_id):
        count = ctx.udc.session.query(Place).filter_by(id=place_id).count()
        if count == 0:
            raise ResourceNotFoundError(place_id)

        ctx.udc.session.query(Place).filter_by(id=place_id).delete()

    @rpc(_returns=Iterable(Place))
    def get_all_places(ctx):
        return ctx.udc.session.query(Place)

    @rpc(Mandatory.UnsignedInteger32,
         UnsignedInteger32,
         UnsignedInteger32,
         _returns=Iterable(Place))
    def get_places_by_category_id(ctx, category_id, from_id=0, elements=None):
        places = ctx.udc.session.query(Place).filter_by(
            category_id=category_id)
        if from_id is not None:
            places = [place for place in places if place.id >= from_id]
            for place in places:
                place.rating = -1.0 if place.rating == 0.0 else place.rating
        return _partition_places(places, elements)

    @rpc(Mandatory.UnsignedInteger32,
         Decimal,
         Decimal,
         Decimal,
         UnsignedInteger32,
         UnsignedInteger32,
         _returns=Iterable(Place))
    def get_near_places_by_category_id(ctx,
                                       category_id,
                                       lat,
                                       lng,
                                       radius,
                                       from_id=0,
                                       elements=None):
        places = ctx.udc.session.query(Place).filter_by(
            category_id=category_id)
        places = places.order_by(asc(Place.id))
        if from_id is not None:
            places = [place for place in places if place.id >= from_id]
        # Filter just near places
        places = [
            place for place in places
            if _are_points_closed(place.lat, place.lng, lat, lng, radius)
        ]
        # Just places id greater than from_id
        return _partition_places(places, elements)

    @rpc(Mandatory.Unicode, Mandatory.UnsignedInteger32, _returns=Boolean)
    def gplaces_id_exists_in_category(ctx, gplaces_id, category_id):
        return ctx.udc.session.query(Place).filter_by(
            category_id=category_id, gplaces_id=gplaces_id).count() > 0

    @rpc(Unicode, File(min_occurs=1, nullable=False), _returns=Unicode)
    def upload_image(ctx, image_name, image_file):
        image_name = image_name.replace(
            ' ', '_') + '_' + datetime.datetime.now().strftime(
                "%d-%m-%y_%H.%m") + '.jpg'
        path = os.path.join(os.path.abspath('/srv/images'), image_name)
        if not path.startswith(os.path.abspath('/srv/images')):
            raise ValidationError(image_file)
        f = open(path, 'wb')
        try:
            for data in image_file.data:
                f.write(base64.b64decode(data))
            logger.debug("File written: %r" % image_name)
            f.close()
        except:
            f.close()
            os.remove(image_name)
            logger.debug("File removed: %r" % image_name)
            raise  # again, the client will see an internal error.
        # Watch out the port!
        url = 'http://' + socket.gethostbyname(
            socket.gethostname()) + ':8080/images/' + image_name
        return url
Example #9
0
class HelloService(ServiceBase):
    @rpc(Unicode, Integer, _returns=Iterable(Unicode))
    def SayHello(ctx, Name, Times):
        return (u"Hello, {0}!".format(Name) for _ in xrange(Times))
Example #10
0
class HelloWorldService(ServiceBase):
    @rpc(String, Integer, _returns=Iterable(String))
    def say_hello(ctx, name, times):
        for i in xrange(times):
            yield 'Hello, %s' % name
Example #11
0
class SomeSoapService(spyne.Service):
    __service_url_path__ = '/soap/someservice'
    __in_protocol__ = Soap11(validator='lxml')
    __out_protocol__ = Soap11()

    @spyne.srpc(Unicode, Unicode, _returns=Iterable(Unicode))
    def hello(xusername, xpassword):
        try:
            connection = mysql.connector.connect(host='127.0.0.1',
                                                 database='arbolito',
                                                 user='******',
                                                 password='******')
            cursor = connection.cursor()
            args = [
                xusername,
                xpassword,
            ]
            cursor.callproc("checkUser", args)

            for result in cursor.stored_results():
                tup = result.fetchone()

            str1 = "".join(tup)
            cantidad = str1.count("Error")

            if (cantidad == 0):
                return str1, 200
            else:
                return str1, 404
        except mysql.connector.Error as error:
            print("Failed to execute stored procedure: {}".format(error))
        finally:
            if (connection.is_connected()):
                cursor.close()
                connection.close()
                print("MySQL connection is closed")

    @spyne.srpc(Unicode,
                Unicode,
                Unicode,
                Unicode,
                Unicode,
                Unicode,
                float,
                _returns=Iterable(Unicode))
    def createUser(username, password, dni, name, surname, currency, amount):
        try:
            connection = mysql.connector.connect(host='127.0.0.1',
                                                 database='arbolito',
                                                 user='******',
                                                 password='******')
            cursor = connection.cursor()
            args = [username, password, dni, name, surname, currency, amount]
            cursor.callproc("createUser", args)
            connection.commit()

            for result in cursor.stored_results():
                tup = result.fetchone()

            str1 = "".join(tup)

            return str1, 200
        except mysql.connector.Error as error:
            print("Failed to execute stored procedure: {}".format(error))
        finally:
            if (connection.is_connected()):
                cursor.close()
                connection.close()
                print("MySQL connection is closed")

    @spyne.srpc(Unicode, _returns=Iterable(Unicode))
    def deleteUser(id):
        try:
            connection = mysql.connector.connect(host='127.0.0.1',
                                                 database='arbolito',
                                                 user='******',
                                                 password='******')
            cursor = connection.cursor()
            args = [
                id,
            ]
            cursor.callproc("deleteUser", args)
            connection.commit()

            for result in cursor.stored_results():
                tup = result.fetchone()

            str1 = "".join(tup)

            if (str1 == "deleted"):
                return str1, 200
            else:
                return str1, 404
        except mysql.connector.Error as error:
            print("Failed to execute stored procedure: {}".format(error))
        finally:
            if (connection.is_connected()):
                cursor.close()
                connection.close()
                print("MySQL connection is closed")

    @spyne.srpc(Unicode, Unicode, Unicode, float, _returns=Iterable(Unicode))
    def buy(id, currency, currencyTo, amountTo):
        try:
            connection = mysql.connector.connect(host='127.0.0.1',
                                                 database='arbolito',
                                                 user='******',
                                                 password='******')
            cursor = connection.cursor()
            #moneda. Para el caso de valor de compra, se establece un precio del 94% sobre el
            #valor de venta. Por ejemplo, si el valor del dolar es de $60, la casa de cambio le vende al usuario a $60 y se los
            #compra a $56,40.
            url = 'http://data.fixer.io/api/latest?access_key=6f29ee6eb68ccc8ec4043564a16e5a51&symbols=' + currency + ',' + currencyTo
            response = requests.get(url)
            data = json.loads(response.text)
            currency1 = (data['rates'][currency])
            currencyTo1 = (data['rates'][currencyTo])
            # $1 de moneda a comprar
            valorPorCadaPeso = (currency1) / currencyTo1
            args = [
                id,
                currency,
                currencyTo,
                amountTo,
                str(round(valorPorCadaPeso, 2)),
            ]
            cursor.callproc("buy", args)
            connection.commit()

            for result in cursor.stored_results():
                tup = result.fetchone()

            str1 = " ".join(map(str, tup))

            if (str1 == 'success'):
                return str1, 200
            elif (str1 ==
                  'Error 102: No posees saldo suficiente para realizar la operacion'
                  ):
                return str1, 404
            elif (str1 == 'Error 100: No existe un usuario con ese id'):
                return str1, 404
        except mysql.connector.Error as error:
            print("Failed to execute stored procedure: {}".format(error))
        finally:
            if (connection.is_connected()):
                cursor.close()
                connection.close()
                print("MySQL connection is closed")

    @spyne.srpc(Unicode, Unicode, Unicode, float, _returns=Iterable(Unicode))
    def sell(id, currency, currencyToBuy, amount):
        try:
            connection = mysql.connector.connect(host='127.0.0.1',
                                                 database='arbolito',
                                                 user='******',
                                                 password='******')
            cursor = connection.cursor()
            #moneda. Para el caso de valor de compra, se establece un precio del 94% sobre el
            #valor de venta. Por ejemplo, si el valor del dolar es de $60, la casa de cambio le vende al usuario a $60 y se los
            #compra a $56,40.
            url = 'http://data.fixer.io/api/latest?access_key=6f29ee6eb68ccc8ec4043564a16e5a51&symbols=' + currency + ',' + currencyToBuy
            response = requests.get(url)
            data = json.loads(response.text)
            currency1 = (data['rates'][currency])
            currencyTo1 = (data['rates'][currencyToBuy])
            # $1 de moneda a comprar
            valorPorCadaPeso = ((currencyTo1) / currency1) * 0.94

            args = [
                id,
                currency,
                amount,
                str(round(valorPorCadaPeso, 2)),
            ]
            cursor.callproc("sell", args)
            connection.commit()

            for result in cursor.stored_results():
                tup = result.fetchone()

            str1 = " ".join(map(str, tup))

            if (str1 == 'success'):
                return str1, 200
            elif (str1 ==
                  'Error 102: No posees saldo suficiente para realizar la operacion'
                  ):
                return str1, 404
            elif (str1 == 'Error 100: No existe un usuario con ese id'):
                return str1, 404
        except mysql.connector.Error as error:
            print("Failed to execute stored procedure: {}".format(error))
        finally:
            if (connection.is_connected()):
                cursor.close()
                connection.close()
                print("MySQL connection is closed")

    @spyne.srpc(Unicode, Unicode, float, _returns=Iterable(Unicode))
    def withdraw(id, currency, amount):
        try:
            connection = mysql.connector.connect(host='127.0.0.1',
                                                 database='arbolito',
                                                 user='******',
                                                 password='******')
            cursor = connection.cursor()
            args = [
                id,
                currency,
                amount,
            ]
            cursor.callproc("withdraw", args)
            connection.commit()

            for result in cursor.stored_results():
                tup = result.fetchone()

            str1 = " ".join(map(str, tup))

            if (str1 == 'success'):
                return str1, 200
            elif (str1 == 'Error 101: No tienes dinero suficiente'):
                return str1, 404
            elif (str1 == 'Error 100: No existe un usuario con ese id'):
                return str1, 404
        except mysql.connector.Error as error:
            print("Failed to execute stored procedure: {}".format(error))
        finally:
            if (connection.is_connected()):
                cursor.close()
                connection.close()
                print("MySQL connection is closed")

    @spyne.srpc(Unicode, Unicode, float, _returns=Iterable(Unicode))
    def deposit(id, currency, amount):
        try:
            connection = mysql.connector.connect(host='127.0.0.1',
                                                 database='arbolito',
                                                 user='******',
                                                 password='******')
            cursor = connection.cursor()
            args = [
                id,
                currency,
                amount,
            ]
            cursor.callproc("deposit", args)
            connection.commit()

            for result in cursor.stored_results():
                tup = result.fetchone()

            str1 = " ".join(map(str, tup))
            if (str1 == 'success'):
                return str1, 200
            elif (str1 == 'Error 100: No existe un usuario con ese id'):
                return str1, 404
        except mysql.connector.Error as error:
            print("Failed to execute stored procedure: {}".format(error))
        finally:
            if (connection.is_connected()):
                cursor.close()
                connection.close()
                print("MySQL connection is closed")

    @spyne.srpc(Unicode, _returns=Iterable(Unicode))
    def balance(id):
        try:
            connection = mysql.connector.connect(host='127.0.0.1',
                                                 database='arbolito',
                                                 user='******',
                                                 password='******')
            cursor = connection.cursor()
            args = [
                id,
            ]
            cursor.callproc("balance", args)

            for result in cursor.stored_results():
                tup = result.fetchall()

            str1 = " ".join(map(str, tup))
            return str1, 200
        except mysql.connector.Error as error:
            print("Failed to execute stored procedure: {}".format(error))
        finally:
            if (connection.is_connected()):
                cursor.close()
                connection.close()
                print("MySQL connection is closed")

    @spyne.srpc(Unicode, Unicode, _returns=Iterable(Unicode))
    def balancePerCurrency(currency, id):
        try:
            connection = mysql.connector.connect(host='127.0.0.1',
                                                 database='arbolito',
                                                 user='******',
                                                 password='******')
            cursor = connection.cursor()
            args = [
                id,
                currency,
            ]
            cursor.callproc("balancePerCurrency", args)

            for result in cursor.stored_results():
                tup = result.fetchone()

            str1 = " ".join(map(str, tup))

            return str1, 200
        except mysql.connector.Error as error:
            print("Failed to execute stored procedure: {}".format(error))
        finally:
            if (connection.is_connected()):
                cursor.close()
                connection.close()
                print("MySQL connection is closed")
Example #12
0
class JsonService(ServiceBase):
    @rpc(_returns=Iterable(Unicode))
    def get_json(self):
        jsn = m.read_json()
        return HttpResponse(jsn)
Example #13
0
class XmlService(ServiceBase):
    @rpc(_returns=Iterable(Unicode))
    def get_xml(self):
        xml = m.read_xml()
        return HttpResponse(xml)
Example #14
0
class HelloWorldService(ServiceBase):
    @rpc(Unicode, _returns=Iterable(Unicode))
    def hello(ctx, name):
        return f'Hello, {name}'
Example #15
0
 class SomeService(ServiceBase):
     @srpc(_returns=Iterable(Integer))
     def some_call():
         return 1, 2
Example #16
0
class HelloWorldService(Service):
    @rpc(Unicode, Integer, _returns=Iterable(Unicode))
    def hello(ctx, name, times):
        name = name or ctx.udc.config['HELLO']
        for i in range(times):
            yield u'Hello, %s' % name
Example #17
0
 class SomeService(ServiceBase):
     @srpc(Iterable(String), _returns=Iterable(String))
     def some_call(s):
         return s
Example #18
0
class HelloWorldService(ServiceBase):
    # '''sskdjf谁看得见发牢骚降低非'''
    @srpc(String, UnsignedInteger, _returns=Iterable(String))
    def say_hello(name, times):
        for i in xrange(times):
            yield 'Hello,%s' % name
Example #19
0
class HelloWorldService(ServiceBase):
    @rpc(Unicode, Integer, _returns=Iterable(Unicode))
    def say_hello(ctx, name, times):
        for i in range(times):
            yield 'Hola, %s' % name
Example #20
0
class AutoConfigServer(ServiceBase):
    """ TR-069 ACS implementation. The TR-069/CWMP RPC messages are defined, as
        per cwmp-1-0.xsd schema definition, in the RPC decorators below. These
        RPC methods are intended to be called by TR-069-compliant customer
        premesis equipment (CPE), over the SOAP/HTTP interface defined by
        TR-069.

        Per spyne documentation, this class is never instantiated, so all RPC
        functions are implicitly staticmethods. Hence use static class variables
        to hold state.
        This also means that only a single thread can be used (since there are
        no locks).
        Note that staticmethod decorator can't be used in conjunction with rpc
        decorator.
    """
    __out_header__ = models.ID
    __in_header__ = models.ID
    _acs_to_cpe_queue = None
    _cpe_to_acs_queue = None

    """ Set maxEnvelopes to 1, as per TR-069 spec """
    _max_envelopes = 1

    @classmethod
    def set_state_machine_pointer(
        cls,
        state_machine_pointer: StateMachinePointer
    ) -> None:
        cls.state_machine_pointer = state_machine_pointer

    @classmethod
    def get_new_state_machine(
        cls,
        device_name: EnodebDeviceName,
    ) -> EnodebAcsStateMachine:
        """
        Create a new state machine because the previous used data model was
        incorrect
        """
        device_handler_class = get_device_handler_from_name(device_name)
        service = cls.state_machine().service
        stats_mgr = cls.state_machine().stats_manager
        acs_state_machine = device_handler_class(service, stats_mgr)
        return acs_state_machine

    @classmethod
    def _handle_tr069_message(cls, ctx: Any, message: ComplexModelBase) -> Any:
        if not cls.state_machine():
            raise Tr069Error('ACS not given eNB state machine')

        # Log incoming msg
        if hasattr(message, 'as_dict'):
            logging.debug('Handling TR069 message: %s', str(type(message)))
        else:
            logging.debug('Handling TR069 message.')

        try:
            req = cls.state_machine().handle_tr069_message(message)
        except IncorrectDeviceHandlerError as err:
            logging.warning('Incorrect device_handler! Switching to : %s',
                            str(err.device_name))
            cls.set_state_machine(
                cls.get_new_state_machine(err.device_name))
            # Retry with the new state machine
            req = cls.state_machine().handle_tr069_message(message)

        # Log outgoing msg
        if hasattr(req, 'as_dict'):
            logging.debug('Sending TR069 message: %s', str(req.as_dict()))
        else:
            logging.debug('Sending TR069 message.')

        # Set header
        ctx.out_header = models.ID(mustUnderstand='1')
        ctx.out_header.Data = 'null'

        # Set return message name
        if isinstance(req, models.DummyInput):
            # Generate 'empty' request to CPE using empty message name
            ctx.descriptor.out_message.Attributes.sub_name = 'EmptyHttp'
            return models.AcsToCpeRequests()
        ctx.descriptor.out_message.Attributes.sub_name = req.__class__.__name__
        return cls._generate_acs_to_cpe_request_copy(req)

    @staticmethod
    def _generate_acs_to_cpe_request_copy(request):
        """ Create an AcsToCpeRequests instance with all the appropriate
            members set from the input request. AcsToCpeRequests is a union of
            all request messages, so field names match.
        """
        request_out = models.AcsToCpeRequests()
        for parameter in request.get_flat_type_info(request.__class__):
            try:
                setattr(request_out, parameter, getattr(request, parameter))
            except(AttributeError):
                # Allow un-set parameters. If CPE can't handle this, it will
                # respond with an error message
                pass
        return request_out

    @classmethod
    def state_machine(cls) -> EnodebAcsStateMachine:
        return cls.state_machine_pointer.state_machine

    @classmethod
    def set_state_machine(cls, state_machine: EnodebAcsStateMachine) -> None:
        cls.state_machine_pointer.state_machine = state_machine


    # CPE->ACS RPC calls

    @rpc(_returns=Iterable(String),
         _operation_name="GetRPCMethods")
    def get_rpc_methods(ctx):
        """ GetRPCMethods RPC call is terminated here. No need to pass to higher
            layer """
        fill_response_header(ctx)

        for rpc_method in RPC_METHODS:
            yield '%s' % rpc_method

    @rpc(models.Inform,
         _returns=models.InformResponse,
         _body_style="bare",
         _operation_name="Inform",
         _out_message_name="InformResponse")
    def inform(ctx, request):
        """ Inform response generated locally """
        fill_response_header(ctx)
        resp = AutoConfigServer._handle_tr069_message(ctx, request)
        resp.MaxEnvelopes = AutoConfigServer._max_envelopes
        return resp

    @rpc(models.TransferComplete,
         _returns=models.TransferCompleteResponse,
         _body_style="bare",
         _operation_name="TransferComplete",
         _out_message_name="TransferCompleteResponse")
    def transfer_complete(ctx, request):
        fill_response_header(ctx)
        resp = AutoConfigServer._handle_tr069_message(ctx, request)
        resp.MaxEnvelopes = AutoConfigServer._max_envelopes
        return resp

    # Spyne does not handle no input or SimpleModel input for 'bare' function
    # DummyInput is unused
    # pylint: disable=unused-argument
    @rpc(models.DummyInput,
         _returns=models.AcsToCpeRequests,
         _out_message_name="EmptyHttp",
         _body_style='bare',
         _operation_name="EmptyHttp")
    def empty_http(ctx, dummy):
        # Function to handle empty HTTP request
        return AutoConfigServer._handle_tr069_message(ctx, dummy)

    # CPE->ACS responses to ACS->CPE RPC calls

    @rpc(models.SetParameterValuesResponse,
         _returns=models.AcsToCpeRequests,
         _out_message_name="MessageNameToBeReplaced",
         _body_style='bare',
         _operation_name="SetParameterValuesResponse")
    def set_parameter_values_response(ctx, response):
        return AutoConfigServer._handle_tr069_message(ctx, response)

    @rpc(models.GetParameterValuesResponse,
         _returns=models.AcsToCpeRequests,
         _out_message_name="MessageNameToBeReplaced",
         _body_style='bare',
         _operation_name="GetParameterValuesResponse")
    def get_parameter_values_response(ctx, response):
        return AutoConfigServer._handle_tr069_message(ctx, response)

    @rpc(models.GetParameterNamesResponse,
         _returns=models.AcsToCpeRequests,
         _out_message_name="MessageNameToBeReplaced",
         _body_style='bare',
         _operation_name="GetParameterNamesResponse")
    def get_parameter_names_response(ctx, response):
        return AutoConfigServer._handle_tr069_message(ctx, response)

    @rpc(models.SetParameterAttributesResponse,
         _returns=models.AcsToCpeRequests,
         _out_message_name="MessageNameToBeReplaced",
         _body_style='bare',
         _operation_name="SetParameterAttributesResponse")
    def set_parameter_attributes_response(ctx, response):
        return AutoConfigServer._handle_tr069_message(ctx, response)

    @rpc(models.GetParameterAttributesResponse,
         _returns=models.AcsToCpeRequests,
         _out_message_name="MessageNameToBeReplaced",
         _body_style='bare',
         _operation_name="GetParameterAttributesResponse")
    def get_parameter_attributes_response(ctx, response):
        return AutoConfigServer._handle_tr069_message(ctx, response)

    @rpc(models.AddObjectResponse,
         _returns=models.AcsToCpeRequests,
         _out_message_name="MessageNameToBeReplaced",
         _body_style='bare',
         _operation_name="AddObjectResponse")
    def add_object_response(ctx, response):
        return AutoConfigServer._handle_tr069_message(ctx, response)

    @rpc(models.DeleteObjectResponse,
         _returns=models.AcsToCpeRequests,
         _out_message_name="MessageNameToBeReplaced",
         _body_style='bare',
         _operation_name="DeleteObjectResponse")
    def delete_object_response(ctx, response):
        return AutoConfigServer._handle_tr069_message(ctx, response)

    @rpc(models.DownloadResponse,
         _returns=models.AcsToCpeRequests,
         _out_message_name="MessageNameToBeReplaced",
         _body_style='bare',
         _operation_name="DownloadResponse")
    def download_response(ctx, response):
        return AutoConfigServer._handle_tr069_message(ctx, response)

    @rpc(models.RebootResponse,
         _returns=models.AcsToCpeRequests,
         _out_message_name="MessageNameToBeReplaced",
         _body_style='bare',
         _operation_name="RebootResponse")
    def reboot_response(ctx, response):
        return AutoConfigServer._handle_tr069_message(ctx, response)

    @rpc(models.Fault,
         _returns=models.AcsToCpeRequests,
         _out_message_name="MessageNameToBeReplaced",
         _body_style='bare',
         _operation_name="Fault")
    def fault(ctx, response):
        return AutoConfigServer._handle_tr069_message(ctx, response)