Remove BIRDv1 support
This commit is contained in:
@@ -89,25 +89,3 @@ func birdHandler(httpW http.ResponseWriter, httpR *http.Request) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Handles BIRDv6 queries
|
||||
func bird6Handler(httpW http.ResponseWriter, httpR *http.Request) {
|
||||
query := string(httpR.URL.Query().Get("q"))
|
||||
if query == "" {
|
||||
invalidHandler(httpW, httpR)
|
||||
} else {
|
||||
// Initialize BIRDv6 socket
|
||||
bird6, err := net.Dial("unix", setting.bird6Socket)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer bird6.Close()
|
||||
|
||||
birdReadln(bird6, nil)
|
||||
birdWriteln(bird6, "restrict")
|
||||
birdReadln(bird6, nil)
|
||||
birdWriteln(bird6, query)
|
||||
for birdReadln(bird6, httpW) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
5
proxy/go.mod
Normal file
5
proxy/go.mod
Normal file
@@ -0,0 +1,5 @@
|
||||
module github.com/xddxdd/bird-lg-go/proxy
|
||||
|
||||
go 1.15
|
||||
|
||||
require github.com/gorilla/handlers v1.5.1
|
||||
4
proxy/go.sum
Normal file
4
proxy/go.sum
Normal file
@@ -0,0 +1,4 @@
|
||||
github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ=
|
||||
github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
||||
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
|
||||
github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
|
||||
@@ -50,10 +50,9 @@ func accessHandler(next http.Handler) http.Handler {
|
||||
}
|
||||
|
||||
type settingType struct {
|
||||
birdSocket string
|
||||
bird6Socket string
|
||||
listen string
|
||||
allowedIPs []string
|
||||
birdSocket string
|
||||
listen string
|
||||
allowedIPs []string
|
||||
}
|
||||
|
||||
var setting settingType
|
||||
@@ -63,7 +62,6 @@ func main() {
|
||||
// Prepare default socket paths, use environment variable if possible
|
||||
var settingDefault = settingType{
|
||||
"/var/run/bird/bird.ctl",
|
||||
"/var/run/bird/bird6.ctl",
|
||||
":8000",
|
||||
[]string{""},
|
||||
}
|
||||
@@ -71,9 +69,6 @@ func main() {
|
||||
if birdSocketEnv := os.Getenv("BIRD_SOCKET"); birdSocketEnv != "" {
|
||||
settingDefault.birdSocket = birdSocketEnv
|
||||
}
|
||||
if bird6SocketEnv := os.Getenv("BIRD6_SOCKET"); bird6SocketEnv != "" {
|
||||
settingDefault.bird6Socket = bird6SocketEnv
|
||||
}
|
||||
if listenEnv := os.Getenv("BIRDLG_LISTEN"); listenEnv != "" {
|
||||
settingDefault.listen = listenEnv
|
||||
}
|
||||
@@ -83,21 +78,17 @@ func main() {
|
||||
|
||||
// Allow parameters to override environment variables
|
||||
birdParam := flag.String("bird", settingDefault.birdSocket, "socket file for bird, set either in parameter or environment variable BIRD_SOCKET")
|
||||
bird6Param := flag.String("bird6", settingDefault.bird6Socket, "socket file for bird6, set either in parameter or environment variable BIRD6_SOCKET")
|
||||
listenParam := flag.String("listen", settingDefault.listen, "listen address, set either in parameter or environment variable BIRDLG_LISTEN")
|
||||
AllowedIPsParam := flag.String("allowed", strings.Join(settingDefault.allowedIPs, ","), "IPs allowed to access this proxy, separated by commas. Don't set to allow all IPs.")
|
||||
flag.Parse()
|
||||
|
||||
setting.birdSocket = *birdParam
|
||||
setting.bird6Socket = *bird6Param
|
||||
setting.listen = *listenParam
|
||||
setting.allowedIPs = strings.Split(*AllowedIPsParam, ",")
|
||||
|
||||
// Start HTTP server
|
||||
http.HandleFunc("/", invalidHandler)
|
||||
http.HandleFunc("/bird", birdHandler)
|
||||
http.HandleFunc("/bird6", bird6Handler)
|
||||
http.HandleFunc("/traceroute", tracerouteIPv4Wrapper)
|
||||
http.HandleFunc("/traceroute6", tracerouteIPv6Wrapper)
|
||||
http.HandleFunc("/traceroute", tracerouteHandler)
|
||||
http.ListenAndServe(*listenParam, handlers.LoggingHandler(os.Stdout, accessHandler(http.DefaultServeMux)))
|
||||
}
|
||||
|
||||
@@ -4,20 +4,12 @@ import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"os/exec"
|
||||
"regexp"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Wrapper of traceroute, IPv4
|
||||
func tracerouteIPv4Wrapper(httpW http.ResponseWriter, httpR *http.Request) {
|
||||
tracerouteRealHandler(false, httpW, httpR)
|
||||
}
|
||||
|
||||
// Wrapper of traceroute, IPv6
|
||||
func tracerouteIPv6Wrapper(httpW http.ResponseWriter, httpR *http.Request) {
|
||||
tracerouteRealHandler(true, httpW, httpR)
|
||||
}
|
||||
|
||||
func tracerouteTryExecute(cmd []string, args [][]string) ([]byte, string) {
|
||||
var output []byte
|
||||
var errString = ""
|
||||
@@ -35,8 +27,7 @@ func tracerouteTryExecute(cmd []string, args [][]string) ([]byte, string) {
|
||||
return nil, errString
|
||||
}
|
||||
|
||||
// Real handler of traceroute requests
|
||||
func tracerouteRealHandler(useIPv6 bool, httpW http.ResponseWriter, httpR *http.Request) {
|
||||
func tracerouteHandler(httpW http.ResponseWriter, httpR *http.Request) {
|
||||
query := string(httpR.URL.Query().Get("q"))
|
||||
query = strings.TrimSpace(query)
|
||||
if query == "" {
|
||||
@@ -44,88 +35,28 @@ func tracerouteRealHandler(useIPv6 bool, httpW http.ResponseWriter, httpR *http.
|
||||
} else {
|
||||
var result []byte
|
||||
var errString string
|
||||
if runtime.GOOS == "freebsd" || runtime.GOOS == "netbsd" {
|
||||
if useIPv6 {
|
||||
result, errString = tracerouteTryExecute(
|
||||
[]string{
|
||||
"traceroute6",
|
||||
"traceroute",
|
||||
},
|
||||
[][]string{
|
||||
{"-q1", "-w1", query},
|
||||
{"-q1", "-w1", query},
|
||||
},
|
||||
)
|
||||
} else {
|
||||
result, errString = tracerouteTryExecute(
|
||||
[]string{
|
||||
"traceroute",
|
||||
"traceroute6",
|
||||
},
|
||||
[][]string{
|
||||
{"-q1", "-w1", query},
|
||||
{"-q1", "-w1", query},
|
||||
},
|
||||
)
|
||||
}
|
||||
} else if runtime.GOOS == "openbsd" {
|
||||
if useIPv6 {
|
||||
result, errString = tracerouteTryExecute(
|
||||
[]string{
|
||||
"traceroute6",
|
||||
"traceroute",
|
||||
},
|
||||
[][]string{
|
||||
{"-q1", "-w1", query},
|
||||
{"-q1", "-w1", query},
|
||||
},
|
||||
)
|
||||
} else {
|
||||
result, errString = tracerouteTryExecute(
|
||||
[]string{
|
||||
"traceroute",
|
||||
"traceroute6",
|
||||
},
|
||||
[][]string{
|
||||
{"-A", "-q1", "-w1", query},
|
||||
{"-A", "-q1", "-w1", query},
|
||||
},
|
||||
)
|
||||
}
|
||||
skippedCounter := 0
|
||||
|
||||
if runtime.GOOS == "freebsd" || runtime.GOOS == "netbsd" || runtime.GOOS == "openbsd" {
|
||||
result, errString = tracerouteTryExecute(
|
||||
[]string{
|
||||
"traceroute",
|
||||
},
|
||||
[][]string{
|
||||
{"-q1", "-w1", query},
|
||||
},
|
||||
)
|
||||
} else if runtime.GOOS == "linux" {
|
||||
if useIPv6 {
|
||||
result, errString = tracerouteTryExecute(
|
||||
[]string{
|
||||
"traceroute",
|
||||
"traceroute",
|
||||
"traceroute",
|
||||
"traceroute",
|
||||
},
|
||||
[][]string{
|
||||
{"-6", "-q1", "-N32", "-w1", query},
|
||||
{"-4", "-q1", "-N32", "-w1", query},
|
||||
// For Busybox traceroute which doesn't support simultaneous requests
|
||||
{"-6", "-q1", "-w1", query},
|
||||
{"-4", "-q1", "-w1", query},
|
||||
},
|
||||
)
|
||||
} else {
|
||||
result, errString = tracerouteTryExecute(
|
||||
[]string{
|
||||
"traceroute",
|
||||
"traceroute",
|
||||
"traceroute",
|
||||
"traceroute",
|
||||
},
|
||||
[][]string{
|
||||
{"-4", "-q1", "-N32", "-w1", query},
|
||||
{"-6", "-q1", "-N32", "-w1", query},
|
||||
// For Busybox traceroute which doesn't support simultaneous requests
|
||||
{"-4", "-q1", "-w1", query},
|
||||
{"-6", "-q1", "-w1", query},
|
||||
},
|
||||
)
|
||||
}
|
||||
result, errString = tracerouteTryExecute(
|
||||
[]string{
|
||||
"traceroute",
|
||||
"traceroute",
|
||||
},
|
||||
[][]string{
|
||||
{"-q1", "-N32", "-w1", query},
|
||||
{"-q1", "-w1", query},
|
||||
},
|
||||
)
|
||||
} else {
|
||||
httpW.WriteHeader(http.StatusInternalServerError)
|
||||
httpW.Write([]byte("traceroute not supported on this node.\n"))
|
||||
@@ -133,10 +64,18 @@ func tracerouteRealHandler(useIPv6 bool, httpW http.ResponseWriter, httpR *http.
|
||||
}
|
||||
if errString != "" {
|
||||
httpW.WriteHeader(http.StatusInternalServerError)
|
||||
httpW.Write([]byte("traceroute returned error:\n\n" + errString))
|
||||
httpW.Write([]byte(errString))
|
||||
}
|
||||
if result != nil {
|
||||
httpW.Write(result)
|
||||
errString = string(result)
|
||||
errString = regexp.MustCompile(`\s*(\d*)\s*\*\n`).ReplaceAllStringFunc(errString, func(w string) string {
|
||||
skippedCounter++
|
||||
return ""
|
||||
})
|
||||
httpW.Write([]byte(strings.TrimSpace(errString)))
|
||||
if skippedCounter > 0 {
|
||||
httpW.Write([]byte("\n\n" + strconv.Itoa(skippedCounter) + " hops not responding."))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user