示例#1
0
def provision_example(options):
    vendorname = options['vendorname']
    vendortoken = options['vendortoken']
    clonecik = options['clonecik']
    portalcik = options['portalcik']

    print('pyonep version ' + pyonep.__version__)
    r = random.randint(1, 10000000)
    model = 'MyTestModel' + str(r)
    sn1 = '001' + str(r)
    sn2 = '002' + str(r)
    sn3 = '003' + str(r)
    op = OnepV1()
    isok, portalrid = op.lookup(portalcik, 'alias', '')
    if not isok:
        print("Failed to look up portal RID")
    else:
        print("portalrid: '{}'".format(portalrid))
    isok, clonerid = op.lookup(clonecik, 'alias', '')
    if not isok:
        print("Failed to look up clone RID")
        exit()
    else:
        print("clonerid: '{}'".format(clonerid))
        provision = Provision('m2.exosite.com',
                              https=True,
                              port=443,
                              manage_by_cik=False,
                              verbose=False,
                              raise_api_exceptions=True)
    try:
        print("model_create()")
        provision.model_create(vendortoken, model, clonerid, aliases=False)

        # production code should read isok before using body
        print provision.model_list(vendortoken).body
        print provision.model_info(vendortoken, model).body
        print("serialnumber_add()")
        provision.serialnumber_add(vendortoken, model, sn1)
        print("serialnumber_add_batch()")
        provision.serialnumber_add_batch(vendortoken, model, [sn2, sn3])
        print provision.serialnumber_list(vendortoken, model, limit=10).body
        print("serialnumber_remove_batch()")
        provision.serialnumber_remove_batch(vendortoken, model, [sn2, sn3])
        print provision.serialnumber_list(vendortoken, model).body
        print("serialnumber_enable()")
        provision.serialnumber_enable(
            vendortoken, model, sn1,
            portalrid)  # return clientid
        print "AFTER ENABLE:", provision.serialnumber_info(vendortoken,
                                                           model, sn1).body
        print("serialnumber_disable()")
        provision.serialnumber_disable(vendortoken, model, sn1)
        print "AFTER DISABLE:", provision.serialnumber_info(vendortoken,
                                                            model, sn1).body
        print("serialnumber_reenable()")
        provision.serialnumber_reenable(vendortoken, model, sn1)
        print "AFTER REENABLE:", provision.serialnumber_info(vendortoken,
                                                             model, sn1).body
        print("serialnumber_activate()")

        # return client key,
        sn_cik = provision.serialnumber_activate(model, sn1, vendorname).body
        print "AFTER ACTIVATE:", provision.serialnumber_info(vendortoken,
                                                             model, sn1).body

        def test_content(content_id, content_data, content_type, content_meta):
            print("content_create()")
            provision.content_create(vendortoken, model, content_id,
                                    content_meta)
            print provision.content_list(vendortoken, model)
            print("content_upload()")
            print provision.content_upload(vendortoken, model, content_id,
                                        content_data, content_type)
            print provision.content_list(vendortoken, model)
            print provision.content_info(vendortoken, model, content_id)
            print("content_download()")
            print provision.content_download(sn_cik, vendorname, model, content_id)
            print("content_remove()")
            provision.content_remove(vendortoken, model, content_id)

        test_content("a.txt", "This is content data", "text/plain", "This is text")

        # TODO: binary content

        print("model_remove()")
        provision.model_remove(vendortoken, model)
    except ProvisionException:
        ex = sys.exc_info()[1]
        print('API Error: {0} {1}'.format(ex.response.status(),
                                          ex.response.reason()))
        return False
    except httplib.HTTPException:
        ex = sys.exc_info()[1]
        print('HTTPException: {0}'.format(ex))
        return False

    # no error
    return True
示例#2
0
import sqlite3 as lite
import pyonep
import logging
from pyonep import onep
from pyonep.provision import Provision
from pyonep.onep import OnepV1
from pyonep.exceptions import ProvisionException
from pyonep.exceptions import OneException
#import RPi.GPIO as GPIO
Setup_logger = logging.getLogger("exosite.setup")
con = lite.connect('pi.db')
prompt = '> '
o = onep.OnepV1()
provision = Provision('m2.exosite.com',
                      https=True,
                      port=443,
                      manage_by_cik=False,
                      verbose=False,
                      raise_api_exceptions=True)


