diff --git a/bird/bird.go b/bird/bird.go index b737344..af0dc60 100644 --- a/bird/bird.go +++ b/bird/bird.go @@ -9,6 +9,9 @@ import ( var BirdCmd string +var rateLimit = 0 +var MAX_RATE = 5 + var Cache = struct { sync.RWMutex m map[string]Parsed @@ -34,11 +37,35 @@ func Run(args string) ([]byte, error) { return exec.Command(BirdCmd, argsList...).Output() } +func InstallRateLimitReset() { + go func() { + c := time.Tick(time.Second) + + for _ = range c { + rateLimit = 0 + } + }() +} + +func checkRateLimit() bool { + if rateLimit > MAX_RATE { + return false + } + + rateLimit += 1 + + return true +} + func RunAndParse(cmd string, parser func([]byte) Parsed) (Parsed, bool) { if val, ok := fromCache(cmd); ok { return val, true } + if !checkRateLimit() { + return nil, false + } + out, err := Run(cmd) if err != nil { diff --git a/birdwatcher.go b/birdwatcher.go index df3197e..8e8b0f4 100644 --- a/birdwatcher.go +++ b/birdwatcher.go @@ -38,6 +38,7 @@ func main() { flag.Parse() bird.BirdCmd = *birdc + bird.InstallRateLimitReset() r := makeRouter()