Skip to content

Commit 6e390dc

Browse files
Update agent_unifi_controller
1 parent 64895fa commit 6e390dc

File tree

1 file changed

+120
-94
lines changed

1 file changed

+120
-94
lines changed

share/check_mk/agents/special/agent_unifi_controller

Lines changed: 120 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# -*- encoding: utf-8; py-indent-offset: 4 -*-
33
## MIT License
44
##
5-
## Copyright (c) 2021 Bash Club
5+
## Copyright (c) 2024 Bash Club
66
##
77
## Permission is hereby granted, free of charge, to any person obtaining a copy
88
## of this software and associated documentation files (the "Software"), to deal
@@ -23,7 +23,7 @@
2323
## SOFTWARE.
2424

2525
###
26-
__VERSION__ = 0.88
26+
__VERSION__ = 2.01
2727

2828
import sys
2929
import socket
@@ -44,117 +44,130 @@ except ImportError:
4444
UNIFI_DEVICE_TABLE = {
4545
'BZ2' : 'UAP',
4646
'BZ2LR' : 'UAP-LR',
47+
'S216150' : 'US-16-150W',
48+
'S224250' : 'US-24-250W',
49+
'S224500' : 'US-24-500W',
50+
'S248500' : 'US-48-500W',
51+
'S248750' : 'US-48-750W',
52+
'S28150' : 'US-8-150W',
4753
'U2HSR' : 'UAP-Outdoor+',
4854
'U2IW' : 'UAP-IW',
49-
'U2L48' : 'UAP-AC-LR',
50-
'U2Lv2' : 'UAP-AC-LR',
55+
'U2L48' : 'UAP-LR',
56+
'U2Lv2' : 'UAP-LRv2',
5157
'U2M' : 'UAP-Mini',
5258
'U2O' : 'UAP-Outdoor',
53-
'U2S48' : 'UAP-AC',
54-
'U2Sv2' : 'UAP-AC',
59+
'U2S48' : 'UAP',
60+
'U2Sv2' : 'UAPv2',
5561
'U5O' : 'UAP-Outdoor5',
62+
'U6ENT' : 'U6-Enterprise',
63+
'U6EXT' : 'U6-Extender',
64+
'U6IW' : 'U6-IW',
65+
'U6M' : 'U6-Mesh',
5666
'U7E' : 'UAP-AC',
5767
'U7EDU' : 'UAP-AC-EDU',
5868
'U7Ev2' : 'UAP-AC',
5969
'U7HD' : 'UAP-AC-HD',
60-
'U7SHD' : 'UAP-AC-SHD',
61-
'U7NHD' : 'UAP-nanoHD',
62-
'UFLHD' : 'UAP-FlexHD',
63-
'UHDIW' : 'UAP-IW-HD',
64-
'UAIW6' : 'U6-IW',
65-
'UAE6' : 'U6-Extender',
66-
'UAL6' : 'U6-Lite',
67-
'UAM6' : 'U6-Mesh',
68-
'UALR6' : 'U6-LR-EA',
69-
'UAP6' : 'U6-LR',
70-
'UALR6v2' : 'U6-LR',
71-
'UALR6v3' : 'U6-LR',
72-
'UCXG' : 'UAP-XG',
73-
'UXSDM' : 'UWB-XG',
74-
'UXBSDM' : 'UWB-XG-BK',
75-
'UCMSH' : 'UAP-XG-Mesh',
7670
'U7IW' : 'UAP-AC-IW',
7771
'U7IWP' : 'UAP-AC-IW-Pro',
78-
'U7MP' : 'UAP-AC-M-Pro',
7972
'U7LR' : 'UAP-AC-LR',
8073
'U7LT' : 'UAP-AC-Lite',
81-
'U7O' : 'UAP-AC-Outdoor',
82-
'U7P' : 'UAP-Pro',
74+
'U7MP' : 'UAP-AC-M-Pro',
8375
'U7MSH' : 'UAP-AC-M',
76+
'U7NHD' : 'UAP-nanoHD',
77+
'U7O' : 'UAP-AC-Outdoor',
78+
'U7P' : 'UAP-AC-Pro',
8479
'U7PG2' : 'UAP-AC-Pro',
85-
'p2N' : 'PICOM2HP',
80+
'U7SHD' : 'UAP-AC-SHD',
81+
'UAE6' : 'U6-Extender-EA',
82+
'UAIW6' : 'U6-IW-EA',
83+
'UAL6' : 'U6-Lite',
84+
'UALR6' : 'U6-LR-EA',
85+
'UALR6v2' : 'U6-LR',
86+
'UALR6v3' : 'U6-LR',
87+
'UAM6' : 'U6-Mesh-EA',
88+
'UAP6' : 'U6-LR',
89+
'UAP6MP' : 'U6-Pro',
90+
'UASXG' : 'UAS-XG',
91+
'UBB' : 'UBB',
92+
'UBBXG' : 'UBB-XG',
93+
'UCK' : 'UCK',
94+
'UCK-v2' : 'UCK',
95+
'UCK-v3' : 'UCK',
96+
'UCKG2' : 'UCK-G2',
97+
'UCKP' : 'UCK-G2-Plus',
98+
'UCMSH' : 'UAP-XG-Mesh',
99+
'UCXG' : 'UAP-XG',
100+
'UDC48X6' : 'USW-Leaf',
101+
'UDM' : 'UDM',
86102
'UDMB' : 'UAP-BeaconHD',
87-
'USF5P' : 'USW-Flex',
88-
'US8' : 'US-8',
89-
'US8P60' : 'US-8-60W',
90-
'US8P150' : 'US-8-150W',
91-
'S28150' : 'US-8-150W',
92-
'USC8' : 'US-8',
93-
'USC8P60' : 'US-8-60W',
94-
'USC8P150' : 'US-8-150W',
103+
'UDMPRO' : 'UDM-Pro',
104+
'UDMPROSE' : 'UDM-SE',
105+
'UDR' : 'UDR',
106+
'UDW' : 'UDW',
107+
'UDWPRO' : 'UDWPRO',
108+
'UFLHD' : 'UAP-FlexHD',
109+
'UGW3' : 'USG-3P',
110+
'UGW4' : 'USG-Pro-4',
111+
'UGWHD4' : 'USG',
112+
'UGWXG' : 'USG-XG-8',
113+
'UHDIW' : 'UAP-IW-HD',
114+
'ULTE' : 'U-LTE',
115+
'ULTEPEU' : 'U-LTE-Pro',
116+
'ULTEPUS' : 'U-LTE-Pro',
117+
'UP1' : 'USP-Plug',
118+
'UP4' : 'UVP-X',
119+
'UP5' : 'UVP',
120+
'UP5c' : 'UVP',
121+
'UP5t' : 'UVP-Pro',
122+
'UP5tc' : 'UVP-Pro',
123+
'UP6' : 'USP-Strip',
124+
'UP7' : 'UVP-Executive',
125+
'UP7c' : 'UVP-Executive',
95126
'US16P150' : 'US-16-150W',
96-
'S216150' : 'US-16-150W',
97-
'US24' : 'US-24-G1',
98-
'US24PRO' : 'USW-Pro-24-PoE',
99-
'US24PRO2' : 'USW-Pro-24',
127+
'US24' : 'USW-24-G1',
100128
'US24P250' : 'US-24-250W',
101-
'US24PL2' : 'US-L2-24-PoE',
102129
'US24P500' : 'US-24-500W',
103-
'S224250' : 'US-24-250W',
104-
'S224500' : 'US-24-500W',
130+
'US24PL2' : 'US-L2-24-PoE',
131+
'US24PRO' : 'USW-Pro-24-PoE',
132+
'US24PRO2' : 'USW-Pro-24',
105133
'US48' : 'US-48-G1',
106-
'US48PRO' : 'USW-Pro-48-PoE',
107-
'US48PRO2' : 'USW-Pro-48',
108134
'US48P500' : 'US-48-500W',
109-
'US48PL2' : 'US-L2-48-PoE',
110135
'US48P750' : 'US-48-750W',
111-
'S248500' : 'US-48-500W',
112-
'S248750' : 'US-48-750W',
136+
'US48PL2' : 'US-L2-48-PoE',
137+
'US48PRO' : 'USW-Pro-48-PoE',
138+
'US48PRO2' : 'USW-Pro-48',
139+
'US624P' : 'USW-Enterprise-24-PoE',
140+
'US648P' : 'USW-Enterprise-48-PoE',
141+
'US68P' : 'USW-Enterprise-8-PoE',
113142
'US6XG150' : 'US-XG-6PoE',
114-
'USMINI' : 'USW-Flex-Mini',
115-
'USXG' : 'US-16-XG',
143+
'US8' : 'US-8',
144+
'US8P150' : 'US-8-150W',
145+
'US8P60' : 'US-8-60W',
146+
'USAGGPRO' : 'USW-Pro-Aggregation',
147+
'USC8' : 'US-8',
148+
'USC8P150' : 'US-8-150W',
116149
'USC8P450' : 'USW-Industrial',
117-
'UDC48X6' : 'USW-Leaf',
118-
'USL8A' : 'UniFi Switch Aggregation',
119-
'USAGGPRO' : 'UniFi Switch Aggregation Pro',
120-
'USL8LP' : 'USW-Lite-8-PoE',
121-
'USL8MP' : 'USW-Mission-Critical',
122-
'USL16P' : 'USW-16-PoE',
150+
'USC8P60' : 'US-8-60W',
151+
'USF5P' : 'USW-Flex',
152+
'USFXG' : 'USW-Flex-XG',
123153
'USL16LP' : 'USW-Lite-16-PoE',
154+
'USL16P' : 'USW-16-PoE',
124155
'USL24' : 'USW-24-G2',
125-
'USL48' : 'USW-48-G2',
126156
'USL24P' : 'USW-24-PoE',
157+
'USL48' : 'USW-48-G2',
127158
'USL48P' : 'USW-48-PoE',
128-
'UGW3' : 'USG-3P',
129-
'UGW4' : 'USG-Pro-4',
130-
'UGWHD4' : 'USG',
131-
'UGWXG' : 'USG-XG-8',
132-
'UDM' : 'UDM',
133-
'UDMSE' : 'UDM-SE',
134-
'UDMPRO' : 'UDM-Pro',
135-
'UP4' : 'UVP-X',
136-
'UP5' : 'UVP',
137-
'UP5t' : 'UVP-Pro',
138-
'UP7' : 'UVP-Executive',
139-
'UP5c' : 'UVP',
140-
'UP5tc' : 'UVP-Pro',
141-
'UP7c' : 'UVP-Executive',
142-
'UCK' : 'UCK',
143-
'UCK-v2' : 'UCK',
144-
'UCK-v3' : 'UCK',
145-
'UCKG2' : 'UCK-G2',
146-
'UCKP' : 'UCK-G2-Plus',
147-
'UASXG' : 'UAS-XG',
148-
'ULTE' : 'U-LTE',
149-
'ULTEPUS' : 'U-LTE-Pro',
150-
'ULTEPEU' : 'U-LTE-Pro',
151-
'UP1' : 'USP-Plug',
152-
'UP6' : 'USP-Strip',
153-
'USPPDUP' : 'USP - Power Distribution Unit Pro',
159+
'USL8A' : 'USW-Aggregation',
160+
'USL8LP' : 'USW-Lite-8-PoE',
161+
'USL8MP' : 'USW-Mission-Critical',
162+
'USMINI' : 'USW-Flex-Mini',
163+
'USPPDUP' : 'USP-PDU-Pro',
154164
'USPRPS' : 'USP-RPS',
155-
'US624P' : 'UniFi6 Switch 24',
156-
'UBB' : 'UBB',
157-
'UXGPRO' : 'UniFi NeXt-Gen Gateway PRO'
165+
'USXG' : 'US-16-XG',
166+
'USXG24' : 'USW-EnterpriseXG-24',
167+
'UXBSDM' : 'UWB-XG-BK',
168+
'UXGPRO' : 'UXG-Pro',
169+
'UXSDM' : 'UWB-XG',
170+
'p2N' : 'PICOM2HP'
158171
}
159172

