|
@@ -1,7 +1,9 @@
|
|
package micro
|
|
package micro
|
|
|
|
|
|
import (
|
|
import (
|
|
|
|
+ "crypto/md5"
|
|
"encoding/binary"
|
|
"encoding/binary"
|
|
|
|
+ "hash"
|
|
"net"
|
|
"net"
|
|
"runtime"
|
|
"runtime"
|
|
)
|
|
)
|
|
@@ -24,7 +26,8 @@ const (
|
|
|
|
|
|
type (
|
|
type (
|
|
Reporter struct {
|
|
Reporter struct {
|
|
- ServerAddr string
|
|
|
|
|
|
+ ServerAddr string
|
|
|
|
+ machineCode []byte
|
|
}
|
|
}
|
|
|
|
|
|
reporterPayload struct {
|
|
reporterPayload struct {
|
|
@@ -35,6 +38,28 @@ type (
|
|
}
|
|
}
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+func (r *Reporter) getMachineCode() []byte {
|
|
|
|
+ var (
|
|
|
|
+ b []byte
|
|
|
|
+ err error
|
|
|
|
+ encoder hash.Hash
|
|
|
|
+ inters []net.Interface
|
|
|
|
+ )
|
|
|
|
+ //get network hard addr
|
|
|
|
+ if inters, err = net.Interfaces(); err == nil {
|
|
|
|
+ for _, inter := range inters {
|
|
|
|
+ if inter.HardwareAddr != nil {
|
|
|
|
+ b = inter.HardwareAddr
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ b = append(b, byte(runtime.NumCPU()))
|
|
|
|
+ encoder = md5.New()
|
|
|
|
+ encoder.Write(b)
|
|
|
|
+ return encoder.Sum(nil)
|
|
|
|
+}
|
|
|
|
+
|
|
func (r *Reporter) Collect() (payload *reporterPayload) {
|
|
func (r *Reporter) Collect() (payload *reporterPayload) {
|
|
var mem runtime.MemStats
|
|
var mem runtime.MemStats
|
|
payload = &reporterPayload{
|
|
payload = &reporterPayload{
|
|
@@ -52,16 +77,25 @@ func (r *Reporter) Collect() (payload *reporterPayload) {
|
|
payload.OS = OsOther
|
|
payload.OS = OsOther
|
|
}
|
|
}
|
|
runtime.ReadMemStats(&mem)
|
|
runtime.ReadMemStats(&mem)
|
|
- payload.Memory = uint16(mem.Alloc / 1024 / 1024) //MB
|
|
|
|
|
|
+ payload.Memory = uint16(mem.Alloc / 1024) //KB
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
func (r *Reporter) Marshal(payload *reporterPayload) (buf []byte) {
|
|
func (r *Reporter) Marshal(payload *reporterPayload) (buf []byte) {
|
|
- buf = make([]byte, 4+len(payload.Data))
|
|
|
|
|
|
+ var (
|
|
|
|
+ dl uint8
|
|
|
|
+ cl uint8
|
|
|
|
+ )
|
|
|
|
+ dl = uint8(len(payload.Data))
|
|
|
|
+ cl = uint8(len(r.machineCode))
|
|
|
|
+ buf = make([]byte, 6+int(dl)+int(cl))
|
|
buf[0] = payload.OS
|
|
buf[0] = payload.OS
|
|
buf[1] = payload.Cpus
|
|
buf[1] = payload.Cpus
|
|
- binary.BigEndian.PutUint16(buf[2:4], payload.Memory)
|
|
|
|
- copy(buf[4:], payload.Data[:])
|
|
|
|
|
|
+ buf[2] = cl
|
|
|
|
+ buf[3] = dl
|
|
|
|
+ binary.BigEndian.PutUint16(buf[4:6], payload.Memory)
|
|
|
|
+ copy(buf[6:6+cl], r.machineCode)
|
|
|
|
+ copy(buf[6+cl:], payload.Data[:])
|
|
for i, c := range buf {
|
|
for i, c := range buf {
|
|
buf[i] = c ^ 0x1F
|
|
buf[i] = c ^ 0x1F
|
|
}
|
|
}
|
|
@@ -74,6 +108,9 @@ func (r *Reporter) Do(data string) (err error) {
|
|
udpAddr *net.UDPAddr
|
|
udpAddr *net.UDPAddr
|
|
payload *reporterPayload
|
|
payload *reporterPayload
|
|
)
|
|
)
|
|
|
|
+ if r.machineCode == nil {
|
|
|
|
+ r.machineCode = r.getMachineCode()
|
|
|
|
+ }
|
|
if udpAddr, err = net.ResolveUDPAddr("udp", r.ServerAddr); err != nil {
|
|
if udpAddr, err = net.ResolveUDPAddr("udp", r.ServerAddr); err != nil {
|
|
return
|
|
return
|
|
}
|
|
}
|