github.com/dim13/unifi@v0.0.0-20230308161331-9b04946f5e93/event.go (about) 1 // Copyright (c) 2014 The unifi Authors. All rights reserved. 2 // Use of this source code is governed by ISC-style license 3 // that can be found in the LICENSE file. 4 5 package unifi 6 7 import ( 8 "encoding/json" 9 "fmt" 10 "time" 11 ) 12 13 type EventFilter struct { 14 Limit int `json:"_limit"` 15 Start int `json:"_start"` 16 Within int `json:"within"` 17 } 18 19 type RawEvent struct { 20 Data json.RawMessage 21 Key string 22 } 23 24 type BasicEvent struct { 25 Archived *bool `json:"archived,omitempty"` // Alarm field 26 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 27 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field ID string `json:"_id"` 28 ID string `json:"_id"` 29 Datetime time.Time 30 Key string `json:"key"` 31 Message string `json:"msg"` 32 Time int64 `json:"time"` 33 } 34 35 type EVT_AD_Login struct { 36 Archived *bool `json:"archived,omitempty"` // Alarm field 37 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 38 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 39 ID string `json:"_id"` 40 Admin string `json:"admin"` 41 Datetime time.Time `json:"datetime"` 42 IP string `json:"ip"` 43 IsAdmin bool `json:"is_admin"` 44 Key string `json:"key"` 45 Msg string `json:"msg"` 46 SiteID string `json:"site_id"` 47 Subsystem string `json:"subsystem"` 48 Time int64 `json:"time"` 49 } 50 51 type EVT_AP_Adopted struct { 52 Archived *bool `json:"archived,omitempty"` // Alarm field 53 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 54 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 55 ID string `json:"_id"` 56 Admin string `json:"admin"` 57 Ap string `json:"ap"` 58 ApName string `json:"ap_name"` 59 Datetime time.Time `json:"datetime"` 60 IsAdmin bool `json:"is_admin"` 61 Key string `json:"key"` 62 Msg string `json:"msg"` 63 SiteID string `json:"site_id"` 64 Subsystem string `json:"subsystem"` 65 Time int64 `json:"time"` 66 } 67 68 type EVT_AP_Connected struct { 69 Archived *bool `json:"archived,omitempty"` // Alarm field 70 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 71 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 72 ID string `json:"_id"` 73 Ap string `json:"ap"` 74 ApName string `json:"ap_name"` 75 Datetime time.Time `json:"datetime"` 76 Key string `json:"key"` 77 Msg string `json:"msg"` 78 SiteID string `json:"site_id"` 79 Subsystem string `json:"subsystem"` 80 Time int64 `json:"time"` 81 } 82 83 type EVT_AP_DetectRogueAP struct { 84 Archived *bool `json:"archived,omitempty"` // Alarm field 85 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 86 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 87 ID string `json:"_id"` 88 Datetime time.Time `json:"datetime"` 89 Essid string `json:"essid"` 90 Key string `json:"key"` 91 Mac string `json:"mac"` 92 Msg string `json:"msg"` 93 SiteID string `json:"site_id"` 94 Subsystem string `json:"subsystem"` 95 Time int64 `json:"time"` 96 } 97 98 type EVT_AP_DiscoveredPending struct { 99 Archived *bool `json:"archived,omitempty"` // Alarm field 100 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 101 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 102 ID string `json:"_id"` 103 Ap string `json:"ap"` 104 ApName string `json:"ap_name"` 105 Datetime time.Time `json:"datetime"` 106 Key string `json:"key"` 107 Msg string `json:"msg"` 108 SiteID string `json:"site_id"` 109 Subsystem string `json:"subsystem"` 110 Time int64 `json:"time"` 111 } 112 113 type EVT_AP_Isolated struct { 114 Archived *bool `json:"archived,omitempty"` // Alarm field 115 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 116 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 117 ID string `json:"_id"` 118 Ap string `json:"ap"` 119 Datetime time.Time `json:"datetime"` 120 Key string `json:"key"` 121 Msg string `json:"msg"` 122 SiteID string `json:"site_id"` 123 Subsystem string `json:"subsystem"` 124 Time int64 `json:"time"` 125 } 126 127 type EVT_AP_Lost_Contact struct { 128 Archived *bool `json:"archived,omitempty"` // Alarm field 129 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 130 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 131 ID string `json:"_id"` 132 Ap string `json:"ap"` 133 ApName string `json:"ap_name"` 134 Datetime time.Time `json:"datetime"` 135 Key string `json:"key"` 136 Msg string `json:"msg"` 137 SiteID string `json:"site_id"` 138 Subsystem string `json:"subsystem"` 139 Time int64 `json:"time"` 140 } 141 142 type EVT_AP_PossibleInterference struct { 143 Archived *bool `json:"archived,omitempty"` // Alarm field 144 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 145 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 146 ID string `json:"_id"` 147 Ap string `json:"ap"` 148 Channel string `json:"channel"` 149 Datetime time.Time `json:"datetime"` 150 Key string `json:"key"` 151 Msg string `json:"msg"` 152 Radio string `json:"radio"` 153 SiteID string `json:"site_id"` 154 Subsystem string `json:"subsystem"` 155 Time int64 `json:"time"` 156 } 157 158 type EVT_AP_Restarted struct { 159 Archived *bool `json:"archived,omitempty"` // Alarm field 160 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 161 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 162 ID string `json:"_id"` 163 Admin string `json:"admin"` 164 Ap string `json:"ap"` 165 ApName string `json:"ap_name"` 166 Datetime time.Time `json:"datetime"` 167 IsAdmin bool `json:"is_admin"` 168 Key string `json:"key"` 169 Msg string `json:"msg"` 170 SiteID string `json:"site_id"` 171 Subsystem string `json:"subsystem"` 172 Time int64 `json:"time"` 173 } 174 175 type EVT_AP_RestartedUnknown struct { 176 Archived *bool `json:"archived,omitempty"` // Alarm field 177 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 178 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 179 ID string `json:"_id"` 180 Ap string `json:"ap"` 181 ApName string `json:"ap_name"` 182 Datetime time.Time `json:"datetime"` 183 Duration int `json:"duration"` 184 Key string `json:"key"` 185 Msg string `json:"msg"` 186 NumSta int `json:"num_sta"` 187 SiteID string `json:"site_id"` 188 Subsystem string `json:"subsystem"` 189 Time int64 `json:"time"` 190 } 191 192 type EVT_AP_Upgraded struct { 193 Archived *bool `json:"archived,omitempty"` // Alarm field 194 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 195 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 196 ID string `json:"_id"` 197 Ap string `json:"ap"` 198 ApName string `json:"ap_name"` 199 Datetime time.Time `json:"datetime"` 200 Key string `json:"key"` 201 Msg string `json:"msg"` 202 SiteID string `json:"site_id"` 203 Subsystem string `json:"subsystem"` 204 Time int64 `json:"time"` 205 VersionFrom string `json:"version_from"` 206 VersionTo string `json:"version_to"` 207 } 208 209 type EVT_AP_UpgradeScheduled struct { 210 Archived *bool `json:"archived,omitempty"` // Alarm field 211 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 212 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 213 ID string `json:"_id"` 214 Admin string `json:"admin"` 215 Ap string `json:"ap"` 216 ApName string `json:"ap_name"` 217 Datetime time.Time `json:"datetime"` 218 IsAdmin bool `json:"is_admin"` 219 Key string `json:"key"` 220 Msg string `json:"msg"` 221 SiteID string `json:"site_id"` 222 Subsystem string `json:"subsystem"` 223 Time int64 `json:"time"` 224 } 225 226 type EVT_LU_Connected struct { 227 Archived *bool `json:"archived,omitempty"` // Alarm field 228 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 229 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 230 ID string `json:"_id"` 231 Datetime time.Time `json:"datetime"` 232 Key string `json:"key"` 233 Msg string `json:"msg"` 234 Network string `json:"network"` 235 SiteID string `json:"site_id"` 236 Subsystem string `json:"subsystem"` 237 Time int64 `json:"time"` 238 User string `json:"user"` 239 } 240 241 type EVT_LU_Disconnected struct { 242 Archived *bool `json:"archived,omitempty"` // Alarm field 243 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 244 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 245 ID string `json:"_id"` 246 Bytes int `json:"bytes"` 247 Datetime time.Time `json:"datetime"` 248 Duration int `json:"duration"` 249 Key string `json:"key"` 250 Msg string `json:"msg"` 251 Network string `json:"network"` 252 SiteID string `json:"site_id"` 253 Subsystem string `json:"subsystem"` 254 Time int64 `json:"time"` 255 User string `json:"user"` 256 } 257 258 type EVT_SW_Adopted struct { 259 Archived *bool `json:"archived,omitempty"` // Alarm field 260 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 261 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 262 ID string `json:"_id"` 263 Admin string `json:"admin"` 264 Datetime time.Time `json:"datetime"` 265 IsAdmin bool `json:"is_admin"` 266 Key string `json:"key"` 267 Msg string `json:"msg"` 268 SiteID string `json:"site_id"` 269 Subsystem string `json:"subsystem"` 270 Sw string `json:"sw"` 271 SwName string `json:"sw_name"` 272 Time int64 `json:"time"` 273 } 274 275 type EVT_SW_Connected struct { 276 Archived *bool `json:"archived,omitempty"` // Alarm field 277 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 278 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 279 ID string `json:"_id"` 280 Datetime time.Time `json:"datetime"` 281 Key string `json:"key"` 282 Msg string `json:"msg"` 283 SiteID string `json:"site_id"` 284 Subsystem string `json:"subsystem"` 285 Sw string `json:"sw"` 286 SwName string `json:"sw_name"` 287 Time int64 `json:"time"` 288 } 289 290 type EVT_SW_DiscoveredPending struct { 291 Archived *bool `json:"archived,omitempty"` // Alarm field 292 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 293 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 294 ID string `json:"_id"` 295 Datetime time.Time `json:"datetime"` 296 Key string `json:"key"` 297 Msg string `json:"msg"` 298 SiteID string `json:"site_id"` 299 Subsystem string `json:"subsystem"` 300 Sw string `json:"sw"` 301 SwName string `json:"sw_name"` 302 Time int64 `json:"time"` 303 } 304 305 type EVT_SW_Lost_Contact struct { 306 Archived *bool `json:"archived,omitempty"` // Alarm field 307 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 308 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 309 ID string `json:"_id"` 310 Datetime time.Time `json:"datetime"` 311 Key string `json:"key"` 312 Msg string `json:"msg"` 313 SiteID string `json:"site_id"` 314 Subsystem string `json:"subsystem"` 315 Sw string `json:"sw"` 316 SwName string `json:"sw_name"` 317 Time int64 `json:"time"` 318 } 319 320 // EVT_SW_PoeDisconnect controller version 5.8.21+ / USW firmware 3.9.27+ 321 type EVT_SW_PoeDisconnect struct { 322 Archived *bool `json:"archived,omitempty"` // Alarm field 323 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 324 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 325 ID string `json:"_id"` 326 Datetime time.Time `json:"datetime"` 327 Key string `json:"key"` 328 Msg string `json:"msg"` 329 Port int `json:"port"` 330 SiteID string `json:"site_id"` 331 Subsystem string `json:"subsystem"` 332 Sw string `json:"sw"` 333 SwName string `json:"sw_name"` 334 Time int64 `json:"time"` 335 } 336 337 type EVT_SW_RestartedUnknown struct { 338 Archived *bool `json:"archived,omitempty"` // Alarm field 339 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 340 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 341 ID string `json:"_id"` 342 Datetime time.Time `json:"datetime"` 343 Key string `json:"key"` 344 Msg string `json:"msg"` 345 SiteID string `json:"site_id"` 346 Subsystem string `json:"subsystem"` 347 Sw string `json:"sw"` 348 SwName string `json:"sw_name"` 349 Time int64 `json:"time"` 350 } 351 352 type EVT_SW_Upgraded struct { 353 Archived *bool `json:"archived,omitempty"` // Alarm field 354 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 355 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 356 ID string `json:"_id"` 357 Datetime time.Time `json:"datetime"` 358 Key string `json:"key"` 359 Msg string `json:"msg"` 360 SiteID string `json:"site_id"` 361 Subsystem string `json:"subsystem"` 362 Sw string `json:"sw"` 363 SwName string `json:"sw_name"` 364 Time int64 `json:"time"` 365 VersionFrom string `json:"version_from"` 366 VersionTo string `json:"version_to"` 367 } 368 369 type EVT_SW_UpgradeScheduled struct { 370 Archived *bool `json:"archived,omitempty"` // Alarm field 371 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 372 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 373 ID string `json:"_id"` 374 Admin string `json:"admin"` 375 Datetime time.Time `json:"datetime"` 376 IsAdmin bool `json:"is_admin"` 377 Key string `json:"key"` 378 Msg string `json:"msg"` 379 SiteID string `json:"site_id"` 380 Subsystem string `json:"subsystem"` 381 Sw string `json:"sw"` 382 SwName string `json:"sw_name"` 383 Time int64 `json:"time"` 384 } 385 386 type EVT_WU_Connected struct { 387 Archived *bool `json:"archived,omitempty"` // Alarm field 388 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 389 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 390 ID string `json:"_id"` 391 Ap string `json:"ap"` 392 Channel string `json:"channel"` 393 Datetime time.Time `json:"datetime"` 394 Hostname string `json:"hostname"` 395 Key string `json:"key"` 396 Msg string `json:"msg"` 397 Radio string `json:"radio"` 398 SiteID string `json:"site_id"` 399 Ssid string `json:"ssid"` 400 Subsystem string `json:"subsystem"` 401 Time int64 `json:"time"` 402 User string `json:"user"` 403 } 404 405 type EVT_WU_Disconnected struct { 406 Archived *bool `json:"archived,omitempty"` // Alarm field 407 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 408 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 409 ID string `json:"_id"` 410 Ap string `json:"ap"` 411 Bytes int `json:"bytes"` 412 Datetime time.Time `json:"datetime"` 413 Duration int `json:"duration"` 414 Hostname string `json:"hostname"` 415 Key string `json:"key"` 416 Msg string `json:"msg"` 417 SiteID string `json:"site_id"` 418 Ssid string `json:"ssid"` 419 Subsystem string `json:"subsystem"` 420 Time int64 `json:"time"` 421 User string `json:"user"` 422 } 423 424 type EVT_WU_Roam struct { 425 Archived *bool `json:"archived,omitempty"` // Alarm field 426 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 427 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 428 ID string `json:"_id"` 429 ApFrom string `json:"ap_from"` 430 ApTo string `json:"ap_to"` 431 Channel string `json:"channel"` 432 ChannelFrom string `json:"channel_from"` 433 ChannelTo string `json:"channel_to"` 434 Datetime time.Time `json:"datetime"` 435 Key string `json:"key"` 436 Msg string `json:"msg"` 437 Radio string `json:"radio"` 438 RadioFrom string `json:"radio_from"` 439 RadioTo string `json:"radio_to"` 440 SiteID string `json:"site_id"` 441 Ssid string `json:"ssid"` 442 Subsystem string `json:"subsystem"` 443 Time int64 `json:"time"` 444 User string `json:"user"` 445 } 446 447 type EVT_WU_RoamRadio struct { 448 Archived *bool `json:"archived,omitempty"` // Alarm field 449 HandledAdminID string `json:"handled_admin_id,omitempty"` // Alarm field 450 HandledTime time.Time `json:"handled_time,omitempty"` // Alarm field 451 ID string `json:"_id"` 452 Ap string `json:"ap"` 453 ChannelFrom string `json:"channel_from"` 454 ChannelTo string `json:"channel_to"` 455 Datetime time.Time `json:"datetime"` 456 Key string `json:"key"` 457 Msg string `json:"msg"` 458 RadioFrom string `json:"radio_from"` 459 RadioTo string `json:"radio_to"` 460 SiteID string `json:"site_id"` 461 Subsystem string `json:"subsystem"` 462 Time int64 `json:"time"` 463 User string `json:"user"` 464 } 465 466 // Returns a slice of json RawDevices as received by the controller 467 func (u *Unifi) RawEvents(site *Site, filter any) ([]RawEvent, error) { 468 469 var rawEvents []RawEvent 470 471 // Response from controller 472 var response struct { 473 Data []json.RawMessage 474 Meta meta 475 } 476 477 err := u.parse(site, "stat/event", filter, &response) 478 if err != nil { 479 return nil, err 480 } 481 482 for _, d := range response.Data { 483 484 // unmarshal into a map to check the "type" field 485 var obj map[string]any 486 err := json.Unmarshal(d, &obj) 487 if err != nil { 488 return nil, err 489 } 490 491 eventKey, ok := obj["key"].(string) 492 if !ok { 493 return nil, fmt.Errorf("error on retrieving object type from raw json") 494 } 495 496 var re RawEvent 497 re.Key = eventKey 498 re.Data = d 499 rawEvents = append(rawEvents, re) 500 } 501 return rawEvents, err 502 } 503 504 // Returns a slice of json RawDevices as received by the controller 505 func (u *Unifi) BasicEvents(site *Site, filter any) ([]BasicEvent, error) { 506 507 var basicEvents []BasicEvent 508 509 rawEvents, err := u.RawEvents(site, filter) 510 511 for _, re := range rawEvents { 512 513 var be BasicEvent 514 err := json.Unmarshal(re.Data, &be) 515 if err != nil { 516 return nil, err 517 } 518 519 basicEvents = append(basicEvents, be) 520 } 521 522 return basicEvents, err 523 }