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
1=== modified file 'bin/updater.py'
2--- bin/updater.py 2017-10-03 13:52:42 +0000
3+++ bin/updater.py 2017-10-19 09:52:17 +0000
4@@ -114,13 +114,29 @@
5
6 def rmtree(files, path=None, verbose=False):
7 """Python free rmtree"""
8+ # OpenERPServerService.exe can't be deleted if Windows Service MAnager uses it
9+ backup_trash = 'backup-trash'
10 if path is None and isinstance(files, basestring):
11 path, files = files, find(files)
12 for f in reversed(files):
13 target = os.path.join(path, f) if path is not None else f
14 if os.path.isfile(target) or os.path.islink(target):
15 warn("unlink", target)
16- os.unlink( target )
17+ try:
18+ os.unlink(target)
19+ except:
20+ warn('Except on target %s, %s' % (target, target.endswith('OpenERPServerService.exe')))
21+ if target.endswith('OpenERPServerService.exe'):
22+ if not os.path.isdir(backup_trash):
23+ os.makedirs(backup_trash)
24+ index = 0
25+ newname = os.path.join(backup_trash, '%s-%s' % (os.path.basename(target), index))
26+ while os.path.isfile(newname):
27+ index += 1
28+ newname = os.path.join(backup_trash, '%s-%s' % (os.path.basename(target), index))
29+ os.rename(target, newname)
30+ else:
31+ raise
32 elif os.path.isdir(target):
33 warn("rmdir", target)
34 os.rmdir( target )
35@@ -174,6 +190,7 @@
36 if not os.path.exists(delfile):
37 return
38
39+ deleted = []
40 with open(delfile) as f:
41 for line in f:
42 line = line.strip()
43@@ -182,7 +199,7 @@
44 dest = os.path.join(webpath, 'backup', line[4:])
45 else:
46 src = line
47- dest = os.path.join('backup', line)
48+ dest = os.path.join('backup', line)
49
50 destdir = os.path.dirname(dest)
51 if not os.path.exists(destdir):
52@@ -191,8 +208,13 @@
53 if os.path.exists(src):
54 warn("Delete: %s" % src)
55 os.rename(src, dest)
56+ deleted.append(line)
57 else:
58 warn("File to delete %s not found." % src)
59+ return deleted
60+
61+def is_webfile(f):
62+ return re.match("^web[\\\/](.*)", f)
63
64 def do_update():
65 """Real update of the server (before normal OpenERP execution).
66@@ -209,13 +231,13 @@
67 warn(lock_file, 'removed')
68 ## Now, update
69 revisions = []
70- files = None
71+ files = []
72+ deleted_files = []
73 try:
74 ## Revisions that going to be installed
75 revisions = parse_version_file(new_version_file)
76 os.unlink(new_version_file)
77 ## Explore .update directory
78- files = find(update_dir)
79
80 ## Prepare backup directory
81 if not os.path.exists('backup'):
82@@ -255,12 +277,13 @@
83 webupdated = False
84 ## Update Files
85 warn("Updating...")
86+ files = find(update_dir)
87 for f in files:
88 # The delete list is handled last.
89 if f == 'delete.txt':
90 continue
91
92- webfile = re.match("^web[\\\/](.*)", f)
93+ webfile = is_webfile(f)
94 warn("Filename : `%s'" % (f))
95 if webfile:
96 target = os.path.join(update_dir, f)
97@@ -298,25 +321,26 @@
98 os.rename(target, f)
99
100 # Read and apply the deleted.txt file.
101- process_deletes(update_dir, webpath)
102+ deleted_files = process_deletes(update_dir, webpath)
103
104 # Clean out the PYC files so that they can be recompiled
105 # by the (potentially) updated pythonXX.dll.
106 for d in [ '.', webpath ]:
107- for root, dirs, files in os.walk(d):
108- for file in files:
109+ for root, dirs, o_files in os.walk(d):
110+ for file in o_files:
111 if file.endswith('.pyc'):
112 file = os.path.join(root, file)
113 warn('Purge pyc: %s' % file)
114 os.unlink(file)
115
116+ shutil.copy(server_version_file, 'backup')
117+ files.append(server_version_file)
118 add_versions([(x['md5sum'], x['date'],
119 x['name']) for x in revisions])
120 warn("Update successful.")
121 warn("Revisions added: ", ", ".join([x['md5sum'] for x in revisions]))
122 ## No database update here. I preferred to set modules to update just after the preparation
123 ## The reason is, when pool is populated, it will starts by upgrading modules first
124-
125 #Restart web server
126 if webupdated and os.name == "nt":
127 try:
128@@ -330,12 +354,21 @@
129 warn("Update failure!")
130 warn(unicode(e))
131 ## Restore backup and purge .update
132- if files:
133- warn("Restoring...")
134- for f in reversed(files):
135- target = os.path.join('backup', f)
136+ if files or deleted_files:
137+ warn("Restoring... ")
138+ for f in reversed(files + deleted_files):
139+ if is_webfile(f):
140+ f = os.path.join(webpath, webfile.group(1))
141+ target = os.path.join(webbackup, webfile.group(1))
142+ else:
143+ target = os.path.join('backup', f)
144 if os.path.isfile(target) or os.path.islink(target):
145 warn("`%s' -> `%s'" % (target, f))
146+ if os.path.isfile(f):
147+ os.remove(f)
148+ dest_dir = os.path.dirname(f)
149+ if dest_dir and not os.path.isdir(dest_dir):
150+ os.makedirs(dest_dir)
151 os.rename(target, f)
152 warn("Purging...")
153 Try(lambda:rmtree(update_dir))
154
155=== modified file 'win32/OpenERPServerService.py'
156--- win32/OpenERPServerService.py 2013-03-08 13:47:07 +0000
157+++ win32/OpenERPServerService.py 2017-10-19 09:52:17 +0000
158@@ -32,7 +32,6 @@
159 import os
160 import thread
161
162-EXIT_UPDATE_REQUIRE_RESTART = 1
163
164 class OpenERPServerService(win32serviceutil.ServiceFramework):
165 # required info
166@@ -89,12 +88,9 @@
167 # - other exit stauts:
168 # server crashed? exit with an error message
169 exit_status = self.terpprocess.wait()
170- if exit_status == EXIT_UPDATE_REQUIRE_RESTART:
171- servicemanager.LogInfoMsg("OpenERP has been updated, restarting...")
172- continue # restart openerp process
173 if exit_status == 0:
174 break # normal exit
175- sys.exit(exit_status)
176+ os._exit(exit_status)
177
178 def ctrlHandler(ctrlType):
179 return True

Subscribers

People subscribed via source and target branches

to all changes: