mirror of
https://github.com/memohai/Memoh.git
synced 2026-04-27 07:16:19 +09:00
Merge branch 'refactor/channel-gateway'
This commit is contained in:
+147
@@ -1,14 +1,21 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
gocni "github.com/containerd/go-cni"
|
||||
)
|
||||
|
||||
func main() {
|
||||
@@ -16,6 +23,19 @@ func main() {
|
||||
containerID := flag.String("container-id", "", "")
|
||||
flag.Parse()
|
||||
|
||||
if len(flag.Args()) > 0 {
|
||||
switch flag.Arg(0) {
|
||||
case "cni-setup":
|
||||
os.Exit(runCNISetup(flag.Args()[1:]))
|
||||
case "cni-remove":
|
||||
os.Exit(runCNIRemove(flag.Args()[1:]))
|
||||
case "cni-check":
|
||||
os.Exit(runCNICheck(flag.Args()[1:]))
|
||||
case "cni-status":
|
||||
os.Exit(runCNIStatus(flag.Args()[1:]))
|
||||
}
|
||||
}
|
||||
|
||||
if *containerID == "" {
|
||||
os.Exit(2)
|
||||
}
|
||||
@@ -108,3 +128,130 @@ func runWithStdio(cmd *exec.Cmd) error {
|
||||
wg.Wait()
|
||||
return err
|
||||
}
|
||||
|
||||
func runCNISetup(args []string) int {
|
||||
id, netns, err := parseCNIArgs(args)
|
||||
if err != nil {
|
||||
return exitWithError(err)
|
||||
}
|
||||
cni, err := newCNIFromArgs(args)
|
||||
if err != nil {
|
||||
return exitWithError(err)
|
||||
}
|
||||
if err := cni.Load(gocni.WithLoNetwork, gocni.WithDefaultConf); err != nil {
|
||||
return exitWithError(err)
|
||||
}
|
||||
result, err := cni.Setup(context.Background(), id, netns)
|
||||
if err != nil {
|
||||
return exitWithError(err)
|
||||
}
|
||||
if result != nil {
|
||||
_ = json.NewEncoder(os.Stdout).Encode(result)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func runCNIRemove(args []string) int {
|
||||
id, netns, err := parseCNIArgs(args)
|
||||
if err != nil {
|
||||
return exitWithError(err)
|
||||
}
|
||||
cni, err := newCNIFromArgs(args)
|
||||
if err != nil {
|
||||
return exitWithError(err)
|
||||
}
|
||||
if err := cni.Load(gocni.WithLoNetwork, gocni.WithDefaultConf); err != nil {
|
||||
return exitWithError(err)
|
||||
}
|
||||
if err := cni.Remove(context.Background(), id, netns); err != nil {
|
||||
return exitWithError(err)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func runCNICheck(args []string) int {
|
||||
id, netns, err := parseCNIArgs(args)
|
||||
if err != nil {
|
||||
return exitWithError(err)
|
||||
}
|
||||
cni, err := newCNIFromArgs(args)
|
||||
if err != nil {
|
||||
return exitWithError(err)
|
||||
}
|
||||
if err := cni.Load(gocni.WithLoNetwork, gocni.WithDefaultConf); err != nil {
|
||||
return exitWithError(err)
|
||||
}
|
||||
if err := cni.Check(context.Background(), id, netns); err != nil {
|
||||
return exitWithError(err)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func runCNIStatus(args []string) int {
|
||||
cni, err := newCNIFromArgs(args)
|
||||
if err != nil {
|
||||
return exitWithError(err)
|
||||
}
|
||||
if err := cni.Load(gocni.WithLoNetwork, gocni.WithDefaultConf); err != nil {
|
||||
return exitWithError(err)
|
||||
}
|
||||
if err := cni.Status(); err != nil {
|
||||
return exitWithError(err)
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func parseCNIArgs(args []string) (string, string, error) {
|
||||
fs := flag.NewFlagSet("cni", flag.ContinueOnError)
|
||||
fs.SetOutput(io.Discard)
|
||||
id := fs.String("id", "", "")
|
||||
netns := fs.String("netns", "", "")
|
||||
pid := fs.Int("pid", 0, "")
|
||||
_ = fs.String("conf-dir", "", "")
|
||||
_ = fs.String("bin-dir", "", "")
|
||||
_ = fs.String("if-prefix", "", "")
|
||||
if err := fs.Parse(args); err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
if *id == "" {
|
||||
return "", "", fmt.Errorf("missing --id")
|
||||
}
|
||||
if *netns == "" && *pid == 0 {
|
||||
return "", "", fmt.Errorf("missing --netns or --pid")
|
||||
}
|
||||
if *netns == "" {
|
||||
*netns = filepath.Join("/proc", strconv.Itoa(*pid), "ns", "net")
|
||||
}
|
||||
return *id, *netns, nil
|
||||
}
|
||||
|
||||
func newCNIFromArgs(args []string) (gocni.CNI, error) {
|
||||
fs := flag.NewFlagSet("cni", flag.ContinueOnError)
|
||||
fs.SetOutput(io.Discard)
|
||||
confDir := fs.String("conf-dir", "", "")
|
||||
binDir := fs.String("bin-dir", "", "")
|
||||
ifPrefix := fs.String("if-prefix", "", "")
|
||||
_ = fs.String("id", "", "")
|
||||
_ = fs.String("netns", "", "")
|
||||
_ = fs.Int("pid", 0, "")
|
||||
if err := fs.Parse(args); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
opts := []gocni.Opt{}
|
||||
if strings.TrimSpace(*binDir) != "" {
|
||||
opts = append(opts, gocni.WithPluginDir([]string{*binDir}))
|
||||
}
|
||||
if strings.TrimSpace(*confDir) != "" {
|
||||
opts = append(opts, gocni.WithPluginConfDir(*confDir))
|
||||
}
|
||||
if strings.TrimSpace(*ifPrefix) != "" {
|
||||
opts = append(opts, gocni.WithInterfacePrefix(*ifPrefix))
|
||||
}
|
||||
return gocni.New(opts...)
|
||||
}
|
||||
|
||||
func exitWithError(err error) int {
|
||||
_, _ = fmt.Fprintln(os.Stderr, err.Error())
|
||||
return 1
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user