2
2
# -*- encoding: utf-8; py-indent-offset: 4 -*-
3
3
## MIT License
4
4
##
5
- ## Copyright (c) 2021 Bash Club
5
+ ## Copyright (c) 2024 Bash Club
6
6
##
7
7
## Permission is hereby granted, free of charge, to any person obtaining a copy
8
8
## of this software and associated documentation files (the "Software"), to deal
23
23
## SOFTWARE.
24
24
25
25
###
26
- __VERSION__ = 0.88
26
+ __VERSION__ = 2.01
27
27
28
28
import sys
29
29
import socket
@@ -44,117 +44,130 @@ except ImportError:
44
44
UNIFI_DEVICE_TABLE = {
45
45
'BZ2' : 'UAP' ,
46
46
'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' ,
47
53
'U2HSR' : 'UAP-Outdoor+' ,
48
54
'U2IW' : 'UAP-IW' ,
49
- 'U2L48' : 'UAP-AC- LR' ,
50
- 'U2Lv2' : 'UAP-AC-LR ' ,
55
+ 'U2L48' : 'UAP-LR' ,
56
+ 'U2Lv2' : 'UAP-LRv2 ' ,
51
57
'U2M' : 'UAP-Mini' ,
52
58
'U2O' : 'UAP-Outdoor' ,
53
- 'U2S48' : 'UAP-AC ' ,
54
- 'U2Sv2' : 'UAP-AC ' ,
59
+ 'U2S48' : 'UAP' ,
60
+ 'U2Sv2' : 'UAPv2 ' ,
55
61
'U5O' : 'UAP-Outdoor5' ,
62
+ 'U6ENT' : 'U6-Enterprise' ,
63
+ 'U6EXT' : 'U6-Extender' ,
64
+ 'U6IW' : 'U6-IW' ,
65
+ 'U6M' : 'U6-Mesh' ,
56
66
'U7E' : 'UAP-AC' ,
57
67
'U7EDU' : 'UAP-AC-EDU' ,
58
68
'U7Ev2' : 'UAP-AC' ,
59
69
'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' ,
76
70
'U7IW' : 'UAP-AC-IW' ,
77
71
'U7IWP' : 'UAP-AC-IW-Pro' ,
78
- 'U7MP' : 'UAP-AC-M-Pro' ,
79
72
'U7LR' : 'UAP-AC-LR' ,
80
73
'U7LT' : 'UAP-AC-Lite' ,
81
- 'U7O' : 'UAP-AC-Outdoor' ,
82
- 'U7P' : 'UAP-Pro' ,
74
+ 'U7MP' : 'UAP-AC-M-Pro' ,
83
75
'U7MSH' : 'UAP-AC-M' ,
76
+ 'U7NHD' : 'UAP-nanoHD' ,
77
+ 'U7O' : 'UAP-AC-Outdoor' ,
78
+ 'U7P' : 'UAP-AC-Pro' ,
84
79
'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' ,
86
102
'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' ,
95
126
'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' ,
100
128
'US24P250' : 'US-24-250W' ,
101
- 'US24PL2' : 'US-L2-24-PoE' ,
102
129
'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' ,
105
133
'US48' : 'US-48-G1' ,
106
- 'US48PRO' : 'USW-Pro-48-PoE' ,
107
- 'US48PRO2' : 'USW-Pro-48' ,
108
134
'US48P500' : 'US-48-500W' ,
109
- 'US48PL2' : 'US-L2-48-PoE' ,
110
135
'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' ,
113
142
'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' ,
116
149
'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' ,
123
153
'USL16LP' : 'USW-Lite-16-PoE' ,
154
+ 'USL16P' : 'USW-16-PoE' ,
124
155
'USL24' : 'USW-24-G2' ,
125
- 'USL48' : 'USW-48-G2' ,
126
156
'USL24P' : 'USW-24-PoE' ,
157
+ 'USL48' : 'USW-48-G2' ,
127
158
'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' ,
154
164
'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'
158
171
}
159
172
160
173
try :
@@ -291,7 +304,7 @@ class unifi_device(unifi_object):
291
304
_k = _k .replace ("-" ,"_" )
292
305
setattr (self ,_k ,_v )
293
306
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" ) :
295
308
## change ip to local ip
296
309
self .wan_ip = self .ip
297
310
self .ip = self .connect_request_ip
@@ -552,7 +565,11 @@ class unifi_controller_api(object):
552
565
553
566
def check_unifi_os (self ):
554
567
_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 = []
556
573
557
574
def get_sysinfo (self ):
558
575
return self .get_data ("/stat/sysinfo" )
@@ -586,14 +603,21 @@ class unifi_controller_api(object):
586
603
587
604
def get_data (self ,path ,site = "default" ,method = "GET" ,** kwargs ):
588
605
_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
592
614
raise unifi_api_exception (_meta .get ("msg" ,_json .get ("errors" ,repr (_json ))))
593
615
594
616
def request (self ,method ,url = None ,path = None ,site = None ,json = None ,** kwargs ):
595
617
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 :
597
621
url = f"{ self .url } /proxy/network/api"
598
622
else :
599
623
url = f"{ self .url } /api"
@@ -635,19 +659,21 @@ if __name__ == '__main__':
635
659
parser .add_argument ("host" ,type = str ,
636
660
help = """Host name or IP address of Unifi Controller""" )
637
661
args = parser .parse_args ()
638
-
639
662
try :
640
663
_api = unifi_controller_api (** args .__dict__ )
641
664
except socket .error as e :
642
665
pprint (e )
643
666
sys .exit (1 )
644
667
645
668
if _api .is_unifios :
646
-
647
669
labels = {"cmk/os_family" : "UnifiOS" }
648
- print ("<<<labels:sep(0)>>>"
670
+ print ("<<<labels:sep(0)>>>" )
649
671
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 )
651
677
##pprint(_api.get_data("/stat/rogueap?within=4"))
652
678
##pprint(_api.get_data("/rest/user",site="default",method="GET"))
653
679
##pprint(_api.get_data("/stat/sta",site="default",method="GET"))
0 commit comments