2018-08-16 16:42:35 -04:00
|
|
|
// Copyright 2016 Google Inc. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package uuid
|
|
|
|
|
|
|
|
import (
|
|
|
|
"sync"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
nodeMu sync.Mutex
|
|
|
|
ifname string // name of interface being used
|
|
|
|
nodeID [6]byte // hardware for version 1 UUIDs
|
|
|
|
zeroID [6]byte // nodeID with only 0's
|
|
|
|
)
|
|
|
|
|
|
|
|
// NodeInterface returns the name of the interface from which the NodeID was
|
|
|
|
// derived. The interface "user" is returned if the NodeID was set by
|
|
|
|
// SetNodeID.
|
|
|
|
func NodeInterface() string {
|
|
|
|
defer nodeMu.Unlock()
|
|
|
|
nodeMu.Lock()
|
|
|
|
return ifname
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetNodeInterface selects the hardware address to be used for Version 1 UUIDs.
|
|
|
|
// If name is "" then the first usable interface found will be used or a random
|
|
|
|
// Node ID will be generated. If a named interface cannot be found then false
|
|
|
|
// is returned.
|
|
|
|
//
|
|
|
|
// SetNodeInterface never fails when name is "".
|
|
|
|
func SetNodeInterface(name string) bool {
|
|
|
|
defer nodeMu.Unlock()
|
|
|
|
nodeMu.Lock()
|
|
|
|
return setNodeInterface(name)
|
|
|
|
}
|
|
|
|
|
|
|
|
func setNodeInterface(name string) bool {
|
|
|
|
iname, addr := getHardwareInterface(name) // null implementation for js
|
|
|
|
if iname != "" && addr != nil {
|
|
|
|
ifname = iname
|
|
|
|
copy(nodeID[:], addr)
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
// We found no interfaces with a valid hardware address. If name
|
|
|
|
// does not specify a specific interface generate a random Node ID
|
|
|
|
// (section 4.1.6)
|
|
|
|
if name == "" {
|
Hcl2 input variables, local variables and functions (#8588)
Mainly redefine or reused what Terraform did.
* allow to used `variables`, `variable` and `local` blocks
* import the following functions and their docs from Terraform: abs, abspath, basename, base64decode, base64encode, bcrypt, can, ceil, chomp, chunklist, cidrhost, cidrnetmask, cidrsubnet, cidrsubnets, coalesce, coalescelist, compact, concat, contains, convert, csvdecode, dirname, distinct, element, file, fileexists, fileset, flatten, floor, format, formatdate, formatlist, indent, index, join, jsondecode, jsonencode, keys, length, log, lookup, lower, max, md5, merge, min, parseint, pathexpand, pow, range, reverse, rsadecrypt, setintersection, setproduct, setunion, sha1, sha256, sha512, signum, slice, sort, split, strrev, substr, timestamp, timeadd, title, trim, trimprefix, trimspace, trimsuffix, try, upper, urlencode, uuidv4, uuidv5, values, yamldecode, yamlencode, zipmap.
2020-02-06 05:49:21 -05:00
|
|
|
ifname = "random"
|
2018-08-16 16:42:35 -04:00
|
|
|
randomBits(nodeID[:])
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
// NodeID returns a slice of a copy of the current Node ID, setting the Node ID
|
|
|
|
// if not already set.
|
|
|
|
func NodeID() []byte {
|
|
|
|
defer nodeMu.Unlock()
|
|
|
|
nodeMu.Lock()
|
|
|
|
if nodeID == zeroID {
|
|
|
|
setNodeInterface("")
|
|
|
|
}
|
|
|
|
nid := nodeID
|
|
|
|
return nid[:]
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetNodeID sets the Node ID to be used for Version 1 UUIDs. The first 6 bytes
|
|
|
|
// of id are used. If id is less than 6 bytes then false is returned and the
|
|
|
|
// Node ID is not set.
|
|
|
|
func SetNodeID(id []byte) bool {
|
|
|
|
if len(id) < 6 {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
defer nodeMu.Unlock()
|
|
|
|
nodeMu.Lock()
|
|
|
|
copy(nodeID[:], id)
|
|
|
|
ifname = "user"
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
// NodeID returns the 6 byte node id encoded in uuid. It returns nil if uuid is
|
|
|
|
// not valid. The NodeID is only well defined for version 1 and 2 UUIDs.
|
|
|
|
func (uuid UUID) NodeID() []byte {
|
|
|
|
var node [6]byte
|
|
|
|
copy(node[:], uuid[10:])
|
|
|
|
return node[:]
|
|
|
|
}
|