Merge lp:~jfb-tempo-consulting/unifield-server/US-3534 into lp:unifield-server/uf6

Proposed by jftempo
Status: Needs review
Proposed branch: lp:~jfb-tempo-consulting/unifield-server/US-3534
Merge into: lp:unifield-server/uf6
Diff against target: 179 lines (+47/-18)
2 files modified
bin/updater.py (+46/-13)
win32/OpenERPServerService.py (+1/-5)
To merge this branch: bzr merge lp:~jfb-tempo-consulting/unifield-server/US-3534
Reviewer Review Type Date Requested Status
UniField Dev Team Pending
Review via email: mp+332473@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
=== modified file 'bin/updater.py'
--- bin/updater.py 2017-10-03 13:52:42 +0000
+++ bin/updater.py 2017-10-19 09:52:17 +0000
@@ -114,13 +114,29 @@
114114
115def rmtree(files, path=None, verbose=False):115def rmtree(files, path=None, verbose=False):
116 """Python free rmtree"""116 """Python free rmtree"""
117 # OpenERPServerService.exe can't be deleted if Windows Service MAnager uses it
118 backup_trash = 'backup-trash'
117 if path is None and isinstance(files, basestring):119 if path is None and isinstance(files, basestring):
118 path, files = files, find(files)120 path, files = files, find(files)
119 for f in reversed(files):121 for f in reversed(files):
120 target = os.path.join(path, f) if path is not None else f122 target = os.path.join(path, f) if path is not None else f
121 if os.path.isfile(target) or os.path.islink(target):123 if os.path.isfile(target) or os.path.islink(target):
122 warn("unlink", target)124 warn("unlink", target)
123 os.unlink( target )125 try:
126 os.unlink(target)
127 except:
128 warn('Except on target %s, %s' % (target, target.endswith('OpenERPServerService.exe')))
129 if target.endswith('OpenERPServerService.exe'):
130 if not os.path.isdir(backup_trash):
131 os.makedirs(backup_trash)
132 index = 0
133 newname = os.path.join(backup_trash, '%s-%s' % (os.path.basename(target), index))
134 while os.path.isfile(newname):
135 index += 1
136 newname = os.path.join(backup_trash, '%s-%s' % (os.path.basename(target), index))
137 os.rename(target, newname)
138 else:
139 raise
124 elif os.path.isdir(target):140 elif os.path.isdir(target):
125 warn("rmdir", target)141 warn("rmdir", target)
126 os.rmdir( target )142 os.rmdir( target )
@@ -174,6 +190,7 @@
174 if not os.path.exists(delfile):190 if not os.path.exists(delfile):
175 return191 return
176192
193 deleted = []
177 with open(delfile) as f:194 with open(delfile) as f:
178 for line in f:195 for line in f:
179 line = line.strip()196 line = line.strip()
@@ -182,7 +199,7 @@
182 dest = os.path.join(webpath, 'backup', line[4:])199 dest = os.path.join(webpath, 'backup', line[4:])
183 else:200 else:
184 src = line201 src = line
185 dest = os.path.join('backup', line) 202 dest = os.path.join('backup', line)
186203
187 destdir = os.path.dirname(dest)204 destdir = os.path.dirname(dest)
188 if not os.path.exists(destdir):205 if not os.path.exists(destdir):
@@ -191,8 +208,13 @@
191 if os.path.exists(src):208 if os.path.exists(src):
192 warn("Delete: %s" % src)209 warn("Delete: %s" % src)
193 os.rename(src, dest)210 os.rename(src, dest)
211 deleted.append(line)
194 else:212 else:
195 warn("File to delete %s not found." % src)213 warn("File to delete %s not found." % src)
214 return deleted
215
216def is_webfile(f):
217 return re.match("^web[\\\/](.*)", f)
196218
197def do_update():219def do_update():
198 """Real update of the server (before normal OpenERP execution).220 """Real update of the server (before normal OpenERP execution).
@@ -209,13 +231,13 @@
209 warn(lock_file, 'removed')231 warn(lock_file, 'removed')
210 ## Now, update232 ## Now, update
211 revisions = []233 revisions = []
212 files = None234 files = []
235 deleted_files = []
213 try:236 try:
214 ## Revisions that going to be installed237 ## Revisions that going to be installed
215 revisions = parse_version_file(new_version_file)238 revisions = parse_version_file(new_version_file)
216 os.unlink(new_version_file)239 os.unlink(new_version_file)
217 ## Explore .update directory240 ## Explore .update directory
218 files = find(update_dir)
219241
220 ## Prepare backup directory242 ## Prepare backup directory
221 if not os.path.exists('backup'):243 if not os.path.exists('backup'):
@@ -255,12 +277,13 @@
255 webupdated = False277 webupdated = False
256 ## Update Files278 ## Update Files
257 warn("Updating...")279 warn("Updating...")
280 files = find(update_dir)
258 for f in files:281 for f in files:
259 # The delete list is handled last.282 # The delete list is handled last.
260 if f == 'delete.txt':283 if f == 'delete.txt':
261 continue284 continue
262285
263 webfile = re.match("^web[\\\/](.*)", f)286 webfile = is_webfile(f)
264 warn("Filename : `%s'" % (f))287 warn("Filename : `%s'" % (f))
265 if webfile:288 if webfile:
266 target = os.path.join(update_dir, f)289 target = os.path.join(update_dir, f)
@@ -298,25 +321,26 @@
298 os.rename(target, f)321 os.rename(target, f)
299322
300 # Read and apply the deleted.txt file.323 # Read and apply the deleted.txt file.
301 process_deletes(update_dir, webpath)324 deleted_files = process_deletes(update_dir, webpath)
302325
303 # Clean out the PYC files so that they can be recompiled326 # Clean out the PYC files so that they can be recompiled
304 # by the (potentially) updated pythonXX.dll.327 # by the (potentially) updated pythonXX.dll.
305 for d in [ '.', webpath ]:328 for d in [ '.', webpath ]:
306 for root, dirs, files in os.walk(d):329 for root, dirs, o_files in os.walk(d):
307 for file in files:330 for file in o_files:
308 if file.endswith('.pyc'):331 if file.endswith('.pyc'):
309 file = os.path.join(root, file)332 file = os.path.join(root, file)
310 warn('Purge pyc: %s' % file)333 warn('Purge pyc: %s' % file)
311 os.unlink(file)334 os.unlink(file)
312335
336 shutil.copy(server_version_file, 'backup')
337 files.append(server_version_file)
313 add_versions([(x['md5sum'], x['date'],338 add_versions([(x['md5sum'], x['date'],
314 x['name']) for x in revisions])339 x['name']) for x in revisions])
315 warn("Update successful.")340 warn("Update successful.")
316 warn("Revisions added: ", ", ".join([x['md5sum'] for x in revisions]))341 warn("Revisions added: ", ", ".join([x['md5sum'] for x in revisions]))
317 ## No database update here. I preferred to set modules to update just after the preparation342 ## No database update here. I preferred to set modules to update just after the preparation
318 ## The reason is, when pool is populated, it will starts by upgrading modules first343 ## The reason is, when pool is populated, it will starts by upgrading modules first
319
320 #Restart web server344 #Restart web server
321 if webupdated and os.name == "nt":345 if webupdated and os.name == "nt":
322 try:346 try:
@@ -330,12 +354,21 @@
330 warn("Update failure!")354 warn("Update failure!")
331 warn(unicode(e))355 warn(unicode(e))
332 ## Restore backup and purge .update356 ## Restore backup and purge .update
333 if files:357 if files or deleted_files:
334 warn("Restoring...")358 warn("Restoring... ")
335 for f in reversed(files):359 for f in reversed(files + deleted_files):
336 target = os.path.join('backup', f)360 if is_webfile(f):
361 f = os.path.join(webpath, webfile.group(1))
362 target = os.path.join(webbackup, webfile.group(1))
363 else:
364 target = os.path.join('backup', f)
337 if os.path.isfile(target) or os.path.islink(target):365 if os.path.isfile(target) or os.path.islink(target):
338 warn("`%s' -> `%s'" % (target, f))366 warn("`%s' -> `%s'" % (target, f))
367 if os.path.isfile(f):
368 os.remove(f)
369 dest_dir = os.path.dirname(f)
370 if dest_dir and not os.path.isdir(dest_dir):
371 os.makedirs(dest_dir)
339 os.rename(target, f)372 os.rename(target, f)
340 warn("Purging...")373 warn("Purging...")
341 Try(lambda:rmtree(update_dir))374 Try(lambda:rmtree(update_dir))
342375
=== modified file 'win32/OpenERPServerService.py'
--- win32/OpenERPServerService.py 2013-03-08 13:47:07 +0000
+++ win32/OpenERPServerService.py 2017-10-19 09:52:17 +0000
@@ -32,7 +32,6 @@
32import os32import os
33import thread33import thread
3434
35EXIT_UPDATE_REQUIRE_RESTART = 1
3635
37class OpenERPServerService(win32serviceutil.ServiceFramework):36class OpenERPServerService(win32serviceutil.ServiceFramework):
38 # required info37 # required info
@@ -89,12 +88,9 @@
89 # - other exit stauts:88 # - other exit stauts:
90 # server crashed? exit with an error message89 # server crashed? exit with an error message
91 exit_status = self.terpprocess.wait()90 exit_status = self.terpprocess.wait()
92 if exit_status == EXIT_UPDATE_REQUIRE_RESTART:
93 servicemanager.LogInfoMsg("OpenERP has been updated, restarting...")
94 continue # restart openerp process
95 if exit_status == 0:91 if exit_status == 0:
96 break # normal exit92 break # normal exit
97 sys.exit(exit_status)93 os._exit(exit_status)
9894
99def ctrlHandler(ctrlType):95def ctrlHandler(ctrlType):
100 return True96 return True

Subscribers

People subscribed via source and target branches

to all changes: