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