2021-09-02 19:19:53 +00:00
|
|
|
import re
|
|
|
|
import sys
|
|
|
|
import textwrap
|
|
|
|
|
|
|
|
import bs4
|
|
|
|
import requests
|
|
|
|
|
|
|
|
|
|
|
|
BYTE_SUFFIXES = {
|
|
|
|
"": 1,
|
|
|
|
"B": 1,
|
|
|
|
"kB": 1024,
|
|
|
|
"MB": 1024 * 1024,
|
|
|
|
"GB": 1024 * 1024 * 1024,
|
|
|
|
"TB": 1024 * 1024 * 1024 * 1024,
|
|
|
|
}
|
|
|
|
|
|
|
|
TIME_SUFFIXES = {
|
|
|
|
"Days": 60 * 60 * 24,
|
|
|
|
"Day": 60 * 60 * 24,
|
|
|
|
"Hrs": 60 * 60,
|
|
|
|
"Hr": 60 * 60,
|
|
|
|
"Mins": 60,
|
|
|
|
"Min": 60,
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def uniec(n):
|
|
|
|
m = re.match(r"^([0-9]+(?:[.][0-9]+)?)([a-zA-Z]*)$", n)
|
|
|
|
if not m:
|
|
|
|
raise ValueError(f"invalid suffixed-bytes {n}")
|
|
|
|
val, suffix = m.groups()
|
|
|
|
val = float(val)
|
|
|
|
if suffix not in BYTE_SUFFIXES:
|
|
|
|
raise ValueError(f"unknown suffix {suffix} from {n}")
|
|
|
|
return val * BYTE_SUFFIXES[suffix]
|
|
|
|
|
|
|
|
|
|
|
|
def untime(n):
|
|
|
|
remaining = n
|
|
|
|
x = 0
|
|
|
|
while remaining and (m := re.match(r"^([0-9]+) ([a-zA-Z]+)(?: (.*)|$)", remaining)):
|
|
|
|
val, suffix, remaining = m.groups()
|
|
|
|
val = float(val)
|
|
|
|
if suffix not in TIME_SUFFIXES:
|
|
|
|
raise ValueError(f"unknown suffix {suffix} from {n}")
|
|
|
|
x += val * TIME_SUFFIXES[suffix]
|
|
|
|
return x
|
|
|
|
|
|
|
|
|
|
|
|
def scrape_data():
|
2023-10-10 23:31:33 +00:00
|
|
|
resp = requests.get("http://10.42.0.1/mbbstatus")
|
2021-09-02 19:19:53 +00:00
|
|
|
resp.raise_for_status()
|
|
|
|
|
|
|
|
soup = bs4.BeautifulSoup(resp.text, "html5lib")
|
|
|
|
|
|
|
|
data = {}
|
|
|
|
|
|
|
|
account_number_el = soup.select("p.account__details > span")[1]
|
|
|
|
data["account_number"] = account_number_el.get_text().strip().replace(" ", "")
|
|
|
|
|
|
|
|
allowance_left_el = soup.select("span.allowance__left")[0]
|
|
|
|
allowance_left_str, allowance_total_str = list(allowance_left_el.stripped_strings)
|
|
|
|
data["allowance_left"] = uniec(allowance_left_str)
|
|
|
|
if allowance_total_str.startswith("left of "):
|
|
|
|
allowance_total_str = allowance_total_str[len("left of ") :]
|
|
|
|
data["allowance_total"] = uniec(allowance_total_str)
|
|
|
|
|
|
|
|
timespan_str = " ".join(soup.select(".allowance__timespan")[0].stripped_strings)
|
|
|
|
if timespan_str.startswith("Lasts for "):
|
|
|
|
timespan_str = timespan_str[len("Lasts for ") :]
|
|
|
|
data["time_remaining"] = untime(timespan_str)
|
|
|
|
|
|
|
|
return textwrap.dedent(
|
|
|
|
f"""
|
|
|
|
ee_allowance_left{{account_number="{data['account_number']}"}} {data['allowance_left']}
|
|
|
|
ee_allowance_total{{account_number="{data['account_number']}"}} {data['allowance_total']}
|
|
|
|
ee_time_remaining{{account_number="{data['account_number']}"}} {data['time_remaining']}
|
|
|
|
"""
|
|
|
|
).strip()
|
|
|
|
|
|
|
|
|
|
|
|
def main(args):
|
|
|
|
if len(args) > 2:
|
|
|
|
print(f"{args[0]} (output path)", file=sys.stderr)
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
data = scrape_data()
|
|
|
|
if len(args) == 1:
|
|
|
|
print(data)
|
|
|
|
else:
|
|
|
|
with open(args[1], "w") as f:
|
2021-09-02 19:23:03 +00:00
|
|
|
print(data, file=f)
|
2021-09-02 19:19:53 +00:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main(sys.argv)
|