mirror of
https://codeberg.org/hyperreal/admin-scripts
synced 2024-11-01 16:03:06 +01:00
Add calculate_mirror_size.py
This commit is contained in:
parent
1306269b4e
commit
88cfe1aad3
85
bin/calculate_mirror_size.py
Executable file
85
bin/calculate_mirror_size.py
Executable file
@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
"""calculate_mirror_size.py
|
||||
|
||||
Usage:
|
||||
calculate_mirror_size.py -H <http_url> -R <rsync_url>
|
||||
calculate_mirror_size.py -h
|
||||
|
||||
Examples:
|
||||
calculate_mirror_size.py -H "https://mirrors.servercentral.com/voidlinux/" -R "rsync://repo-sync.voidlinux.org/voidlinux/"
|
||||
|
||||
Options:
|
||||
-H <http_url> HTTP URL of the mirror
|
||||
-R <rsync_url> rsync URL of the mirror
|
||||
-h, --help show this help message and exit
|
||||
"""
|
||||
|
||||
import subprocess
|
||||
from tempfile import TemporaryDirectory
|
||||
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
from docopt import docopt
|
||||
from rich.console import Console
|
||||
from rich.text import Text
|
||||
|
||||
|
||||
def human_bytes(bites: int) -> str:
|
||||
B = float(bites)
|
||||
KiB = float(1024)
|
||||
MiB = float(KiB**2)
|
||||
GiB = float(KiB**3)
|
||||
TiB = float(KiB**4)
|
||||
|
||||
match B:
|
||||
case B if B < KiB:
|
||||
return "{0} {1}".format(B, "bytes" if 0 == B > 1 else "byte")
|
||||
case B if KiB <= B < MiB:
|
||||
return "{0:.2f} KiB".format(B / KiB)
|
||||
case B if MiB <= B < GiB:
|
||||
return "{0:.2f} MiB".format(B / MiB)
|
||||
case B if GiB <= B < TiB:
|
||||
return "{0:.2f} GiB".format(B / GiB)
|
||||
case B if TiB <= B:
|
||||
return "{0:.2f} TiB".format(B / TiB)
|
||||
case _:
|
||||
return ""
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = docopt(__doc__) # type: ignore
|
||||
|
||||
repo_shorthand = Text(args["-R"].split("//")[1])
|
||||
|
||||
print()
|
||||
console = Console()
|
||||
with console.status(
|
||||
"[bold magenta]Calculating mirror size...", spinner="aesthetic"
|
||||
) as status:
|
||||
response = requests.get(args["-H"], timeout=60)
|
||||
soup = BeautifulSoup(response.text, "html.parser")
|
||||
mirror_dirs = []
|
||||
for node in soup.find_all("a"):
|
||||
if not node.get("href").startswith(".") and node.get("href").endswith("/"):
|
||||
mirror_dirs.append(node.get("href"))
|
||||
|
||||
console.log(
|
||||
f"Summing up the sizes of each directory in [bold blue]{repo_shorthand}[/bold blue]."
|
||||
)
|
||||
with TemporaryDirectory() as tmp_dir:
|
||||
dir_sizes = []
|
||||
for dir in mirror_dirs:
|
||||
rsync_cmd = f"rsync -a -n --stats {args['-R']}/{dir}/ | grep '^Total file size' | tr -d ','"
|
||||
output = subprocess.run(rsync_cmd, shell=True, capture_output=True)
|
||||
logstr = (
|
||||
dir.rjust(len(max(mirror_dirs, key=len)))
|
||||
+ " "
|
||||
+ human_bytes(int(output.stdout.split()[3]))
|
||||
)
|
||||
console.log(logstr)
|
||||
dir_sizes.append(int(output.stdout.split()[3]))
|
||||
|
||||
console.print(
|
||||
f"\n[bold blue]{repo_shorthand}[/bold blue]: " + human_bytes(sum(dir_sizes))
|
||||
)
|
Loading…
Reference in New Issue
Block a user