From f517b947e66a14c94f211ca4e3852e749631cdb6 Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Thu, 19 Feb 2015 12:29:37 +0000 Subject: [PATCH 01/12] Add hostname to peers --- router/gossip_test.go | 10 +++++----- router/handshake.go | 4 +++- router/local_peer.go | 4 ++-- router/mocks_test.go | 6 +++--- router/peer.go | 6 ++++-- router/peers.go | 10 +++++++--- router/peers_test.go | 2 +- router/router.go | 6 +++--- weave | 3 ++- weaver/main.go | 18 ++++++++++++++++-- 10 files changed, 46 insertions(+), 23 deletions(-) diff --git a/router/gossip_test.go b/router/gossip_test.go index 050d48e7..3fc4b93a 100644 --- a/router/gossip_test.go +++ b/router/gossip_test.go @@ -19,7 +19,7 @@ type mockChannelConnection struct { // We need to create some dummy channels otherwise tests hang on nil // channels when Router.OnGossip() calls async methods. func NewTestRouter(name PeerName) *Router { - router := NewRouter(nil, name, nil, 10, 1024, nil) + router := NewRouter(nil, name, "hostname", nil, 10, 1024, nil) router.ConnectionMaker.queryChan = make(chan *ConnectionMakerInteraction, ChannelSize) router.Routes.queryChan = make(chan *Interaction, ChannelSize) return router @@ -35,8 +35,8 @@ func (router *Router) AddTestChannelConnection(r *Router) { fromName := router.Ourself.Peer.Name toName := r.Ourself.Peer.Name - fromPeer := NewPeer(fromName, router.Ourself.Peer.UID, 0) - toPeer := NewPeer(toName, r.Ourself.Peer.UID, 0) + fromPeer := NewPeer(fromName, "hostname", router.Ourself.Peer.UID, 0) + toPeer := NewPeer(toName, "hostname", r.Ourself.Peer.UID, 0) r.Peers.FetchWithDefault(fromPeer) // Has side-effect of incrementing refcount router.Peers.FetchWithDefault(toPeer) // @@ -70,10 +70,10 @@ func TestGossipTopology(t *testing.T) { // the routers supplied as arguments, carrying across all UID and // version information. func (router *Router) tp(routers ...*Router) *Peer { - peer := NewPeer(router.Ourself.Peer.Name, router.Ourself.Peer.UID, 0) + peer := NewPeer(router.Ourself.Peer.Name, "hostname", router.Ourself.Peer.UID, 0) connections := make(map[PeerName]Connection) for _, r := range routers { - p := NewPeer(r.Ourself.Peer.Name, r.Ourself.Peer.UID, r.Ourself.Peer.version) + p := NewPeer(r.Ourself.Peer.Name, "hostname", r.Ourself.Peer.UID, r.Ourself.Peer.version) connections[r.Ourself.Peer.Name] = newMockConnection(peer, p) } peer.SetVersionAndConnections(router.Ourself.Peer.version, connections) diff --git a/router/handshake.go b/router/handshake.go index b0798768..ee3ef90d 100644 --- a/router/handshake.go +++ b/router/handshake.go @@ -59,6 +59,7 @@ func (conn *LocalConnection) handshake(enc *gob.Encoder, dec *gob.Decoder, accep "ProtocolVersion": versionStr, "PeerNameFlavour": PeerNameFlavour, "Name": conn.local.Name.String(), + "HostName": conn.local.HostName, "UID": fmt.Sprint(conn.local.UID), "ConnID": fmt.Sprint(localConnID)} handshakeRecv := map[string]string{} @@ -84,6 +85,7 @@ func (conn *LocalConnection) handshake(enc *gob.Encoder, dec *gob.Decoder, accep fv.CheckEqual("ProtocolVersion", versionStr) fv.CheckEqual("PeerNameFlavour", PeerNameFlavour) nameStr, _ := fv.Value("Name") + hostNameStr, _ := fv.Value("HostName") uidStr, _ := fv.Value("UID") remoteConnIdStr, _ := fv.Value("ConnID") if err := fv.Err(); err != nil { @@ -136,7 +138,7 @@ func (conn *LocalConnection) handshake(enc *gob.Encoder, dec *gob.Decoder, accep conn.Decryptor = NewNonDecryptor(conn) } - toPeer := NewPeer(name, uid, 0) + toPeer := NewPeer(name, hostNameStr, uid, 0) toPeer = conn.Router.Peers.FetchWithDefault(toPeer) switch toPeer { case nil: diff --git a/router/local_peer.go b/router/local_peer.go index 3d532378..3599de86 100644 --- a/router/local_peer.go +++ b/router/local_peer.go @@ -18,8 +18,8 @@ type PeerInteraction struct { payload interface{} } -func NewLocalPeer(name PeerName, router *Router) *LocalPeer { - return &LocalPeer{Peer: NewPeer(name, 0, 0), Router: router} +func NewLocalPeer(name PeerName, hostName string, router *Router) *LocalPeer { + return &LocalPeer{Peer: NewPeer(name, hostName, 0, 0), Router: router} } func (peer *LocalPeer) Start() { diff --git a/router/mocks_test.go b/router/mocks_test.go index 50e75d7e..f2d6a975 100644 --- a/router/mocks_test.go +++ b/router/mocks_test.go @@ -12,7 +12,7 @@ import ( // Add to peers a connection from peers.ourself to p func (peers *Peers) AddTestConnection(p *Peer) { - toPeer := NewPeer(p.Name, p.UID, 0) + toPeer := NewPeer(p.Name, "hostname", p.UID, 0) peers.FetchWithDefault(toPeer) // Has side-effect of incrementing refcount conn := newMockConnection(peers.ourself, toPeer) peers.ourself.addConnection(conn) @@ -22,10 +22,10 @@ func (peers *Peers) AddTestConnection(p *Peer) { // Add to peers a connection from p1 to p2 func (peers *Peers) AddTestRemoteConnection(p1, p2 *Peer) { fromName := p1.Name - fromPeer := NewPeer(fromName, p1.UID, 0) + fromPeer := NewPeer(fromName, "hostname", p1.UID, 0) fromPeer = peers.FetchWithDefault(fromPeer) toName := p2.Name - toPeer := NewPeer(toName, p2.UID, 0) + toPeer := NewPeer(toName, "hostname", p2.UID, 0) toPeer = peers.FetchWithDefault(toPeer) peers.ourself.addConnection(&RemoteConnection{fromPeer, toPeer, "", false}) } diff --git a/router/peer.go b/router/peer.go index 09ac2d9e..adcc42eb 100644 --- a/router/peer.go +++ b/router/peer.go @@ -10,19 +10,21 @@ type Peer struct { sync.RWMutex Name PeerName NameByte []byte + HostName string UID uint64 version uint64 localRefCount uint64 connections map[PeerName]Connection } -func NewPeer(name PeerName, uid uint64, version uint64) *Peer { +func NewPeer(name PeerName, hostName string, uid uint64, version uint64) *Peer { if uid == 0 { uid = randUint64() } return &Peer{ Name: name, NameByte: name.Bin(), + HostName: hostName, UID: uid, version: version, connections: make(map[PeerName]Connection)} @@ -31,7 +33,7 @@ func NewPeer(name PeerName, uid uint64, version uint64) *Peer { func (peer *Peer) String() string { peer.RLock() defer peer.RUnlock() - return fmt.Sprint("Peer ", peer.Name, " (v", peer.version, ") (UID ", peer.UID, ")") + return fmt.Sprint("Peer ", peer.Name, " (", peer.HostName, ") (v", peer.version, ") (UID ", peer.UID, ")") } func (peer *Peer) Version() uint64 { diff --git a/router/peers.go b/router/peers.go index 0217d8b0..c8527a17 100644 --- a/router/peers.go +++ b/router/peers.go @@ -178,7 +178,7 @@ func (peers *Peers) decodeUpdate(update []byte) (newPeers map[PeerName]*Peer, de decoder := gob.NewDecoder(updateBuf) for { - nameByte, uid, version, connsBuf, decErr := decodePeerNoConns(decoder) + nameByte, hostName, uid, version, connsBuf, decErr := decodePeerNoConns(decoder) if decErr == io.EOF { break } else if decErr != nil { @@ -186,7 +186,7 @@ func (peers *Peers) decodeUpdate(update []byte) (newPeers map[PeerName]*Peer, de return } name := PeerNameFromBin(nameByte) - newPeer := NewPeer(name, uid, version) + newPeer := NewPeer(name, hostName, uid, version) decodedUpdate = append(decodedUpdate, newPeer) decodedConns = append(decodedConns, connsBuf) existingPeer, found := peers.table[name] @@ -257,6 +257,7 @@ func (peer *Peer) encode(enc *gob.Encoder) { defer peer.RUnlock() checkFatal(enc.Encode(peer.NameByte)) + checkFatal(enc.Encode(peer.HostName)) checkFatal(enc.Encode(peer.UID)) checkFatal(enc.Encode(peer.version)) @@ -271,10 +272,13 @@ func (peer *Peer) encode(enc *gob.Encoder) { checkFatal(enc.Encode(connsBuf.Bytes())) } -func decodePeerNoConns(dec *gob.Decoder) (nameByte []byte, uid uint64, version uint64, conns []byte, err error) { +func decodePeerNoConns(dec *gob.Decoder) (nameByte []byte, hostName string, uid uint64, version uint64, conns []byte, err error) { if err = dec.Decode(&nameByte); err != nil { return } + if err = dec.Decode(&hostName); err != nil { + return + } if err = dec.Decode(&uid); err != nil { return } diff --git a/router/peers_test.go b/router/peers_test.go index ecaa07b2..e9840af9 100644 --- a/router/peers_test.go +++ b/router/peers_test.go @@ -17,7 +17,7 @@ import ( // - non-gc of peers that are only referenced locally func newNode(name PeerName) (*Peer, *Peers) { - peer := NewPeer(name, 0, 0) + peer := NewPeer(name, "hostname", 0, 0) peers := NewPeers(peer, func(*Peer) {}) peers.FetchWithDefault(peer) return peer, peers diff --git a/router/router.go b/router/router.go index 180a2aea..f0a02ab0 100644 --- a/router/router.go +++ b/router/router.go @@ -46,7 +46,7 @@ type PacketSourceSink interface { PacketSink } -func NewRouter(iface *net.Interface, name PeerName, password []byte, connLimit int, bufSz int, logFrame func(string, []byte, *layers.Ethernet)) *Router { +func NewRouter(iface *net.Interface, name PeerName, hostName string, password []byte, connLimit int, bufSz int, logFrame func(string, []byte, *layers.Ethernet)) *Router { router := &Router{ Iface: iface, GossipChannels: make(map[uint32]*GossipChannel), @@ -63,7 +63,7 @@ func NewRouter(iface *net.Interface, name PeerName, password []byte, connLimit i router.Macs.Delete(peer) log.Println("Removed unreachable", peer) } - router.Ourself = NewLocalPeer(name, router) + router.Ourself = NewLocalPeer(name, hostName, router) router.Macs = NewMacCache(macMaxAge, onMacExpiry) router.Peers = NewPeers(router.Ourself.Peer, onPeerGC) router.Peers.FetchWithDefault(router.Ourself.Peer) @@ -94,7 +94,7 @@ func (router *Router) UsingPassword() bool { func (router *Router) Status() string { var buf bytes.Buffer - buf.WriteString(fmt.Sprintln("Our name is", router.Ourself.Name)) + buf.WriteString(fmt.Sprintln("Our name is", router.Ourself.Name, "(" + router.Ourself.HostName + ")")) buf.WriteString(fmt.Sprintln("Sniffing traffic on", router.Iface)) buf.WriteString(fmt.Sprintf("MACs:\n%s", router.Macs)) buf.WriteString(fmt.Sprintf("Peers:\n%s", router.Peers)) diff --git a/weave b/weave index e3f4540c..9d10399d 100755 --- a/weave +++ b/weave @@ -481,12 +481,13 @@ case "$COMMAND" in export WEAVE_PASSWORD shift 2 fi + HOSTNAME=$(hostname) # Set WEAVE_DOCKER_ARGS in the environment in order to supply # additional parameters, such as resource limits, to docker # when launching the weave container. CONTAINER=$(docker run --privileged -d --name=$CONTAINER_NAME \ -p $PORT:$PORT/tcp -p $PORT:$PORT/udp -e WEAVE_PASSWORD \ - $WEAVE_DOCKER_ARGS $IMAGE -name $MACADDR -iface $CONTAINER_IFNAME "$@") + $WEAVE_DOCKER_ARGS $IMAGE -name $MACADDR -iface $CONTAINER_IFNAME -hostname $HOSTNAME "$@") with_container_netns $CONTAINER launch >/dev/null echo $CONTAINER ;; diff --git a/weaver/main.go b/weaver/main.go index de62f30b..0e2cc8b3 100644 --- a/weaver/main.go +++ b/weaver/main.go @@ -37,6 +37,7 @@ func main() { justVersion bool ifaceName string routerName string + hostName string password string wait int debug bool @@ -49,6 +50,7 @@ func main() { flag.BoolVar(&justVersion, "version", false, "print version and exit") flag.StringVar(&ifaceName, "iface", "", "name of interface to read from") flag.StringVar(&routerName, "name", "", "name of router (defaults to MAC)") + flag.StringVar(&hostName, "hostname", "", "name of host (defaults to kernel hostname)") flag.StringVar(&password, "password", "", "network password") flag.IntVar(&wait, "wait", 0, "number of seconds to wait for interface to be created and come up (defaults to 0, i.e. don't wait)") flag.BoolVar(&debug, "debug", false, "enable debug logging") @@ -87,6 +89,18 @@ func main() { routerName = iface.HardwareAddr.String() } + if hostName == "" { + osHostName, err := os.Hostname() + if err != nil { + log.Fatal(err) + } + if osHostName == "" { + hostName = "" + } else { + hostName = osHostName + } + } + ourName, err := weave.PeerNameFromUserInput(routerName) if err != nil { log.Fatal(err) @@ -121,8 +135,8 @@ func main() { defer profile.Start(&p).Stop() } - router := weave.NewRouter(iface, ourName, []byte(password), connLimit, bufSz*1024*1024, logFrame) - log.Println("Our name is", router.Ourself.Name) + router := weave.NewRouter(iface, ourName, hostName, []byte(password), connLimit, bufSz*1024*1024, logFrame) + log.Println("Our name is", router.Ourself.Name, "(" + hostName + ")") router.Start() for _, peer := range peers { if addr, err := net.ResolveTCPAddr("tcp4", weave.NormalisePeerAddr(peer)); err == nil { From 170724472555c446120bcaa25f92285026e0d4b1 Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Thu, 19 Feb 2015 13:34:01 +0000 Subject: [PATCH 02/12] Include remote hostname for connections in router status --- router/peers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/router/peers.go b/router/peers.go index c8527a17..7d3f84bd 100644 --- a/router/peers.go +++ b/router/peers.go @@ -128,7 +128,7 @@ func (peers *Peers) String() string { if !conn.Established() { established = " (unestablished)" } - buf.WriteString(fmt.Sprintf(" -> %v [%v%s]\n", remoteName, conn.RemoteTCPAddr(), established)) + buf.WriteString(fmt.Sprintf(" -> %v (%v) [%v%s]\n", remoteName, conn.Remote().HostName, conn.RemoteTCPAddr(), established)) }) }) return buf.String() From 8f6a525bded61b0999333dc6fb2a8296fd9d6229 Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Thu, 19 Feb 2015 14:38:57 +0000 Subject: [PATCH 03/12] Bump protocol version due to introduction of hostname field --- router/protocol.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/router/protocol.go b/router/protocol.go index 7a6fff36..9db4160f 100644 --- a/router/protocol.go +++ b/router/protocol.go @@ -2,7 +2,7 @@ package router const ( Protocol = "weave" - ProtocolVersion = 12 + ProtocolVersion = 13 ) type ProtocolTag byte From 244af11701125f85d338a13f55ac6113bbc37cc4 Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Thu, 19 Feb 2015 17:09:08 +0000 Subject: [PATCH 04/12] Rename hostname to nickname Accept -nickname parameter to weave script --- router/handshake.go | 6 +++--- router/local_peer.go | 4 ++-- router/peer.go | 8 ++++---- router/peers.go | 12 ++++++------ router/router.go | 6 +++--- weave | 30 +++++++++++++++++++++--------- weaver/main.go | 18 +++++++----------- 7 files changed, 46 insertions(+), 38 deletions(-) diff --git a/router/handshake.go b/router/handshake.go index ee3ef90d..d9d0ecda 100644 --- a/router/handshake.go +++ b/router/handshake.go @@ -59,7 +59,7 @@ func (conn *LocalConnection) handshake(enc *gob.Encoder, dec *gob.Decoder, accep "ProtocolVersion": versionStr, "PeerNameFlavour": PeerNameFlavour, "Name": conn.local.Name.String(), - "HostName": conn.local.HostName, + "NickName": conn.local.NickName, "UID": fmt.Sprint(conn.local.UID), "ConnID": fmt.Sprint(localConnID)} handshakeRecv := map[string]string{} @@ -85,7 +85,7 @@ func (conn *LocalConnection) handshake(enc *gob.Encoder, dec *gob.Decoder, accep fv.CheckEqual("ProtocolVersion", versionStr) fv.CheckEqual("PeerNameFlavour", PeerNameFlavour) nameStr, _ := fv.Value("Name") - hostNameStr, _ := fv.Value("HostName") + nickNameStr, _ := fv.Value("NickName") uidStr, _ := fv.Value("UID") remoteConnIdStr, _ := fv.Value("ConnID") if err := fv.Err(); err != nil { @@ -138,7 +138,7 @@ func (conn *LocalConnection) handshake(enc *gob.Encoder, dec *gob.Decoder, accep conn.Decryptor = NewNonDecryptor(conn) } - toPeer := NewPeer(name, hostNameStr, uid, 0) + toPeer := NewPeer(name, nickNameStr, uid, 0) toPeer = conn.Router.Peers.FetchWithDefault(toPeer) switch toPeer { case nil: diff --git a/router/local_peer.go b/router/local_peer.go index 3599de86..9164e887 100644 --- a/router/local_peer.go +++ b/router/local_peer.go @@ -18,8 +18,8 @@ type PeerInteraction struct { payload interface{} } -func NewLocalPeer(name PeerName, hostName string, router *Router) *LocalPeer { - return &LocalPeer{Peer: NewPeer(name, hostName, 0, 0), Router: router} +func NewLocalPeer(name PeerName, nickName string, router *Router) *LocalPeer { + return &LocalPeer{Peer: NewPeer(name, nickName, 0, 0), Router: router} } func (peer *LocalPeer) Start() { diff --git a/router/peer.go b/router/peer.go index adcc42eb..86047e3a 100644 --- a/router/peer.go +++ b/router/peer.go @@ -10,21 +10,21 @@ type Peer struct { sync.RWMutex Name PeerName NameByte []byte - HostName string + NickName string UID uint64 version uint64 localRefCount uint64 connections map[PeerName]Connection } -func NewPeer(name PeerName, hostName string, uid uint64, version uint64) *Peer { +func NewPeer(name PeerName, nickName string, uid uint64, version uint64) *Peer { if uid == 0 { uid = randUint64() } return &Peer{ Name: name, NameByte: name.Bin(), - HostName: hostName, + NickName: nickName, UID: uid, version: version, connections: make(map[PeerName]Connection)} @@ -33,7 +33,7 @@ func NewPeer(name PeerName, hostName string, uid uint64, version uint64) *Peer { func (peer *Peer) String() string { peer.RLock() defer peer.RUnlock() - return fmt.Sprint("Peer ", peer.Name, " (", peer.HostName, ") (v", peer.version, ") (UID ", peer.UID, ")") + return fmt.Sprint("Peer ", peer.Name, " (", peer.NickName, ") (v", peer.version, ") (UID ", peer.UID, ")") } func (peer *Peer) Version() uint64 { diff --git a/router/peers.go b/router/peers.go index 7d3f84bd..e8540a8a 100644 --- a/router/peers.go +++ b/router/peers.go @@ -128,7 +128,7 @@ func (peers *Peers) String() string { if !conn.Established() { established = " (unestablished)" } - buf.WriteString(fmt.Sprintf(" -> %v (%v) [%v%s]\n", remoteName, conn.Remote().HostName, conn.RemoteTCPAddr(), established)) + buf.WriteString(fmt.Sprintf(" -> %v (%v) [%v%s]\n", remoteName, conn.Remote().NickName, conn.RemoteTCPAddr(), established)) }) }) return buf.String() @@ -178,7 +178,7 @@ func (peers *Peers) decodeUpdate(update []byte) (newPeers map[PeerName]*Peer, de decoder := gob.NewDecoder(updateBuf) for { - nameByte, hostName, uid, version, connsBuf, decErr := decodePeerNoConns(decoder) + nameByte, nickName, uid, version, connsBuf, decErr := decodePeerNoConns(decoder) if decErr == io.EOF { break } else if decErr != nil { @@ -186,7 +186,7 @@ func (peers *Peers) decodeUpdate(update []byte) (newPeers map[PeerName]*Peer, de return } name := PeerNameFromBin(nameByte) - newPeer := NewPeer(name, hostName, uid, version) + newPeer := NewPeer(name, nickName, uid, version) decodedUpdate = append(decodedUpdate, newPeer) decodedConns = append(decodedConns, connsBuf) existingPeer, found := peers.table[name] @@ -257,7 +257,7 @@ func (peer *Peer) encode(enc *gob.Encoder) { defer peer.RUnlock() checkFatal(enc.Encode(peer.NameByte)) - checkFatal(enc.Encode(peer.HostName)) + checkFatal(enc.Encode(peer.NickName)) checkFatal(enc.Encode(peer.UID)) checkFatal(enc.Encode(peer.version)) @@ -272,11 +272,11 @@ func (peer *Peer) encode(enc *gob.Encoder) { checkFatal(enc.Encode(connsBuf.Bytes())) } -func decodePeerNoConns(dec *gob.Decoder) (nameByte []byte, hostName string, uid uint64, version uint64, conns []byte, err error) { +func decodePeerNoConns(dec *gob.Decoder) (nameByte []byte, nickName string, uid uint64, version uint64, conns []byte, err error) { if err = dec.Decode(&nameByte); err != nil { return } - if err = dec.Decode(&hostName); err != nil { + if err = dec.Decode(&nickName); err != nil { return } if err = dec.Decode(&uid); err != nil { diff --git a/router/router.go b/router/router.go index f0a02ab0..fd867ee2 100644 --- a/router/router.go +++ b/router/router.go @@ -46,7 +46,7 @@ type PacketSourceSink interface { PacketSink } -func NewRouter(iface *net.Interface, name PeerName, hostName string, password []byte, connLimit int, bufSz int, logFrame func(string, []byte, *layers.Ethernet)) *Router { +func NewRouter(iface *net.Interface, name PeerName, nickName string, password []byte, connLimit int, bufSz int, logFrame func(string, []byte, *layers.Ethernet)) *Router { router := &Router{ Iface: iface, GossipChannels: make(map[uint32]*GossipChannel), @@ -63,7 +63,7 @@ func NewRouter(iface *net.Interface, name PeerName, hostName string, password [] router.Macs.Delete(peer) log.Println("Removed unreachable", peer) } - router.Ourself = NewLocalPeer(name, hostName, router) + router.Ourself = NewLocalPeer(name, nickName, router) router.Macs = NewMacCache(macMaxAge, onMacExpiry) router.Peers = NewPeers(router.Ourself.Peer, onPeerGC) router.Peers.FetchWithDefault(router.Ourself.Peer) @@ -94,7 +94,7 @@ func (router *Router) UsingPassword() bool { func (router *Router) Status() string { var buf bytes.Buffer - buf.WriteString(fmt.Sprintln("Our name is", router.Ourself.Name, "(" + router.Ourself.HostName + ")")) + buf.WriteString(fmt.Sprintln("Our name is", router.Ourself.Name, "(" + router.Ourself.NickName + ")")) buf.WriteString(fmt.Sprintln("Sniffing traffic on", router.Iface)) buf.WriteString(fmt.Sprintf("MACs:\n%s", router.Macs)) buf.WriteString(fmt.Sprintf("Peers:\n%s", router.Peers)) diff --git a/weave b/weave index 9d10399d..95365628 100755 --- a/weave +++ b/weave @@ -6,7 +6,7 @@ SCRIPT_VERSION="(unreleased version)" usage() { echo "Usage:" echo "weave setup" - echo "weave launch [-password ] ..." + echo "weave launch [-password ] [-nickname ] ..." echo "weave launch-dns " echo "weave connect " echo "weave run [--with-dns] ..." @@ -475,19 +475,31 @@ case "$COMMAND" in echo "WARNING: $1 parameter ignored; 'weave launch' no longer takes a CIDR as the first parameter" >&2 shift 1 fi - if [ "$1" = "-password" ] ; then - [ $# -gt 1 ] || usage - WEAVE_PASSWORD="$2" - export WEAVE_PASSWORD - shift 2 - fi - HOSTNAME=$(hostname) + NICKNAME=$(hostname) + while true; do + case "$1" in + -password) + [ $# -gt 1 ] || usage + WEAVE_PASSWORD="$2" + export WEAVE_PASSWORD + shift 2 + ;; + -nickname) + [ $# -gt 1 ] || usage + NICKNAME="$2" + shift 2 + ;; + *) + break + ;; + esac + done # Set WEAVE_DOCKER_ARGS in the environment in order to supply # additional parameters, such as resource limits, to docker # when launching the weave container. CONTAINER=$(docker run --privileged -d --name=$CONTAINER_NAME \ -p $PORT:$PORT/tcp -p $PORT:$PORT/udp -e WEAVE_PASSWORD \ - $WEAVE_DOCKER_ARGS $IMAGE -name $MACADDR -iface $CONTAINER_IFNAME -hostname $HOSTNAME "$@") + $WEAVE_DOCKER_ARGS $IMAGE -name $MACADDR -iface $CONTAINER_IFNAME -nickname "$NICKNAME" "$@") with_container_netns $CONTAINER launch >/dev/null echo $CONTAINER ;; diff --git a/weaver/main.go b/weaver/main.go index 0e2cc8b3..f950dd23 100644 --- a/weaver/main.go +++ b/weaver/main.go @@ -37,7 +37,7 @@ func main() { justVersion bool ifaceName string routerName string - hostName string + nickName string password string wait int debug bool @@ -50,7 +50,7 @@ func main() { flag.BoolVar(&justVersion, "version", false, "print version and exit") flag.StringVar(&ifaceName, "iface", "", "name of interface to read from") flag.StringVar(&routerName, "name", "", "name of router (defaults to MAC)") - flag.StringVar(&hostName, "hostname", "", "name of host (defaults to kernel hostname)") + flag.StringVar(&nickName, "nickname", "", "nickname of host (defaults to container hostname)") flag.StringVar(&password, "password", "", "network password") flag.IntVar(&wait, "wait", 0, "number of seconds to wait for interface to be created and come up (defaults to 0, i.e. don't wait)") flag.BoolVar(&debug, "debug", false, "enable debug logging") @@ -89,16 +89,12 @@ func main() { routerName = iface.HardwareAddr.String() } - if hostName == "" { - osHostName, err := os.Hostname() + if nickName == "" { + osHostname, err := os.Hostname() if err != nil { log.Fatal(err) } - if osHostName == "" { - hostName = "" - } else { - hostName = osHostName - } + nickName = osHostname } ourName, err := weave.PeerNameFromUserInput(routerName) @@ -135,8 +131,8 @@ func main() { defer profile.Start(&p).Stop() } - router := weave.NewRouter(iface, ourName, hostName, []byte(password), connLimit, bufSz*1024*1024, logFrame) - log.Println("Our name is", router.Ourself.Name, "(" + hostName + ")") + router := weave.NewRouter(iface, ourName, nickName, []byte(password), connLimit, bufSz*1024*1024, logFrame) + log.Println("Our name is", router.Ourself.Name, "(" + router.Ourself.NickName + ")") router.Start() for _, peer := range peers { if addr, err := net.ResolveTCPAddr("tcp4", weave.NormalisePeerAddr(peer)); err == nil { From 1b92f60034659b55e444b75698a89d038116cbb7 Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Fri, 20 Feb 2015 15:04:58 +0000 Subject: [PATCH 05/12] Add nickname feature to documentation --- site/troubleshooting.md | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/site/troubleshooting.md b/site/troubleshooting.md index 6289a67a..039a4a30 100644 --- a/site/troubleshooting.md +++ b/site/troubleshooting.md @@ -58,7 +58,7 @@ This produces output like: ```` weave router 0.7.0 Encryption off -Our name is 7a:f4:56:87:76:3b +Our name is 7a:f4:56:87:76:3b (weave01) Sniffing traffic on &{39 65535 ethwe ae:e3:07:9c:8c:d4 up|broadcast|multicast} MACs: ba:8c:b9:dc:e1:c9 -> 7a:f4:56:87:76:3b (2014-10-23 16:39:19.482338935 +0000 UTC) @@ -67,10 +67,10 @@ ce:15:34:a9:b5:6d -> 7a:f4:56:87:76:3b (2014-10-23 16:39:28.257103595 +0000 UTC) 9e:95:0c:54:8e:39 -> 7a:16:dd:5b:83:de (2014-10-23 16:39:28.795601325 +0000 UTC) 72:5f:a4:60:e5:ce -> 7a:16:dd:5b:83:de (2014-10-23 16:39:29.575995255 +0000 UTC) Peers: -Peer 7a:16:dd:5b:83:de (v31) (UID 13151318985609435078) - -> 7a:f4:56:87:76:3b [37.157.33.76:7195] -Peer 7a:f4:56:87:76:3b (v1) (UID 6913268221365110570) - -> 7a:16:dd:5b:83:de [191.235.147.190:6783] +Peer 7a:16:dd:5b:83:de (weave02) (v31) (UID 13151318985609435078) + -> 7a:f4:56:87:76:3b (weave01) [37.157.33.76:7195] +Peer 7a:f4:56:87:76:3b (weave01) (v1) (UID 6913268221365110570) + -> 7a:16:dd:5b:83:de (weave02) [191.235.147.190:6783] Routes: unicast: 7a:f4:56:87:76:3b -> 00:00:00:00:00:00 @@ -86,7 +86,11 @@ The terms used here are explained further at [how it works](how-it-works.html). The 'Our name' line identifies the local weave router as a peer in the -weave network. +weave network. It displays both the peer name and the peer's nickname +in parenthesis; the peer name defaults to a MAC address, whilst the +nickname defaults to the name of the host on which the weave container +was launched. If desired the nickname can be overriden by supplying +the `-nickname` argument to `weave launch`. The 'Sniffing traffic' line shows details of the virtual ethernet interface that weave is using to receive packets on the local @@ -100,12 +104,13 @@ router last saw some traffic from that MAC. The router forgets addresses which are inactive for longer than 10 minutes. The 'Peers' section lists all peers known to this router, including -itself. Each peer is shown with its name, version number (incremented -on each reconnect) and the UID. Then each line beginning `->` shows -another peer that it is connected to, with the IP address and port -number of the connection. In the above example, the local router has -connected to its peer using address 191.235.147.190:6783, and its peer -sees the same connection as coming from 37.157.33.76:7195. +itself. Each peer is shown with its name, nickname, version number +(incremented on each reconnect) and the UID. Then each line +beginning `->` shows another peer that it is connected to, with the +IP address and port number of the connection. In the above example, +the local router has connected to its peer using address +191.235.147.190:6783, and its peer sees the same connection as coming +from 37.157.33.76:7195. The 'Routes' section summarised the information for deciding how to route packets between peers, which is mostly of interest when the From 5e54637ffaec6f7b40f2e9e49253f49fdd869f65 Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Tue, 24 Feb 2015 16:52:22 +0000 Subject: [PATCH 06/12] Remove reference to containers from argument help --- weaver/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weaver/main.go b/weaver/main.go index f950dd23..7f2c0576 100644 --- a/weaver/main.go +++ b/weaver/main.go @@ -50,7 +50,7 @@ func main() { flag.BoolVar(&justVersion, "version", false, "print version and exit") flag.StringVar(&ifaceName, "iface", "", "name of interface to read from") flag.StringVar(&routerName, "name", "", "name of router (defaults to MAC)") - flag.StringVar(&nickName, "nickname", "", "nickname of host (defaults to container hostname)") + flag.StringVar(&nickName, "nickname", "", "nickname of peer (defaults to hostname)") flag.StringVar(&password, "password", "", "network password") flag.IntVar(&wait, "wait", 0, "number of seconds to wait for interface to be created and come up (defaults to 0, i.e. don't wait)") flag.BoolVar(&debug, "debug", false, "enable debug logging") From 3cf2179c679c66636ce23915a9b89d05786c2f01 Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Tue, 24 Feb 2015 16:52:44 +0000 Subject: [PATCH 07/12] Fix formatting --- weaver/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/weaver/main.go b/weaver/main.go index 7f2c0576..912fc514 100644 --- a/weaver/main.go +++ b/weaver/main.go @@ -94,7 +94,7 @@ func main() { if err != nil { log.Fatal(err) } - nickName = osHostname + nickName = osHostname } ourName, err := weave.PeerNameFromUserInput(routerName) @@ -132,7 +132,7 @@ func main() { } router := weave.NewRouter(iface, ourName, nickName, []byte(password), connLimit, bufSz*1024*1024, logFrame) - log.Println("Our name is", router.Ourself.Name, "(" + router.Ourself.NickName + ")") + log.Println("Our name is", router.Ourself.Name, "("+router.Ourself.NickName+")") router.Start() for _, peer := range peers { if addr, err := net.ResolveTCPAddr("tcp4", weave.NormalisePeerAddr(peer)); err == nil { From 34f7b5cbd09043c53412f95b155ebb173d5d7597 Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Tue, 24 Feb 2015 16:53:38 +0000 Subject: [PATCH 08/12] Address documentation comments --- site/how-it-works.md | 7 ++++++- site/troubleshooting.md | 9 ++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/site/how-it-works.md b/site/how-it-works.md index d5d7c57b..cc52ca57 100644 --- a/site/how-it-works.md +++ b/site/how-it-works.md @@ -7,7 +7,8 @@ layout: default A weave network consists of a number of 'peers' - weave routers residing on different hosts. Each peer has a name, which tends to -remain the same over restarts, and a unique identifier (UID) which is +remain the same over restarts, a human friendly nickname for use in +status and logging output and a unique identifier (UID) which is different each time it is run. These are opaque identifiers as far as the router is concerned, although the name defaults to a MAC address. @@ -147,6 +148,8 @@ The topology update payload is laid out like this: +-----------------------------------+ | Peer 1: Name | +-----------------------------------+ + | Peer 1: NickName | + +-----------------------------------+ | Peer 1: UID | +-----------------------------------+ | Peer 1: Version number | @@ -157,6 +160,8 @@ The topology update payload is laid out like this: +-----------------------------------+ | Peer N: Name | +-----------------------------------+ + | Peer N: NickName | + +-----------------------------------+ | Peer N: UID | +-----------------------------------+ | Peer N: Version number | diff --git a/site/troubleshooting.md b/site/troubleshooting.md index 039a4a30..616bd197 100644 --- a/site/troubleshooting.md +++ b/site/troubleshooting.md @@ -86,11 +86,10 @@ The terms used here are explained further at [how it works](how-it-works.html). The 'Our name' line identifies the local weave router as a peer in the -weave network. It displays both the peer name and the peer's nickname -in parenthesis; the peer name defaults to a MAC address, whilst the -nickname defaults to the name of the host on which the weave container -was launched. If desired the nickname can be overriden by supplying -the `-nickname` argument to `weave launch`. +weave network, displaying the peer name followed by the peer's nickname +in parenthesis. The nickname defaults to the name of the host on which +the weave container was launched; if desired it can be overriden by +supplying the `-nickname` argument to `weave launch`. The 'Sniffing traffic' line shows details of the virtual ethernet interface that weave is using to receive packets on the local From 4e9e183e0f1f51d21b12d451a450feffe8d94a3f Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Tue, 24 Feb 2015 17:59:40 +0000 Subject: [PATCH 09/12] Simplify argument parsing --- weaver/main.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/weaver/main.go b/weaver/main.go index 912fc514..9d3cb909 100644 --- a/weaver/main.go +++ b/weaver/main.go @@ -90,11 +90,10 @@ func main() { } if nickName == "" { - osHostname, err := os.Hostname() + nickName, err = os.Hostname() if err != nil { log.Fatal(err) } - nickName = osHostname } ourName, err := weave.PeerNameFromUserInput(routerName) From 326a5d19b3b70ecc6c7ccaf3f28b30b3122f02f9 Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Tue, 24 Feb 2015 22:23:51 +0000 Subject: [PATCH 10/12] Transpose script arguments to match declaration order --- weave | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weave b/weave index 95365628..e7777274 100755 --- a/weave +++ b/weave @@ -499,7 +499,7 @@ case "$COMMAND" in # when launching the weave container. CONTAINER=$(docker run --privileged -d --name=$CONTAINER_NAME \ -p $PORT:$PORT/tcp -p $PORT:$PORT/udp -e WEAVE_PASSWORD \ - $WEAVE_DOCKER_ARGS $IMAGE -name $MACADDR -iface $CONTAINER_IFNAME -nickname "$NICKNAME" "$@") + $WEAVE_DOCKER_ARGS $IMAGE -iface $CONTAINER_IFNAME -name $MACADDR -nickname "$NICKNAME" "$@") with_container_netns $CONTAINER launch >/dev/null echo $CONTAINER ;; From 72c9ae7a5cab1092ee019fed0f51e4be375fbcf3 Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Tue, 24 Feb 2015 22:25:46 +0000 Subject: [PATCH 11/12] Use empty string as test nickname --- router/gossip_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/router/gossip_test.go b/router/gossip_test.go index 3fc4b93a..cc8c6a9d 100644 --- a/router/gossip_test.go +++ b/router/gossip_test.go @@ -19,7 +19,7 @@ type mockChannelConnection struct { // We need to create some dummy channels otherwise tests hang on nil // channels when Router.OnGossip() calls async methods. func NewTestRouter(name PeerName) *Router { - router := NewRouter(nil, name, "hostname", nil, 10, 1024, nil) + router := NewRouter(nil, name, "", nil, 10, 1024, nil) router.ConnectionMaker.queryChan = make(chan *ConnectionMakerInteraction, ChannelSize) router.Routes.queryChan = make(chan *Interaction, ChannelSize) return router @@ -35,8 +35,8 @@ func (router *Router) AddTestChannelConnection(r *Router) { fromName := router.Ourself.Peer.Name toName := r.Ourself.Peer.Name - fromPeer := NewPeer(fromName, "hostname", router.Ourself.Peer.UID, 0) - toPeer := NewPeer(toName, "hostname", r.Ourself.Peer.UID, 0) + fromPeer := NewPeer(fromName, "", router.Ourself.Peer.UID, 0) + toPeer := NewPeer(toName, "", r.Ourself.Peer.UID, 0) r.Peers.FetchWithDefault(fromPeer) // Has side-effect of incrementing refcount router.Peers.FetchWithDefault(toPeer) // @@ -70,10 +70,10 @@ func TestGossipTopology(t *testing.T) { // the routers supplied as arguments, carrying across all UID and // version information. func (router *Router) tp(routers ...*Router) *Peer { - peer := NewPeer(router.Ourself.Peer.Name, "hostname", router.Ourself.Peer.UID, 0) + peer := NewPeer(router.Ourself.Peer.Name, "", router.Ourself.Peer.UID, 0) connections := make(map[PeerName]Connection) for _, r := range routers { - p := NewPeer(r.Ourself.Peer.Name, "hostname", r.Ourself.Peer.UID, r.Ourself.Peer.version) + p := NewPeer(r.Ourself.Peer.Name, "", r.Ourself.Peer.UID, r.Ourself.Peer.version) connections[r.Ourself.Peer.Name] = newMockConnection(peer, p) } peer.SetVersionAndConnections(router.Ourself.Peer.version, connections) From 25c0cfd0c4fc54bf364ecc8892a96213a25dc9a0 Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Wed, 25 Feb 2015 12:10:56 +0000 Subject: [PATCH 12/12] Actually use empty string as test nickname --- router/mocks_test.go | 6 +++--- router/peers_test.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/router/mocks_test.go b/router/mocks_test.go index f2d6a975..2380a0fe 100644 --- a/router/mocks_test.go +++ b/router/mocks_test.go @@ -12,7 +12,7 @@ import ( // Add to peers a connection from peers.ourself to p func (peers *Peers) AddTestConnection(p *Peer) { - toPeer := NewPeer(p.Name, "hostname", p.UID, 0) + toPeer := NewPeer(p.Name, "", p.UID, 0) peers.FetchWithDefault(toPeer) // Has side-effect of incrementing refcount conn := newMockConnection(peers.ourself, toPeer) peers.ourself.addConnection(conn) @@ -22,10 +22,10 @@ func (peers *Peers) AddTestConnection(p *Peer) { // Add to peers a connection from p1 to p2 func (peers *Peers) AddTestRemoteConnection(p1, p2 *Peer) { fromName := p1.Name - fromPeer := NewPeer(fromName, "hostname", p1.UID, 0) + fromPeer := NewPeer(fromName, "", p1.UID, 0) fromPeer = peers.FetchWithDefault(fromPeer) toName := p2.Name - toPeer := NewPeer(toName, "hostname", p2.UID, 0) + toPeer := NewPeer(toName, "", p2.UID, 0) toPeer = peers.FetchWithDefault(toPeer) peers.ourself.addConnection(&RemoteConnection{fromPeer, toPeer, "", false}) } diff --git a/router/peers_test.go b/router/peers_test.go index e9840af9..b3257789 100644 --- a/router/peers_test.go +++ b/router/peers_test.go @@ -17,7 +17,7 @@ import ( // - non-gc of peers that are only referenced locally func newNode(name PeerName) (*Peer, *Peers) { - peer := NewPeer(name, "hostname", 0, 0) + peer := NewPeer(name, "", 0, 0) peers := NewPeers(peer, func(*Peer) {}) peers.FetchWithDefault(peer) return peer, peers