Package omero :: Package plugins :: Module db
[hide private]
[frames] | no frames]

Source Code for Module omero.plugins.db

  1  #!/usr/bin/env python 
  2  """ 
  3     Plugin for our managing the OMERO database. 
  4   
  5     Plugin read by omero.cli.Cli during initialization. The method(s) 
  6     defined here will be added to the Cli class for later use. 
  7   
  8     Copyright 2008 Glencoe Software, Inc. All rights reserved. 
  9     Use is subject to license terms supplied in LICENSE.txt 
 10   
 11  """ 
 12   
 13  from exceptions import Exception 
 14   
 15  from omero.cli import BaseControl 
 16  from omero.cli import CLI 
 17  from omero.cli import VERSION 
 18   
 19  from omero_ext.argparse import FileType 
 20   
 21  from path import path 
 22   
 23  import omero.java 
 24  import time 
 25   
 26  HELP="""Database tools for creating scripts, setting passwords, etc.""" 
 27   
 28   
29 -class DatabaseControl(BaseControl):
30
31 - def _configure(self, parser):
32 sub = parser.sub() 33 34 script = sub.add_parser("script", help="Generates a DB creation script") 35 script.set_defaults(func=self.script) 36 script.add_argument("-f", "--file", type=FileType(mode="w"), help="Optional file to save to. Use '-' for stdout.") 37 script.add_argument("dbversion", nargs="?") 38 script.add_argument("dbpatch", nargs="?") 39 script.add_argument("password", nargs="?") 40 41 pw = sub.add_parser("password", help="Prints SQL command for updating your root password") 42 pw.add_argument("password", nargs="?") 43 pw.set_defaults(func=self.password)
44
45 - def _lookup(self, data, data2, key, map, hidden = False):
46 """ 47 Read values from data and data2. If value is contained in data 48 then use it without question. If the value is in data2, offer 49 it as a default 50 """ 51 map[key] = data.properties.getProperty("omero.db."+key) 52 if not map[key] or map[key] == "": 53 if data2: 54 default = data2.properties.getProperty("omero.db."+key) 55 else: 56 default = "" 57 map[key] = self.ctx.input("Please enter omero.db.%s [%s]: " % (key, default), hidden) 58 if not map[key] or map[key] == "": 59 map[key] = default 60 if not map[key] or map[key] == "": 61 self.ctx.die(1, "No value entered")
62
63 - def _get_password_hash(self, root_pass = None):
64 65 root_pass = self._ask_for_password(" for OMERO root user", root_pass) 66 67 server_jar = self.ctx.dir / "lib" / "server" / "server.jar" 68 p = omero.java.popen(["-cp",str(server_jar),"ome.security.auth.PasswordUtil",root_pass]) 69 rc = p.wait() 70 if rc != 0: 71 self.ctx.die(rc, "PasswordUtil failed: %s" % p.communicate() ) 72 value = p.communicate()[0] 73 if not value or len(value) == 0: 74 self.ctx.die(100, "Encoded password is empty") 75 return value.strip()
76
77 - def _copy(self, input_path, output, func):
78 input = open(str(input_path)) 79 try: 80 for s in input.xreadlines(): 81 output.write(func(s)) 82 finally: 83 input.close()
84
85 - def _make_replace(self, root_pass, db_vers, db_patch):
86 def replace_method(str_in): 87 str_out = str_in.replace("@ROOTPASS@",root_pass) 88 str_out = str_out.replace("@DBVERSION@",db_vers) 89 str_out = str_out.replace("@DBPATCH@",db_patch) 90 return str_out
91 return replace_method
92
93 - def _sql_directory(self, db_vers, db_patch):
94 sql_directory = self.ctx.dir / "sql" / "psql" / ("%s__%s" % (db_vers, db_patch)) 95 if not sql_directory.exists(): 96 self.ctx.die(2, "Invalid Database version/patch: %s does not exist" % sql_directory) 97 return sql_directory
98
99 - def _create(self, sql_directory, db_vers, db_patch, password_hash, args):
100 sql_directory = self.ctx.dir / "sql" / "psql" / ("%s__%s" % (db_vers, db_patch)) 101 if not sql_directory.exists(): 102 self.ctx.die(2, "Invalid Database version/patch: %s does not exist" % sql_directory) 103 104 if args and args.file: 105 output = args.file 106 script = "<filename here>" 107 else: 108 script = "%s__%s.sql" % (db_vers, db_patch) 109 location = path.getcwd() / script 110 output = open(location, 'w') 111 self.ctx.out("Saving to " + location) 112 113 try: 114 output.write(""" 115 -- 116 -- GENERATED %s from %s 117 -- 118 -- This file was created by the bin/omero db script command 119 -- and contains an MD5 version of your OMERO root users's password. 120 -- You should think about deleting it as soon as possible. 121 -- 122 -- To create your database: 123 -- 124 -- createdb omero 125 -- createlang plpgsql omero 126 -- psql omero < %s 127 -- 128 129 BEGIN; 130 """ % ( time.ctime(time.time()), sql_directory, script ) ) 131 self._copy(sql_directory/"schema.sql", output, str) 132 self._copy(sql_directory/"data.sql", output, self._make_replace(password_hash, db_vers, db_patch)) 133 self._copy(sql_directory/"views.sql", output, str) 134 output.write("COMMIT;\n") 135 finally: 136 output.flush() 137 output.close()
138
139 - def password(self, args):
140 root_pass = None 141 try: 142 root_pass = args.password 143 except Exception, e: 144 self.ctx.dbg("While getting arguments:" + str(e)) 145 password_hash = self._get_password_hash(root_pass) 146 self.ctx.out("""UPDATE password SET hash = '%s' WHERE experimenter_id = 0;""" % password_hash)
147
148 - def script(self, args):
149 150 data = self.ctx.initData({}) 151 try: 152 data2 = self.ctx.initData({}) 153 output = self.ctx.readDefaults() 154 self.ctx.parsePropertyFile(data2, output) 155 except Exception, e: 156 self.ctx.dbg(str(e)) 157 data2 = None 158 map = {} 159 root_pass = None 160 try: 161 db_vers = args.dbversion 162 db_patch = args.dbpatch 163 if data2: 164 if len(db_vers) == 0: 165 db_vers = data2.properties.getProperty("omero.db.version") 166 if len(db_patch) == 0: 167 db_patch = data2.properties.getProperty("omero.db.patch") 168 data.properties.setProperty("omero.db.version", db_vers) 169 self.ctx.err("Using %s for version" % db_vers) 170 data.properties.setProperty("omero.db.patch", db_patch) 171 self.ctx.err("Using %s for patch" % db_patch) 172 root_pass = args.password 173 self.ctx.err("Using password from commandline") 174 except Exception, e: 175 self.ctx.dbg("While getting arguments:"+str(e)) 176 self._lookup(data, data2, "version", map) 177 self._lookup(data, data2, "patch", map) 178 sql = self._sql_directory(map["version"],map["patch"]) 179 map["pass"] = self._get_password_hash(root_pass) 180 self._create(sql, map["version"], map["patch"], map["pass"], args)
181 182 try: 183 register("db", DatabaseControl, HELP) 184 except NameError: 185 import sys 186 cli = CLI() 187 cli.register("db", DatabaseControl, HELP) 188 cli.invoke(sys.argv[1:]) 189