160173
try:
@@ -291,7 +304,7 @@ class unifi_device(unifi_object):
291304
_k = _k.replace("-","_")
292305
setattr(self,_k,_v)
293306
self.model_name = UNIFI_DEVICE_TABLE.get(self.model)
294-
if self.type in ("ugw","udm"):
307+
if self.type in ("ugw","udm") and hasattr(self,"connect_request_ip"):
295308
## change ip to local ip
296309
self.wan_ip = self.ip
297310
self.ip = self.connect_request_ip
@@ -552,7 +565,11 @@ class unifi_controller_api(object):
552565

553566
def check_unifi_os(self):
554567
_response = self.request("GET",url=self.url,allow_redirects=False)
555-
self.is_unifios= _response.status_code == 200 and _response.headers.get("x-csrf-token")
568+
_osid = re.findall('UNIFI_OS_MANIFEST.*?"id":"(\w+)"',_response.text)
569+
if _osid and _osid[0] in ("UCKP","UNVR","UDMPRO","UDMENT","UDM","UDR"):
570+
self.is_unifios = _osid[0]
571+
else:
572+
self.is_unifios = []
556573

557574
def get_sysinfo(self):
558575
return self.get_data("/stat/sysinfo")
@@ -586,14 +603,21 @@ class unifi_controller_api(object):
586603

