mirror of
https://github.com/chaitin/MonkeyCode.git
synced 2026-02-02 23:03:57 +08:00
116 lines
2.5 KiB
Go
116 lines
2.5 KiB
Go
package report
|
|
|
|
import (
|
|
"encoding/json"
|
|
"log/slog"
|
|
"net/url"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
|
|
"github.com/chaitin/MonkeyCode/backend/config"
|
|
"github.com/chaitin/MonkeyCode/backend/pkg/aes"
|
|
"github.com/chaitin/MonkeyCode/backend/pkg/machine"
|
|
"github.com/chaitin/MonkeyCode/backend/pkg/request"
|
|
"github.com/chaitin/MonkeyCode/backend/pkg/version"
|
|
)
|
|
|
|
type Reporter struct {
|
|
client *request.Client
|
|
version *version.VersionInfo
|
|
logger *slog.Logger
|
|
IDFile string
|
|
machineID string
|
|
cfg *config.Config
|
|
}
|
|
|
|
func NewReport(logger *slog.Logger, cfg *config.Config, version *version.VersionInfo) *Reporter {
|
|
raw := "https://baizhi.cloud"
|
|
u, _ := url.Parse(raw)
|
|
client := request.NewClient(u.Scheme, u.Host, 30*time.Second)
|
|
|
|
r := &Reporter{
|
|
client: client,
|
|
logger: logger.With("module", "reporter"),
|
|
IDFile: "/app/static/.machine_id",
|
|
cfg: cfg,
|
|
version: version,
|
|
}
|
|
if _, err := r.readMachineID(); err != nil {
|
|
r.logger.With("error", err).Warn("read machine id file failed")
|
|
}
|
|
return r
|
|
}
|
|
|
|
func (r *Reporter) readMachineID() (string, error) {
|
|
data, err := os.ReadFile(r.IDFile)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
r.machineID = string(data)
|
|
return r.machineID, nil
|
|
}
|
|
|
|
func (r *Reporter) Report(index string, data any) error {
|
|
b, err := json.Marshal(data)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
encrypt, err := aes.Encrypt([]byte(r.cfg.DataReport.Key), string(b))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
req := map[string]any{
|
|
"index": index,
|
|
"id": uuid.NewString(),
|
|
"data": encrypt,
|
|
}
|
|
|
|
if _, err := request.Post[map[string]any](r.client, "/api/public/data/report", req); err != nil {
|
|
r.logger.With("error", err).Warn("report installation failed")
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (r *Reporter) GetMachineID() string {
|
|
return r.machineID
|
|
}
|
|
|
|
func (r *Reporter) ReportInstallation() error {
|
|
if r.machineID != "" {
|
|
return nil
|
|
}
|
|
|
|
id, err := machine.GenerateMachineID()
|
|
if err != nil {
|
|
r.logger.With("error", err).Warn("generate machine id failed")
|
|
return err
|
|
}
|
|
r.machineID = id
|
|
|
|
f, err := os.Create(r.IDFile)
|
|
if err != nil {
|
|
r.logger.With("error", err).Warn("create machine id file failed")
|
|
return err
|
|
}
|
|
defer f.Close()
|
|
|
|
_, err = f.WriteString(id)
|
|
if err != nil {
|
|
r.logger.With("error", err).Warn("write machine id file failed")
|
|
return err
|
|
}
|
|
|
|
return r.Report("monkeycode-installation", InstallData{
|
|
MachineID: id,
|
|
Version: r.version.Version(),
|
|
Timestamp: time.Now().Format(time.RFC3339),
|
|
Type: "installation",
|
|
})
|
|
}
|