You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.3 KiB
Python
55 lines
1.3 KiB
Python
#!/usr/bin/python3
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
import re
|
|
|
|
import click
|
|
|
|
|
|
def du(paths):
|
|
# Just using coreutils du, to have deduping, and the correct size
|
|
result = subprocess.check_output(["du", "-sc", "--block-size=1", *paths])
|
|
total_line = result.splitlines()[-1]
|
|
total_bytes, total_check = total_line.split(b"\t")
|
|
assert total_check == b"total"
|
|
return int(total_bytes)
|
|
|
|
|
|
def interpret_prefixes(number, si=False):
|
|
# prefix as the "K" in "KB"
|
|
multiplier = 1000 if si else 1024
|
|
|
|
if m := re.match(r"^(?i:(\d+)([kmg])?)", number):
|
|
number, prefix = m.groups()
|
|
else:
|
|
raise ValueError("Can't interpret size")
|
|
|
|
number = int(number)
|
|
if prefix is not None:
|
|
prefix = prefix.lower()
|
|
|
|
exponent = {
|
|
None: 0,
|
|
"k": 1,
|
|
"m": 2,
|
|
"g": 3,
|
|
"t": 4,
|
|
}
|
|
return number * multiplier ** exponent[prefix]
|
|
|
|
@click.command()
|
|
@click.argument("threshold")
|
|
@click.argument("paths", nargs=-1)
|
|
def larger_than(threshold, paths):
|
|
"""Check if disk usage of PATHS is larger than THRESHOLD"""
|
|
threshold = interpret_prefixes(threshold)
|
|
if du(paths) > threshold:
|
|
sys.exit(0)
|
|
else:
|
|
sys.exit(1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
larger_than()
|