185 lines
3.7 KiB
Go
185 lines
3.7 KiB
Go
package info
|
|
|
|
import (
|
|
"bytes"
|
|
"compress/gzip"
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"net"
|
|
|
|
cun "git.loafle.net/commons/util-go/net"
|
|
cung "git.loafle.net/commons/util-go/net/gateway"
|
|
ocmi "git.loafle.net/overflow/commons-go/model/infra"
|
|
ocmm "git.loafle.net/overflow/commons-go/model/meta"
|
|
ocmn "git.loafle.net/overflow/commons-go/model/noauthprobe"
|
|
"github.com/shirou/gopsutil/host"
|
|
)
|
|
|
|
func GetRegistHeader(apiKey string) (string, error) {
|
|
var err error
|
|
nap := ocmn.NoAuthProbe{
|
|
APIKey: apiKey,
|
|
}
|
|
|
|
var infraHost *ocmi.InfraHost
|
|
if infraHost, err = getInfraHost(); nil != err {
|
|
return "", err
|
|
}
|
|
|
|
var buf []byte
|
|
if buf, err = json.Marshal(infraHost); nil != err {
|
|
return "", err
|
|
}
|
|
nap.InfraHostMeta = string(buf)
|
|
|
|
if buf, err = json.Marshal(nap); nil != err {
|
|
return "", err
|
|
}
|
|
|
|
var b bytes.Buffer
|
|
gWriter, err := gzip.NewWriterLevel(&b, gzip.BestSpeed)
|
|
if nil != err {
|
|
return "", err
|
|
}
|
|
|
|
if _, err := gWriter.Write(buf); nil != err {
|
|
return "", err
|
|
}
|
|
if err := gWriter.Flush(); nil != err {
|
|
return "", err
|
|
}
|
|
if err := gWriter.Close(); nil != err {
|
|
return "", err
|
|
}
|
|
|
|
gBuf := b.Bytes()
|
|
|
|
enc := base64.StdEncoding.EncodeToString(gBuf)
|
|
|
|
return enc, nil
|
|
}
|
|
|
|
func getInfraHost() (*ocmi.InfraHost, error) {
|
|
var err error
|
|
infraHost := &ocmi.InfraHost{}
|
|
|
|
if infraHost.InfraHostMachine, err = getInfraHostMachine(); nil != err {
|
|
return nil, err
|
|
}
|
|
if infraHost.InfraHostOS, err = getInfraHostOS(); nil != err {
|
|
return nil, err
|
|
}
|
|
if infraHost.InfraHostIPs, err = getInfraHostIPs(); nil != err {
|
|
return nil, err
|
|
}
|
|
|
|
return infraHost, nil
|
|
}
|
|
|
|
func getInfraHostMachine() (*ocmi.InfraHostMachine, error) {
|
|
meta := make(map[string]interface{})
|
|
|
|
// if i, err := cpu.Info(); nil == err {
|
|
// meta["CPU"] = i
|
|
// }
|
|
|
|
// if i, err := mem.SwapMemory(); nil == err {
|
|
// meta["Memory_Swap"] = i
|
|
// }
|
|
|
|
// if i, err := mem.VirtualMemory(); nil == err {
|
|
// meta["Memory_Virtual"] = i
|
|
// }
|
|
|
|
// if i, err := disk.Partitions(true); nil == err {
|
|
// meta["Partitions"] = i
|
|
// }
|
|
|
|
// if i, err := disk.Usage("/"); nil == err {
|
|
// meta["Disk_Usage"] = i
|
|
// }
|
|
|
|
buf, err := json.Marshal(meta)
|
|
if nil != err {
|
|
return nil, err
|
|
}
|
|
|
|
return &ocmi.InfraHostMachine{
|
|
Meta: string(buf),
|
|
}, nil
|
|
}
|
|
|
|
func getInfraHostOS() (*ocmi.InfraHostOS, error) {
|
|
i, err := host.Info()
|
|
if nil != err {
|
|
return nil, err
|
|
}
|
|
|
|
infraHostOS := &ocmi.InfraHostOS{}
|
|
|
|
infraHostOS.Name = i.Hostname
|
|
infraHostOS.OS = i.OS
|
|
infraHostOS.Platform = i.Platform
|
|
infraHostOS.PlatformFamily = i.PlatformFamily
|
|
infraHostOS.KernelVersion = i.KernelVersion
|
|
infraHostOS.HostID = i.HostID
|
|
|
|
return infraHostOS, nil
|
|
}
|
|
|
|
func getInfraHostIPs() ([]*ocmi.InfraHostIP, error) {
|
|
gwIP, gwIface, err := cung.DiscoverGateway()
|
|
if nil != err {
|
|
return nil, err
|
|
}
|
|
|
|
interfaces, err := net.Interfaces()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
infraHostIPs := make([]*ocmi.InfraHostIP, 0)
|
|
|
|
for _, i := range interfaces {
|
|
if i.Flags&net.FlagLoopback != 0 || i.Flags&net.FlagUp == 0 {
|
|
continue
|
|
}
|
|
|
|
addrs, err := i.Addrs()
|
|
if nil != err {
|
|
continue
|
|
}
|
|
|
|
LOOP_ADDR:
|
|
for _, addr := range addrs {
|
|
_, ipNet, err := cun.ParseCIDR(addr.String())
|
|
if nil != err {
|
|
continue
|
|
}
|
|
|
|
infraHostIP := &ocmi.InfraHostIP{}
|
|
infraHostIP.Address = addr.String()
|
|
|
|
switch ipNet.Version() {
|
|
case 4:
|
|
infraHostIP.MetaIPType = ocmm.ToMetaIPType(ocmm.MetaIPTypeEnumV4)
|
|
case 6:
|
|
infraHostIP.MetaIPType = ocmm.ToMetaIPType(ocmm.MetaIPTypeEnumV6)
|
|
default:
|
|
continue LOOP_ADDR
|
|
}
|
|
|
|
infraHostIP.Mac = i.HardwareAddr.String()
|
|
infraHostIP.Iface = i.Name
|
|
|
|
if gwIface == i.Name {
|
|
infraHostIP.Gateway = gwIP.String()
|
|
}
|
|
|
|
infraHostIPs = append(infraHostIPs, infraHostIP)
|
|
}
|
|
}
|
|
|
|
return infraHostIPs, nil
|
|
}
|