amprolla_init.py (3140B)
1 #!/usr/bin/env python3 2 # See LICENSE file for copyright and license details. 3 4 """ 5 This module will download the initial Release files used to populate 6 the spooldir, along with all the files hashed inside the Release files 7 """ 8 9 from os.path import join 10 from multiprocessing import Pool 11 from time import time 12 13 from lib.config import (aliases, arches, categories, cpunm, mainrepofiles, 14 repos, spooldir, suites, skips) 15 from lib.lock import check_lock, free_lock 16 from lib.net import download 17 from lib.parse import parse_release 18 from lib.log import die, info 19 20 21 def pop_dirs(repo): 22 """ 23 Crawls through the directories to come up with complete needed 24 directory structure. 25 Returns a list of tuples holding the remote and local locations 26 of the files 27 28 Example: 29 (http://deb.debian.org/debian/dists/jessie/main/binary-all/Packages.gz, 30 ./spool/debian/dists/jessie/main/binary-all/Packages.gz) 31 """ 32 repodata = repos[repo] 33 34 urls = [] 35 36 for i in suites: 37 for j in suites[i]: 38 baseurl = join(repodata['host'], repodata['dists']) 39 suite = j 40 if repodata['aliases'] is True: 41 if j in aliases[repodata['name']]: 42 suite = aliases[repodata['name']][j] 43 elif repodata['skipmissing'] is True: 44 continue 45 if repo == 'debian' and j in skips: 46 continue 47 pair = (join(baseurl, suite), 48 join(baseurl.replace(repodata['host'], 49 spooldir), suite)) 50 urls.append(pair) 51 52 return urls 53 54 55 def main(): 56 """ 57 Loops through all repositories, and downloads their Release files, along 58 with all the files listed within those Release files. 59 """ 60 for dist in repos: 61 print('Downloading %s directory structure' % dist) 62 dlurls = pop_dirs(dist) 63 for url in dlurls: 64 tpl = [] 65 for file in mainrepofiles: 66 urls = (join(url[0], file), join(url[1], file)) 67 tpl.append(urls) 68 dlpool = Pool(cpunm) 69 dlpool.map(download, tpl) 70 dlpool.close() 71 72 release_contents = open(join(url[1], 'Release')).read() 73 release_contents = parse_release(release_contents) 74 tpl = [] 75 for k in release_contents: 76 # if k.endswith('/binary-armhf/Packages.gz'): 77 # for a in arches: 78 # for c in categories: 79 # if a in k and ("/%s/" % c) in k: 80 # urls = (join(url[0], k), join(url[1], k)) 81 # tpl.append(urls) 82 urls = (join(url[0], k), join(url[1], k)) 83 tpl.append(urls) 84 dlpool = Pool(cpunm) 85 dlpool.map(download, tpl) 86 dlpool.close() 87 88 89 if __name__ == '__main__': 90 try: 91 t1 = time() 92 check_lock() 93 main() 94 free_lock() 95 t2 = time() 96 info('Total init time: %s' % (t2 - t1), tofile=True) 97 except Exception as e: 98 die(e)