dyfi.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import argparse
  2. import logging
  3. from time import sleep
  4. import requests as r
  5. logger = logging.getLogger(__name__)
  6. arg_parser = argparse.ArgumentParser()
  7. arg_parser.add_argument("-a", "--auth", default="", help="Path to auth file.")
  8. arg_parser.add_argument("-l", "--log", default="", help="Log to file instead of stdout")
  9. args = arg_parser.parse_args()
  10. MINUTE_SEC: int = 60
  11. HOUR_SEC: int = MINUTE_SEC * 60
  12. DAY_SEC: int = HOUR_SEC * 24
  13. SLEEP_TIME_SEC: int = DAY_SEC * 5 + HOUR_SEC * 3 + MINUTE_SEC * 14
  14. def dyfi_update(email: str, password: str, hostnames: str) -> None:
  15. res: r.Response = r.get("https://www.dy.fi/nic/update", params={"hostname": hostnames}, auth=(email, password))
  16. if res.status_code != 200:
  17. logger.error("dy.fi responded with code {res.status_code}. Response content:\n{res.text}\n")
  18. else:
  19. logger.info(f"dy.fi responded with 200. Response content: \n{res.text}\n")
  20. def parse_auth() -> tuple[str, str, str]:
  21. with open(args.auth, "r") as f:
  22. lines: list[str] = f.readlines()
  23. email_start: int = lines[0].find("EMAIL=")
  24. if email_start == -1:
  25. logger.error("Invalid auth file. Email not found. Must be in the format:\nEMAIL=<email>\nPASSWORD=<password>\nHOSTNAMES=<hostnames>")
  26. email_start += len("EMAIL=")
  27. email = lines[0][email_start:-1]
  28. password_start: int = lines[1].find("PASSWORD=")
  29. if password_start == -1:
  30. logger.error("Invalid auth file. Password not found. Must be in the format:\nEMAIL=<password>\nPASSWORD=<password>\nHOSTNAMES=<hostnames>")
  31. password_start += len("PASSWORD=")
  32. password = lines[1][password_start:-1]
  33. hostnames_start: int = lines[2].find("HOSTNAMES=")
  34. if hostnames_start == -1:
  35. logger.error("Invalid auth file. Hostnames not found. Must be in the format:\nEMAIL=<hostnames>\nPASSWORD=<hostnames>\nHOSTNAMES=<hostnames>")
  36. hostnames_start += len("HOSTNAMES=")
  37. hostnames = lines[2][hostnames_start:-1]
  38. return (email, password, hostnames)
  39. if __name__ == "__main__":
  40. logging.basicConfig(filename=args.log, level=logging.INFO, format="(%(asctime)s) %(levelname)s: %(message)s")
  41. if args.auth == "":
  42. logger.error("Must provide a path to an auth file.")
  43. exit(1)
  44. email, password, hostnames = parse_auth()
  45. while True:
  46. dyfi_update(email, password, hostnames)
  47. logger.info(f"Sleeping for {SLEEP_TIME_SEC} seconds")
  48. sleep(SLEEP_TIME_SEC)