Merge lp:~jfb-tempo-consulting/unifield-server/US-3534 into lp:unifield-server/uf6
- US-3534
- Merge into 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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
UniField Dev Team | Pending | ||
Review via email: mp+332473@code.launchpad.net |
Commit message
Description of the change
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 | 114 | 114 | ||
6 | 115 | def rmtree(files, path=None, verbose=False): | 115 | def rmtree(files, path=None, verbose=False): |
7 | 116 | """Python free rmtree""" | 116 | """Python free rmtree""" |
8 | 117 | # OpenERPServerService.exe can't be deleted if Windows Service MAnager uses it | ||
9 | 118 | backup_trash = 'backup-trash' | ||
10 | 117 | if path is None and isinstance(files, basestring): | 119 | if path is None and isinstance(files, basestring): |
11 | 118 | path, files = files, find(files) | 120 | path, files = files, find(files) |
12 | 119 | for f in reversed(files): | 121 | for f in reversed(files): |
13 | 120 | target = os.path.join(path, f) if path is not None else f | 122 | target = os.path.join(path, f) if path is not None else f |
14 | 121 | if os.path.isfile(target) or os.path.islink(target): | 123 | if os.path.isfile(target) or os.path.islink(target): |
15 | 122 | warn("unlink", target) | 124 | warn("unlink", target) |
17 | 123 | os.unlink( target ) | 125 | try: |
18 | 126 | os.unlink(target) | ||
19 | 127 | except: | ||
20 | 128 | warn('Except on target %s, %s' % (target, target.endswith('OpenERPServerService.exe'))) | ||
21 | 129 | if target.endswith('OpenERPServerService.exe'): | ||
22 | 130 | if not os.path.isdir(backup_trash): | ||
23 | 131 | os.makedirs(backup_trash) | ||
24 | 132 | index = 0 | ||
25 | 133 | newname = os.path.join(backup_trash, '%s-%s' % (os.path.basename(target), index)) | ||
26 | 134 | while os.path.isfile(newname): | ||
27 | 135 | index += 1 | ||
28 | 136 | newname = os.path.join(backup_trash, '%s-%s' % (os.path.basename(target), index)) | ||
29 | 137 | os.rename(target, newname) | ||
30 | 138 | else: | ||
31 | 139 | raise | ||
32 | 124 | elif os.path.isdir(target): | 140 | elif os.path.isdir(target): |
33 | 125 | warn("rmdir", target) | 141 | warn("rmdir", target) |
34 | 126 | os.rmdir( target ) | 142 | os.rmdir( target ) |
35 | @@ -174,6 +190,7 @@ | |||
36 | 174 | if not os.path.exists(delfile): | 190 | if not os.path.exists(delfile): |
37 | 175 | return | 191 | return |
38 | 176 | 192 | ||
39 | 193 | deleted = [] | ||
40 | 177 | with open(delfile) as f: | 194 | with open(delfile) as f: |
41 | 178 | for line in f: | 195 | for line in f: |
42 | 179 | line = line.strip() | 196 | line = line.strip() |
43 | @@ -182,7 +199,7 @@ | |||
44 | 182 | dest = os.path.join(webpath, 'backup', line[4:]) | 199 | dest = os.path.join(webpath, 'backup', line[4:]) |
45 | 183 | else: | 200 | else: |
46 | 184 | src = line | 201 | src = line |
48 | 185 | dest = os.path.join('backup', line) | 202 | dest = os.path.join('backup', line) |
49 | 186 | 203 | ||
50 | 187 | destdir = os.path.dirname(dest) | 204 | destdir = os.path.dirname(dest) |
51 | 188 | if not os.path.exists(destdir): | 205 | if not os.path.exists(destdir): |
52 | @@ -191,8 +208,13 @@ | |||
53 | 191 | if os.path.exists(src): | 208 | if os.path.exists(src): |
54 | 192 | warn("Delete: %s" % src) | 209 | warn("Delete: %s" % src) |
55 | 193 | os.rename(src, dest) | 210 | os.rename(src, dest) |
56 | 211 | deleted.append(line) | ||
57 | 194 | else: | 212 | else: |
58 | 195 | warn("File to delete %s not found." % src) | 213 | warn("File to delete %s not found." % src) |
59 | 214 | return deleted | ||
60 | 215 | |||
61 | 216 | def is_webfile(f): | ||
62 | 217 | return re.match("^web[\\\/](.*)", f) | ||
63 | 196 | 218 | ||
64 | 197 | def do_update(): | 219 | def do_update(): |
65 | 198 | """Real update of the server (before normal OpenERP execution). | 220 | """Real update of the server (before normal OpenERP execution). |
66 | @@ -209,13 +231,13 @@ | |||
67 | 209 | warn(lock_file, 'removed') | 231 | warn(lock_file, 'removed') |
68 | 210 | ## Now, update | 232 | ## Now, update |
69 | 211 | revisions = [] | 233 | revisions = [] |
71 | 212 | files = None | 234 | files = [] |
72 | 235 | deleted_files = [] | ||
73 | 213 | try: | 236 | try: |
74 | 214 | ## Revisions that going to be installed | 237 | ## Revisions that going to be installed |
75 | 215 | revisions = parse_version_file(new_version_file) | 238 | revisions = parse_version_file(new_version_file) |
76 | 216 | os.unlink(new_version_file) | 239 | os.unlink(new_version_file) |
77 | 217 | ## Explore .update directory | 240 | ## Explore .update directory |
78 | 218 | files = find(update_dir) | ||
79 | 219 | 241 | ||
80 | 220 | ## Prepare backup directory | 242 | ## Prepare backup directory |
81 | 221 | if not os.path.exists('backup'): | 243 | if not os.path.exists('backup'): |
82 | @@ -255,12 +277,13 @@ | |||
83 | 255 | webupdated = False | 277 | webupdated = False |
84 | 256 | ## Update Files | 278 | ## Update Files |
85 | 257 | warn("Updating...") | 279 | warn("Updating...") |
86 | 280 | files = find(update_dir) | ||
87 | 258 | for f in files: | 281 | for f in files: |
88 | 259 | # The delete list is handled last. | 282 | # The delete list is handled last. |
89 | 260 | if f == 'delete.txt': | 283 | if f == 'delete.txt': |
90 | 261 | continue | 284 | continue |
91 | 262 | 285 | ||
93 | 263 | webfile = re.match("^web[\\\/](.*)", f) | 286 | webfile = is_webfile(f) |
94 | 264 | warn("Filename : `%s'" % (f)) | 287 | warn("Filename : `%s'" % (f)) |
95 | 265 | if webfile: | 288 | if webfile: |
96 | 266 | target = os.path.join(update_dir, f) | 289 | target = os.path.join(update_dir, f) |
97 | @@ -298,25 +321,26 @@ | |||
98 | 298 | os.rename(target, f) | 321 | os.rename(target, f) |
99 | 299 | 322 | ||
100 | 300 | # Read and apply the deleted.txt file. | 323 | # Read and apply the deleted.txt file. |
102 | 301 | process_deletes(update_dir, webpath) | 324 | deleted_files = process_deletes(update_dir, webpath) |
103 | 302 | 325 | ||
104 | 303 | # Clean out the PYC files so that they can be recompiled | 326 | # Clean out the PYC files so that they can be recompiled |
105 | 304 | # by the (potentially) updated pythonXX.dll. | 327 | # by the (potentially) updated pythonXX.dll. |
106 | 305 | for d in [ '.', webpath ]: | 328 | for d in [ '.', webpath ]: |
109 | 306 | for root, dirs, files in os.walk(d): | 329 | for root, dirs, o_files in os.walk(d): |
110 | 307 | for file in files: | 330 | for file in o_files: |
111 | 308 | if file.endswith('.pyc'): | 331 | if file.endswith('.pyc'): |
112 | 309 | file = os.path.join(root, file) | 332 | file = os.path.join(root, file) |
113 | 310 | warn('Purge pyc: %s' % file) | 333 | warn('Purge pyc: %s' % file) |
114 | 311 | os.unlink(file) | 334 | os.unlink(file) |
115 | 312 | 335 | ||
116 | 336 | shutil.copy(server_version_file, 'backup') | ||
117 | 337 | files.append(server_version_file) | ||
118 | 313 | add_versions([(x['md5sum'], x['date'], | 338 | add_versions([(x['md5sum'], x['date'], |
119 | 314 | x['name']) for x in revisions]) | 339 | x['name']) for x in revisions]) |
120 | 315 | warn("Update successful.") | 340 | warn("Update successful.") |
121 | 316 | warn("Revisions added: ", ", ".join([x['md5sum'] for x in revisions])) | 341 | warn("Revisions added: ", ", ".join([x['md5sum'] for x in revisions])) |
122 | 317 | ## No database update here. I preferred to set modules to update just after the preparation | 342 | ## No database update here. I preferred to set modules to update just after the preparation |
123 | 318 | ## The reason is, when pool is populated, it will starts by upgrading modules first | 343 | ## The reason is, when pool is populated, it will starts by upgrading modules first |
124 | 319 | |||
125 | 320 | #Restart web server | 344 | #Restart web server |
126 | 321 | if webupdated and os.name == "nt": | 345 | if webupdated and os.name == "nt": |
127 | 322 | try: | 346 | try: |
128 | @@ -330,12 +354,21 @@ | |||
129 | 330 | warn("Update failure!") | 354 | warn("Update failure!") |
130 | 331 | warn(unicode(e)) | 355 | warn(unicode(e)) |
131 | 332 | ## Restore backup and purge .update | 356 | ## Restore backup and purge .update |
136 | 333 | if files: | 357 | if files or deleted_files: |
137 | 334 | warn("Restoring...") | 358 | warn("Restoring... ") |
138 | 335 | for f in reversed(files): | 359 | for f in reversed(files + deleted_files): |
139 | 336 | target = os.path.join('backup', f) | 360 | if is_webfile(f): |
140 | 361 | f = os.path.join(webpath, webfile.group(1)) | ||
141 | 362 | target = os.path.join(webbackup, webfile.group(1)) | ||
142 | 363 | else: | ||
143 | 364 | target = os.path.join('backup', f) | ||
144 | 337 | if os.path.isfile(target) or os.path.islink(target): | 365 | if os.path.isfile(target) or os.path.islink(target): |
145 | 338 | warn("`%s' -> `%s'" % (target, f)) | 366 | warn("`%s' -> `%s'" % (target, f)) |
146 | 367 | if os.path.isfile(f): | ||
147 | 368 | os.remove(f) | ||
148 | 369 | dest_dir = os.path.dirname(f) | ||
149 | 370 | if dest_dir and not os.path.isdir(dest_dir): | ||
150 | 371 | os.makedirs(dest_dir) | ||
151 | 339 | os.rename(target, f) | 372 | os.rename(target, f) |
152 | 340 | warn("Purging...") | 373 | warn("Purging...") |
153 | 341 | Try(lambda:rmtree(update_dir)) | 374 | Try(lambda:rmtree(update_dir)) |
154 | 342 | 375 | ||
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 | 32 | import os | 32 | import os |
160 | 33 | import thread | 33 | import thread |
161 | 34 | 34 | ||
162 | 35 | EXIT_UPDATE_REQUIRE_RESTART = 1 | ||
163 | 36 | 35 | ||
164 | 37 | class OpenERPServerService(win32serviceutil.ServiceFramework): | 36 | class OpenERPServerService(win32serviceutil.ServiceFramework): |
165 | 38 | # required info | 37 | # required info |
166 | @@ -89,12 +88,9 @@ | |||
167 | 89 | # - other exit stauts: | 88 | # - other exit stauts: |
168 | 90 | # server crashed? exit with an error message | 89 | # server crashed? exit with an error message |
169 | 91 | exit_status = self.terpprocess.wait() | 90 | exit_status = self.terpprocess.wait() |
170 | 92 | if exit_status == EXIT_UPDATE_REQUIRE_RESTART: | ||
171 | 93 | servicemanager.LogInfoMsg("OpenERP has been updated, restarting...") | ||
172 | 94 | continue # restart openerp process | ||
173 | 95 | if exit_status == 0: | 91 | if exit_status == 0: |
174 | 96 | break # normal exit | 92 | break # normal exit |
176 | 97 | sys.exit(exit_status) | 93 | os._exit(exit_status) |
177 | 98 | 94 | ||
178 | 99 | def ctrlHandler(ctrlType): | 95 | def ctrlHandler(ctrlType): |
179 | 100 | return True | 96 | return True |