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}