diff --git a/internal/agent/rendered.go b/internal/agent/rendered.go index 1a8eb9f..13fa356 100644 --- a/internal/agent/rendered.go +++ b/internal/agent/rendered.go @@ -31,6 +31,92 @@ type RenderedConfig struct { ProxyNDP []RenderedProxy `yaml:"proxy_ndp,omitempty" json:"proxy_ndp,omitempty"` ArpRules []RenderedArpRule `yaml:"arp_rules,omitempty" json:"arp_rules,omitempty"` Maclist []RenderedMaclist `yaml:"maclist,omitempty" json:"maclist,omitempty"` + Mangle []RenderedMangle `yaml:"mangle,omitempty" json:"mangle,omitempty"` + Accounting []RenderedAccounting `yaml:"accounting,omitempty" json:"accounting,omitempty"` + TCDevices []RenderedTCDevice `yaml:"tc_devices,omitempty" json:"tc_devices,omitempty"` + TCClasses []RenderedTCClass `yaml:"tc_classes,omitempty" json:"tc_classes,omitempty"` + TCFilters []RenderedTCFilter `yaml:"tc_filters,omitempty" json:"tc_filters,omitempty"` + TCInterfaces []RenderedTCInterface `yaml:"tc_interfaces,omitempty" json:"tc_interfaces,omitempty"` + TCPriorities []RenderedTCPriority `yaml:"tc_priorities,omitempty" json:"tc_priorities,omitempty"` +} + +type RenderedMangle struct { + Action string `yaml:"action" json:"action"` + Chain string `yaml:"chain,omitempty" json:"chain,omitempty"` + MarkValue string `yaml:"mark_value,omitempty" json:"mark_value,omitempty"` + Source string `yaml:"source,omitempty" json:"source,omitempty"` + Dest string `yaml:"dest,omitempty" json:"dest,omitempty"` + Proto string `yaml:"proto,omitempty" json:"proto,omitempty"` + DPort []string `yaml:"dport,omitempty" json:"dport,omitempty"` + SPort []string `yaml:"sport,omitempty" json:"sport,omitempty"` + User string `yaml:"user,omitempty" json:"user,omitempty"` + Mark string `yaml:"mark,omitempty" json:"mark,omitempty"` + Length string `yaml:"length,omitempty" json:"length,omitempty"` + TOS string `yaml:"tos,omitempty" json:"tos,omitempty"` + Helper string `yaml:"helper,omitempty" json:"helper,omitempty"` + Probability *float64 `yaml:"probability,omitempty" json:"probability,omitempty"` + Comment string `yaml:"comment,omitempty" json:"comment,omitempty"` +} + +type RenderedAccounting struct { + Action string `yaml:"action" json:"action"` + Section string `yaml:"section,omitempty" json:"section,omitempty"` + Chain string `yaml:"chain,omitempty" json:"chain,omitempty"` + Source string `yaml:"source,omitempty" json:"source,omitempty"` + Dest string `yaml:"dest,omitempty" json:"dest,omitempty"` + Proto string `yaml:"proto,omitempty" json:"proto,omitempty"` + DPort []string `yaml:"dport,omitempty" json:"dport,omitempty"` + SPort []string `yaml:"sport,omitempty" json:"sport,omitempty"` + Mark string `yaml:"mark,omitempty" json:"mark,omitempty"` + Comment string `yaml:"comment,omitempty" json:"comment,omitempty"` +} + +type RenderedTCDevice struct { + Interface string `yaml:"interface" json:"interface"` + InBandwidth string `yaml:"in_bandwidth,omitempty" json:"in_bandwidth,omitempty"` + OutBandwidth string `yaml:"out_bandwidth,omitempty" json:"out_bandwidth,omitempty"` + Comment string `yaml:"comment,omitempty" json:"comment,omitempty"` +} + +type RenderedTCClass struct { + Interface string `yaml:"interface" json:"interface"` + Mark int `yaml:"mark,omitempty" json:"mark,omitempty"` + Rate string `yaml:"rate,omitempty" json:"rate,omitempty"` + Ceil string `yaml:"ceil,omitempty" json:"ceil,omitempty"` + Priority int `yaml:"priority,omitempty" json:"priority,omitempty"` + Comment string `yaml:"comment,omitempty" json:"comment,omitempty"` +} + +type RenderedTCFilter struct { + Class string `yaml:"class" json:"class"` + Source string `yaml:"source,omitempty" json:"source,omitempty"` + Dest string `yaml:"dest,omitempty" json:"dest,omitempty"` + Proto string `yaml:"proto,omitempty" json:"proto,omitempty"` + DPort []string `yaml:"dport,omitempty" json:"dport,omitempty"` + SPort []string `yaml:"sport,omitempty" json:"sport,omitempty"` + TOS string `yaml:"tos,omitempty" json:"tos,omitempty"` + Length int `yaml:"length,omitempty" json:"length,omitempty"` + Priority int `yaml:"priority,omitempty" json:"priority,omitempty"` + Comment string `yaml:"comment,omitempty" json:"comment,omitempty"` +} + +type RenderedTCInterface struct { + Interface string `yaml:"interface" json:"interface"` + Type string `yaml:"type,omitempty" json:"type,omitempty"` + InBandwidth string `yaml:"in_bandwidth,omitempty" json:"in_bandwidth,omitempty"` + OutBandwidth string `yaml:"out_bandwidth,omitempty" json:"out_bandwidth,omitempty"` + Comment string `yaml:"comment,omitempty" json:"comment,omitempty"` +} + +type RenderedTCPriority struct { + Band int `yaml:"band" json:"band"` + Proto string `yaml:"proto,omitempty" json:"proto,omitempty"` + DPort []string `yaml:"dport,omitempty" json:"dport,omitempty"` + SPort []string `yaml:"sport,omitempty" json:"sport,omitempty"` + Address string `yaml:"address,omitempty" json:"address,omitempty"` + Interface string `yaml:"interface,omitempty" json:"interface,omitempty"` + Helper string `yaml:"helper,omitempty" json:"helper,omitempty"` + Comment string `yaml:"comment,omitempty" json:"comment,omitempty"` } type RenderedTunnel struct { diff --git a/internal/agent/translate.go b/internal/agent/translate.go index e186067..23f0736 100644 --- a/internal/agent/translate.go +++ b/internal/agent/translate.go @@ -143,6 +143,53 @@ func Translate(rc *RenderedConfig) (*config.Config, error) { }) } + for _, m := range rc.Mangle { + mr := config.MangleRule{ + Action: config.MangleAction(m.Action), Chain: config.MangleChain(m.Chain), MarkValue: m.MarkValue, + Source: m.Source, Dest: m.Dest, Proto: m.Proto, DPort: config.PortSpec(m.DPort), SPort: config.PortSpec(m.SPort), + User: m.User, Mark: m.Mark, Length: m.Length, TOS: m.TOS, Helper: m.Helper, Comment: m.Comment, + } + if m.Probability != nil { + mr.Probability = *m.Probability + } + cfg.Mangle = append(cfg.Mangle, mr) + } + for _, a := range rc.Accounting { + cfg.Accounting = append(cfg.Accounting, config.AccountingRule{ + Action: config.AccountingAction(a.Action), Section: config.AccountingSection(a.Section), Chain: a.Chain, + Source: a.Source, Dest: a.Dest, Proto: a.Proto, DPort: config.PortSpec(a.DPort), SPort: config.PortSpec(a.SPort), + Mark: a.Mark, Comment: a.Comment, + }) + } + for _, t := range rc.TCDevices { + cfg.TCDevices = append(cfg.TCDevices, config.TCDevice{ + Interface: t.Interface, InBandwidth: t.InBandwidth, OutBandwidth: t.OutBandwidth, Comment: t.Comment, + }) + } + for _, t := range rc.TCClasses { + cfg.TCClasses = append(cfg.TCClasses, config.TCClass{ + Interface: t.Interface, Mark: t.Mark, Rate: t.Rate, Ceil: t.Ceil, Priority: t.Priority, Comment: t.Comment, + }) + } + for _, t := range rc.TCFilters { + cfg.TCFilters = append(cfg.TCFilters, config.TCFilter{ + Class: t.Class, Source: t.Source, Dest: t.Dest, Proto: t.Proto, + DPort: config.PortSpec(t.DPort), SPort: config.PortSpec(t.SPort), + TOS: t.TOS, Length: t.Length, Priority: t.Priority, Comment: t.Comment, + }) + } + for _, t := range rc.TCInterfaces { + cfg.TCInterfaces = append(cfg.TCInterfaces, config.TCInterface{ + Interface: t.Interface, Type: t.Type, InBandwidth: t.InBandwidth, OutBandwidth: t.OutBandwidth, Comment: t.Comment, + }) + } + for _, t := range rc.TCPriorities { + cfg.TCPriorities = append(cfg.TCPriorities, config.TCPriority{ + Band: t.Band, Proto: t.Proto, DPort: config.PortSpec(t.DPort), SPort: config.PortSpec(t.SPort), + Address: t.Address, Interface: t.Interface, Helper: t.Helper, Comment: t.Comment, + }) + } + return cfg, nil }