diff --git a/shared/build/proxy/proxy.go b/shared/build/proxy/proxy.go index 55ef9a11..bad544ce 100644 --- a/shared/build/proxy/proxy.go +++ b/shared/build/proxy/proxy.go @@ -5,14 +5,22 @@ import ( "fmt" ) -// bash header -const header = "#!/bin/bash\n" +// bash header plus an embedded perl script that can be used +// 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 // exists, and if it does, will proxy connections to // the external IP address. 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 // a local port to an external IP address with the // same port number. @@ -29,6 +37,7 @@ func (p Proxy) String() string { buf.WriteString(header) for port, ip := range p { buf.WriteString(fmt.Sprintf(command, port, ip, port)) + buf.WriteString(fmt.Sprintf(polyfill, port, ip, port)) } return buf.String() diff --git a/shared/build/proxy/proxy_test.go b/shared/build/proxy/proxy_test.go index 5e3ab54a..4b431fe4 100644 --- a/shared/build/proxy/proxy_test.go +++ b/shared/build/proxy/proxy_test.go @@ -12,19 +12,18 @@ func TestProxy(t *testing.T) { p.Set("8080", "172.1.4.5") b := p.Bytes() - expected := `#!/bin/bash -[ -x /usr/bin/socat ] && socat TCP-LISTEN:8080,fork TCP:172.1.4.5:8080 & + expected := header + `[ -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 { - t.Errorf("Invalid proxy \n%s", expected) + t.Errorf("AInvalid proxy \n%s", string(b)) } // test creating a proxy script when there // are no proxy addresses added to the map p = Proxy{} b = p.Bytes() - expected = "#!/bin/bash\n" - if string(b) != expected { - t.Errorf("Invalid proxy \n%s", expected) + if string(b) != header { + t.Errorf("Invalid empty proxy file. Expected\n%s", header) } }