73 lines
2.1 KiB
Python
73 lines
2.1 KiB
Python
import hashlib
|
||
import os
|
||
import subprocess
|
||
|
||
import requests
|
||
import typer
|
||
|
||
app = typer.Typer()
|
||
|
||
|
||
def calculate_sha256(file_path):
|
||
sha256_hash = hashlib.sha256()
|
||
with open(file_path, "rb") as f:
|
||
for byte_block in iter(lambda: f.read(4096), b""):
|
||
sha256_hash.update(byte_block)
|
||
return sha256_hash.hexdigest()
|
||
|
||
|
||
def run_bash_command(command):
|
||
result = subprocess.run(
|
||
command,
|
||
shell=True,
|
||
stdout=subprocess.PIPE,
|
||
stderr=subprocess.PIPE,
|
||
text=True,
|
||
)
|
||
if result.returncode != 0:
|
||
raise RuntimeError(f"Ошибка при выполнении команды: {result.stderr}")
|
||
return result.stdout.strip()
|
||
|
||
|
||
def download_file(url, dest_folder="downloads"):
|
||
os.makedirs(dest_folder, exist_ok=True)
|
||
local_filename = os.path.join(dest_folder, os.path.basename(url))
|
||
with requests.get(url, stream=True, timeout=3000) as r:
|
||
r.raise_for_status()
|
||
with open(local_filename, "wb") as f:
|
||
for chunk in r.iter_content(chunk_size=8192):
|
||
f.write(chunk)
|
||
return local_filename
|
||
|
||
|
||
def update_checksums(script_path):
|
||
# Выполняем bash-скрипт, чтобы получить массив sources
|
||
command = (
|
||
f"source {script_path} && printf '%s\\n' \"${{sources_amd64[@]}}\""
|
||
)
|
||
try:
|
||
sources_output = run_bash_command(command)
|
||
except RuntimeError as e:
|
||
print(f"Ошибка выполнения скрипта: {e}")
|
||
return
|
||
|
||
sources = sources_output.splitlines()
|
||
if not sources:
|
||
print("Не удалось получить массив sources_amd64.")
|
||
return
|
||
|
||
new_checksums = []
|
||
for source_url in sources:
|
||
print(f"Скачивание: {source_url}")
|
||
local_file = download_file(source_url)
|
||
checksum = calculate_sha256(local_file)
|
||
new_checksums.append(f"sha256:{checksum}")
|
||
os.remove(local_file)
|
||
|
||
new_checksums_block = " ".join(f"'{chk}'" for chk in new_checksums)
|
||
print(new_checksums_block)
|
||
|
||
|
||
@app.command(help="Get checksums for new sources")
|
||
def checksums():
|
||
update_checksums(f"{os.getcwd()}/alr.sh")
|