Skip to content

Commit

Permalink
Merge pull request #112 from telekom-mms/feature/add-trafpol-status-t…
Browse files Browse the repository at this point in the history
…o-dbus-properties

Feature/add trafpol status to dbus properties
  • Loading branch information
hwipl authored Aug 7, 2024
2 parents 6fd711f + 6240509 commit 2ea8cf6
Show file tree
Hide file tree
Showing 8 changed files with 163 additions and 16 deletions.
4 changes: 4 additions & 0 deletions internal/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,10 @@ func printStatus(status *vpnstatus.Status) error {
if !verbose {
return nil
}

fmt.Printf("TrafPol State: %s\n", status.TrafPolState)
fmt.Printf("Allowed Hosts: %s\n", status.AllowedHosts)

if status.VPNConfig == nil {
fmt.Printf("VPN Config:\n")
} else {
Expand Down
69 changes: 53 additions & 16 deletions internal/daemon/daemon.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"fmt"
"net"
"reflect"
"slices"
"strconv"
"strings"
"syscall"
Expand Down Expand Up @@ -200,6 +201,32 @@ func (d *Daemon) setStatusOCRunning(running bool) {
d.dbus.SetProperty(dbusapi.PropertyOCRunning, ocrunning)
}

// setStatusTrafPolState sets the TrafPol state in status.
func (d *Daemon) setStatusTrafPolState(state vpnstatus.TrafPolState) {
if d.status.TrafPolState == state {
// TrafPol state not changed
return
}

// TrafPol state changed
log.WithField("TrafPolState", state).Info("Daemon changed TrafPolState status")
d.status.TrafPolState = state
d.dbus.SetProperty(dbusapi.PropertyTrafPolState, state)
}

// setStatusAllowedHosts sets the allowed hosts in status.
func (d *Daemon) setStatusAllowedHosts(hosts []string) {
if slices.Equal(d.status.AllowedHosts, hosts) {
// allowed hosts not changed
return
}

// allowed hosts changed
log.WithField("AllowedHosts", hosts).Info("Daemon changed AllowedHosts status")
d.status.AllowedHosts = hosts
d.dbus.SetProperty(dbusapi.PropertyAllowedHosts, hosts)
}

// setStatusVPNConfig sets the VPN config in status.
func (d *Daemon) setStatusVPNConfig(config *vpnconfig.Config) {
if d.status.VPNConfig.Equal(config) {
Expand Down Expand Up @@ -662,6 +689,10 @@ func (d *Daemon) startTrafPol() error {
return fmt.Errorf("Daemon could not start TrafPol: %w", err)
}

// update trafpol status
d.setStatusTrafPolState(vpnstatus.TrafPolStateActive)
d.setStatusAllowedHosts(c.AllowedHosts)

if d.serverIP != nil {
// VPN connection active, allow server IP
d.serverIPAllowed = d.trafpol.AddAllowedAddr(d.serverIP)
Expand All @@ -679,6 +710,10 @@ func (d *Daemon) stopTrafPol() {
d.trafpol.Stop()
d.trafpol = nil
d.serverIPAllowed = false

// update trafpol status
d.setStatusTrafPolState(vpnstatus.TrafPolStateInactive)
d.setStatusAllowedHosts(nil)
}

// checkTrafPol checks if traffic policing should be running and
Expand Down Expand Up @@ -784,18 +819,6 @@ func (d *Daemon) Start() error {
goto cleanup_profmon
}

// start traffic policing
err = d.checkTrafPol()
if err != nil {
goto cleanup_trafpol
}

// start TND
err = d.checkTND()
if err != nil {
goto cleanup_tnd
}

// start VPN setup
d.vpnsetup.Start()

Expand All @@ -821,20 +844,34 @@ func (d *Daemon) Start() error {
d.setStatusConnectionState(vpnstatus.ConnectionStateDisconnected)
d.setStatusServers(d.profile.GetVPNServerHostNames())
d.setStatusConnectedAt(0)
d.setStatusTrafPolState(vpnstatus.TrafPolStateInactive)

// start traffic policing
err = d.checkTrafPol()
if err != nil {
goto cleanup_trafpol
}

// start TND
err = d.checkTND()
if err != nil {
goto cleanup_tnd
}

go d.start()
return nil

// clean up after error
cleanup_tnd:
d.stopTrafPol()
cleanup_trafpol:
d.dbus.Stop()
d.server.Stop()
cleanup_dbus:
d.server.Stop()
cleanup_unix:
d.runner.Stop()
d.vpnsetup.Stop()
d.stopTND()
cleanup_tnd:
d.stopTrafPol()
cleanup_trafpol:
d.profmon.Stop()
cleanup_profmon:
d.sleepmon.Stop()
Expand Down
28 changes: 28 additions & 0 deletions internal/dbusapi/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ const (
PropertyConnectedAt = "ConnectedAt"
PropertyServers = "Servers"
PropertyOCRunning = "OCRunning"
PropertyTrafPolState = "TrafPolState"
PropertyAllowedHosts = "AllowedHosts"
PropertyVPNConfig = "VPNConfig"
)

Expand Down Expand Up @@ -87,6 +89,18 @@ const (
OCRunningRunning
)

// Property "TrafPol State" states.
const (
TrafPolStateUnknown uint32 = iota
TrafPolStateInactive
TrafPolStateActive
)

// Property "Allowed Hosts" values.
var (
AllowedHostsInvalid []string
)

// Property "VPNConfig" values.
const (
VPNConfigInvalid = ""
Expand Down Expand Up @@ -234,6 +248,8 @@ func (s *Service) start() {
s.props.SetMust(Interface, PropertyConnectedAt, ConnectedAtInvalid)
s.props.SetMust(Interface, PropertyServers, ServersInvalid)
s.props.SetMust(Interface, PropertyOCRunning, OCRunningUnknown)
s.props.SetMust(Interface, PropertyTrafPolState, TrafPolStateUnknown)
s.props.SetMust(Interface, PropertyAllowedHosts, AllowedHostsInvalid)
s.props.SetMust(Interface, PropertyVPNConfig, VPNConfigInvalid)
}

Expand Down Expand Up @@ -344,6 +360,18 @@ func (s *Service) Start() error {
Emit: prop.EmitTrue,
Callback: nil,
},
PropertyTrafPolState: {
Value: TrafPolStateUnknown,
Writable: false,
Emit: prop.EmitTrue,
Callback: nil,
},
PropertyAllowedHosts: {
Value: AllowedHostsInvalid,
Writable: false,
Emit: prop.EmitTrue,
Callback: nil,
},
PropertyVPNConfig: {
Value: VPNConfigInvalid,
Writable: false,
Expand Down
8 changes: 8 additions & 0 deletions pkg/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,10 @@ func updateStatusFromProperties(status *vpnstatus.Status, props map[string]dbus.
err = v.Store(&dest.Servers)
case dbusapi.PropertyOCRunning:
err = v.Store(&dest.OCRunning)
case dbusapi.PropertyTrafPolState:
err = v.Store(&dest.TrafPolState)
case dbusapi.PropertyAllowedHosts:
err = v.Store(&dest.AllowedHosts)
case dbusapi.PropertyVPNConfig:
s := dbusapi.VPNConfigInvalid
if err := v.Store(&s); err != nil {
Expand Down Expand Up @@ -270,6 +274,10 @@ func handlePropertiesChanged(s *dbus.Signal, status *vpnstatus.Status) *vpnstatu
status.Servers = dbusapi.ServersInvalid
case dbusapi.PropertyOCRunning:
status.OCRunning = vpnstatus.OCRunningUnknown
case dbusapi.PropertyTrafPolState:
status.TrafPolState = vpnstatus.TrafPolStateUnknown
case dbusapi.PropertyAllowedHosts:
status.AllowedHosts = dbusapi.AllowedHostsInvalid
case dbusapi.PropertyVPNConfig:
status.VPNConfig = nil
}
Expand Down
4 changes: 4 additions & 0 deletions pkg/client/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ func TestDBusClientQuery(t *testing.T) {
dbusapi.PropertyConnectedAt: dbus.MakeVariant(dbusapi.ConnectedAtInvalid),
dbusapi.PropertyServers: dbus.MakeVariant(dbusapi.ServersInvalid),
dbusapi.PropertyOCRunning: dbus.MakeVariant(dbusapi.OCRunningUnknown),
dbusapi.PropertyTrafPolState: dbus.MakeVariant(dbusapi.TrafPolStateUnknown),
dbusapi.PropertyAllowedHosts: dbus.MakeVariant(dbusapi.AllowedHostsInvalid),
dbusapi.PropertyVPNConfig: dbus.MakeVariant(dbusapi.VPNConfigInvalid),
},
{
Expand Down Expand Up @@ -210,6 +212,8 @@ func TestDBusClientSubscribe(t *testing.T) {
dbusapi.PropertyConnectedAt,
dbusapi.PropertyServers,
dbusapi.PropertyOCRunning,
dbusapi.PropertyTrafPolState,
dbusapi.PropertyAllowedHosts,
dbusapi.PropertyVPNConfig,
}},
},
Expand Down
27 changes: 27 additions & 0 deletions pkg/vpnstatus/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,29 @@ func (o OCRunning) String() string {
return ""
}

// TrafPolState is the current TrafPol state.
type TrafPolState uint32

// TrafPolState states.
const (
TrafPolStateUnknown = iota
TrafPolStateInactive
TrafPolStateActive
)

// String resturns TrafPolState as string.
func (t TrafPolState) String() string {
switch t {
case TrafPolStateUnknown:
return "unknown"
case TrafPolStateInactive:
return "inactive"
case TrafPolStateActive:
return "active"
}
return ""
}

// Status is a VPN status.
type Status struct {
TrustedNetwork TrustedNetwork
Expand All @@ -108,6 +131,8 @@ type Status struct {
ConnectedAt int64
Servers []string
OCRunning OCRunning
TrafPolState TrafPolState
AllowedHosts []string
VPNConfig *vpnconfig.Config
}

Expand All @@ -126,6 +151,8 @@ func (s *Status) Copy() *Status {
ConnectedAt: s.ConnectedAt,
Servers: append(s.Servers[:0:0], s.Servers...),
OCRunning: s.OCRunning,
TrafPolState: s.TrafPolState,
AllowedHosts: append(s.AllowedHosts[:0:0], s.AllowedHosts...),
VPNConfig: s.VPNConfig.Copy(),
}
}
Expand Down
19 changes: 19 additions & 0 deletions pkg/vpnstatus/status_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,23 @@ func TestOCRunningString(t *testing.T) {
}
}

// TestTrafPolStateString tests String of TrafPolState.
func TestTrafPolStateString(t *testing.T) {
for v, s := range map[TrafPolState]string{
// valid
TrafPolStateUnknown: "unknown",
TrafPolStateInactive: "inactive",
TrafPolStateActive: "active",

// invalid
123456: "",
} {
if v.String() != s {
t.Errorf("got %s, want %s", v.String(), s)
}
}
}

// TestStatusCopy tests Copy of Status.
func TestStatusCopy(t *testing.T) {
// test nil
Expand All @@ -136,6 +153,8 @@ func TestStatusCopy(t *testing.T) {
ConnectedAt: 1700000000,
Servers: []string{"test server 1", "test server 2"},
OCRunning: OCRunningRunning,
TrafPolState: TrafPolStateActive,
AllowedHosts: []string{"test.example.com"},
VPNConfig: vpnconfig.New(),
},
} {
Expand Down
20 changes: 20 additions & 0 deletions tools/dbusclient/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ func main() {
connectedAt := dbusapi.ConnectedAtInvalid
servers := dbusapi.ServersInvalid
ocRunning := dbusapi.OCRunningUnknown
trafPolState := dbusapi.TrafPolStateUnknown
allowedHosts := dbusapi.AllowedHostsInvalid
vpnConfig := dbusapi.VPNConfigInvalid

getProperty := func(name string, val any) {
Expand All @@ -57,6 +59,8 @@ func main() {
getProperty(dbusapi.PropertyConnectedAt, &connectedAt)
getProperty(dbusapi.PropertyServers, &servers)
getProperty(dbusapi.PropertyOCRunning, &ocRunning)
getProperty(dbusapi.PropertyTrafPolState, &trafPolState)
getProperty(dbusapi.PropertyAllowedHosts, &allowedHosts)
getProperty(dbusapi.PropertyVPNConfig, &vpnConfig)

log.Println("TrustedNetwork:", trustedNetwork)
Expand All @@ -68,6 +72,8 @@ func main() {
log.Println("ConnectedAt:", connectedAt)
log.Println("Servers:", servers)
log.Println("OCRunning:", ocRunning)
log.Println("TrafPolState:", trafPolState)
log.Println("AllowedHosts:", allowedHosts)
log.Println("VPNConfig:", vpnConfig)

// handle signals
Expand Down Expand Up @@ -141,6 +147,16 @@ func main() {
log.Fatal(err)
}
fmt.Println(ocRunning)
case dbusapi.PropertyTrafPolState:
if err := value.Store(&trafPolState); err != nil {
log.Fatal(err)
}
fmt.Println(trafPolState)
case dbusapi.PropertyAllowedHosts:
if err := value.Store(&allowedHosts); err != nil {
log.Fatal(err)
}
fmt.Println(allowedHosts)
case dbusapi.PropertyVPNConfig:
if err := value.Store(&vpnConfig); err != nil {
log.Fatal(err)
Expand Down Expand Up @@ -176,6 +192,10 @@ func main() {
servers = dbusapi.ServersInvalid
case dbusapi.PropertyOCRunning:
ocRunning = dbusapi.OCRunningUnknown
case dbusapi.PropertyTrafPolState:
trafPolState = dbusapi.TrafPolStateUnknown
case dbusapi.PropertyAllowedHosts:
allowedHosts = dbusapi.AllowedHostsInvalid
case dbusapi.PropertyVPNConfig:
vpnConfig = dbusapi.VPNConfigInvalid
}
Expand Down

0 comments on commit 2ea8cf6

Please sign in to comment.