Skip to content

Commit 79fcc1b

Browse files
authored
feat: add cmd route add and route delete for route management (#711)
1 parent cf473d8 commit 79fcc1b

File tree

168 files changed

+30715
-533
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

168 files changed

+30715
-533
lines changed

cmd/kubevpn/cmds/root.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ func NewKubeVPNCommand() *cobra.Command {
7676
CmdStatus(factory),
7777
CmdAlias(factory),
7878
CmdConnection(factory),
79+
CmdRoute(factory),
7980
CmdSSH(factory),
8081
CmdSSHDaemon(factory),
8182
CmdImageCopy(factory),

cmd/kubevpn/cmds/route.go

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package cmds
2+
3+
import (
4+
"fmt"
5+
"net"
6+
"os"
7+
8+
"github.com/spf13/cobra"
9+
cmdutil "k8s.io/kubectl/pkg/cmd/util"
10+
"k8s.io/kubectl/pkg/util/i18n"
11+
"k8s.io/kubectl/pkg/util/templates"
12+
13+
"github.com/wencaiwulue/kubevpn/v2/pkg/daemon"
14+
"github.com/wencaiwulue/kubevpn/v2/pkg/daemon/rpc"
15+
plog "github.com/wencaiwulue/kubevpn/v2/pkg/log"
16+
)
17+
18+
// CmdRoute
19+
func CmdRoute(f cmdutil.Factory) *cobra.Command {
20+
cmd := &cobra.Command{
21+
Use: "route",
22+
Short: "Route table management",
23+
}
24+
cmd.AddCommand(CmdRouteAdd(f))
25+
cmd.AddCommand(CmdRouteDelete(f))
26+
return cmd
27+
}
28+
29+
func CmdRouteAdd(cmdutil.Factory) *cobra.Command {
30+
cmd := &cobra.Command{
31+
Use: "add",
32+
Short: "Add a route",
33+
Long: templates.LongDesc(i18n.T(`
34+
Add a route
35+
`)),
36+
Example: templates.Examples(i18n.T(`
37+
# Add a route to current connection tun device
38+
kubevpn route add 198.19.0.1/32
39+
# Query current connection tun device
40+
kubevpn status
41+
`)),
42+
PreRunE: func(cmd *cobra.Command, args []string) error {
43+
plog.InitLoggerForClient()
44+
return daemon.StartupDaemon(cmd.Context())
45+
},
46+
Args: cobra.MatchAll(cobra.ExactArgs(1)),
47+
RunE: func(cmd *cobra.Command, args []string) error {
48+
cli, err := daemon.GetClient(false)
49+
if err != nil {
50+
return err
51+
}
52+
_, cidr, err := net.ParseCIDR(args[0])
53+
if err != nil {
54+
return err
55+
}
56+
resp, err := cli.Route(cmd.Context(), &rpc.RouteRequest{Cidr: cidr.String(), Type: rpc.RouteType_ROUTE_ADD})
57+
if err != nil {
58+
return err
59+
}
60+
_, err = fmt.Fprint(os.Stdout, resp.Message)
61+
return err
62+
},
63+
}
64+
return cmd
65+
}
66+
67+
func CmdRouteDelete(cmdutil.Factory) *cobra.Command {
68+
cmd := &cobra.Command{
69+
Use: "delete",
70+
Short: "Delete a specific route",
71+
Long: templates.LongDesc(i18n.T(`
72+
Delete a specific route
73+
`)),
74+
Example: templates.Examples(i18n.T(`
75+
# Delete a specific route
76+
kubevpn route delete 198.19.0.1/32
77+
# Query current connection tun device
78+
kubevpn status
79+
`)),
80+
PreRunE: func(cmd *cobra.Command, args []string) error {
81+
plog.InitLoggerForClient()
82+
return daemon.StartupDaemon(cmd.Context())
83+
},
84+
Args: cobra.MatchAll(cobra.ExactArgs(1)),
85+
RunE: func(cmd *cobra.Command, args []string) error {
86+
cli, err := daemon.GetClient(false)
87+
if err != nil {
88+
return err
89+
}
90+
_, cidr, err := net.ParseCIDR(args[0])
91+
if err != nil {
92+
return err
93+
}
94+
resp, err := cli.Route(cmd.Context(), &rpc.RouteRequest{Cidr: cidr.String(), Type: rpc.RouteType_ROUTE_DELETE})
95+
if err != nil {
96+
return err
97+
}
98+
_, err = fmt.Fprint(os.Stdout, resp.Message)
99+
return err
100+
},
101+
}
102+
return cmd
103+
}

go.mod

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,12 @@ require (
4242
github.com/spf13/pflag v1.0.6
4343
github.com/syncthing/syncthing v1.29.2
4444
github.com/thejerf/suture/v4 v4.0.6
45+
github.com/vishvananda/netlink v1.3.1
4546
go.uber.org/automaxprocs v1.6.0
4647
golang.org/x/crypto v0.37.0
4748
golang.org/x/net v0.39.0
4849
golang.org/x/oauth2 v0.28.0
49-
golang.org/x/sys v0.32.0
50+
golang.org/x/sys v0.35.0
5051
golang.org/x/term v0.31.0
5152
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2
5253
golang.zx2c4.com/wireguard v0.0.0-20220920152132-bb719d3a6e2c
@@ -233,7 +234,7 @@ require (
233234
github.com/tklauser/go-sysconf v0.3.14 // indirect
234235
github.com/tklauser/numcpus v0.9.0 // indirect
235236
github.com/ulikunitz/xz v0.5.12 // indirect
236-
github.com/vishvananda/netns v0.0.4 // indirect
237+
github.com/vishvananda/netns v0.0.5 // indirect
237238
github.com/vitrun/qart v0.0.0-20160531060029-bf64b92db6b0 // indirect
238239
github.com/x448/float16 v0.8.4 // indirect
239240
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect

go.sum

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -649,9 +649,11 @@ github.com/tklauser/numcpus v0.9.0 h1:lmyCHtANi8aRUgkckBgoDk1nHCux3n2cgkJLXdQGPD
649649
github.com/tklauser/numcpus v0.9.0/go.mod h1:SN6Nq1O3VychhC1npsWostA+oW+VOQTxZrS604NSRyI=
650650
github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
651651
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
652+
github.com/vishvananda/netlink v1.3.1 h1:3AEMt62VKqz90r0tmNhog0r/PpWKmrEShJU0wJW6bV0=
653+
github.com/vishvananda/netlink v1.3.1/go.mod h1:ARtKouGSTGchR8aMwmkzC0qiNPrrWO5JS/XMVl45+b4=
652654
github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
653-
github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8=
654-
github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
655+
github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY=
656+
github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
655657
github.com/vitrun/qart v0.0.0-20160531060029-bf64b92db6b0 h1:okhMind4q9H1OxF44gNegWkiP4H/gsTFLalHFa4OOUI=
656658
github.com/vitrun/qart v0.0.0-20160531060029-bf64b92db6b0/go.mod h1:TTbGUfE+cXXceWtbTHq6lqcTvYPBKLNejBEbnUsQJtU=
657659
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
@@ -832,16 +834,18 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc
832834
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
833835
golang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
834836
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
837+
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
835838
golang.org/x/sys v0.4.1-0.20230131160137-e7d7f63158de/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
836839
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
837840
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
838841
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
842+
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
839843
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
840844
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
841845
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
842846
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
843-
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
844-
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
847+
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
848+
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
845849
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
846850
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
847851
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=

pkg/daemon/action/route.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package action
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"io"
7+
"net"
8+
9+
"github.com/containernetworking/cni/pkg/types"
10+
log "github.com/sirupsen/logrus"
11+
12+
"github.com/wencaiwulue/kubevpn/v2/pkg/daemon/rpc"
13+
plog "github.com/wencaiwulue/kubevpn/v2/pkg/log"
14+
"github.com/wencaiwulue/kubevpn/v2/pkg/tun"
15+
)
16+
17+
func (svr *Server) Route(ctx context.Context, req *rpc.RouteRequest) (*rpc.RouteResponse, error) {
18+
if !svr.IsSudo {
19+
logger := plog.GetLoggerForClient(int32(log.InfoLevel), io.MultiWriter(svr.LogFile))
20+
var index = -1
21+
for i, connection := range svr.connections {
22+
if connection.GetConnectionID() == svr.currentConnectionID {
23+
index = i
24+
break
25+
}
26+
}
27+
if index == -1 {
28+
logger.Infof("No connection found")
29+
return nil, fmt.Errorf("no connection found")
30+
}
31+
32+
tunName, err := svr.connections[index].GetTunDeviceName()
33+
if err != nil {
34+
return nil, err
35+
}
36+
_, ipNet, err := net.ParseCIDR(req.Cidr)
37+
if err != nil {
38+
return nil, err
39+
}
40+
client, err := svr.GetClient(true)
41+
if err != nil {
42+
return nil, err
43+
}
44+
return client.Route(ctx, &rpc.RouteRequest{
45+
Cidr: ipNet.String(),
46+
Type: req.Type,
47+
Dev: tunName,
48+
})
49+
} else {
50+
_, ipNet, err := net.ParseCIDR(req.Cidr)
51+
if err != nil {
52+
return nil, err
53+
}
54+
switch req.Type {
55+
case rpc.RouteType_ROUTE_ADD:
56+
err = tun.AddRoutes(req.Dev, types.Route{Dst: *ipNet})
57+
case rpc.RouteType_ROUTE_DELETE:
58+
err = tun.DeleteRoutes(req.Dev, types.Route{Dst: *ipNet})
59+
}
60+
if err != nil {
61+
return nil, err
62+
}
63+
return &rpc.RouteResponse{
64+
Message: "ok",
65+
}, nil
66+
}
67+
}

0 commit comments

Comments
 (0)