This repository has been archived on 2025-03-19. You can view files and clone it, but cannot push or open issues or pull requests.
gonetworkmanager/NetworkManager.go
meskedal 4c09e115f8 Fixed duplicate entries in nm and utils
After the latest merge there was a duplicate entry of AddAndActivateWirelessConnection in NetworkManager.go
which has been removed. There was also duplicate functions call2 and
callError2 in utils.go. The duplicate of AddAndActivateWirelessConnection referenced
callError2, and both of these duplicates has been removed.
2019-06-29 23:53:31 +02:00

161 lines
4.7 KiB
Go

package gonetworkmanager
import (
"encoding/json"
"github.com/godbus/dbus"
)
const (
NetworkManagerInterface = "org.freedesktop.NetworkManager"
NetworkManagerObjectPath = "/org/freedesktop/NetworkManager"
NetworkManagerGetDevices = NetworkManagerInterface + ".GetDevices"
NetworkManagerActivateConnection = NetworkManagerInterface + ".ActivateConnection"
NetworkManagerAddAndActivateConnection = NetworkManagerInterface + ".AddAndActivateConnection"
NetworkManagerPropertyState = NetworkManagerInterface + ".State"
NetworkManagerPropertyActiveConnection = NetworkManagerInterface + ".ActiveConnections"
)
type NetworkManager interface {
// GetDevices gets the list of network devices.
GetDevices() ([]Device, error)
// GetState returns the overall networking state as determined by the
// NetworkManager daemon, based on the state of network devices under it's
// management.
GetState() (NmState, error)
// GetActiveConnections returns the active connection of network devices.
GetActiveConnections() ([]ActiveConnection, error)
// ActivateWirelessConnection requests activating access point to network device
ActivateWirelessConnection(connection Connection, device Device, accessPoint AccessPoint) (ActiveConnection, error)
// AddAndActivateWirelessConnection adds a new connection profile to the network device it has been
// passed. It then activates the connection to the passed access point. The first paramter contains
// additional information for the connection (most propably the credentials).
// Example contents for connection are:
// connection := make(map[string]map[string]interface{})
// connection["802-11-wireless"] = make(map[string]interface{})
// connection["802-11-wireless"]["security"] = "802-11-wireless-security"
// connection["802-11-wireless-security"] = make(map[string]interface{})
// connection["802-11-wireless-security"]["key-mgmt"] = "wpa-psk"
// connection["802-11-wireless-security"]["psk"] = password
AddAndActivateWirelessConnection(connection map[string]map[string]interface{}, device Device, accessPoint AccessPoint) (ac ActiveConnection, err error)
Subscribe() <-chan *dbus.Signal
Unsubscribe()
MarshalJSON() ([]byte, error)
}
func NewNetworkManager() (NetworkManager, error) {
var nm networkManager
return &nm, nm.init(NetworkManagerInterface, NetworkManagerObjectPath)
}
type networkManager struct {
dbusBase
sigChan chan *dbus.Signal
}
func (n *networkManager) GetDevices() ([]Device, error) {
var devicePaths []dbus.ObjectPath
err := n.call(&devicePaths, NetworkManagerGetDevices)
if err != nil {
return nil, err
}
devices := make([]Device, len(devicePaths))
for i, path := range devicePaths {
devices[i], err = DeviceFactory(path)
if err != nil {
return nil, err
}
}
return devices, nil
}
func (n *networkManager) GetState() (NmState, error) {
r, err := n.getUint32Property(NetworkManagerPropertyState)
if err != nil {
return NmStateUnknown, err
}
return NmState(r), nil
}
func (n *networkManager) GetActiveConnections() ([]ActiveConnection, error) {
acPaths, err := n.getSliceObjectProperty(NetworkManagerPropertyActiveConnection)
if err != nil {
return nil, err
}
ac := make([]ActiveConnection, len(acPaths))
for i, path := range acPaths {
ac[i], err = NewActiveConnection(path)
if err != nil {
return nil, err
}
}
return ac, nil
}
func (n *networkManager) ActivateWirelessConnection(c Connection, d Device, ap AccessPoint) (ActiveConnection, error) {
var opath dbus.ObjectPath
return nil, n.call(&opath, NetworkManagerActivateConnection, c.GetPath(), d.GetPath(), ap.GetPath())
}
func (n *networkManager) AddAndActivateWirelessConnection(connection map[string]map[string]interface{}, d Device, ap AccessPoint) (ac ActiveConnection, err error) {
var opath1 dbus.ObjectPath
var opath2 dbus.ObjectPath
err = n.call2(&opath1, &opath2, NetworkManagerAddAndActivateConnection, connection, d.GetPath(), ap.GetPath())
if err != nil {
return
}
ac, err = NewActiveConnection(opath2)
if err != nil {
return
}
return
}
func (n *networkManager) Subscribe() <-chan *dbus.Signal {
if n.sigChan != nil {
return n.sigChan
}
n.subscribeNamespace(NetworkManagerObjectPath)
n.sigChan = make(chan *dbus.Signal, 10)
n.conn.Signal(n.sigChan)
return n.sigChan
}
func (n *networkManager) Unsubscribe() {
n.conn.RemoveSignal(n.sigChan)
n.sigChan = nil
}
func (n *networkManager) MarshalJSON() ([]byte, error) {
NetworkState, err := n.GetState()
if err != nil {
return nil, err
}
Devices, err := n.GetDevices()
if err != nil {
return nil, err
}
return json.Marshal(map[string]interface{}{
"NetworkState": NetworkState.String(),
"Devices": Devices,
})
}