-
Notifications
You must be signed in to change notification settings - Fork 0
/
fr-stats.py
77 lines (70 loc) · 2.49 KB
/
fr-stats.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/env python3
import logging
import json
import re, os
import subprocess as sp
import datetime as dt
from logging.handlers import SysLogHandler
import tempfile
import time
import socket
#from vyos.util import chown
usage = """
Get FreeRADIUS stats per client
"""
# Read and return array with radius clients
def get_clientlist():
command = 'radmin -e \"show client list\"'
client_list = sp.run(command,shell=True,stdout=sp.PIPE).stdout.decode('utf-8').split()
return client_list
# Read and return client config
def get_clientcfg(client):
client_cfg = {}
command = 'radmin -e \"show client config '+client+'\"'
output = sp.run(command,shell=True,stdout=sp.PIPE).stdout.decode('utf-8').replace(' ','').split('\n')
for item in output:
item = re.sub('[\t{}]', '',item)
item = re.split('[,=]',item)
if len(item) > 1:
client_cfg[item[0]] = item[1]
return client_cfg
def get_authstats(client):
cli_stats = {}
command = 'radmin -e \"stats client auth '+client+'\"'
output = sp.run(command,shell=True,stdout=sp.PIPE).stdout.decode('utf-8').replace(' ','').split('\n')
for item in output:
item = item.split()
if len(item) > 1:
cli_stats[item[0]] = item[1]
return cli_stats
def main():
hostname=socket.gethostname()
client_dict={}
for client in get_clientlist():
client_dict[client] = get_clientcfg(client)
for client in client_dict:
client_dict[client]['stats'] = get_authstats(client)
# print(json.dumps(client_dict,indent=2))
for client in client_dict:
tags = 'freeradius_stats,hostname=\"%s\",client=\"%s\"' % (hostname,client)
try:
if client_dict[client]['ipaddr']:
tags = tags + ',ipaddr=\"%s\"' % client_dict[client]['ipaddr']
except KeyError:
if client_dict[client]['ipv6addr']:
tags = tags + ',ipv6addr=\"%s\"' % client_dict[client]['ipv6addr']
try:
if client_dict[client]['shortname']:
tags = tags + ',shortname=\"%s\"' % client_dict[client]['shortname']
except KeyError:
pass
values = ""
for parm in client_dict[client]['stats']:
if parm == 'last_packet':
tags = tags + "," + parm + "=" + client_dict[client]['stats'][parm] + " "
else:
values = values + parm + "=" + client_dict[client]['stats'][parm] + ","
ts=int(time.time())
print(tags + values[:-1].replace('.','_') + " " + str(ts) + "000000000")
if __name__ == "__main__":
main()