master
py 106 lines 3.16 KB
Raw
1 #!/usr/bin/env python3
2 """Check if a given distro is going to be EOL soon.
3
4 This queries the public API of https://endoflife.date to fetch EOL dates.
5
6 'soon' is defined by LEAD_DAYS, currently 30 days."""
7
8 import datetime
9 import json
10 import sys
11 import urllib.request
12
13 URL_BASE = 'https://endoflife.date/api'
14 NOW = datetime.date.today()
15 LEAD_DAYS = datetime.timedelta(days=30)
16
17 DISTRO = sys.argv[1]
18 RELEASE = sys.argv[2]
19 LTS = sys.argv[3]
20
21 EXIT_NOT_IMPENDING = 0
22 EXIT_IMPENDING = 1
23 EXIT_NO_DATA = 2
24 EXIT_FAILURE = 3
25
26 try:
27 with urllib.request.urlopen(f'{URL_BASE}/{DISTRO}/{RELEASE}.json') as response:
28 match response.status:
29 case 200:
30 data = json.load(response)
31 case _:
32 print(
33 f'Failed to retrieve data for {DISTRO} {RELEASE} ' +
34 f'(status: {response.status}).',
35 file=sys.stderr
36 )
37 sys.exit(EXIT_FAILURE)
38 except urllib.error.HTTPError as e:
39 match e.code:
40 case 404:
41 print(f'No data available for {DISTRO} {RELEASE}.', file=sys.stderr)
42 sys.exit(EXIT_NO_DATA)
43 case _:
44 print(
45 f'Failed to retrieve data for {DISTRO} {RELEASE} ' +
46 f'(status: {e.code}).',
47 file=sys.stderr
48 )
49 sys.exit(EXIT_FAILURE)
50
51 if LTS == '1' and 'extendedSupport' in data:
52 ref = 'extendedSupport'
53 else:
54 ref = 'eol'
55 LTS = False
56
57 # Handle boolean values for eol/extendedSupport fields
58 eol_value = data[ref]
59
60 # Check if the value is a boolean
61 if isinstance(eol_value, bool):
62 if ref == 'eol':
63 if not eol_value:
64 # False for eol means no EOL date set (still actively supported)
65 sys.exit(EXIT_NOT_IMPENDING)
66 else:
67 # True for eol would mean EOL has occurred (unusual, but handle it)
68 # Without a date, we can't determine if it's within LEAD_DAYS
69 # Conservative approach: treat as impending
70 print(f'{DISTRO} {RELEASE} has reached EOL (boolean true)', file=sys.stderr)
71 sys.exit(EXIT_IMPENDING)
72 elif ref == 'extendedSupport':
73 if not eol_value:
74 # False for extendedSupport when LTS was requested is unexpected
75 print(
76 f'Unexpected value for {DISTRO} {RELEASE} extendedSupport: false ' +
77 '(LTS was requested but extended support is not available)',
78 file=sys.stderr
79 )
80 sys.exit(EXIT_FAILURE)
81 else:
82 # True for extendedSupport means LTS available but date not determined
83 # Can't calculate if impending without a date
84 sys.exit(EXIT_NOT_IMPENDING)
85
86 # If we get here, it should be a date string
87 try:
88 eol = datetime.date.fromisoformat(eol_value)
89 except (ValueError, TypeError):
90 print(
91 f'Invalid date format for {DISTRO} {RELEASE} {ref}: {eol_value}',
92 file=sys.stderr
93 )
94 sys.exit(EXIT_FAILURE)
95
96 offset = abs(eol - NOW)
97
98 if offset <= LEAD_DAYS:
99 if LTS:
100 print(data['extendedSupport'])
101 else:
102 print(data['eol'])
103
104 sys.exit(EXIT_IMPENDING)
105 else:
106 sys.exit(EXIT_NOT_IMPENDING)