diff --git a/libadlin/tunnel.go b/libadlin/tunnel.go index 6a57218..34187f8 100644 --- a/libadlin/tunnel.go +++ b/libadlin/tunnel.go @@ -8,6 +8,7 @@ import ( "net" "os/exec" "strings" + "sync" "time" ) @@ -26,7 +27,13 @@ type WGDump struct { KeepAlive string } -func readWgDump() (wgd map[string]WGDump, err error) { +var ( + wgDumpCache_data map[string]WGDump = nil + wgDumpCache_time time.Time + wgDumpCache_mutex sync.RWMutex +) + +func _readWgDump() (wgd map[string]WGDump, err error) { out, errr := exec.Command("wg", "show", "wg-adlin", "dump").Output() if errr != nil { @@ -46,6 +53,33 @@ func readWgDump() (wgd map[string]WGDump, err error) { return } +func readWgDump() (wgd map[string]WGDump, err error) { + wgDumpCache_mutex.RLock() + defer wgDumpCache_mutex.RUnlock() + + wgd = wgDumpCache_data + + if time.Since(wgDumpCache_time) > time.Second*10 { + wgDumpCache_mutex.RUnlock() + + wgDumpCache_mutex.Lock() + if time.Since(wgDumpCache_time) > time.Second*10 { + wgd, err = _readWgDump() + if err != nil { + return + } + + wgDumpCache_data = wgd + wgDumpCache_time = time.Now() + } + wgDumpCache_mutex.Unlock() + + wgDumpCache_mutex.RLock() + } + + return wgd, nil +} + type TunnelToken struct { token []byte TokenText string