def Wall_config():
    print "What would you like to configure? (1=Modbus, 2=Gateway, 3=Sensors, 4=Outputs, 5=Timers 0=Exit)"
    selection = int(raw_input(prompt))
    if selection == 1:
        Modbus_config()
    elif selection == 2:
        Gateway_config()
    elif selection == 3:
        Sensors_config()
    elif selection == 4:
        Outputs_config()
示例#3
0
def provision_example(vendorname, vendortoken, clonerid, portalcik, portalrid):
    print('pyonep version ' + pyonep.__version__)
    r = random.randint(1, 10000000)
    model = 'MyTestModel' + str(r)
    sn1 = '001' + str(r)
    sn2 = '002' + str(r)
    sn3 = '003' + str(r)
    sn4 = '004' + str(r)
    csv_string = random_csv_string()
    extra = 'Extra info' + str(r)
    op = OnepV1()

    provision = Provision('m2.exosite.com',
                          https=True,
                          port=443,
                          manage_by_cik=False,
                          verbose=False,
                          httptimeout=20,
                          raise_api_exceptions=True,
                          manage_by_sharecode=True)
    # manage by sharecode
    option = "[\"" + vendorname + "\", \"" + model + "\"]"
    meta = {"meta": option}
    print("op.share", portalcik, clonerid, meta)
    isok, sharecode = op.share(portalcik, clonerid, meta)
    if not isok:
        print("failed to create share code")
        return False
    try:
        print("model_create() ", vendortoken, model, sharecode)
        provision.model_create(vendortoken, model, sharecode, aliases=False)

        # production code should read isok before using body
        print("model_list()")
        print(provision.model_list(vendortoken).body)
        print(provision.model_info(vendortoken, model).body)
        print("serialnumber_add()")
        provision.serialnumber_add(vendortoken, model, sn1)
        print("serialnumber_add()")
        provision.serialnumber_add(vendortoken, model, sn4, extra=extra)
        print("serialnumber_add_batch()")
        provision.serialnumber_add_batch(vendortoken, model, [sn2, sn3])
        print("serialnumber_add_batch_csv()")
        provision.serialnumber_add_batch_csv(vendortoken, model, csv_string)
        print(provision.serialnumber_list(vendortoken, model, limit=10).body)
        print("serialnumber_remove_batch()")
        provision.serialnumber_remove_batch(vendortoken, model, [sn2, sn3])
        print(
            provision.serialnumber_list(vendortoken, model, status=True).body)
        print("serialnumber_enable()")
        provision.serialnumber_enable(vendortoken, model, sn1,
                                      portalrid)  # return clientid
        print("AFTER ENABLE:",
              provision.serialnumber_info(vendortoken, model, sn1).body)
        print("serialnumber_disable()")
        provision.serialnumber_disable(vendortoken, model, sn1)
        print("AFTER DISABLE:",
              provision.serialnumber_info(vendortoken, model, sn1).body)
        print("serialnumber_reenable()")
        provision.serialnumber_reenable(vendortoken, model, sn1)
        print("AFTER REENABLE:",
              provision.serialnumber_info(vendortoken, model, sn1).body)
        print("serialnumber_activate()")

        # return client key,
        sn_cik = provision.serialnumber_activate(model, sn1, vendorname).body
        print("AFTER ACTIVATE:",
              provision.serialnumber_info(vendortoken, model, sn1).body)

        def test_content(content_id, content_data, content_type, content_meta):
            print("content_create()")
            provision.content_create(vendortoken, model, content_id,
                                     content_meta)
            print(provision.content_list(vendortoken, model))
            print("content_upload()")
            print(
                provision.content_upload(vendortoken, model, content_id,
                                         content_data, content_type))
            print(provision.content_list(vendortoken, model))
            print(provision.content_info(vendortoken, model, content_id))
            print("content_download()")
            print(
                provision.content_download(sn_cik, vendorname, model,
                                           content_id))
            print("content_remove()")
            provision.content_remove(vendortoken, model, content_id)

        test_content("a.txt", "This is content data", "text/plain",
                     "This is text")

        # TODO: binary content

        print("model_remove()")
        provision.model_remove(vendortoken, model)
    except ProvisionException:
        ex = sys.exc_info()[1]
        print('API Error: {0} {1}'.format(ex.response.status(),
                                          ex.response.reason()))
        return False
    except httplib.HTTPException:
        ex = sys.exc_info()[1]
        print('HTTPException: {0}'.format(ex))
        return False

    # no error
    return True
