From 3f9876fc098054cf7000294740bbacf6b7509fde Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 19 May 2020 09:39:03 +0200 Subject: [PATCH] Expose network system state table to api --- network/database.go | 16 ++++++++------ network/state/info.go | 50 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 network/state/info.go diff --git a/network/database.go b/network/database.go index 5910e92d..460307c0 100644 --- a/network/database.go +++ b/network/database.go @@ -5,6 +5,8 @@ import ( "strings" "sync" + "github.com/safing/portmaster/network/state" + "github.com/safing/portbase/database" "github.com/safing/portbase/database/iterator" "github.com/safing/portbase/database/query" @@ -57,13 +59,13 @@ func (s *StorageInterface) Get(key string) (record.Record, error) { return conn, nil } } - // case "system": - // if len(splitted) >= 2 { - // switch splitted[1] { - // case "": - // process.Get - // } - // } + case "system": + if len(splitted) >= 2 { + switch splitted[1] { + case "state": + return state.GetStateInfo(), nil + } + } } return nil, storage.ErrNotFound diff --git a/network/state/info.go b/network/state/info.go new file mode 100644 index 00000000..292a8ec7 --- /dev/null +++ b/network/state/info.go @@ -0,0 +1,50 @@ +package state + +import ( + "sync" + + "github.com/safing/portbase/database/record" + + "github.com/safing/portmaster/network/socket" +) + +type StateInfo struct { + record.Base + sync.Mutex + + TCP4Connections []*socket.ConnectionInfo + TCP4Listeners []*socket.BindInfo + TCP6Connections []*socket.ConnectionInfo + TCP6Listeners []*socket.BindInfo + UDP4Binds []*socket.BindInfo + UDP6Binds []*socket.BindInfo +} + +func GetStateInfo() *StateInfo { + info := &StateInfo{} + + tcp4Lock.Lock() + updateTCP4Tables() + info.TCP4Connections = tcp4Connections + info.TCP4Listeners = tcp4Listeners + tcp4Lock.Unlock() + + tcp6Lock.Lock() + updateTCP6Tables() + info.TCP6Connections = tcp6Connections + info.TCP6Listeners = tcp6Listeners + tcp6Lock.Unlock() + + udp4Lock.Lock() + updateUDP4Table() + info.UDP4Binds = udp4Binds + udp4Lock.Unlock() + + udp6Lock.Lock() + updateUDP6Table() + info.UDP6Binds = udp6Binds + udp6Lock.Unlock() + + info.UpdateMeta() + return info +}