platform-impending-eol.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #!/usr/bin/env python3
  2. '''Check if a given distro is going to be EOL soon.
  3. This queries the public API of https://endoflife.date to fetch EOL dates.
  4. ‘soon’ is defined by LEAD_DAYS, currently 30 days.'''
  5. import datetime
  6. import json
  7. import sys
  8. import urllib.request
  9. URL_BASE = 'https://endoflife.date/api'
  10. NOW = datetime.date.today()
  11. LEAD_DAYS = datetime.timedelta(days=30)
  12. DISTRO = sys.argv[1]
  13. RELEASE = sys.argv[2]
  14. EXIT_NOT_IMPENDING = 0
  15. EXIT_IMPENDING = 1
  16. EXIT_NO_DATA = 2
  17. EXIT_FAILURE = 3
  18. try:
  19. with urllib.request.urlopen(f'{ URL_BASE }/{ DISTRO }/{ RELEASE }.json') as response:
  20. match response.status:
  21. case 200:
  22. data = json.load(response)
  23. case _:
  24. print(
  25. f'Failed to retrieve data for { DISTRO } { RELEASE } ' +
  26. f'(status: { response.status }).',
  27. file=sys.stderr
  28. )
  29. sys.exit(EXIT_FAILURE)
  30. except urllib.error.HTTPError as e:
  31. match e.code:
  32. case 404:
  33. print(f'No data available for { DISTRO } { RELEASE }.', file=sys.stderr)
  34. sys.exit(EXIT_NO_DATA)
  35. case _:
  36. print(
  37. f'Failed to retrieve data for { DISTRO } { RELEASE } ' +
  38. f'(status: { e.code }).',
  39. file=sys.stderr
  40. )
  41. sys.exit(EXIT_FAILURE)
  42. eol = datetime.date.fromisoformat(data['eol'])
  43. offset = abs(eol - NOW)
  44. if offset <= LEAD_DAYS:
  45. print(data['eol'])
  46. sys.exit(EXIT_IMPENDING)
  47. else:
  48. sys.exit(EXIT_NOT_IMPENDING)