From 7672da39aafb3e9a2fcbb0bce236dff8b7613355 Mon Sep 17 00:00:00 2001 From: James Barnett Date: Thu, 27 Dec 2018 21:52:25 +0000 Subject: Remove cmd package. Cleanup logging. --- cmd/slowpoke/main.go | 93 ---------------------------------------------------- main.go | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++ slowpoke.go | 17 +++------- 3 files changed, 95 insertions(+), 106 deletions(-) delete mode 100644 cmd/slowpoke/main.go create mode 100644 main.go diff --git a/cmd/slowpoke/main.go b/cmd/slowpoke/main.go deleted file mode 100644 index 93f62b0..0000000 --- a/cmd/slowpoke/main.go +++ /dev/null @@ -1,93 +0,0 @@ -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:"The target address in host:port form" required:"true"` - Port int `short:"p" long:"port" description:"The port Slowpoke should listen for connections on" required:"true"` - Verbose []bool `short:"v" long:"verbose" description:"Log verbosity level. -v or -vv"` - Latency time.Duration `short:"l" long:"latency" default:"0ms" description:"The amount of latency to apply to data packets, specified as a number and unit. E.g. 15ms or 2s. Supported units are 'us', 'ms', 's', 'm' and 'h'"` - BufferSize int `short:"b" long:"buffer" default:"1500" description:"The size of the transfer buffer in bytes. Latency is applied between each buffer flush. Therefore total latency applied is equal to '(totalDataTransferred/bufferSize) * latency'"` -} - -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 between :%d and %s with %s of latency", opts.Port, opts.TargetAddress, opts.Latency) - log.Debugf("Transfer buffer size set to %d bytes", opts.BufferSize) - - listener := getListener(opts.Port) - targetAddr := resolveTarget(opts.TargetAddress) - waitForClients(listener, targetAddr) -} - -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 resolveTarget(targetAddress string) *net.TCPAddr { - tcpAddr, err := net.ResolveTCPAddr("tcp", opts.TargetAddress) - if err != nil { - log.Errorf("Failed to resolve target address %s:\n%v", opts.TargetAddress, err) - os.Exit(1) - } - return tcpAddr -} - -func waitForClients(listener net.Listener, targetAddr *net.TCPAddr) { - 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, targetAddr, opts.Latency, opts.BufferSize, log) - - go s.StartTransfer() - } -} diff --git a/main.go b/main.go new file mode 100644 index 0000000..5983a33 --- /dev/null +++ b/main.go @@ -0,0 +1,91 @@ +package main + +import ( + "fmt" + "net" + "os" + "time" + + "github.com/jessevdk/go-flags" + "github.com/op/go-logging" +) + +var log = logging.MustGetLogger("main") + +var opts struct { + TargetAddress string `short:"t" long:"target" description:"The target address in host:port form" required:"true"` + Port int `short:"p" long:"port" description:"The port Slowpoke should listen for connections on" required:"true"` + Verbose []bool `short:"v" long:"verbose" description:"Log verbosity level. -v or -vv"` + Latency time.Duration `short:"l" long:"latency" default:"0ms" description:"The duration of latency to apply to data packets, specified as a number and unit. E.g. 15ms or 2s. Supported units are 'us', 'ms', 's', 'm' and 'h'"` + BufferSize int `short:"b" long:"buffer" default:"1500" description:"The size of the transfer buffer in bytes. Latency is applied between each buffer flush. Therefore total latency applied is equal to '(totalDataTransferred/bufferSize) * latency'"` +} + +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 between :%d and %s with %s of latency", opts.Port, opts.TargetAddress, opts.Latency) + log.Debugf("Transfer buffer size set to %d bytes", opts.BufferSize) + + listener := getListener(opts.Port) + targetAddr := resolveTarget(opts.TargetAddress) + waitForClients(listener, targetAddr) +} + +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 resolveTarget(targetAddress string) *net.TCPAddr { + tcpAddr, err := net.ResolveTCPAddr("tcp", opts.TargetAddress) + if err != nil { + log.Errorf("Failed to resolve target address %s:\n%v", opts.TargetAddress, err) + os.Exit(1) + } + return tcpAddr +} + +func waitForClients(listener net.Listener, targetAddr *net.TCPAddr) { + 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 := NewSlowpoke(client, targetAddr, opts.Latency, opts.BufferSize, log) + + go s.StartTransfer() + } +} diff --git a/slowpoke.go b/slowpoke.go index 4a36306..fb491a1 100644 --- a/slowpoke.go +++ b/slowpoke.go @@ -1,4 +1,4 @@ -package slowpoke +package main import ( "io" @@ -18,7 +18,7 @@ type Slowpoke struct { logger *logging.Logger } -func New(conn net.Conn, targetAddr *net.TCPAddr, latency time.Duration, bufferSize int, logger *logging.Logger) *Slowpoke { +func NewSlowpoke(conn net.Conn, targetAddr *net.TCPAddr, latency time.Duration, bufferSize int, logger *logging.Logger) *Slowpoke { return &Slowpoke{ conn: conn, targetAddr: targetAddr, @@ -55,25 +55,16 @@ func (s *Slowpoke) createBuffer() []byte { func (s *Slowpoke) transferWithLatency(source net.Conn, target net.Conn) { byteBuffer := s.createBuffer() - var transferDirection string - // If the data source is the client then we are sending - if source == s.conn { - transferDirection = "%d bytes sent" - } else { - transferDirection = "%d bytes received" - } - for { bytesRead, readError := source.Read(byteBuffer) if bytesRead > 0 { + s.logger.Debugf("Transferring %d bytes from %s to %s with %s added latency", bytesRead, source.RemoteAddr(), target.RemoteAddr(), s.latency) + if s.latency != 0 { - s.logger.Debugf(transferDirection+" with latency of %s", bytesRead, s.latency) time.Sleep(s.latency) - } else { - s.logger.Debugf(transferDirection, bytesRead) } bytesWritten, writeError := target.Write(byteBuffer[0:bytesRead]) -- cgit v1.2.3