package utils import ( "crypto/md5" "fmt" . "github.com/coroot/coroot-node-agent/utils/modelse" "math" "os" "path" "strconv" "strings" ) func init() { } var ( APP_ID_INT64 int64 HOST_ID_INT64 int64 ACCOUNT_ID_INT int INSTANCE_ID_INT64 int64 APP_ID_BYTE HashByte HOST_ID_BYTE HashByte INSTANCE_ID_BYTE HashByte ) func BuildInt64ID(str string) ID_STRING { srcCode := md5.Sum([]byte(str)) code := fmt.Sprintf("%x", srcCode) id_string := md5ToDec(code) return ID_STRING(id_string) } func hexStringToBPFBytes(str string, out *HashByte) { for i := 0; i < len(str)/2; i++ { ch0 := str[2*i] ch1 := str[2*i+1] nib0 := (ch0 & 0x0F) + (ch0 >> 6) | ((ch0 >> 3) & 0x08) nib1 := (ch1 & 0x0F) + (ch1 >> 6) | ((ch1 >> 3) & 0x08) (*out)[i] = (nib0 << 4) | nib1 } } // todo account id func GetAccountID() int { if ACCOUNT_ID_INT != 0 { return ACCOUNT_ID_INT } ACCOUNT_ID_INT = 110 return ACCOUNT_ID_INT } // todo HostId func GetHostID() (int64, HashByte) { if HOST_ID_INT64 != 0 { return HOST_ID_INT64, HOST_ID_BYTE } uuid := MachineID() // todo AccountId str := fmt.Sprintf("%d:%s", GetAccountID(), uuid) srcCode := md5.Sum([]byte(str)) code := fmt.Sprintf("%x", srcCode) host_id_string := md5ToDec(code) id, err := strconv.ParseInt(host_id_string, 10, 64) if err != nil { return 0, HashByte{} } HOST_ID_INT64 = id var charArray HashByte hexStringToBPFBytes(host_id_string, &charArray) HOST_ID_BYTE = charArray // 将rune切片复制到char数组中 //for i := 0; i < HASH_SIZE; i++ { // charArray[i] = []byte(host_id_string)[i] //} return id, charArray } func GetIntHostID() int64 { id, _ := GetHostID() return id } func MachineID() string { for _, p := range []string{"sys/devices/virtual/dmi/id/product_uuid", "etc/machine-id", "var/lib/dbus/machine-id"} { payload, err := os.ReadFile(path.Join("/proc/1/root", p)) if err != nil { continue } id := strings.TrimSpace(strings.Replace(string(payload), "\n", "", -1)) return id } return "" } func hexdec(hexStr string) int { dec, _ := strconv.ParseInt(hexStr, 16, 64) return int(dec) } func md5ToDec(str string) string { strCode := "" for i := 0; i < 16; i++ { strCode += strconv.Itoa(int(math.Floor(float64(hexdec(string(str[i]))) / 16.0 * 10))) if i == 0 && strings.TrimSpace(strCode) == "0" { strCode = "1" + strCode } } return strCode }