示例#4
0
def provision_example(vendorname, vendortoken, clonerid, portalcik, portalrid):
    print('pyonep version ' + pyonep.__version__)
    r = random.randint(1, 10000000)
    model = 'MyTestModel' + str(r)
    sn1 = '001' + str(r)
    sn2 = '002' + str(r)
    sn3 = '003' + str(r)
    sn4 = '004' + str(r)
    csv_string = random_csv_string()
    extra = 'Extra info' + str(r)
    op = OnepV1()

    provision = Provision('m2.exosite.com',
                          https=True,
                          port=443,
                          manage_by_cik=False,
                          verbose=False,
                          httptimeout=20,
                          raise_api_exceptions=True,
                          manage_by_sharecode=True)
    # manage by sharecode
    option = "[\"" + vendorname + "\", \"" + model + "\"]"
    meta = {"meta": option}
    print("op.share", portalcik, clonerid, meta)
    isok, sharecode = op.share(portalcik, clonerid, meta)
    if not isok:
        print("failed to create share code")
        return False
    try:
        print("model_create() ", vendortoken, model, sharecode)
        provision.model_create(vendortoken, model, sharecode, aliases=False)

        # production code should read isok before using body
        print("model_list()")
        print(provision.model_list(vendortoken).body)
        print(provision.model_info(vendortoken, model).body)
        print("serialnumber_add()")
        provision.serialnumber_add(vendortoken, model, sn1)
        print("serialnumber_add()")
        provision.serialnumber_add(vendortoken, model, sn4, extra=extra)
        print("serialnumber_add_batch()")
        provision.serialnumber_add_batch(vendortoken, model, [sn2, sn3])
        print("serialnumber_add_batch_csv()")
        provision.serialnumber_add_batch_csv(vendortoken, model, csv_string)
        print(provision.serialnumber_list(vendortoken, model, limit=10).body)
        print("serialnumber_remove_batch()")
        provision.serialnumber_remove_batch(vendortoken, model, [sn2, sn3])
        print(provision.serialnumber_list(vendortoken, model, status=True).body)
        print("serialnumber_enable()")
        provision.serialnumber_enable(
            vendortoken, model, sn1,
            portalrid)  # return clientid
        print("AFTER ENABLE:", provision.serialnumber_info(vendortoken,
                                                           model, sn1).body)
        print("serialnumber_disable()")
        provision.serialnumber_disable(vendortoken, model, sn1)
        print("AFTER DISABLE:", provision.serialnumber_info(vendortoken,
                                                            model, sn1).body)
        print("serialnumber_reenable()")
        provision.serialnumber_reenable(vendortoken, model, sn1)
        print("AFTER REENABLE:", provision.serialnumber_info(vendortoken,
                                                             model, sn1).body)
        print("serialnumber_activate()")

        # return client key,
        sn_cik = provision.serialnumber_activate(model, sn1, vendorname).body
        print("AFTER ACTIVATE:", provision.serialnumber_info(vendortoken,
                                                             model, sn1).body)

        def test_content(content_id, content_data, content_type, content_meta):
            print("content_create()")
            provision.content_create(vendortoken, model, content_id,
                                     content_meta)
            print(provision.content_list(vendortoken, model))
            print("content_upload()")
            print(provision.content_upload(vendortoken, model, content_id,
                                           content_data, content_type))
            print(provision.content_list(vendortoken, model))
            print(provision.content_info(vendortoken, model, content_id))
            print("content_download()")
            print(provision.content_download(sn_cik, vendorname, model, content_id))
            print("content_remove()")
            provision.content_remove(vendortoken, model, content_id)

        test_content("a.txt", "This is content data", "text/plain", "This is text")

        # TODO: binary content

        print("model_remove()")
        provision.model_remove(vendortoken, model)
    except ProvisionException:
        ex = sys.exc_info()[1]
        print('API Error: {0} {1}'.format(ex.response.status(),
                                          ex.response.reason()))
        return False
    except httplib.HTTPException:
        ex = sys.exc_info()[1]
        print('HTTPException: {0}'.format(ex))
        return False

    # no error
    return True
