Generic recursive settings map dbus variants decoding
This commit is contained in:
parent
1efc60bbcd
commit
24634585a3
2 changed files with 205 additions and 23 deletions
|
@ -101,7 +101,7 @@ func (c *connection) GetSettings() (ConnectionSettings, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return variantMapToSettings(settings), nil
|
return decodeSettings(settings), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *connection) GetSecrets(settingName string) (ConnectionSettings, error) {
|
func (c *connection) GetSecrets(settingName string) (ConnectionSettings, error) {
|
||||||
|
@ -111,35 +111,44 @@ func (c *connection) GetSecrets(settingName string) (ConnectionSettings, error)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return variantMapToSettings(settings), nil
|
return decodeSettings(settings), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func variantMapToSettings(variantMap map[string]map[string]dbus.Variant) (settings ConnectionSettings) {
|
func decodeSettings(input map[string]map[string]dbus.Variant) (settings ConnectionSettings) {
|
||||||
settings = make(ConnectionSettings)
|
valueMap := ConnectionSettings{}
|
||||||
for k1, v1 := range variantMap {
|
for key, data := range input {
|
||||||
settings[k1] = make(map[string]interface{})
|
valueMap[key] = decode(data).(map[string]interface{})
|
||||||
|
|
||||||
for k2, v2 := range v1 {
|
|
||||||
v2Value := v2.Value()
|
|
||||||
if variant, isVariant := v2Value.([]map[string]dbus.Variant); isVariant {
|
|
||||||
var v2Values []map[string]interface{}
|
|
||||||
|
|
||||||
for _, arrayItem := range variant {
|
|
||||||
arrayValues := make(map[string]interface{})
|
|
||||||
for k3, v3 := range arrayItem {
|
|
||||||
arrayValues[k3] = v3.Value()
|
|
||||||
}
|
}
|
||||||
v2Values = append(v2Values, arrayValues)
|
return valueMap
|
||||||
}
|
}
|
||||||
|
|
||||||
settings[k1][k2] = v2Values
|
func decode(input interface{}) (value interface{}) {
|
||||||
|
if variant, isVariant := input.(dbus.Variant); isVariant {
|
||||||
|
return decode(variant.Value())
|
||||||
} else {
|
} else {
|
||||||
settings[k1][k2] = v2Value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
if inputMap, isMap := input.(map[string]dbus.Variant); isMap {
|
||||||
|
valueMap := map[string]interface{}{}
|
||||||
|
for key, data := range inputMap {
|
||||||
|
valueMap[key] = decode(data)
|
||||||
|
}
|
||||||
|
return valueMap
|
||||||
|
} else if inputArray, isArray := input.([]interface{}); isArray {
|
||||||
|
var valueArray []interface{}
|
||||||
|
for _, data := range inputArray {
|
||||||
|
valueArray = append(valueArray, decode(data))
|
||||||
|
}
|
||||||
|
return valueArray
|
||||||
|
} else if inputArray, isArray := input.([]map[string]dbus.Variant); isArray {
|
||||||
|
var valueArray []interface{}
|
||||||
|
for _, data := range inputArray {
|
||||||
|
valueArray = append(valueArray, decode(data))
|
||||||
|
}
|
||||||
|
return valueArray
|
||||||
|
} else {
|
||||||
|
return input
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *connection) ClearSecrets() error {
|
func (c *connection) ClearSecrets() error {
|
||||||
|
|
173
Connection_test.go
Normal file
173
Connection_test.go
Normal file
|
@ -0,0 +1,173 @@
|
||||||
|
package gonetworkmanager
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/godbus/dbus/v5"
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestDecodeSettings(t *testing.T) {
|
||||||
|
settings := map[string]map[string]dbus.Variant{
|
||||||
|
"ipv4": {
|
||||||
|
"address-data": dbus.MakeVariant([]map[string]dbus.Variant{
|
||||||
|
{
|
||||||
|
"address": dbus.MakeVariant("192.168.1.156"),
|
||||||
|
"prefix": dbus.MakeVariant(24),
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
"dns-search": dbus.MakeVariant([]string{}),
|
||||||
|
"method": dbus.MakeVariant("manual"),
|
||||||
|
"route-data": dbus.MakeVariant([]map[string]dbus.Variant{}),
|
||||||
|
"routes": dbus.MakeVariant([][]uint32{}),
|
||||||
|
"addresses": dbus.MakeVariant([][]uint32{
|
||||||
|
{
|
||||||
|
2617354432,
|
||||||
|
24,
|
||||||
|
16885952,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
"gateway": dbus.MakeVariant("192.168.1.1"),
|
||||||
|
"route-metric": dbus.MakeVariant(100),
|
||||||
|
"dhcp-timeout": dbus.MakeVariant(45),
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"addr-gen-mode": dbus.MakeVariant(3),
|
||||||
|
"address-data": dbus.MakeVariant([]map[string]dbus.Variant{}),
|
||||||
|
"routes": dbus.MakeVariant([][]interface{}{}),
|
||||||
|
"dns-search": dbus.MakeVariant([]string{}),
|
||||||
|
"method": dbus.MakeVariant("auto"),
|
||||||
|
"route-data": dbus.MakeVariant([]map[string]dbus.Variant{}),
|
||||||
|
"dhcp-timeout": dbus.MakeVariant(45),
|
||||||
|
"route-metric": dbus.MakeVariant(100),
|
||||||
|
"addresses": dbus.MakeVariant([][]interface{}{}),
|
||||||
|
},
|
||||||
|
"proxy": {},
|
||||||
|
"connection": {
|
||||||
|
"uuid": dbus.MakeVariant("390e5c2b-7312-415e-80e6-7b94a5c24fc3"),
|
||||||
|
"autoconnect-priority": dbus.MakeVariant(1),
|
||||||
|
"autoconnect-retries": dbus.MakeVariant(0),
|
||||||
|
"id": dbus.MakeVariant("main"),
|
||||||
|
"interface-name": dbus.MakeVariant("eth0"),
|
||||||
|
"permissions": dbus.MakeVariant([]string{}),
|
||||||
|
"timestamp": dbus.MakeVariant(1669049774),
|
||||||
|
"type": dbus.MakeVariant("802-3-ethernet"),
|
||||||
|
},
|
||||||
|
"802-3-ethernet": {
|
||||||
|
"auto-negotiate": dbus.MakeVariant(false),
|
||||||
|
"mac-address-blacklist": dbus.MakeVariant([]string{}),
|
||||||
|
"s390-options": dbus.MakeVariant(map[string]string{}),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
result := decodeSettings(settings)
|
||||||
|
|
||||||
|
expected := ConnectionSettings{
|
||||||
|
"ipv4": {
|
||||||
|
"address-data": []interface{}{
|
||||||
|
map[string]interface{}{
|
||||||
|
"address": "192.168.1.156",
|
||||||
|
"prefix": 24,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"dns-search": []string{},
|
||||||
|
"method": "manual",
|
||||||
|
"route-data": []interface{}(nil),
|
||||||
|
"routes": [][]uint32{},
|
||||||
|
"addresses": [][]uint32{
|
||||||
|
{
|
||||||
|
2617354432,
|
||||||
|
24,
|
||||||
|
16885952,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"gateway": "192.168.1.1",
|
||||||
|
"route-metric": 100,
|
||||||
|
"dhcp-timeout": 45,
|
||||||
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"addr-gen-mode": 3,
|
||||||
|
"address-data": []interface{}(nil),
|
||||||
|
"routes": [][]interface{}{},
|
||||||
|
"dns-search": []string{},
|
||||||
|
"method": "auto",
|
||||||
|
"route-data": []interface{}(nil),
|
||||||
|
"dhcp-timeout": 45,
|
||||||
|
"route-metric": 100,
|
||||||
|
"addresses": [][]interface{}{},
|
||||||
|
},
|
||||||
|
"proxy": {},
|
||||||
|
"connection": {
|
||||||
|
"uuid": "390e5c2b-7312-415e-80e6-7b94a5c24fc3",
|
||||||
|
"autoconnect-priority": 1,
|
||||||
|
"autoconnect-retries": 0,
|
||||||
|
"id": "main",
|
||||||
|
"interface-name": "eth0",
|
||||||
|
"permissions": []string{},
|
||||||
|
"timestamp": 1669049774,
|
||||||
|
"type": "802-3-ethernet",
|
||||||
|
},
|
||||||
|
"802-3-ethernet": {
|
||||||
|
"auto-negotiate": false,
|
||||||
|
"mac-address-blacklist": []string{},
|
||||||
|
"s390-options": map[string]string{},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(result, expected) {
|
||||||
|
t.Fatalf("failed: \nexpected: %#v\nresult : %#v", expected, result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDecode(t *testing.T) {
|
||||||
|
ipSettings := map[string]dbus.Variant{
|
||||||
|
"address-data": dbus.MakeVariant([]map[string]dbus.Variant{
|
||||||
|
{
|
||||||
|
"address": dbus.MakeVariant("192.168.1.156"),
|
||||||
|
"prefix": dbus.MakeVariant(24),
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
"dns-search": dbus.MakeVariant([]string{}),
|
||||||
|
"method": dbus.MakeVariant("manual"),
|
||||||
|
"route-data": dbus.MakeVariant([]map[string]dbus.Variant{}),
|
||||||
|
"routes": dbus.MakeVariant([][]uint32{}),
|
||||||
|
"addresses": dbus.MakeVariant([][]uint32{
|
||||||
|
{
|
||||||
|
2617354432,
|
||||||
|
24,
|
||||||
|
16885952,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
"gateway": dbus.MakeVariant("192.168.1.1"),
|
||||||
|
"route-metric": dbus.MakeVariant(100),
|
||||||
|
"dhcp-timeout": dbus.MakeVariant(45),
|
||||||
|
}
|
||||||
|
|
||||||
|
result := decode(ipSettings)
|
||||||
|
|
||||||
|
expected := map[string]interface{}{
|
||||||
|
"address-data": []interface{}{
|
||||||
|
map[string]interface{}{
|
||||||
|
"address": "192.168.1.156",
|
||||||
|
"prefix": 24,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"dns-search": []string{},
|
||||||
|
"method": "manual",
|
||||||
|
"route-data": []interface{}(nil),
|
||||||
|
"routes": [][]uint32{},
|
||||||
|
"addresses": [][]uint32{
|
||||||
|
{
|
||||||
|
2617354432,
|
||||||
|
24,
|
||||||
|
16885952,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"gateway": "192.168.1.1",
|
||||||
|
"route-metric": 100,
|
||||||
|
"dhcp-timeout": 45,
|
||||||
|
}
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(result, expected) {
|
||||||
|
t.Fatalf("failed: \nexpected: %#v\nresult : %#v", expected, result)
|
||||||
|
}
|
||||||
|
}
|
Reference in a new issue