Files
openlan/pkg/api/api.go
2025-09-05 11:04:33 +08:00

179 lines
3.4 KiB
Go
Executable File

package api
import (
"net"
co "github.com/luscis/openlan/pkg/config"
"github.com/luscis/openlan/pkg/libol"
cn "github.com/luscis/openlan/pkg/network"
"github.com/luscis/openlan/pkg/schema"
)
type Rater interface {
AddRate(device string, mbit int)
DelRate(device string)
}
type Switcher interface {
UUID() string
UpTime() int64
Alias() string
Config() *co.Switch
Server() libol.SocketServer
Reload()
Save()
AddNetwork(network string)
DelNetwork(network string)
SaveNetwork(network string)
Rater
}
func NewWorkerSchema(s Switcher) schema.Worker {
protocol := ""
if cfg := s.Config(); cfg != nil {
protocol = cfg.Protocol
}
return schema.Worker{
UUID: s.UUID(),
Uptime: s.UpTime(),
Alias: s.Alias(),
Protocol: protocol,
}
}
type ACLer interface {
AddRule(rule *schema.ACLRule) error
DelRule(rule *schema.ACLRule) error
ListRules(call func(obj schema.ACLRule))
SaveRule()
}
type ZTruster interface {
AddGuest(name, source string) error
DelGuest(name, source string) error
Knock(name string, protocol, dest, port string, age int) error
ListGuest(call func(obj schema.ZGuest))
ListKnock(name string, call func(obj schema.KnockRule))
}
type Router interface {
AddRoute(route *schema.PrefixRoute, switcher Switcher) error
DelRoute(route *schema.PrefixRoute, switcher Switcher) error
ListRoute(call func(obj schema.PrefixRoute))
SaveRoute()
}
type VPNer interface {
RestartVPN()
}
type Qoser interface {
AddQos(name string, inSpeed float64) error
UpdateQos(name string, inSpeed float64) error
DelQos(name string) error
ListQos(call func(obj schema.Qos))
SaveQos()
}
type Outputer interface {
AddOutput(data schema.Output)
DelOutput(data schema.Output)
SaveOutput()
}
type FindHoper interface {
AddHop(data schema.FindHop) error
DelHop(data schema.FindHop) error
ListHop(call func(obj schema.FindHop))
SaveHop()
}
type Super interface {
String() string
ID() string
Initialize()
Start(v Switcher)
Stop()
Reload(v Switcher)
}
type Networker interface {
Super
Config() *co.Network
Subnet() *net.IPNet
Provider() string
IfAddr() string
SetMss(mss int)
Outputer
Router
VPNer
Bridger() cn.Bridger
ZTruster() ZTruster
Qoser() Qoser
ACLer() ACLer
FindHoper() FindHoper
EnableZTrust()
DisableZTrust()
EnableSnat()
DisableSnat()
}
type IPSecer interface {
AddTunnel(data schema.IPSecTunnel)
DelTunnel(data schema.IPSecTunnel)
RestartTunnel(data schema.IPSecTunnel)
ListTunnels(call func(obj schema.IPSecTunnel))
}
type Bgper interface {
Enable(data schema.Bgp)
Disable()
Get() *schema.Bgp
AddNeighbor(data schema.BgpNeighbor)
DelNeighbor(data schema.BgpNeighbor)
AddReceives(data schema.BgpPrefix)
DelReceives(data schema.BgpPrefix)
AddAdvertis(data schema.BgpPrefix)
DelAdvertis(data schema.BgpPrefix)
}
type APICall struct {
secer IPSecer
bgper Bgper
workers map[string]Networker
}
func (i *APICall) AddWorker(name string, obj Networker) {
i.workers[name] = obj
}
func (i *APICall) GetWorker(name string) Networker {
return i.workers[name]
}
func (i *APICall) ListWorker(call func(w Networker)) {
for _, worker := range i.workers {
call(worker)
}
}
func (i *APICall) SetIPSecer(value IPSecer) {
i.secer = value
}
func (i *APICall) GetIPSecer() IPSecer {
return i.secer
}
func (i *APICall) SetBgper(value Bgper) {
i.bgper = value
}
func (i *APICall) GetBgper() Bgper {
return i.bgper
}
var Call = &APICall{
workers: make(map[string]Networker),
}