func main() { numArgs := len(os.Args) if numArgs < 2 { fmt.Println("Usage: bamboo-blinker URL [INTERVAL_SECONDS] [BACKOFF_MS] [BLYNC_ID]") fmt.Printf("\t This will start monitoring the provided URL using a specific BlyncLight, default to ID 1\n") fmt.Println("OR : bamboo-blinker TellMeHowItWillBe") fmt.Printf("\t This will flash all connect blync lights in logical ID order based on USB port\n") os.Exit(1) } light := blync.NewBlyncLight() if os.Args[1] == "FlashMob" { light.FlashOrder() os.Exit(1) } url := os.Args[1] buildBunny := bunny.NewBunny(url) defaultInterval := 10 if numArgs == 3 { value, err := strconv.ParseInt(os.Args[2], 10, 32) if err != nil { fmt.Println("INTERVAL_SECONDS must be an integer") os.Exit(1) } defaultInterval = int(value) } activeInterval := defaultInterval backoffLimit := 100 if numArgs == 4 { value, err := strconv.ParseInt(os.Args[3], 10, 32) if err != nil { fmt.Println("BACKOFF_MS must be an integer") os.Exit(1) } backoffLimit = int(value) } blyncId := 1 if numArgs == 5 { value, err := strconv.ParseInt(os.Args[4], 10, 32) if err != nil { fmt.Println("BLYNC_ID must be an integer") os.Exit(1) } blyncId = int(value) } light.SetColor(blync.Green, blyncId) // clean shutdown of light c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) signal.Notify(c, syscall.SIGTERM) go func() { <-c light.Close(blyncId) os.Exit(1) }() monitor := NewMonitor(light, blyncId) for { bunnyStatus := buildBunny.Update() //backoff if more than backoffLimit ms to calculate this on server side. if bunnyStatus.ProcessTime > backoffLimit { activeInterval = activeInterval * 2 if activeInterval > 600 { activeInterval = 600 } fmt.Printf("Interval increased to %d seconds since TimeToEvaluate was %d ms\n", activeInterval, bunnyStatus.ProcessTime) } else { if defaultInterval != activeInterval { activeInterval = defaultInterval fmt.Printf("Interval reset to %d seconds since TimeToEvaluate was %d ms\n", activeInterval, bunnyStatus.ProcessTime) } } if bunnyStatus.Status == "OK" { monitor.SetHealthy() } else { monitor.SetUnhealthy() } time.Sleep(time.Second * time.Duration(activeInterval)) } }
func main() { numArgs := len(os.Args) if numArgs < 2 { fmt.Println("Usage: bamboo-blinker URL [INTERVAL_SECONDS] [BACKOFF_MS]") os.Exit(1) } url := os.Args[1] buildBunny := bunny.NewBunny(url) defaultInterval := 10 if numArgs == 3 { value, err := strconv.ParseInt(os.Args[2], 10, 32) if err != nil { fmt.Println("INTERVAL_SECONDS must be an integer") os.Exit(1) } defaultInterval = int(value) } activeInterval := defaultInterval backoffLimit := 100 if numArgs == 4 { value, err := strconv.ParseInt(os.Args[3], 10, 32) if err != nil { fmt.Println("BACKOFF_MS must be an integer") os.Exit(1) } backoffLimit = int(value) } light := blync.NewBlyncLight() light.SetColor(blync.Green) // clean shutdown of light c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) signal.Notify(c, syscall.SIGTERM) go func() { <-c light.Close() os.Exit(1) }() monitor := NewMonitor(light) for { bunnyStatus := buildBunny.Update() //backoff if more than backoffLimit ms to calculate this on server side. if bunnyStatus.ProcessTime > backoffLimit { activeInterval = activeInterval * 2 if activeInterval > 600 { activeInterval = 600 } fmt.Printf("Interval increased to %d seconds since TimeToEvaluate was %d ms\n", activeInterval, bunnyStatus.ProcessTime) } else { if defaultInterval != activeInterval { activeInterval = defaultInterval fmt.Printf("Interval reset to %d seconds since TimeToEvaluate was %d ms\n", activeInterval, bunnyStatus.ProcessTime) } } if bunnyStatus.Status == "OK" { monitor.SetHealthy() } else { monitor.SetUnhealthy() } time.Sleep(time.Second * time.Duration(activeInterval)) } }