mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2025-12-10 07:25:37 -05:00
111 lines
2.5 KiB
Go
111 lines
2.5 KiB
Go
package network
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"strings"
|
|
)
|
|
|
|
func (b *SystemdNetworkdBackend) GetWiredConnections() ([]WiredConnection, error) {
|
|
b.linksMutex.RLock()
|
|
defer b.linksMutex.RUnlock()
|
|
|
|
var conns []WiredConnection
|
|
for name, link := range b.links {
|
|
if b.isVirtualInterface(name) || strings.HasPrefix(name, "wlan") || strings.HasPrefix(name, "wlp") {
|
|
continue
|
|
}
|
|
|
|
active := link.opState == "routable" || link.opState == "carrier"
|
|
conns = append(conns, WiredConnection{
|
|
Path: link.path,
|
|
ID: name,
|
|
UUID: "wired:" + name,
|
|
Type: "ethernet",
|
|
IsActive: active,
|
|
})
|
|
}
|
|
|
|
return conns, nil
|
|
}
|
|
|
|
func (b *SystemdNetworkdBackend) GetWiredNetworkDetails(id string) (*WiredNetworkInfoResponse, error) {
|
|
ifname := strings.TrimPrefix(id, "wired:")
|
|
|
|
b.linksMutex.RLock()
|
|
_, exists := b.links[ifname]
|
|
b.linksMutex.RUnlock()
|
|
|
|
if !exists {
|
|
return nil, fmt.Errorf("interface %s not found", ifname)
|
|
}
|
|
|
|
iface, err := net.InterfaceByName(ifname)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("get interface: %w", err)
|
|
}
|
|
|
|
addrs, _ := iface.Addrs()
|
|
var ipv4s, ipv6s []string
|
|
for _, addr := range addrs {
|
|
if ipnet, ok := addr.(*net.IPNet); ok {
|
|
if ipv4 := ipnet.IP.To4(); ipv4 != nil {
|
|
ipv4s = append(ipv4s, ipnet.String())
|
|
} else if ipv6 := ipnet.IP.To16(); ipv6 != nil {
|
|
ipv6s = append(ipv6s, ipnet.String())
|
|
}
|
|
}
|
|
}
|
|
|
|
return &WiredNetworkInfoResponse{
|
|
UUID: id,
|
|
IFace: ifname,
|
|
HwAddr: iface.HardwareAddr.String(),
|
|
IPv4: WiredIPConfig{
|
|
IPs: ipv4s,
|
|
},
|
|
IPv6: WiredIPConfig{
|
|
IPs: ipv6s,
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func (b *SystemdNetworkdBackend) ConnectEthernet() error {
|
|
b.linksMutex.RLock()
|
|
var primaryWired *linkInfo
|
|
for name, l := range b.links {
|
|
if strings.HasPrefix(name, "lo") || strings.HasPrefix(name, "wlan") || strings.HasPrefix(name, "wlp") {
|
|
continue
|
|
}
|
|
primaryWired = l
|
|
break
|
|
}
|
|
b.linksMutex.RUnlock()
|
|
|
|
if primaryWired == nil {
|
|
return fmt.Errorf("no wired interface found")
|
|
}
|
|
|
|
linkObj := b.conn.Object(networkdBusName, primaryWired.path)
|
|
return linkObj.Call(networkdLinkIface+".Reconfigure", 0).Err
|
|
}
|
|
|
|
func (b *SystemdNetworkdBackend) DisconnectEthernet() error {
|
|
return fmt.Errorf("not supported by networkd backend")
|
|
}
|
|
|
|
func (b *SystemdNetworkdBackend) ActivateWiredConnection(id string) error {
|
|
ifname := strings.TrimPrefix(id, "wired:")
|
|
|
|
b.linksMutex.RLock()
|
|
link, exists := b.links[ifname]
|
|
b.linksMutex.RUnlock()
|
|
|
|
if !exists {
|
|
return fmt.Errorf("interface %s not found", ifname)
|
|
}
|
|
|
|
linkObj := b.conn.Object(networkdBusName, link.path)
|
|
return linkObj.Call(networkdLinkIface+".Reconfigure", 0).Err
|
|
}
|