|
@@ -0,0 +1,89 @@
|
|
|
+package common
|
|
|
+
|
|
|
+import (
|
|
|
+ "bytes"
|
|
|
+ "encoding/json"
|
|
|
+ "errors"
|
|
|
+ "fmt"
|
|
|
+ "net/http"
|
|
|
+ "os"
|
|
|
+ "path/filepath"
|
|
|
+ "strings"
|
|
|
+)
|
|
|
+
|
|
|
+const (
|
|
|
+ CasaOSURLFilename = "casaos.url"
|
|
|
+ APICasaOSNotify = "/v1/notify"
|
|
|
+)
|
|
|
+
|
|
|
+type NotifyService interface {
|
|
|
+ SendNotify(path string, message map[string]interface{}) error
|
|
|
+ SendSystemStatusNotify(message map[string]interface{}) error
|
|
|
+}
|
|
|
+type notifyService struct {
|
|
|
+ address string
|
|
|
+}
|
|
|
+
|
|
|
+func (n *notifyService) SendNotify(path string, message map[string]interface{}) error {
|
|
|
+
|
|
|
+ url := strings.TrimSuffix(n.address, "/") + APICasaOSNotify + "/" + path
|
|
|
+ body, err := json.Marshal(message)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ response, err := http.Post(url, "application/json", bytes.NewBuffer(body))
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ if response.StatusCode != http.StatusOK {
|
|
|
+ return errors.New("failed to send notify (status code: " + fmt.Sprint(response.StatusCode) + ")")
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+// disk: "sys_disk":{"size":56866869248,"avail":5855485952,"health":true,"used":48099700736}
|
|
|
+// usb: "sys_usb":[{"name": "sdc","size": 7747397632,"model": "DataTraveler_2.0","avail": 7714418688,"children": null}]
|
|
|
+func (n *notifyService) SendSystemStatusNotify(message map[string]interface{}) error {
|
|
|
+
|
|
|
+ url := strings.TrimSuffix(n.address, "/") + APICasaOSNotify + "/system_status"
|
|
|
+ fmt.Println(url)
|
|
|
+ body, err := json.Marshal(message)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ response, err := http.Post(url, "application/json", bytes.NewBuffer(body))
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ if response.StatusCode != http.StatusOK {
|
|
|
+ return errors.New("failed to send notify (status code: " + fmt.Sprint(response.StatusCode) + ")")
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+
|
|
|
+}
|
|
|
+func NewNotifyService(runtimePath string) (NotifyService, error) {
|
|
|
+ casaosAddressFile := filepath.Join(runtimePath, CasaOSURLFilename)
|
|
|
+
|
|
|
+ buf, err := os.ReadFile(casaosAddressFile)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ address := string(buf)
|
|
|
+
|
|
|
+ response, err := http.Get(address + "/ping")
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ if response.StatusCode != 200 {
|
|
|
+ return nil, errors.New("failed to ping casaos service")
|
|
|
+ }
|
|
|
+
|
|
|
+ return ¬ifyService{
|
|
|
+ address: address,
|
|
|
+ }, nil
|
|
|
+}
|