77 lines
1.7 KiB
Go
77 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"os/signal"
|
|
"strconv"
|
|
"strings"
|
|
"syscall"
|
|
|
|
"github.com/rs/zerolog"
|
|
"github.com/rs/zerolog/log"
|
|
)
|
|
|
|
func main() {
|
|
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
|
|
|
|
iface := flag.String("iface", "en0", "host interface to use")
|
|
debug := flag.Bool("debug", false, "sets log level to debug")
|
|
trace := flag.Bool("trace", false, "sets log level to trace")
|
|
help := flag.Bool("help", false, "shows help")
|
|
|
|
// chosen by fair dice roll
|
|
hostLinkAddr := flag.String("mac", "00:1A:70:54:A6:93", "MAC address to use")
|
|
hostProtoAddr := flag.String("ip", "192.168.255.10/24", "IP address to use (with prefix)")
|
|
gateProtoAddr := flag.String("gateway", "192.168.255.1", "gateway IP address")
|
|
|
|
flag.Parse()
|
|
|
|
if *help {
|
|
usage(0)
|
|
}
|
|
|
|
zerolog.SetGlobalLevel(zerolog.InfoLevel)
|
|
if *debug {
|
|
zerolog.SetGlobalLevel(zerolog.DebugLevel)
|
|
}
|
|
if *trace {
|
|
zerolog.SetGlobalLevel(zerolog.TraceLevel)
|
|
}
|
|
|
|
server, err := NewServer(*iface, *hostLinkAddr, *hostProtoAddr, *gateProtoAddr)
|
|
if err != nil {
|
|
log.Fatal().Msgf("unable to start the server: %s", err)
|
|
}
|
|
defer server.Close()
|
|
|
|
go server.Loop()
|
|
|
|
for _, arg := range flag.Args() {
|
|
parts := strings.Split(arg, ":")
|
|
if len(parts) != 4 {
|
|
usage(1)
|
|
}
|
|
network := parts[0]
|
|
localPort, err := strconv.Atoi(parts[1])
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
remoteAddr := parts[2] + ":" + parts[3]
|
|
go server.Proxy(network, localPort, remoteAddr)
|
|
}
|
|
|
|
sig := make(chan os.Signal, 1)
|
|
signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
|
|
<-sig
|
|
|
|
log.Info().Msg("closing down")
|
|
|
|
server.Shutdown()
|
|
}
|
|
|
|
func usage(exitcode int) {
|
|
fmt.Println("usage: ./uwu protocol:local-port:remote-host:remote-port")
|
|
os.Exit(exitcode)
|
|
}
|