Package omero :: Package gateway :: Package scripts :: Module dbhelpers
[hide private]
[frames] | no frames]

Source Code for Module omero.gateway.scripts.dbhelpers

  1  import sys 
  2  sys.path.append('.') 
  3   
  4  import omero.gateway 
  5  import omero.model 
  6  from omero.rtypes import * 
  7  import os 
  8  import subprocess 
  9  import re 
 10  import time 
 11  import urllib2 
 12   
 13  from types import StringTypes 
 14  from path import path 
 15   
 16  BASEPATH = os.path.dirname(os.path.abspath(__file__)) 
 17  TESTIMG_URL = 'http://users.openmicroscopy.org.uk/~cneves-x/' 
 18   
 19  if not omero.gateway.BlitzGateway.ICE_CONFIG: 
 20      try: 
 21          import settings 
 22          omero.gateway.BlitzGateway.ICE_CONFIG = os.path.join(settings.OMERO_HOME, 'etc', 'ice.config') 
 23      except ImportError: 
 24          pass 
 25      except AttributeError: 
 26          pass 
27 28 #Gateway = omero.gateway.BlitzGateway 29 30 -def refreshConfig ():
31 bg = omero.gateway.BlitzGateway() 32 ru = bg.c.ic.getProperties().getProperty('omero.rootuser') 33 rp = bg.c.ic.getProperties().getProperty('omero.rootpass') 34 if ru: 35 ROOT.name = ru 36 if rp: 37 ROOT.passwd = rp
38
39 -def loginAsRoot ():
40 refreshConfig() 41 return login(ROOT)
42
43 -def login (alias, pw=None):
44 if isinstance(alias, UserEntry): 45 return alias.login() 46 elif pw is None: 47 return USERS[alias].login() 48 else: 49 return UserEntry(alias, pw).login()
50
51 #def addGroupToUser (client, groupname): 52 # a = client.getAdminService() 53 # if not 'system' in [x.name.val for x in a.containedGroups(client._userid)]: 54 # admin = loginAsRoot() 55 # a = admin.getAdminService() 56 # else: 57 # admin = client 58 # try: 59 # g = a.lookupGroup(groupname) 60 # except: 61 # g = omero.model.ExperimenterGroupI() 62 # g.setName(omero.gateway.omero_type(groupname)) 63 # a.createGroup(g) 64 # g = a.lookupGroup(groupname) 65 # a.addGroups(a.getExperimenter(client._userid), (g,)) 66 67 #def setGroupForSession (client, groupname): 68 # ssuid = client._sessionUuid 69 # ss = client.getSessionService() 70 # sess = ss.getSession(ssuid) 71 # if sess.getDetails().getGroup().getName().val == groupname: 72 # # Already correct 73 # return 74 # a = client.getAdminService() 75 # if not groupname in [x.name.val for x in a.containedGroups(client._userid)]: 76 # UserEntry.addGroupToUser(client, groupname) 77 # g = a.lookupGroup(groupname) 78 # sess.getDetails().setGroup(g) 79 # ss.updateSession(sess) 80 81 -class UserEntry (object):
82 - def __init__ (self, name, passwd, firstname='', middlename='', lastname='', email='', 83 groupname=None, groupperms='rw----', admin=False):
84 self.name = name 85 self.passwd = passwd 86 self.firstname = firstname 87 self.middlename = middlename 88 self.lastname = lastname 89 self.email = email 90 self.admin = admin 91 self.groupname = groupname 92 self.groupperms = groupperms
93
94 - def fullname (self):
95 return '%s %s' % (self.firstname, self.lastname)
96
97 - def login (self):
98 client = omero.gateway.BlitzGateway(self.name, self.passwd, group=self.groupname, try_super=self.admin) 99 if not client.connect(): 100 print "Can not connect" 101 return None 102 if self.groupname is not None and client.getEventContext().groupName != self.groupname: 103 try: 104 a = client.getAdminService() 105 g = a.lookupGroup(self.groupname) 106 client.setGroupForSession(g.getId().val) 107 except: 108 pass 109 return client
110 111 @staticmethod
112 - def _getOrCreateGroup (client, groupname, groupperms='rw----'):
113 a = client.getAdminService() 114 try: 115 g = a.lookupGroup(groupname) 116 except: 117 g = omero.model.ExperimenterGroupI() 118 g.setName(omero.gateway.omero_type(groupname)) 119 p = omero.model.PermissionsI() 120 121 for n, f in enumerate((p.setUserRead, p.setUserWrite, 122 p.setGroupRead, p.setGroupWrite, 123 p.setWorldRead, p.setWorldWrite)): 124 f(groupperms[n] != '-') 125 g.details.setPermissions(p) 126 a.createGroup(g) 127 g = a.lookupGroup(groupname) 128 return g
129
130 - def create (self, client):
131 a = client.getAdminService() 132 try: 133 a.lookupExperimenter(self.name) 134 #print "Already exists: %s" % self.name 135 return False 136 except: 137 #print "Creating: %s" % self.name 138 pass 139 if self.groupname is None: 140 self.groupname = self.name + '_group' 141 g = UserEntry._getOrCreateGroup(client, self.groupname, self.groupperms) 142 u = omero.model.ExperimenterI() 143 u.setOmeName(omero.gateway.omero_type(self.name)) 144 u.setFirstName(omero.gateway.omero_type(self.firstname)) 145 u.setMiddleName(omero.gateway.omero_type(self.middlename)) 146 u.setLastName(omero.gateway.omero_type(self.lastname)) 147 u.setEmail(omero.gateway.omero_type(self.email)) 148 a.createUser(u, g.getName().val) 149 if self.admin: 150 u = a.lookupExperimenter(self.name) 151 a.addGroups(u,(a.lookupGroup("system"),)) 152 client.c.sf.setSecurityPassword(ROOT.passwd) # See #3202 153 a.changeUserPassword(u.getOmeName().val, omero.gateway.omero_type(self.passwd)) 154 return True
155
156 - def changePassword (self, client, password):
157 a = client.getAdminService() 158 client.c.sf.setSecurityPassword(ROOT.passwd) # See #3202 159 a.changeUserPassword(self.name, omero.gateway.omero_type(password))
160 161 @staticmethod
162 - def addGroupToUser (client, groupname, groupperms='rw----'):
163 a = client.getAdminService() 164 if not 'system' in [x.name.val for x in a.containedGroups(client._userid)]: 165 admin = loginAsRoot() 166 a = admin.getAdminService() 167 else: 168 admin = client 169 g = UserEntry._getOrCreateGroup(client, groupname, groupperms) 170 a.addGroups(a.getExperimenter(client._userid), (g,)) 171 a.seppuku()
172 173 @staticmethod
174 - def setGroupForSession (client, groupname):
175 a = client.getAdminService() 176 if not groupname in [x.name.val for x in a.containedGroups(client._userid)]: 177 UserEntry.addGroupToUser(client, groupname) 178 g = a.lookupGroup(groupname) 179 client.setGroupForSession(g.getId().val)
180
181 182 -class ObjectEntry (object):
183 pass
184
185 -class ProjectEntry (ObjectEntry):
186 - def __init__ (self, name, owner, create_group=False, group_perms=False):
187 self.name = name 188 self.owner = owner 189 self.create_group = create_group 190 self.group_perms = group_perms
191
192 - def get (self, client=None, fromCreate=False):
193 if client is None: 194 client = USERS[self.owner].login() 195 for p in client.listProjects(): 196 if p.getName() == self.name: 197 p.__loadedHotSwap__() 198 return p 199 return None
200
201 - def create (self, client=None):
202 if client is None: 203 client = USERS[self.owner].login() 204 p = self.get(client) 205 if p is not None: 206 return p 207 p = omero.model.ProjectI(loaded=True) 208 p.setName(omero.gateway.omero_type(self.name)) 209 p.setDescription(omero.gateway.omero_type(self.name)) 210 if self.create_group: 211 if isinstance(self.create_group, StringTypes): 212 groupname = self.create_group 213 else: 214 raise ValueError('group must be string') 215 groupname = 'project_test' 216 s = loginAsRoot() 217 UserEntry.addGroupToUser (s, groupname) 218 s.seppuku() 219 UserEntry.setGroupForSession(client, groupname) 220 p = omero.gateway.ProjectWrapper(client, client.getUpdateService().saveAndReturnObject(p)) 221 return self.get(client, True)
222
223 -class DatasetEntry (ObjectEntry):
224 - def __init__ (self, name, project, description=None, callback=None):
225 self.name = name 226 self.project = project 227 self.description = description 228 self.callback = callback
229
230 - def get (self, client, forceproj=None):
231 if forceproj is None: 232 if isinstance(self.project, StringTypes): 233 project = PROJECTS[self.project].get(client) 234 elif isinstance(self.project, ProjectEntry): 235 project = self.project.get(client) 236 else: 237 project = self.project 238 else: 239 project = forceproj 240 for d in project.listChildren(): 241 if d.getName() == self.name and ((self.description is None and d.getDescription() == '') or (self.description is not None and omero.gateway.omero_type(d.getDescription()) == omero.gateway.omero_type(self.description))): 242 d.__loadedHotSwap__() 243 return d 244 return None
245
246 - def create (self):
247 if isinstance(self.project, StringTypes): 248 project = PROJECTS[self.project] 249 user = USERS[project.owner] 250 client = user.login() 251 project = project.get(client) 252 else: 253 project = self.project 254 client = project._conn 255 d = self.get(client, project) 256 if d is not None and ((self.description is None and d.getDescription() == '') or (self.description is not None and omero.gateway.omero_type(d.getDescription()) == omero.gateway.omero_type(self.description))): 257 return d 258 d = omero.model.DatasetI(loaded=True) 259 d.setName(omero.gateway.omero_type(self.name)) 260 if self.description is not None: 261 d.setDescription(omero.gateway.omero_type(self.description)) 262 project.linkDataset(d) 263 project.save() 264 rv = self.get(client, project) 265 if self.callback: 266 self.callback(rv) 267 return rv
268
269 -class ImageEntry (ObjectEntry):
270 - def __init__ (self, name, filename, dataset, callback=None):
271 self.name = name 272 self.filename = filename # If False will create image without pixels 273 if self.name is None and filename: 274 self.name = os.path.basename(filename) 275 self.dataset = dataset 276 self.callback = callback
277
278 - def get (self, client, forceds=None):
279 if forceds is None: 280 dataset = DATASETS[self.dataset].get(client) 281 else: 282 dataset = forceds 283 for i in dataset.listChildren(): 284 if i.getName() == self.name: 285 return i 286 return None
287
288 - def create (self):
289 if isinstance(self.dataset, StringTypes): 290 dataset = DATASETS[self.dataset] 291 project = PROJECTS[dataset.project] 292 client = USERS[project.owner].login() 293 dataset = dataset.get(client) 294 else: 295 dataset = self.dataset 296 client = dataset._conn 297 i = self.get(client, dataset) 298 if i is not None: 299 #print ".. -> image already exists: %s" % self.name 300 return i 301 #print ".. -> create new image: %s" % self.name 302 sys.stderr.write('I') 303 if self.filename is False: 304 UserEntry.setGroupForSession(client, dataset.getDetails().getGroup().getName()) 305 self._createWithoutPixels(client, dataset) 306 return self.get(client, dataset) 307 fpath = os.path.join(BASEPATH, self.filename) 308 if not os.path.exists(fpath): 309 if not os.path.exists(os.path.dirname(fpath)): 310 os.makedirs(os.path.dirname(fpath)) 311 # First try to download the image 312 try: 313 #print "Trying to get test image from " + TESTIMG_URL + self.filename 314 sys.stderr.write('<') 315 f = urllib2.urlopen(TESTIMG_URL + self.filename) 316 open(fpath, 'wb').write(f.read()) 317 except urllib2.HTTPError: 318 raise IOError('No such file %s' % fpath) 319 host = dataset._conn.c.ic.getProperties().getProperty('omero.host') or 'localhost' 320 port = dataset._conn.c.ic.getProperties().getProperty('omero.port') or '4063' 321 322 323 exe = path(".") / ".." / "bin" /"omero" # Running from dist 324 if not exe.exists(): 325 exe = path(".") / ".." / ".."/ ".." / "dist" / "bin" / "omero" # Running from OmeroPy 326 if not exe.exists(): 327 print "\n\nNo omero found! Add OMERO_HOME/bin to your PATH variable (See #5176)\n\n" 328 exe = "omero" 329 330 newconn = dataset._conn.clone() 331 newconn.connect() 332 UserEntry.setGroupForSession(newconn, dataset.getDetails().getGroup().getName()) 333 session = newconn._sessionUuid 334 #print session 335 exe += ' -s %s -k %s -p %s import -d %i -n' % (host, session, port, dataset.getId()) 336 exe = exe.split() + [self.name, fpath] 337 try: 338 p = subprocess.Popen(exe, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 339 except OSError: 340 print "!!Please make sure the 'omero' executable is in PATH" 341 return None 342 #print ' '.join(exe) 343 pid = p.communicate()#[0].strip() #re.search('Saving pixels id: (\d*)', p.communicate()[0]).group(1) 344 #print pid 345 try: 346 img = omero.gateway.ImageWrapper(dataset._conn, dataset._conn.getQueryService().find('Pixels', long(pid[0].split('\n')[0].strip())).image) 347 except ValueError: 348 print pid 349 raise 350 #print "imgid = %i" % img.getId() 351 img.setName(self.name) 352 #img._obj.objectiveSettings = None 353 img.save() 354 if self.callback: 355 self.callback(img) 356 return img
357
358 - def _createWithoutPixels (self, client, dataset):
359 img = omero.model.ImageI() 360 img.setName(omero.gateway.omero_type(self.name)) 361 img.setAcquisitionDate(rtime(0)) 362 if not dataset.imageLinksLoaded: 363 print ".!." 364 dataset._obj._imageLinksSeq = [] 365 dataset._obj._imageLinksLoaded = True; 366 dataset.linkImage(img) 367 dataset.save()
368
369 -def getProject (client, alias):
370 return PROJECTS[alias].get(client)
371
372 -def assertCommentAnnotation (object, ns, value):
373 ann = object.getAnnotation(ns) 374 if ann is None or ann.getValue() != value: 375 ann = CommentAnnotationWrapper() 376 ann.setNs(ns) 377 ann.setValue(value) 378 object.linkAnnotation(ann) 379 return ann
380
381 -def getDataset (client, alias, forceproj=None):
382 return DATASETS[alias].get(client, forceproj)
383
384 -def getImage (client, alias, forceds=None):
385 return IMAGES[alias].get(client, forceds)
386
387 -def bootstrap ():
388 # Create users 389 client = loginAsRoot() 390 for k, u in USERS.items(): 391 if not u.create(client): 392 u.changePassword(client, u.passwd) 393 for k, p in PROJECTS.items(): 394 p = p.create() 395 p._conn.seppuku() 396 #print p.get(client).getDetails().getPermissions().isUserWrite() 397 for k, d in DATASETS.items(): 398 d = d.create() 399 d._conn.seppuku() 400 for k, i in IMAGES.items(): 401 i = i.create() 402 i._conn.seppuku() 403 client.seppuku()
404
405 -def cleanup ():
406 for k, p in PROJECTS.items(): 407 sys.stderr.write('*') 408 p = p.get() 409 if p is not None: 410 client = p._conn 411 update = client.getUpdateService() 412 delete = client.getDeleteService() 413 for d in p.listChildren(): 414 delete.deleteImagesByDataset(d.getId(), True) 415 update.deleteObject(d._obj) 416 nss = list(set([x.ns for x in p.listAnnotations()])) 417 for ns in nss: 418 p.removeAnnotations(ns) 419 #print ".. -> removing project %s" % p.getName() 420 update.deleteObject(p._obj) 421 # What about users? 422 admin = client.getAdminService() 423 for k, u in USERS.items(): 424 u.changePassword(client, None) 425 client.seppuku()
426 427 428 429 ROOT=UserEntry('root','ome',admin=True) 430 431 USERS = { 432 #'alias': UserEntry entry, 433 } 434 435 PROJECTS = { 436 #'alias': ProjectEntry entry, 437 } 438 439 DATASETS = { 440 #'alias': DatasetEntry entry, 441 } 442 443 IMAGES = { 444 #'alias': ImageEntry entry, 445 } 446