diff --git a/go.mod b/go.mod index add46ef5..cc070f6e 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ require ( github.com/prometheus/common v0.18.0 github.com/prometheus/exporter-toolkit v0.5.0 github.com/rs/cors v1.7.0 - github.com/satori/go.uuid v1.2.0 + github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd github.com/stretchr/testify v1.5.1 diff --git a/go.sum b/go.sum index 8d2ebdde..930f60c7 100644 --- a/go.sum +++ b/go.sum @@ -448,8 +448,8 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM= +github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= diff --git a/silence/silence.go b/silence/silence.go index 1eaa5476..133b4802 100644 --- a/silence/silence.go +++ b/silence/silence.go @@ -540,7 +540,11 @@ func (s *Silences) Set(sil *pb.Silence) (string, error) { } } // If we got here it's either a new silence or a replacing one. - sil.Id = uuid.NewV4().String() + uid, err := uuid.NewV4() + if err != nil { + return "", errors.Wrap(err, "generate uuid") + } + sil.Id = uid.String() if sil.StartsAt.Before(now) { sil.StartsAt = now diff --git a/vendor/github.com/satori/go.uuid/README.md b/vendor/github.com/satori/go.uuid/README.md index 7b1a722d..362b2706 100644 --- a/vendor/github.com/satori/go.uuid/README.md +++ b/vendor/github.com/satori/go.uuid/README.md @@ -1,8 +1,8 @@ # UUID package for Go language -[![Build Status](https://travis-ci.org/satori/go.uuid.png?branch=master)](https://travis-ci.org/satori/go.uuid) +[![Build Status](https://travis-ci.org/satori/go.uuid.svg?branch=master)](https://travis-ci.org/satori/go.uuid) [![Coverage Status](https://coveralls.io/repos/github/satori/go.uuid/badge.svg?branch=master)](https://coveralls.io/github/satori/go.uuid) -[![GoDoc](http://godoc.org/github.com/satori/go.uuid?status.png)](http://godoc.org/github.com/satori/go.uuid) +[![GoDoc](http://godoc.org/github.com/satori/go.uuid?status.svg)](http://godoc.org/github.com/satori/go.uuid) This package provides pure Go implementation of Universally Unique Identifier (UUID). Supported both creation and parsing of UUIDs. @@ -23,7 +23,7 @@ Use the `go` command: ## Requirements -UUID package requires Go >= 1.2. +UUID package tested against Go >= 1.6. ## Example @@ -37,13 +37,23 @@ import ( func main() { // Creating UUID Version 4 - u1 := uuid.NewV4() + // panic on error + u1 := uuid.Must(uuid.NewV4()) fmt.Printf("UUIDv4: %s\n", u1) + // or error handling + u2, err := uuid.NewV4() + if err != nil { + fmt.Printf("Something went wrong: %s", err) + return + } + fmt.Printf("UUIDv4: %s\n", u2) + // Parsing UUID from string input u2, err := uuid.FromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8") if err != nil { - fmt.Printf("Something gone wrong: %s", err) + fmt.Printf("Something went wrong: %s", err) + return } fmt.Printf("Successfully parsed: %s", u2) } diff --git a/vendor/github.com/satori/go.uuid/generator.go b/vendor/github.com/satori/go.uuid/generator.go index 3f2f1da2..c50d33ca 100644 --- a/vendor/github.com/satori/go.uuid/generator.go +++ b/vendor/github.com/satori/go.uuid/generator.go @@ -26,7 +26,9 @@ import ( "crypto/rand" "crypto/sha1" "encoding/binary" + "fmt" "hash" + "io" "net" "os" "sync" @@ -37,21 +39,23 @@ import ( // UUID epoch (October 15, 1582) and Unix epoch (January 1, 1970). const epochStart = 122192928000000000 -var ( - global = newDefaultGenerator() +type epochFunc func() time.Time +type hwAddrFunc func() (net.HardwareAddr, error) - epochFunc = unixTimeFunc - posixUID = uint32(os.Getuid()) - posixGID = uint32(os.Getgid()) +var ( + global = newRFC4122Generator() + + posixUID = uint32(os.Getuid()) + posixGID = uint32(os.Getgid()) ) // NewV1 returns UUID based on current timestamp and MAC address. -func NewV1() UUID { +func NewV1() (UUID, error) { return global.NewV1() } // NewV2 returns DCE Security UUID based on POSIX UID/GID. -func NewV2(domain byte) UUID { +func NewV2(domain byte) (UUID, error) { return global.NewV2(domain) } @@ -61,7 +65,7 @@ func NewV3(ns UUID, name string) UUID { } // NewV4 returns random generated UUID. -func NewV4() UUID { +func NewV4() (UUID, error) { return global.NewV4() } @@ -72,74 +76,85 @@ func NewV5(ns UUID, name string) UUID { // Generator provides interface for generating UUIDs. type Generator interface { - NewV1() UUID - NewV2(domain byte) UUID + NewV1() (UUID, error) + NewV2(domain byte) (UUID, error) NewV3(ns UUID, name string) UUID - NewV4() UUID + NewV4() (UUID, error) NewV5(ns UUID, name string) UUID } // Default generator implementation. -type generator struct { - storageOnce sync.Once - storageMutex sync.Mutex +type rfc4122Generator struct { + clockSequenceOnce sync.Once + hardwareAddrOnce sync.Once + storageMutex sync.Mutex + rand io.Reader + + epochFunc epochFunc + hwAddrFunc hwAddrFunc lastTime uint64 clockSequence uint16 hardwareAddr [6]byte } -func newDefaultGenerator() Generator { - return &generator{} +func newRFC4122Generator() Generator { + return &rfc4122Generator{ + epochFunc: time.Now, + hwAddrFunc: defaultHWAddrFunc, + rand: rand.Reader, + } } // NewV1 returns UUID based on current timestamp and MAC address. -func (g *generator) NewV1() UUID { +func (g *rfc4122Generator) NewV1() (UUID, error) { u := UUID{} - timeNow, clockSeq, hardwareAddr := g.getStorage() - + timeNow, clockSeq, err := g.getClockSequence() + if err != nil { + return Nil, err + } binary.BigEndian.PutUint32(u[0:], uint32(timeNow)) binary.BigEndian.PutUint16(u[4:], uint16(timeNow>>32)) binary.BigEndian.PutUint16(u[6:], uint16(timeNow>>48)) binary.BigEndian.PutUint16(u[8:], clockSeq) + hardwareAddr, err := g.getHardwareAddr() + if err != nil { + return Nil, err + } copy(u[10:], hardwareAddr) u.SetVersion(V1) u.SetVariant(VariantRFC4122) - return u + return u, nil } // NewV2 returns DCE Security UUID based on POSIX UID/GID. -func (g *generator) NewV2(domain byte) UUID { - u := UUID{} - - timeNow, clockSeq, hardwareAddr := g.getStorage() +func (g *rfc4122Generator) NewV2(domain byte) (UUID, error) { + u, err := g.NewV1() + if err != nil { + return Nil, err + } switch domain { case DomainPerson: - binary.BigEndian.PutUint32(u[0:], posixUID) + binary.BigEndian.PutUint32(u[:], posixUID) case DomainGroup: - binary.BigEndian.PutUint32(u[0:], posixGID) + binary.BigEndian.PutUint32(u[:], posixGID) } - binary.BigEndian.PutUint16(u[4:], uint16(timeNow>>32)) - binary.BigEndian.PutUint16(u[6:], uint16(timeNow>>48)) - binary.BigEndian.PutUint16(u[8:], clockSeq) u[9] = domain - copy(u[10:], hardwareAddr) - u.SetVersion(V2) u.SetVariant(VariantRFC4122) - return u + return u, nil } // NewV3 returns UUID based on MD5 hash of namespace UUID and name. -func (g *generator) NewV3(ns UUID, name string) UUID { +func (g *rfc4122Generator) NewV3(ns UUID, name string) UUID { u := newFromHash(md5.New(), ns, name) u.SetVersion(V3) u.SetVariant(VariantRFC4122) @@ -148,17 +163,19 @@ func (g *generator) NewV3(ns UUID, name string) UUID { } // NewV4 returns random generated UUID. -func (g *generator) NewV4() UUID { +func (g *rfc4122Generator) NewV4() (UUID, error) { u := UUID{} - g.safeRandom(u[:]) + if _, err := io.ReadFull(g.rand, u[:]); err != nil { + return Nil, err + } u.SetVersion(V4) u.SetVariant(VariantRFC4122) - return u + return u, nil } // NewV5 returns UUID based on SHA-1 hash of namespace UUID and name. -func (g *generator) NewV5(ns UUID, name string) UUID { +func (g *rfc4122Generator) NewV5(ns UUID, name string) UUID { u := newFromHash(sha1.New(), ns, name) u.SetVersion(V5) u.SetVariant(VariantRFC4122) @@ -166,66 +183,61 @@ func (g *generator) NewV5(ns UUID, name string) UUID { return u } -func (g *generator) initStorage() { - g.initClockSequence() - g.initHardwareAddr() -} - -func (g *generator) initClockSequence() { - buf := make([]byte, 2) - g.safeRandom(buf) - g.clockSequence = binary.BigEndian.Uint16(buf) -} - -func (g *generator) initHardwareAddr() { - interfaces, err := net.Interfaces() - if err == nil { - for _, iface := range interfaces { - if len(iface.HardwareAddr) >= 6 { - copy(g.hardwareAddr[:], iface.HardwareAddr) - return - } +// Returns epoch and clock sequence. +func (g *rfc4122Generator) getClockSequence() (uint64, uint16, error) { + var err error + g.clockSequenceOnce.Do(func() { + buf := make([]byte, 2) + if _, err = io.ReadFull(g.rand, buf); err != nil { + return } + g.clockSequence = binary.BigEndian.Uint16(buf) + }) + if err != nil { + return 0, 0, err } - // Initialize hardwareAddr randomly in case - // of real network interfaces absence - g.safeRandom(g.hardwareAddr[:]) - - // Set multicast bit as recommended in RFC 4122 - g.hardwareAddr[0] |= 0x01 -} - -func (g *generator) safeRandom(dest []byte) { - if _, err := rand.Read(dest); err != nil { - panic(err) - } -} - -// Returns UUID v1/v2 storage state. -// Returns epoch timestamp, clock sequence, and hardware address. -func (g *generator) getStorage() (uint64, uint16, []byte) { - g.storageOnce.Do(g.initStorage) - g.storageMutex.Lock() defer g.storageMutex.Unlock() - timeNow := epochFunc() - // Clock changed backwards since last UUID generation. + timeNow := g.getEpoch() + // Clock didn't change since last UUID generation. // Should increase clock sequence. if timeNow <= g.lastTime { g.clockSequence++ } g.lastTime = timeNow - return timeNow, g.clockSequence, g.hardwareAddr[:] + return timeNow, g.clockSequence, nil +} + +// Returns hardware address. +func (g *rfc4122Generator) getHardwareAddr() ([]byte, error) { + var err error + g.hardwareAddrOnce.Do(func() { + if hwAddr, err := g.hwAddrFunc(); err == nil { + copy(g.hardwareAddr[:], hwAddr) + return + } + + // Initialize hardwareAddr randomly in case + // of real network interfaces absence. + if _, err = io.ReadFull(g.rand, g.hardwareAddr[:]); err != nil { + return + } + // Set multicast bit as recommended by RFC 4122 + g.hardwareAddr[0] |= 0x01 + }) + if err != nil { + return []byte{}, err + } + return g.hardwareAddr[:], nil } // Returns difference in 100-nanosecond intervals between // UUID epoch (October 15, 1582) and current time. -// This is default epoch calculation function. -func unixTimeFunc() uint64 { - return epochStart + uint64(time.Now().UnixNano()/100) +func (g *rfc4122Generator) getEpoch() uint64 { + return epochStart + uint64(g.epochFunc().UnixNano()/100) } // Returns UUID based on hashing of namespace UUID and name. @@ -237,3 +249,17 @@ func newFromHash(h hash.Hash, ns UUID, name string) UUID { return u } + +// Returns hardware address. +func defaultHWAddrFunc() (net.HardwareAddr, error) { + ifaces, err := net.Interfaces() + if err != nil { + return []byte{}, err + } + for _, iface := range ifaces { + if len(iface.HardwareAddr) >= 6 { + return iface.HardwareAddr, nil + } + } + return []byte{}, fmt.Errorf("uuid: no HW address found") +} diff --git a/vendor/modules.txt b/vendor/modules.txt index ff17e71a..ceb8bb2e 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -188,7 +188,7 @@ github.com/prometheus/procfs/internal/util # github.com/rs/cors v1.7.0 ## explicit github.com/rs/cors -# github.com/satori/go.uuid v1.2.0 +# github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b ## explicit github.com/satori/go.uuid # github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529