Files
proxy-lite/main.go

112 lines
2.8 KiB
Go

package main
import (
"embed"
"flag"
"fmt"
"log"
"net/http"
"time"
"inet.af/tcpproxy"
)
//go:embed pub webfonts templates/*.html
var content embed.FS
var dataFlag = flag.String("data", "./infinite.db", "Path to database.")
var hostFlag = flag.String("host", "0.0.0.0", "Host to listen on.")
var portFlag = flag.Int("port", 7878, "Port to listen on.")
var runTest = flag.Bool("test", false, "Run data test")
var listenString string
func init() {
flag.Parse()
listenString = fmt.Sprintf("%s:%d", *hostFlag, *portFlag)
}
func main() {
//currentTime := time.Now()
noodleChannel := make(chan Noodle)
db := NewDatabase(*dataFlag)
defer db.Close()
if *runTest {
runTestSequence(db)
}
go systemCheck(db, noodleChannel)
go tcpProxify(noodleChannel)
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.FS(content))))
// TODO: CRYPTO hrefs
http.HandleFunc("/", handleMain(db, &noodleChannel))
http.HandleFunc("/delete", handleDelete(db, &noodleChannel))
log.Printf("Server starting on %s", listenString)
log.Fatal(http.ListenAndServe(listenString, nil))
}
func systemCheck(db *Database, noodleChannel chan Noodle) {
for {
noodles := db.GetAll()
for _, noodle := range noodles {
noodleChannel <- noodle
}
time.Sleep(60 * time.Second)
}
}
func startProxy(proxy *tcpproxy.Proxy) {
log.Print(proxy.Run())
}
func tcpProxify(noodleChannel chan Noodle) {
noodleMap := make(map[string]*tcpproxy.Proxy)
for {
noodle := <-noodleChannel
_, running := noodleMap[noodle.Id]
if noodle.IsUp && !running {
var p tcpproxy.Proxy
src := fmt.Sprintf("0.0.0.0:%d", noodle.ListenPort)
dst := fmt.Sprintf("%s:%d", noodle.DestHost, noodle.DestPort)
log.Printf("Starting a noodle from %s to %s", src, dst)
p.AddRoute(src, tcpproxy.To(dst))
//p.Start()
noodleMap[noodle.Id] = &p
go startProxy(&p)
continue
}
if !noodle.IsUp && running {
log.Printf("Closing noodle=%v", noodle)
err := noodleMap[noodle.Id].Close()
if err != nil {
log.Print(err)
}
}
//p.AddHTTPHostRoute(":80", "foo.com", tcpproxy.To("10.0.0.1:8081"))
//p.AddHTTPHostRoute(":80", "bar.com", tcpproxy.To("10.0.0.2:8082"))
//p.AddRoute(":80", tcpproxy.To("10.0.0.1:8081")) // fallback
//p.AddSNIRoute(":443", "foo.com", tcpproxy.To("10.0.0.1:4431"))
//p.AddSNIRoute(":443", "bar.com", tcpproxy.To("10.0.0.2:4432"))
//p.AddRoute(":443", tcpproxy.To("10.0.0.1:4431")) // fallback
//log.Fatal(p.Run())
}
}
func runTestSequence(db *Database) {
for i := 0; i < 21; i++ {
noodle := Noodle{db.MakeID(), "Name_Test", "Proto_Test", 1080+i, 22, "localhost", time.Now().Second(), true}
log.Printf("Test noodle=%v", noodle)
db.Add(noodle)
log.Printf("Test id=%s exists=%s", noodle.Id, db.Handle.Has(noodle.Id))
log.Printf("Test GetAllGeneric=%v", db.GetAllGeneric())
//db.Delete(noodle.Id)
}
}