- VRRP protocol implementation (RFC 3768/5798) - Virtual IP management (add/remove VIPs) - State machine (INIT/BACKUP/MASTER/FAULT) - Priority-based master election - Gratuitous ARP for network updates - Health checking (TCP, HTTP, ICMP, Script) - Configuration hot-reload (SIGHUP) 🤖 Generated with [Qoder][https://qoder.com]
81 lines
1.7 KiB
Go
81 lines
1.7 KiB
Go
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
|
|
} |