python3 alpine.py > urls
aria2c -d main/x86_64/ -i urls
#!/usr/bin/env python3 | |
# -*- coding: utf-8 -*- | |
import os.path | |
import tarfile | |
import urllib.request | |
import logging | |
BASE_URL = 'https://mirror.us.leaseweb.net/alpine/v3.5/main/x86_64/' | |
INDEX_FILE = 'APKINDEX.tar.gz' | |
INDEX_URL = BASE_URL + INDEX_FILE | |
REPO_PATH = 'main/x86_64' | |
INDEX_PATH = os.path.join(REPO_PATH, INDEX_FILE) | |
FORBIDDEN = "linux-firmware gcc-gnat dbg doc src.rpm abiword gnome gtk xfce\ | |
firefox thunderbird dahdi email linux-vanilla-dev perl-dev\ | |
ffmpeg asterisk gimp gnumeric gparted guile sound valgrind icon-theme qt4\ | |
qt5 office vlc qt- qemu libvirt boost-dev tests xorg ntop clang-libs\ | |
django ghostscript country wireshark rt4 phonenumbers freeswitch\ | |
twisted graphviz pidgin xen- motif gfortran hydrogen ffmpeg xscreensaver\ | |
mesa- mpd- ipptool teeworld vala- thunar xfdesk".split() | |
logger = logging.getLogger() | |
logger.setLevel(logging.DEBUG) | |
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') | |
fh = logging.FileHandler('alpine.log') | |
fh.setLevel(logging.DEBUG) | |
fh.setFormatter(formatter) | |
logger.addHandler(fh) | |
def init_repo(): | |
os.makedirs(REPO_PATH, exist_ok=True) | |
if not os.path.exists(INDEX_PATH): | |
logger.info('Downloading %s' % INDEX_URL) | |
urllib.request.urlretrieve(INDEX_URL, INDEX_PATH) | |
else: | |
logger.info('index ok') | |
def get_packages(): | |
index = read_index() | |
packages = [] | |
name = '' | |
for line in index: | |
if line.startswith(b'P:'): | |
name = line.strip(b'\n').split(b':')[1] | |
elif line.startswith(b'V:'): | |
packages.append((str(name, 'UTF-8'), str(line.strip(b'\n').split(b':')[1], 'UTF-8'))) | |
return packages | |
def read_index(): | |
if os.path.exists(INDEX_PATH): | |
logger.info('reading file %s' % INDEX_PATH) | |
return read_gz_index(INDEX_PATH) | |
else: | |
logger.error('index not found') | |
raise Exception("Index file not found, check download process") | |
def read_gz_index(file_path): | |
with tarfile.open(file_path, 'r:gz') as gz_file: | |
return gz_file.extractfile('APKINDEX').readlines() | |
def bad_package(name): | |
for bad in FORBIDDEN: | |
if bad in name: | |
return True | |
return False | |
if __name__ == '__main__': | |
init_repo() | |
p = get_packages() | |
for i, v in p: | |
if not bad_package(i): | |
if not os.path.exists(os.path.join(REPO_PATH, "%s-%s.apk" % (i, v))): | |
print("%s%s-%s.apk" % (BASE_URL, i, v)) |