wip v1.0.0
This commit is contained in:
81
pkg/netif/interface.go
Normal file
81
pkg/netif/interface.go
Normal file
@@ -0,0 +1,81 @@
|
||||
package netif
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/vishvananda/netlink"
|
||||
)
|
||||
|
||||
type Interface struct {
|
||||
Name string
|
||||
Index int
|
||||
Link netlink.Link
|
||||
}
|
||||
|
||||
func GetInterface(name string) (*Interface, error) {
|
||||
link, err := netlink.LinkByName(name)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to find interface %s: %w", name, err)
|
||||
}
|
||||
|
||||
return &Interface{
|
||||
Name: name,
|
||||
Index: link.Attrs().Index,
|
||||
Link: link,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (iface *Interface) AddIP(ipCIDR string) error {
|
||||
addr, err := netlink.ParseAddr(ipCIDR)
|
||||
if err != nil {
|
||||
return fmt.Errorf("invalid IP address %s: %w", ipCIDR, err)
|
||||
}
|
||||
|
||||
if err := netlink.AddrAdd(iface.Link, addr); err != nil {
|
||||
return fmt.Errorf("failed to add IP %s to %s: %w", ipCIDR, iface.Name, err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (iface *Interface) DeleteIP(ipCIDR string) error {
|
||||
addr, err := netlink.ParseAddr(ipCIDR)
|
||||
if err != nil {
|
||||
return fmt.Errorf("invalid IP address %s: %w", ipCIDR, err)
|
||||
}
|
||||
|
||||
if err := netlink.AddrDel(iface.Link, addr); err != nil {
|
||||
return fmt.Errorf("failed to delete IP %s from %s: %w", ipCIDR, iface.Name, err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (iface *Interface) HasIP(ipCIDR string) (bool, error) {
|
||||
targetAddr, err := netlink.ParseAddr(ipCIDR)
|
||||
if err != nil {
|
||||
return false, fmt.Errorf("invalid IP address %s: %w", ipCIDR, err)
|
||||
}
|
||||
|
||||
addrs, err := netlink.AddrList(iface.Link, 0)
|
||||
if err != nil {
|
||||
return false, fmt.Errorf("failed to list addresses on %s: %w", iface.Name, err)
|
||||
}
|
||||
|
||||
for _, addr := range addrs {
|
||||
if addr.IPNet.String() == targetAddr.IPNet.String() {
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
|
||||
return false, nil
|
||||
}
|
||||
|
||||
func (iface *Interface) GetHardwareAddr() (net.HardwareAddr, error) {
|
||||
return iface.Link.Attrs().HardwareAddr, nil
|
||||
}
|
||||
|
||||
func (iface *Interface) IsUp() bool {
|
||||
return iface.Link.Attrs().Flags&net.FlagUp != 0
|
||||
}
|
||||
Reference in New Issue
Block a user