probe/auth/info/info.go
crusader b4974183c6 ing
2018-06-20 16:02:23 +09:00

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
}