From 24634585a32e210893e9d5c0018e32ea26504a9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20M=C3=BCller?= Date: Tue, 22 Nov 2022 10:56:13 +0100 Subject: [PATCH] Generic recursive settings map dbus variants decoding --- Connection.go | 55 ++++++++------ Connection_test.go | 173 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 205 insertions(+), 23 deletions(-) create mode 100644 Connection_test.go diff --git a/Connection.go b/Connection.go index 44d322e..7d255ce 100644 --- a/Connection.go +++ b/Connection.go @@ -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 { diff --git a/Connection_test.go b/Connection_test.go new file mode 100644 index 0000000..f782969 --- /dev/null +++ b/Connection_test.go @@ -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) + } +}