Merge pull request #870 from bradrydzewski/master

embedded socat polyfill for #869
This commit is contained in:
Brad Rydzewski 2015-02-20 17:37:25 -08:00
commit ba5db98d44
4 changed files with 24 additions and 10 deletions

View file

@ -5,10 +5,13 @@ env:
- GOROOT=/usr/local/go - GOROOT=/usr/local/go
- PATH=$PATH:$GOROOT/bin:$GOPATH/bin - PATH=$PATH:$GOROOT/bin:$GOPATH/bin
script: script:
- sudo add-apt-repository ppa:git-core/ppa 1> /dev/null 2> /dev/null
- sudo apt-get update 1> /dev/null 2> /dev/null - sudo apt-get update 1> /dev/null 2> /dev/null
- sudo apt-get -y install zip libsqlite3-dev sqlite3 rpm 1> /dev/null 2> /dev/null - sudo apt-get update 1> /dev/null 2> /dev/null
- sudo apt-get -y install git zip libsqlite3-dev sqlite3 rpm 1> /dev/null 2> /dev/null
- gem install fpm - gem install fpm
- rbenv rehash - rbenv rehash
- make docker
- make deps - make deps
- make test - make test
- make test_postgres - make test_postgres

View file

@ -5,10 +5,13 @@ ITTERATION := $(shell date +%s)
all: build all: build
deps: deps:
# which npm && npm -g install uglify-js less autoprefixer
go get github.com/GeertJohan/go.rice/rice go get github.com/GeertJohan/go.rice/rice
go get -t -v ./... go get -t -v ./...
docker:
mkdir -p $$GOPATH/src/github.com/docker/docker
git clone --depth=1 --branch=v1.5.0 git://github.com/docker/docker.git $$GOPATH/src/github.com/docker/docker
test: test:
@test -z "$(shell find . -name '*.go' | xargs gofmt -l)" || (echo "Need to run 'go fmt ./...'"; exit 1) @test -z "$(shell find . -name '*.go' | xargs gofmt -l)" || (echo "Need to run 'go fmt ./...'"; exit 1)
go vet ./... go vet ./...

View file

@ -5,14 +5,22 @@ import (
"fmt" "fmt"
) )
// bash header // bash header plus an embedded perl script that can be used
const header = "#!/bin/bash\n" // as an alternative to socat to proxy tcp traffic.
const header = `#!/bin/bash
set +e
echo H4sICGKv1VQAA3NvY2F0LnBsAH1SXUvDQBB8Tn7FipUmkpr6gWBKgyIiBdGixVeJ6RZP00u4S6wi8be7t3exFsWEhNzO7M7MXba34kar+FHIuEJV+I1GmNwkyV2Zv2A9Wq+xwJzWfk/IqqlhDM+lkEEf+tHp2e3lfTj6Rj5hGc/Op4Oryd3s4joJ9nbDaFGqF6Air/gVU0M2nyua1Dug76pUZmrvkDSW79ATpUZTWIsPUomrkQF3NLt7WGaVY2tUr6g6OqNJMrm+mHFT4HtXZZ4VZ6yXQn+4x3c/csCUxVNgF1S8RcrdsfcNS+gapWdWw6HPYY2/QUoRAqdOVX/1JAqEYD+ED9+j0MDm2A8EXU+eyQeF2ZxJnlgQ4ijjcRfFYp5pzwuBkvfGQiSa51jRYTiCwmVZ4z/h6Zoiqi4Q73v0Xd4Ib6ohT95IaD38AVhtB6yP5cN1tMa25fym2DpTLNtQWnqwoL+O80t8q6GRBWoN+EaHoGFjhP1uf2/Fv6zHZrFA9aMpm69bBql+16YUOF4ER8OTYxfRCjBnpUSNHSl03lu/9b8ACaSZylQDAAA= | base64 -d | gunzip > /tmp/socat && chmod +x /tmp/socat
`
// this command string will check if the socat utility // this command string will check if the socat utility
// exists, and if it does, will proxy connections to // exists, and if it does, will proxy connections to
// the external IP address. // the external IP address.
const command = "[ -x /usr/bin/socat ] && socat TCP-LISTEN:%s,fork TCP:%s:%s &\n" const command = "[ -x /usr/bin/socat ] && socat TCP-LISTEN:%s,fork TCP:%s:%s &\n"
// alternative command that acts as a "polyfill" for socat
// in the event that it isn't installed on the server
const polyfill = "[ -x /tmp/socat ] && /tmp/socat TCP-LISTEN:%s,fork TCP:%s:%s &\n"
// Proxy stores proxy configuration details mapping // Proxy stores proxy configuration details mapping
// a local port to an external IP address with the // a local port to an external IP address with the
// same port number. // same port number.
@ -29,6 +37,7 @@ func (p Proxy) String() string {
buf.WriteString(header) buf.WriteString(header)
for port, ip := range p { for port, ip := range p {
buf.WriteString(fmt.Sprintf(command, port, ip, port)) buf.WriteString(fmt.Sprintf(command, port, ip, port))
buf.WriteString(fmt.Sprintf(polyfill, port, ip, port))
} }
return buf.String() return buf.String()

View file

@ -12,19 +12,18 @@ func TestProxy(t *testing.T) {
p.Set("8080", "172.1.4.5") p.Set("8080", "172.1.4.5")
b := p.Bytes() b := p.Bytes()
expected := `#!/bin/bash expected := header + `[ -x /usr/bin/socat ] && socat TCP-LISTEN:8080,fork TCP:172.1.4.5:8080 &
[ -x /usr/bin/socat ] && socat TCP-LISTEN:8080,fork TCP:172.1.4.5:8080 & [ -x /tmp/socat ] && /tmp/socat TCP-LISTEN:8080,fork TCP:172.1.4.5:8080 &
` `
if string(b) != expected { if string(b) != expected {
t.Errorf("Invalid proxy \n%s", expected) t.Errorf("Invalid proxy \n%s", string(b))
} }
// test creating a proxy script when there // test creating a proxy script when there
// are no proxy addresses added to the map // are no proxy addresses added to the map
p = Proxy{} p = Proxy{}
b = p.Bytes() b = p.Bytes()
expected = "#!/bin/bash\n" if string(b) != header {
if string(b) != expected { t.Errorf("Invalid empty proxy file. Expected\n%s", header)
t.Errorf("Invalid proxy \n%s", expected)
} }
} }