github.com/dim13/unifi@v0.0.0-20230308161331-9b04946f5e93/cmd/list-alarms/main.go (about)

     1  // Copyright (c) 2014 Dimitri Sokolyuk. 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  // Example command list-events
     6  // List Events of a given site
     7  package main
     8  
     9  import (
    10  	"encoding/json"
    11  	"flag"
    12  	"fmt"
    13  	"log"
    14  	"os"
    15  	"text/tabwriter"
    16  	"time"
    17  
    18  	"github.com/dim13/unifi"
    19  )
    20  
    21  var (
    22  	host      = flag.String("host", "unifi", "Controller hostname")
    23  	user      = flag.String("user", "admin", "Controller username")
    24  	pass      = flag.String("pass", "unifi", "Controller password")
    25  	version   = flag.Int("version", 5, "Controller base version")
    26  	port      = flag.String("port", "8443", "Controller port")
    27  	siteID    = flag.String("siteid", "default", "Sitename or description")
    28  	limit     = flag.Int("limit", 500, "Max number of returned alarms")
    29  	start     = flag.Int("start", 0, "Index of first event (offset)")
    30  	withcount = flag.Bool("withcount", true, "???")
    31  	archived  = flag.Bool("archived", false, "Archived Alerts")
    32  	unknown   = flag.Bool("listUnknown", false, "Print unknown events in raw format (helps for adding them)")
    33  )
    34  
    35  func main() {
    36  	w := new(tabwriter.Writer)
    37  	w.Init(os.Stdout, 0, 8, 3, ' ', 0)
    38  	defer w.Flush()
    39  
    40  	flag.Parse()
    41  
    42  	u, err := unifi.Login(*user, *pass, *host, *port, *siteID, *version)
    43  	if err != nil {
    44  		log.Fatalln("Login returned error: ", err)
    45  		return
    46  	}
    47  	defer u.Logout()
    48  
    49  	site, err := u.Site(*siteID)
    50  	if err != nil {
    51  		log.Fatal(err)
    52  	}
    53  
    54  	var alarmFilter unifi.AlarmFilter
    55  	alarmFilter.Limit = *limit
    56  	alarmFilter.Start = *start
    57  	alarmFilter.Withcount = *withcount
    58  	alarmFilter.Archived = *archived
    59  
    60  	// Print basic events
    61  
    62  	if !*unknown {
    63  
    64  		be, err := u.BasicAlarms(site, alarmFilter)
    65  		if err != nil {
    66  			log.Fatalln(err)
    67  			return
    68  		}
    69  
    70  		fmt.Fprintf(w, "\n\nTimestamp\tId\tKey\tMessage\tArchived\tHandledAdminID\tHandleTime\n")
    71  
    72  		for _, e := range be {
    73  
    74  			timestamp := time.Unix(0, e.Time*int64(time.Millisecond))
    75  
    76  			if e.Archived == nil || !*(e.Archived) {
    77  				fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%t\tNot available\tNot Available\n", timestamp.String(), e.ID, e.Key, e.Message, *(e.Archived))
    78  			} else {
    79  				fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%t\t%s\t%s\n", timestamp.String(), e.ID, e.Key, e.Message, *(e.Archived), e.HandledAdminID, e.HandledTime.Format("2006-01-02 15:04:05"))
    80  			}
    81  		}
    82  	} else {
    83  
    84  		// Print unknown events in json format
    85  
    86  		fmt.Fprintf(w, "\n\nUnknown Events\n")
    87  
    88  		re, err := u.RawAlarms(site, alarmFilter)
    89  		if err != nil {
    90  			log.Fatalln(err)
    91  			return
    92  		}
    93  
    94  		totalEvents := 0
    95  		unknownEvents := 0
    96  
    97  		for _, e := range re {
    98  			switch e.Key {
    99  			case "EVT_AD_Login":
   100  			case "EVT_AP_DetectRogueAP":
   101  			case "EVT_LU_Connected":
   102  			case "EVT_LU_Disconnected":
   103  			case "EVT_WU_Connected":
   104  			case "EVT_WU_Disconnected":
   105  			case "EVT_WU_Roam":
   106  			case "EVT_WU_RoamRadio":
   107  			case "EVT_AP_Connected":
   108  			case "EVT_SW_Connected":
   109  			case "EVT_AP_Isolated":
   110  			case "EVT_AP_DiscoveredPending":
   111  			case "EVT_AP_Adopted":
   112  			case "EVT_AP_UpgradeScheduled":
   113  			case "EVT_AP_Upgraded":
   114  			case "EVT_AP_RestartedUnknown":
   115  			case "EVT_SW_DiscoveredPending":
   116  			case "EVT_SW_Adopted":
   117  			case "EVT_SW_UpgradeScheduled":
   118  			case "EVT_SW_Upgraded":
   119  			case "EVT_AP_Restarted":
   120  			case "EVT_AP_PossibleInterference":
   121  			case "EVT_SW_PoeDisconnect":
   122  			case "EVT_AP_Lost_Contact":
   123  			case "EVT_SW_RestartedUnknown":
   124  			case "EVT_SW_Lost_Contact":
   125  
   126  			default:
   127  				j, err := json.Marshal(&e.Data)
   128  				if err != nil {
   129  					panic(err)
   130  				}
   131  				fmt.Fprintln(w, string(j))
   132  				unknownEvents++
   133  			}
   134  			totalEvents++
   135  		}
   136  
   137  		fmt.Fprintf(w, "Total Events:   %d\n", totalEvents)
   138  		fmt.Fprintf(w, "Unknown Events: %d\n", unknownEvents)
   139  
   140  	}
   141  	/*	// Events in raw format
   142  		fmt.Fprintln(w, "Timestamp\tId\tKey\tMessage")
   143  
   144  		for _, re := range events {
   145  
   146  			if *key == "" || *key == re.Key {
   147  				timestamp := time.Unix(0, re.Timestamp*int64(time.Millisecond))
   148  				fmt.Fprintf(w, "%s\t%s\t%s\t%s\n", timestamp.String(), re.ID, re.Key, re.Message)
   149  			}
   150  		}
   151  	*/
   152  	// Parsed Events
   153  
   154  	/*
   155  
   156  		// EVT_AP_Lost_Contact
   157  		fmt.Fprintln(w, "")
   158  		fmt.Fprintln(w, "--- EVT_AP_Lost_Contact ---")
   159  		fmt.Fprintln(w, "Timestamp\tId\tSubsystem\tSiteID\tAp\tApName\tPort\tMessage")
   160  
   161  		for _, re := range events {
   162  
   163  			switch re.Key {
   164  			case "EVT_AP_Lost_Contact":
   165  
   166  				var e unifi.EVT_AP_Lost_Contact
   167  				err := json.Unmarshal(re.RawEvent, &e)
   168  				if err == nil {
   169  					timestamp := time.Unix(0, e.Time*int64(time.Millisecond))
   170  					fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\t%s\n", timestamp.String(), e.ID, e.Subsystem, e.SiteID, e.Ap, e.ApName, e.Msg)
   171  				}
   172  			}
   173  		}
   174  
   175  		// EVT_SW_PoeDisconnect controller version 5.8.21+ / USW firmware 3.9.27+
   176  		fmt.Fprintln(w, "")
   177  		fmt.Fprintln(w, "--- EVT_SW_PoeDisconnect ---")
   178  		fmt.Fprintln(w, "Timestamp\tId\tSubsystem\tSiteID\tSwitch\tSwitchName\tPort\tMessage")
   179  
   180  		for _, re := range events {
   181  
   182  			switch re.Key {
   183  			case "EVT_SW_PoeDisconnect":
   184  
   185  				var e unifi.EVT_SW_PoeDisconnect
   186  				err := json.Unmarshal(re.RawEvent, &e)
   187  				if err == nil {
   188  					timestamp := time.Unix(0, e.Time*int64(time.Millisecond))
   189  					fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\t%d\t%s\n", timestamp.String(), e.ID, e.Subsystem, e.SiteID, e.Sw, e.SwName, e.Port, e.Msg)
   190  				}
   191  			}
   192  		}
   193  	*/
   194  }