示例#5
0
    def run(self, cmd, args, options): # pylint: disable=R0201
        global verbosity # pylint: disable=I0011,W0603

        # this plugin only supports tokens with regards to Provisioning API
        opprov = Provision(port=443, https=True, manage_by_cik=False)
        op = onep.OnepV1(port=443, https=True)
        # parent cik passed as 1st arg on cli
        pcik = args['<pcik>']
        # parent cik might be a ~/.exoline shortcut
        try:
            pcik = Keys(ExoConfig()).show(pcik)
        except: # pylint: disable=I0011,W0702
            pass

        alias = args['<alias>']
        cik_list = args.get('<ciks_and/or_keys>')
        verbosity = 1 if args['--verbose'] else 0
        rpc = options['rpc']
        opts = {'timeout': args['--timeout']} if args['--timeout'] else {}
        all_rids = []
        tail_rids = []
        cik_clients = {}

        # gather args
        if args.get('--limit'):
            opts['limit'] = int(args['--limit'][0])
        if args.get('--jq'):
            opts['jq'] = args['--jq'][0]
        if args.get('--model'):
            opts['model'] = args['--model']
        if args.get('--fullrid'):
            fullrid = True
        else:
            fullrid = False
        if args.get('--raw'):
            raw = True
        else:
            raw = False
        if args.get('--usetoken'):
            # provisioning api method
            vendortoken = Vendor(ExoConfig()).showtoken()
            model_list = []

            if opts.get('model'):
                model_list.append(opts['model'])
            else:
                response = opprov.model_list(vendortoken)
                if "OK" == response.reason():
                    model_list = response.body.split('\r\n')
                else:
                    print(response)
                    print("Couldn't retrieve list of client models.")

            for model in model_list:
                response = opprov.serialnumber_list(vendortoken, model)
                if "OK" == response.reason():
                    snlist = response.body
                    model_rids = [    x.split(',')[1] for x in snlist.split('\n') \
                                    if len(x.split(',')) == 3 
                    ]
                    # get all dataport aliases of client resources
                    for rid in model_rids:
                        op.info(
                            {'cik': pcik}, 
                            rid, 
                            {"aliases":True}, 
                            defer=True
                        )
                    response = op.send_deferred({'cik': pcik})
                    for val in response:
                        if val[1]:
                            rid = val[0]['arguments'][0]
                            model_rids.append(rid)
                            aliases = val[2]['aliases']
                            for rid in aliases:
                                if alias in aliases[rid]:
                                    tail_rids.append( rid )
                else:
                    print("Couldn't retrieve RIDs for model: {!r}".format(model))

        else: # default method
            # if ciks not provided, get all client resources of pcik
            model = opts.get('model')
            if [] == cik_list: # ciks not provided
                response = op.listing({'cik': pcik},["client"])
                model_rids = []
                if response[0]:
                    all_client_rids = response[1][0]
                    for client_rid in all_client_rids:
                        op.info(
                            {'cik': pcik}, 
                            client_rid, 
                            {"aliases":True, "description":True}, 
                            defer=True
                        )
                    response = op.send_deferred({'cik': pcik})
                    if response[1]:
                        # iterate through every client's info
                        for val in response:
                            # first, match all client aliases
                            # then, remove matches that don't match model
                            # do it this way in case the match model via meta
                            # doesn't work. atleast you'll have every alias
                            # that matches the one you're looking for.
                            aliases = val[2]['aliases']
                            for rid in aliases:
                                # if it's an alias match, append it to the list of tail_rids
                                if alias in aliases[rid]:
                                    tail_rids.append( rid )
                                    # make best attempt to pop the previous rid if 
                                    # it doesn't pass the meta model match
                                    meta = None
                                    try:
                                        meta = json.loads(val[2]['description']['meta'])
                                        # make sure models match
                                        # print(model, meta['device']['model'])
                                        if not model == meta['device']['model'] and None != model:
                                            # if they don't match, throw out the last one.
                                            tail_rids.pop()
                                    except ValueError:
                                        pass
                                    except KeyError:
                                        pass
            else: # ciks and/or shortcuts provided
                # first, get actual ciks from keys file
                tmp = []
                for cik in cik_list:
                    try:
                        # make best attempt at using .exoline keys
                        cik = Keys(ExoConfig()).show(cik)
                    except: # pylint: disable=I0011,W0702
                        pass
                    tmp.append(cik)
                cik_list = tmp

                # iterate through clients to find the rid of <alias>
                for cik in cik_list:
                    # TODO: can speed this up if use parent cik and defer!?
                    result = rpc.info({'cik':cik}, {"alias": ""} ,{"aliases": True})

                    for rid in result['aliases']:
                        if alias in result['aliases'][rid]:
                            cik_clients[cik] = {'rid': rid}
                            tail_rids.append(rid)

                    # it's entirely possible that the alias doesn't exist in any
                    # of the clients the user wants...
                    if None == cik_clients.get(cik):
                        print("Alias {!r} not found in client {!r}".format(alias, cik))
                
                # if 'clients' is empty, don't bother continuing
                if {} == cik_clients:
                    self.kill.set()

        limit=1 if not opts.get('limit') else opts['limit']
        # read an initial value
        for tail_rid in tail_rids:
            
            read = op.read(
                {'cik': pcik},
                tail_rid,
                { "limit":limit,"sort":"desc"},
                defer = True
            )
        response = op.send_deferred({'cik': pcik})
        # print(response)
        for val in response:
            if val[1]:
                tail_rid = val[0]['arguments'][0]
                # print(val[2])
                # check for case of no data in dataport
                for idx in range(0,limit):
                    if idx < len(val[2]):
                        data = val[2][idx][1]
                        timestamp = val[2][idx][0]
                        if opts.get('jq'):
                            data = jqlite(opts['jq'], data)
                    else:
                        data = None
                        timestamp = 0
                    Printer(tail_rid, timestamp, data, fullrid, raw).Print()

        if args.get('--once'):
            self.kill.set()

        # prepare websocket
        wss = OPWSS(pcik, self.kill)
        rpcid = 0
        tails = []

        rid_tails = { k:{} for k in tail_rids}

        for tail_rid in rid_tails:
            # get clients' rids of alias
            # make rpc call
            tails.append(
                {
                    "id": rpcid, 
                    "procedure": "subscribe", 
                    "arguments": [
                      tail_rid,
                      {
                        # "since": <timestamp>,
                        # "timeout": 1000*60*5, # 5 minutes
                        # ("subs_id": <subs_id>)
                      }
                    ]
                  }
            )
            rid_tails[tail_rid]['id'] = rpcid
            rpcid+=1

        wss.Q_in.put({"calls": tails})

        ws_thread = MethodThread(wss.run_forever, ())
        ws_thread.start()

        while not self.kill.is_set():
            try:
                q_data = wss.Q_out.get(True,1)
                msgs = json.loads( q_data ) if q_data else None
                # print("q: ", q_data)
                if None == msgs:
                    print("continue")
                    continue
                # msgs can be a dictionary: {"status": "ok"}
                # or it can be a list
                elif isinstance(msgs,dict):
                    if msgs.get('status') == "ok":
                        pass # this is what usually happens for the auth response
                    else:
                        print(msgs)
                elif isinstance(msgs, list):
                    for msg in msgs:
                        result = msg.get('result')
                        if result:
                            for tail_rid in rid_tails:
                                if rid_tails[tail_rid]['id'] == msg['id']:
                                    data = result[1]
                                    # support jq-style parsing
                                    if opts.get('jq'):
                                        data = jqlite(opts['jq'], data)

                                    Printer(tail_rid, timestamp, data, fullrid, raw).Print()
                else:
                    print("type {0} not supported: {1}".format(type(msgs), msgs))
            except queue.Empty:
                pass