Merge lp:~axwalk/juju-core/lp1313785-ssh-useproxy into lp:~go-bot/juju-core/trunk

Proposed by Andrew Wilkins
Status: Merged
Approved by: Andrew Wilkins
Approved revision: no longer in the source branch.
Merged at revision: 2714
Proposed branch: lp:~axwalk/juju-core/lp1313785-ssh-useproxy
Merge into: lp:~go-bot/juju-core/trunk
Diff against target: 295 lines (+81/-68)
5 files modified
cmd/juju/debughooks_test.go (+32/-24)
cmd/juju/scp.go (+5/-10)
cmd/juju/scp_test.go (+10/-2)
cmd/juju/ssh.go (+22/-12)
cmd/juju/ssh_test.go (+12/-20)
To merge this branch: bzr merge lp:~axwalk/juju-core/lp1313785-ssh-useproxy
Reviewer Review Type Date Requested Status
Juju Engineering Pending
Review via email: mp+218911@code.launchpad.net

Commit message

cmd/juju: check use-proxy before resolving address

We were translating machin/unit IDs to internal addresses
even if use-proxy=false. This manifested most prominently
when attempting to juju ssh to a machine or unit in a 1.18
environment.

Fixes lp:1313785

https://codereview.appspot.com/97230043/

Description of the change

cmd/juju: check use-proxy before resolving address

We were translating machin/unit IDs to internal addresses
even if use-proxy=false. This manifested most prominently
when attempting to juju ssh to a machine or unit in a 1.18
environment.

Fixes lp:1313785

https://codereview.appspot.com/97230043/

To post a comment you must log in.
Revision history for this message
Andrew Wilkins (axwalk) wrote :
Download full text (3.9 KiB)

Reviewers: mp+218911_code.launchpad.net,

Message:
Please take a look.

Description:
cmd/juju: check use-proxy before resolving address

We were translating machin/unit IDs to internal addresses
even if use-proxy=false. This manifested most prominently
when attempting to juju ssh to a machine or unit in a 1.18
environment.

Fixes lp:1313785

https://code.launchpad.net/~axwalk/juju-core/lp1313785-ssh-useproxy/+merge/218911

(do not edit description out of merge proposal)

Please review this at https://codereview.appspot.com/97230043/

Affected files (+23, -19 lines):
   A [revision details]
   M cmd/juju/scp.go
   M cmd/juju/ssh.go
   M cmd/juju/ssh_test.go

Index: [revision details]
=== added file '[revision details]'
--- [revision details] 2012-01-01 00:00:00 +0000
+++ [revision details] 2012-01-01 00:00:00 +0000
@@ -0,0 +1,2 @@
+Old revision: tarmac-20140509022908-5uihgtxv6350ydfq
+New revision: <email address hidden>

Index: cmd/juju/scp.go
=== modified file 'cmd/juju/scp.go'
--- cmd/juju/scp.go 2014-04-12 05:53:58 +0000
+++ cmd/juju/scp.go 2014-05-09 05:17:45 +0000
@@ -102,19 +102,19 @@
    return err
   }
   defer c.apiClient.Close()
- args, err := expandArgs(c.Args, c.hostFromTarget)
- if err != nil {
- return err
- }

   var options *ssh.Options
- if proxy, err := c.proxySSH(); err != nil {
+ if c.proxy, err = c.proxySSH(); err != nil {
    return err
- } else if proxy {
+ } else if c.proxy {
    options = new(ssh.Options)
    if err := c.setProxyCommand(options); err != nil {
     return err
    }
   }
+ args, err := expandArgs(c.Args, c.hostFromTarget)
+ if err != nil {
+ return err
+ }
   return ssh.Copy(args, options)
  }

Index: cmd/juju/ssh.go
=== modified file 'cmd/juju/ssh.go'
--- cmd/juju/ssh.go 2014-04-02 06:15:57 +0000
+++ cmd/juju/ssh.go 2014-05-09 05:17:45 +0000
@@ -124,21 +124,22 @@
     }
    }()
   }
- host, err := c.hostFromTarget(c.Target)
- if err != nil {
- return err
- }
   var options ssh.Options
   if c.pty {
    options.EnablePTY()
   }
- if proxy, err := c.proxySSH(); err != nil {
+ var err error
+ if c.proxy, err = c.proxySSH(); err != nil {
    return err
- } else if proxy {
+ } else if c.proxy {
    if err := c.setProxyCommand(&options); err != nil {
     return err
    }
   }
+ host, err := c.hostFromTarget(c.Target)
+ if err != nil {
+ return err
+ }
   cmd := ssh.Command("ubuntu@"+host, c.Args, &options)
   cmd.Stdin = ctx.Stdin
   cmd.Stdout = ctx.Stdout

Index: cmd/juju/ssh_test.go
=== modified file 'cmd/juju/ssh_test.go'
--- cmd/juju/ssh_test.go 2014-04-07 00:36:36 +0000
+++ cmd/juju/ssh_test.go 2014-05-09 05:17:45 +0000
@@ -182,7 +182,7 @@
   attemptStarter.next = func() bool {
    called++
    if called > 1 {
- s.setAddress(m[0], c)
+ s.setAddresses(m[0], c)
    }
    return true
   }
@@ -191,19 +191,20 @@
   c.Assert(called, gc.Equals, 2)
  }

-func (s *SSHCommonSuite) setAddress(m *state.Machine, c *gc.C) {
- addr := instance.NewAddress(fmt.Sprintf("dummyenv-%s.dns", m.Id()),
instance.NetworkPublic)
- err := m.SetAddresses(addr)
+func (s *SSHCommonSuite) setAddresses(m *state.Machine, c *gc.C) {
+ addrPub := instance.NewAddress(fmt.Sprintf("dummye...

Read more...

Revision history for this message
Andrew Wilkins (axwalk) wrote :
Revision history for this message
William Reade (fwereade) wrote :
Download full text (3.5 KiB)

LGTM with minors

https://codereview.appspot.com/97230043/diff/20001/cmd/juju/debughooks_test.go
File cmd/juju/debughooks_test.go (right):

https://codereview.appspot.com/97230043/diff/20001/cmd/juju/debughooks_test.go#newcode35
cmd/juju/debughooks_test.go:35: result: regexp.QuoteMeta(debugHooksArgs
+ "<email address hidden> sudo /bin/bash -c 'F=$(mktemp); echo
IyEvYmluL2Jhc2gKKAojIExvY2sgdGhlIGp1anUtPHVuaXQ+LWRlYnVnIGxvY2tmaWxlLgpmbG9jayAtbiA4IHx8IChlY2hvICJGYWlsZWQgdG8gYWNxdWlyZSAvdG1wL2p1anUtdW5pdC1tb25nb2RiLTEtZGVidWctaG9va3M6IHVuaXQgaXMgYWxyZWFkeSBiZWluZyBkZWJ1Z2dlZCIgMj4mMTsgZXhpdCAxKQooCiMgQ2xvc2UgdGhlIGluaGVyaXRlZCBsb2NrIEZELCBvciB0bXV4IHdpbGwga2VlcCBpdCBvcGVuLgpleGVjIDg+Ji0KCiMgV3JpdGUgb3V0IHRoZSBkZWJ1Zy1ob29rcyBhcmdzLgplY2hvICJlMzBLIiB8IGJhc2U2NCAtZCA+IC90bXAvanVqdS11bml0LW1vbmdvZGItMS1kZWJ1Zy1ob29rcwoKIyBMb2NrIHRoZSBqdWp1LTx1bml0Pi1kZWJ1Zy1leGl0IGxvY2tmaWxlLgpmbG9jayAtbiA5IHx8IGV4aXQgMQoKIyBXYWl0IGZvciB0bXV4IHRvIGJlIGluc3RhbGxlZC4Kd2hpbGUgWyAhIC1mIC91c3IvYmluL3RtdXggXTsgZG8KICAgIHNsZWVwIDEKZG9uZQoKaWYgWyAhIC1mIH4vLnRtdXguY29uZiBdOyB0aGVuCiAgICAgICAgaWYgWyAtZiAvdXNyL3NoYXJlL2J5b2J1L3Byb2ZpbGVzL3RtdXggXTsgdGhlbgogICAgICAgICAgICAgICAgIyBVc2UgYnlvYnUvdG11eCBwcm9maWxlIGZvciBmYW1pbGlhciBrZXliaW5kaW5ncyBhbmQgYnJhbmRpbmcKICAgICAgICAgICAgICAgIGVjaG8gInNvdXJjZS1maWxlIC91c3Ivc2hhcmUvYnlvYnUvcHJvZmlsZXMvdG11eCIgPiB+Ly50bXV4LmNvbmYKICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAjIE90aGVyd2lzZSwgdXNlIHRoZSBsZWdhY3kganVqdS90bXV4IGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgIGNhdCA+IH4vLnRtdXguY29uZiA8PEVORAogICAgICAgICAgICAgICAgCiMgU3RhdHVzIGJhcgpzZXQtb3B0aW9uIC1nIHN0YXR1cy1iZyBibGFjawpzZXQtb3B0aW9uIC1nIHN0YXR1cy1mZyB3aGl0ZQoKc2V0LXdpbmRvdy1vcHRpb24gLWcgd2luZG93LXN0YXR1cy1jdXJyZW50LWJnIHJlZApzZXQtd2luZG93LW9wdGlvbiAtZyB3aW5kb3ctc3RhdHVzLWN1cnJlbnQtYXR0ciBicmlnaHQKCnNldC1vcHRpb24gLWcgc3RhdHVzLXJpZ2h0ICcnCgojIFBhbmVzCnNldC1vcHRpb24gLWcgcGFuZS1ib3JkZXItZmcgd2hpdGUKc2V0LW9wdGlvbiAtZyBwYW5lLWFjdGl2ZS1ib3JkZXItZmcgd2hpdGUKCiMgTW9uaXRvciBhY3Rpdml0eSBvbiB3aW5kb3dzCnNldC13aW5kb3ctb3B0aW9uIC1nIG1vbml0b3ItYWN0aXZpdHkgb24KCiMgU2NyZWVuIGJpbmRpbmdzLCBzaW5jZSBwZW9wbGUgYXJlIG1vcmUgZmFtaWxpYXIgd2l0aCB0aGF0LgpzZXQtb3B0aW9uIC1nIHByZWZpeCBDLWEKYmluZCBDLWEgbGFzdC13aW5kb3cKYmluZCBhIHNlbmQta2V5IEMtYQoKYmluZCB8IHNwbGl0LXdpbmRvdyAtaApiaW5kIC0gc3BsaXQtd2luZG93IC12CgojIEZpeCBDVFJMLVBHVVAvUEdET1dOIGZvciB2aW0Kc2V0LXdpbmRvdy1vcHRpb24gLWcgeHRlcm0ta2V5cyBvbgoKIyBQcmV2ZW50IEVTQyBrZXkgZnJvbSBhZGRpbmcgZGVsYXkgYW5kIGJyZWFraW5nIFZpbSdzIEVTQyA+IGFycm93IGtleQpzZXQtb3B0aW9uIC1zIGVzY2FwZS10aW1lIDAKCkVORAogICAgICAgIGZpCmZpCgooCiAgICAjIENsb3NlIHRoZSBpbmhlcml0ZWQgbG9jayBGRCwgb3IgdG11eCB3aWxsIGtlZXAgaXQgb3Blbi4KICAgIGV4ZWMgOT4mLQogICAgZXhlYyB0bXV4IG5ldy1zZXNzaW9uIC1zIG1vbmdvZGIvMQopCikgOT4vdG1wL2p1anUtdW5pdC1tb25nb2RiLTEtZGVidWctaG9va3MtZXhpdAopIDg+L3RtcC9qdWp1LXVuaXQtbW9uZ29kYi0xLWRlYnVnLWhvb2tzCmV4aXQgJD8K
| base64 -d > $F; . $F'\n"),
I kinda feel that one of these ought to still be using .dns -- wouldn't
these carry on passing if we changed to always-use-internal?

https://codereview.appspot.com/97230043/diff/20001/cmd/juju/ssh.go
File cmd/juju/ssh.go (right):

https://codereview.appspot.com/97230043/diff/20001/cmd/juju/ssh.go#newcode138
cmd/juju/ssh.go:138: }
can we maybe wrap...

Read more...

Revision history for this message
Andrew Wilkins (axwalk) wrote :
Download full text (3.8 KiB)

Please take a look.

https://codereview.appspot.com/97230043/diff/20001/cmd/juju/debughooks_test.go
File cmd/juju/debughooks_test.go (right):

https://codereview.appspot.com/97230043/diff/20001/cmd/juju/debughooks_test.go#newcode35
cmd/juju/debughooks_test.go:35: result: regexp.QuoteMeta(debugHooksArgs
+ "<email address hidden> sudo /bin/bash -c 'F=$(mktemp); echo
IyEvYmluL2Jhc2gKKAojIExvY2sgdGhlIGp1anUtPHVuaXQ+LWRlYnVnIGxvY2tmaWxlLgpmbG9jayAtbiA4IHx8IChlY2hvICJGYWlsZWQgdG8gYWNxdWlyZSAvdG1wL2p1anUtdW5pdC1tb25nb2RiLTEtZGVidWctaG9va3M6IHVuaXQgaXMgYWxyZWFkeSBiZWluZyBkZWJ1Z2dlZCIgMj4mMTsgZXhpdCAxKQooCiMgQ2xvc2UgdGhlIGluaGVyaXRlZCBsb2NrIEZELCBvciB0bXV4IHdpbGwga2VlcCBpdCBvcGVuLgpleGVjIDg+Ji0KCiMgV3JpdGUgb3V0IHRoZSBkZWJ1Zy1ob29rcyBhcmdzLgplY2hvICJlMzBLIiB8IGJhc2U2NCAtZCA+IC90bXAvanVqdS11bml0LW1vbmdvZGItMS1kZWJ1Zy1ob29rcwoKIyBMb2NrIHRoZSBqdWp1LTx1bml0Pi1kZWJ1Zy1leGl0IGxvY2tmaWxlLgpmbG9jayAtbiA5IHx8IGV4aXQgMQoKIyBXYWl0IGZvciB0bXV4IHRvIGJlIGluc3RhbGxlZC4Kd2hpbGUgWyAhIC1mIC91c3IvYmluL3RtdXggXTsgZG8KICAgIHNsZWVwIDEKZG9uZQoKaWYgWyAhIC1mIH4vLnRtdXguY29uZiBdOyB0aGVuCiAgICAgICAgaWYgWyAtZiAvdXNyL3NoYXJlL2J5b2J1L3Byb2ZpbGVzL3RtdXggXTsgdGhlbgogICAgICAgICAgICAgICAgIyBVc2UgYnlvYnUvdG11eCBwcm9maWxlIGZvciBmYW1pbGlhciBrZXliaW5kaW5ncyBhbmQgYnJhbmRpbmcKICAgICAgICAgICAgICAgIGVjaG8gInNvdXJjZS1maWxlIC91c3Ivc2hhcmUvYnlvYnUvcHJvZmlsZXMvdG11eCIgPiB+Ly50bXV4LmNvbmYKICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAjIE90aGVyd2lzZSwgdXNlIHRoZSBsZWdhY3kganVqdS90bXV4IGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgIGNhdCA+IH4vLnRtdXguY29uZiA8PEVORAogICAgICAgICAgICAgICAgCiMgU3RhdHVzIGJhcgpzZXQtb3B0aW9uIC1nIHN0YXR1cy1iZyBibGFjawpzZXQtb3B0aW9uIC1nIHN0YXR1cy1mZyB3aGl0ZQoKc2V0LXdpbmRvdy1vcHRpb24gLWcgd2luZG93LXN0YXR1cy1jdXJyZW50LWJnIHJlZApzZXQtd2luZG93LW9wdGlvbiAtZyB3aW5kb3ctc3RhdHVzLWN1cnJlbnQtYXR0ciBicmlnaHQKCnNldC1vcHRpb24gLWcgc3RhdHVzLXJpZ2h0ICcnCgojIFBhbmVzCnNldC1vcHRpb24gLWcgcGFuZS1ib3JkZXItZmcgd2hpdGUKc2V0LW9wdGlvbiAtZyBwYW5lLWFjdGl2ZS1ib3JkZXItZmcgd2hpdGUKCiMgTW9uaXRvciBhY3Rpdml0eSBvbiB3aW5kb3dzCnNldC13aW5kb3ctb3B0aW9uIC1nIG1vbml0b3ItYWN0aXZpdHkgb24KCiMgU2NyZWVuIGJpbmRpbmdzLCBzaW5jZSBwZW9wbGUgYXJlIG1vcmUgZmFtaWxpYXIgd2l0aCB0aGF0LgpzZXQtb3B0aW9uIC1nIHByZWZpeCBDLWEKYmluZCBDLWEgbGFzdC13aW5kb3cKYmluZCBhIHNlbmQta2V5IEMtYQoKYmluZCB8IHNwbGl0LXdpbmRvdyAtaApiaW5kIC0gc3BsaXQtd2luZG93IC12CgojIEZpeCBDVFJMLVBHVVAvUEdET1dOIGZvciB2aW0Kc2V0LXdpbmRvdy1vcHRpb24gLWcgeHRlcm0ta2V5cyBvbgoKIyBQcmV2ZW50IEVTQyBrZXkgZnJvbSBhZGRpbmcgZGVsYXkgYW5kIGJyZWFraW5nIFZpbSdzIEVTQyA+IGFycm93IGtleQpzZXQtb3B0aW9uIC1zIGVzY2FwZS10aW1lIDAKCkVORAogICAgICAgIGZpCmZpCgooCiAgICAjIENsb3NlIHRoZSBpbmhlcml0ZWQgbG9jayBGRCwgb3IgdG11eCB3aWxsIGtlZXAgaXQgb3Blbi4KICAgIGV4ZWMgOT4mLQogICAgZXhlYyB0bXV4IG5ldy1zZXNzaW9uIC1zIG1vbmdvZGIvMQopCikgOT4vdG1wL2p1anUtdW5pdC1tb25nb2RiLTEtZGVidWctaG9va3MtZXhpdAopIDg+L3RtcC9qdWp1LXVuaXQtbW9uZ29kYi0xLWRlYnVnLWhvb2tzCmV4aXQgJD8K
| base64 -d > $F; . $F'\n"),
On 2014/05/09 06:47:58, fwereade wrote:
> I kinda feel that one of these ought to still be using .dns --
wouldn't these
> carry on passing if we changed to always-use-internal?

Reverted these, and added a new test that explicitly tests --proxy=true.

https://codereview.appspot.com/97230043/diff/20001/cmd/juju/ssh.go
File cmd/juju/ssh.go (right)...

Read more...

Revision history for this message
Go Bot (go-bot) wrote :
Download full text (11.7 KiB)

The attempt to merge lp:~axwalk/juju-core/lp1313785-ssh-useproxy into lp:juju-core failed. Below is the output from the failed tests.

ok launchpad.net/juju-core 0.014s
ok launchpad.net/juju-core/agent 0.907s
ok launchpad.net/juju-core/agent/mongo 0.441s
ok launchpad.net/juju-core/agent/tools 0.158s
ok launchpad.net/juju-core/bzr 5.222s
ok launchpad.net/juju-core/cert 2.809s
ok launchpad.net/juju-core/charm 0.387s
? launchpad.net/juju-core/charm/hooks [no test files]
? launchpad.net/juju-core/charm/testing [no test files]
ok launchpad.net/juju-core/cloudinit 0.030s
ok launchpad.net/juju-core/cloudinit/sshinit 0.751s
ok launchpad.net/juju-core/cmd 0.173s
ok launchpad.net/juju-core/cmd/charm-admin 0.282s
? launchpad.net/juju-core/cmd/charmd [no test files]
? launchpad.net/juju-core/cmd/charmload [no test files]
ok launchpad.net/juju-core/cmd/envcmd 0.179s
ok launchpad.net/juju-core/cmd/juju 226.591s
ok launchpad.net/juju-core/cmd/jujud 67.672s
ok launchpad.net/juju-core/cmd/plugins/juju-metadata 9.518s
? launchpad.net/juju-core/cmd/plugins/juju-restore [no test files]
ok launchpad.net/juju-core/cmd/plugins/local 0.180s
? launchpad.net/juju-core/cmd/plugins/local/juju-local [no test files]
ok launchpad.net/juju-core/constraints 0.040s
ok launchpad.net/juju-core/container 0.053s
ok launchpad.net/juju-core/container/factory 0.043s
ok launchpad.net/juju-core/container/kvm 0.198s
ok launchpad.net/juju-core/container/kvm/mock 0.036s
? launchpad.net/juju-core/container/kvm/testing [no test files]
ok launchpad.net/juju-core/container/lxc 4.297s
? launchpad.net/juju-core/container/lxc/mock [no test files]
? launchpad.net/juju-core/container/lxc/testing [no test files]
? launchpad.net/juju-core/container/testing [no test files]
ok launchpad.net/juju-core/downloader 5.260s
ok launchpad.net/juju-core/environs 2.492s
ok launchpad.net/juju-core/environs/bootstrap 12.831s
ok launchpad.net/juju-core/environs/cloudinit 0.493s
ok launchpad.net/juju-core/environs/config 1.929s
ok launchpad.net/juju-core/environs/configstore 0.030s
ok launchpad.net/juju-core/environs/filestorage 0.026s
ok launchpad.net/juju-core/environs/httpstorage 0.664s
ok launchpad.net/juju-core/environs/imagemetadata 0.433s
? launchpad.net/juju-core/environs/imagemetadata/testing [no test files]
ok launchpad.net/juju-core/environs/instances 0.049s
ok launchpad.net/juju-core/environs/jujutest 0.146s
ok launchpad.net/juju-core/environs/manual 14.232s
? launchpad.net/juju-core/environs/network [no test files]
ok launchpad.net/juju-core/environs/simplestreams 0.291s
? launchpad.net/juju-core/environs/simplestreams/testing [no test files]
ok launchpad.net/juju-core/environs/sshstorage 0.879s
ok launchpad.net/juju-core/environs/storage 0.759s
ok launchpad.net/juju-core/environs/sync 51.210s
ok launchpad.net/juju-core/environs/testing 0.148s
ok launchpad.net/juju-core/environs/tools 5.358s
? launchpad.net/juju-core/environs/tools/testing [no test files]
ok launchpad.net/juju-core/errors 0.020s
ok launchpad.net/juju-core/instance 0.019s
? launchpad.net/juju-core/instance/te...

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'cmd/juju/debughooks_test.go'
2--- cmd/juju/debughooks_test.go 2014-02-22 11:28:24 +0000
3+++ cmd/juju/debughooks_test.go 2014-05-09 07:43:16 +0000
4@@ -4,12 +4,10 @@
5 package main
6
7 import (
8- "bytes"
9 "regexp"
10
11 gc "launchpad.net/gocheck"
12
13- "launchpad.net/juju-core/cmd"
14 coretesting "launchpad.net/juju-core/testing"
15 )
16
17@@ -20,19 +18,24 @@
18 }
19
20 const debugHooksArgs = sshArgs
21+const debugHooksArgsNoProxy = sshArgsNoProxy
22
23 var debugHooksTests = []struct {
24 info string
25 args []string
26- code int
27+ error string
28+ proxy bool
29 result string
30- stderr string
31 }{{
32 args: []string{"mysql/0"},
33- result: regexp.QuoteMeta(debugHooksArgs + "ubuntu@dummyenv-0.dns sudo /bin/bash -c 'F=$(mktemp); echo IyEvYmluL2Jhc2gKKAojIExvY2sgdGhlIGp1anUtPHVuaXQ+LWRlYnVnIGxvY2tmaWxlLgpmbG9jayAtbiA4IHx8IChlY2hvICJGYWlsZWQgdG8gYWNxdWlyZSAvdG1wL2p1anUtdW5pdC1teXNxbC0wLWRlYnVnLWhvb2tzOiB1bml0IGlzIGFscmVhZHkgYmVpbmcgZGVidWdnZWQiIDI+JjE7IGV4aXQgMSkKKAojIENsb3NlIHRoZSBpbmhlcml0ZWQgbG9jayBGRCwgb3IgdG11eCB3aWxsIGtlZXAgaXQgb3Blbi4KZXhlYyA4PiYtCgojIFdyaXRlIG91dCB0aGUgZGVidWctaG9va3MgYXJncy4KZWNobyAiZTMwSyIgfCBiYXNlNjQgLWQgPiAvdG1wL2p1anUtdW5pdC1teXNxbC0wLWRlYnVnLWhvb2tzCgojIExvY2sgdGhlIGp1anUtPHVuaXQ+LWRlYnVnLWV4aXQgbG9ja2ZpbGUuCmZsb2NrIC1uIDkgfHwgZXhpdCAxCgojIFdhaXQgZm9yIHRtdXggdG8gYmUgaW5zdGFsbGVkLgp3aGlsZSBbICEgLWYgL3Vzci9iaW4vdG11eCBdOyBkbwogICAgc2xlZXAgMQpkb25lCgppZiBbICEgLWYgfi8udG11eC5jb25mIF07IHRoZW4KICAgICAgICBpZiBbIC1mIC91c3Ivc2hhcmUvYnlvYnUvcHJvZmlsZXMvdG11eCBdOyB0aGVuCiAgICAgICAgICAgICAgICAjIFVzZSBieW9idS90bXV4IHByb2ZpbGUgZm9yIGZhbWlsaWFyIGtleWJpbmRpbmdzIGFuZCBicmFuZGluZwogICAgICAgICAgICAgICAgZWNobyAic291cmNlLWZpbGUgL3Vzci9zaGFyZS9ieW9idS9wcm9maWxlcy90bXV4IiA+IH4vLnRtdXguY29uZgogICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICMgT3RoZXJ3aXNlLCB1c2UgdGhlIGxlZ2FjeSBqdWp1L3RtdXggY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgY2F0ID4gfi8udG11eC5jb25mIDw8RU5ECiAgICAgICAgICAgICAgICAKIyBTdGF0dXMgYmFyCnNldC1vcHRpb24gLWcgc3RhdHVzLWJnIGJsYWNrCnNldC1vcHRpb24gLWcgc3RhdHVzLWZnIHdoaXRlCgpzZXQtd2luZG93LW9wdGlvbiAtZyB3aW5kb3ctc3RhdHVzLWN1cnJlbnQtYmcgcmVkCnNldC13aW5kb3ctb3B0aW9uIC1nIHdpbmRvdy1zdGF0dXMtY3VycmVudC1hdHRyIGJyaWdodAoKc2V0LW9wdGlvbiAtZyBzdGF0dXMtcmlnaHQgJycKCiMgUGFuZXMKc2V0LW9wdGlvbiAtZyBwYW5lLWJvcmRlci1mZyB3aGl0ZQpzZXQtb3B0aW9uIC1nIHBhbmUtYWN0aXZlLWJvcmRlci1mZyB3aGl0ZQoKIyBNb25pdG9yIGFjdGl2aXR5IG9uIHdpbmRvd3MKc2V0LXdpbmRvdy1vcHRpb24gLWcgbW9uaXRvci1hY3Rpdml0eSBvbgoKIyBTY3JlZW4gYmluZGluZ3MsIHNpbmNlIHBlb3BsZSBhcmUgbW9yZSBmYW1pbGlhciB3aXRoIHRoYXQuCnNldC1vcHRpb24gLWcgcHJlZml4IEMtYQpiaW5kIEMtYSBsYXN0LXdpbmRvdwpiaW5kIGEgc2VuZC1rZXkgQy1hCgpiaW5kIHwgc3BsaXQtd2luZG93IC1oCmJpbmQgLSBzcGxpdC13aW5kb3cgLXYKCiMgRml4IENUUkwtUEdVUC9QR0RPV04gZm9yIHZpbQpzZXQtd2luZG93LW9wdGlvbiAtZyB4dGVybS1rZXlzIG9uCgojIFByZXZlbnQgRVNDIGtleSBmcm9tIGFkZGluZyBkZWxheSBhbmQgYnJlYWtpbmcgVmltJ3MgRVNDID4gYXJyb3cga2V5CnNldC1vcHRpb24gLXMgZXNjYXBlLXRpbWUgMAoKRU5ECiAgICAgICAgZmkKZmkKCigKICAgICMgQ2xvc2UgdGhlIGluaGVyaXRlZCBsb2NrIEZELCBvciB0bXV4IHdpbGwga2VlcCBpdCBvcGVuLgogICAgZXhlYyA5PiYtCiAgICBleGVjIHRtdXggbmV3LXNlc3Npb24gLXMgbXlzcWwvMAopCikgOT4vdG1wL2p1anUtdW5pdC1teXNxbC0wLWRlYnVnLWhvb2tzLWV4aXQKKSA4Pi90bXAvanVqdS11bml0LW15c3FsLTAtZGVidWctaG9va3MKZXhpdCAkPwo= | base64 -d > $F; . $F'\n"),
34+ result: regexp.QuoteMeta(debugHooksArgsNoProxy + "ubuntu@dummyenv-0.dns sudo /bin/bash -c 'F=$(mktemp); echo IyEvYmluL2Jhc2gKKAojIExvY2sgdGhlIGp1anUtPHVuaXQ+LWRlYnVnIGxvY2tmaWxlLgpmbG9jayAtbiA4IHx8IChlY2hvICJGYWlsZWQgdG8gYWNxdWlyZSAvdG1wL2p1anUtdW5pdC1teXNxbC0wLWRlYnVnLWhvb2tzOiB1bml0IGlzIGFscmVhZHkgYmVpbmcgZGVidWdnZWQiIDI+JjE7IGV4aXQgMSkKKAojIENsb3NlIHRoZSBpbmhlcml0ZWQgbG9jayBGRCwgb3IgdG11eCB3aWxsIGtlZXAgaXQgb3Blbi4KZXhlYyA4PiYtCgojIFdyaXRlIG91dCB0aGUgZGVidWctaG9va3MgYXJncy4KZWNobyAiZTMwSyIgfCBiYXNlNjQgLWQgPiAvdG1wL2p1anUtdW5pdC1teXNxbC0wLWRlYnVnLWhvb2tzCgojIExvY2sgdGhlIGp1anUtPHVuaXQ+LWRlYnVnLWV4aXQgbG9ja2ZpbGUuCmZsb2NrIC1uIDkgfHwgZXhpdCAxCgojIFdhaXQgZm9yIHRtdXggdG8gYmUgaW5zdGFsbGVkLgp3aGlsZSBbICEgLWYgL3Vzci9iaW4vdG11eCBdOyBkbwogICAgc2xlZXAgMQpkb25lCgppZiBbICEgLWYgfi8udG11eC5jb25mIF07IHRoZW4KICAgICAgICBpZiBbIC1mIC91c3Ivc2hhcmUvYnlvYnUvcHJvZmlsZXMvdG11eCBdOyB0aGVuCiAgICAgICAgICAgICAgICAjIFVzZSBieW9idS90bXV4IHByb2ZpbGUgZm9yIGZhbWlsaWFyIGtleWJpbmRpbmdzIGFuZCBicmFuZGluZwogICAgICAgICAgICAgICAgZWNobyAic291cmNlLWZpbGUgL3Vzci9zaGFyZS9ieW9idS9wcm9maWxlcy90bXV4IiA+IH4vLnRtdXguY29uZgogICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICMgT3RoZXJ3aXNlLCB1c2UgdGhlIGxlZ2FjeSBqdWp1L3RtdXggY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgY2F0ID4gfi8udG11eC5jb25mIDw8RU5ECiAgICAgICAgICAgICAgICAKIyBTdGF0dXMgYmFyCnNldC1vcHRpb24gLWcgc3RhdHVzLWJnIGJsYWNrCnNldC1vcHRpb24gLWcgc3RhdHVzLWZnIHdoaXRlCgpzZXQtd2luZG93LW9wdGlvbiAtZyB3aW5kb3ctc3RhdHVzLWN1cnJlbnQtYmcgcmVkCnNldC13aW5kb3ctb3B0aW9uIC1nIHdpbmRvdy1zdGF0dXMtY3VycmVudC1hdHRyIGJyaWdodAoKc2V0LW9wdGlvbiAtZyBzdGF0dXMtcmlnaHQgJycKCiMgUGFuZXMKc2V0LW9wdGlvbiAtZyBwYW5lLWJvcmRlci1mZyB3aGl0ZQpzZXQtb3B0aW9uIC1nIHBhbmUtYWN0aXZlLWJvcmRlci1mZyB3aGl0ZQoKIyBNb25pdG9yIGFjdGl2aXR5IG9uIHdpbmRvd3MKc2V0LXdpbmRvdy1vcHRpb24gLWcgbW9uaXRvci1hY3Rpdml0eSBvbgoKIyBTY3JlZW4gYmluZGluZ3MsIHNpbmNlIHBlb3BsZSBhcmUgbW9yZSBmYW1pbGlhciB3aXRoIHRoYXQuCnNldC1vcHRpb24gLWcgcHJlZml4IEMtYQpiaW5kIEMtYSBsYXN0LXdpbmRvdwpiaW5kIGEgc2VuZC1rZXkgQy1hCgpiaW5kIHwgc3BsaXQtd2luZG93IC1oCmJpbmQgLSBzcGxpdC13aW5kb3cgLXYKCiMgRml4IENUUkwtUEdVUC9QR0RPV04gZm9yIHZpbQpzZXQtd2luZG93LW9wdGlvbiAtZyB4dGVybS1rZXlzIG9uCgojIFByZXZlbnQgRVNDIGtleSBmcm9tIGFkZGluZyBkZWxheSBhbmQgYnJlYWtpbmcgVmltJ3MgRVNDID4gYXJyb3cga2V5CnNldC1vcHRpb24gLXMgZXNjYXBlLXRpbWUgMAoKRU5ECiAgICAgICAgZmkKZmkKCigKICAgICMgQ2xvc2UgdGhlIGluaGVyaXRlZCBsb2NrIEZELCBvciB0bXV4IHdpbGwga2VlcCBpdCBvcGVuLgogICAgZXhlYyA5PiYtCiAgICBleGVjIHRtdXggbmV3LXNlc3Npb24gLXMgbXlzcWwvMAopCikgOT4vdG1wL2p1anUtdW5pdC1teXNxbC0wLWRlYnVnLWhvb2tzLWV4aXQKKSA4Pi90bXAvanVqdS11bml0LW15c3FsLTAtZGVidWctaG9va3MKZXhpdCAkPwo= | base64 -d > $F; . $F'\n"),
35 }, {
36 args: []string{"mongodb/1"},
37- result: regexp.QuoteMeta(debugHooksArgs + "ubuntu@dummyenv-2.dns sudo /bin/bash -c 'F=$(mktemp); echo IyEvYmluL2Jhc2gKKAojIExvY2sgdGhlIGp1anUtPHVuaXQ+LWRlYnVnIGxvY2tmaWxlLgpmbG9jayAtbiA4IHx8IChlY2hvICJGYWlsZWQgdG8gYWNxdWlyZSAvdG1wL2p1anUtdW5pdC1tb25nb2RiLTEtZGVidWctaG9va3M6IHVuaXQgaXMgYWxyZWFkeSBiZWluZyBkZWJ1Z2dlZCIgMj4mMTsgZXhpdCAxKQooCiMgQ2xvc2UgdGhlIGluaGVyaXRlZCBsb2NrIEZELCBvciB0bXV4IHdpbGwga2VlcCBpdCBvcGVuLgpleGVjIDg+Ji0KCiMgV3JpdGUgb3V0IHRoZSBkZWJ1Zy1ob29rcyBhcmdzLgplY2hvICJlMzBLIiB8IGJhc2U2NCAtZCA+IC90bXAvanVqdS11bml0LW1vbmdvZGItMS1kZWJ1Zy1ob29rcwoKIyBMb2NrIHRoZSBqdWp1LTx1bml0Pi1kZWJ1Zy1leGl0IGxvY2tmaWxlLgpmbG9jayAtbiA5IHx8IGV4aXQgMQoKIyBXYWl0IGZvciB0bXV4IHRvIGJlIGluc3RhbGxlZC4Kd2hpbGUgWyAhIC1mIC91c3IvYmluL3RtdXggXTsgZG8KICAgIHNsZWVwIDEKZG9uZQoKaWYgWyAhIC1mIH4vLnRtdXguY29uZiBdOyB0aGVuCiAgICAgICAgaWYgWyAtZiAvdXNyL3NoYXJlL2J5b2J1L3Byb2ZpbGVzL3RtdXggXTsgdGhlbgogICAgICAgICAgICAgICAgIyBVc2UgYnlvYnUvdG11eCBwcm9maWxlIGZvciBmYW1pbGlhciBrZXliaW5kaW5ncyBhbmQgYnJhbmRpbmcKICAgICAgICAgICAgICAgIGVjaG8gInNvdXJjZS1maWxlIC91c3Ivc2hhcmUvYnlvYnUvcHJvZmlsZXMvdG11eCIgPiB+Ly50bXV4LmNvbmYKICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAjIE90aGVyd2lzZSwgdXNlIHRoZSBsZWdhY3kganVqdS90bXV4IGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgIGNhdCA+IH4vLnRtdXguY29uZiA8PEVORAogICAgICAgICAgICAgICAgCiMgU3RhdHVzIGJhcgpzZXQtb3B0aW9uIC1nIHN0YXR1cy1iZyBibGFjawpzZXQtb3B0aW9uIC1nIHN0YXR1cy1mZyB3aGl0ZQoKc2V0LXdpbmRvdy1vcHRpb24gLWcgd2luZG93LXN0YXR1cy1jdXJyZW50LWJnIHJlZApzZXQtd2luZG93LW9wdGlvbiAtZyB3aW5kb3ctc3RhdHVzLWN1cnJlbnQtYXR0ciBicmlnaHQKCnNldC1vcHRpb24gLWcgc3RhdHVzLXJpZ2h0ICcnCgojIFBhbmVzCnNldC1vcHRpb24gLWcgcGFuZS1ib3JkZXItZmcgd2hpdGUKc2V0LW9wdGlvbiAtZyBwYW5lLWFjdGl2ZS1ib3JkZXItZmcgd2hpdGUKCiMgTW9uaXRvciBhY3Rpdml0eSBvbiB3aW5kb3dzCnNldC13aW5kb3ctb3B0aW9uIC1nIG1vbml0b3ItYWN0aXZpdHkgb24KCiMgU2NyZWVuIGJpbmRpbmdzLCBzaW5jZSBwZW9wbGUgYXJlIG1vcmUgZmFtaWxpYXIgd2l0aCB0aGF0LgpzZXQtb3B0aW9uIC1nIHByZWZpeCBDLWEKYmluZCBDLWEgbGFzdC13aW5kb3cKYmluZCBhIHNlbmQta2V5IEMtYQoKYmluZCB8IHNwbGl0LXdpbmRvdyAtaApiaW5kIC0gc3BsaXQtd2luZG93IC12CgojIEZpeCBDVFJMLVBHVVAvUEdET1dOIGZvciB2aW0Kc2V0LXdpbmRvdy1vcHRpb24gLWcgeHRlcm0ta2V5cyBvbgoKIyBQcmV2ZW50IEVTQyBrZXkgZnJvbSBhZGRpbmcgZGVsYXkgYW5kIGJyZWFraW5nIFZpbSdzIEVTQyA+IGFycm93IGtleQpzZXQtb3B0aW9uIC1zIGVzY2FwZS10aW1lIDAKCkVORAogICAgICAgIGZpCmZpCgooCiAgICAjIENsb3NlIHRoZSBpbmhlcml0ZWQgbG9jayBGRCwgb3IgdG11eCB3aWxsIGtlZXAgaXQgb3Blbi4KICAgIGV4ZWMgOT4mLQogICAgZXhlYyB0bXV4IG5ldy1zZXNzaW9uIC1zIG1vbmdvZGIvMQopCikgOT4vdG1wL2p1anUtdW5pdC1tb25nb2RiLTEtZGVidWctaG9va3MtZXhpdAopIDg+L3RtcC9qdWp1LXVuaXQtbW9uZ29kYi0xLWRlYnVnLWhvb2tzCmV4aXQgJD8K | base64 -d > $F; . $F'\n"),
38+ result: regexp.QuoteMeta(debugHooksArgsNoProxy + "ubuntu@dummyenv-2.dns sudo /bin/bash -c 'F=$(mktemp); echo IyEvYmluL2Jhc2gKKAojIExvY2sgdGhlIGp1anUtPHVuaXQ+LWRlYnVnIGxvY2tmaWxlLgpmbG9jayAtbiA4IHx8IChlY2hvICJGYWlsZWQgdG8gYWNxdWlyZSAvdG1wL2p1anUtdW5pdC1tb25nb2RiLTEtZGVidWctaG9va3M6IHVuaXQgaXMgYWxyZWFkeSBiZWluZyBkZWJ1Z2dlZCIgMj4mMTsgZXhpdCAxKQooCiMgQ2xvc2UgdGhlIGluaGVyaXRlZCBsb2NrIEZELCBvciB0bXV4IHdpbGwga2VlcCBpdCBvcGVuLgpleGVjIDg+Ji0KCiMgV3JpdGUgb3V0IHRoZSBkZWJ1Zy1ob29rcyBhcmdzLgplY2hvICJlMzBLIiB8IGJhc2U2NCAtZCA+IC90bXAvanVqdS11bml0LW1vbmdvZGItMS1kZWJ1Zy1ob29rcwoKIyBMb2NrIHRoZSBqdWp1LTx1bml0Pi1kZWJ1Zy1leGl0IGxvY2tmaWxlLgpmbG9jayAtbiA5IHx8IGV4aXQgMQoKIyBXYWl0IGZvciB0bXV4IHRvIGJlIGluc3RhbGxlZC4Kd2hpbGUgWyAhIC1mIC91c3IvYmluL3RtdXggXTsgZG8KICAgIHNsZWVwIDEKZG9uZQoKaWYgWyAhIC1mIH4vLnRtdXguY29uZiBdOyB0aGVuCiAgICAgICAgaWYgWyAtZiAvdXNyL3NoYXJlL2J5b2J1L3Byb2ZpbGVzL3RtdXggXTsgdGhlbgogICAgICAgICAgICAgICAgIyBVc2UgYnlvYnUvdG11eCBwcm9maWxlIGZvciBmYW1pbGlhciBrZXliaW5kaW5ncyBhbmQgYnJhbmRpbmcKICAgICAgICAgICAgICAgIGVjaG8gInNvdXJjZS1maWxlIC91c3Ivc2hhcmUvYnlvYnUvcHJvZmlsZXMvdG11eCIgPiB+Ly50bXV4LmNvbmYKICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAjIE90aGVyd2lzZSwgdXNlIHRoZSBsZWdhY3kganVqdS90bXV4IGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgIGNhdCA+IH4vLnRtdXguY29uZiA8PEVORAogICAgICAgICAgICAgICAgCiMgU3RhdHVzIGJhcgpzZXQtb3B0aW9uIC1nIHN0YXR1cy1iZyBibGFjawpzZXQtb3B0aW9uIC1nIHN0YXR1cy1mZyB3aGl0ZQoKc2V0LXdpbmRvdy1vcHRpb24gLWcgd2luZG93LXN0YXR1cy1jdXJyZW50LWJnIHJlZApzZXQtd2luZG93LW9wdGlvbiAtZyB3aW5kb3ctc3RhdHVzLWN1cnJlbnQtYXR0ciBicmlnaHQKCnNldC1vcHRpb24gLWcgc3RhdHVzLXJpZ2h0ICcnCgojIFBhbmVzCnNldC1vcHRpb24gLWcgcGFuZS1ib3JkZXItZmcgd2hpdGUKc2V0LW9wdGlvbiAtZyBwYW5lLWFjdGl2ZS1ib3JkZXItZmcgd2hpdGUKCiMgTW9uaXRvciBhY3Rpdml0eSBvbiB3aW5kb3dzCnNldC13aW5kb3ctb3B0aW9uIC1nIG1vbml0b3ItYWN0aXZpdHkgb24KCiMgU2NyZWVuIGJpbmRpbmdzLCBzaW5jZSBwZW9wbGUgYXJlIG1vcmUgZmFtaWxpYXIgd2l0aCB0aGF0LgpzZXQtb3B0aW9uIC1nIHByZWZpeCBDLWEKYmluZCBDLWEgbGFzdC13aW5kb3cKYmluZCBhIHNlbmQta2V5IEMtYQoKYmluZCB8IHNwbGl0LXdpbmRvdyAtaApiaW5kIC0gc3BsaXQtd2luZG93IC12CgojIEZpeCBDVFJMLVBHVVAvUEdET1dOIGZvciB2aW0Kc2V0LXdpbmRvdy1vcHRpb24gLWcgeHRlcm0ta2V5cyBvbgoKIyBQcmV2ZW50IEVTQyBrZXkgZnJvbSBhZGRpbmcgZGVsYXkgYW5kIGJyZWFraW5nIFZpbSdzIEVTQyA+IGFycm93IGtleQpzZXQtb3B0aW9uIC1zIGVzY2FwZS10aW1lIDAKCkVORAogICAgICAgIGZpCmZpCgooCiAgICAjIENsb3NlIHRoZSBpbmhlcml0ZWQgbG9jayBGRCwgb3IgdG11eCB3aWxsIGtlZXAgaXQgb3Blbi4KICAgIGV4ZWMgOT4mLQogICAgZXhlYyB0bXV4IG5ldy1zZXNzaW9uIC1zIG1vbmdvZGIvMQopCikgOT4vdG1wL2p1anUtdW5pdC1tb25nb2RiLTEtZGVidWctaG9va3MtZXhpdAopIDg+L3RtcC9qdWp1LXVuaXQtbW9uZ29kYi0xLWRlYnVnLWhvb2tzCmV4aXQgJD8K | base64 -d > $F; . $F'\n"),
39+}, {
40+ args: []string{"mysql/0"},
41+ proxy: true,
42+ result: regexp.QuoteMeta(debugHooksArgs + "ubuntu@dummyenv-0.internal sudo /bin/bash -c 'F=$(mktemp); echo IyEvYmluL2Jhc2gKKAojIExvY2sgdGhlIGp1anUtPHVuaXQ+LWRlYnVnIGxvY2tmaWxlLgpmbG9jayAtbiA4IHx8IChlY2hvICJGYWlsZWQgdG8gYWNxdWlyZSAvdG1wL2p1anUtdW5pdC1teXNxbC0wLWRlYnVnLWhvb2tzOiB1bml0IGlzIGFscmVhZHkgYmVpbmcgZGVidWdnZWQiIDI+JjE7IGV4aXQgMSkKKAojIENsb3NlIHRoZSBpbmhlcml0ZWQgbG9jayBGRCwgb3IgdG11eCB3aWxsIGtlZXAgaXQgb3Blbi4KZXhlYyA4PiYtCgojIFdyaXRlIG91dCB0aGUgZGVidWctaG9va3MgYXJncy4KZWNobyAiZTMwSyIgfCBiYXNlNjQgLWQgPiAvdG1wL2p1anUtdW5pdC1teXNxbC0wLWRlYnVnLWhvb2tzCgojIExvY2sgdGhlIGp1anUtPHVuaXQ+LWRlYnVnLWV4aXQgbG9ja2ZpbGUuCmZsb2NrIC1uIDkgfHwgZXhpdCAxCgojIFdhaXQgZm9yIHRtdXggdG8gYmUgaW5zdGFsbGVkLgp3aGlsZSBbICEgLWYgL3Vzci9iaW4vdG11eCBdOyBkbwogICAgc2xlZXAgMQpkb25lCgppZiBbICEgLWYgfi8udG11eC5jb25mIF07IHRoZW4KICAgICAgICBpZiBbIC1mIC91c3Ivc2hhcmUvYnlvYnUvcHJvZmlsZXMvdG11eCBdOyB0aGVuCiAgICAgICAgICAgICAgICAjIFVzZSBieW9idS90bXV4IHByb2ZpbGUgZm9yIGZhbWlsaWFyIGtleWJpbmRpbmdzIGFuZCBicmFuZGluZwogICAgICAgICAgICAgICAgZWNobyAic291cmNlLWZpbGUgL3Vzci9zaGFyZS9ieW9idS9wcm9maWxlcy90bXV4IiA+IH4vLnRtdXguY29uZgogICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICMgT3RoZXJ3aXNlLCB1c2UgdGhlIGxlZ2FjeSBqdWp1L3RtdXggY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgY2F0ID4gfi8udG11eC5jb25mIDw8RU5ECiAgICAgICAgICAgICAgICAKIyBTdGF0dXMgYmFyCnNldC1vcHRpb24gLWcgc3RhdHVzLWJnIGJsYWNrCnNldC1vcHRpb24gLWcgc3RhdHVzLWZnIHdoaXRlCgpzZXQtd2luZG93LW9wdGlvbiAtZyB3aW5kb3ctc3RhdHVzLWN1cnJlbnQtYmcgcmVkCnNldC13aW5kb3ctb3B0aW9uIC1nIHdpbmRvdy1zdGF0dXMtY3VycmVudC1hdHRyIGJyaWdodAoKc2V0LW9wdGlvbiAtZyBzdGF0dXMtcmlnaHQgJycKCiMgUGFuZXMKc2V0LW9wdGlvbiAtZyBwYW5lLWJvcmRlci1mZyB3aGl0ZQpzZXQtb3B0aW9uIC1nIHBhbmUtYWN0aXZlLWJvcmRlci1mZyB3aGl0ZQoKIyBNb25pdG9yIGFjdGl2aXR5IG9uIHdpbmRvd3MKc2V0LXdpbmRvdy1vcHRpb24gLWcgbW9uaXRvci1hY3Rpdml0eSBvbgoKIyBTY3JlZW4gYmluZGluZ3MsIHNpbmNlIHBlb3BsZSBhcmUgbW9yZSBmYW1pbGlhciB3aXRoIHRoYXQuCnNldC1vcHRpb24gLWcgcHJlZml4IEMtYQpiaW5kIEMtYSBsYXN0LXdpbmRvdwpiaW5kIGEgc2VuZC1rZXkgQy1hCgpiaW5kIHwgc3BsaXQtd2luZG93IC1oCmJpbmQgLSBzcGxpdC13aW5kb3cgLXYKCiMgRml4IENUUkwtUEdVUC9QR0RPV04gZm9yIHZpbQpzZXQtd2luZG93LW9wdGlvbiAtZyB4dGVybS1rZXlzIG9uCgojIFByZXZlbnQgRVNDIGtleSBmcm9tIGFkZGluZyBkZWxheSBhbmQgYnJlYWtpbmcgVmltJ3MgRVNDID4gYXJyb3cga2V5CnNldC1vcHRpb24gLXMgZXNjYXBlLXRpbWUgMAoKRU5ECiAgICAgICAgZmkKZmkKCigKICAgICMgQ2xvc2UgdGhlIGluaGVyaXRlZCBsb2NrIEZELCBvciB0bXV4IHdpbGwga2VlcCBpdCBvcGVuLgogICAgZXhlYyA5PiYtCiAgICBleGVjIHRtdXggbmV3LXNlc3Npb24gLXMgbXlzcWwvMAopCikgOT4vdG1wL2p1anUtdW5pdC1teXNxbC0wLWRlYnVnLWhvb2tzLWV4aXQKKSA4Pi90bXAvanVqdS11bml0LW15c3FsLTAtZGVidWctaG9va3MKZXhpdCAkPwo= | base64 -d > $F; . $F'\n"),
43 }, {
44 info: `"*" is a valid hook name: it means hook everything`,
45 args: []string{"mysql/0", "*"},
46@@ -50,20 +53,17 @@
47 args: []string{"mysql/0", "juju-info-relation-joined"},
48 result: ".*\n",
49 }, {
50- info: `invalid unit syntax`,
51- args: []string{"mysql"},
52- code: 2,
53- stderr: `error: "mysql" is not a valid unit name` + "\n",
54-}, {
55- info: `invalid unit`,
56- args: []string{"nonexistent/123"},
57- code: 1,
58- stderr: `error: unit "nonexistent/123" not found` + "\n",
59-}, {
60- info: `invalid hook`,
61- args: []string{"mysql/0", "invalid-hook"},
62- code: 1,
63- stderr: `error: unit "mysql/0" does not contain hook "invalid-hook"` + "\n",
64+ info: `invalid unit syntax`,
65+ args: []string{"mysql"},
66+ error: `"mysql" is not a valid unit name`,
67+}, {
68+ info: `invalid unit`,
69+ args: []string{"nonexistent/123"},
70+ error: `unit "nonexistent/123" not found`,
71+}, {
72+ info: `invalid hook`,
73+ args: []string{"mysql/0", "invalid-hook"},
74+ error: `unit "mysql/0" does not contain hook "invalid-hook"`,
75 }}
76
77 func (s *DebugHooksSuite) TestDebugHooksCommand(c *gc.C) {
78@@ -79,9 +79,17 @@
79 for i, t := range debugHooksTests {
80 c.Logf("test %d: %s\n\t%s\n", i, t.info, t.args)
81 ctx := coretesting.Context(c)
82- code := cmd.Main(&DebugHooksCommand{}, ctx, t.args)
83- c.Check(code, gc.Equals, t.code)
84- c.Check(ctx.Stderr.(*bytes.Buffer).String(), gc.Matches, t.stderr)
85- c.Check(ctx.Stdout.(*bytes.Buffer).String(), gc.Matches, t.result)
86+
87+ debugHooksCmd := &DebugHooksCommand{}
88+ debugHooksCmd.proxy = true
89+ err := debugHooksCmd.Init(t.args)
90+ if err == nil {
91+ err = debugHooksCmd.Run(ctx)
92+ }
93+ if t.error != "" {
94+ c.Assert(err, gc.ErrorMatches, t.error)
95+ } else {
96+ c.Assert(err, gc.IsNil)
97+ }
98 }
99 }
100
101=== modified file 'cmd/juju/scp.go'
102--- cmd/juju/scp.go 2014-04-12 05:53:58 +0000
103+++ cmd/juju/scp.go 2014-05-09 07:43:16 +0000
104@@ -102,19 +102,14 @@
105 return err
106 }
107 defer c.apiClient.Close()
108+
109+ options, err := c.getSSHOptions(false)
110+ if err != nil {
111+ return err
112+ }
113 args, err := expandArgs(c.Args, c.hostFromTarget)
114 if err != nil {
115 return err
116 }
117-
118- var options *ssh.Options
119- if proxy, err := c.proxySSH(); err != nil {
120- return err
121- } else if proxy {
122- options = new(ssh.Options)
123- if err := c.setProxyCommand(options); err != nil {
124- return err
125- }
126- }
127 return ssh.Copy(args, options)
128 }
129
130=== modified file 'cmd/juju/scp_test.go'
131--- cmd/juju/scp_test.go 2014-04-12 05:53:58 +0000
132+++ cmd/juju/scp_test.go 2014-05-09 07:43:16 +0000
133@@ -78,7 +78,7 @@
134 }, {
135 about: "scp from machine 0 to unit mysql/0 with proxy",
136 args: []string{"0:foo", "mysql/0:/foo"},
137- result: commonArgs + "ubuntu@dummyenv-0.dns:foo ubuntu@dummyenv-0.dns:/foo\n",
138+ result: commonArgs + "ubuntu@dummyenv-0.internal:foo ubuntu@dummyenv-0.internal:/foo\n",
139 proxy: true,
140 }, {
141 args: []string{"0:foo", ".", "-rv", "-o", "SomeOption"},
142@@ -188,7 +188,15 @@
143 c.Check(strings.HasSuffix(argString, "\n"), jc.IsTrue)
144 argString = argString[:len(argString)-1]
145 args := strings.Split(argString, " ")
146- expanded, err := expandArgs(t.args, dummyHostsFromTarget)
147+ expanded, err := expandArgs(t.args, func(target string) (string, error) {
148+ if res, ok := hostsFromTargets[target]; ok {
149+ if t.proxy {
150+ res = strings.Replace(res, ".dns", ".internal", 1)
151+ }
152+ return res, nil
153+ }
154+ return target, nil
155+ })
156 c.Check(err, gc.IsNil)
157 c.Check(expanded, gc.DeepEquals, args)
158 }
159
160=== modified file 'cmd/juju/ssh.go'
161--- cmd/juju/ssh.go 2014-04-02 06:15:57 +0000
162+++ cmd/juju/ssh.go 2014-05-09 07:43:16 +0000
163@@ -111,6 +111,23 @@
164 return exec.LookPath(os.Args[0])
165 }
166
167+// getSSHOptions configures and returns SSH options and proxy settings.
168+func (c *SSHCommon) getSSHOptions(enablePty bool) (*ssh.Options, error) {
169+ var options ssh.Options
170+ if enablePty {
171+ options.EnablePTY()
172+ }
173+ var err error
174+ if c.proxy, err = c.proxySSH(); err != nil {
175+ return nil, err
176+ } else if c.proxy {
177+ if err := c.setProxyCommand(&options); err != nil {
178+ return nil, err
179+ }
180+ }
181+ return &options, nil
182+}
183+
184 // Run resolves c.Target to a machine, to the address of a i
185 // machine or unit forks ssh passing any arguments provided.
186 func (c *SSHCommand) Run(ctx *cmd.Context) error {
187@@ -124,22 +141,15 @@
188 }
189 }()
190 }
191+ options, err := c.getSSHOptions(c.pty)
192+ if err != nil {
193+ return err
194+ }
195 host, err := c.hostFromTarget(c.Target)
196 if err != nil {
197 return err
198 }
199- var options ssh.Options
200- if c.pty {
201- options.EnablePTY()
202- }
203- if proxy, err := c.proxySSH(); err != nil {
204- return err
205- } else if proxy {
206- if err := c.setProxyCommand(&options); err != nil {
207- return err
208- }
209- }
210- cmd := ssh.Command("ubuntu@"+host, c.Args, &options)
211+ cmd := ssh.Command("ubuntu@"+host, c.Args, options)
212 cmd.Stdin = ctx.Stdin
213 cmd.Stdout = ctx.Stdout
214 cmd.Stderr = ctx.Stderr
215
216=== modified file 'cmd/juju/ssh_test.go'
217--- cmd/juju/ssh_test.go 2014-04-07 00:36:36 +0000
218+++ cmd/juju/ssh_test.go 2014-05-09 07:43:16 +0000
219@@ -68,22 +68,22 @@
220 {
221 "connect to machine 0",
222 []string{"ssh", "0"},
223- sshArgs + "ubuntu@dummyenv-0.dns\n",
224+ sshArgs + "ubuntu@dummyenv-0.internal\n",
225 },
226 {
227 "connect to machine 0 and pass extra arguments",
228 []string{"ssh", "0", "uname", "-a"},
229- sshArgs + "ubuntu@dummyenv-0.dns uname -a\n",
230+ sshArgs + "ubuntu@dummyenv-0.internal uname -a\n",
231 },
232 {
233 "connect to unit mysql/0",
234 []string{"ssh", "mysql/0"},
235- sshArgs + "ubuntu@dummyenv-0.dns\n",
236+ sshArgs + "ubuntu@dummyenv-0.internal\n",
237 },
238 {
239 "connect to unit mongodb/1 and pass extra arguments",
240 []string{"ssh", "mongodb/1", "ls", "/"},
241- sshArgs + "ubuntu@dummyenv-2.dns ls /\n",
242+ sshArgs + "ubuntu@dummyenv-2.internal ls /\n",
243 },
244 {
245 "connect to unit mysql/0 without proxy",
246@@ -182,7 +182,7 @@
247 attemptStarter.next = func() bool {
248 called++
249 if called > 1 {
250- s.setAddress(m[0], c)
251+ s.setAddresses(m[0], c)
252 }
253 return true
254 }
255@@ -191,19 +191,20 @@
256 c.Assert(called, gc.Equals, 2)
257 }
258
259-func (s *SSHCommonSuite) setAddress(m *state.Machine, c *gc.C) {
260- addr := instance.NewAddress(fmt.Sprintf("dummyenv-%s.dns", m.Id()), instance.NetworkPublic)
261- err := m.SetAddresses(addr)
262+func (s *SSHCommonSuite) setAddresses(m *state.Machine, c *gc.C) {
263+ addrPub := instance.NewAddress(fmt.Sprintf("dummyenv-%s.dns", m.Id()), instance.NetworkPublic)
264+ addrPriv := instance.NewAddress(fmt.Sprintf("dummyenv-%s.internal", m.Id()), instance.NetworkCloudLocal)
265+ err := m.SetAddresses(addrPub, addrPriv)
266 c.Assert(err, gc.IsNil)
267 }
268
269-func (s *SSHCommonSuite) makeMachines(n int, c *gc.C, setAddress bool) []*state.Machine {
270+func (s *SSHCommonSuite) makeMachines(n int, c *gc.C, setAddresses bool) []*state.Machine {
271 var machines = make([]*state.Machine, n)
272 for i := 0; i < n; i++ {
273 m, err := s.State.AddMachine("quantal", state.JobHostUnits)
274 c.Assert(err, gc.IsNil)
275- if setAddress {
276- s.setAddress(m, c)
277+ if setAddresses {
278+ s.setAddresses(m, c)
279 }
280 // must set an instance id as the ssh command uses that as a signal the
281 // machine has been provisioned
282@@ -219,13 +220,4 @@
283 c.Assert(err, gc.IsNil)
284 err = u.AssignToMachine(m)
285 c.Assert(err, gc.IsNil)
286- // fudge unit.SetPublicAddress
287- id, err := m.InstanceId()
288- c.Assert(err, gc.IsNil)
289- insts, err := s.Conn.Environ.Instances([]instance.Id{id})
290- c.Assert(err, gc.IsNil)
291- addr, err := insts[0].WaitDNSName()
292- c.Assert(err, gc.IsNil)
293- err = m.SetAddresses(instance.NewAddress(addr, instance.NetworkPublic))
294- c.Assert(err, gc.IsNil)
295 }

Subscribers

People subscribed via source and target branches

to status/vote changes: