diff --git a/router/consts.go b/router/consts.go index 2d851dfb..02a93edf 100644 --- a/router/consts.go +++ b/router/consts.go @@ -11,7 +11,7 @@ const ( EthernetOverhead = 14 UDPOverhead = 28 // 20 bytes for IPv4, 8 bytes for UDP Port = 6783 - StatusPort = Port + 1 + HttpPort = Port + 1 DefaultPMTU = 65535 MaxUDPPacketSize = 65536 ChannelSize = 16 diff --git a/weave b/weave index b0841021..ae034cf4 100755 --- a/weave +++ b/weave @@ -3,20 +3,21 @@ 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 connect " + echo "weave run ..." + echo "weave start " + echo "weave attach " + echo "weave detach " + echo "weave expose " + echo "weave hide " echo "weave status" echo "weave version" echo "weave stop" echo "weave reset" echo - echo "where is of the form /, and" - echo " is of the form [:]" + echo "where is of the form [:], and" + echo " is of the form /" exit 1 } @@ -133,6 +134,17 @@ destroy_bridge() { 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" @@ -285,16 +297,19 @@ case "$COMMAND" in with_container_netns $CONTAINER launch 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 7bb0c416..76f1d82f 100644 --- a/weaver/main.go +++ b/weaver/main.go @@ -141,7 +141,15 @@ func handleHttp(router *weave.Router) { http.HandleFunc("/status", func(w http.ResponseWriter, r *http.Request) { io.WriteString(w, router.Status()) }) - address := fmt.Sprintf(":%d", weave.StatusPort) + 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 { log.Fatal("Unable to create http listener: ", err)