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 variantMapToSettings(settings), nil
|
||||
return decodeSettings(settings), nil
|
||||
}
|
||||
|
||||
func (c *connection) GetSecrets(settingName string) (ConnectionSettings, error) {
|
||||
|
@ -111,35 +111,44 @@ func (c *connection) GetSecrets(settingName string) (ConnectionSettings, error)
|
|||
return nil, err
|
||||
}
|
||||
|
||||
return variantMapToSettings(settings), nil
|
||||
return decodeSettings(settings), nil
|
||||
}
|
||||
|
||||
func variantMapToSettings(variantMap map[string]map[string]dbus.Variant) (settings ConnectionSettings) {
|
||||
settings = make(ConnectionSettings)
|
||||
for k1, v1 := range variantMap {
|
||||
settings[k1] = make(map[string]interface{})
|
||||
func decodeSettings(input map[string]map[string]dbus.Variant) (settings ConnectionSettings) {
|
||||
valueMap := ConnectionSettings{}
|
||||
for key, data := range input {
|
||||
valueMap[key] = decode(data).(map[string]interface{})
|
||||
}
|
||||
return valueMap
|
||||
}
|
||||
|
||||
for k2, v2 := range v1 {
|
||||
v2Value := v2.Value()
|
||||
if variant, isVariant := v2Value.([]map[string]dbus.Variant); isVariant {
|
||||
var v2Values []map[string]interface{}
|
||||
func decode(input interface{}) (value interface{}) {
|
||||
if variant, isVariant := input.(dbus.Variant); isVariant {
|
||||
return decode(variant.Value())
|
||||
} else {
|
||||
|
||||
for _, arrayItem := range variant {
|
||||
arrayValues := make(map[string]interface{})
|
||||
for k3, v3 := range arrayItem {
|
||||
arrayValues[k3] = v3.Value()
|
||||
}
|
||||
v2Values = append(v2Values, arrayValues)
|
||||
}
|
||||
|
||||
settings[k1][k2] = v2Values
|
||||
} else {
|
||||
settings[k1][k2] = v2Value
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
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