2021-11-09 10:57:50 +00:00
|
|
|
|
package route
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"encoding/xml"
|
2022-01-20 10:38:59 +00:00
|
|
|
|
"fmt"
|
2022-06-08 10:19:45 +00:00
|
|
|
|
"path/filepath"
|
2022-04-06 04:10:51 +00:00
|
|
|
|
"runtime"
|
2021-11-09 10:57:50 +00:00
|
|
|
|
"strconv"
|
2022-05-13 10:12:26 +00:00
|
|
|
|
"strings"
|
2021-11-09 10:57:50 +00:00
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"github.com/IceWhaleTech/CasaOS/model"
|
|
|
|
|
"github.com/IceWhaleTech/CasaOS/model/system_app"
|
|
|
|
|
"github.com/IceWhaleTech/CasaOS/pkg/config"
|
2021-12-09 11:02:41 +00:00
|
|
|
|
"github.com/IceWhaleTech/CasaOS/pkg/utils/command"
|
2021-11-09 10:57:50 +00:00
|
|
|
|
"github.com/IceWhaleTech/CasaOS/pkg/utils/env_helper"
|
|
|
|
|
"github.com/IceWhaleTech/CasaOS/pkg/utils/file"
|
|
|
|
|
"github.com/IceWhaleTech/CasaOS/pkg/utils/port"
|
|
|
|
|
"github.com/IceWhaleTech/CasaOS/service"
|
|
|
|
|
model2 "github.com/IceWhaleTech/CasaOS/service/model"
|
|
|
|
|
uuid "github.com/satori/go.uuid"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func InitFunction() {
|
|
|
|
|
go checkSystemApp()
|
2021-12-09 11:02:41 +00:00
|
|
|
|
Update2_3()
|
2021-12-29 08:42:20 +00:00
|
|
|
|
CheckSerialDiskMount()
|
|
|
|
|
|
2022-03-16 07:41:14 +00:00
|
|
|
|
CheckToken2_11()
|
2022-05-05 05:46:55 +00:00
|
|
|
|
ImportApplications()
|
|
|
|
|
ChangeAPIUrl()
|
|
|
|
|
InitSystemApplication()
|
2022-02-17 10:43:25 +00:00
|
|
|
|
|
2021-11-09 10:57:50 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var syncIsExistence = false
|
|
|
|
|
|
|
|
|
|
func installSyncthing(appId string) {
|
|
|
|
|
|
|
|
|
|
var appInfo model.ServerAppList
|
|
|
|
|
m := model.CustomizationPostData{}
|
|
|
|
|
var dockerImage string
|
|
|
|
|
var dockerImageVersion string
|
2022-03-09 08:37:03 +00:00
|
|
|
|
appInfo = service.MyService.Casa().GetServerAppInfo(appId, "system", "us_en")
|
2021-11-09 10:57:50 +00:00
|
|
|
|
dockerImage = appInfo.Image
|
2022-01-20 10:38:59 +00:00
|
|
|
|
dockerImageVersion = appInfo.ImageVersion
|
2021-11-09 10:57:50 +00:00
|
|
|
|
|
|
|
|
|
if len(appInfo.ImageVersion) == 0 {
|
|
|
|
|
dockerImageVersion = "latest"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if appInfo.NetworkModel != "host" {
|
|
|
|
|
for i := 0; i < len(appInfo.Ports); i++ {
|
|
|
|
|
if p, _ := strconv.Atoi(appInfo.Ports[i].ContainerPort); port.IsPortAvailable(p, appInfo.Ports[i].Protocol) {
|
|
|
|
|
appInfo.Ports[i].CommendPort = strconv.Itoa(p)
|
|
|
|
|
} else {
|
|
|
|
|
if appInfo.Ports[i].Protocol == "tcp" {
|
|
|
|
|
if p, err := port.GetAvailablePort("tcp"); err == nil {
|
|
|
|
|
appInfo.Ports[i].CommendPort = strconv.Itoa(p)
|
|
|
|
|
}
|
|
|
|
|
} else if appInfo.Ports[i].Protocol == "upd" {
|
|
|
|
|
if p, err := port.GetAvailablePort("udp"); err == nil {
|
|
|
|
|
appInfo.Ports[i].CommendPort = strconv.Itoa(p)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if appInfo.Ports[i].Type == 0 {
|
|
|
|
|
appInfo.PortMap = appInfo.Ports[i].CommendPort
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for i := 0; i < len(appInfo.Devices); i++ {
|
|
|
|
|
if !file.CheckNotExist(appInfo.Devices[i].ContainerPath) {
|
|
|
|
|
appInfo.Devices[i].Path = appInfo.Devices[i].ContainerPath
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if len(appInfo.Tip) > 0 {
|
|
|
|
|
appInfo.Tip = env_helper.ReplaceStringDefaultENV(appInfo.Tip)
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-08 10:19:45 +00:00
|
|
|
|
appInfo.MaxMemory = service.MyService.System().GetMemInfo().Total >> 20
|
2021-11-09 10:57:50 +00:00
|
|
|
|
|
|
|
|
|
id := uuid.NewV4().String()
|
|
|
|
|
|
|
|
|
|
// step:下载镜像
|
2022-06-08 10:19:45 +00:00
|
|
|
|
err := service.MyService.Docker().DockerPullImage(dockerImage+":"+dockerImageVersion, "", "")
|
2021-11-09 10:57:50 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
//pull image error
|
2022-01-20 10:38:59 +00:00
|
|
|
|
fmt.Println("pull image error", err, dockerImage, dockerImageVersion)
|
2021-11-09 10:57:50 +00:00
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
for !service.MyService.Docker().IsExistImage(dockerImage + ":" + dockerImageVersion) {
|
|
|
|
|
time.Sleep(time.Second)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m.CpuShares = 50
|
|
|
|
|
m.Envs = appInfo.Envs
|
|
|
|
|
m.Memory = int64(appInfo.MaxMemory)
|
|
|
|
|
m.Origin = "system"
|
|
|
|
|
m.PortMap = appInfo.PortMap
|
|
|
|
|
m.Ports = appInfo.Ports
|
2021-12-01 08:25:56 +00:00
|
|
|
|
m.Restart = "always"
|
2021-11-09 10:57:50 +00:00
|
|
|
|
m.Volumes = appInfo.Volumes
|
2022-06-15 11:01:26 +00:00
|
|
|
|
m.NetworkModel = appInfo.NetworkModel
|
2022-05-13 10:12:26 +00:00
|
|
|
|
m.Label = id
|
|
|
|
|
m.CustomId = id
|
2022-06-15 11:01:26 +00:00
|
|
|
|
containerId, err := service.MyService.Docker().DockerContainerCreate(dockerImage+":"+dockerImageVersion, m)
|
2021-11-09 10:57:50 +00:00
|
|
|
|
if err != nil {
|
2022-01-20 10:38:59 +00:00
|
|
|
|
fmt.Println("container create error", err)
|
2021-11-09 10:57:50 +00:00
|
|
|
|
// create container error
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//step:start container
|
2022-05-13 10:12:26 +00:00
|
|
|
|
err = service.MyService.Docker().DockerContainerStart(containerId)
|
2021-11-09 10:57:50 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
//start container error
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
checkSystemApp()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// check if the system application is installed
|
|
|
|
|
func checkSystemApp() {
|
|
|
|
|
list := service.MyService.App().GetSystemAppList()
|
2022-05-13 10:12:26 +00:00
|
|
|
|
for _, v := range list {
|
|
|
|
|
info, err := service.MyService.Docker().DockerContainerInfo(v.ID)
|
|
|
|
|
if err != nil {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
if strings.Contains(info.Config.Image, "linuxserver/syncthing") {
|
2021-12-01 08:25:56 +00:00
|
|
|
|
if v.State != "running" {
|
|
|
|
|
//step:start container
|
2022-05-13 10:12:26 +00:00
|
|
|
|
service.MyService.Docker().DockerContainerStart(v.ID)
|
2021-12-01 08:25:56 +00:00
|
|
|
|
}
|
2021-11-09 10:57:50 +00:00
|
|
|
|
syncIsExistence = true
|
2022-05-13 10:12:26 +00:00
|
|
|
|
if config.SystemConfigInfo.SyncPort != v.Labels["web"] {
|
|
|
|
|
config.SystemConfigInfo.SyncPort = v.Labels["web"]
|
2021-11-09 10:57:50 +00:00
|
|
|
|
}
|
2022-05-13 10:12:26 +00:00
|
|
|
|
|
2021-11-09 10:57:50 +00:00
|
|
|
|
path := ""
|
2022-06-08 10:19:45 +00:00
|
|
|
|
for _, i := range info.Mounts {
|
|
|
|
|
if i.Destination == "/config" {
|
2022-05-13 10:12:26 +00:00
|
|
|
|
path = i.Source
|
2021-11-09 10:57:50 +00:00
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-06-08 10:19:45 +00:00
|
|
|
|
content := file.ReadFullFile(filepath.Join(path, "config.xml"))
|
2021-11-09 10:57:50 +00:00
|
|
|
|
syncConfig := &system_app.SyncConfig{}
|
|
|
|
|
xml.Unmarshal(content, &syncConfig)
|
|
|
|
|
config.SystemConfigInfo.SyncKey = syncConfig.Key
|
2022-05-13 10:12:26 +00:00
|
|
|
|
break
|
2021-11-09 10:57:50 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if !syncIsExistence {
|
2021-12-29 08:42:20 +00:00
|
|
|
|
installSyncthing("74")
|
2021-11-09 10:57:50 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2021-12-09 11:02:41 +00:00
|
|
|
|
func CheckSerialDiskMount() {
|
2021-12-29 08:42:20 +00:00
|
|
|
|
// check mount point
|
|
|
|
|
dbList := service.MyService.Disk().GetSerialAll()
|
|
|
|
|
|
2022-01-28 06:06:27 +00:00
|
|
|
|
list := service.MyService.Disk().LSBLK(true)
|
2021-12-29 08:42:20 +00:00
|
|
|
|
mountPoint := make(map[string]string, len(dbList))
|
2022-01-20 10:38:59 +00:00
|
|
|
|
//remount
|
|
|
|
|
for _, v := range dbList {
|
2022-01-28 06:06:27 +00:00
|
|
|
|
mountPoint[v.UUID] = v.MountPoint
|
2022-01-20 10:38:59 +00:00
|
|
|
|
}
|
2021-12-29 08:42:20 +00:00
|
|
|
|
for _, v := range list {
|
2022-01-20 10:38:59 +00:00
|
|
|
|
command.ExecEnabledSMART(v.Path)
|
2021-12-29 08:42:20 +00:00
|
|
|
|
if v.Children != nil {
|
|
|
|
|
for _, h := range v.Children {
|
2022-01-20 10:38:59 +00:00
|
|
|
|
if len(h.MountPoint) == 0 && len(v.Children) == 1 && h.FsType == "ext4" {
|
2022-01-28 06:06:27 +00:00
|
|
|
|
if m, ok := mountPoint[h.UUID]; ok {
|
2022-01-20 10:38:59 +00:00
|
|
|
|
//mount point check
|
|
|
|
|
volume := m
|
|
|
|
|
if !file.CheckNotExist(m) {
|
|
|
|
|
for i := 0; file.CheckNotExist(volume); i++ {
|
|
|
|
|
volume = m + strconv.Itoa(i+1)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
service.MyService.Disk().MountDisk(h.Path, volume)
|
|
|
|
|
if volume != m {
|
|
|
|
|
ms := model2.SerialDisk{}
|
2022-01-28 06:06:27 +00:00
|
|
|
|
ms.UUID = v.UUID
|
|
|
|
|
ms.MountPoint = volume
|
2022-01-20 10:38:59 +00:00
|
|
|
|
service.MyService.Disk().UpdateMountPoint(ms)
|
|
|
|
|
}
|
2021-12-29 08:42:20 +00:00
|
|
|
|
|
2022-01-20 10:38:59 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-12-29 08:42:20 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2022-01-20 10:38:59 +00:00
|
|
|
|
service.MyService.Disk().RemoveLSBLKCache()
|
|
|
|
|
command.OnlyExec("source " + config.AppInfo.ProjectPath + "/shell/helper.sh ;AutoRemoveUnuseDir")
|
2021-12-09 11:02:41 +00:00
|
|
|
|
}
|
|
|
|
|
func Update2_3() {
|
|
|
|
|
command.OnlyExec("source " + config.AppInfo.ProjectPath + "/shell/assist.sh")
|
2022-04-06 04:10:51 +00:00
|
|
|
|
|
2021-12-09 11:02:41 +00:00
|
|
|
|
}
|
2022-03-16 07:41:14 +00:00
|
|
|
|
func CheckToken2_11() {
|
2022-02-17 10:43:25 +00:00
|
|
|
|
if len(config.ServerInfo.Token) == 0 {
|
|
|
|
|
token := uuid.NewV4().String
|
|
|
|
|
config.ServerInfo.Token = token()
|
|
|
|
|
config.Cfg.Section("server").Key("Token").SetValue(token())
|
|
|
|
|
config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath)
|
|
|
|
|
}
|
2022-03-16 07:41:14 +00:00
|
|
|
|
if len(config.AppInfo.RootPath) == 0 {
|
|
|
|
|
config.Cfg.Section("app").Key("RootPath").SetValue("/casaOS")
|
|
|
|
|
config.AppInfo.RootPath = "/casaOS"
|
|
|
|
|
config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath)
|
|
|
|
|
}
|
2022-03-18 03:13:07 +00:00
|
|
|
|
// if len(config.ServerInfo.Handshake) == 0 {
|
|
|
|
|
// config.Cfg.Section("app").Key("RootPath").SetValue("/casaOS")
|
|
|
|
|
// config.AppInfo.RootPath = "/casaOS"
|
|
|
|
|
// config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath)
|
|
|
|
|
// }
|
2022-04-06 04:10:51 +00:00
|
|
|
|
sysType := runtime.GOOS
|
|
|
|
|
if len(config.FileSettingInfo.DownloadDir) == 0 {
|
|
|
|
|
downloadPath := "/DATA/Downloads"
|
|
|
|
|
if sysType == "windows" {
|
|
|
|
|
downloadPath = "C:\\CasaOS\\DATA\\Downloads"
|
|
|
|
|
}
|
|
|
|
|
if sysType == "darwin" {
|
2022-05-05 05:46:55 +00:00
|
|
|
|
downloadPath = "./CasaOS/DATA/Downloads"
|
2022-04-06 04:10:51 +00:00
|
|
|
|
}
|
|
|
|
|
config.Cfg.Section("file").Key("DownloadDir").SetValue(downloadPath)
|
|
|
|
|
config.FileSettingInfo.DownloadDir = downloadPath
|
|
|
|
|
file.IsNotExistMkDir(config.FileSettingInfo.DownloadDir)
|
2022-03-18 03:13:07 +00:00
|
|
|
|
config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath)
|
|
|
|
|
}
|
|
|
|
|
|
2022-04-06 04:10:51 +00:00
|
|
|
|
if len(config.UserInfo.Description) == 0 {
|
|
|
|
|
config.Cfg.Section("user").Key("Description").SetValue("nothing")
|
|
|
|
|
config.UserInfo.Description = "nothing"
|
2022-03-18 03:13:07 +00:00
|
|
|
|
config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath)
|
|
|
|
|
}
|
2022-04-06 04:10:51 +00:00
|
|
|
|
if len(config.ServerInfo.Handshake) == 0 {
|
|
|
|
|
config.Cfg.Section("server").Key("Handshake").SetValue("socket.casaos.io")
|
|
|
|
|
config.ServerInfo.Handshake = "socket.casaos.io"
|
|
|
|
|
config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath)
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-13 10:12:26 +00:00
|
|
|
|
if service.MyService.ZiMa().GetSysInfo().KernelArch == "aarch64" && config.ServerInfo.USBAutoMount != "True" && strings.Contains(service.MyService.ZiMa().GetDeviceTree(), "Raspberry Pi") {
|
|
|
|
|
service.MyService.System().UpdateUSBAutoMount("False")
|
|
|
|
|
service.MyService.System().ExecUSBAutoMountShell("False")
|
|
|
|
|
}
|
2022-03-18 03:13:07 +00:00
|
|
|
|
|
2022-03-16 07:41:14 +00:00
|
|
|
|
// str := []string{}
|
|
|
|
|
// str = append(str, "ddd")
|
|
|
|
|
// str = append(str, "aaa")
|
|
|
|
|
// ddd := strings.Join(str, "|")
|
|
|
|
|
// config.Cfg.Section("file").Key("ShareDir").SetValue(ddd)
|
|
|
|
|
|
|
|
|
|
// config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath)
|
|
|
|
|
|
2022-02-17 10:43:25 +00:00
|
|
|
|
}
|
2022-05-05 05:46:55 +00:00
|
|
|
|
|
|
|
|
|
func ImportApplications() {
|
|
|
|
|
service.MyService.App().ImportApplications(true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 0.3.1
|
|
|
|
|
func ChangeAPIUrl() {
|
2022-05-13 10:12:26 +00:00
|
|
|
|
|
|
|
|
|
newAPIUrl := "https://api.casaos.io/casaos-api"
|
|
|
|
|
if config.ServerInfo.ServerApi == "https://api.casaos.zimaboard.com" {
|
|
|
|
|
config.ServerInfo.ServerApi = newAPIUrl
|
|
|
|
|
config.Cfg.Section("server").Key("ServerApi").SetValue(newAPIUrl)
|
|
|
|
|
config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath)
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-05 05:46:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 0.3.1
|
|
|
|
|
func InitSystemApplication() {
|
|
|
|
|
list := service.MyService.App().GetApplicationList()
|
|
|
|
|
if len(list) != 2 {
|
|
|
|
|
application := model2.ApplicationModel{}
|
|
|
|
|
application.Name = "Files"
|
2022-05-13 10:12:26 +00:00
|
|
|
|
application.Icon = "/ui/img/Files.svg"
|
2022-05-05 05:46:55 +00:00
|
|
|
|
application.Type = "system"
|
2022-05-13 10:12:26 +00:00
|
|
|
|
application.Order = 0
|
2022-05-05 05:46:55 +00:00
|
|
|
|
service.MyService.App().CreateApplication(application)
|
|
|
|
|
|
|
|
|
|
application.Name = "CasaConnect"
|
2022-05-13 10:12:26 +00:00
|
|
|
|
application.Icon = "/ui/img/CasaConnect.svg"
|
2022-05-05 05:46:55 +00:00
|
|
|
|
application.Type = "system"
|
2022-05-13 10:12:26 +00:00
|
|
|
|
application.Order = 0
|
2022-05-05 05:46:55 +00:00
|
|
|
|
|
|
|
|
|
service.MyService.App().CreateApplication(application)
|
|
|
|
|
}
|
|
|
|
|
}
|