| #!/usr/bin/env python |
| # -*- coding: utf-8 -*- |
| #/////////////////////////////////////////////////////////////////////////////// |
| #// Copyright (c) 2000-2019 Ericsson Telecom AB // |
| #// // |
| #// All rights reserved. This program and the accompanying materials // |
| #// are made available under the terms of the Eclipse Public License v2.0 // |
| #// which accompanies this distribution, and is available at // |
| #// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html // |
| #/////////////////////////////////////////////////////////////////////////////// |
| |
| import sys |
| import urllib2 |
| import json |
| |
| class DsRestAPI: |
| __url = "http://localhost:4001/" |
| |
| def __init__(self, p_url="", p_useProxy=True): |
| self.__useProxy = p_useProxy |
| if p_url is not None and p_url is not "": |
| if p_url[-1] != '/': |
| p_url += '/' |
| self.__url = p_url |
| self.__url += "api.dsapi" |
| self._urlOpener = urllib2.build_opener(urllib2.HTTPHandler(), urllib2.ProxyHandler({} if not p_useProxy else None)) |
| |
| def __httpcall(self, postdata, method = 'POST'): |
| ''' |
| Does a HTTP Request against the specified URL, with the optional POSTDATA piggyback, setting the method to the optional HTTP Verb. |
| Returns the HTTP Response body. |
| ''' |
| if not isinstance(postdata, basestring): |
| postdata = json.dumps(postdata) |
| req = urllib2.Request(self.__url, postdata, {'Content-Type': 'application/json'}) |
| req.add_header('Connection', 'close') |
| req.get_method = lambda: method |
| try: |
| return self._urlOpener.open(req).read() |
| except Exception as e: |
| msg = 'Error connecting to server: ' + str(e) |
| proxyList = [name[0:-5] for name in dir(urllib2.ProxyHandler()) if name.endswith('open')]; |
| if 'http' in proxyList and self.__useProxy: |
| msg += '\\nThe error may be caused by wrong proxy settings. Current possible poxys are: \\n' + ' '.join(proxyList) |
| msg += '\\nPlease try to use -noproxy option.' |
| return '{"contentList":[{"node":{"val":"' + msg + '", "tp":4}}]}' |
| |
| def getList(self, request): |
| '''Returns the response to the request as a json object''' |
| response = json.loads(self.getContentList(request)) |
| if "contentList" in response: |
| response = response["contentList"] |
| return response |
| |
| def getContentList(self, request): |
| '''Returns the response to the request as a string.''' |
| dsCall = {"requests": request, "timeOut": 5.0}; |
| return self.__httpcall(dsCall) |
| |
| def get(self, request): |
| '''Returns the first element of the response to the request as a json object.''' |
| return self.getList(request)[0] |
| |
| def getData(self, aSource, aElement, aParams = None, aPtcName = None): |
| '''Creates a getData request from the parameters and returns its response object, i.e. either a {list: [...]} or a {node: {...}} as a json object.''' |
| return self.get( [ {"getData": {"source": aSource, "element": aElement, "ptcname": aPtcName, "params": aParams}} ] ) |
| |
| def setData(self, aSource, aElement, aContent, aType, aParams = None, aPtcName = None, aIndxs = None): |
| '''Creates a setData request from the parameters and returns its response object, i.e. either a {list: [...]} or a {node: {...}} as a json object.''' |
| return self.get( [ {"setData": {"source": aSource, "element": aElement, "ptcname": aPtcName, "params": aParams, "content": aContent, "indxsInList": ([int(aIndxs)] if aIndxs is not None else None), "tp": int(aType or 0)}} ] ) |
| |
| def getHelp(self, aSource = None, aElement = None): |
| '''Returns the help as a json object.''' |
| if aSource is not None and aElement is not None: |
| help = self.getData("DataSource", "help", [ {"paramName": "Format", "paramValue": "JSON"}, {"paramName": "Source", "paramValue": aSource }, {"paramName": "Element", "paramValue": aElement} ] ) |
| elif aSource is not None: |
| help = self.getData("DataSource", "help", [ {"paramName": "Format", "paramValue": "JSON"}, {"paramName": "Source", "paramValue": aSource } ] ) |
| else: |
| help = self.getData("DataSource", "help", [ {"paramName": "Format", "paramValue": "JSON"} ] ) |
| txt = help["node"]["val"] |
| try: |
| help["node"]["val"] = json.loads(''.join(chr(int(''.join(c), 16)) for c in zip(txt[0::2], txt[1::2]))) # http://stackoverflow.com/a/9641593/357403 |
| return json.dumps(help, indent = 2, check_circular = False) |
| except Exception as e: |
| return help |
| |
| def usage(): |
| print "Usage:" |
| print sys.argv[0], "-?" |
| print sys.argv[0], "[-u <URL>] [-noproxy] -h [source [element]]" |
| print sys.argv[0], "[-u <URL>] [-noproxy] -f file" |
| print sys.argv[0], "[-u <URL>] [-noproxy] -j jsonString" |
| print sys.argv[0], "[-u <URL>] [-noproxy] -source <Source> -element <Element> [-ptcname <PTCName>] [-params <ParamName1 ParamValue1 ParamName2 ParamValue2 ...>] [-content <Content> -tp <Tp> [-indxsInList index1 index2]]" |
| print "All parameters that are sent to the server are case sensitive." |
| print "Legend:" |
| print "\t-?\t\tLocal usage" |
| print "\t-u\t\tThe URL of the remote server, it is http://localhost:4001 by default." |
| print "\t-noproxy\tSet this option to disable proxy usage." |
| print "\t-h\t\tHelp from remote server. Accepts 2 optional arguments to filter on Source, or on Source-specific Element." |
| print "\t-f\t\tLoad request from a file." |
| print "\t-j\t\tThe json string as the request. WARNING: use single ' to enclose the string." |
| print "" |
| print "List of types for the -tp parameter and their meaning:" |
| print "\t 1: intType" |
| print "\t 2: floatType" |
| print "\t 3: boolType" |
| print "\t 4: charstringType" |
| print "\t 5: octetstringType" |
| print "\t 6: hexstringType" |
| print "\t 7: bitstringType" |
| print "\t 8: integerlistType" |
| print "\t 9: floatlistType" |
| print "\t10: charstringlistType" |
| print "\t11: statusLEDType" |
| print "" |
| print "Examples:" |
| print "DataSource help:\t", sys.argv[0], ' -h' |
| print "Source filtered help:\t", sys.argv[0], ' -h ExecCtrl' |
| print "Help for an element:\t", sys.argv[0], ' -h ExecCtrl ScGrpStart' |
| print "Simple GetData request:\t", sys.argv[0], ' -source ExecCtrl -element Progressbar' |
| print "Use different address:\t", sys.argv[0], ' -u http://127.0.0.1:9876 -source ExecCtrl -element Progressbar' |
| print "Use without proxy:\t", sys.argv[0], ' -u http://127.0.0.1:4001 -noproxy -source ExecCtrl -element Progressbar' |
| print "GetData with params:\t", sys.argv[0], ' -source ExecCtrl -element ScGrpStart -params ScenarioGroup ScGroup1' |
| print "SetData example:\t", sys.argv[0], ' -source ExecCtrl -element ScGrpStart -content true -tp 3 -params ScenarioGroup ScGroup1' |
| print "GetData from JSON:\t", sys.argv[0], ' -j \'[{"getData": {"source": "ExecCtrl", "element": "ScGrpStart", "params": [{"paramName": "ScenarioGroup", "paramValue": "ScGroup1"}]}}]\'' |
| print "SetData from JSON:\t", sys.argv[0], ' -j \'[{"setData": {"source": "ExecCtrl", "element": "ScGrpStart", "params": [{"paramName": "ScenarioGroup", "paramValue": "ScGroup1"}], "tp": 3, "content": "true"}}]\'' |
| print "Request from file:\t", sys.argv[0], ' -f path/to/request/request.json' |
| |
| def printHumanReadableResponse(response): |
| if "list" in response: |
| print [str(listElement["node"]["val"]) for listElement in response["list"]] |
| else: |
| print response["node"]["val"] |
| |
| def DsRestAPIPythonAPIMain(argv): |
| argv = argv[1:] |
| url = '' |
| if '-u' in argv: |
| i = argv.index('-u') |
| url = argv[i + 1] |
| argv.pop(i) |
| argv.pop(i) |
| |
| proxies = True |
| if '-noproxy' in argv: |
| proxies = False |
| i = argv.index('-noproxy') |
| argv.pop(i) |
| |
| api = DsRestAPI(url, proxies) |
| |
| if '-?' in argv or len(argv) == 0: |
| usage() |
| elif '-g' in argv or '-s' in argv: |
| print '-g and -s parameters are not supported anymore due to an interface rationalization. Please update your request according to the new behavior.' |
| elif '-h' in argv: |
| i = argv.index('-h') |
| if i + 2 < len(argv): |
| print api.getHelp(argv[i+1], argv[i+2]) |
| elif i + 1 < len(argv): |
| print api.getHelp(argv[i+1]) |
| else: |
| print api.getHelp() |
| elif '-f' in argv: |
| fileName = argv[argv.index('-f') + 1] |
| f = open(fileName, 'r') |
| request = json.load(f) |
| f.close() |
| print api.getContentList(request) |
| elif '-j' in argv: |
| jsonString = argv[argv.index('-j') + 1] |
| request = json.loads(jsonString) |
| print api.getContentList(request) |
| else: |
| requests = [] |
| request = {} |
| if '-content' in argv and '-tp' in argv: |
| requests.append({'setData': request}) |
| else: |
| requests.append({'getData': request}) |
| i = 0 |
| while i < len(argv): |
| if i + 1 >= len(argv): |
| print 'Suspicious parameter detected:', argv[i] |
| i += 1 |
| elif argv[i] == '-source' and not argv[i+1].startswith('-'): |
| request['source'] = argv[i+1] |
| i += 2 |
| elif argv[i] == '-element' and not argv[i+1].startswith('-'): |
| request['element'] = argv[i+1] |
| i += 2 |
| elif argv[i] == '-ptcname' and not argv[i+1].startswith('-'): |
| request['ptcname'] = argv[i+1] |
| i += 2 |
| elif argv[i] == '-content' and not argv[i+1].startswith('-'): |
| request['content'] = argv[i+1] |
| i += 2 |
| elif argv[i] == '-tp' and not argv[i+1].startswith('-'): |
| request['tp'] = int(argv[i+1]) |
| i += 2 |
| elif argv[i] == '-params': |
| request['params'] = [] |
| i += 1 |
| while i + 1 < len(argv) and not argv[i].startswith('-') and not argv[i+1].startswith('-'): |
| request['params'].append({'paramName': argv[i], 'paramValue': argv[i+1]}) |
| i += 2 |
| elif argv[i] == 'indxsInList': |
| request['indxsInList'] = [] |
| i += 1 |
| while i < len(argv) and not argv[i].startswith('-'): |
| request['indxsInList'].append(int(argv[i])) |
| i += 1 |
| else: |
| print 'Suspicious parameter detected:', argv[i] |
| i += 1 |
| printHumanReadableResponse(api.get(requests)) |
| return 0 |
| |
| if __name__ == "__main__": |
| errCode = -1; |
| try: |
| errCode = DsRestAPIPythonAPIMain(sys.argv) |
| except Exception as e: |
| print 'Error while processing your request: ' + str(e) |
| sys.exit(errCode) |