84 lines
1.5 KiB
Go
84 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/ed25519"
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
Login string
|
|
KeySign string
|
|
target string
|
|
)
|
|
|
|
func getCollectorPublicKey() (key []byte, err error) {
|
|
var resp *http.Response
|
|
resp, err = http.Get(target + "/api/collector_info")
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
defer resp.Body.Close()
|
|
|
|
rd := base64.NewDecoder(base64.StdEncoding, json.NewDecoder(resp.Body).Buffered())
|
|
return ioutil.ReadAll(rd)
|
|
}
|
|
|
|
type SendMeta struct {
|
|
Time time.Time `json:"time"`
|
|
Login string `json:"login"`
|
|
Test string `json:"test,omitempty"`
|
|
}
|
|
|
|
type SendContent struct {
|
|
Meta []byte `json:"meta"`
|
|
Data []byte `json:"data"`
|
|
Sign []byte `json:"sign"`
|
|
Key []byte `json:"key"`
|
|
KeySign string `json:"keysign"`
|
|
}
|
|
|
|
func encodeData(meta SendMeta, v interface{}) (data SendContent, err error) {
|
|
if meta.Time.IsZero() {
|
|
meta.Time = time.Now()
|
|
}
|
|
var b []byte
|
|
b, err = json.Marshal(meta)
|
|
if err != nil {
|
|
return
|
|
}
|
|
data.Meta = []byte(base64.StdEncoding.EncodeToString(b))
|
|
|
|
b, err = json.Marshal(v)
|
|
if err != nil {
|
|
return
|
|
}
|
|
data.Data = []byte(base64.StdEncoding.EncodeToString(b))
|
|
|
|
data.Sign = ed25519.Sign(myprivkey, append(data.Meta, data.Data...))
|
|
data.Key = myprivkey.Public().(ed25519.PublicKey)
|
|
data.KeySign = KeySign
|
|
|
|
return
|
|
}
|
|
|
|
func sendData(data SendContent) (err error) {
|
|
b := new(bytes.Buffer)
|
|
json.NewEncoder(b).Encode(data)
|
|
|
|
var resp *http.Response
|
|
resp, err = http.Post(target+"/remote", "application/json", b)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
resp.Body.Close()
|
|
|
|
return
|
|
}
|