diff --git a/weave b/weave index de850089..a2bfceda 100755 --- a/weave +++ b/weave @@ -3,13 +3,14 @@ set -e usage() { echo "Usage:" - echo "weave launch [-password ] ..." - echo "weave run ..." - echo "weave start " - echo "weave attach " - echo "weave detach " - echo "weave expose " - echo "weave hide " + echo "weave launch [-password ] ..." + echo "weave run ..." + echo "weave start " + echo "weave attach " + echo "weave detach " + echo "weave expose " + echo "weave hide " + echo "weave connect " echo "weave status" echo "weave version" echo "weave stop" @@ -126,6 +127,17 @@ stop_masquerading() { run_iptables -t nat -X WEAVE >/dev/null 2>&1 || true } +docker_ip() { + if ! DOCKERIP=$(docker inspect --format='{{ .NetworkSettings.IPAddress }}' $CONTAINER_NAME 2>/dev/null) ; then + echo "Weave is not running." >&2 + exit 1 + fi + if [ -z "$DOCKERIP" ] ; then + echo "Weave is not running." >&2 + exit 1 + fi +} + # the following borrows from https://github.com/jpetazzo/pipework with_container_netns () { CONTAINER="$1" @@ -269,16 +281,19 @@ case "$COMMAND" in with_container_netns $CONTAINER attach $CIDR eth0 echo $CONTAINER ;; + connect) + [ $# -eq 1 ] || usage + docker_ip + if command_exists curl ; then + curl -d peer=$1 $DOCKERIP:$HTTP_PORT/connect + else + echo "Cannot find curl. Install it for 'weave connect' to function." >&2 + exit 1 + fi + ;; status) [ $# -eq 0 ] || usage - if ! DOCKERIP=$(docker inspect --format='{{ .NetworkSettings.IPAddress }}' $CONTAINER_NAME 2>/dev/null) ; then - echo "Weave is not running." >&2 - exit 1 - fi - if [ -z "$DOCKERIP" ] ; then - echo "Weave is not running." >&2 - exit 1 - fi + docker_ip if command_exists wget ; then wget -O - -q $DOCKERIP:$HTTP_PORT/status elif command_exists curl ; then diff --git a/weaver/main.go b/weaver/main.go index 523a5429..76f1d82f 100644 --- a/weaver/main.go +++ b/weaver/main.go @@ -141,6 +141,14 @@ func handleHttp(router *weave.Router) { http.HandleFunc("/status", func(w http.ResponseWriter, r *http.Request) { io.WriteString(w, router.Status()) }) + http.HandleFunc("/connect", func (w http.ResponseWriter, r *http.Request) { + peer := r.FormValue("peer") + if addr, err := net.ResolveTCPAddr("tcp4", weave.NormalisePeerAddr(peer)); err == nil { + router.ConnectionMaker.InitiateConnection(addr.String()) + } else { + http.Error(w, fmt.Sprint("invalid peer address: ", err), http.StatusBadRequest) + } + }) address := fmt.Sprintf(":%d", weave.HttpPort) err := http.ListenAndServe(address, nil) if err != nil {