Merge lp:~jfb-tempo-consulting/unifield-server/us-812 into lp:unifield-server

Proposed by jftempo
Status: Merged
Merged at revision: 3601
Proposed branch: lp:~jfb-tempo-consulting/unifield-server/us-812
Merge into: lp:unifield-server
Diff against target: 241 lines (+104/-59)
2 files modified
bin/service/web_services.py (+61/-58)
bin/tools/misc.py (+43/-1)
To merge this branch: bzr merge lp:~jfb-tempo-consulting/unifield-server/us-812
Reviewer Review Type Date Requested Status
UniField Reviewer Team Pending
Review via email: mp+283074@code.launchpad.net
To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'bin/service/web_services.py'
2--- bin/service/web_services.py 2015-07-13 13:50:35 +0000
3+++ bin/service/web_services.py 2016-01-19 10:40:08 +0000
4@@ -57,11 +57,11 @@
5 passwd = params[0]
6 params = params[1:]
7 security.check_super_dropdb(passwd)
8- elif method == 'dump':
9+ elif method in ('dump', 'dump_file'):
10 passwd = params[0]
11 params = params[1:]
12 security.check_super_bkpdb(passwd)
13- elif method == 'restore':
14+ elif method in ('restore', 'restore_file'):
15 passwd = params[0]
16 params = params[1:]
17 security.check_super_restoredb(passwd)
18@@ -201,76 +201,71 @@
19 if os.name == 'nt' and self._pg_psw_env_var_is_set:
20 os.environ['PGPASSWORD'] = ''
21
22+ def exp_dump_file(self, db_name):
23+ # get a tempfilename
24+ f = NamedTemporaryFile(delete=False)
25+ f_name = f.name
26+ f.close()
27+ res = tools.pg_dump(db_name, f_name)
28+ if res:
29+ raise Exception, "Couldn't dump database"
30+ return f_name
31+
32+
33 def exp_dump(self, db_name):
34 logger = netsvc.Logger()
35-
36- self._set_pg_psw_env_var()
37-
38- cmd = ['pg_dump', '--format=c', '--no-owner']
39- if tools.config['db_user']:
40- cmd.append('--username=' + tools.config['db_user'])
41- if tools.config['db_host']:
42- cmd.append('--host=' + tools.config['db_host'])
43- if tools.config['db_port']:
44- cmd.append('--port=' + str(tools.config['db_port']))
45- cmd.append(db_name)
46-
47- stdin, stdout = tools.exec_pg_command_pipe(*tuple(cmd))
48- stdin.close()
49- data = stdout.read()
50- res = stdout.close()
51+ data, res = tools.pg_dump(db_name)
52 if res:
53 logger.notifyChannel("web-services", netsvc.LOG_ERROR,
54 'DUMP DB: %s failed\n%s' % (db_name, data))
55 raise Exception, "Couldn't dump database"
56- logger.notifyChannel("web-services", netsvc.LOG_INFO,
57- 'DUMP DB: %s' % (db_name))
58-
59- self._unset_pg_psw_env_var()
60-
61 return base64.encodestring(data)
62
63+ def exp_restore_file(self, db_name, filename):
64+ try:
65+ logger = netsvc.Logger()
66+
67+ self._set_pg_psw_env_var()
68+
69+ if self.exp_db_exist(db_name):
70+ logger.notifyChannel("web-services", netsvc.LOG_WARNING,
71+ 'RESTORE DB: %s already exists' % (db_name,))
72+ raise Exception, "Database already exists"
73+
74+ self._create_empty_database(db_name)
75+
76+ cmd = ['pg_restore', '--no-owner', '--no-acl']
77+ if tools.config['db_user']:
78+ cmd.append('--username=' + tools.config['db_user'])
79+ if tools.config['db_host']:
80+ cmd.append('--host=' + tools.config['db_host'])
81+ if tools.config['db_port']:
82+ cmd.append('--port=' + str(tools.config['db_port']))
83+ cmd.append('--dbname=' + db_name)
84+ cmd.append(filename)
85+ res = tools.exec_pg_command(*cmd)
86+ os.remove(filename)
87+ if res:
88+ raise Exception, "Couldn't restore database"
89+
90+ logger.notifyChannel("web-services", netsvc.LOG_INFO,
91+ 'RESTORE DB: %s' % (db_name))
92+ self._unset_pg_psw_env_var()
93+
94+ return True
95+ except Exception, e:
96+ logging.getLogger('web-services').error("Restore %s failed" % (db_name, ), exc_info=1)
97+ raise
98+
99 def exp_restore(self, db_name, data):
100 logger = netsvc.Logger()
101-
102- self._set_pg_psw_env_var()
103-
104- if self.exp_db_exist(db_name):
105- logger.notifyChannel("web-services", netsvc.LOG_WARNING,
106- 'RESTORE DB: %s already exists' % (db_name,))
107- raise Exception, "Database already exists"
108-
109- self._create_empty_database(db_name)
110-
111- cmd = ['pg_restore', '--no-owner', '--no-acl']
112- if tools.config['db_user']:
113- cmd.append('--username=' + tools.config['db_user'])
114- if tools.config['db_host']:
115- cmd.append('--host=' + tools.config['db_host'])
116- if tools.config['db_port']:
117- cmd.append('--port=' + str(tools.config['db_port']))
118- cmd.append('--dbname=' + db_name)
119- args2 = tuple(cmd)
120-
121-
122+ logging.getLogger('web-services').info("Restore DB from memory")
123 buf=base64.decodestring(data)
124 tmpfile = NamedTemporaryFile('w+b', delete=False)
125 tmpfile.write(buf)
126 tmpfile.close()
127
128- args2=list(args2)
129- args2.append(tmpfile.name)
130- args2=tuple(args2)
131- res = tools.exec_pg_command(*args2)
132- os.remove(tmpfile.name)
133- if res:
134- raise Exception, "Couldn't restore database"
135- logger.notifyChannel("web-services", netsvc.LOG_INFO,
136- 'RESTORE DB: %s' % (db_name))
137-
138- self._unset_pg_psw_env_var()
139-
140- return True
141+ return self.exp_restore_file(db_name, tmpfile.name)
142
143 def exp_rename(self, old_name, new_name):
144 sql_db.close_db(old_name)
145@@ -757,7 +752,12 @@
146 if not result:
147 tb = sys.exc_info()
148 self._reports[id]['exception'] = ExceptionWithTraceback('RML is not available at specified location or not enough data to print!', tb)
149- self._reports[id]['result'] = result
150+ if isinstance(result, tools.misc.Path):
151+ self._reports[id]['path'] = result.path
152+ self._reports[id]['result'] = ''
153+ self._reports[id]['delete'] = result.delete
154+ else:
155+ self._reports[id]['result'] = result
156 self._reports[id]['format'] = format
157 self._reports[id]['state'] = True
158 except Exception, exception:
159@@ -799,6 +799,9 @@
160 if res2:
161 res['result'] = base64.encodestring(res2)
162 res['format'] = result['format']
163+ if 'path' in result:
164+ res['path'] = result['path']
165+ res['delete'] = result.get('delete', False)
166 del self._reports[report_id]
167 return res
168
169
170=== modified file 'bin/tools/misc.py'
171--- bin/tools/misc.py 2011-01-20 12:40:20 +0000
172+++ bin/tools/misc.py 2016-01-19 10:40:08 +0000
173@@ -141,6 +141,42 @@
174 except IOError:
175 return None
176
177+def _set_env_pg(remove=False):
178+ if os.name == 'nt':
179+ if not remove and not os.environ.get('PGPASSWORD', ''):
180+ os.environ['PGPASSWORD'] = config['db_password']
181+ if remove and os.environ.get('PGPASSWORD'):
182+ os.environ['PGPASSWORD'] = ''
183+
184+def pg_dump(db_name, outfile=False):
185+ try:
186+ _logger.info('Dump %s to %s' % (db_name, outfile or 'memory'))
187+ _set_env_pg()
188+ cmd = ['pg_dump', '--format=c', '--no-owner']
189+ if outfile:
190+ cmd += ['-f', outfile]
191+ if config['db_user']:
192+ cmd.append('--username=' + config['db_user'])
193+ if config['db_host']:
194+ cmd.append('--host=' + config['db_host'])
195+ if config['db_port']:
196+ cmd.append('--port=' + str(config['db_port']))
197+ cmd.append(db_name)
198+ if outfile:
199+ res = exec_pg_command(*tuple(cmd))
200+ else:
201+ stdin, stdout = exec_pg_command_pipe(*tuple(cmd))
202+ stdin.close()
203+ data = stdout.read()
204+ error = stdout.close()
205+ res = (data, error)
206+
207+ _set_env_pg(remove=True)
208+ return res
209+ except Exception, e:
210+ _logger.error('Dump', exc_info=1)
211+ raise
212+
213 def find_pg_tool(name):
214 path = None
215 if config['pg_path'] and config['pg_path'] != 'None':
216@@ -150,12 +186,13 @@
217 except IOError:
218 return None
219
220+
221 def exec_pg_command(name, *args):
222 prog = find_pg_tool(name)
223 if not prog:
224 raise Exception('Couldn\'t find %s' % name)
225 args2 = (prog,) + args
226-
227+
228 return subprocess.call(args2)
229
230 def exec_pg_command_pipe(name, *args):
231@@ -1503,6 +1540,11 @@
232 return tuple(resolve_attr(obj, attr) for attr in items)
233 return g
234
235+class Path():
236+ def __init__(self, path, delete=True):
237+ self.path = path
238+ self.delete = delete
239+
240
241 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
242

Subscribers

People subscribed via source and target branches