diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 444b842..f87c4a9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -67,3 +67,5 @@ jobs: dist/linux-arm64-casaos-migration-tool-${{ steps.get_version.outputs.VERSION }}.tar.gz:/IceWhaleTech/CasaOS/releases/download/${{ steps.get_version.outputs.VERSION }}/linux-arm64-casaos-migration-tool-${{ steps.get_version.outputs.VERSION }}.tar.gz dist/linux-amd64-casaos-migration-tool-${{ steps.get_version.outputs.VERSION }}.tar.gz:/IceWhaleTech/CasaOS/releases/download/${{ steps.get_version.outputs.VERSION }}/linux-amd64-casaos-migration-tool-${{ steps.get_version.outputs.VERSION }}.tar.gz + + diff --git a/.gitignore b/.gitignore index 97bb285..b87d9ac 100644 --- a/.gitignore +++ b/.gitignore @@ -39,4 +39,4 @@ dist CasaOS # System Files -.DS_Store \ No newline at end of file +.DS_Store diff --git a/CHANGELOG.md b/CHANGELOG.md index d856e03..d65c868 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -## [0.3.7] - 2022-10-28 +## [0.3.7.1] 2022-11-04 + +### Fixed + +- Fix memory leak issue ([#658](https://github.com/IceWhaleTech/CasaOS/issues/658)[#646](https://github.com/IceWhaleTech/CasaOS/issues/646)) +- Solve the problem of local application import failure ([#490](https://github.com/IceWhaleTech/CasaOS/issues/490)) + +## [0.3.7] 2022-10-28 + +### Added +- [Storage] Disk merge (Beta), you can merge multiple disks into a single storage space (currently you need to enable this feature from the command line) + +### Changed +- [Files] Changed the cache file storage location, now the file upload size is not limited by the system disk capacity. +- [Scripts] Updated installation and upgrade scripts to support more Debian-based Linux distributions. +- [Engineering] Refactored Local Storage into a standalone service as part of CasaOS modularization. + +### Fixed +- [Apps] App list update mechanism improved, now you can see the latest apps in App Store immediately. +- [Storage] Fixed a lot of known issues + ### Added - [Storage] Disk merge (Beta), you can merge multiple disks into a single storage space (currently you need to enable this feature from the command line) diff --git a/build/sysroot/usr/share/casaos/cleanup/script.d/03-cleanup-casaos.sh b/build/sysroot/usr/share/casaos/cleanup/script.d/03-cleanup-casaos.sh index c2bdbcc..8b066b3 100644 --- a/build/sysroot/usr/share/casaos/cleanup/script.d/03-cleanup-casaos.sh +++ b/build/sysroot/usr/share/casaos/cleanup/script.d/03-cleanup-casaos.sh @@ -1,4 +1,14 @@ #!/bin/bash +### + # @Author: LinkLeong link@icewhale.org + # @Date: 2022-11-15 15:51:44 + # @LastEditors: LinkLeong + # @LastEditTime: 2022-11-15 15:53:37 + # @FilePath: /CasaOS/build/sysroot/usr/share/casaos/cleanup/script.d/03-cleanup-casaos.sh + # @Description: + # @Website: https://www.casaos.io + # Copyright (c) 2022 by icewhale, All Rights Reserved. +### set -e @@ -44,4 +54,3 @@ readonly SETUP_SCRIPT_FILEPATH="${SETUP_SCRIPT_DIRECTORY}/${SETUP_SCRIPT_FILENAM echo "🟩 Running ${SETUP_SCRIPT_FILENAME}..." $SHELL "${SETUP_SCRIPT_FILEPATH}" "${BUILD_PATH}" - diff --git a/common/notify.go b/common/notify.go new file mode 100644 index 0000000..a5cee48 --- /dev/null +++ b/common/notify.go @@ -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 +} diff --git a/common/notify_test.go b/common/notify_test.go new file mode 100644 index 0000000..1e9c543 --- /dev/null +++ b/common/notify_test.go @@ -0,0 +1,29 @@ +package common + +import "testing" + +func TestSendNotify(t *testing.T) { + notify, err := NewNotifyService("/var/run/casaos") + if err != nil { + t.Fatal(err) + } + err = notify.SendNotify("test", map[string]interface{}{ + "test": "test", + }) + if err != nil { + t.Fatal(err) + } +} + +func TestSendSystemStatusNotify(t *testing.T) { + notify, err := NewNotifyService("/var/run/casaos") + if err != nil { + t.Fatal(err) + } + err = notify.SendSystemStatusNotify(map[string]interface{}{ + "sys_usb": `[{"name": "sdc","size": 7747397632,"model": "DataTraveler_2.0","avail": 7714418688,"children": null}]`, + }) + if err != nil { + t.Fatal(err) + } +} diff --git a/common/share.go b/common/share.go new file mode 100644 index 0000000..a0da4b2 --- /dev/null +++ b/common/share.go @@ -0,0 +1,78 @@ +package common + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "net/http" + "os" + "path/filepath" + "strings" +) + +const ( + APICasaOSShare = "/v1/samba/shares" +) + +type ShareService interface { + DeleteShare(id string) error +} +type shareService struct { + address string +} + +func (n *shareService) DeleteShare(id string) error { + url := strings.TrimSuffix(n.address, "/") + APICasaOSShare + "/" + id + fmt.Println(url) + message := "{}" + body, err := json.Marshal(message) + if err != nil { + return err + } + + client := &http.Client{} + + // Create request + req, err := http.NewRequest("DELETE", url, bytes.NewBuffer(body)) + if err != nil { + return err + } + + // Fetch Request + response, err := client.Do(req) + if err != nil { + return err + } + defer response.Body.Close() + + if response.StatusCode != http.StatusOK { + return errors.New("failed to send share (status code: " + fmt.Sprint(response.StatusCode) + ")") + } + return nil + +} + +func NewShareService(runtimePath string) (ShareService, 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 &shareService{ + address: address, + }, nil +} diff --git a/common/share_test.go b/common/share_test.go new file mode 100644 index 0000000..ce79e03 --- /dev/null +++ b/common/share_test.go @@ -0,0 +1,14 @@ +package common + +import "testing" + +func TestDeleteShare(t *testing.T) { + share, err := NewShareService("/var/run/casaos") + if err != nil { + t.Fatal(err) + } + err = share.DeleteShare("1") + if err != nil { + t.Fatal(err) + } +} diff --git a/model/sys_common.go b/model/sys_common.go index f9476a4..098ba97 100644 --- a/model/sys_common.go +++ b/model/sys_common.go @@ -74,3 +74,8 @@ type FileSetting struct { ShareDir []string `json:"share_dir" delim:"|"` DownloadDir string `json:"download_dir"` } +type BaseInfo struct { + Hash string `json:"i"` + Version string `json:"v"` + Channel string `json:"c,omitempty"` +} diff --git a/route/init.go b/route/init.go index a35de29..405df48 100644 --- a/route/init.go +++ b/route/init.go @@ -1,21 +1,65 @@ +/* + * @Author: LinkLeong link@icewhale.org + * @Date: 2022-11-15 15:51:44 + * @LastEditors: LinkLeong + * @LastEditTime: 2022-11-15 15:55:16 + * @FilePath: /CasaOS/route/init.go + * @Description: + * @Website: https://www.casaos.io + * Copyright (c) 2022 by icewhale, All Rights Reserved. + */ package route import ( + "encoding/json" "fmt" "os" "strings" "time" + "github.com/IceWhaleTech/CasaOS/model" + "github.com/IceWhaleTech/CasaOS/pkg/config" "github.com/IceWhaleTech/CasaOS/pkg/samba" + "github.com/IceWhaleTech/CasaOS/pkg/utils/encryption" "github.com/IceWhaleTech/CasaOS/pkg/utils/file" "github.com/IceWhaleTech/CasaOS/pkg/utils/loger" "github.com/IceWhaleTech/CasaOS/service" + "github.com/IceWhaleTech/CasaOS/types" "go.uber.org/zap" ) func InitFunction() { go InitNetworkMount() + go InitInfo() } + +func InitInfo() { + mb := model.BaseInfo{} + if file.Exists(config.AppInfo.DBPath + "/baseinfo.conf") { + err := json.Unmarshal(file.ReadFullFile(config.AppInfo.DBPath+"/baseinfo.conf"), &mb) + if err != nil { + loger.Error("baseinfo.conf", zap.String("error", err.Error())) + } + } + if file.Exists("/etc/CHANNEL") { + channel := file.ReadFullFile("/etc/CHANNEL") + mb.Channel = string(channel) + } + mac, err := service.MyService.System().GetMacAddress() + if err != nil { + loger.Error("GetMacAddress", zap.String("error", err.Error())) + } + mb.Hash = encryption.GetMD5ByStr(mac) + mb.Version = types.CURRENTVERSION + os.Remove(config.AppInfo.DBPath + "/baseinfo.conf") + by, err := json.Marshal(mb) + if err != nil { + loger.Error("init info err", zap.Any("err", err)) + return + } + file.WriteToFullPath(by, config.AppInfo.DBPath+"/baseinfo.conf", 0o666) +} + func InitNetworkMount() { time.Sleep(time.Second * 10) connections := service.MyService.Connections().GetConnectionsList() diff --git a/service/docker.go b/service/docker.go index f453c0b..8963dc5 100644 --- a/service/docker.go +++ b/service/docker.go @@ -560,6 +560,7 @@ func (ds *dockerService) DockerContainerCreate(m model.CustomizationPostData, id //container, err := cli.ContainerCreate(context.Background(), info.Config, info.HostConfig, &network.NetworkingConfig{info.NetworkSettings.Networks}, nil, info.Name) hostConfig.Mounts = volumes + hostConfig.Binds = []string{} hostConfig.Privileged = m.Privileged hostConfig.CapAdd = m.CapAdd hostConfig.NetworkMode = container.NetworkMode(m.NetworkModel) diff --git a/service/system.go b/service/system.go index 497a469..c6d0837 100644 --- a/service/system.go +++ b/service/system.go @@ -50,9 +50,18 @@ type SystemService interface { IsServiceRunning(name string) bool GetCPUTemperature() int GetCPUPower() map[string]string + GetMacAddress() (string, error) } type systemService struct{} +func (c *systemService) GetMacAddress() (string, error) { + interfaces, err := net.Interfaces() + if err != nil { + return "", err + } + inter := interfaces[0] + return inter.HardwareAddr, nil +} func (c *systemService) MkdirAll(path string) (int, error) { _, err := os.Stat(path) if err == nil { diff --git a/types/system.go b/types/system.go index 712473b..dbef4f6 100644 --- a/types/system.go +++ b/types/system.go @@ -1,3 +1,13 @@ +/* + * @Author: LinkLeong link@icewhale.org + * @Date: 2022-11-15 15:51:44 + * @LastEditors: LinkLeong + * @LastEditTime: 2022-11-15 15:56:03 + * @FilePath: /CasaOS/types/system.go + * @Description: + * @Website: https://www.casaos.io + * Copyright (c) 2022 by icewhale, All Rights Reserved. + */ /*@Author: LinkLeong link@icewhale.com *@Date: 2022-02-17 18:53:22 *@LastEditors: LinkLeong