From f517b947e66a14c94f211ca4e3852e749631cdb6 Mon Sep 17 00:00:00 2001 From: Adam Harrison Date: Thu, 19 Feb 2015 12:29:37 +0000 Subject: [PATCH] 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 {