labkeyInterface.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import urllib3
  2. #requests doesnt work as it lacks key password checking
  3. import chardet
  4. import json
  5. class labkeyInterface:
  6. def init(self,fname):
  7. #fname is a file with configuration
  8. try:
  9. f=open(fname)
  10. except OSError as e:
  11. print("Confgiuration error: OS error({0}): {1}").format(e.errno, e.strerror)
  12. raise
  13. self.connectionConfig=json.load(f)
  14. self.http=urllib3.PoolManager()
  15. if 'SSL' in self.connectionConfig:
  16. try:
  17. self.http = urllib3.PoolManager(\
  18. cert_file=self.connectionConfig['SSL']['user'],\
  19. cert_reqs='CERT_REQUIRED',\
  20. key_file=self.connectionConfig['SSL']['key'],\
  21. ca_certs=self.connectionConfig['SSL']['ca'])
  22. except KeyError:
  23. self.http = urllib3.PoolManager(\
  24. cert_reqs='CERT_REQUIRED',\
  25. ca_certs=self.connectionConfig['SSL']['ca'])
  26. #password=self.connectionConfig['SSL']['keyPwd'],\ doesnt work until 1.25
  27. def GetLabkeyUrl(self):
  28. return self.connectionConfig['host']+"/labkey"
  29. def GetLabkeyWebdavUrl(self):
  30. return self.GetLabkeyUrl()+"/_webdav"
  31. def getBasicAuth(self):
  32. user=self.connectionConfig['labkey']['user']
  33. pwd=self.connectionConfig['labkey']['password']
  34. return user+":"+pwd
  35. def get(self,url,binary=False):
  36. debug=False
  37. if debug:
  38. print("GET: {0}".format(url))
  39. headers=urllib3.util.make_headers(basic_auth=self.getBasicAuth())
  40. try:
  41. if not binary:
  42. return self.http.request('GET',url,headers=headers)
  43. else:
  44. return self.http.request('GET',url,headers=headers,preload_content=False)
  45. #f contains json as a return value
  46. #f contains json as a return value
  47. except urllib3.exceptions.HTTPError as e:
  48. print(e)
  49. #useful for querying code
  50. return e
  51. def head(self,url):
  52. debug=False
  53. if debug:
  54. print("HEAD: {0}".format(url))
  55. headers=urllib3.util.make_headers(basic_auth=self.getBasicAuth())
  56. try:
  57. return self.http.request('HEAD',url,headers=headers)
  58. except urllib3.exceptions.HTTPError as e:
  59. print(e)
  60. #usefule for querying code
  61. return e
  62. def post(self,url,data):
  63. debug=False
  64. headers=urllib3.util.make_headers(basic_auth=self.getBasicAuth())
  65. headers["Content-Type"]="application/json"
  66. #add csrf;also sets self.cookie
  67. headers["X-LABKEY-CSRF"]=self.getCSRF()
  68. headers["Cookie"]=self.cookie
  69. try:
  70. return self.http.request('POST',url,headers=headers,body=data)
  71. #f contains json as a return value
  72. except urllib3.exceptions.HTTPError as e:
  73. print(e)
  74. def mkcol(self,url):
  75. debug=False
  76. headers=urllib3.util.make_headers(basic_auth=self.getBasicAuth())
  77. #add csrf;also sets self.cookie
  78. headers["X-LABKEY-CSRF"]=self.getCSRF()
  79. headers["Cookie"]=self.cookie
  80. try:
  81. return self.http.request('MKCOL',url,headers=headers)
  82. #f contains json as a return value
  83. except urllib3.exceptions.HTTPError as e:
  84. print(e)
  85. def put(self,url,data):
  86. debug=False
  87. if debug:
  88. print("PUT: {}").format(url)
  89. headers=urllib3.util.make_headers(basic_auth=self.getBasicAuth())
  90. headers["Content-Type"]="application/octet-stream"
  91. #add csrf
  92. headers["X-LABKEY-CSRF"]=self.getCSRF()
  93. headers["Cookie"]=self.cookie
  94. try:
  95. return self.http.request('PUT',url,headers=headers,body=data)
  96. #f contains json as a return value
  97. except urllib3.exceptions.HTTPError as e:
  98. print(e)
  99. def getCSRF(self):
  100. url=self.GetLabkeyUrl()+'/login/whoAmI.view'
  101. response=self.get(url)
  102. self.cookie=response.getheader('Set-Cookie')
  103. encoding=chardet.detect(response.data)['encoding']
  104. jsonData=json.loads(response.data.decode(encoding))
  105. return jsonData["CSRF"]
  106. def getUserId(self):
  107. url=self.GetLabkeyUrl()+'/login/whoAmI.view'
  108. response=self.get(url)
  109. self.cookie=response.getheader('Set-Cookie')
  110. encoding=chardet.detect(response.data)['encoding']
  111. jsonData=json.loads(response.data.decode(encoding))
  112. return jsonData["id"]