From ebcb7f61087cb118c40b04e008d308d918e85ae6 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 20 Dec 2016 18:12:24 +0000 Subject: [PATCH] Use persisted peer name if it matches old-style ID --- Makefile | 2 +- net/uuid.go | 60 +++++++++++++++++++++++++++++++------ prog/weaveutil/unique_id.go | 9 +++--- 3 files changed, 57 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 720901e8..2ea6402b 100644 --- a/Makefile +++ b/Makefile @@ -71,7 +71,7 @@ testrunner: $(RUNNER_EXE) $(TEST_TLS_EXE) $(WEAVER_EXE) $(WEAVEPROXY_EXE) $(WEAVEUTIL_EXE): common/*.go common/*/*.go net/*.go net/*/*.go $(WEAVER_EXE): router/*.go ipam/*.go ipam/*/*.go db/*.go nameserver/*.go prog/weaver/*.go $(WEAVEPROXY_EXE): proxy/*.go prog/weaveproxy/*.go -$(WEAVEUTIL_EXE): prog/weaveutil/*.go net/*.go plugin/net/*.go plugin/ipam/*.go +$(WEAVEUTIL_EXE): prog/weaveutil/*.go net/*.go plugin/net/*.go plugin/ipam/*.go db/*.go $(SIGPROXY_EXE): prog/sigproxy/*.go $(KUBEPEERS_EXE): prog/kube-peers/*.go $(WEAVENPC_EXE): prog/weave-npc/*.go npc/*.go npc/*/*.go diff --git a/net/uuid.go b/net/uuid.go index f3cd2ebc..09bd7753 100644 --- a/net/uuid.go +++ b/net/uuid.go @@ -1,37 +1,79 @@ package net import ( - "fmt" + "errors" "io/ioutil" "net" "os" + + "github.com/weaveworks/mesh" + "github.com/weaveworks/weave/db" ) +func getOldStyleSystemUUID() ([]byte, error) { + uuid, err := ioutil.ReadFile("/sys/class/dmi/id/product_uuid") + if os.IsNotExist(err) { + uuid, err = ioutil.ReadFile("/sys/hypervisor/uuid") + } + return uuid, err +} + func getSystemUUID(hostRoot string) ([]byte, error) { + uuid, err := getOldStyleSystemUUID() + if err != nil && !os.IsNotExist(err) { + return nil, err + } machineid, err := ioutil.ReadFile(hostRoot + "/etc/machine-id") if os.IsNotExist(err) { - machineid, _ = ioutil.ReadFile(hostRoot + "/var/lib/dbus/machine-id") - } - uuid, err := ioutil.ReadFile(hostRoot + "/sys/class/dmi/id/product_uuid") - if os.IsNotExist(err) { - uuid, _ = ioutil.ReadFile(hostRoot + "/sys/hypervisor/uuid") + machineid, err = ioutil.ReadFile(hostRoot + "/var/lib/dbus/machine-id") } if err != nil && !os.IsNotExist(err) { return nil, err } - if len(machineid)+len(uuid) == 0 { - return nil, fmt.Errorf("Empty system uuid") + if len(uuid) == 0 { + return nil, errors.New("All system IDs are blank") } return append(machineid, uuid...), nil } +func getPersistedPeerName(pathName string) (mesh.PeerName, error) { + d, err := db.NewBoltDBReadOnly(pathName) + if err != nil { + return mesh.UnknownPeerName, err + } + defer d.Close() + var peerName mesh.PeerName + nameFound, err := d.Load(db.NameIdent, &peerName) + if err != nil || !nameFound { + return mesh.UnknownPeerName, err + } + return peerName, nil +} + // GetSystemPeerName returns an ID derived from concatenated machine-id // (either systemd or dbus), the system (aka bios) UUID and the // hypervisor UUID. It is tweaked and formatted to be usable as a mac address -func GetSystemPeerName(hostRoot string) (string, error) { +func GetSystemPeerName(dbPrefix, hostRoot string) (string, error) { + // Check if we have a persisted name that matches the old-style ID for this host + if oldUUID, err := getOldStyleSystemUUID(); err == nil { + pathName := dbPrefix + db.FileName + if _, err := os.Stat(pathName); err == nil { + persistedPeerName, err := getPersistedPeerName(pathName) + if err != nil && !os.IsNotExist(err) { + return "", err + } + if persistedPeerName == mesh.PeerNameFromBin(MACfromUUID(oldUUID)) { + return persistedPeerName.String(), nil + } + } + } else if !os.IsNotExist(err) { + return "", err + } var mac net.HardwareAddr if uuid, err := getSystemUUID(hostRoot); err == nil { mac = MACfromUUID(uuid) + } else if !os.IsNotExist(err) { + return "", err } else { mac, err = RandomMAC() if err != nil { diff --git a/prog/weaveutil/unique_id.go b/prog/weaveutil/unique_id.go index 456c69eb..2f12d71e 100644 --- a/prog/weaveutil/unique_id.go +++ b/prog/weaveutil/unique_id.go @@ -7,11 +7,12 @@ import ( ) func uniqueID(args []string) error { - if len(args) != 1 { - cmdUsage("unique-id", "") + if len(args) != 2 { + cmdUsage("unique-id", " ") } - hostRoot := args[0] - uid, err := weavenet.GetSystemPeerName(hostRoot) + dbPrefix := args[0] + hostRoot := args[1] + uid, err := weavenet.GetSystemPeerName(dbPrefix, hostRoot) if err != nil { return err }