1package event
2
3import (
4 "crypto/hmac"
5 "crypto/sha256"
6 "encoding/hex"
7 "fmt"
8 "net"
9
10 "github.com/denisbrodbeck/machineid"
11)
12
13var distinctId string
14
15const (
16 hashKey = "charm"
17 fallbackId = "unknown"
18)
19
20func getDistinctId() string {
21 if id, err := machineid.ProtectedID(hashKey); err == nil {
22 return id
23 }
24 if macAddr, err := getMacAddr(); err == nil {
25 return hashString(macAddr)
26 }
27 return fallbackId
28}
29
30func getMacAddr() (string, error) {
31 interfaces, err := net.Interfaces()
32 if err != nil {
33 return "", err
34 }
35 for _, iface := range interfaces {
36 if iface.Flags&net.FlagUp != 0 && iface.Flags&net.FlagLoopback == 0 && len(iface.HardwareAddr) > 0 {
37 if addrs, err := iface.Addrs(); err == nil && len(addrs) > 0 {
38 return iface.HardwareAddr.String(), nil
39 }
40 }
41 }
42 return "", fmt.Errorf("no active interface with mac address found")
43}
44
45func hashString(str string) string {
46 hash := hmac.New(sha256.New, []byte(str))
47 hash.Write([]byte(hashKey))
48 return hex.EncodeToString(hash.Sum(nil))
49}