using netlink instead exec in ip-helper

This commit is contained in:
Vladimir Avtsenov 2024-09-04 10:30:18 +03:00
parent c335a7cce6
commit 04c2cebba6

View File

@ -1,22 +1,20 @@
package main package main
import ( import (
"errors"
"fmt" "fmt"
"github.com/vishvananda/netlink"
"net" "net"
"os" "os"
"strconv"
"time" "time"
"kvas2-go/models" "kvas2-go/models"
"kvas2-go/pkg/ip-helper" "kvas2-go/pkg/ip-helper"
"github.com/vishvananda/netlink"
) )
type GroupOptions struct { type GroupOptions struct {
Enabled bool Enabled bool
FWMark uint32 ipRule *netlink.Rule
Table int
} }
type Group struct { type Group struct {
@ -60,25 +58,22 @@ func (g *Group) Enable() error {
return nil return nil
} }
fwmark, err := ipHelper.GetUnusedFwMark(1) var err error
rule := netlink.NewRule()
rule.Mark, err = ipHelper.GetUnusedFwMark(1)
if err != nil { if err != nil {
return fmt.Errorf("error while getting free fwmark: %w", err) return fmt.Errorf("error while getting free fwmark: %w", err)
} }
rule.Table, err = ipHelper.GetUnusedTable(1)
table, err := ipHelper.GetUnusedTable(1)
if err != nil { if err != nil {
return fmt.Errorf("error while getting free table: %w", err) return fmt.Errorf("error while getting free table: %w", err)
} }
err = netlink.RuleAdd(rule)
fwmarkStr := strconv.Itoa(int(fwmark))
tableStr := strconv.Itoa(int(table))
out, err := ipHelper.ExecIp("rule", "add", "fwmark", fwmarkStr, "table", tableStr)
if err != nil { if err != nil {
return err return fmt.Errorf("error while adding rule: %w", err)
}
if len(out) != 0 {
return errors.New(string(out))
} }
g.options.ipRule = rule
defaultTimeout := uint32(300) defaultTimeout := uint32(300)
err = netlink.IpsetDestroy(g.ipsetName) err = netlink.IpsetDestroy(g.ipsetName)
@ -93,8 +88,6 @@ func (g *Group) Enable() error {
} }
g.options.Enabled = true g.options.Enabled = true
g.options.FWMark = fwmark
g.options.Table = table
return nil return nil
} }
@ -104,14 +97,9 @@ func (g *Group) Disable() error {
return nil return nil
} }
fwmarkStr := strconv.Itoa(int(g.options.FWMark)) err := netlink.RuleDel(g.options.ipRule)
tableStr := strconv.Itoa(int(g.options.Table))
out, err := ipHelper.ExecIp("rule", "del", "fwmark", fwmarkStr, "table", tableStr)
if err != nil { if err != nil {
return err return fmt.Errorf("error while deleting rule: %w", err)
}
if len(out) != 0 {
return errors.New(string(out))
} }
err = netlink.IpsetDestroy(g.ipsetName) err = netlink.IpsetDestroy(g.ipsetName)
@ -120,8 +108,7 @@ func (g *Group) Disable() error {
} }
g.options.Enabled = false g.options.Enabled = false
g.options.FWMark = 0 g.options.ipRule = nil
g.options.Table = 0
return nil return nil
} }