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
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()
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
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
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