aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cmd')
-rw-r--r--cmd/main.go81
1 files changed, 81 insertions, 0 deletions
diff --git a/cmd/main.go b/cmd/main.go
new file mode 100644
index 0000000..92ec8bd
--- /dev/null
+++ b/cmd/main.go
@@ -0,0 +1,81 @@
+package main
+
+import (
+ "fmt"
+ "net"
+ "os"
+ "time"
+
+ "github.com/jessevdk/go-flags"
+ "github.com/op/go-logging"
+
+ "github.com/jamesbarnett91/slowpoke"
+)
+
+var log = logging.MustGetLogger("main")
+
+var opts struct {
+ TargetAddress string `short:"t" long:"target" description:"TODO" required:"true"`
+ Port int `short:"p" long:"port" description:"TODO" required:"true"`
+ Verbose []bool `short:"v" long:"verbose" description:"TODO"`
+ Latency time.Duration `short:"l" long:"latency" default:"0ms" description:"TODO"`
+}
+
+func init() {
+ _, err := flags.Parse(&opts)
+ if err != nil {
+ log.Error(err)
+ os.Exit(1)
+ }
+
+ configureLogger()
+}
+
+func configureLogger() {
+ logBackend := logging.NewLogBackend(os.Stderr, "", 0)
+ logFormat := logging.MustStringFormatter(`%{color}%{time:15:04:05.000} [%{level:.3s}]%{color:reset} - %{message}`)
+ logger := logging.AddModuleLevel(logging.NewBackendFormatter(logBackend, logFormat))
+
+ if len(opts.Verbose) == 0 {
+ logger.SetLevel(logging.WARNING, "")
+ } else if len(opts.Verbose) == 1 {
+ logger.SetLevel(logging.INFO, "")
+ } else {
+ logger.SetLevel(logging.DEBUG, "")
+ }
+
+ logging.SetBackend(logger)
+}
+
+func main() {
+ log.Infof("Proxying from :%d to %s with latency of %s", opts.Port, opts.TargetAddress, opts.Latency)
+
+ listener := getListener(opts.Port)
+ waitForClients(listener)
+}
+
+func getListener(port int) net.Listener {
+ listener, err := net.Listen("tcp", fmt.Sprintf(":%d", port))
+ if err != nil {
+ log.Errorf("Failed to start listening on port %d:\n%v", port, err)
+ os.Exit(1)
+ }
+ log.Debugf("Waiting for connections on port %d", port)
+
+ return listener
+}
+
+func waitForClients(listener net.Listener) {
+ for {
+ client, err := listener.Accept()
+ if err != nil {
+ log.Errorf("Failed to accept connection:\n%v", err)
+ break
+ }
+ log.Infof("Accepted connection from client %v\n", client.RemoteAddr())
+
+ s := slowpoke.New(client, opts.TargetAddress, opts.Latency, log)
+
+ go s.StartTransfer()
+ }
+}