From 64afac23548643fef0d91a124e6f5cfef8626ad4 Mon Sep 17 00:00:00 2001 From: James Barnett Date: Mon, 24 Dec 2018 00:38:43 +0000 Subject: Add travis build script --- .travis.yml | 29 ++++++++++++++++ README.md | 2 +- cmd/main.go | 93 ---------------------------------------------------- cmd/slowpoke/main.go | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 123 insertions(+), 94 deletions(-) create mode 100644 .travis.yml delete mode 100644 cmd/main.go create mode 100644 cmd/slowpoke/main.go diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..58bf762 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,29 @@ +language: go +sudo: false + +go: + - "1.10.x" + +install: + - go get -v ./... + +script: + - go vet ./... + +before_deploy: + - go get github.com/mitchellh/gox + - gox -os="linux darwin windows" -arch="amd64" -output="slowpoke-{{.OS}}-{{.Arch}}" -verbose ./... + +deploy: + provider: releases + api_key: + secure: "r7eqfswAuocPtu9P479J8dXOGeeIyrKz0UkagVPLOeKAor0KsxEpilxtIN/15F02Wmt0AstVl9YGLEcBEA4xUwECvrCqr9ot/PcAr3/9UB7oPeqQQy6OsOMcgLzrYryDb33AfuyB32lXuN7W8FNQz8z+OXsrVcgFiPfELM1oxgQ1ktjxY0FBs74O1sShKoGdwinumT0Dwc07vGcaclz6iqxkCdPQpsjtxbAnsway/NM4vQWRBEbyOiIQ8Y+C/kWxqC8Y5kjtni48WcsoWCUdn5iNrT7LDXAf+SZC3ubIRI/I4B50r45zjgxNXMVskbvBwUocpqUmJQsH5w3HnSyuVxBProGo0exC5f8s4/M+KmYqp1cipBIuqv/sofEvi7Qs9TRFXURjtOkMv4QqSqCctn2vSX/WYcWRS7P06pCRfcGCb7zcm1RCrHTuHJoiCVfEMJy3xdyCzGLlthu+t5cSPfjwvQLyeWCeEKp9JTGaubUwF+nU1UYsbibFWt7X/UFM8q5z4Wx3Mw3PSjS+lV31+CQlDllr35dv41zWBFSvWpz7TuMS7/q2NhiXA1sCAzX5Ky6UwgdaC2pPkeULiVmYLDEycUbMuIsInZm66LVSqJ7KbzdrQF6c74NMCW3gJTPQ5pEA7LNfPhSh5rhlSzj8I5/Z9rWnniIrl2JrBx1eVaE=" + file: + - logshare-linux-amd64 + - slowpoke-windows-amd64.exe + - logshare-darwim-amd64 + skip_cleanup: true + on: + tags: true + + \ No newline at end of file diff --git a/README.md b/README.md index b8a0064..091b642 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Slowpoke -Slowpoke is a simple TCP proxy which can introduce a configurable latency between packet transfers. +Slowpoke is a simple TCP proxy which can introduce configurable latency between packet delivery. This allows you to test and profile how your application behaves with different levels of latency between services such as databases or caches. ## Running diff --git a/cmd/main.go b/cmd/main.go deleted file mode 100644 index 93f62b0..0000000 --- a/cmd/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/cmd/slowpoke/main.go b/cmd/slowpoke/main.go new file mode 100644 index 0000000..93f62b0 --- /dev/null +++ b/cmd/slowpoke/main.go @@ -0,0 +1,93 @@ +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() + } +} -- cgit v1.2.3