|
Lines 562-593
class Application(object):
Link Here
|
| 562 |
except: |
562 |
except: |
| 563 |
MODULE.error('JSON malformatted: "%s"' % content) |
563 |
MODULE.error('JSON malformatted: "%s"' % content) |
| 564 |
raise |
564 |
raise |
| 565 |
files_to_download = [] |
565 |
files_to_download = {} |
| 566 |
files_in_json_file = [] |
566 |
files_in_json_file = [] |
| 567 |
for appname, appinfo in json_apps.iteritems(): |
567 |
for appname, appinfo in json_apps.iteritems(): |
| 568 |
for appfile, appfileinfo in appinfo.iteritems(): |
568 |
for appfile, appfileinfo in appinfo.iteritems(): |
| 569 |
filename = '%s.%s' % (appname, appfile) |
569 |
filename = '%s.%s' % (appname, appfile) |
| 570 |
remote_md5sum = appfileinfo['md5'] |
|
|
| 571 |
remote_url = appfileinfo['url'] |
| 572 |
# compare with local cache |
570 |
# compare with local cache |
| 573 |
cached_filename = os.path.join(CACHE_DIR, filename) |
571 |
cached_filename = os.path.join(CACHE_DIR, filename) |
| 574 |
files_in_json_file.append(cached_filename) |
572 |
files_in_json_file.append(cached_filename) |
| 575 |
local_md5sum = None |
|
|
| 576 |
m = md5() |
| 577 |
if os.path.exists(cached_filename): |
573 |
if os.path.exists(cached_filename): |
|
|
574 |
m = md5() |
| 578 |
with open(cached_filename, 'r') as f: |
575 |
with open(cached_filename, 'r') as f: |
| 579 |
m.update(f.read()) |
576 |
m.update(f.read()) |
| 580 |
local_md5sum = m.hexdigest() |
577 |
if m.hexdigest() != appfileinfo['md5']: |
| 581 |
if remote_md5sum != local_md5sum: |
578 |
# ask to re-download this file |
| 582 |
# ask to re-download this file |
579 |
filename_url = appfileinfo['url'] |
| 583 |
files_to_download.append((remote_url, filename)) |
580 |
parts = urlsplit(filename_url) |
| 584 |
something_changed = True |
581 |
files_to_download.setdefault(parts.netloc, set()).add((filename_url, cached_filename)) |
|
|
582 |
something_changed = True |
| 585 |
# remove those files that apparently do not exist on server anymore |
583 |
# remove those files that apparently do not exist on server anymore |
| 586 |
for cached_filename in glob(os.path.join(CACHE_DIR, '*')): |
584 |
for cached_filename in glob(os.path.join(CACHE_DIR, '*')): |
| 587 |
if cached_filename not in files_in_json_file: |
585 |
if cached_filename not in files_in_json_file: |
| 588 |
MODULE.info('Deleting obsolete %s' % cached_filename) |
586 |
MODULE.info('Deleting obsolete %s' % cached_filename) |
| 589 |
something_changed = True |
587 |
something_changed = True |
| 590 |
os.unlink(cached_filename) |
588 |
os.unlink(cached_filename) |
|
|
589 |
|
| 591 |
def _download(url, dest): |
590 |
def _download(url, dest): |
| 592 |
MODULE.info('Downloading %s to %s' % (url, dest)) |
591 |
MODULE.info('Downloading %s to %s' % (url, dest)) |
| 593 |
try: |
592 |
try: |
|
Lines 597-617
class Application(object):
Link Here
|
| 597 |
else: |
596 |
else: |
| 598 |
with open(dest, 'wb') as f: |
597 |
with open(dest, 'wb') as f: |
| 599 |
f.write(urlcontent.read()) |
598 |
f.write(urlcontent.read()) |
| 600 |
threads = [] |
|
|
| 601 |
for filename_url, filename in files_to_download: |
| 602 |
# dont forget to quote: 'foo & bar.ini' -> 'foo%20&%20bar.ini' |
| 603 |
# but dont quote https:// -> https%3A// |
| 604 |
parts = list(urlsplit(filename_url)) |
| 605 |
parts[2] = urllib2.quote(parts[2]) # 0 -> scheme, 1 -> netloc, 2 -> path |
| 606 |
filename_url = urlunsplit(parts) |
| 607 |
|
599 |
|
| 608 |
cached_filename = os.path.join(CACHE_DIR, filename) |
600 |
def _download_from_host(jobs): |
|
|
601 |
for filename_url, filename in jobs: |
| 602 |
_download(filename_url, filename) |
| 609 |
|
603 |
|
| 610 |
thread = Thread(target=_download, args=(filename_url, cached_filename)) |
604 |
threads = [Thread(target=_download_from_host, args=(jobs,)) for jobs in files_to_download.values()] |
|
|
605 |
for thread in threads: |
| 611 |
thread.start() |
606 |
thread.start() |
| 612 |
threads.append(thread) |
|
|
| 613 |
for thread in threads: |
607 |
for thread in threads: |
| 614 |
thread.join() |
608 |
thread.join() |
|
|
609 |
|
| 615 |
if something_changed: |
610 |
if something_changed: |
| 616 |
# some variables could change apps.xml |
611 |
# some variables could change apps.xml |
| 617 |
# e.g. Name, Description |
612 |
# e.g. Name, Description |