127 lines
4 KiB
Text
127 lines
4 KiB
Text
|
#!/usr/bin/env python3
|
||
|
# -*- coding: utf-8 -*-
|
||
|
#
|
||
|
# @linux-aarhus - root.nix.dk
|
||
|
# License: GNU GPL, version 3 or later; http://www.gnu.org/licenses/gpl.html
|
||
|
import argparse
|
||
|
import subprocess
|
||
|
import sys
|
||
|
import os
|
||
|
import requests
|
||
|
import time
|
||
|
from typing import List
|
||
|
from pathlib import Path
|
||
|
|
||
|
DEF_URL = "https://gitlab.manjaro.org/webpage/iso-info/-/raw/master/file-info.json"
|
||
|
FOLDER = Path.home()
|
||
|
|
||
|
|
||
|
def download_file(url: str, folder_name: str) -> bool:
|
||
|
filename: str = url.split("/")[-1]
|
||
|
path = os.path.join("/{}/{}".format(folder_name, filename))
|
||
|
try:
|
||
|
response = requests.get(url, stream=True)
|
||
|
total_size_in_bytes = int(response.headers.get("content-length", 0))
|
||
|
block_size = 1024
|
||
|
if total_size_in_bytes < block_size:
|
||
|
block_size = total_size_in_bytes
|
||
|
|
||
|
with open(path, "wb") as f:
|
||
|
progress = 0
|
||
|
for data in response.iter_content(block_size):
|
||
|
f.write(data)
|
||
|
if len(data) < block_size:
|
||
|
progress += len(data)
|
||
|
else:
|
||
|
progress += block_size
|
||
|
print(f"Received {progress}/{total_size_in_bytes}", end="\r")
|
||
|
|
||
|
except Exception as e:
|
||
|
print(e)
|
||
|
return False
|
||
|
return True
|
||
|
|
||
|
|
||
|
def get_definitions(url: str) -> dict:
|
||
|
iso_def = {}
|
||
|
try:
|
||
|
resp = requests.get(url=url, timeout=10)
|
||
|
resp.raise_for_status()
|
||
|
iso_def = resp.json()
|
||
|
except Exception as e:
|
||
|
print(f"{e}")
|
||
|
return iso_def
|
||
|
|
||
|
|
||
|
def init_iso_list(url: str) -> List:
|
||
|
data = get_definitions(url)
|
||
|
data_official = data.get("official")
|
||
|
data_community = data.get("community")
|
||
|
init_iso_result = []
|
||
|
for ok, ov in data_official.items():
|
||
|
try:
|
||
|
init_iso_result.append({"name": ok,
|
||
|
"full": {"img": ov["image"], "sig": ov["signature"]},
|
||
|
"minimal": {"img": ov["minimal"]["image"], "sig": ov["minimal"]["signature"]}
|
||
|
})
|
||
|
except:
|
||
|
continue
|
||
|
|
||
|
for ck, cv in data_community.items():
|
||
|
try:
|
||
|
init_iso_result.append({"name": ck,
|
||
|
"full": {"img": cv["image"], "sig": cv["signature"]},
|
||
|
"minimal": {"img": cv["minimal"]["image"], "sig": cv["minimal"]["signature"]}
|
||
|
})
|
||
|
except:
|
||
|
continue
|
||
|
|
||
|
return init_iso_result
|
||
|
|
||
|
|
||
|
def download(url: str) -> bool:
|
||
|
print(f'Downloading: {url.split("/")[-1]}')
|
||
|
success = download_file(url, f"{FOLDER}")
|
||
|
return success
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
prog_name = os.path.basename(__file__)
|
||
|
prog_version = "0.1"
|
||
|
iso_files = init_iso_list(DEF_URL)
|
||
|
choices = []
|
||
|
for c in iso_files:
|
||
|
choices.append(c["name"])
|
||
|
parser = argparse.ArgumentParser(
|
||
|
prog=f"{prog_name}",
|
||
|
description="This tool will download a named Manjaro ISO and verify the signature",
|
||
|
epilog=f"{prog_name} version {prog_version} - License GPL v3 or later")
|
||
|
parser.add_argument("edition",
|
||
|
type=str,
|
||
|
help="edition e.g. plasma or xfce",
|
||
|
choices=choices)
|
||
|
parser.add_argument("-f", "--full",
|
||
|
required=False,
|
||
|
action="store_true",
|
||
|
help="Download full ISO")
|
||
|
args = parser.parse_args()
|
||
|
|
||
|
edition = [x for x in iso_files if args.edition == x["name"]]
|
||
|
for x in edition:
|
||
|
if args.full:
|
||
|
iso = x["full"]
|
||
|
else:
|
||
|
iso = x["minimal"]
|
||
|
iso_result = download(iso["img"])
|
||
|
sig_result = download(iso["sig"])
|
||
|
if sig_result and iso_result:
|
||
|
print("Wait for verification ...")
|
||
|
time.sleep(5)
|
||
|
local_filename = iso["sig"].split("/")[-1]
|
||
|
result = subprocess.run(["gpg", "--verify", f"{local_filename}"],
|
||
|
cwd=f"{FOLDER}")
|
||
|
else:
|
||
|
print("Download ISO failed")
|
||
|
sys.exit(0)
|
||
|
sys.exit(0)
|