nixWrapper.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. import sys
  2. import os
  3. import urllib3
  4. import shutil
  5. import zipfile
  6. import pathlib
  7. import json
  8. import getpass
  9. import chardet
  10. import base64
  11. #this is meant to be used as a startup script
  12. #all commands will be executed when python -m script -i is used
  13. #generic function to load library from gitlab
  14. def getSuitePath():
  15. installDir=os.path.join(os.path.expanduser('~'),'.labkey','software','src')
  16. if not os.path.isdir(installDir):
  17. os.makedirs(installDir)
  18. return installDir
  19. def buildGITURL(server,project,path,branch='master'):
  20. if server.find('wiscigt')>-1:
  21. projectURL='%2f'.join(project)
  22. pathURL='%2f'.join(path)
  23. return server+'/api/v4/projects/'+projectURL+'/repository/files/'+pathURL+'?ref='+branch
  24. if server.find('fmf.uni-lj.si')>-1:
  25. projectURL='/'.join(project)#studen/nixSuite
  26. pathURL='/'.join(path)
  27. return '/'.join([server,projectURL,'raw',branch,pathURL])
  28. def getResources():
  29. server='http://wiscigt.powertheword.com'
  30. project=['labkey','nixsuite']
  31. path=['remoteResources','resources.json']
  32. server='https://git0.fmf.uni-lj.si'
  33. project=['studen','nixSuite']
  34. remoteSourcesURL=buildGITURL(server,project,path)
  35. print('remoteSourcesURL {}'.format(remoteSourcesURL))
  36. http = urllib3.PoolManager()
  37. r = http.request('GET', remoteSourcesURL)
  38. #returns a JSON
  39. encoding=chardet.detect(r.data)['encoding']
  40. dataDecoded=r.data.decode(encoding)
  41. jsonData=json.loads(dataDecoded)
  42. print(jsonData)
  43. #since gogs drops raw data, we already did the hard part
  44. if server.find('fmf.uni-lj.si')>-1:
  45. return jsonData
  46. #on gitlab a further decoding step is required
  47. #we are interested in content, do looped way of decoding it
  48. b64_bytes=jsonData['content'].encode('ascii')
  49. m_bytes=base64.b64decode(b64_bytes)
  50. m=m_bytes.decode('ascii')
  51. return json.loads(m)
  52. def loadModule(slicer,qt,name,moduleName):
  53. loadLibrary(name)
  54. modulePath=os.path.join(getSuitePath(),name,'slicerModules',moduleName+'.py')
  55. factoryManager = slicer.app.moduleManager().factoryManager()
  56. factoryManager.registerModule(qt.QFileInfo(modulePath))
  57. factoryManager.loadModules([moduleName,])
  58. slicer.util.selectModule(moduleName)
  59. def loadLibrary(name):
  60. #load library from git, store it at a default location and
  61. #add path to the python sys
  62. remoteSources=getResources()
  63. #two steps:
  64. #1 Download
  65. tempDir=os.path.join(os.path.expanduser('~'),'temp')
  66. if not os.path.isdir(tempDir):
  67. os.mkdir(tempDir)
  68. tempFile=os.path.join(tempDir,name+'.zip')
  69. http = urllib3.PoolManager()
  70. rsource=remoteSources[name]
  71. r = http.request('GET', rsource['url'], preload_content=False)
  72. chunk_size=65536
  73. with open(tempFile, 'wb') as out:
  74. while True:
  75. data = r.read(chunk_size)
  76. if not data:
  77. break
  78. out.write(data)
  79. r.release_conn()
  80. #2 Unzip
  81. installDir=getSuitePath()
  82. #3 remove existing copy
  83. finalName=os.path.join(installDir,name)
  84. if os.path.isdir(finalName):
  85. shutil.rmtree(finalName)
  86. #unzip
  87. with zipfile.ZipFile(tempFile,'r') as zip_ref:
  88. zip_ref.extractall(installDir)
  89. #cleanup
  90. os.remove(tempFile)
  91. #rename
  92. #this is the best guess of the relation between zip directory and name
  93. try:
  94. zipName=name.lower()+'-'+rsource['branch']
  95. os.rename(os.path.join(installDir,zipName),finalName)
  96. except FileNotFoundError:
  97. try:
  98. zipName=name+'-'+rsource['branch']
  99. os.rename(os.path.join(installDir,zipName),finalName)
  100. except FileNotFoundError:
  101. #git0/gogs
  102. zipName=name.lower()
  103. os.rename(os.path.join(installDir,zipName),finalName)
  104. sys.path.append(finalName)
  105. def setConfig(labkeyUser,labkeyServer='https://merlin.fmf.uni-lj.si',\
  106. certificateZip=None):
  107. connectionConfig={}
  108. if certificateZip!=None:
  109. zpath=pathlib.Path(certificateZip)
  110. user=zpath.stem
  111. userDir=os.path.join(os.path.expanduser('~'),'.labkey',user)
  112. if not os.path.isdir(userDir):
  113. os.makedirs(userDir)
  114. caName=None
  115. with zipfile.ZipFile(certificateZip,'r') as zipObj:
  116. zipObj.extract(user+'.crt',userDir)
  117. zipObj.extract(user+'.key',userDir)
  118. zipList=zipObj.namelist()
  119. for f in zipList:
  120. if f.find('CA')>-1:
  121. caName=f
  122. zipObj.extract(f,userDir)
  123. #setup SSL
  124. sslSetup={}
  125. sslSetup['user']=os.path.join(userDir,user+'.crt')
  126. sslSetup['key']=os.path.join(userDir,user+'.key')
  127. sslSetup['ca']=os.path.join(userDir,caName)
  128. sslSetup['keyPwd']='notUsed'
  129. connectionConfig['SSL']=sslSetup
  130. connectionConfig["host"]=labkeyServer
  131. connectionConfig["context"]="labkey"
  132. labkeySetup={}
  133. labkeySetup['user']=labkeyUser
  134. labkeyPwd='guest'
  135. if not labkeyUser=='guest':
  136. labkeyPwd=getpass.getpass(prompt='Enter labkey password:')
  137. labkeySetup['password']=labkeyPwd
  138. connectionConfig['labkey']=labkeySetup
  139. orthancSetup={}
  140. if connectionConfig['host'].find('merlin')>-1:
  141. orthancSetup['server']='https://orthanc.fmf.uni-lj.si'
  142. if connectionConfig['host'].find('onko-nix')>-1:
  143. orthancSetup['server']='http://onko-nix.onko-i.si:8042'
  144. orthancSetup['user']='ask'
  145. orthancSetup['password']='askPassword'
  146. connectionConfig['orthanc']=orthancSetup
  147. net=labkeyInterface.labkeyInterface()
  148. net.connectionConfig=connectionConfig
  149. net.initRemote()
  150. print(net.getUserId())
  151. return net
  152. def testCertificate(certificateZip):
  153. return setConfig('guest',certificateZip=certificateZip)
  154. def testConnection(labkeyUser,labkeyServer='https://merlin.fmf.uni-lj.si',\
  155. certificateZip=None):
  156. return setConfig(labkeyUser,labkeyServer,certificateZip)
  157. def getDefaultConfig(configFile):
  158. #if configFile is None, this will set it to default and leave unchanged otherwise
  159. if configFile==None:
  160. return os.path.join(os.path.expanduser('~'),'.labkey','network.json')
  161. return configFile
  162. def storeConfig(net,configFile=None):
  163. #if configFile is None, this will set it to default and leave unchanged otherwise
  164. with open(getDefaultConfig(configFile),'w') as f:
  165. json.dump(net.connectionConfig,f,indent='\t')
  166. def getInterface(configFile=None):
  167. net=labkeyInterface.labkeyInterface()
  168. #if configFile is None, this will set it to default and leave unchanged otherwise
  169. net.init(getDefaultConfig(configFile))
  170. return net
  171. #loadLibrary('labkeyInterface')