11import json
2+ from datetime import datetime , timedelta
23
34import click
45from tabulate import tabulate
56
7+ from alertaclient .utils import origin
8+
69
710@click .command ('keys' , short_help = 'List API keys' )
11+ @click .option ('--alert' , is_flag = True , help = 'Alert on expiring and expired keys' )
12+ @click .option ('--maxage' , metavar = 'DAYS' , default = 7 , type = int , help = 'Max remaining days before alerting' )
13+ @click .option ('--timeout' , metavar = 'SECONDS' , default = 86400 , type = int , help = 'Seconds before expired key alerts will be expired' )
14+ @click .option ('--severity' , '-s' , metavar = 'SEVERITY' , default = 'warning' , help = 'Severity for expiring and expired alerts' )
815@click .pass_obj
9- def cli (obj ):
16+ def cli (obj , alert , maxage , severity , timeout ):
1017 """List API keys."""
1118 client = obj ['client' ]
1219
@@ -20,3 +27,62 @@ def cli(obj):
2027 'expireTime' : 'EXPIRES' , 'count' : 'COUNT' , 'lastUsedTime' : 'LAST USED' , 'customer' : 'CUSTOMER'
2128 }
2229 click .echo (tabulate ([k .tabular (timezone ) for k in client .get_keys ()], headers = headers , tablefmt = obj ['output' ]))
30+
31+ if alert :
32+ keys = r ['keys' ]
33+ service = ['Alerta' ]
34+ group = 'System'
35+ environment = 'Production'
36+ with click .progressbar (keys , label = f'Analysing { len (keys )} keys' ) as bar :
37+ for b in bar :
38+ if b ['status' ] == 'expired' :
39+ client .send_alert (
40+ resource = b ['id' ],
41+ event = 'ApiKeyExpired' ,
42+ environment = environment ,
43+ severity = severity ,
44+ correlate = ['ApiKeyExpired' , 'ApiKeyExpiring' , 'ApiKeyOK' ],
45+ service = service ,
46+ group = group ,
47+ value = 'Expired' ,
48+ text = f"Key expired on { b ['expireTime' ]} " ,
49+ origin = origin (),
50+ type = 'apiKeyAlert' ,
51+ timeout = timeout ,
52+ customer = b ['customer' ]
53+ )
54+ elif b ['status' ] == 'active' :
55+ expiration = datetime .fromisoformat (b ['expireTime' ].split ('.' )[0 ])
56+ remaining_validity = expiration - datetime .now ()
57+ if remaining_validity < timedelta (days = maxage ):
58+ client .send_alert (
59+ resource = b ['id' ],
60+ event = 'ApiKeyExpiring' ,
61+ environment = environment ,
62+ severity = severity ,
63+ correlate = ['ApiKeyExpired' , 'ApiKeyExpiring' , 'ApiKeyOK' ],
64+ service = service ,
65+ group = group ,
66+ value = str (remaining_validity ),
67+ text = f"Key is active and expires on { b ['expireTime' ]} " ,
68+ origin = origin (),
69+ type = 'apiKeyAlert' ,
70+ timeout = timeout ,
71+ customer = b ['customer' ]
72+ )
73+ else :
74+ client .send_alert (
75+ resource = b ['id' ],
76+ event = 'ApiKeyOK' ,
77+ environment = environment ,
78+ severity = 'ok' ,
79+ correlate = ['ApiKeyExpired' , 'ApiKeyExpiring' , 'ApiKeyOK' ],
80+ service = service ,
81+ group = group ,
82+ value = str (remaining_validity ),
83+ text = f"Key is active and expires on { b ['expireTime' ]} " ,
84+ origin = origin (),
85+ type = 'apiKeyAlert' ,
86+ timeout = timeout ,
87+ customer = b ['customer' ]
88+ )
0 commit comments