clustersh

This is a program to run commands and transfer files between multiple
servers over SSH.

[ Usage ]
	clustersh [-a addresses] [-c chunk] [-h] [-u user] command args

[ Flags ]

	-a addresses	The comma-separated list of servers to send
                        to. There must not be any spaces in this list.

	-c chunk	The size of chunks to transfer, in bytes. The
			default is 16MB.

	-u user		The SSH username to use. It must be the
			same for all hosts. Defaults to the value
			of the USER environment variable.

[ Commands ]

exec, run: run a command on the servers
	The args list must be the command line to send to the hosts.

upload, up, push, send: upload a file to the servers
	The first argument is the local file to upload, and the second
	is the filename to store it as on the remote.

download, down, pull, fetch: download a file from the servers
	The first argument is the filename to fetch.The second argument
	is the base name for the local file. It will have a '-' and the
	hostname appended.

[ Examples ]

Tailing syslog on the hosts "mesos-01," "mesos-02," and "mesos-03"
with the same username as the logged in user:

	$ clustersh -a mesos-01,mesos-02,mesos-03 tail /var/log/syslog
	2015/12/22 20:37:17 waiting for sessions to complete
	[mesos-02] Dec 22 23:37:20 mesos-02 chronos[1848]: [2015-12-22 23:37:20,325] INFO Declined unused offers with filter refuseSeconds=5.0 (use --decline_offer_duration to reconfigure) (org.apache.mesos.chronos.scheduler.mesos.MesosJobFramework:97)
	[mesos-02] Dec 22 23:37:20 mesos-02 mesos-master[534]: I1222 23:37:20.326491   612 master.cpp:3297] Processing DECLINE call for offers: [ 07e0c918-efa9-48c3-9851-77abf0c95f92-O61048 ] for framework 07e0c918-efa9-48c3-9851-77abf0c95f92-0001 (chronos-2.4.0) at scheduler-c6926d5b-2e35-47d9-89fb-0a407234f0ba@159.203.201.212:48192
	[mesos-02] Dec 22 23:37:20 mesos-02 mesos-master[534]: I1222 23:37:20.326786   612 hierarchical.cpp:744] Recovered cpus(*):1; mem(*):497; disk(*):14910; ports(*):[31000-32000] (total: cpus(*):1; mem(*):497; disk(*):14910; ports(*):[31000-32000], allocated: ) on slave 07e0c918-efa9-48c3-9851-77abf0c95f92-S78 from framework 07e0c918-efa9-48c3-9851-77abf0c95f92-0001
	[mesos-01] Dec 22 23:37:19 mesos-01 marathon[1719]: [2015-12-22 23:37:19,045] INFO 73.189.108.122 - - [23/Dec/2015:04:37:19 +0000] "GET //mesos-01:8080/v2/deployments HTTP/1.1" 200 2 "http://mesos-01:8080/ui/" "Mozilla/5.0 (X11; Linux x86_64; rv:43.0) Gecko/20100101 Firefox/43.0 Iceweasel/43.0"  (mesosphere.chaos.http.ChaosRequestLog$$EnhancerByGuice$$f7252a53:qtp643328884-33)
	[mesos-01] Dec 22 23:37:19 mesos-01 marathon[1719]: [2015-12-22 23:37:19,047] INFO 73.189.108.122 - - [23/Dec/2015:04:37:19 +0000] "GET //mesos-01:8080/v2/apps HTTP/1.1" 200 11 "http://mesos-01:8080/ui/" "Mozilla/5.0 (X11; Linux x86_64; rv:43.0) Gecko/20100101 Firefox/43.0 Iceweasel/43.0"  (mesosphere.chaos.http.ChaosRequestLog$$EnhancerByGuice$$f7252a53:qtp643328884-27)
	[mesos-01] Dec 22 23:37:19 mesos-01 marathon[1719]: [2015-12-22 23:37:19,048] INFO 73.189.108.122 - - [23/Dec/2015:04:37:19 +0000] "GET //mesos-01:8080/v2/queue HTTP/1.1" 200 12 "http://mesos-01:8080/ui/" "Mozilla/5.0 (X11; Linux x86_64; rv:43.0) Gecko/20100101 Firefox/43.0 Iceweasel/43.0" 1 (mesosphere.chaos.http.ChaosRequestLog$$EnhancerByGuice$$f7252a53:qtp643328884-29)
	[mesos-03] Dec 22 23:35:09 mesos-03 mesos-slave[2675]: I1222 23:35:09.231684  2692 slave.cpp:4039] Current disk usage 8.93%. Max allowed age: 5.674993196753403days
	[mesos-03] Dec 22 23:36:09 mesos-03 mesos-slave[2675]: I1222 23:36:09.232365  2694 slave.cpp:4039] Current disk usage 8.93%. Max allowed age: 5.674993196753403days
	[mesos-03] Dec 22 23:37:09 mesos-03 mesos-slave[2675]: I1222 23:37:09.232836  2691 slave.cpp:4039] Current disk usage 8.93%. Max allowed age: 5.674993196753403days

Transferring the `clustersh` program to the same three hosts:

	$ clustersh -a mesos-01,mesos-02,mesos-03 push clustersh clustersh
	2015/12/22 20:39:23 waiting for sessions to complete
	[mesos-02] wrote 6422688-byte chunk
	[mesos-02] clustersh uploaded to clustersh
	[mesos-03] wrote 6422688-byte chunk
	[mesos-03] clustersh uploaded to clustersh
	[mesos-01] wrote 6422688-byte chunk
	[mesos-01] clustersh uploaded to clustersh

Copying the `/var/log/mesos/marathon.log` file from each of the three hosts:

	$ clustersh -a mesos-01,mesos-02,mesos-03 fetch /var/log/mesos/marathon.log marathon.log
	2015/12/22 20:42:28 waiting for sessions to complete
	[mesos-02] wrote 467461-byte chunk
	[mesos-02] /var/log/mesos/marathon.log downloaded to marathon.log-mesos-02
	[mesos-03] wrote 415850-byte chunk
	[mesos-03] /var/log/mesos/marathon.log downloaded to marathon.log-mesos-03
	[mesos-01] wrote 2940327-byte chunk
	[mesos-01] /var/log/mesos/marathon.log downloaded to marathon.log-mesos-01
	$ ls -1 marathon.log*
	marathon.log-mesos-01
	marathon.log-mesos-02
	marathon.log-mesos-03