587604
def get_data(self,path,site="default",method="GET",**kwargs):
588605
_json = self.request(method=method,path=path,site=site,**kwargs).json()
589-
_meta = _json.get("meta",{})
590-
if _meta.get("rc") == "ok":
591-
return _json.get("data",[])
606+
if type(_json) == dict:
607+
_meta = _json.get("meta",{})
608+
if _meta.get("rc") == "ok":
609+
return _json.get("data",[])
610+
if _json.get("modelKey") == "nvr":
611+
return _json
612+
if type(_json) == list:
613+
return _json
592614
raise unifi_api_exception(_meta.get("msg",_json.get("errors",repr(_json))))
593615

594616
def request(self,method,url=None,path=None,site=None,json=None,**kwargs):
595617
if not url:
596-
if self.is_unifios:
618+
if self.is_unifios == "UNVR":
619+
url = f"{self.url}/proxy/protect/api"
620+
elif self.is_unifios:
597621
url = f"{self.url}/proxy/network/api"
598622
else:
599623
url = f"{self.url}/api"
@@ -635,19 +659,21 @@ if __name__ == '__main__':
635659
parser.add_argument("host",type=str,
636660
help="""Host name or IP address of Unifi Controller""")
637661
args = parser.parse_args()
638-
639662
try:
640663
_api = unifi_controller_api(**args.__dict__)
641664
except socket.error as e:
642665
pprint(e)
643666
sys.exit(1)
644667

645668
if _api.is_unifios:
646-
647669
labels = {"cmk/os_family": "UnifiOS"}
648-
print("<<<labels:sep(0)>>>"
670+
print("<<<labels:sep(0)>>>")
649671
print(json.dumps(labels))
650-
672+
if _api.is_unifios == "UNVR":
673+
pprint(_api.get_data("/sensors",site=None))
674+
pprint(_api.get_data("/cameras",site=None))
675+
pprint(_api.get_data("/nvr",site=None))
676+
sys.exit(0)
651677
##pprint(_api.get_data("/stat/rogueap?within=4"))
652678
##pprint(_api.get_data("/rest/user",site="default",method="GET"))
653679
##pprint(_api.get_data("/stat/sta",site="default",method="GET"))

0 commit comments

Comments
 (0)