Connect() called AddNetwork unconditionally, creating duplicate entries for the same SSID, and SelectNetwork's side-effect of disabling all other networks was being persisted by SaveConfig — making previously saved networks appear erased. Disconnect() also removed the current network from the config. Now reuse an existing network entry when the SSID matches, re-enable other networks after SelectNetwork, and keep entries on disconnect. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
65 lines
1.3 KiB
Go
65 lines
1.3 KiB
Go
package wpasupplicant
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/godbus/dbus/v5"
|
|
)
|
|
|
|
// Network represents a wpa_supplicant Network configuration object
|
|
type Network struct {
|
|
path dbus.ObjectPath
|
|
conn *dbus.Conn
|
|
obj dbus.BusObject
|
|
}
|
|
|
|
// NewNetwork creates a new Network instance
|
|
func NewNetwork(conn *dbus.Conn, path dbus.ObjectPath) *Network {
|
|
return &Network{
|
|
path: path,
|
|
conn: conn,
|
|
obj: conn.Object(Service, path),
|
|
}
|
|
}
|
|
|
|
// GetPath returns the D-Bus object path for this network
|
|
func (n *Network) GetPath() dbus.ObjectPath {
|
|
return n.path
|
|
}
|
|
|
|
// GetProperties returns properties of the network configuration
|
|
func (n *Network) GetProperties() (map[string]dbus.Variant, error) {
|
|
prop, err := n.obj.GetProperty(NetworkInterface + ".Properties")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
props, ok := prop.Value().(map[string]dbus.Variant)
|
|
if !ok {
|
|
return nil, nil
|
|
}
|
|
|
|
return props, nil
|
|
}
|
|
|
|
// GetSSID returns the configured SSID, stripping the wrapping quotes
|
|
// that wpa_supplicant stores around string-form SSIDs.
|
|
func (n *Network) GetSSID() (string, error) {
|
|
props, err := n.GetProperties()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
ssidVariant, ok := props["ssid"]
|
|
if !ok {
|
|
return "", nil
|
|
}
|
|
|
|
ssid, ok := ssidVariant.Value().(string)
|
|
if !ok {
|
|
return "", nil
|
|
}
|
|
|
|
// wpa_supplicant returns quoted SSIDs like "MyNetwork"
|
|
return strings.Trim(ssid, `"`), nil
|
|
}
|