diff --git a/uci_network_interface.go b/uci_network_interface.go new file mode 100644 index 0000000..881d407 --- /dev/null +++ b/uci_network_interface.go @@ -0,0 +1,86 @@ +package owrt + +import "fmt" + +// UCINetworkInterface describes uci network inteface (uci show network) +type UCINetworkInterface struct { + uciClient *UCI + Name string + Proto string + IFName string + IPAddr string + Netmask string + DNS string + IFType string + Metric string +} + +// NewUCINetworkInterface builds a new UCIWirelessConf instance +func NewUCINetworkInterface(uci *UCI) *UCINetworkInterface { + return &UCINetworkInterface{ + uciClient: uci, + } +} + +// Create add a new entry for wifi interface in UCI Configuration +func (ni *UCINetworkInterface) Create(uci *UCI) *Action { + conf := make(map[string]string) + + conf["proto"] = ni.Proto + conf["ifname"] = ni.IFName + conf["ipaddr"] = ni.IPAddr + conf["netmask"] = ni.Netmask + conf["dns"] = ni.DNS + conf["type"] = ni.IFType + conf["metric"] = ni.Metric + + result := uci.Set(fmt.Sprintf("network.%s", ni.Name), "interface") + if result.ReturnCode != 0 { + return result + } + for key, value := range conf { + result := uci.Set(fmt.Sprintf("network.%s.%s", ni.Name, key), value) + if result.ReturnCode != 0 { + return result + } + } + + return &Action{ + CommandResult: &CommandResult{ + Stdout: "", + Stderr: "", + ReturnCode: 0, + }, + } +} + +// Save commit and relaod configuration (writes it to files !) +func (ni *UCINetworkInterface) Save(uci *UCI) *Action { + commitRes := uci.Commit() + if commitRes.ReturnCode != 0 { + return commitRes + } + + reload := uci.Reload() + return reload +} + +// Delete remove wifi interface from UCI Configuration +func (ni *UCINetworkInterface) Delete(uci *UCI) *Action { + toDelete := fmt.Sprintf("network.%s", ni.Name) + del := uci.Delete(toDelete) + if del.ReturnCode != 0 { + return del + } + return uci.Commit() +} + +// Update add a new entry for wifi interface in UCI Configuration +func (ni *UCINetworkInterface) Update(uci *UCI) *Action { + ni.Delete(uci) + create := ni.Create(uci) + if create.ReturnCode != 0 { + return create + } + return uci.Commit() +} diff --git a/uci_network_interface_test.go b/uci_network_interface_test.go new file mode 100644 index 0000000..a7896d0 --- /dev/null +++ b/uci_network_interface_test.go @@ -0,0 +1,79 @@ +package owrt + +import ( + "testing" +) + +const ( + ifName = "cadoles" + ifProto = "static" + ifIFName = "cdl-fake" + ifIPAddr = "192.168.59.1" + ifNetmask = "255.255.255.0" + ifDNS = "192.168.59.1" + ifIFType = "bridge" + ifMetric = "9000" +) + +func TestNetCreate(t *testing.T) { + exec := createMockExecutor("", "", 0) + uci := NewUCIWithExecutor(exec) + + iface := NewUCINetworkInterface(uci) + iface.Name = ifName + iface.Proto = ifProto + iface.IFName = ifIFName + iface.IPAddr = ifIPAddr + iface.Netmask = ifNetmask + iface.DNS = ifDNS + iface.IFType = ifIFType + iface.Metric = ifMetric + + if iface.Create(uci).ReturnCode != 0 { + t.Fatalf("UCINetworkInterface.Create() failed !") + } +} + +func TestNetUpdate(t *testing.T) { + exec := createMockExecutor("", "", 0) + uci := NewUCIWithExecutor(exec) + + iface := NewUCINetworkInterface(uci) + iface.Name = ifName + iface.Proto = ifProto + iface.IFName = ifIFName + iface.IPAddr = ifIPAddr + iface.Netmask = ifNetmask + iface.DNS = ifDNS + iface.IFType = ifIFType + iface.Metric = ifMetric + + if iface.Create(uci).ReturnCode != 0 { + t.Fatalf("UCINetworkInterface.Create() failed !") + } + + iface.Metric = "1000" + + if iface.Update(uci).ReturnCode != 0 { + t.Fatalf("UCINetworkInterface.Update() failed !") + } +} + +func TestNetDelete(t *testing.T) { + exec := createMockExecutor("", "", 0) + uci := NewUCIWithExecutor(exec) + + iface := NewUCINetworkInterface(uci) + iface.Name = ifName + iface.Proto = ifProto + iface.IFName = ifIFName + iface.IPAddr = ifIPAddr + iface.Netmask = ifNetmask + iface.DNS = ifDNS + iface.IFType = ifIFType + iface.Metric = ifMetric + + if iface.Delete(uci).ReturnCode != 0 { + t.Fatalf("UCINetworkInterface.Delete() failed !") + } +}