1
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
30
44
45 - def _lookup(self, data, data2, key, map, hidden = False):
62
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
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
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
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
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