PostScript

This commit is contained in:
KusakabeSi 2021-11-06 09:47:06 +00:00
parent a8d5a2a602
commit 61df11f9f0
10 changed files with 56 additions and 3 deletions

View File

@ -70,6 +70,7 @@ Usage of ./etherguard-go:
5. `tap`: Read/Write to tap device from linux.
Paramaters: `name`,`macaddrprefix`,`vppifaceid`,`mtu`
2. `name` : Device name
3. `postscript`: run script after etherguard initialized.
3. `vppifaceid`: Interface ID。Muse be unique in same VPP runtime
4. `vppbridgeid`: VPP Bridge ID. Fill 0 if you don't use it.
5. `macaddrprefix`: Mac address Prefix.

View File

@ -91,6 +91,7 @@ Usage of ./etherguard-go-vpp:
3. `noL2`: 拔掉L2 Header的模式。
但是本VPN會查詢L2用作選路所以會變成一律廣播
2. `nodeid`: 節點ID。節點之間辨識身分用的同一網路內節點ID不能重複
3. `postscript`: etherguard初始化完畢之後要跑的腳本.
3. `nodename`: 節點名稱
4. `defaultttl`: 預設ttl(etherguard層使用和乙太層不共通)
5. `l2fibtimeout`: MacAddr-> NodeID 查找表的 timeout(秒)

View File

@ -20,6 +20,7 @@ type EdgeConfig struct {
Interface InterfaceConf
NodeID Vertex
NodeName string
PostScript string
DefaultTTL uint8
L2FIBTimeout float64
PrivKey string
@ -33,6 +34,7 @@ type EdgeConfig struct {
type SuperConfig struct {
NodeName string
PostScript string
PrivKeyV4 string
PrivKeyV6 string
ListenPort int

2
example_config/echo.sh Executable file
View File

@ -0,0 +1,2 @@
#!/bin/bash
echo "echo.sh" "$@"

View File

@ -9,6 +9,7 @@ interface:
sendaddr: 127.0.0.1:5001
l2headermode: kbdbg
nodeid: 1
postscript: example_config/echo.sh test
nodename: Node01
defaultttl: 200
l2fibtimeout: 3600

View File

@ -10,6 +10,7 @@ interface:
l2headermode: kbdbg
nodeid: 2
nodename: Node02
postscript: example_config/echo.sh test
defaultttl: 200
l2fibtimeout: 3600
privkey: OH8BsVUU2Rqzeu9B2J5GPG8PUmxWfX8uVvNFZKhVF3o=

View File

@ -1,4 +1,5 @@
nodename: NodeSuper
postscript: example_config/echo.sh test
privkeyv4: mL5IW0GuqbjgDeOJuPHBU2iJzBPNKhaNEXbIGwwYWWk=
privkeyv6: +EdOKIoBp/EvIusHDsvXhV1RJYbyN3Qr8nxlz35wl3I=
listenport: 3000

1
go.mod
View File

@ -8,6 +8,7 @@ require (
github.com/KusakabeSi/go-cache v0.0.0-20210823132304-22b5b1d22b41
github.com/beevik/ntp v0.3.0
github.com/google/gopacket v1.1.19
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
github.com/sirupsen/logrus v1.6.0
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1

View File

@ -11,10 +11,13 @@ import (
"errors"
"fmt"
"os"
"os/exec"
"os/signal"
"strconv"
"syscall"
"github.com/google/shlex"
"github.com/KusakabeSi/EtherGuardVPN/config"
"github.com/KusakabeSi/EtherGuardVPN/conn"
"github.com/KusakabeSi/EtherGuardVPN/device"
@ -40,6 +43,7 @@ func printExampleEdgeConf() {
},
NodeID: 1,
NodeName: "Node01",
PostScript: "",
DefaultTTL: 200,
L2FIBTimeout: 3600,
PrivKey: "6GyDagZKhbm5WNqMiRHhkf43RlbMJ34IieTlIuvfJ1M=",
@ -318,8 +322,25 @@ func Edge(configPath string, useUAPI bool, printExample bool, bindmode string) (
startUAPI(NodeName, logger, the_device, errs)
}
// wait for program to terminate
if econfig.PostScript != "" {
cmdarg, err := shlex.Split(econfig.PostScript)
if err != nil {
return fmt.Errorf("Error parse PostScript %v\n", err)
}
if econfig.LogLevel.LogInternal {
fmt.Printf("PostScript: exec.Command(%v)\n", cmdarg)
}
cmd := exec.Command(cmdarg[0], cmdarg[1:]...)
out, err := cmd.CombinedOutput()
if err != nil {
return fmt.Errorf("exec.Command(%v) failed with %v\n", cmdarg, err)
}
if econfig.LogLevel.LogInternal {
fmt.Printf("PostScript output: %s\n", string(out))
}
}
// wait for program to terminate
signal.Notify(term, syscall.SIGTERM)
signal.Notify(term, os.Interrupt)

View File

@ -16,11 +16,14 @@ import (
"fmt"
"net"
"os"
"os/exec"
"os/signal"
"strconv"
"syscall"
"time"
"github.com/google/shlex"
"github.com/KusakabeSi/EtherGuardVPN/config"
"github.com/KusakabeSi/EtherGuardVPN/conn"
"github.com/KusakabeSi/EtherGuardVPN/device"
@ -66,6 +69,7 @@ func printExampleSuperConf() {
sconfig := config.SuperConfig{
NodeName: "NodeSuper",
PostScript: "",
PrivKeyV4: "mL5IW0GuqbjgDeOJuPHBU2iJzBPNKhaNEXbIGwwYWWk=",
PrivKeyV6: "+EdOKIoBp/EvIusHDsvXhV1RJYbyN3Qr8nxlz35wl3I=",
ListenPort: 3000,
@ -240,14 +244,32 @@ func Super(configPath string, useUAPI bool, printExample bool, bindmode string)
}
defer uapi6.Close()
}
signal.Notify(term, syscall.SIGTERM)
signal.Notify(term, os.Interrupt)
go Event_server_event_hendler(http_graph, http_super_chains)
go RoutinePushSettings(path.S2TD(sconfig.RePushConfigInterval))
go RoutineTimeoutCheck()
go HttpServer(sconfig.ListenPort, "/api")
if sconfig.PostScript != "" {
cmdarg, err := shlex.Split(sconfig.PostScript)
if err != nil {
return fmt.Errorf("Error parse PostScript %v\n", err)
}
if sconfig.LogLevel.LogInternal {
fmt.Printf("PostScript: exec.Command(%v)\n", cmdarg)
}
cmd := exec.Command(cmdarg[0], cmdarg[1:]...)
out, err := cmd.CombinedOutput()
if err != nil {
return fmt.Errorf("exec.Command(%v) failed with %v\n", cmdarg, err)
}
if sconfig.LogLevel.LogInternal {
fmt.Printf("PostScript output: %s\n", string(out))
}
}
signal.Notify(term, syscall.SIGTERM)
signal.Notify(term, os.Interrupt)
select {
case <-term:
case <-errs: