)]}'
{
  "commit": "4eceee2d0fb910acaefb43b0d221497005a68619",
  "tree": "aa254f45f06f7039ffb5c42eb2de29bfa2b6ae3b",
  "parents": [
    "1c4c1bea5ddcfdf633807dff413b61d992bb7ce5"
  ],
  "author": {
    "name": "Brad Fitzpatrick",
    "email": "bradfitz@golang.org",
    "time": "Sat Jul 22 19:15:56 2017 +0000"
  },
  "committer": {
    "name": "Brad Fitzpatrick",
    "email": "bradfitz@golang.org",
    "time": "Fri Jul 28 18:21:11 2017 +0000"
  },
  "message": "cmd/coordinator, cmd/buildlet, cmd/gomote: add SSH support\n\nThis adds an SSH server to farmer.golang.org on port 2222 that proxies\nSSH connections to users\u0027 gomote-created buildlet instances.\n\nFor example:\n\n    $ gomote create openbsd-amd64-60\n    user-bradfitz-openbsd-amd64-60-1\n\n    $ gomote ssh user-bradfitz-openbsd-amd64-60-1\n    Warning: Permanently added \u0027[localhost]:33351\u0027 (ECDSA) to the list of known hosts.\n    OpenBSD 6.0 (GENERIC.MP) golang/go#2319: Tue Jul 26 13:00:43 MDT 2016\n\n    Welcome to OpenBSD: The proactively secure Unix-like operating system.\n\n    Please use the sendbug(1) utility to report bugs in the system.\n    Before reporting a bug, please try to reproduce it with the latest\n    version of the code.  With bug reports, please try to ensure that\n    enough information to reproduce the problem is enclosed, and if a\n    known fix for it exists, include that as well.\n\n    $\n\nAs before, if the coordinator process is restarted (or crashes, is\nevicted, etc), all gomote instances die.\n\nNot yet supported:\n\n* scp (help wanted)\n* not all host types are configured. most are. some will need slight\n  config tweaks to the Docker image (e.g. adding openssh-server)\n\nSupports currently:\n\n* linux-amd64 (host type shared by 386, nacl)\n* linux-arm\n* linux-arm64\n* darwin\n* freebsd\n* openbsd\n* plan9-386\n* windows\n\nImplementation details:\n\n* the ssh server process listens on port 2222 in the coordinator\n  (farmer.golang.org), which is behind a GKE TCP load balancer.\n\n* the ssh server library is github.com/gliderlabs/ssh\n\n* authentication is done via Github users\u0027 public keys. It\u0027s assumed\n  that gomote user \u003d\u003d github user. But there\u0027s a mapping in the code\n  for known exceptions.\n\n* we can\u0027t give out access to this too widely. too many things are\n  accessible from within the host environment if you look in the right\n  places. Details omitted. But the Go team and other trusted gomote\n  users can use this.\n\n* the buildlet binary has a new /connect-ssh handler that acts like a\n  CONNECT request but instead of taking an explicit host:port, just\n  says \"give me your machine\u0027s SSH connection\". The buildlet can also\n  start sshd if needed for the environment. The /connect-ssh handler\n  also installs the coordinator\u0027s public key.\n\n* a new buildlet client library method \"ConnectSSH\" hits the /connect-ssh\n  handler and returns a net.Conn.\n\n* the coordinator\u0027s ssh.Handler is just running the OpenSSH ssh client.\n\n* because the OpenSSH ssh child process can\u0027t connect to a net.Conn,\n  an emphemeral localhost port is created on the coordinator to proxy\n  between the ssh client and the net.Conn returned by ConnectSSH.\n\n* The /connect-ssh handler requires http.Hijacker, which requires\n  fully compliant net.Conn implementations as of Go 1.8. So I needed\n  to flesh out revdial too, testing it with the\n  golang.org/x/net/nettest package.\n\n* plan9 doesn\u0027t have an ssh server, so we use 0intro\u0027s new conterm\n  program (drawterm without GUI support) to connect to plan9 from the\n  coordinator ssh proxy instead of using the OpenSSH ssh client\n  binary.\n\n* windows doesn\u0027t have an ssh server, so we enable the telnet service\n  and the coordinator ssh proxy uses telnet instead on the backend\n  on the private network. (There is a Windows ssh server but only in\n  new versions.)\n\nHappy debugging over ssh!\n\nFixes golang/go#19956\n\nChange-Id: I80a62064c5f85af1f195f980c862ba29af4015f0\nReviewed-on: https://go-review.googlesource.com/50750\nReviewed-by: Herbie Ong \u003cherbie@google.com\u003e\nReviewed-by: Jessie Frazelle \u003cme@jessfraz.com\u003e\nReviewed-by: Brad Fitzpatrick \u003cbradfitz@golang.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "611106c8ecf5216f2d05ff017b1a94a3371f49f9",
      "old_mode": 33188,
      "old_path": "buildenv/envs.go",
      "new_id": "4dde252ac9dbab4c840a5a3e9a3367075bc3dbda",
      "new_mode": 33188,
      "new_path": "buildenv/envs.go"
    },
    {
      "type": "modify",
      "old_id": "527969c04b9e706f02ba220abeba2d96e34a6c42",
      "old_mode": 33188,
      "old_path": "buildlet/buildletclient.go",
      "new_id": "0e03d837529d83f9f94db5847d1547e55027f643",
      "new_mode": 33188,
      "new_path": "buildlet/buildletclient.go"
    },
    {
      "type": "modify",
      "old_id": "e233a6145060629c269ef09e0a74d9f89191ec7c",
      "old_mode": 33188,
      "old_path": "buildlet/remote.go",
      "new_id": "ae05892d02e0e7567a46721668ee05ea0ae6d47f",
      "new_mode": 33188,
      "new_path": "buildlet/remote.go"
    },
    {
      "type": "modify",
      "old_id": "c8b58b829ff1a86b7ee23b6e55d795ef533e50cc",
      "old_mode": 33188,
      "old_path": "cmd/buildlet/buildlet.go",
      "new_id": "3095c128805c3835662bf642248fa784eccd37cc",
      "new_mode": 33188,
      "new_path": "cmd/buildlet/buildlet.go"
    },
    {
      "type": "modify",
      "old_id": "4e92885bf8bc86db12f809c969e083e37dd11a39",
      "old_mode": 33188,
      "old_path": "cmd/coordinator/Dockerfile",
      "new_id": "b92b76bf11fc551691ead14fd464c7e135b5ff76",
      "new_mode": 33188,
      "new_path": "cmd/coordinator/Dockerfile"
    },
    {
      "type": "modify",
      "old_id": "2ae6a24a7c3049876b309c2a00a52f9baa4506da",
      "old_mode": 33188,
      "old_path": "cmd/coordinator/Dockerfile.0",
      "new_id": "aec44be32964fd9ddbce9c844593a89540528555",
      "new_mode": 33188,
      "new_path": "cmd/coordinator/Dockerfile.0"
    },
    {
      "type": "modify",
      "old_id": "8a5126e96d16cd6fd74d8e7d2b2f4ecc6b4e89a9",
      "old_mode": 33188,
      "old_path": "cmd/coordinator/Makefile",
      "new_id": "3030ce03ee87040584ad93294cf962d2bba361d7",
      "new_mode": 33188,
      "new_path": "cmd/coordinator/Makefile"
    },
    {
      "type": "modify",
      "old_id": "f8ec4463e645d8c5577dfad7fff9813a49a83067",
      "old_mode": 33188,
      "old_path": "cmd/coordinator/coordinator.go",
      "new_id": "eb4d6dda16bc9f96df34ad5fd7b34aeb30427f81",
      "new_mode": 33188,
      "new_path": "cmd/coordinator/coordinator.go"
    },
    {
      "type": "modify",
      "old_id": "d8c4070444a3a52a0cac3c205d555b6f78fe1107",
      "old_mode": 33188,
      "old_path": "cmd/coordinator/deployment-dev.yaml",
      "new_id": "85a21039ba9a1691228d91277908978c9a72b74e",
      "new_mode": 33188,
      "new_path": "cmd/coordinator/deployment-dev.yaml"
    },
    {
      "type": "modify",
      "old_id": "00e39e898152f2f1853b059d262b9ef5465abd96",
      "old_mode": 33188,
      "old_path": "cmd/coordinator/deployment-prod.yaml",
      "new_id": "906c3c70d04dab706695c57e7ad53483763dd809",
      "new_mode": 33188,
      "new_path": "cmd/coordinator/deployment-prod.yaml"
    },
    {
      "type": "modify",
      "old_id": "fbda6076706358d1e8ced81988a3f11204fb4bd0",
      "old_mode": 33188,
      "old_path": "cmd/coordinator/remote.go",
      "new_id": "dbefffcf74dde53cd3a413459adaf1af3075f34a",
      "new_mode": 33188,
      "new_path": "cmd/coordinator/remote.go"
    },
    {
      "type": "modify",
      "old_id": "a111e02abe2a43bcd31ef9e5d17db84ec2a9308d",
      "old_mode": 33188,
      "old_path": "cmd/coordinator/reverse.go",
      "new_id": "fc413649d616165ba914b253b4d75085ef1f8310",
      "new_mode": 33188,
      "new_path": "cmd/coordinator/reverse.go"
    },
    {
      "type": "modify",
      "old_id": "8c50d584c64e9bad547b5bd8b9a90e0aba35e755",
      "old_mode": 33188,
      "old_path": "cmd/coordinator/service-dev.yaml",
      "new_id": "e1f5e2e15ff05bfeaadcd048a852c22ff2ef67ad",
      "new_mode": 33188,
      "new_path": "cmd/coordinator/service-dev.yaml"
    },
    {
      "type": "modify",
      "old_id": "24b99a2afaa9e1755149edeaa1647e52b9c56190",
      "old_mode": 33188,
      "old_path": "cmd/coordinator/service-prod.yaml",
      "new_id": "d2a773e28ad0a0ef44cc402b2a85d83226e19c06",
      "new_mode": 33188,
      "new_path": "cmd/coordinator/service-prod.yaml"
    },
    {
      "type": "modify",
      "old_id": "61a3f2f1da5b4f00c411b6d0a2ae46a1b84f81c0",
      "old_mode": 33188,
      "old_path": "cmd/gomote/gomote.go",
      "new_id": "a04e1ccc4ef17ac0e3087980c14b785c91c52fa8",
      "new_mode": 33188,
      "new_path": "cmd/gomote/gomote.go"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "9a918fcdba424ab6098f3af47b861b7beb5dde52",
      "new_mode": 33188,
      "new_path": "cmd/gomote/ssh.go"
    },
    {
      "type": "modify",
      "old_id": "d1b7576b215b9924f8c32280817ea9e3edb86909",
      "old_mode": 33188,
      "old_path": "dashboard/builders.go",
      "new_id": "1dcd981d0ac03ba9ae28d6597ed9969572cac161",
      "new_mode": 33188,
      "new_path": "dashboard/builders.go"
    },
    {
      "type": "modify",
      "old_id": "fe6e18a15a2613314c90d5f304db19cad9645d00",
      "old_mode": 33188,
      "old_path": "env/linux-arm64/Dockerfile",
      "new_id": "a48677339bfd9c3b9c0ceb5b70e2aa63ac2f0647",
      "new_mode": 33188,
      "new_path": "env/linux-arm64/Dockerfile"
    },
    {
      "type": "modify",
      "old_id": "042e30fe5781f47d2064495ea516f2b354efd06f",
      "old_mode": 33188,
      "old_path": "env/linux-x86-std-kube/Dockerfile",
      "new_id": "2f91a724d7778ffbee5a5850bb7663537b16b51e",
      "new_mode": 33188,
      "new_path": "env/linux-x86-std-kube/Dockerfile"
    },
    {
      "type": "modify",
      "old_id": "f1e99d654dc92418eeede7e254693de974dc726f",
      "old_mode": 33188,
      "old_path": "env/plan9-386/README",
      "new_id": "416281fff3b9976b62ca4d4737f9b93d6baad9cf",
      "new_mode": 33188,
      "new_path": "env/plan9-386/README"
    },
    {
      "type": "modify",
      "old_id": "59b86fa2f417fc04d17ebb5c9e3409e69e0e81b5",
      "old_mode": 33188,
      "old_path": "internal/gophers/gophers.go",
      "new_id": "36ca5f7b6619eff9a9a2ed622e942667ec49d199",
      "new_mode": 33188,
      "new_path": "internal/gophers/gophers.go"
    },
    {
      "type": "modify",
      "old_id": "23d1858cdbf63d7432a706eff5ff8437b848a16d",
      "old_mode": 33188,
      "old_path": "revdial/revdial.go",
      "new_id": "ea56799fff1175ef1c3bfb5257c2319bb982d6b0",
      "new_mode": 33188,
      "new_path": "revdial/revdial.go"
    },
    {
      "type": "modify",
      "old_id": "a32401bf1e1e2300ad7be6881cf1478f221cc66d",
      "old_mode": 33188,
      "old_path": "revdial/revdial_test.go",
      "new_id": "840716e92dea172def9f4d685ac4482e5b63b970",
      "new_mode": 33188,
      "new_path": "revdial/revdial_test.go"
    }
  ]
}
