Skip to content

Commit

Permalink
Merge pull request #117 from telekom-mms/feature/add-openconnect-pid-…
Browse files Browse the repository at this point in the history
…to-dbus-properties

Add OpenConnect PID to D-Bus Properties
  • Loading branch information
hwipl authored Aug 16, 2024
2 parents 4ca8475 + 090ecd6 commit 28356b9
Show file tree
Hide file tree
Showing 9 changed files with 61 additions and 0 deletions.
1 change: 1 addition & 0 deletions internal/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ func printStatus(status *vpnstatus.Status) error {
return nil
}

fmt.Printf("OC PID: %d\n", status.OCPID)
fmt.Printf("TrafPol State: %s\n", status.TrafPolState)
fmt.Printf("Allowed Hosts: %s\n", status.AllowedHosts)
fmt.Printf("TND State: %s\n", status.TNDState)
Expand Down
16 changes: 16 additions & 0 deletions internal/daemon/daemon.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,19 @@ func (d *Daemon) setStatusOCRunning(running bool) {
d.dbus.SetProperty(dbusapi.PropertyOCRunning, ocrunning)
}

// setStatusOCPID sets the openconnect PID in status.
func (d *Daemon) setStatusOCPID(pid uint32) {
if d.status.OCPID == pid {
// OC PID not changed
return
}

// OC PID changed
log.WithField("OCPID", pid).Info("Daemon changed OCPID status")
d.status.OCPID = pid
d.dbus.SetProperty(dbusapi.PropertyOCPID, pid)
}

// setStatusTrafPolState sets the TrafPol state in status.
func (d *Daemon) setStatusTrafPolState(state vpnstatus.TrafPolState) {
if d.status.TrafPolState == state {
Expand Down Expand Up @@ -321,6 +334,7 @@ func (d *Daemon) disconnectVPN() {
// update status
d.setStatusConnectionState(vpnstatus.ConnectionStateDisconnecting)
d.setStatusOCRunning(false)
d.setStatusOCPID(0)

// stop runner
if d.runner == nil {
Expand Down Expand Up @@ -515,6 +529,7 @@ func (d *Daemon) handleTNDResult(trusted bool) error {
func (d *Daemon) handleRunnerDisconnect() {
// make sure running and connected are not set
d.setStatusOCRunning(false)
d.setStatusOCPID(0)
d.setStatusConnectionState(vpnstatus.ConnectionStateDisconnected)
d.setStatusServer("")
d.setStatusServerIP("")
Expand All @@ -538,6 +553,7 @@ func (d *Daemon) handleRunnerEvent(e *ocrunner.ConnectEvent) {
if e.Connect {
// make sure running is set
d.setStatusOCRunning(true)
d.setStatusOCPID(e.PID)
return
}

Expand Down
13 changes: 13 additions & 0 deletions internal/dbusapi/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ const (
PropertyConnectedAt = "ConnectedAt"
PropertyServers = "Servers"
PropertyOCRunning = "OCRunning"
PropertyOCPID = "OCPID"
PropertyTrafPolState = "TrafPolState"
PropertyAllowedHosts = "AllowedHosts"
PropertyTNDState = "TNDState"
Expand Down Expand Up @@ -91,6 +92,11 @@ const (
OCRunningRunning
)

// Property "OCPID" values.
const (
OCPIDInvalid uint32 = 0
)

// Property "TrafPol State" states.
const (
TrafPolStateUnknown uint32 = iota
Expand Down Expand Up @@ -262,6 +268,7 @@ 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, PropertyOCPID, OCPIDInvalid)
s.props.SetMust(Interface, PropertyTrafPolState, TrafPolStateUnknown)
s.props.SetMust(Interface, PropertyAllowedHosts, AllowedHostsInvalid)
s.props.SetMust(Interface, PropertyTNDState, TNDStateUnknown)
Expand Down Expand Up @@ -376,6 +383,12 @@ func (s *Service) Start() error {
Emit: prop.EmitTrue,
Callback: nil,
},
PropertyOCPID: {
Value: OCPIDInvalid,
Writable: false,
Emit: prop.EmitTrue,
Callback: nil,
},
PropertyTrafPolState: {
Value: TrafPolStateUnknown,
Writable: false,
Expand Down
12 changes: 12 additions & 0 deletions internal/ocrunner/connect.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ type ConnectEvent struct {
// TODO: use a Type with more values?
Connect bool

// PID is the process ID of the running openconnect process
PID uint32

// login info for connect
login *logininfo.LoginInfo

Expand Down Expand Up @@ -146,6 +149,14 @@ func (c *Connect) savePidFile() {
c.setPIDGroup()
}

// getPID returns the PID of the running command.
func (c *Connect) getPID() uint32 {
if c.command == nil || c.command.Process == nil || c.command.Process.Pid < 0 {
return 0
}
return uint32(c.command.Process.Pid)
}

// handleConnect establishes the connection by starting openconnect.
func (c *Connect) handleConnect(e *ConnectEvent) {
if c.command != nil {
Expand Down Expand Up @@ -213,6 +224,7 @@ func (c *Connect) handleConnect(e *ConnectEvent) {
// signal connect to user
c.sendEvent(&ConnectEvent{
Connect: true,
PID: c.getPID(),
})

// wait for program termination and signal disconnect
Expand Down
4 changes: 4 additions & 0 deletions pkg/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,8 @@ func updateStatusFromProperties(status *vpnstatus.Status, props map[string]dbus.
err = v.Store(&dest.Servers)
case dbusapi.PropertyOCRunning:
err = v.Store(&dest.OCRunning)
case dbusapi.PropertyOCPID:
err = v.Store(&dest.OCPID)
case dbusapi.PropertyTrafPolState:
err = v.Store(&dest.TrafPolState)
case dbusapi.PropertyAllowedHosts:
Expand Down Expand Up @@ -278,6 +280,8 @@ func handlePropertiesChanged(s *dbus.Signal, status *vpnstatus.Status) *vpnstatu
status.Servers = dbusapi.ServersInvalid
case dbusapi.PropertyOCRunning:
status.OCRunning = vpnstatus.OCRunningUnknown
case dbusapi.PropertyOCPID:
status.OCPID = dbusapi.OCPIDInvalid
case dbusapi.PropertyTrafPolState:
status.TrafPolState = vpnstatus.TrafPolStateUnknown
case dbusapi.PropertyAllowedHosts:
Expand Down
2 changes: 2 additions & 0 deletions pkg/client/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ func TestDBusClientQuery(t *testing.T) {
dbusapi.PropertyConnectedAt: dbus.MakeVariant(dbusapi.ConnectedAtInvalid),
dbusapi.PropertyServers: dbus.MakeVariant(dbusapi.ServersInvalid),
dbusapi.PropertyOCRunning: dbus.MakeVariant(dbusapi.OCRunningUnknown),
dbusapi.PropertyOCPID: dbus.MakeVariant(dbusapi.OCPIDInvalid),
dbusapi.PropertyTrafPolState: dbus.MakeVariant(dbusapi.TrafPolStateUnknown),
dbusapi.PropertyAllowedHosts: dbus.MakeVariant(dbusapi.AllowedHostsInvalid),
dbusapi.PropertyTNDState: dbus.MakeVariant(dbusapi.TNDStateUnknown),
Expand Down Expand Up @@ -214,6 +215,7 @@ func TestDBusClientSubscribe(t *testing.T) {
dbusapi.PropertyConnectedAt,
dbusapi.PropertyServers,
dbusapi.PropertyOCRunning,
dbusapi.PropertyOCPID,
dbusapi.PropertyTrafPolState,
dbusapi.PropertyAllowedHosts,
dbusapi.PropertyTNDState,
Expand Down
2 changes: 2 additions & 0 deletions pkg/vpnstatus/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ type Status struct {
ConnectedAt int64
Servers []string
OCRunning OCRunning
OCPID uint32
TrafPolState TrafPolState
AllowedHosts []string
TNDState TNDState
Expand All @@ -177,6 +178,7 @@ func (s *Status) Copy() *Status {
ConnectedAt: s.ConnectedAt,
Servers: append(s.Servers[:0:0], s.Servers...),
OCRunning: s.OCRunning,
OCPID: s.OCPID,
TrafPolState: s.TrafPolState,
AllowedHosts: append(s.AllowedHosts[:0:0], s.AllowedHosts...),
TNDState: s.TNDState,
Expand Down
1 change: 1 addition & 0 deletions pkg/vpnstatus/status_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ func TestStatusCopy(t *testing.T) {
ConnectedAt: 1700000000,
Servers: []string{"test server 1", "test server 2"},
OCRunning: OCRunningRunning,
OCPID: 12345,
TrafPolState: TrafPolStateActive,
AllowedHosts: []string{"test.example.com"},
TNDState: TNDStateActive,
Expand Down
10 changes: 10 additions & 0 deletions tools/dbusclient/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ func main() {
connectedAt := dbusapi.ConnectedAtInvalid
servers := dbusapi.ServersInvalid
ocRunning := dbusapi.OCRunningUnknown
ocPID := dbusapi.OCPIDInvalid
trafPolState := dbusapi.TrafPolStateUnknown
allowedHosts := dbusapi.AllowedHostsInvalid
tndState := dbusapi.TNDStateUnknown
Expand All @@ -61,6 +62,7 @@ func main() {
getProperty(dbusapi.PropertyConnectedAt, &connectedAt)
getProperty(dbusapi.PropertyServers, &servers)
getProperty(dbusapi.PropertyOCRunning, &ocRunning)
getProperty(dbusapi.PropertyOCPID, &ocPID)
getProperty(dbusapi.PropertyTrafPolState, &trafPolState)
getProperty(dbusapi.PropertyAllowedHosts, &allowedHosts)
getProperty(dbusapi.PropertyTNDState, &tndState)
Expand All @@ -76,6 +78,7 @@ func main() {
log.Println("ConnectedAt:", connectedAt)
log.Println("Servers:", servers)
log.Println("OCRunning:", ocRunning)
log.Println("OCPID:", ocPID)
log.Println("TrafPolState:", trafPolState)
log.Println("AllowedHosts:", allowedHosts)
log.Println("TNDState:", tndState)
Expand Down Expand Up @@ -153,6 +156,11 @@ func main() {
log.Fatal(err)
}
fmt.Println(ocRunning)
case dbusapi.PropertyOCPID:
if err := value.Store(&ocPID); err != nil {
log.Fatal(err)
}
fmt.Println(ocPID)
case dbusapi.PropertyTrafPolState:
if err := value.Store(&trafPolState); err != nil {
log.Fatal(err)
Expand Down Expand Up @@ -208,6 +216,8 @@ func main() {
servers = dbusapi.ServersInvalid
case dbusapi.PropertyOCRunning:
ocRunning = dbusapi.OCRunningUnknown
case dbusapi.PropertyOCPID:
ocPID = dbusapi.OCPIDInvalid
case dbusapi.PropertyTrafPolState:
trafPolState = dbusapi.TrafPolStateUnknown
case dbusapi.PropertyAllowedHosts:
Expand Down

0 comments on commit 28356b9

Please sign in to comment.