0.3.4 Function development completed

This commit is contained in:
a624669980@163.com 2022-07-18 18:46:44 +08:00
parent c9fa963c34
commit ce181f181a
85 changed files with 4150 additions and 4716 deletions

View File

@ -22,17 +22,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added ### Added
- SSH adds port-side options and prompts for connection status. ((#286)[https://github.com/IceWhaleTech/CasaOS/issues/286])
### Changed ### Changed
- Normalize all routes
- Application names now support spaces ((#211)[https://github.com/IceWhaleTech/CasaOS/issues/211])
### Removed ### Removed
- Removed connect - Removed casaos connect
### Security ### Security
- Adjustment of authentication method
### Fixed ### Fixed
- Fixed storage format and remove password error issues ((#344)[https://github.com/IceWhaleTech/CasaOS/issues/344] (#357)[https://github.com/IceWhaleTech/CasaOS/issues/357])
## [0.3.3-alpha] - 2022-07-01(UTC) ## [0.3.3-alpha] - 2022-07-01(UTC)
### Added ### Added

2
UI

@ -1 +1 @@
Subproject commit 7af1bf549dd35c93f48b6c501204a4efe57e8d6b Subproject commit bca27426e1f398c31fb6c5c23885482326514f6e

View File

@ -21,11 +21,4 @@ Handshake = socket.casaos.io
Token = Token =
USBAutoMount = USBAutoMount =
[system] [system]
WidgetList =
[file]
ShareDir =
DownloadDir =

View File

@ -63,7 +63,6 @@ func init() {
func main() { func main() {
service.NotifyMsg = make(chan notify.Message, 10) service.NotifyMsg = make(chan notify.Message, 10)
if *resetUser { if *resetUser {
if user == nil || len(*user) == 0 { if user == nil || len(*user) == 0 {
fmt.Println("user is empty") fmt.Println("user is empty")
return return

View File

@ -2,7 +2,7 @@
* @Author: LinkLeong link@icewhale.com * @Author: LinkLeong link@icewhale.com
* @Date: 2021-10-08 10:29:08 * @Date: 2021-10-08 10:29:08
* @LastEditors: LinkLeong * @LastEditors: LinkLeong
* @LastEditTime: 2022-06-21 15:10:03 * @LastEditTime: 2022-07-13 11:26:12
* @FilePath: /CasaOS/middleware/gin.go * @FilePath: /CasaOS/middleware/gin.go
* @Description: * @Description:
* @Website: https://www.casaos.io * @Website: https://www.casaos.io
@ -26,14 +26,14 @@ func Cors() gin.HandlerFunc {
c.Header("Access-Control-Allow-Origin", "*") c.Header("Access-Control-Allow-Origin", "*")
c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE") c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE")
//允许跨域设置可以返回其他子段,可以自定义字段 //允许跨域设置可以返回其他子段,可以自定义字段
c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session,Language") c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session,Language,Content-Type,Access-Control-Allow-Origin,Access-Control-Allow-Headers,Access-Control-Allow-Methods,Connection,Host,Origin,Referer,User-Agent,X-Requested-With")
// 允许浏览器(客户端)可以解析的头部 (重要) // 允许浏览器(客户端)可以解析的头部 (重要)
c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers") c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers")
//c.Writer.Header().Set("Access-Control-Allow-Headers", "Accept, Authorization, Content-Type, Content-Length, X-CSRF-Token, Token, session, Origin, Host, Connection, Accept-Encoding, Accept-Language, X-Requested-With") //c.Writer.Header().Set("Access-Control-Allow-Headers", "Accept, Authorization, Content-Type, Content-Length, X-CSRF-Token, Token, session, Origin, Host, Connection, Accept-Encoding, Accept-Language, X-Requested-With")
//设置缓存时间 //设置缓存时间
c.Header("Access-Control-Max-Age", "172800") c.Header("Access-Control-Max-Age", "172800")
c.Header("Access-Control-Allow-Credentials", "true") c.Header("Access-Control-Allow-Credentials", "true")
c.Set("content-type", "application/json") c.Set("Content-Type", "application/json")
//} //}
//允许类型校验 //允许类型校验

View File

@ -2,10 +2,9 @@
* @Author: link a624669980@163.com * @Author: link a624669980@163.com
* @Date: 2022-05-16 17:37:08 * @Date: 2022-05-16 17:37:08
* @LastEditors: LinkLeong * @LastEditors: LinkLeong
* @LastEditTime: 2022-06-22 17:45:53 * @LastEditTime: 2022-07-13 10:46:38
* @FilePath: /CasaOS/model/category.go * @FilePath: /CasaOS/model/category.go
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description:
*/ */
package model package model

View File

@ -1,3 +1,13 @@
/*
* @Author: LinkLeong link@icewhale.com
* @Date: 2022-07-13 10:43:45
* @LastEditors: LinkLeong
* @LastEditTime: 2022-07-13 11:00:04
* @FilePath: /CasaOS/model/disk.go
* @Description:
* @Website: https://www.casaos.io
* Copyright (c) 2022 by icewhale, All Rights Reserved.
*/
package model package model
type LSBLKModel struct { type LSBLKModel struct {
@ -53,8 +63,8 @@ type DriveUSB struct {
Size uint64 `json:"size"` Size uint64 `json:"size"`
Used uint64 `json:"use"` Used uint64 `json:"use"`
Model string `json:"model"` Model string `json:"model"`
Mount bool `json:"mount"` //是否完全挂载 Mount bool `json:"mount"`
Avail uint64 `json:"avail"` //可用空间 Avail uint64 `json:"avail"`
} }
type Storage struct { type Storage struct {

View File

@ -2,7 +2,7 @@
* @Author: LinkLeong link@icewhale.com * @Author: LinkLeong link@icewhale.com
* @Date: 2021-12-08 18:10:25 * @Date: 2021-12-08 18:10:25
* @LastEditors: LinkLeong * @LastEditors: LinkLeong
* @LastEditTime: 2022-06-14 17:20:36 * @LastEditTime: 2022-07-13 10:49:16
* @FilePath: /CasaOS/model/docker.go * @FilePath: /CasaOS/model/docker.go
* @Description: * @Description:
* @Website: https://www.casaos.io * @Website: https://www.casaos.io
@ -14,5 +14,5 @@ type DockerStatsModel struct {
Icon string `json:"icon"` Icon string `json:"icon"`
Title string `json:"title"` Title string `json:"title"`
Data interface{} `json:"data"` Data interface{} `json:"data"`
Pre interface{} `json:"pre"` // @tiger - pre 不知道什么意思,可以提高一下描述性 Previous interface{} `json:"previous"`
} }

View File

@ -104,7 +104,7 @@ func (p *PathArray) Scan(input interface{}) error {
//} //}
type CustomizationPostData struct { type CustomizationPostData struct {
Name string `json:"name"` ContainerName string `json:"container_name"`
CustomId string `json:"custom_id"` CustomId string `json:"custom_id"`
Origin string `json:"origin"` Origin string `json:"origin"`
NetworkModel string `json:"network_model"` NetworkModel string `json:"network_model"`

19
model/notify/storage.go Normal file
View File

@ -0,0 +1,19 @@
/*
* @Author: LinkLeong link@icewhale.com
* @Date: 2022-07-15 10:43:00
* @LastEditors: LinkLeong
* @LastEditTime: 2022-07-15 10:56:17
* @FilePath: /CasaOS/model/notify/storage.go
* @Description:
* @Website: https://www.casaos.io
* Copyright (c) 2022 by icewhale, All Rights Reserved.
*/
package notify
type StorageMessage struct {
Type string `json:"type"` //sata,usb
Action string `json:"action"` //remove add
Path string `json:"path"`
Volume string `json:"volume"`
Size uint64 `json:"size"`
}

View File

@ -2,7 +2,7 @@
* @Author: LinkLeong link@icewhale.com * @Author: LinkLeong link@icewhale.com
* @Date: 2022-05-13 18:15:46 * @Date: 2022-05-13 18:15:46
* @LastEditors: LinkLeong * @LastEditors: LinkLeong
* @LastEditTime: 2022-07-04 14:39:23 * @LastEditTime: 2022-07-14 11:02:06
* @FilePath: /CasaOS/model/sys_common.go * @FilePath: /CasaOS/model/sys_common.go
* @Description: * @Description:
* @Website: https://www.casaos.io * @Website: https://www.casaos.io
@ -37,7 +37,6 @@ type ServerModel struct {
RunMode string RunMode string
ServerApi string ServerApi string
LockAccount bool LockAccount bool
Handshake string
Token string Token string
USBAutoMount string USBAutoMount string
SocketPort string SocketPort string
@ -75,12 +74,7 @@ type RedisModel struct {
} }
type SystemConfig struct { type SystemConfig struct {
ConfigStr string `json:"config_str"`
WidgetList string `json:"widget_list"`
ConfigPath string `json:"config_path"` ConfigPath string `json:"config_path"`
SyncPort string `json:"sync_port"`
SyncKey string `json:"sync_key"`
Analyse string `json:"analyse"`
} }
type CasaOSGlobalVariables struct { type CasaOSGlobalVariables struct {

View File

@ -2,7 +2,7 @@
* @Author: LinkLeong link@icewhale.com * @Author: LinkLeong link@icewhale.com
* @Date: 2022-05-13 18:15:46 * @Date: 2022-05-13 18:15:46
* @LastEditors: LinkLeong * @LastEditors: LinkLeong
* @LastEditTime: 2022-06-21 16:01:26 * @LastEditTime: 2022-07-14 10:58:45
* @FilePath: /CasaOS/pkg/config/init.go * @FilePath: /CasaOS/pkg/config/init.go
* @Description: * @Description:
* @Website: https://www.casaos.io * @Website: https://www.casaos.io

View File

@ -6,7 +6,6 @@ import (
"fmt" "fmt"
"io" "io"
"regexp" "regexp"
"strconv"
"sync" "sync"
"time" "time"
@ -32,7 +31,7 @@ func NewSshClient(user, password string, port string) (*ssh.Client, error) {
//} else { //} else {
// config.Auth = []ssh.AuthMethod{publicKeyAuthFunc(h.Key)} // config.Auth = []ssh.AuthMethod{publicKeyAuthFunc(h.Key)}
//} //}
addr := fmt.Sprintf("%s:%d", "127.0.0.1", port) addr := fmt.Sprintf("%s:%s", "127.0.0.1", port)
c, err := ssh.Dial("tcp", addr, config) c, err := ssh.Dial("tcp", addr, config)
if err != nil { if err != nil {
return nil, err return nil, err
@ -396,7 +395,7 @@ func WsReaderCopy(reader *websocket.Conn, writer io.Writer) {
if err = json2.Unmarshal(p, &msgObj); err != nil { if err = json2.Unmarshal(p, &msgObj); err != nil {
writer.Write(p) writer.Write(p)
} else if msgObj.Type == wsMsgResize { } else if msgObj.Type == wsMsgResize {
writer.Write([]byte("stty rows " + strconv.Itoa(msgObj.Rows) + " && stty cols " + strconv.Itoa(msgObj.Cols) + " \r")) //writer.Write([]byte("stty rows " + strconv.Itoa(msgObj.Rows) + " && stty cols " + strconv.Itoa(msgObj.Cols) + " \r"))
} }
} }
} }

View File

@ -2,10 +2,11 @@ package common_err
const ( const (
SUCCESS = 200 SUCCESS = 200
ERROR = 500 SERVICE_ERROR = 500
INVALID_PARAMS = 400 CLIENT_ERROR = 400
ERROR_AUTH_TOKEN = 401 ERROR_AUTH_TOKEN = 401
INVALID_PARAMS = 4000
//user //user
PWD_INVALID = 10001 PWD_INVALID = 10001
PWD_IS_EMPTY = 10002 PWD_IS_EMPTY = 10002
@ -53,7 +54,8 @@ const (
var MsgFlags = map[int]string{ var MsgFlags = map[int]string{
SUCCESS: "ok", SUCCESS: "ok",
ERROR: "fail", SERVICE_ERROR: "Fail",
CLIENT_ERROR: "Fail",
INVALID_PARAMS: "Parameters Error", INVALID_PARAMS: "Parameters Error",
ERROR_AUTH_TOKEN: "Error auth token", ERROR_AUTH_TOKEN: "Error auth token",
@ -109,5 +111,5 @@ func GetMsg(code int) string {
if ok { if ok {
return msg return msg
} }
return MsgFlags[ERROR] return MsgFlags[SERVICE_ERROR]
} }

View File

@ -2,7 +2,7 @@
* @Author: LinkLeong link@icewhale.com * @Author: LinkLeong link@icewhale.com
* @Date: 2021-09-30 18:18:14 * @Date: 2021-09-30 18:18:14
* @LastEditors: LinkLeong * @LastEditors: LinkLeong
* @LastEditTime: 2022-07-11 17:41:22 * @LastEditTime: 2022-07-18 17:30:38
* @FilePath: /CasaOS/pkg/utils/jwt/jwt.go * @FilePath: /CasaOS/pkg/utils/jwt/jwt.go
* @Description: * @Description:
* @Website: https://www.casaos.io * @Website: https://www.casaos.io
@ -46,13 +46,17 @@ func GenerateToken(username, password string, id int, issuer string, t time.Dura
} }
//解析token //解析token
func ParseToken(token string) (*Claims, error) { func ParseToken(token string, valid bool) (*Claims, error) {
tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) { tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) {
return jwtSecret, nil return jwtSecret, nil
}) })
if tokenClaims != nil { if tokenClaims != nil {
if clims, ok := tokenClaims.Claims.(*Claims); ok && tokenClaims.Valid { if clims, ok := tokenClaims.Claims.(*Claims); ok {
if valid && tokenClaims.Valid {
return clims, nil return clims, nil
} else if !valid {
return clims, nil
}
} }
} }
return nil, err return nil, err

View File

@ -2,7 +2,7 @@
* @Author: LinkLeong link@icewhale.com * @Author: LinkLeong link@icewhale.com
* @Date: 2022-06-17 14:01:25 * @Date: 2022-06-17 14:01:25
* @LastEditors: LinkLeong * @LastEditors: LinkLeong
* @LastEditTime: 2022-07-11 18:21:40 * @LastEditTime: 2022-07-18 17:31:15
* @FilePath: /CasaOS/pkg/utils/jwt/jwt_helper.go * @FilePath: /CasaOS/pkg/utils/jwt/jwt_helper.go
* @Description: * @Description:
* @Website: https://www.casaos.io * @Website: https://www.casaos.io
@ -33,10 +33,13 @@ func JWT() gin.HandlerFunc {
code = common_err.INVALID_PARAMS code = common_err.INVALID_PARAMS
} }
claims, err := ParseToken(token) claims, err := ParseToken(token, false)
//_, err := ParseToken(token) //_, err := ParseToken(token)
if err != nil { if err != nil {
code = common_err.ERROR_AUTH_TOKEN code = common_err.ERROR_AUTH_TOKEN
} else if (c.Request.URL.Path == "/v1/file" || c.Request.URL.Path == "/v1/image" || c.Request.URL.Path == "/v1/file/upload" || c.Request.URL.Path == "/v1/batch") && claims.VerifyIssuer("casaos", true) {
//Special treatment
} else if !claims.VerifyExpiresAt(time.Now(), true) || !claims.VerifyIssuer("casaos", true) { } else if !claims.VerifyExpiresAt(time.Now(), true) || !claims.VerifyIssuer("casaos", true) {
code = common_err.ERROR_AUTH_TOKEN code = common_err.ERROR_AUTH_TOKEN
} }

View File

@ -2,7 +2,6 @@ package route
import ( import (
"os" "os"
"runtime"
"strconv" "strconv"
"strings" "strings"
@ -82,31 +81,11 @@ func CheckToken2_11() {
config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath) config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath)
} }
sysType := runtime.GOOS
if len(config.FileSettingInfo.DownloadDir) == 0 {
downloadPath := "/DATA/Downloads"
if sysType == "windows" {
downloadPath = "C:\\CasaOS\\DATA\\Downloads"
}
if sysType == "darwin" {
downloadPath = "./CasaOS/DATA/Downloads"
}
config.Cfg.Section("file").Key("DownloadDir").SetValue(downloadPath)
config.FileSettingInfo.DownloadDir = downloadPath
file.IsNotExistMkDir(config.FileSettingInfo.DownloadDir)
config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath)
}
if len(config.UserInfo.Description) == 0 { if len(config.UserInfo.Description) == 0 {
config.Cfg.Section("user").Key("Description").SetValue("nothing") config.Cfg.Section("user").Key("Description").SetValue("nothing")
config.UserInfo.Description = "nothing" config.UserInfo.Description = "nothing"
config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath) config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath)
} }
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)
}
if service.MyService.System().GetSysInfo().KernelArch == "aarch64" && config.ServerInfo.USBAutoMount != "True" && strings.Contains(service.MyService.System().GetDeviceTree(), "Raspberry Pi") { if service.MyService.System().GetSysInfo().KernelArch == "aarch64" && config.ServerInfo.USBAutoMount != "True" && strings.Contains(service.MyService.System().GetDeviceTree(), "Raspberry Pi") {
service.MyService.System().UpdateUSBAutoMount("False") service.MyService.System().UpdateUSBAutoMount("False")

View File

@ -1,5 +1,3 @@
// 这是一个用来反馈 API 设计的 PR不要 merge
package route package route
import ( import (
@ -34,14 +32,14 @@ func InitRouter() *gin.Engine {
// c.Redirect(http.StatusMovedPermanently, "ui/") // c.Redirect(http.StatusMovedPermanently, "ui/")
//}) //})
r.POST("/v1/user/register", v1.PostUserRegister) r.POST("/v1/users/register", v1.PostUserRegister)
r.POST("/v1/user/login", v1.PostUserLogin) r.POST("/v1/users/login", v1.PostUserLogin)
r.GET("/v1/users/name", v1.GetUserAllUsername) //all/name r.GET("/v1/users/name", v1.GetUserAllUsername) //all/name
r.POST("/v1/user/refresh", v1.PostUserRefreshToken) r.POST("/v1/user/refresh", v1.PostUserRefreshToken)
// No short-term modifications // No short-term modifications
r.GET("/v1/user/image", v1.GetUserImage) r.GET("/v1/users/image", v1.GetUserImage)
r.GET("/v1/user/status", v1.GetUserStatus) //init/check r.GET("/v1/users/status", v1.GetUserStatus) //init/check
//r.GET("/v1/guide/check", v1.GetGuideCheck) // /v1/sys/guide_check //r.GET("/v1/guide/check", v1.GetGuideCheck) // /v1/sys/guide_check
r.GET("/v1/sys/debug", v1.GetSystemConfigDebug) // //debug r.GET("/v1/sys/debug", v1.GetSystemConfigDebug) // //debug
@ -51,41 +49,33 @@ func InitRouter() *gin.Engine {
v1Group.Use(jwt2.JWT()) v1Group.Use(jwt2.JWT())
{ {
v1UserGroup := v1Group.Group("/user")
v1UserGroup.Use()
{
v1UserGroup.GET("/current", v1.GetUserInfo)
v1UserGroup.PUT("/current", v1.PutUserInfo)
v1UserGroup.GET("/current/custom/:key", v1.GetUserCustomConf)
v1UserGroup.POST("/current/custom/:key", v1.PostUserCustomConf)
v1UserGroup.DELETE("/current/custom/:key", v1.DeleteUserCustomConf)
v1UserGroup.POST("/current/image/:key", v1.PostUserUploadImage)
//v1UserGroup.POST("/file/image/:key", v1.PostUserFileImage)
v1UserGroup.DELETE("/current/image", v1.DeleteUserImage)
//v1UserGroup.PUT("/avatar", v1.PutUserAvatar)
//v1UserGroup.GET("/avatar", v1.GetUserAvatar)
v1UserGroup.DELETE("/:id", v1.DeleteUser)
v1UserGroup.GET("/:username", v1.GetUserInfoByUsername)
}
v1UsersGroup := v1Group.Group("/users") v1UsersGroup := v1Group.Group("/users")
v1UsersGroup.Use() v1UsersGroup.Use()
{ {
v1UsersGroup.GET("/current", v1.GetUserInfo)
v1UsersGroup.PUT("/current", v1.PutUserInfo)
v1UsersGroup.PUT("/current/password", v1.PutUserPassword)
v1UsersGroup.GET("/current/custom/:key", v1.GetUserCustomConf)
v1UsersGroup.POST("/current/custom/:key", v1.PostUserCustomConf)
v1UsersGroup.DELETE("/current/custom/:key", v1.DeleteUserCustomConf)
v1UsersGroup.POST("/current/image/:key", v1.PostUserUploadImage)
//v1UserGroup.POST("/file/image/:key", v1.PostUserFileImage)
v1UsersGroup.DELETE("/current/image", v1.DeleteUserImage)
//v1UserGroup.PUT("/avatar", v1.PutUserAvatar)
//v1UserGroup.GET("/avatar", v1.GetUserAvatar)
v1UsersGroup.DELETE("/:id", v1.DeleteUser)
v1UsersGroup.GET("/:username", v1.GetUserInfoByUsername)
v1UsersGroup.DELETE("", v1.DeleteUserAll) v1UsersGroup.DELETE("", v1.DeleteUserAll)
} }
v1AppGroup := v1Group.Group("/app")
v1AppGroup.Use()
{
v1AppGroup.GET("/:id", v1.AppInfo)
}
v1AppsGroup := v1Group.Group("/apps") v1AppsGroup := v1Group.Group("/apps")
v1AppsGroup.Use() v1AppsGroup.Use()
{ {
v1AppsGroup.GET("", v1.AppList) //list v1AppsGroup.GET("", v1.AppList) //list
v1AppsGroup.GET("/:id", v1.AppInfo)
} }
v1ContainerGroup := v1Group.Group("/container") v1ContainerGroup := v1Group.Group("/container")
v1ContainerGroup.Use() v1ContainerGroup.Use()
@ -127,6 +117,7 @@ func InitRouter() *gin.Engine {
v1SysGroup.GET("/hardware", v1.GetSystemHardwareInfo) //hardware/info v1SysGroup.GET("/hardware", v1.GetSystemHardwareInfo) //hardware/info
v1SysGroup.GET("/wsssh", v1.WsSsh) v1SysGroup.GET("/wsssh", v1.WsSsh)
v1SysGroup.POST("/ssh-login", v1.PostSshLogin)
//v1SysGroup.GET("/config", v1.GetSystemConfig) //delete //v1SysGroup.GET("/config", v1.GetSystemConfig) //delete
//v1SysGroup.POST("/config", v1.PostSetSystemConfig) //v1SysGroup.POST("/config", v1.PostSetSystemConfig)
v1SysGroup.GET("/logs", v1.GetCasaOSErrorLogs) //error/logs v1SysGroup.GET("/logs", v1.GetCasaOSErrorLogs) //error/logs
@ -134,15 +125,19 @@ func InitRouter() *gin.Engine {
//v1SysGroup.POST("/widget/config", v1.PostSetWidgetConfig)//delete //v1SysGroup.POST("/widget/config", v1.PostSetWidgetConfig)//delete
v1SysGroup.POST("/stop", v1.PostKillCasaOS) v1SysGroup.POST("/stop", v1.PostKillCasaOS)
v1SysGroup.GET("/utilization", v1.GetSystemUtilization)
v1SysGroup.GET("/cpu", v1.GetSystemCupInfo) v1SysGroup.GET("/utilization", v1.GetSystemUtilization)
v1SysGroup.GET("/mem", v1.GetSystemMemInfo) // v1SysGroup.GET("/cpu", v1.GetSystemCupInfo)
v1SysGroup.GET("/disk", v1.GetSystemDiskInfo) // v1SysGroup.GET("/mem", v1.GetSystemMemInfo)
v1SysGroup.GET("/network", v1.GetSystemNetInfo) // v1SysGroup.GET("/disk", v1.GetSystemDiskInfo)
// v1SysGroup.GET("/network", v1.GetSystemNetInfo)
v1SysGroup.PUT("/usb-auto-mount", v1.PutSystemUSBAutoMount) ///sys/usb/:status v1SysGroup.PUT("/usb-auto-mount", v1.PutSystemUSBAutoMount) ///sys/usb/:status
v1SysGroup.GET("/usb-auto-mount", v1.GetSystemUSBAutoMount) ///sys/usb/status v1SysGroup.GET("/usb-auto-mount", v1.GetSystemUSBAutoMount) ///sys/usb/status
v1SysGroup.GET("/server-info", nil)
v1SysGroup.PUT("/server-info", nil)
v1SysGroup.GET("/apps-state", v1.GetSystemAppsStatus)
v1SysGroup.GET("/port", v1.GetCasaOSPort) v1SysGroup.GET("/port", v1.GetCasaOSPort)
v1SysGroup.PUT("/port", v1.PutCasaOSPort) v1SysGroup.PUT("/port", v1.PutCasaOSPort)
} }
@ -156,9 +151,9 @@ func InitRouter() *gin.Engine {
v1FileGroup := v1Group.Group("/file") v1FileGroup := v1Group.Group("/file")
v1FileGroup.Use() v1FileGroup.Use()
{ {
v1FileGroup.GET("/", v1.GetDownloadSingleFile) //download/:path v1FileGroup.GET("", v1.GetDownloadSingleFile) //download/:path
v1FileGroup.POST("/", v1.PostCreateFile) v1FileGroup.POST("", v1.PostCreateFile)
v1FileGroup.PUT("/", v1.PutFileContent) v1FileGroup.PUT("", v1.PutFileContent)
v1FileGroup.PUT("/name", v1.RenamePath) v1FileGroup.PUT("/name", v1.RenamePath)
//file/rename //file/rename
v1FileGroup.GET("/content", v1.GetFilerContent) //file/read v1FileGroup.GET("/content", v1.GetFilerContent) //file/read
@ -172,32 +167,32 @@ func InitRouter() *gin.Engine {
v1FolderGroup.Use() v1FolderGroup.Use()
{ {
v1FolderGroup.PUT("/name", v1.RenamePath) v1FolderGroup.PUT("/name", v1.RenamePath)
v1FolderGroup.GET("/", v1.DirPath) ///file/dirpath v1FolderGroup.GET("", v1.DirPath) ///file/dirpath
v1FolderGroup.POST("/", v1.MkdirAll) ///file/mkdir v1FolderGroup.POST("", v1.MkdirAll) ///file/mkdir
} }
v1BatchGroup := v1Group.Group("/batch") v1BatchGroup := v1Group.Group("/batch")
v1BatchGroup.Use() v1BatchGroup.Use()
{ {
v1BatchGroup.DELETE("/", v1.DeleteFile) //file/delete v1BatchGroup.DELETE("", v1.DeleteFile) //file/delete
v1BatchGroup.DELETE("/:id/task", v1.DeleteOperateFileOrDir) v1BatchGroup.DELETE("/:id/task", v1.DeleteOperateFileOrDir)
v1BatchGroup.POST("/task", v1.PostOperateFileOrDir) //file/operate v1BatchGroup.POST("/task", v1.PostOperateFileOrDir) //file/operate
v1BatchGroup.GET("/", v1.GetDownloadFile) v1BatchGroup.GET("", v1.GetDownloadFile)
} }
v1ImageGroup := v1Group.Group("/image") v1ImageGroup := v1Group.Group("/image")
v1ImageGroup.Use() v1ImageGroup.Use()
{ {
v1ImageGroup.GET("/", v1.GetFileImage) v1ImageGroup.GET("", v1.GetFileImage)
} }
v1DiskGroup := v1Group.Group("/disk") v1DisksGroup := v1Group.Group("/disks")
v1DiskGroup.Use() v1DisksGroup.Use()
{ {
//v1DiskGroup.GET("/check", v1.GetDiskCheck) //delete //v1DiskGroup.GET("/check", v1.GetDiskCheck) //delete
v1DiskGroup.GET("/", v1.GetDiskInfo) //v1DisksGroup.GET("", v1.GetDiskInfo)
v1DiskGroup.POST("/", v1.PostMountDisk)
//v1DisksGroup.POST("", v1.PostMountDisk)
v1DisksGroup.GET("", v1.GetDiskList)
// //format storage // //format storage
// v1DiskGroup.POST("/format", v1.PostDiskFormat) // v1DiskGroup.POST("/format", v1.PostDiskFormat)
@ -209,24 +204,18 @@ func InitRouter() *gin.Engine {
//v1DiskGroup.GET("/type", v1.FormatDiskType)//delete //v1DiskGroup.GET("/type", v1.FormatDiskType)//delete
v1DiskGroup.DELETE("/part", v1.RemovePartition) //disk/delpart v1DisksGroup.DELETE("/part", v1.RemovePartition) //disk/delpart
} }
v1StorageGroup := v1Group.Group("/storage") v1StorageGroup := v1Group.Group("/storage")
v1StorageGroup.Use() v1StorageGroup.Use()
{ {
v1StorageGroup.POST("/", v1.PostDiskAddPartition) v1StorageGroup.POST("", v1.PostDiskAddPartition)
//v1StorageGroup.GET("/", v1.GetStorageList)
}
v1DisksGroup := v1Group.Group("/disks") v1StorageGroup.PUT("", v1.PostDiskFormat)
v1DisksGroup.Use()
{
//v1UsbGroup.GET("/", v1.GetUSBList)
v1DisksGroup.GET("/", v1.GetDiskList)
}
v1Group.GET("/sync/config", v1.GetSyncConfig) v1StorageGroup.DELETE("", v1.PostDiskUmount)
}
} }
return r return r
} }

View File

@ -3,7 +3,6 @@ package v1
import ( import (
"encoding/json" "encoding/json"
"io/ioutil" "io/ioutil"
"net/http"
"strconv" "strconv"
"github.com/IceWhaleTech/CasaOS/model" "github.com/IceWhaleTech/CasaOS/model"
@ -37,10 +36,14 @@ func AppList(c *gin.Context) {
categoryId := c.DefaultQuery("category_id", "0") categoryId := c.DefaultQuery("category_id", "0")
key := c.DefaultQuery("key", "") key := c.DefaultQuery("key", "")
if len(index) == 0 || len(size) == 0 || len(t) == 0 || len(categoryId) == 0 { if len(index) == 0 || len(size) == 0 || len(t) == 0 || len(categoryId) == 0 {
c.JSON(http.StatusOK, &model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, &model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return
}
collection, err := service.MyService.Casa().GetServerList(index, size, t, categoryId, key)
if err != nil {
c.JSON(common_err.SERVICE_ERROR, &model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
return return
} }
collection := service.MyService.Casa().GetServerList(index, size, t, categoryId, key)
// for i := 0; i < len(recommend); i++ { // for i := 0; i < len(recommend); i++ {
// ct, _ := service.MyService.Docker().DockerListByImage(recommend[i].Image, recommend[i].ImageVersion) // ct, _ := service.MyService.Docker().DockerListByImage(recommend[i].Image, recommend[i].ImageVersion)
// if ct != nil { // if ct != nil {
@ -64,7 +67,7 @@ func AppList(c *gin.Context) {
data["list"] = collection.List data["list"] = collection.List
data["community"] = collection.Community data["community"] = collection.Community
c.JSON(http.StatusOK, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data}) c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
} }
// @Summary 获取一个可用端口 // @Summary 获取一个可用端口
@ -84,7 +87,7 @@ func GetPort(c *gin.Context) {
ok = !port2.IsPortAvailable(p, t) ok = !port2.IsPortAvailable(p, t)
} }
// @tiger 这里最好封装成 {'port': ...} 的形式,来体现出参的上下文 // @tiger 这里最好封装成 {'port': ...} 的形式,来体现出参的上下文
c.JSON(http.StatusOK, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: p}) c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: p})
} }
// @Summary 检查端口是否可用 // @Summary 检查端口是否可用
@ -99,7 +102,7 @@ func GetPort(c *gin.Context) {
func PortCheck(c *gin.Context) { func PortCheck(c *gin.Context) {
p, _ := strconv.Atoi(c.Param("port")) p, _ := strconv.Atoi(c.Param("port"))
t := c.DefaultQuery("type", "tcp") t := c.DefaultQuery("type", "tcp")
c.JSON(http.StatusOK, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: port2.IsPortAvailable(p, t)}) c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: port2.IsPortAvailable(p, t)})
} }
// @Summary 我的应用列表 // @Summary 我的应用列表
@ -118,10 +121,10 @@ func MyAppList(c *gin.Context) {
position, _ := strconv.ParseBool(c.DefaultQuery("position", "true")) position, _ := strconv.ParseBool(c.DefaultQuery("position", "true"))
list, unTranslation := service.MyService.App().GetMyList(index, size, position) list, unTranslation := service.MyService.App().GetMyList(index, size, position)
data := make(map[string]interface{}, 2) data := make(map[string]interface{}, 2)
data["casaos-apps"] = list data["casaos_apps"] = list
data["local-apps"] = unTranslation data["local_apps"] = unTranslation
c.JSON(http.StatusOK, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data}) c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
} }
// @Summary my app hardware usage list // @Summary my app hardware usage list
@ -133,7 +136,7 @@ func MyAppList(c *gin.Context) {
// @Router /app/usage [get] // @Router /app/usage [get]
func AppUsageList(c *gin.Context) { func AppUsageList(c *gin.Context) {
list := service.MyService.App().GetHardwareUsage() list := service.MyService.App().GetHardwareUsage()
c.JSON(http.StatusOK, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: list}) c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: list})
} }
// @Summary 应用详情 // @Summary 应用详情
@ -148,7 +151,11 @@ func AppInfo(c *gin.Context) {
id := c.Param("id") id := c.Param("id")
language := c.GetHeader("Language") language := c.GetHeader("Language")
info := service.MyService.Casa().GetServerAppInfo(id, "", language) info, err := service.MyService.Casa().GetServerAppInfo(id, "", language)
if err != nil {
c.JSON(common_err.SERVICE_ERROR, &model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
return
}
if info.NetworkModel != "host" { if info.NetworkModel != "host" {
for i := 0; i < len(info.Ports); i++ { for i := 0; i < len(info.Ports); i++ {
if p, _ := strconv.Atoi(info.Ports[i].ContainerPort); port2.IsPortAvailable(p, info.Ports[i].Protocol) { if p, _ := strconv.Atoi(info.Ports[i].ContainerPort); port2.IsPortAvailable(p, info.Ports[i].Protocol) {
@ -215,7 +222,7 @@ func AppInfo(c *gin.Context) {
info.MaxMemory = (service.MyService.System().GetMemInfo()["total"]).(uint64) >> 20 info.MaxMemory = (service.MyService.System().GetMemInfo()["total"]).(uint64) >> 20
c.JSON(http.StatusOK, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: info}) c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: info})
} }
// @Summary 获取远程分类列表 // @Summary 获取远程分类列表
@ -226,7 +233,11 @@ func AppInfo(c *gin.Context) {
// @Success 200 {string} string "ok" // @Success 200 {string} string "ok"
// @Router /app/category [get] // @Router /app/category [get]
func CategoryList(c *gin.Context) { func CategoryList(c *gin.Context) {
list := service.MyService.Casa().GetServerCategoryList() list, err := service.MyService.Casa().GetServerCategoryList()
if err != nil {
c.JSON(common_err.SERVICE_ERROR, &model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
return
}
var count uint = 0 var count uint = 0
for _, category := range list { for _, category := range list {
count += category.Count count += category.Count
@ -235,7 +246,7 @@ func CategoryList(c *gin.Context) {
rear := append([]model.CategoryList{}, list[0:]...) rear := append([]model.CategoryList{}, list[0:]...)
list = append(list[:0], model.CategoryList{Count: count, Name: "All", Font: "apps"}) list = append(list[:0], model.CategoryList{Count: count, Name: "All", Font: "apps"})
list = append(list, rear...) list = append(list, rear...)
c.JSON(http.StatusOK, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: list}) c.JSON(common_err.SUCCESS, &model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: list})
} }
// @Summary 分享该应用配置 // @Summary 分享该应用配置
@ -248,5 +259,5 @@ func CategoryList(c *gin.Context) {
func ShareAppFile(c *gin.Context) { func ShareAppFile(c *gin.Context) {
str, _ := ioutil.ReadAll(c.Request.Body) str, _ := ioutil.ReadAll(c.Request.Body)
content := service.MyService.Casa().ShareAppFile(str) content := service.MyService.Casa().ShareAppFile(str)
c.JSON(http.StatusOK, json.RawMessage(content)) c.JSON(common_err.SUCCESS, json.RawMessage(content))
} }

View File

@ -9,6 +9,7 @@ import (
"time" "time"
"github.com/IceWhaleTech/CasaOS/model" "github.com/IceWhaleTech/CasaOS/model"
"github.com/IceWhaleTech/CasaOS/model/notify"
"github.com/IceWhaleTech/CasaOS/pkg/utils/common_err" "github.com/IceWhaleTech/CasaOS/pkg/utils/common_err"
"github.com/IceWhaleTech/CasaOS/pkg/utils/encryption" "github.com/IceWhaleTech/CasaOS/pkg/utils/encryption"
"github.com/IceWhaleTech/CasaOS/pkg/utils/file" "github.com/IceWhaleTech/CasaOS/pkg/utils/file"
@ -28,6 +29,12 @@ var diskMap = make(map[string]string)
// @Success 200 {string} string "ok" // @Success 200 {string} string "ok"
// @Router /disk/list [get] // @Router /disk/list [get]
func GetDiskList(c *gin.Context) { func GetDiskList(c *gin.Context) {
path := c.Query("path")
if len(path) > 0 {
m := service.MyService.Disk().GetDiskInfo(path)
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: m})
return
}
t := c.DefaultQuery("type", "") t := c.DefaultQuery("type", "")
list := service.MyService.Disk().LSBLK(false) list := service.MyService.Disk().LSBLK(false)
if t == "usb" { if t == "usb" {
@ -54,7 +61,7 @@ func GetDiskList(c *gin.Context) {
data = append(data, temp) data = append(data, temp)
} }
} }
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
return return
} }
@ -183,7 +190,7 @@ func GetDiskList(c *gin.Context) {
data["storage"] = storage data["storage"] = storage
data["avail"] = avail data["avail"] = avail
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
} }
// @Summary get disk list // @Summary get disk list
@ -243,16 +250,16 @@ func FormatDiskType(c *gin.Context) {
// @Router /disk/delpart [delete] // @Router /disk/delpart [delete]
func RemovePartition(c *gin.Context) { func RemovePartition(c *gin.Context) {
js := make(map[string]string) js := make(map[string]string)
c.BindJSON(&js) c.ShouldBind(&js)
path := js["path"] path := js["path"]
if len(path) == 0 { if len(path) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
} }
var p = path[:len(path)-1] var p = path[:len(path)-1]
var n = path[len(path)-1:] var n = path[len(path)-1:]
service.MyService.Disk().DelPartition(p, n) service.MyService.Disk().DelPartition(p, n)
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
} }
// @Summary add storage // @Summary add storage
@ -269,30 +276,30 @@ func RemovePartition(c *gin.Context) {
func PostDiskAddPartition(c *gin.Context) { func PostDiskAddPartition(c *gin.Context) {
js := make(map[string]string) js := make(map[string]string)
c.BindJSON(&js) c.ShouldBind(&js)
path := js["path"] path := js["path"]
name := js["name"] name := js["name"]
format, _ := strconv.ParseBool(js["format"]) format, _ := strconv.ParseBool(js["format"])
if len(name) == 0 || len(path) == 0 { if len(name) == 0 || len(path) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
if _, ok := diskMap[path]; ok { if _, ok := diskMap[path]; ok {
c.JSON(http.StatusOK, model.Result{Success: common_err.DISK_BUSYING, Message: common_err.GetMsg(common_err.DISK_BUSYING)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.DISK_BUSYING, Message: common_err.GetMsg(common_err.DISK_BUSYING)})
return return
} }
if !file.CheckNotExist("/DATA/" + name) { if !file.CheckNotExist("/DATA/" + name) {
// /mnt/name exist // /mnt/name exist
c.JSON(http.StatusOK, model.Result{Success: common_err.NAME_NOT_AVAILABLE, Message: common_err.GetMsg(common_err.NAME_NOT_AVAILABLE)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.NAME_NOT_AVAILABLE, Message: common_err.GetMsg(common_err.NAME_NOT_AVAILABLE)})
return return
} }
diskMap[path] = "busying" diskMap[path] = "busying"
currentDisk := service.MyService.Disk().GetDiskInfo(path) currentDisk := service.MyService.Disk().GetDiskInfo(path)
if !format { if !format {
if len(currentDisk.Children) != 1 || !(len(currentDisk.Children) > 0 && currentDisk.Children[0].FsType == "ext4") { if len(currentDisk.Children) != 1 || !(len(currentDisk.Children) > 0 && currentDisk.Children[0].FsType == "ext4") {
c.JSON(http.StatusOK, model.Result{Success: common_err.DISK_NEEDS_FORMAT, Message: common_err.GetMsg(common_err.DISK_NEEDS_FORMAT)})
delete(diskMap, path) delete(diskMap, path)
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.DISK_NEEDS_FORMAT, Message: common_err.GetMsg(common_err.DISK_NEEDS_FORMAT)})
return return
} }
} else { } else {
@ -311,7 +318,7 @@ func PostDiskAddPartition(c *gin.Context) {
} }
currentDisk = service.MyService.Disk().GetDiskInfo(path) currentDisk = service.MyService.Disk().GetDiskInfo(path)
if len(currentDisk.Children) != 1 { if len(currentDisk.Children) != 1 {
c.JSON(http.StatusOK, model.Result{Success: common_err.DISK_NEEDS_FORMAT, Message: common_err.GetMsg(common_err.DISK_NEEDS_FORMAT)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.DISK_NEEDS_FORMAT, Message: common_err.GetMsg(common_err.DISK_NEEDS_FORMAT)})
return return
} }
@ -330,105 +337,61 @@ func PostDiskAddPartition(c *gin.Context) {
service.MyService.Disk().RemoveLSBLKCache() service.MyService.Disk().RemoveLSBLKCache()
delete(diskMap, path) delete(diskMap, path)
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
//send notify to client
msg := notify.StorageMessage{}
msg.Action = "ADDED"
msg.Path = currentDisk.Children[0].Path
msg.Volume = mountPath
msg.Size = currentDisk.Children[0].Size
msg.Type = currentDisk.Children[0].Tran
service.MyService.Notify().SendStorageBySocket(msg)
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
} }
// @Summary add mount point // @Param pwd formData string true "user password"
// @Produce application/json // @Param volume formData string true "mount point"
// @Accept multipart/form-data
// @Tags disk
// @Security ApiKeyAuth
// @Param path body string true "for example: /dev/sda1"
// @Param action body string true "mount,umount,format"
// @Param serial formData string true "disk id"
// @Success 200 {string} string "ok" // @Success 200 {string} string "ok"
// @Router /disk/mount [post] // @Router /disk/format [post]
func PostMountDisk(c *gin.Context) { func PostDiskFormat(c *gin.Context) {
// for example: path=/dev/sda1
id := c.GetHeader("user_id") id := c.GetHeader("user_id")
js := make(map[string]string) js := make(map[string]string)
c.BindJSON(&js) c.ShouldBind(&js)
path := js["path"] path := js["path"]
serial := js["serial"]
action := js["action"]
t := "ext4" t := "ext4"
password := js["password"] pwd := js["password"]
volume := js["volume"] volume := js["volume"]
user := service.MyService.User().GetUserAllInfoById(id) user := service.MyService.User().GetUserAllInfoById(id)
// volume := js["volume"] if user.Id == 0 {
if action == "mount" { c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)})
mountPath := "/DATA/volume"
var list = service.MyService.Disk().GetSerialAll()
var pathMapList = make(map[string]string, len(list))
for _, v := range list {
pathMapList[v.MountPoint] = "1"
}
for i := 0; i < len(list)+1; i++ {
if _, ok := pathMapList[mountPath+strconv.Itoa(i)]; !ok {
mountPath = mountPath + strconv.Itoa(i)
break
}
}
//mount dir
service.MyService.Disk().MountDisk(path, mountPath)
m := model2.SerialDisk{}
m.MountPoint = mountPath
m.Path = path
m.UUID = serial
m.State = 0
service.MyService.Disk().SaveMountPoint(m)
} else if action == "umount" {
if len(path) == 0 || len(volume) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
if encryption.GetMD5ByStr(password) != user.Password { if encryption.GetMD5ByStr(pwd) != user.Password {
c.JSON(http.StatusOK, model.Result{Success: common_err.PWD_INVALID, Message: common_err.GetMsg(common_err.PWD_INVALID)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.PWD_INVALID, Message: common_err.GetMsg(common_err.PWD_INVALID)})
return
}
if _, ok := diskMap[path]; ok {
c.JSON(http.StatusOK, model.Result{Success: common_err.DISK_BUSYING, Message: common_err.GetMsg(common_err.DISK_BUSYING)})
return
}
service.MyService.Disk().UmountPointAndRemoveDir(path)
//delete data
service.MyService.Disk().DeleteMountPoint(path, volume)
service.MyService.Disk().RemoveLSBLKCache()
} else if action == "format" {
if encryption.GetMD5ByStr(password) != user.Password {
c.JSON(http.StatusOK, model.Result{Success: common_err.PWD_INVALID, Message: common_err.GetMsg(common_err.PWD_INVALID)})
return return
} }
if len(path) == 0 || len(t) == 0 { if len(path) == 0 || len(t) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
if _, ok := diskMap[path]; ok { if _, ok := diskMap[path]; ok {
c.JSON(http.StatusOK, model.Result{Success: common_err.DISK_BUSYING, Message: common_err.GetMsg(common_err.DISK_BUSYING)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.DISK_BUSYING, Message: common_err.GetMsg(common_err.DISK_BUSYING)})
return return
} }
diskMap[path] = "busying" diskMap[path] = "busying"
service.MyService.Disk().UmountPointAndRemoveDir(path) service.MyService.Disk().UmountPointAndRemoveDir(path)
format := service.MyService.Disk().FormatDisk(path, t) format := service.MyService.Disk().FormatDisk(path, t)
if len(format) == 0 { if len(format) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.FORMAT_ERROR, Message: common_err.GetMsg(common_err.FORMAT_ERROR)})
delete(diskMap, path) delete(diskMap, path)
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.FORMAT_ERROR, Message: common_err.GetMsg(common_err.FORMAT_ERROR), Data: "22222"})
return return
} }
service.MyService.Disk().MountDisk(path, volume) service.MyService.Disk().MountDisk(path, volume)
service.MyService.Disk().RemoveLSBLKCache() service.MyService.Disk().RemoveLSBLKCache()
delete(diskMap, path) delete(diskMap, path)
} c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: "1111"})
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
} }
// @Summary remove mount point // @Summary remove mount point
@ -442,8 +405,47 @@ func PostMountDisk(c *gin.Context) {
// @Success 200 {string} string "ok" // @Success 200 {string} string "ok"
// @Router /disk/umount [post] // @Router /disk/umount [post]
func PostDiskUmount(c *gin.Context) { func PostDiskUmount(c *gin.Context) {
id := c.GetHeader("user_id")
js := make(map[string]string)
c.ShouldBind(&js)
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) path := js["path"]
mountPoint := js["volume"]
pwd := js["password"]
if len(path) == 0 || len(mountPoint) == 0 {
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return
}
user := service.MyService.User().GetUserAllInfoById(id)
if user.Id == 0 {
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)})
return
}
if encryption.GetMD5ByStr(pwd) != user.Password {
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.PWD_INVALID, Message: common_err.GetMsg(common_err.PWD_INVALID)})
return
}
if _, ok := diskMap[path]; ok {
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.DISK_BUSYING, Message: common_err.GetMsg(common_err.DISK_BUSYING)})
return
}
service.MyService.Disk().UmountPointAndRemoveDir(path)
//delete data
service.MyService.Disk().DeleteMountPoint(path, mountPoint)
service.MyService.Disk().RemoveLSBLKCache()
//send notify to client
msg := notify.StorageMessage{}
msg.Action = "REMOVED"
msg.Path = path
msg.Volume = mountPoint
msg.Size = 0
msg.Type = ""
service.MyService.Notify().SendStorageBySocket(msg)
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
} }
// @Summary confirm delete disk // @Summary confirm delete disk
@ -481,7 +483,7 @@ func GetDiskCheck(c *gin.Context) {
for _, v := range dbList { for _, v := range dbList {
if _, ok := mapList[v.UUID]; !ok { if _, ok := mapList[v.UUID]; !ok {
//disk undefind //disk undefind
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR), Data: "disk undefind"}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: "disk undefind"})
return return
} }
} }

View File

@ -4,6 +4,7 @@ import (
"bytes" "bytes"
json2 "encoding/json" json2 "encoding/json"
"net/http" "net/http"
"os/exec"
"path/filepath" "path/filepath"
"strconv" "strconv"
"strings" "strings"
@ -15,6 +16,7 @@ import (
"github.com/IceWhaleTech/CasaOS/pkg/docker" "github.com/IceWhaleTech/CasaOS/pkg/docker"
"github.com/IceWhaleTech/CasaOS/pkg/utils/common_err" "github.com/IceWhaleTech/CasaOS/pkg/utils/common_err"
"github.com/IceWhaleTech/CasaOS/pkg/utils/file" "github.com/IceWhaleTech/CasaOS/pkg/utils/file"
"github.com/IceWhaleTech/CasaOS/pkg/utils/loger"
port2 "github.com/IceWhaleTech/CasaOS/pkg/utils/port" port2 "github.com/IceWhaleTech/CasaOS/pkg/utils/port"
"github.com/IceWhaleTech/CasaOS/pkg/utils/random" "github.com/IceWhaleTech/CasaOS/pkg/utils/random"
"github.com/IceWhaleTech/CasaOS/service" "github.com/IceWhaleTech/CasaOS/service"
@ -25,6 +27,7 @@ import (
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"github.com/jinzhu/copier" "github.com/jinzhu/copier"
uuid "github.com/satori/go.uuid" uuid "github.com/satori/go.uuid"
"go.uber.org/zap"
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
) )
@ -41,14 +44,14 @@ func DockerTerminal(c *gin.Context) {
row := c.DefaultQuery("rows", "30") row := c.DefaultQuery("rows", "30")
conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR), Data: err.Error()}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
return return
} }
defer conn.Close() defer conn.Close()
container := c.Param("id") container := c.Param("id")
hr, err := service.Exec(container, row, col) hr, err := service.Exec(container, row, col)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR), Data: err.Error()}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
return return
} }
// 关闭I/O流 // 关闭I/O流
@ -63,15 +66,38 @@ func DockerTerminal(c *gin.Context) {
docker.WsReaderCopy(conn, hr.Conn) docker.WsReaderCopy(conn, hr.Conn)
} }
//打开本机的ssh接口 func PostSshLogin(c *gin.Context) {
func WsSsh(c *gin.Context) {
j := make(map[string]string) j := make(map[string]string)
c.BindJSON(j) c.ShouldBind(&j)
userName := j["user_name"] userName := j["username"]
password := j["password"] password := j["password"]
port := j["port"] port := j["port"]
if userName == "" || password == "" || port == "" {
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS), Data: "Username or password or port is empty"})
return
}
_, err := docker.NewSshClient(userName, password, port)
if err != nil {
c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: "Please check if the username and port are correct, and make sure that ssh server is installed."})
loger.Error("connect ssh error", zap.Any("error", err))
return
}
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
}
func WsSsh(c *gin.Context) {
_, e := exec.LookPath("ssh")
if e != nil {
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: "ssh server not found"})
return
}
userName := c.Query("username")
password := c.Query("password")
port := c.Query("port")
wsConn, _ := upgrader.Upgrade(c.Writer, c.Request, nil) wsConn, _ := upgrader.Upgrade(c.Writer, c.Request, nil)
var logBuff = new(bytes.Buffer) var logBuff = new(bytes.Buffer)
quitChan := make(chan bool, 3) quitChan := make(chan bool, 3)
// user := "" // user := ""
// password := "" // password := ""
@ -82,7 +108,9 @@ func WsSsh(c *gin.Context) {
for login != 0 { for login != 0 {
var err error var err error
if userName == "" || password == "" || port == "" {
wsConn.WriteMessage(websocket.TextMessage, []byte("username or password or port is empty"))
}
// wsConn.WriteMessage(websocket.TextMessage, []byte("login:")) // wsConn.WriteMessage(websocket.TextMessage, []byte("login:"))
// user = docker.ReceiveWsMsgUser(wsConn, logBuff) // user = docker.ReceiveWsMsgUser(wsConn, logBuff)
// wsConn.WriteMessage(websocket.TextMessage, []byte("\r\n\x1b[0m")) // wsConn.WriteMessage(websocket.TextMessage, []byte("\r\n\x1b[0m"))
@ -129,7 +157,7 @@ func WsSsh(c *gin.Context) {
func InstallApp(c *gin.Context) { func InstallApp(c *gin.Context) {
var appInfo model.ServerAppList var appInfo model.ServerAppList
m := model.CustomizationPostData{} m := model.CustomizationPostData{}
c.BindJSON(&m) c.ShouldBind(&m)
const CUSTOM = "custom" const CUSTOM = "custom"
var dockerImage string var dockerImage string
@ -139,20 +167,22 @@ func InstallApp(c *gin.Context) {
if len(m.Protocol) == 0 { if len(m.Protocol) == 0 {
m.Protocol = "http" m.Protocol = "http"
} }
m.Label = strings.Replace(m.Name, " ", "_", -1) m.ContainerName = strings.Replace(m.Label, " ", "_", -1)
if m.Origin != CUSTOM { if m.Origin != CUSTOM {
oldName := m.Label oldName := m.ContainerName
oldLabel := m.Label
for i := 0; true; i++ { for i := 0; true; i++ {
if i != 0 { if i != 0 {
m.Label = oldName + "-" + strconv.Itoa(i) m.ContainerName = oldName + "-" + strconv.Itoa(i)
m.Label = oldLabel + "-" + strconv.Itoa(i)
} }
if _, err := service.MyService.Docker().DockerListByName(m.Label); err != nil { if _, err := service.MyService.Docker().DockerListByName(m.ContainerName); err != nil {
break break
} }
} }
} else { } else {
if _, err := service.MyService.Docker().DockerListByName(m.Label); err == nil { if _, err := service.MyService.Docker().DockerListByName(m.ContainerName); err == nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR_APP_NAME_EXIST, Message: common_err.GetMsg(common_err.ERROR_APP_NAME_EXIST)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.ERROR_APP_NAME_EXIST, Message: common_err.GetMsg(common_err.ERROR_APP_NAME_EXIST)})
return return
} }
@ -163,7 +193,7 @@ func InstallApp(c *gin.Context) {
//c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) //c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
portMap, _ := strconv.Atoi(m.PortMap) portMap, _ := strconv.Atoi(m.PortMap)
if !port2.IsPortAvailable(portMap, "tcp") { if !port2.IsPortAvailable(portMap, "tcp") {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: "Duplicate port:" + m.PortMap}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + m.PortMap})
return return
} }
} }
@ -185,25 +215,25 @@ func InstallApp(c *gin.Context) {
if u.Protocol == "udp" { if u.Protocol == "udp" {
t, _ := strconv.Atoi(u.CommendPort) t, _ := strconv.Atoi(u.CommendPort)
if !port2.IsPortAvailable(t, "udp") { if !port2.IsPortAvailable(t, "udp") {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: "Duplicate port:" + u.CommendPort}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + u.CommendPort})
return return
} }
} else if u.Protocol == "tcp" { } else if u.Protocol == "tcp" {
te, _ := strconv.Atoi(u.CommendPort) te, _ := strconv.Atoi(u.CommendPort)
if !port2.IsPortAvailable(te, "tcp") { if !port2.IsPortAvailable(te, "tcp") {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: "Duplicate port:" + u.CommendPort}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + u.CommendPort})
return return
} }
} else if u.Protocol == "both" { } else if u.Protocol == "both" {
t, _ := strconv.Atoi(u.CommendPort) t, _ := strconv.Atoi(u.CommendPort)
if !port2.IsPortAvailable(t, "udp") { if !port2.IsPortAvailable(t, "udp") {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: "Duplicate port:" + u.CommendPort}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + u.CommendPort})
return return
} }
te, _ := strconv.Atoi(u.CommendPort) te, _ := strconv.Atoi(u.CommendPort)
if !port2.IsPortAvailable(te, "tcp") { if !port2.IsPortAvailable(te, "tcp") {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: "Duplicate port:" + u.CommendPort}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + u.CommendPort})
return return
} }
} }
@ -211,7 +241,7 @@ func InstallApp(c *gin.Context) {
if m.Origin == CUSTOM { if m.Origin == CUSTOM {
for _, device := range m.Devices { for _, device := range m.Devices {
if file.CheckNotExist(device.Path) { if file.CheckNotExist(device.Path) {
c.JSON(http.StatusOK, model.Result{Success: common_err.DEVICE_NOT_EXIST, Message: device.Path + "," + common_err.GetMsg(common_err.DEVICE_NOT_EXIST)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.DEVICE_NOT_EXIST, Message: device.Path + "," + common_err.GetMsg(common_err.DEVICE_NOT_EXIST)})
return return
} }
@ -335,7 +365,7 @@ func InstallApp(c *gin.Context) {
// echo -e "hellow\nworld" >> // echo -e "hellow\nworld" >>
//step启动容器 //step启动容器
err = service.MyService.Docker().DockerContainerStart(m.Label) err = service.MyService.Docker().DockerContainerStart(m.ContainerName)
if err != nil { if err != nil {
//service.MyService.Redis().Set(id, "{\"id\"\""+id+"\",\"state\":false,\"message\":\""+err.Error()+"\",\"speed\":90}", 100) //service.MyService.Redis().Set(id, "{\"id\"\""+id+"\",\"state\":false,\"message\":\""+err.Error()+"\",\"speed\":90}", 100)
notify := notify.Application{} notify := notify.Application{}
@ -358,7 +388,7 @@ func InstallApp(c *gin.Context) {
} }
//step: 启动成功 检查容器状态确认启动成功 //step: 启动成功 检查容器状态确认启动成功
container, err := service.MyService.Docker().DockerContainerInfo(m.Label) container, err := service.MyService.Docker().DockerContainerInfo(m.ContainerName)
if err != nil && container.ContainerJSONBase.State.Running { if err != nil && container.ContainerJSONBase.State.Running {
notify := notify.Application{} notify := notify.Application{}
notify.Icon = m.Icon notify.Icon = m.Icon
@ -391,7 +421,7 @@ func InstallApp(c *gin.Context) {
}() }()
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: m.Label}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: m.Label})
} }
@ -412,7 +442,7 @@ func InstallApp(c *gin.Context) {
// // appInfo := service.MyService.App().GetServerAppInfo(appId) // // appInfo := service.MyService.App().GetServerAppInfo(appId)
// //
// m := model.CustomizationPostData{} // m := model.CustomizationPostData{}
// c.BindJSON(&m) // c.ShouldBind(&m)
// //检查端口 // //检查端口
// if len(m.PortMap) == 0 || m.PortMap == "0" { // if len(m.PortMap) == 0 || m.PortMap == "0" {
// c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) // c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
@ -589,27 +619,27 @@ func UnInstallApp(c *gin.Context) {
appId := c.Param("id") appId := c.Param("id")
if len(appId) == 0 { if len(appId) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
//info := service.MyService.App().GetUninstallInfo(appId) //info := service.MyService.App().GetUninstallInfo(appId)
info, err := service.MyService.Docker().DockerContainerInfo(appId) info, err := service.MyService.Docker().DockerContainerInfo(appId)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR), Data: err.Error()}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
return return
} }
//step停止容器 //step停止容器
err = service.MyService.Docker().DockerContainerStop(appId) err = service.MyService.Docker().DockerContainerStop(appId)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.UNINSTALL_APP_ERROR, Message: common_err.GetMsg(common_err.UNINSTALL_APP_ERROR), Data: err.Error()}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.UNINSTALL_APP_ERROR, Message: common_err.GetMsg(common_err.UNINSTALL_APP_ERROR), Data: err.Error()})
return return
} }
err = service.MyService.Docker().DockerContainerRemove(appId, false) err = service.MyService.Docker().DockerContainerRemove(appId, false)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.UNINSTALL_APP_ERROR, Message: common_err.GetMsg(common_err.UNINSTALL_APP_ERROR), Data: err.Error()}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.UNINSTALL_APP_ERROR, Message: common_err.GetMsg(common_err.UNINSTALL_APP_ERROR), Data: err.Error()})
return return
} }
@ -674,7 +704,7 @@ func UnInstallApp(c *gin.Context) {
notify.Success = true notify.Success = true
notify.Finished = true notify.Finished = true
service.MyService.Notify().SendUninstallAppBySocket(notify) service.MyService.Notify().SendUninstallAppBySocket(notify)
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
} }
@ -690,10 +720,10 @@ func UnInstallApp(c *gin.Context) {
func ChangAppState(c *gin.Context) { func ChangAppState(c *gin.Context) {
appId := c.Param("id") appId := c.Param("id")
js := make(map[string]string) js := make(map[string]string)
c.BindJSON(&js) c.ShouldBind(&js)
state := js["state"] state := js["state"]
if len(appId) == 0 || len(state) == 0 { if len(appId) == 0 || len(state) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
var err error var err error
@ -707,17 +737,17 @@ func ChangAppState(c *gin.Context) {
} }
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR), Data: err.Error()}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
return return
} }
info, err := service.MyService.App().GetContainerInfo(appId) info, err := service.MyService.App().GetContainerInfo(appId)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR), Data: err.Error()}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
return return
} }
// @tiger - 用 {'state': ...} 来体现出参上下文 // @tiger - 用 {'state': ...} 来体现出参上下文
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: info.State}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: info.State})
} }
// @Summary 查看容器日志 // @Summary 查看容器日志
@ -731,7 +761,7 @@ func ChangAppState(c *gin.Context) {
func ContainerLog(c *gin.Context) { func ContainerLog(c *gin.Context) {
appId := c.Param("id") appId := c.Param("id")
log, _ := service.MyService.Docker().DockerContainerLog(appId) log, _ := service.MyService.Docker().DockerContainerLog(appId)
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: log}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: log})
} }
// @Summary 获取容器状态 // @Summary 获取容器状态
@ -748,7 +778,7 @@ func GetContainerState(c *gin.Context) {
//t := c.DefaultQuery("type", "0") //t := c.DefaultQuery("type", "0")
containerInfo, e := service.MyService.App().GetSimpleContainerInfo(id) containerInfo, e := service.MyService.App().GetSimpleContainerInfo(id)
if e != nil { if e != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: e.Error()}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: e.Error()})
return return
} }
@ -761,7 +791,7 @@ func GetContainerState(c *gin.Context) {
// data["app"] = appInfo // data["app"] = appInfo
// } // }
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
} }
// @Summary 更新设置 // @Summary 更新设置
@ -781,10 +811,10 @@ func UpdateSetting(c *gin.Context) {
id := c.Param("id") id := c.Param("id")
const CUSTOM = "custom" const CUSTOM = "custom"
m := model.CustomizationPostData{} m := model.CustomizationPostData{}
c.BindJSON(&m) c.ShouldBind(&m)
if len(id) == 0 { if len(id) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
//var cpd model.CustomizationPostData //var cpd model.CustomizationPostData
@ -804,7 +834,7 @@ func UpdateSetting(c *gin.Context) {
portMap, _ := strconv.Atoi(m.PortMap) portMap, _ := strconv.Atoi(m.PortMap)
if !port2.IsPortAvailable(portMap, "tcp") { if !port2.IsPortAvailable(portMap, "tcp") {
service.MyService.Docker().DockerContainerStart(id) service.MyService.Docker().DockerContainerStart(id)
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: "Duplicate port:" + m.PortMap}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + m.PortMap})
return return
} }
@ -814,28 +844,28 @@ func UpdateSetting(c *gin.Context) {
t, _ := strconv.Atoi(u.CommendPort) t, _ := strconv.Atoi(u.CommendPort)
if !port2.IsPortAvailable(t, "udp") { if !port2.IsPortAvailable(t, "udp") {
service.MyService.Docker().DockerContainerStart(id) service.MyService.Docker().DockerContainerStart(id)
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: "Duplicate port:" + u.CommendPort}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + u.CommendPort})
return return
} }
} else if u.Protocol == "tcp" { } else if u.Protocol == "tcp" {
te, _ := strconv.Atoi(u.CommendPort) te, _ := strconv.Atoi(u.CommendPort)
if !port2.IsPortAvailable(te, "tcp") { if !port2.IsPortAvailable(te, "tcp") {
service.MyService.Docker().DockerContainerStart(id) service.MyService.Docker().DockerContainerStart(id)
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: "Duplicate port:" + u.CommendPort}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + u.CommendPort})
return return
} }
} else if u.Protocol == "both" { } else if u.Protocol == "both" {
t, _ := strconv.Atoi(u.CommendPort) t, _ := strconv.Atoi(u.CommendPort)
if !port2.IsPortAvailable(t, "udp") { if !port2.IsPortAvailable(t, "udp") {
service.MyService.Docker().DockerContainerStart(id) service.MyService.Docker().DockerContainerStart(id)
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: "Duplicate port:" + u.CommendPort}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + u.CommendPort})
return return
} }
te, _ := strconv.Atoi(u.CommendPort) te, _ := strconv.Atoi(u.CommendPort)
if !port2.IsPortAvailable(te, "tcp") { if !port2.IsPortAvailable(te, "tcp") {
service.MyService.Docker().DockerContainerStart(id) service.MyService.Docker().DockerContainerStart(id)
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: "Duplicate port:" + u.CommendPort}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: "Duplicate port:" + u.CommendPort})
return return
} }
} }
@ -846,9 +876,9 @@ func UpdateSetting(c *gin.Context) {
containerId, err := service.MyService.Docker().DockerContainerCreate(m.Image, m) containerId, err := service.MyService.Docker().DockerContainerCreate(m.Image, m)
if err != nil { if err != nil {
service.MyService.Docker().DockerContainerUpdateName(m.Label, id) service.MyService.Docker().DockerContainerUpdateName(m.ContainerName, id)
service.MyService.Docker().DockerContainerStart(id) service.MyService.Docker().DockerContainerStart(id)
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR)})
return return
} }
// echo -e "hellow\nworld" >> // echo -e "hellow\nworld" >>
@ -857,7 +887,7 @@ func UpdateSetting(c *gin.Context) {
err = service.MyService.Docker().DockerContainerStart(containerId) err = service.MyService.Docker().DockerContainerStart(containerId)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR)})
return return
} }
service.MyService.Docker().DockerContainerRemove(id, true) service.MyService.Docker().DockerContainerRemove(id, true)
@ -928,7 +958,7 @@ func UpdateSetting(c *gin.Context) {
//service.MyService.App().UpdateApp(appInfo) //service.MyService.App().UpdateApp(appInfo)
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
} }
// @Summary update app version // @Summary update app version
@ -943,20 +973,20 @@ func PutAppUpdate(c *gin.Context) {
id := c.Param("id") id := c.Param("id")
if len(id) == 0 { if len(id) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
inspect, err := service.MyService.Docker().DockerContainerInfo(id) inspect, err := service.MyService.Docker().DockerContainerInfo(id)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR), Data: err.Error()}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
return return
} }
imageLatest := strings.Split(inspect.Config.Image, ":")[0] + ":latest" imageLatest := strings.Split(inspect.Config.Image, ":")[0] + ":latest"
err = service.MyService.Docker().DockerPullImage(imageLatest, "", "") err = service.MyService.Docker().DockerPullImage(imageLatest, "", "")
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR), Data: err.Error()}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
return return
} }
@ -969,7 +999,7 @@ func PutAppUpdate(c *gin.Context) {
if err != nil { if err != nil {
service.MyService.Docker().DockerContainerUpdateName(inspect.Name, id) service.MyService.Docker().DockerContainerUpdateName(inspect.Name, id)
service.MyService.Docker().DockerContainerStart(id) service.MyService.Docker().DockerContainerStart(id)
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR)})
return return
} }
@ -977,13 +1007,13 @@ func PutAppUpdate(c *gin.Context) {
err = service.MyService.Docker().DockerContainerStart(containerId) err = service.MyService.Docker().DockerContainerStart(containerId)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR)})
return return
} }
service.MyService.Docker().DockerContainerRemove(id, true) service.MyService.Docker().DockerContainerRemove(id, true)
delete(service.NewVersionApp, id) delete(service.NewVersionApp, id)
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
} }
// @Summary 获取容器详情 // @Summary 获取容器详情
@ -1012,7 +1042,7 @@ func ContainerInfo(c *gin.Context) {
info, err := service.MyService.Docker().DockerContainerInfo(appId) info, err := service.MyService.Docker().DockerContainerInfo(appId)
if err != nil { if err != nil {
//todo 需要自定义错误 //todo 需要自定义错误
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: err.Error()}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
return return
} }
con := struct { con := struct {
@ -1028,7 +1058,7 @@ func ContainerInfo(c *gin.Context) {
data["memory"] = service.MyService.System().GetMemInfo()["total"] // @tiger - 改成 total_memory方便以后增加 free_memory 之类的字段 data["memory"] = service.MyService.System().GetMemInfo()["total"] // @tiger - 改成 total_memory方便以后增加 free_memory 之类的字段
data["container"] = json2.RawMessage(containerInfo) data["container"] = json2.RawMessage(containerInfo)
data["info"] = con data["info"] = con
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
} }
func GetDockerNetworks(c *gin.Context) { func GetDockerNetworks(c *gin.Context) {
@ -1039,7 +1069,7 @@ func GetDockerNetworks(c *gin.Context) {
list = append(list, map[string]string{"name": network.Name, "driver": network.Driver, "id": network.ID}) list = append(list, map[string]string{"name": network.Name, "driver": network.Driver, "id": network.ID})
} }
} }
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: list}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: list})
} }
// @Summary 获取依赖数据 // @Summary 获取依赖数据
@ -1069,7 +1099,7 @@ func ContainerUpdateInfo(c *gin.Context) {
info, err := service.MyService.Docker().DockerContainerInfo(appId) info, err := service.MyService.Docker().DockerContainerInfo(appId)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: err.Error()}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: err.Error()})
return return
} }
var port model.PortArray var port model.PortArray
@ -1147,7 +1177,7 @@ func ContainerUpdateInfo(c *gin.Context) {
} }
m.NetworkModel = string(info.HostConfig.NetworkMode) m.NetworkModel = string(info.HostConfig.NetworkMode)
m.Description = info.Config.Labels["desc"] m.Description = info.Config.Labels["desc"]
m.Label = strings.ReplaceAll(info.Name, "/", "") m.ContainerName = strings.ReplaceAll(info.Name, "/", "")
m.PortMap = info.Config.Labels["web"] m.PortMap = info.Config.Labels["web"]
m.Devices = driver m.Devices = driver
m.Envs = envs m.Envs = envs
@ -1167,7 +1197,11 @@ func ContainerUpdateInfo(c *gin.Context) {
m.Cmd = info.Config.Cmd m.Cmd = info.Config.Cmd
m.HostName = info.Config.Hostname m.HostName = info.Config.Hostname
m.Privileged = info.HostConfig.Privileged m.Privileged = info.HostConfig.Privileged
m.Name = info.Config.Labels["name"] name := info.Config.Labels["name"]
if len(name) == 0 {
name = strings.ReplaceAll(info.Name, "/", "")
}
m.Label = name
m.Protocol = info.Config.Labels["protocol"] m.Protocol = info.Config.Labels["protocol"]
if m.Protocol == "" { if m.Protocol == "" {

View File

@ -34,14 +34,14 @@ import (
func GetFilerContent(c *gin.Context) { func GetFilerContent(c *gin.Context) {
filePath := c.Query("path") filePath := c.Query("path")
if len(filePath) == 0 { if len(filePath) == 0 {
c.JSON(http.StatusOK, model.Result{ c.JSON(common_err.CLIENT_ERROR, model.Result{
Success: common_err.INVALID_PARAMS, Success: common_err.INVALID_PARAMS,
Message: common_err.GetMsg(common_err.INVALID_PARAMS), Message: common_err.GetMsg(common_err.INVALID_PARAMS),
}) })
return return
} }
if !file.Exists(filePath) { if !file.Exists(filePath) {
c.JSON(http.StatusOK, model.Result{ c.JSON(common_err.SERVICE_ERROR, model.Result{
Success: common_err.FILE_DOES_NOT_EXIST, Success: common_err.FILE_DOES_NOT_EXIST,
Message: common_err.GetMsg(common_err.FILE_DOES_NOT_EXIST), Message: common_err.GetMsg(common_err.FILE_DOES_NOT_EXIST),
}) })
@ -50,7 +50,7 @@ func GetFilerContent(c *gin.Context) {
//文件读取任务是将文件内容读取到内存中。 //文件读取任务是将文件内容读取到内存中。
info, err := ioutil.ReadFile(filePath) info, err := ioutil.ReadFile(filePath)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{ c.JSON(common_err.SERVICE_ERROR, model.Result{
Success: common_err.FILE_READ_ERROR, Success: common_err.FILE_READ_ERROR,
Message: common_err.GetMsg(common_err.FILE_READ_ERROR), Message: common_err.GetMsg(common_err.FILE_READ_ERROR),
Data: err.Error(), Data: err.Error(),
@ -59,8 +59,7 @@ func GetFilerContent(c *gin.Context) {
} }
result := string(info) result := string(info)
//返回结果 c.JSON(common_err.SUCCESS, model.Result{
c.JSON(http.StatusOK, model.Result{
Success: common_err.SUCCESS, Success: common_err.SUCCESS,
Message: common_err.GetMsg(common_err.SUCCESS), Message: common_err.GetMsg(common_err.SUCCESS),
Data: result, Data: result,
@ -103,7 +102,7 @@ func GetDownloadFile(c *gin.Context) {
files := c.Query("files") files := c.Query("files")
if len(files) == 0 { if len(files) == 0 {
c.JSON(http.StatusOK, model.Result{ c.JSON(common_err.CLIENT_ERROR, model.Result{
Success: common_err.INVALID_PARAMS, Success: common_err.INVALID_PARAMS,
Message: common_err.GetMsg(common_err.INVALID_PARAMS), Message: common_err.GetMsg(common_err.INVALID_PARAMS),
}) })
@ -112,7 +111,7 @@ func GetDownloadFile(c *gin.Context) {
list := strings.Split(files, ",") list := strings.Split(files, ",")
for _, v := range list { for _, v := range list {
if !file.Exists(v) { if !file.Exists(v) {
c.JSON(http.StatusOK, model.Result{ c.JSON(common_err.SERVICE_ERROR, model.Result{
Success: common_err.FILE_DOES_NOT_EXIST, Success: common_err.FILE_DOES_NOT_EXIST,
Message: common_err.GetMsg(common_err.FILE_DOES_NOT_EXIST), Message: common_err.GetMsg(common_err.FILE_DOES_NOT_EXIST),
}) })
@ -150,7 +149,7 @@ func GetDownloadFile(c *gin.Context) {
extension, ar, err := file.GetCompressionAlgorithm(t) extension, ar, err := file.GetCompressionAlgorithm(t)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{ c.JSON(common_err.CLIENT_ERROR, model.Result{
Success: common_err.INVALID_PARAMS, Success: common_err.INVALID_PARAMS,
Message: common_err.GetMsg(common_err.INVALID_PARAMS), Message: common_err.GetMsg(common_err.INVALID_PARAMS),
}) })
@ -159,9 +158,9 @@ func GetDownloadFile(c *gin.Context) {
err = ar.Create(c.Writer) err = ar.Create(c.Writer)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{ c.JSON(common_err.SERVICE_ERROR, model.Result{
Success: common_err.ERROR, Success: common_err.SERVICE_ERROR,
Message: common_err.GetMsg(common_err.ERROR), Message: common_err.GetMsg(common_err.SERVICE_ERROR),
Data: err.Error(), Data: err.Error(),
}) })
return return
@ -186,7 +185,7 @@ func GetDownloadFile(c *gin.Context) {
func GetDownloadSingleFile(c *gin.Context) { func GetDownloadSingleFile(c *gin.Context) {
filePath := c.Query("path") filePath := c.Query("path")
if len(filePath) == 0 { if len(filePath) == 0 {
c.JSON(http.StatusOK, model.Result{ c.JSON(service.ClientCount, model.Result{
Success: common_err.INVALID_PARAMS, Success: common_err.INVALID_PARAMS,
Message: common_err.GetMsg(common_err.INVALID_PARAMS), Message: common_err.GetMsg(common_err.INVALID_PARAMS),
}) })
@ -194,7 +193,7 @@ func GetDownloadSingleFile(c *gin.Context) {
} }
fileTmp, err := os.Open(filePath) fileTmp, err := os.Open(filePath)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{ c.JSON(common_err.SERVICE_ERROR, model.Result{
Success: common_err.FILE_DOES_NOT_EXIST, Success: common_err.FILE_DOES_NOT_EXIST,
Message: common_err.GetMsg(common_err.FILE_DOES_NOT_EXIST), Message: common_err.GetMsg(common_err.FILE_DOES_NOT_EXIST),
}) })
@ -282,7 +281,7 @@ func DirPath(c *gin.Context) {
} }
} }
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: pathList}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: pathList})
} }
// @Summary rename file or dir // @Summary rename file or dir
@ -296,15 +295,15 @@ func DirPath(c *gin.Context) {
// @Router /file/rename [put] // @Router /file/rename [put]
func RenamePath(c *gin.Context) { func RenamePath(c *gin.Context) {
json := make(map[string]string) json := make(map[string]string)
c.BindJSON(&json) c.ShouldBind(&json)
op := json["old_path"] op := json["old_path"]
np := json["new_path"] np := json["new_path"]
if len(op) == 0 || len(np) == 0 { if len(op) == 0 || len(np) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
success, err := service.MyService.System().RenameFile(op, np) success, err := service.MyService.System().RenameFile(op, np)
c.JSON(http.StatusOK, model.Result{Success: success, Message: common_err.GetMsg(success), Data: err}) c.JSON(common_err.SUCCESS, model.Result{Success: success, Message: common_err.GetMsg(success), Data: err})
} }
// @Summary create folder // @Summary create folder
@ -317,11 +316,11 @@ func RenamePath(c *gin.Context) {
// @Router /file/mkdir [post] // @Router /file/mkdir [post]
func MkdirAll(c *gin.Context) { func MkdirAll(c *gin.Context) {
json := make(map[string]string) json := make(map[string]string)
c.BindJSON(&json) c.ShouldBind(&json)
path := json["path"] path := json["path"]
var code int var code int
if len(path) == 0 { if len(path) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
// decodedPath, err := url.QueryUnescape(path) // decodedPath, err := url.QueryUnescape(path)
@ -330,7 +329,7 @@ func MkdirAll(c *gin.Context) {
// return // return
// } // }
code, _ = service.MyService.System().MkdirAll(path) code, _ = service.MyService.System().MkdirAll(path)
c.JSON(http.StatusOK, model.Result{Success: code, Message: common_err.GetMsg(code)}) c.JSON(common_err.SUCCESS, model.Result{Success: code, Message: common_err.GetMsg(code)})
} }
// @Summary create file // @Summary create file
@ -343,11 +342,11 @@ func MkdirAll(c *gin.Context) {
// @Router /file/create [post] // @Router /file/create [post]
func PostCreateFile(c *gin.Context) { func PostCreateFile(c *gin.Context) {
json := make(map[string]string) json := make(map[string]string)
c.BindJSON(&json) c.ShouldBind(&json)
path := json["path"] path := json["path"]
var code int var code int
if len(path) == 0 { if len(path) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
// decodedPath, err := url.QueryUnescape(path) // decodedPath, err := url.QueryUnescape(path)
@ -356,7 +355,7 @@ func PostCreateFile(c *gin.Context) {
// return // return
// } // }
code, _ = service.MyService.System().CreateFile(path) code, _ = service.MyService.System().CreateFile(path)
c.JSON(http.StatusOK, model.Result{Success: code, Message: common_err.GetMsg(code)}) c.JSON(common_err.SUCCESS, model.Result{Success: code, Message: common_err.GetMsg(code)})
} }
// @Summary upload file // @Summary upload file
@ -437,7 +436,7 @@ func PostFileUpload(c *gin.Context) {
defer out.Close() defer out.Close()
_, err := io.Copy(out, f) _, err := io.Copy(out, f)
if err != nil { if err != nil {
c.JSON(common_err.ERROR, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR), Data: err.Error()}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
return return
} }
} else { } else {
@ -445,7 +444,7 @@ func PostFileUpload(c *gin.Context) {
defer out.Close() defer out.Close()
_, err := io.Copy(out, f) _, err := io.Copy(out, f)
if err != nil { if err != nil {
c.JSON(common_err.ERROR, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR), Data: err.Error()}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
return return
} }
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
@ -453,7 +452,7 @@ func PostFileUpload(c *gin.Context) {
} }
fileNum, err := ioutil.ReadDir(tempDir) fileNum, err := ioutil.ReadDir(tempDir)
if err != nil { if err != nil {
c.JSON(common_err.ERROR, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR), Data: err.Error()}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
return return
} }
if totalChunks == len(fileNum) { if totalChunks == len(fileNum) {
@ -461,7 +460,7 @@ func PostFileUpload(c *gin.Context) {
file.RMDir(tempDir) file.RMDir(tempDir)
} }
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
} }
// @Summary copy or move file // @Summary copy or move file
@ -475,14 +474,14 @@ func PostFileUpload(c *gin.Context) {
func PostOperateFileOrDir(c *gin.Context) { func PostOperateFileOrDir(c *gin.Context) {
list := model.FileOperate{} list := model.FileOperate{}
c.BindJSON(&list) c.ShouldBind(&list)
if len(list.Item) == 0 { if len(list.Item) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
if list.To == list.Item[0].From[:strings.LastIndex(list.Item[0].From, "/")] { if list.To == list.Item[0].From[:strings.LastIndex(list.Item[0].From, "/")] {
c.JSON(http.StatusOK, model.Result{Success: common_err.SOURCE_DES_SAME, Message: common_err.GetMsg(common_err.SOURCE_DES_SAME)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SOURCE_DES_SAME, Message: common_err.GetMsg(common_err.SOURCE_DES_SAME)})
return return
} }
@ -512,7 +511,7 @@ func PostOperateFileOrDir(c *gin.Context) {
} }
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
} }
// @Summary delete file // @Summary delete file
@ -526,9 +525,9 @@ func PostOperateFileOrDir(c *gin.Context) {
func DeleteFile(c *gin.Context) { func DeleteFile(c *gin.Context) {
paths := []string{} paths := []string{}
c.BindJSON(&paths) c.ShouldBind(&paths)
if len(paths) == 0 { if len(paths) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
// path := c.Query("path") // path := c.Query("path")
@ -538,12 +537,12 @@ func DeleteFile(c *gin.Context) {
for _, v := range paths { for _, v := range paths {
err := os.RemoveAll(v) err := os.RemoveAll(v)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.FILE_DELETE_ERROR, Message: common_err.GetMsg(common_err.FILE_DELETE_ERROR), Data: err}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.FILE_DELETE_ERROR, Message: common_err.GetMsg(common_err.FILE_DELETE_ERROR), Data: err})
return return
} }
} }
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
} }
// @Summary update file // @Summary update file
@ -558,26 +557,26 @@ func DeleteFile(c *gin.Context) {
func PutFileContent(c *gin.Context) { func PutFileContent(c *gin.Context) {
fi := model.FileUpdate{} fi := model.FileUpdate{}
c.BindJSON(&fi) c.ShouldBind(&fi)
// path := c.PostForm("path") // path := c.PostForm("path")
// content := c.PostForm("content") // content := c.PostForm("content")
if !file.Exists(fi.FilePath) { if !file.Exists(fi.FilePath) {
c.JSON(http.StatusOK, model.Result{Success: common_err.FILE_ALREADY_EXISTS, Message: common_err.GetMsg(common_err.FILE_ALREADY_EXISTS)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.FILE_ALREADY_EXISTS, Message: common_err.GetMsg(common_err.FILE_ALREADY_EXISTS)})
return return
} }
//err := os.Remove(path) //err := os.Remove(path)
err := os.RemoveAll(fi.FilePath) err := os.RemoveAll(fi.FilePath)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.FILE_DELETE_ERROR, Message: common_err.GetMsg(common_err.FILE_DELETE_ERROR), Data: err}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.FILE_DELETE_ERROR, Message: common_err.GetMsg(common_err.FILE_DELETE_ERROR), Data: err})
return return
} }
err = file.CreateFileAndWriteContent(fi.FilePath, fi.FileContent) err = file.CreateFileAndWriteContent(fi.FilePath, fi.FileContent)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR), Data: err}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
return return
} }
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
} }
// @Summary image thumbnail/original image // @Summary image thumbnail/original image
@ -593,13 +592,13 @@ func GetFileImage(c *gin.Context) {
t := c.Query("type") t := c.Query("type")
path := c.Query("path") path := c.Query("path")
if !file.Exists(path) { if !file.Exists(path) {
c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.FILE_ALREADY_EXISTS, Message: common_err.GetMsg(common_err.FILE_ALREADY_EXISTS)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.FILE_ALREADY_EXISTS, Message: common_err.GetMsg(common_err.FILE_ALREADY_EXISTS)})
return return
} }
if t == "thumbnail" { if t == "thumbnail" {
f, err := file.GetImage(path, 100, 0) f, err := file.GetImage(path, 100, 0)
if err != nil { if err != nil {
c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR), Data: err.Error()}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
return return
} }
c.Writer.WriteString(string(f)) c.Writer.WriteString(string(f))
@ -607,13 +606,13 @@ func GetFileImage(c *gin.Context) {
} }
f, err := os.Open(path) f, err := os.Open(path)
if err != nil { if err != nil {
c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR), Data: err.Error()}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
return return
} }
defer f.Close() defer f.Close()
data, err := ioutil.ReadAll(f) data, err := ioutil.ReadAll(f)
if err != nil { if err != nil {
c.JSON(http.StatusInternalServerError, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR), Data: err.Error()}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()})
return return
} }
c.Writer.WriteString(string(data)) c.Writer.WriteString(string(data))
@ -638,5 +637,5 @@ func DeleteOperateFileOrDir(c *gin.Context) {
} }
go service.MyService.Notify().SendFileOperateNotify(true) go service.MyService.Notify().SendFileOperateNotify(true)
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
} }

View File

@ -1,107 +0,0 @@
/*
* @Author: LinkLeong link@icewhale.com
* @Date: 2021-09-30 18:18:14
* @LastEditors: LinkLeong
* @LastEditTime: 2022-06-15 14:30:05
* @FilePath: /CasaOS/route/v1/shortcuts.go
* @Description:
* @Website: https://www.casaos.io
* Copyright (c) 2022 by icewhale, All Rights Reserved.
*/
package v1
import (
"net/http"
"net/url"
"github.com/IceWhaleTech/CasaOS/model"
"github.com/IceWhaleTech/CasaOS/pkg/utils/common_err"
"github.com/IceWhaleTech/CasaOS/service"
model2 "github.com/IceWhaleTech/CasaOS/service/model"
"github.com/gin-gonic/gin"
)
// @Summary 获取短链列表
// @Produce application/json
// @Accept application/json
// @Tags shortcuts
// @Param username formData string true "User name"
// @Param pwd formData string true "password"
// @Security ApiKeyAuth
// @Success 200 {string} string "ok"
// @Router /shortcuts/list [get]
func GetShortcutsList(c *gin.Context) {
list := service.MyService.Shortcuts().GetList()
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: list})
}
// @Summary 添加shortcuts
// @Produce application/json
// @Accept application/json
// @Tags shortcuts
// @Param title formData string true "title"
// @Param url formData string true "url"
// @Security ApiKeyAuth
// @Success 200 {string} string "ok"
// @Router /shortcuts/add [post]
func PostShortcutsAdd(c *gin.Context) {
var m model2.ShortcutsDBModel
c.BindJSON(&m)
if len(m.Url) == 0 || len(m.Title) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return
}
u, err := url.Parse(m.Url)
if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.SHORTCUTS_URL_ERROR, Message: common_err.GetMsg(common_err.SHORTCUTS_URL_ERROR), Data: err.Error()})
return
}
m.Icon = "https://api.faviconkit.com/" + u.Host + "/57"
service.MyService.Shortcuts().AddData(m)
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
}
// @Summary 删除shortcuts
// @Produce application/json
// @Accept application/json
// @Tags shortcuts
// @Security ApiKeyAuth
// @Success 200 {string} string "ok"
// @Router /shortcuts/del/{id} [post]
func DeleteShortcutsDelete(c *gin.Context) {
id := c.Param("id")
service.MyService.Shortcuts().DeleteData(id)
c.JSON(http.StatusOK, model.Result{
Success: common_err.SUCCESS,
Message: common_err.GetMsg(common_err.SUCCESS),
Data: "",
})
}
// @Summary 编辑shortcuts
// @Produce application/json
// @Accept application/json
// @Tags shortcuts
// @Param title formData string true "title"
// @Param url formData string true "url"
// @Security ApiKeyAuth
// @Success 200 {string} string "ok"
// @Router /shortcuts/edit [put]
func PutShortcutsEdit(c *gin.Context) {
var m model2.ShortcutsDBModel
c.BindJSON(&m)
if len(m.Url) == 0 || len(m.Title) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return
}
u, err := url.Parse(m.Url)
if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.SHORTCUTS_URL_ERROR, Message: common_err.GetMsg(common_err.SHORTCUTS_URL_ERROR), Data: err.Error()})
return
}
m.Icon = "https://api.faviconkit.com/" + u.Host + "/57"
service.MyService.Shortcuts().EditData(m)
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: ""})
}

View File

@ -1,27 +0,0 @@
/*
* @Author: LinkLeong link@icewhale.com
* @Date: 2021-11-08 18:02:02
* @LastEditors: LinkLeong
* @LastEditTime: 2022-06-21 19:13:59
* @FilePath: /CasaOS/route/v1/sync.go
* @Description:
* @Website: https://www.casaos.io
* Copyright (c) 2022 by icewhale, All Rights Reserved.
*/
package v1
import (
"net/http"
"github.com/IceWhaleTech/CasaOS/model"
"github.com/IceWhaleTech/CasaOS/pkg/config"
"github.com/IceWhaleTech/CasaOS/pkg/utils/common_err"
"github.com/gin-gonic/gin"
)
func GetSyncConfig(c *gin.Context) {
data := make(map[string]string)
data["key"] = config.SystemConfigInfo.SyncKey
data["port"] = config.SystemConfigInfo.SyncPort
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
}

View File

@ -1,7 +1,6 @@
package v1 package v1
import ( import (
"encoding/json"
"fmt" "fmt"
"net/http" "net/http"
"os" "os"
@ -44,10 +43,10 @@ func GetSystemCheckVersion(c *gin.Context) {
service.MyService.Notify().AddLog(installLog) service.MyService.Notify().AddLog(installLog)
} }
data := make(map[string]interface{}, 3) data := make(map[string]interface{}, 3)
data["is_need"] = need data["need_update"] = need
data["version"] = version data["version"] = version
data["current_version"] = types.CURRENTVERSION data["current_version"] = types.CURRENTVERSION
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
} }
// @Summary 系统信息 // @Summary 系统信息
@ -62,7 +61,7 @@ func SystemUpdate(c *gin.Context) {
if need { if need {
service.MyService.System().UpdateSystemVersion(version.Version) service.MyService.System().UpdateSystemVersion(version.Version)
} }
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
} }
// @Summary get logs // @Summary get logs
@ -74,86 +73,29 @@ func SystemUpdate(c *gin.Context) {
// @Router /sys/error/logs [get] // @Router /sys/error/logs [get]
func GetCasaOSErrorLogs(c *gin.Context) { func GetCasaOSErrorLogs(c *gin.Context) {
line, _ := strconv.Atoi(c.DefaultQuery("line", "100")) line, _ := strconv.Atoi(c.DefaultQuery("line", "100"))
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: service.MyService.System().GetCasaOSLogs(line)}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: service.MyService.System().GetCasaOSLogs(line)})
}
// @Summary 修改配置文件
// @Produce application/json
// @Accept multipart/form-data
// @Tags sys
// @Param config formData string true "config json string"
// @Security ApiKeyAuth
// @Success 200 {string} string "ok"
// @Router /sys/changhead [post]
func PostSetSystemConfig(c *gin.Context) {
buf := make([]byte, 1024)
n, _ := c.Request.Body.Read(buf)
service.MyService.System().UpSystemConfig(string(buf[0:n]), "")
c.JSON(http.StatusOK,
model.Result{
Success: common_err.SUCCESS,
Message: common_err.GetMsg(common_err.SUCCESS),
Data: json.RawMessage(config.SystemConfigInfo.ConfigStr),
})
} }
//系统配置 //系统配置
func GetSystemConfigDebug(c *gin.Context) { func GetSystemConfigDebug(c *gin.Context) {
array := service.MyService.System().GetSystemConfigDebug() array := service.MyService.System().GetSystemConfigDebug()
disk := service.MyService.System().GetDiskInfo() disk := service.MyService.System().GetDiskInfo()
sys := service.MyService.System().GetSysInfo() sys := service.MyService.System().GetSysInfo()
//todo 准备sync需要显示的数据(镜像,容器) version := service.MyService.Casa().GetCasaosVersion()
var systemAppStatus string
images := service.MyService.Docker().IsExistImage("linuxserver/syncthing")
systemAppStatus += "Sync img: " + strconv.FormatBool(images) + "\n\t"
list := service.MyService.App().GetSystemAppList()
for _, v := range list {
systemAppStatus += v.Image + ",\n\t"
}
systemAppStatus += "Sync Key length: " + strconv.Itoa(len(config.SystemConfigInfo.SyncKey))
var bugContent string = fmt.Sprintf(` var bugContent string = fmt.Sprintf(`
- OS: %s - OS: %s
- CasaOS Version: %s - CasaOS Version: %s
- Disk Total: %v - Disk Total: %v
- Disk Used: %v - Disk Used: %v
- Sync State: %s
- System Info: %s - System Info: %s
- Remote Version: %s
- Browser: $Browser$ - Browser: $Browser$
- Version: $Version$ - Version: $Version$
`, sys.OS, types.CURRENTVERSION, disk.Total>>20, disk.Used>>20, systemAppStatus, array) `, sys.OS, types.CURRENTVERSION, disk.Total>>20, disk.Used>>20, array, version.Version)
// array = append(array, fmt.Sprintf("disk,total:%v,used:%v,UsedPercent:%v", disk.Total>>20, disk.Used>>20, disk.UsedPercent)) // array = append(array, fmt.Sprintf("disk,total:%v,used:%v,UsedPercent:%v", disk.Total>>20, disk.Used>>20, disk.UsedPercent))
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: bugContent}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: bugContent})
}
//widget配置
func GetWidgetConfig(c *gin.Context) {
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: json.RawMessage(config.SystemConfigInfo.WidgetList)})
}
// @Summary 修改组件配置文件
// @Produce application/json
// @Accept application/json
// @Tags sys
// @Security ApiKeyAuth
// @Success 200 {string} string "ok"
// @Router /sys/widget/config [post]
func PostSetWidgetConfig(c *gin.Context) {
buf := make([]byte, 1024)
n, _ := c.Request.Body.Read(buf)
service.MyService.System().UpSystemConfig("", string(buf[0:n]))
c.JSON(http.StatusOK,
model.Result{
Success: common_err.SUCCESS,
Message: common_err.GetMsg(common_err.SUCCESS),
Data: json.RawMessage(config.SystemConfigInfo.WidgetList),
})
} }
// @Summary get casaos server port // @Summary get casaos server port
@ -164,7 +106,7 @@ func PostSetWidgetConfig(c *gin.Context) {
// @Success 200 {string} string "ok" // @Success 200 {string} string "ok"
// @Router /sys/port [get] // @Router /sys/port [get]
func GetCasaOSPort(c *gin.Context) { func GetCasaOSPort(c *gin.Context) {
c.JSON(http.StatusOK, c.JSON(common_err.SUCCESS,
model.Result{ model.Result{
Success: common_err.SUCCESS, Success: common_err.SUCCESS,
Message: common_err.GetMsg(common_err.SUCCESS), Message: common_err.GetMsg(common_err.SUCCESS),
@ -182,13 +124,13 @@ func GetCasaOSPort(c *gin.Context) {
// @Router /sys/port [put] // @Router /sys/port [put]
func PutCasaOSPort(c *gin.Context) { func PutCasaOSPort(c *gin.Context) {
json := make(map[string]string) json := make(map[string]string)
c.BindJSON(&json) c.ShouldBind(&json)
portStr := json["port"] portStr := json["port"]
port, err := strconv.Atoi(portStr) port, err := strconv.Atoi(portStr)
if err != nil { if err != nil {
c.JSON(http.StatusOK, c.JSON(common_err.SERVICE_ERROR,
model.Result{ model.Result{
Success: common_err.ERROR, Success: common_err.SERVICE_ERROR,
Message: err.Error(), Message: err.Error(),
}) })
return return
@ -196,7 +138,7 @@ func PutCasaOSPort(c *gin.Context) {
isAvailable := port2.IsPortAvailable(port, "tcp") isAvailable := port2.IsPortAvailable(port, "tcp")
if !isAvailable { if !isAvailable {
c.JSON(http.StatusOK, c.JSON(common_err.SERVICE_ERROR,
model.Result{ model.Result{
Success: common_err.PORT_IS_OCCUPIED, Success: common_err.PORT_IS_OCCUPIED,
Message: common_err.GetMsg(common_err.PORT_IS_OCCUPIED), Message: common_err.GetMsg(common_err.PORT_IS_OCCUPIED),
@ -204,7 +146,7 @@ func PutCasaOSPort(c *gin.Context) {
return return
} }
service.MyService.System().UpSystemPort(strconv.Itoa(port)) service.MyService.System().UpSystemPort(strconv.Itoa(port))
c.JSON(http.StatusOK, c.JSON(common_err.SUCCESS,
model.Result{ model.Result{
Success: common_err.SUCCESS, Success: common_err.SUCCESS,
Message: common_err.GetMsg(common_err.SUCCESS), Message: common_err.GetMsg(common_err.SUCCESS),
@ -230,7 +172,9 @@ func PostKillCasaOS(c *gin.Context) {
// @Success 200 {string} string "ok" // @Success 200 {string} string "ok"
// @Router /sys/usb/off [put] // @Router /sys/usb/off [put]
func PutSystemUSBAutoMount(c *gin.Context) { func PutSystemUSBAutoMount(c *gin.Context) {
status := c.Query("state") js := make(map[string]string)
c.ShouldBind(&js)
status := js["status"]
if status == "on" { if status == "on" {
service.MyService.System().UpdateUSBAutoMount("True") service.MyService.System().UpdateUSBAutoMount("True")
service.MyService.System().ExecUSBAutoMountShell("True") service.MyService.System().ExecUSBAutoMountShell("True")
@ -239,7 +183,7 @@ func PutSystemUSBAutoMount(c *gin.Context) {
service.MyService.System().ExecUSBAutoMountShell("False") service.MyService.System().ExecUSBAutoMountShell("False")
} }
c.JSON(http.StatusOK, c.JSON(common_err.SUCCESS,
model.Result{ model.Result{
Success: common_err.SUCCESS, Success: common_err.SUCCESS,
Message: common_err.GetMsg(common_err.SUCCESS), Message: common_err.GetMsg(common_err.SUCCESS),
@ -259,7 +203,7 @@ func GetSystemUSBAutoMount(c *gin.Context) {
state = "False" state = "False"
} }
c.JSON(http.StatusOK, c.JSON(common_err.SUCCESS,
model.Result{ model.Result{
Success: common_err.SUCCESS, Success: common_err.SUCCESS,
Message: common_err.GetMsg(common_err.SUCCESS), Message: common_err.GetMsg(common_err.SUCCESS),
@ -267,6 +211,40 @@ func GetSystemUSBAutoMount(c *gin.Context) {
}) })
} }
func GetSystemAppsStatus(c *gin.Context) {
systemAppList := service.MyService.App().GetSystemAppList()
appList := []model2.MyAppList{}
for _, v := range systemAppList {
name := strings.ReplaceAll(v.Names[0], "/", "")
if len(v.Labels["name"]) > 0 {
name = v.Labels["name"]
}
appList = append(appList, model2.MyAppList{
Name: name,
Icon: v.Labels["icon"],
State: v.State,
CustomId: v.Labels["custom_id"],
Id: v.ID,
Port: v.Labels["web"],
Index: v.Labels["index"],
//Order: m.Labels["order"],
Image: v.Image,
Latest: false,
//Type: m.Labels["origin"],
//Slogan: m.Slogan,
//Rely: m.Rely,
Host: v.Labels["host"],
Protocol: v.Labels["protocol"],
})
}
c.JSON(common_err.SUCCESS,
model.Result{
Success: common_err.SUCCESS,
Message: common_err.GetMsg(common_err.SUCCESS),
Data: appList,
})
}
// @Summary get system hardware info // @Summary get system hardware info
// @Produce application/json // @Produce application/json
// @Accept application/json // @Accept application/json
@ -278,7 +256,7 @@ func GetSystemHardwareInfo(c *gin.Context) {
data := make(map[string]string, 1) data := make(map[string]string, 1)
data["drive_model"] = service.MyService.System().GetDeviceTree() data["drive_model"] = service.MyService.System().GetDeviceTree()
c.JSON(http.StatusOK, c.JSON(common_err.SUCCESS,
model.Result{ model.Result{
Success: common_err.SUCCESS, Success: common_err.SUCCESS,
Message: common_err.GetMsg(common_err.SUCCESS), Message: common_err.GetMsg(common_err.SUCCESS),
@ -421,7 +399,7 @@ func GetSystemUtilization(c *gin.Context) {
data["net"] = newNet data["net"] = newNet
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
} }
// @Summary Get notification port // @Summary Get notification port
@ -433,7 +411,7 @@ func GetSystemUtilization(c *gin.Context) {
// @Router /sys/socket/port [get] // @Router /sys/socket/port [get]
func GetSystemSocketPort(c *gin.Context) { func GetSystemSocketPort(c *gin.Context) {
c.JSON(http.StatusOK, c.JSON(common_err.SUCCESS,
model.Result{ model.Result{
Success: common_err.SUCCESS, Success: common_err.SUCCESS,
Message: common_err.GetMsg(common_err.SUCCESS), Message: common_err.GetMsg(common_err.SUCCESS),

View File

@ -31,47 +31,47 @@ import (
// @Router /user/register/ [post] // @Router /user/register/ [post]
func PostUserRegister(c *gin.Context) { func PostUserRegister(c *gin.Context) {
json := make(map[string]string) json := make(map[string]string)
c.BindJSON(&json) c.ShouldBind(&json)
username := json["username"] username := json["username"]
pwd := json["password"] pwd := json["password"]
key := json["key"] key := json["key"]
if _, ok := service.UserRegisterHash[key]; !ok { if _, ok := service.UserRegisterHash[key]; !ok {
c.JSON(http.StatusOK, c.JSON(common_err.CLIENT_ERROR,
model.Result{Success: common_err.KEY_NOT_EXIST, Message: common_err.GetMsg(common_err.KEY_NOT_EXIST)}) model.Result{Success: common_err.KEY_NOT_EXIST, Message: common_err.GetMsg(common_err.KEY_NOT_EXIST)})
return return
} }
if len(username) == 0 || len(pwd) == 0 { if len(username) == 0 || len(pwd) == 0 {
c.JSON(http.StatusOK, c.JSON(common_err.CLIENT_ERROR,
model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
if len(pwd) < 6 { if len(pwd) < 6 {
c.JSON(http.StatusOK, c.JSON(common_err.CLIENT_ERROR,
model.Result{Success: common_err.PWD_IS_TOO_SIMPLE, Message: common_err.GetMsg(common_err.PWD_IS_TOO_SIMPLE)}) model.Result{Success: common_err.PWD_IS_TOO_SIMPLE, Message: common_err.GetMsg(common_err.PWD_IS_TOO_SIMPLE)})
return return
} }
oldUser := service.MyService.User().GetUserInfoByUserName(username) oldUser := service.MyService.User().GetUserInfoByUserName(username)
if oldUser.Id > 0 { if oldUser.Id > 0 {
c.JSON(http.StatusOK, c.JSON(common_err.CLIENT_ERROR,
model.Result{Success: common_err.USER_EXIST, Message: common_err.GetMsg(common_err.USER_EXIST)}) model.Result{Success: common_err.USER_EXIST, Message: common_err.GetMsg(common_err.USER_EXIST)})
return return
} }
user := model2.UserDBModel{} user := model2.UserDBModel{}
user.Username = username user.Username = username
user.Password = encryption.GetMD5ByStr(config.UserInfo.PWD) user.Password = encryption.GetMD5ByStr(pwd)
user.Role = "admin" user.Role = "admin"
user = service.MyService.User().CreateUser(user) user = service.MyService.User().CreateUser(user)
if user.Id == 0 { if user.Id == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR)})
return return
} }
file.MkDir(config.AppInfo.UserDataPath + "/" + strconv.Itoa(user.Id)) file.MkDir(config.AppInfo.UserDataPath + "/" + strconv.Itoa(user.Id))
delete(service.UserRegisterHash, key) delete(service.UserRegisterHash, key)
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
} }
@ -85,28 +85,28 @@ func PostUserRegister(c *gin.Context) {
// @Router /user/login [post] // @Router /user/login [post]
func PostUserLogin(c *gin.Context) { func PostUserLogin(c *gin.Context) {
json := make(map[string]string) json := make(map[string]string)
c.BindJSON(&json) c.ShouldBind(&json)
username := json["username"] username := json["username"]
password := json["password"] password := json["password"]
//check params is empty //check params is empty
if len(username) == 0 || len(password) == 0 { if len(username) == 0 || len(password) == 0 {
c.JSON(http.StatusOK, c.JSON(common_err.CLIENT_ERROR,
model.Result{ model.Result{
Success: common_err.ERROR, Success: common_err.CLIENT_ERROR,
Message: common_err.GetMsg(common_err.INVALID_PARAMS), Message: common_err.GetMsg(common_err.INVALID_PARAMS),
}) })
return return
} }
user := service.MyService.User().GetUserAllInfoByName(username) user := service.MyService.User().GetUserAllInfoByName(username)
if user.Id == 0 { if user.Id == 0 {
c.JSON(http.StatusOK, c.JSON(common_err.CLIENT_ERROR,
model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)}) model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)})
return return
} }
if user.Password != encryption.GetMD5ByStr(password) { if user.Password != encryption.GetMD5ByStr(password) {
c.JSON(http.StatusOK, c.JSON(common_err.CLIENT_ERROR,
model.Result{Success: common_err.PWD_INVALID, Message: common_err.GetMsg(common_err.PWD_INVALID)}) model.Result{Success: common_err.PWD_INVALID, Message: common_err.GetMsg(common_err.PWD_INVALID)})
return return
} }
@ -121,7 +121,7 @@ func PostUserLogin(c *gin.Context) {
// TODO:1 Database fields cannot be external // TODO:1 Database fields cannot be external
data["user"] = user data["user"] = user
c.JSON(http.StatusOK, c.JSON(common_err.SUCCESS,
model.Result{ model.Result{
Success: common_err.SUCCESS, Success: common_err.SUCCESS,
Message: common_err.GetMsg(common_err.SUCCESS), Message: common_err.GetMsg(common_err.SUCCESS),
@ -141,14 +141,14 @@ func PutUserAvatar(c *gin.Context) {
id := c.GetHeader("user_id") id := c.GetHeader("user_id")
user := service.MyService.User().GetUserInfoById(id) user := service.MyService.User().GetUserInfoById(id)
if user.Id == 0 { if user.Id == 0 {
c.JSON(http.StatusOK, c.JSON(common_err.SERVICE_ERROR,
model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)}) model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)})
return return
} }
f, err := c.FormFile("file") f, err := c.FormFile("file")
if err != nil { if err != nil {
c.JSON(http.StatusOK, c.JSON(common_err.CLIENT_ERROR,
model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR), Data: err.Error()}) model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: err.Error()})
return return
} }
if len(user.Avatar) > 0 { if len(user.Avatar) > 0 {
@ -178,25 +178,22 @@ func PutUserAvatar(c *gin.Context) {
func PutUserInfo(c *gin.Context) { func PutUserInfo(c *gin.Context) {
id := c.GetHeader("user_id") id := c.GetHeader("user_id")
json := model2.UserDBModel{} json := model2.UserDBModel{}
c.BindJSON(&json) c.ShouldBind(&json)
user := service.MyService.User().GetUserInfoById(id) user := service.MyService.User().GetUserInfoById(id)
if user.Id == 0 { if user.Id == 0 {
c.JSON(http.StatusOK, c.JSON(common_err.SERVICE_ERROR,
model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)}) model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)})
return return
} }
if len(json.Username) > 0 { if len(json.Username) > 0 {
u := service.MyService.User().GetUserInfoByUserName(json.Username) u := service.MyService.User().GetUserInfoByUserName(json.Username)
if u.Id > 0 { if u.Id > 0 {
c.JSON(http.StatusOK, c.JSON(common_err.CLIENT_ERROR,
model.Result{Success: common_err.USER_EXIST, Message: common_err.GetMsg(common_err.USER_EXIST)}) model.Result{Success: common_err.USER_EXIST, Message: common_err.GetMsg(common_err.USER_EXIST)})
return return
} }
} }
if len(json.Password) > 0 {
user.Password = encryption.GetMD5ByStr(json.Password)
service.MyService.User().UpdateUserPassword(user)
}
if len(json.Email) == 0 { if len(json.Email) == 0 {
json.Email = user.Email json.Email = user.Email
} }
@ -213,7 +210,7 @@ func PutUserInfo(c *gin.Context) {
json.Nickname = user.Nickname json.Nickname = user.Nickname
} }
service.MyService.User().UpdateUser(json) service.MyService.User().UpdateUser(json)
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: json}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: json})
} }
// @Summary edit user password // @Summary edit user password
@ -223,31 +220,30 @@ func PutUserInfo(c *gin.Context) {
// @Security ApiKeyAuth // @Security ApiKeyAuth
// @Success 200 {string} string "ok" // @Success 200 {string} string "ok"
// @Router /user/password/:id [put] // @Router /user/password/:id [put]
func PutUserPwd(c *gin.Context) { func PutUserPassword(c *gin.Context) {
//id := c.GetHeader("user_id") id := c.GetHeader("user_id")
json := make(map[string]string) json := make(map[string]string)
c.BindJSON(&json) c.ShouldBind(&json)
oldPwd := json["old_pwd"] oldPwd := json["old_password"]
pwd := json["pwd"] pwd := json["password"]
id := json["user_id"]
if len(oldPwd) == 0 || len(pwd) == 0 { if len(oldPwd) == 0 || len(pwd) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
user := service.MyService.User().GetUserAllInfoById(id) user := service.MyService.User().GetUserAllInfoById(id)
if user.Id == 0 { if user.Id == 0 {
c.JSON(http.StatusOK, c.JSON(common_err.SERVICE_ERROR,
model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)}) model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)})
return return
} }
if user.Password != encryption.GetMD5ByStr(oldPwd) { if user.Password != encryption.GetMD5ByStr(oldPwd) {
c.JSON(http.StatusOK, model.Result{Success: common_err.PWD_INVALID_OLD, Message: common_err.GetMsg(common_err.PWD_INVALID_OLD)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.PWD_INVALID_OLD, Message: common_err.GetMsg(common_err.PWD_INVALID_OLD)})
return return
} }
user.Password = encryption.GetMD5ByStr(pwd) user.Password = encryption.GetMD5ByStr(pwd)
service.MyService.User().UpdateUserPassword(user) service.MyService.User().UpdateUserPassword(user)
user.Password = "" user.Password = ""
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: user}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: user})
} }
// @Summary edit user nick // @Summary edit user nick
@ -262,7 +258,7 @@ func PutUserNick(c *gin.Context) {
id := c.GetHeader("user_id") id := c.GetHeader("user_id")
json := make(map[string]string) json := make(map[string]string)
c.BindJSON(&json) c.ShouldBind(&json)
Nickname := json["nick_name"] Nickname := json["nick_name"]
if len(Nickname) == 0 { if len(Nickname) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
@ -290,7 +286,7 @@ func PutUserNick(c *gin.Context) {
func PutUserDesc(c *gin.Context) { func PutUserDesc(c *gin.Context) {
id := c.GetHeader("user_id") id := c.GetHeader("user_id")
json := make(map[string]string) json := make(map[string]string)
c.BindJSON(&json) c.ShouldBind(&json)
desc := json["description"] desc := json["description"]
if len(desc) == 0 { if len(desc) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
@ -319,7 +315,7 @@ func GetUserInfo(c *gin.Context) {
id := c.GetHeader("user_id") id := c.GetHeader("user_id")
user := service.MyService.User().GetUserInfoById(id) user := service.MyService.User().GetUserInfoById(id)
c.JSON(http.StatusOK, c.JSON(common_err.SUCCESS,
model.Result{ model.Result{
Success: common_err.SUCCESS, Success: common_err.SUCCESS,
Message: common_err.GetMsg(common_err.SUCCESS), Message: common_err.GetMsg(common_err.SUCCESS),
@ -338,17 +334,16 @@ func GetUserInfo(c *gin.Context) {
func GetUserInfoByUsername(c *gin.Context) { func GetUserInfoByUsername(c *gin.Context) {
username := c.Param("username") username := c.Param("username")
if len(username) == 0 { if len(username) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
user := service.MyService.User().GetUserInfoByUserName(username) user := service.MyService.User().GetUserInfoByUserName(username)
if user.Id == 0 { if user.Id == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)})
return return
} }
//**
c.JSON(http.StatusOK, c.JSON(common_err.SUCCESS,
model.Result{ model.Result{
Success: common_err.SUCCESS, Success: common_err.SUCCESS,
Message: common_err.GetMsg(common_err.SUCCESS), Message: common_err.GetMsg(common_err.SUCCESS),
@ -367,7 +362,7 @@ func GetUserAllUsername(c *gin.Context) {
for _, v := range users { for _, v := range users {
names = append(names, v.Username) names = append(names, v.Username)
} }
c.JSON(http.StatusOK, c.JSON(common_err.SUCCESS,
model.Result{ model.Result{
Success: common_err.SUCCESS, Success: common_err.SUCCESS,
Message: common_err.GetMsg(common_err.SUCCESS), Message: common_err.GetMsg(common_err.SUCCESS),
@ -384,7 +379,7 @@ func GetUserAllUsername(c *gin.Context) {
func GetUserCustomConf(c *gin.Context) { func GetUserCustomConf(c *gin.Context) {
name := c.Param("key") name := c.Param("key")
if len(name) == 0 { if len(name) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
id := c.GetHeader("user_id") id := c.GetHeader("user_id")
@ -392,7 +387,7 @@ func GetUserCustomConf(c *gin.Context) {
user := service.MyService.User().GetUserInfoById(id) user := service.MyService.User().GetUserInfoById(id)
// user := service.MyService.User().GetUserInfoByUsername(Username) // user := service.MyService.User().GetUserInfoByUsername(Username)
if user.Id == 0 { if user.Id == 0 {
c.JSON(http.StatusOK, c.JSON(common_err.SERVICE_ERROR,
model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)}) model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)})
return return
} }
@ -400,10 +395,10 @@ func GetUserCustomConf(c *gin.Context) {
data := file.ReadFullFile(filePath) data := file.ReadFullFile(filePath)
if !gjson.ValidBytes(data) { if !gjson.ValidBytes(data) {
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: string(data)}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: string(data)})
return return
} }
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: json2.RawMessage(string(data))}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: json2.RawMessage(string(data))})
} }
/** /**
@ -413,15 +408,16 @@ func GetUserCustomConf(c *gin.Context) {
* @router:/user/custom/:key * @router:/user/custom/:key
*/ */
func PostUserCustomConf(c *gin.Context) { func PostUserCustomConf(c *gin.Context) {
name := c.Param("key") name := c.Param("key")
if len(name) == 0 { if len(name) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
id := c.GetHeader("user_id") id := c.GetHeader("user_id")
user := service.MyService.User().GetUserInfoById(id) user := service.MyService.User().GetUserInfoById(id)
if user.Id == 0 { if user.Id == 0 {
c.JSON(http.StatusOK, c.JSON(common_err.SERVICE_ERROR,
model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)}) model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)})
return return
} }
@ -429,7 +425,7 @@ func PostUserCustomConf(c *gin.Context) {
filePath := config.AppInfo.UserDataPath + "/" + strconv.Itoa(user.Id) filePath := config.AppInfo.UserDataPath + "/" + strconv.Itoa(user.Id)
file.WriteToPath(data, filePath, name+".json") file.WriteToPath(data, filePath, name+".json")
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: json2.RawMessage(string(data))}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: json2.RawMessage(string(data))})
} }
/** /**
@ -441,19 +437,23 @@ func PostUserCustomConf(c *gin.Context) {
func DeleteUserCustomConf(c *gin.Context) { func DeleteUserCustomConf(c *gin.Context) {
name := c.Param("key") name := c.Param("key")
if len(name) == 0 { if len(name) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
id := c.GetHeader("user_id") id := c.GetHeader("user_id")
user := service.MyService.User().GetUserInfoById(id) user := service.MyService.User().GetUserInfoById(id)
if user.Id == 0 { if user.Id == 0 {
c.JSON(http.StatusOK, c.JSON(common_err.SERVICE_ERROR,
model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)}) model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)})
return return
} }
filePath := config.AppInfo.UserDataPath + "/" + strconv.Itoa(user.Id) + "/" + name + ".json" filePath := config.AppInfo.UserDataPath + "/" + strconv.Itoa(user.Id) + "/" + name + ".json"
os.Remove(filePath) // @tiger - 这里万一无法实际删除,后面仍然有可能返回成功 err := os.Remove(filePath)
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) if err != nil {
c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR)})
return
}
c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
} }
/** /**
@ -465,7 +465,7 @@ func DeleteUserCustomConf(c *gin.Context) {
func DeleteUser(c *gin.Context) { func DeleteUser(c *gin.Context) {
id := c.Param("id") id := c.Param("id")
service.MyService.User().DeleteUserById(id) service.MyService.User().DeleteUserById(id)
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: id}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: id})
} }
/** /**
@ -476,7 +476,7 @@ func DeleteUser(c *gin.Context) {
func PostUserFileImage(c *gin.Context) { func PostUserFileImage(c *gin.Context) {
id := c.GetHeader("user_id") id := c.GetHeader("user_id")
json := make(map[string]string) json := make(map[string]string)
c.BindJSON(&json) c.ShouldBind(&json)
path := json["path"] path := json["path"]
key := c.Param("key") key := c.Param("key")
@ -533,24 +533,24 @@ func PostUserUploadImage(c *gin.Context) {
key := c.Param("key") key := c.Param("key")
t := c.PostForm("type") t := c.PostForm("type")
if len(key) == 0 { if len(key) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR), Data: err.Error()}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.CLIENT_ERROR, Message: common_err.GetMsg(common_err.CLIENT_ERROR), Data: err.Error()})
return return
} }
_, err = file.GetImageExtByName(f.Filename) _, err = file.GetImageExtByName(f.Filename)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.NOT_IMAGE, Message: common_err.GetMsg(common_err.NOT_IMAGE)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.NOT_IMAGE, Message: common_err.GetMsg(common_err.NOT_IMAGE)})
return return
} }
ext := filepath.Ext(f.Filename) ext := filepath.Ext(f.Filename)
user := service.MyService.User().GetUserInfoById(id) user := service.MyService.User().GetUserInfoById(id)
if user.Id == 0 { if user.Id == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)})
return return
} }
if t == "avatar" { if t == "avatar" {
@ -563,7 +563,7 @@ func PostUserUploadImage(c *gin.Context) {
data["path"] = path data["path"] = path
data["file_name"] = key + ext data["file_name"] = key + ext
data["online_path"] = "/v1/user/image?path=" + path data["online_path"] = "/v1/user/image?path=" + path
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data})
} }
/** /**
@ -599,24 +599,24 @@ func DeleteUserImage(c *gin.Context) {
id := c.GetHeader("user_id") id := c.GetHeader("user_id")
path := c.Query("path") path := c.Query("path")
if len(path) == 0 { if len(path) == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS)})
return return
} }
user := service.MyService.User().GetUserInfoById(id) user := service.MyService.User().GetUserInfoById(id)
if user.Id == 0 { if user.Id == 0 {
c.JSON(http.StatusOK, model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.USER_NOT_EXIST, Message: common_err.GetMsg(common_err.USER_NOT_EXIST)})
return return
} }
if !file.Exists(path) { if !file.Exists(path) {
c.JSON(http.StatusOK, model.Result{Success: common_err.FILE_DOES_NOT_EXIST, Message: common_err.GetMsg(common_err.FILE_DOES_NOT_EXIST)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.FILE_DOES_NOT_EXIST, Message: common_err.GetMsg(common_err.FILE_DOES_NOT_EXIST)})
return return
} }
if !strings.Contains(path, config.AppInfo.UserDataPath+"/"+strconv.Itoa(user.Id)) { if !strings.Contains(path, config.AppInfo.UserDataPath+"/"+strconv.Itoa(user.Id)) {
c.JSON(http.StatusOK, model.Result{Success: common_err.INSUFFICIENT_PERMISSIONS, Message: common_err.GetMsg(common_err.INSUFFICIENT_PERMISSIONS)}) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.INSUFFICIENT_PERMISSIONS, Message: common_err.GetMsg(common_err.INSUFFICIENT_PERMISSIONS)})
return return
} }
os.Remove(path) os.Remove(path)
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
} }
/** /**
@ -628,34 +628,31 @@ func DeleteUserImage(c *gin.Context) {
* @router: * @router:
*/ */
func PostUserRefreshToken(c *gin.Context) { func PostUserRefreshToken(c *gin.Context) {
js := make(map[string]string)
refresh := c.Query("refresh_token") c.ShouldBind(&js)
claims, err := jwt.ParseToken(refresh) refresh := js["refresh_token"]
claims, err := jwt.ParseToken(refresh, true)
if err != nil { if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.VERIFICATION_FAILURE), Data: err.Error()}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.VERIFICATION_FAILURE, Message: common_err.GetMsg(common_err.VERIFICATION_FAILURE), Data: err.Error()})
return return
} }
if !claims.VerifyExpiresAt(time.Now(), true) || !claims.VerifyIssuer("refresh", true) { if !claims.VerifyExpiresAt(time.Now(), true) || !claims.VerifyIssuer("refresh", true) {
c.JSON(http.StatusOK, model.Result{Success: common_err.VERIFICATION_FAILURE, Message: common_err.GetMsg(common_err.VERIFICATION_FAILURE)}) c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.VERIFICATION_FAILURE, Message: common_err.GetMsg(common_err.VERIFICATION_FAILURE)})
return return
} }
newToken := jwt.GetAccessToken(claims.Username, claims.PassWord, claims.Id) newToken := jwt.GetAccessToken(claims.Username, claims.PassWord, claims.Id)
if err != nil {
c.JSON(http.StatusOK, model.Result{Success: common_err.ERROR, Message: common_err.GetMsg(common_err.ERROR), Data: err.Error()})
return
}
verifyInfo := system_model.VerifyInformation{} verifyInfo := system_model.VerifyInformation{}
verifyInfo.AccessToken = newToken verifyInfo.AccessToken = newToken
verifyInfo.RefreshToken = jwt.GetRefreshToken(claims.Username, claims.PassWord, claims.Id) verifyInfo.RefreshToken = jwt.GetRefreshToken(claims.Username, claims.PassWord, claims.Id)
verifyInfo.ExpiresAt = time.Now().Add(3 * time.Hour * time.Duration(1)).Unix() verifyInfo.ExpiresAt = time.Now().Add(3 * time.Hour * time.Duration(1)).Unix()
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: verifyInfo}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: verifyInfo})
} }
func DeleteUserAll(c *gin.Context) { func DeleteUserAll(c *gin.Context) {
service.MyService.User().DeleteAllUser() service.MyService.User().DeleteAllUser()
c.JSON(http.StatusOK, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)}) c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS)})
} }
// @Summary 检查是否进入引导状态 // @Summary 检查是否进入引导状态
@ -677,7 +674,7 @@ func GetUserStatus(c *gin.Context) {
data["key"] = key data["key"] = key
data["initialized"] = false data["initialized"] = false
} }
c.JSON(http.StatusOK, c.JSON(common_err.SUCCESS,
model.Result{ model.Result{
Success: common_err.SUCCESS, Success: common_err.SUCCESS,
Message: common_err.GetMsg(common_err.SUCCESS), Message: common_err.GetMsg(common_err.SUCCESS),

View File

@ -156,10 +156,23 @@ func (a *appStruct) GetMyList(index, size int, position bool) (*[]model2.MyAppLi
for _, m := range containers { for _, m := range containers {
if m.Labels["casaos"] == "casaos" { if m.Labels["casaos"] == "casaos" {
_, newVersion := NewVersionApp[m.ID] _, newVersion := NewVersionApp[m.ID]
name := strings.ReplaceAll(m.Names[0], "/", "")
icon := m.Labels["icon"]
if len(m.Labels["name"]) > 0 {
name = m.Labels["name"]
}
if m.Labels["origin"] == "system" {
name = strings.Split(m.Image, ":")[0]
if len(strings.Split(name, "/")) > 1 {
icon = "https://icon.casaos.io/main/all/" + strings.Split(name, "/")[1] + ".png"
}
}
list = append(list, model2.MyAppList{ list = append(list, model2.MyAppList{
Name: m.Labels["name"], Name: name,
Icon: m.Labels["icon"], Icon: icon,
State: m.State, State: m.State,
CustomId: m.Labels["custom_id"], CustomId: m.Labels["custom_id"],
Id: m.ID, Id: m.ID,
@ -167,8 +180,8 @@ func (a *appStruct) GetMyList(index, size int, position bool) (*[]model2.MyAppLi
Index: m.Labels["index"], Index: m.Labels["index"],
//Order: m.Labels["order"], //Order: m.Labels["order"],
Image: m.Image, Image: m.Image,
NewVersion: newVersion, Latest: newVersion,
Type: m.Labels["origin"], //Type: m.Labels["origin"],
//Slogan: m.Slogan, //Slogan: m.Slogan,
//Rely: m.Rely, //Rely: m.Rely,
Host: m.Labels["host"], Host: m.Labels["host"],
@ -182,7 +195,7 @@ func (a *appStruct) GetMyList(index, size int, position bool) (*[]model2.MyAppLi
CustomId: m.ID, CustomId: m.ID,
Id: m.ID, Id: m.ID,
Port: "", Port: "",
NewVersion: false, Latest: false,
Host: "", Host: "",
Protocol: "", Protocol: "",
Image: m.Image, Image: m.Image,
@ -397,20 +410,26 @@ func (a *appStruct) GetHardwareUsageStream() {
fts := filters.NewArgs() fts := filters.NewArgs()
fts.Add("label", "casaos=casaos") fts.Add("label", "casaos=casaos")
//fts.Add("status", "running") //fts.Add("status", "running")
containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{All: true, Filters: fts})
if err != nil {
loger.Error("Failed to get container_list", zap.Any("err", err))
}
for i := 0; i < 100; i++ { for i := 0; i < 100; i++ {
if i%10 == 0 {
containers, err = cli.ContainerList(context.Background(), types.ContainerListOptions{All: true, Filters: fts})
if err != nil {
loger.Error("Failed to get container_list", zap.Any("err", err))
continue
}
}
if config.CasaOSGlobalVariables.AppChange { if config.CasaOSGlobalVariables.AppChange {
config.CasaOSGlobalVariables.AppChange = false config.CasaOSGlobalVariables.AppChange = false
dataStats.Range(func(key, value interface{}) bool { dataStats.Range(func(key, value interface{}) bool {
dataStats.Delete(key) dataStats.Delete(key)
return true return true
}) })
} }
containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{All: true, Filters: fts})
if err != nil {
loger.Error("Failed to get container_list", zap.Any("err", err))
}
var temp sync.Map var temp sync.Map
var wg sync.WaitGroup var wg sync.WaitGroup
for _, v := range containers { for _, v := range containers {
@ -432,7 +451,7 @@ func (a *appStruct) GetHardwareUsageStream() {
m, _ := dataStats.Load(v.ID) m, _ := dataStats.Load(v.ID)
dockerStats := model.DockerStatsModel{} dockerStats := model.DockerStatsModel{}
if m != nil { if m != nil {
dockerStats.Pre = m.(model.DockerStatsModel).Data dockerStats.Previous = m.(model.DockerStatsModel).Data
} }
dockerStats.Data = data dockerStats.Data = data
dockerStats.Icon = v.Labels["icon"] dockerStats.Icon = v.Labels["icon"]

View File

@ -14,18 +14,19 @@ import (
"github.com/IceWhaleTech/CasaOS/pkg/utils/httper" "github.com/IceWhaleTech/CasaOS/pkg/utils/httper"
httper2 "github.com/IceWhaleTech/CasaOS/pkg/utils/httper" httper2 "github.com/IceWhaleTech/CasaOS/pkg/utils/httper"
"github.com/IceWhaleTech/CasaOS/pkg/utils/loger" "github.com/IceWhaleTech/CasaOS/pkg/utils/loger"
"github.com/pkg/errors"
"github.com/tidwall/gjson" "github.com/tidwall/gjson"
"go.uber.org/zap" "go.uber.org/zap"
) )
type CasaService interface { type CasaService interface {
GetServerList(index, size, tp, categoryId, key string) model.ServerAppListCollection GetServerList(index, size, tp, categoryId, key string) (model.ServerAppListCollection, error)
GetServerCategoryList() []model.CategoryList GetServerCategoryList() (list []model.CategoryList, err error)
GetServerAppInfo(id, t string, language string) model.ServerAppList GetServerAppInfo(id, t string, language string) (model.ServerAppList, error)
ShareAppFile(body []byte) string ShareAppFile(body []byte) string
GetCasaosVersion() model.Version GetCasaosVersion() model.Version
AsyncGetServerList() (collection model.ServerAppListCollection) AsyncGetServerList() (collection model.ServerAppListCollection, err error)
AsyncGetServerCategoryList() []model.CategoryList AsyncGetServerCategoryList() ([]model.CategoryList, error)
} }
type casaService struct { type casaService struct {
@ -40,7 +41,7 @@ func (o *casaService) ShareAppFile(body []byte) string {
return content return content
} }
func (o *casaService) GetServerList(index, size, tp, categoryId, key string) model.ServerAppListCollection { func (o *casaService) GetServerList(index, size, tp, categoryId, key string) (model.ServerAppListCollection, error) {
keyName := fmt.Sprintf("list_%s_%s_%s_%s_%s", index, size, tp, categoryId, "en") keyName := fmt.Sprintf("list_%s_%s_%s_%s_%s", index, size, tp, categoryId, "en")
collection := model.ServerAppListCollection{} collection := model.ServerAppListCollection{}
@ -48,7 +49,7 @@ func (o *casaService) GetServerList(index, size, tp, categoryId, key string) mod
res, ok := result.(string) res, ok := result.(string)
if ok { if ok {
json2.Unmarshal([]byte(res), &collection) json2.Unmarshal([]byte(res), &collection)
return collection return collection, nil
} }
} }
@ -57,7 +58,10 @@ func (o *casaService) GetServerList(index, size, tp, categoryId, key string) mod
err := json2.Unmarshal(collectionStr, &collection) err := json2.Unmarshal(collectionStr, &collection)
if err != nil { if err != nil {
loger.Error("marshal error", zap.Any("err", err), zap.Any("content", string(collectionStr))) loger.Error("marshal error", zap.Any("err", err), zap.Any("content", string(collectionStr)))
collection = o.AsyncGetServerList() collection, err = o.AsyncGetServerList()
if err != nil {
return collection, err
}
} }
go o.AsyncGetServerList() go o.AsyncGetServerList()
@ -116,20 +120,20 @@ func (o *casaService) GetServerList(index, size, tp, categoryId, key string) mod
Cache.Set(keyName, string(by), time.Minute*10) Cache.Set(keyName, string(by), time.Minute*10)
} }
return collection return collection, nil
} }
func (o *casaService) AsyncGetServerList() (collection model.ServerAppListCollection) { func (o *casaService) AsyncGetServerList() (collection model.ServerAppListCollection, err error) {
results := file.ReadFullFile(config.AppInfo.DBPath + "/app_list.json") results := file.ReadFullFile(config.AppInfo.DBPath + "/app_list.json")
err := json2.Unmarshal(results, &collection) err = json2.Unmarshal(results, &collection)
if err != nil { if err != nil {
loger.Error("marshal error", zap.Any("err", err), zap.Any("content", string(results))) loger.Error("marshal error", zap.Any("err", err), zap.Any("content", string(results)))
} }
if collection.Version == o.GetCasaosVersion().Version { if collection.Version == o.GetCasaosVersion().Version {
return collection return collection, err
} }
head := make(map[string]string) head := make(map[string]string)
@ -181,33 +185,36 @@ func (o *casaService) AsyncGetServerList() (collection model.ServerAppListCollec
// return list // return list
// } // }
func (o *casaService) GetServerCategoryList() (list []model.CategoryList) { func (o *casaService) GetServerCategoryList() (list []model.CategoryList, err error) {
category := model.ServerCategoryList{} category := model.ServerCategoryList{}
results := file.ReadFullFile(config.AppInfo.DBPath + "/app_category.json") results := file.ReadFullFile(config.AppInfo.DBPath + "/app_category.json")
err := json2.Unmarshal(results, &category) err = json2.Unmarshal(results, &category)
if err != nil { if err != nil {
loger.Error("marshal error", zap.Any("err", err), zap.Any("content", string(results))) loger.Error("marshal error", zap.Any("err", err), zap.Any("content", string(results)))
return o.AsyncGetServerCategoryList() return o.AsyncGetServerCategoryList()
} }
go o.AsyncGetServerCategoryList() go o.AsyncGetServerCategoryList()
return category.Item return category.Item, err
} }
func (o *casaService) AsyncGetServerCategoryList() []model.CategoryList { func (o *casaService) AsyncGetServerCategoryList() ([]model.CategoryList, error) {
list := model.ServerCategoryList{} list := model.ServerCategoryList{}
results := file.ReadFullFile(config.AppInfo.DBPath + "/app_category.json") results := file.ReadFullFile(config.AppInfo.DBPath + "/app_category.json")
err := json2.Unmarshal(results, &list) err := json2.Unmarshal(results, &list)
if err != nil { if err != nil {
loger.Error("marshal error", zap.Any("err", err), zap.Any("content", string(results))) loger.Error("marshal error", zap.Any("err", err), zap.Any("content", string(results)))
} } else {
if list.Version == o.GetCasaosVersion().Version { if list.Version == o.GetCasaosVersion().Version {
return nil return list.Item, nil
}
} }
item := []model.CategoryList{} item := []model.CategoryList{}
head := make(map[string]string) head := make(map[string]string)
head["Authorization"] = GetToken() head["Authorization"] = GetToken()
listS := httper2.Get(config.ServerInfo.ServerApi+"/v2/app/category", head) listS := httper2.Get(config.ServerInfo.ServerApi+"/v2/app/category", head)
if len(listS) == 0 {
return item, errors.New("server error")
}
json2.Unmarshal([]byte(gjson.Get(listS, "data").String()), &item) json2.Unmarshal([]byte(gjson.Get(listS, "data").String()), &item)
if len(item) > 0 { if len(item) > 0 {
list.Version = o.GetCasaosVersion().Version list.Version = o.GetCasaosVersion().Version
@ -218,10 +225,10 @@ func (o *casaService) AsyncGetServerCategoryList() []model.CategoryList {
} }
file.WriteToPath(by, config.AppInfo.DBPath, "app_category.json") file.WriteToPath(by, config.AppInfo.DBPath, "app_category.json")
} }
return item return item, nil
} }
func (o *casaService) GetServerAppInfo(id, t string, language string) model.ServerAppList { func (o *casaService) GetServerAppInfo(id, t string, language string) (model.ServerAppList, error) {
head := make(map[string]string) head := make(map[string]string)
@ -229,9 +236,12 @@ func (o *casaService) GetServerAppInfo(id, t string, language string) model.Serv
infoS := httper2.Get(config.ServerInfo.ServerApi+"/v2/app/info/"+id+"?t="+t+"&language="+language, head) infoS := httper2.Get(config.ServerInfo.ServerApi+"/v2/app/info/"+id+"?t="+t+"&language="+language, head)
info := model.ServerAppList{} info := model.ServerAppList{}
if infoS == "" {
return info, errors.New("server error")
}
json2.Unmarshal([]byte(gjson.Get(infoS, "data").String()), &info) json2.Unmarshal([]byte(gjson.Get(infoS, "data").String()), &info)
return info return info, nil
} }
func GetToken() string { func GetToken() string {
t := make(chan string) t := make(chan string)

View File

@ -540,7 +540,7 @@ func (ds *dockerService) DockerContainerCreate(imageName string, m model.Customi
config.Labels["show_env"] = strings.Join(showENV, ",") config.Labels["show_env"] = strings.Join(showENV, ",")
config.Labels["protocol"] = m.Protocol config.Labels["protocol"] = m.Protocol
config.Labels["host"] = m.Host config.Labels["host"] = m.Host
config.Labels["name"] = m.Name config.Labels["name"] = m.Label
hostConfig := &container.HostConfig{Resources: res, Mounts: volumes, RestartPolicy: rp, NetworkMode: container.NetworkMode(m.NetworkModel), Privileged: m.Privileged, CapAdd: m.CapAdd} hostConfig := &container.HostConfig{Resources: res, Mounts: volumes, RestartPolicy: rp, NetworkMode: container.NetworkMode(m.NetworkModel), Privileged: m.Privileged, CapAdd: m.CapAdd}
//if net != "host" { //if net != "host" {
config.ExposedPorts = ports config.ExposedPorts = ports
@ -552,7 +552,7 @@ func (ds *dockerService) DockerContainerCreate(imageName string, m model.Customi
hostConfig, hostConfig,
&network.NetworkingConfig{EndpointsConfig: map[string]*network.EndpointSettings{m.NetworkModel: {NetworkID: "", Aliases: []string{}}}}, &network.NetworkingConfig{EndpointsConfig: map[string]*network.EndpointSettings{m.NetworkModel: {NetworkID: "", Aliases: []string{}}}},
nil, nil,
m.Label) m.ContainerName)
if err != nil { if err != nil {
return "", err return "", err
} }

View File

@ -2,7 +2,7 @@
* @Author: LinkLeong link@icewhale.com * @Author: LinkLeong link@icewhale.com
* @Date: 2022-05-13 18:15:46 * @Date: 2022-05-13 18:15:46
* @LastEditors: LinkLeong * @LastEditors: LinkLeong
* @LastEditTime: 2022-05-30 17:33:21 * @LastEditTime: 2022-07-13 10:56:34
* @FilePath: /CasaOS/service/model/o_container.go * @FilePath: /CasaOS/service/model/o_container.go
* @Description: * @Description:
* @Website: https://www.casaos.io * @Website: https://www.casaos.io
@ -67,13 +67,12 @@ type MyAppList struct {
Index string `json:"index"` Index string `json:"index"`
//Order string `json:"order"` //Order string `json:"order"`
Port string `json:"port"` Port string `json:"port"`
UpTime string `json:"up_time"` // @tiger - 如果是安装时间,应该写 installed_at。
Slogan string `json:"slogan"` Slogan string `json:"slogan"`
Type string `json:"type"` Type string `json:"type"`
//Rely model.MapStrings `json:"rely"` //[{"mysql":"id"},{"mysql":"id"}] //Rely model.MapStrings `json:"rely"` //[{"mysql":"id"},{"mysql":"id"}]
Image string `json:"image"` Image string `json:"image"`
Volumes string `json:"volumes"` Volumes string `json:"volumes"`
NewVersion bool `json:"new_version"` // @tiger - 无法从词面理解含义,感觉可以更加有描述性 Latest bool `json:"latest"`
Host string `json:"host"` Host string `json:"host"`
Protocol string `json:"protocol"` Protocol string `json:"protocol"`
} }

View File

@ -1,17 +0,0 @@
package model
import "time"
type ShortcutsDBModel struct {
Id uint `gorm:"column:id;primary_key" json:"id"`
Title string `json:"title"`
Url string `json:"url"`
Icon string `json:"icon"`
Sort int `json:"sort"`
CreatedAt time.Time `gorm:"<-:create" json:"created_at"`
UpdatedAt time.Time `gorm:"<-:create;<-:update" json:"updated_at"`
}
func (p *ShortcutsDBModel) TableName() string {
return "o_shortcuts"
}

View File

@ -36,12 +36,28 @@ type NotifyServer interface {
SendFileOperateNotify(nowSend bool) SendFileOperateNotify(nowSend bool)
SendInstallAppBySocket(app notify.Application) SendInstallAppBySocket(app notify.Application)
SendAllHardwareStatusBySocket(disk model2.Summary, list []model2.DriveUSB, mem map[string]interface{}, cpu map[string]interface{}, netList []model2.IOCountersStat) SendAllHardwareStatusBySocket(disk model2.Summary, list []model2.DriveUSB, mem map[string]interface{}, cpu map[string]interface{}, netList []model2.IOCountersStat)
SendStorageBySocket(message notify.StorageMessage)
} }
type notifyServer struct { type notifyServer struct {
db *gorm.DB db *gorm.DB
} }
func (i *notifyServer) SendStorageBySocket(message notify.StorageMessage) {
body := make(map[string]interface{})
body["data"] = message
msg := gosf.Message{}
msg.Body = body
msg.Success = true
msg.Text = "storage_status"
notify := notify.Message{}
notify.Path = "storage_status"
notify.Msg = msg
NotifyMsg <- notify
}
func (i *notifyServer) SendAllHardwareStatusBySocket(disk model2.Summary, list []model2.DriveUSB, mem map[string]interface{}, cpu map[string]interface{}, netList []model2.IOCountersStat) { func (i *notifyServer) SendAllHardwareStatusBySocket(disk model2.Summary, list []model2.DriveUSB, mem map[string]interface{}, cpu map[string]interface{}, netList []model2.IOCountersStat) {
body := make(map[string]interface{}) body := make(map[string]interface{})

View File

@ -1,3 +1,13 @@
/*
* @Author: LinkLeong link@icewhale.com
* @Date: 2022-07-12 09:48:56
* @LastEditors: LinkLeong
* @LastEditTime: 2022-07-15 10:58:54
* @FilePath: /CasaOS/service/service.go
* @Description:
* @Website: https://www.casaos.io
* Copyright (c) 2022 by icewhale, All Rights Reserved.
*/
package service package service
import ( import (
@ -23,7 +33,6 @@ type Repository interface {
Notify() NotifyServer Notify() NotifyServer
Rely() RelyService Rely() RelyService
System() SystemService System() SystemService
Shortcuts() ShortcutsService
} }
func NewService(db *gorm.DB) Repository { func NewService(db *gorm.DB) Repository {
@ -36,7 +45,6 @@ func NewService(db *gorm.DB) Repository {
notify: NewNotifyService(db), notify: NewNotifyService(db),
rely: NewRelyService(db), rely: NewRelyService(db),
system: NewSystemService(), system: NewSystemService(),
shortcuts: NewShortcutsService(db),
} }
} }
@ -50,15 +58,11 @@ type store struct {
notify NotifyServer notify NotifyServer
rely RelyService rely RelyService
system SystemService system SystemService
shortcuts ShortcutsService
} }
func (c *store) Rely() RelyService { func (c *store) Rely() RelyService {
return c.rely return c.rely
} }
func (c *store) Shortcuts() ShortcutsService {
return c.shortcuts
}
func (c *store) System() SystemService { func (c *store) System() SystemService {
return c.system return c.system

View File

@ -1,34 +0,0 @@
package service
import (
model2 "github.com/IceWhaleTech/CasaOS/service/model"
"gorm.io/gorm"
)
type ShortcutsService interface {
DeleteData(id string)
AddData(m model2.ShortcutsDBModel)
EditData(m model2.ShortcutsDBModel)
GetList() (list []model2.ShortcutsDBModel)
}
type shortcutsService struct {
db *gorm.DB
}
func (s *shortcutsService) AddData(m model2.ShortcutsDBModel) {
s.db.Create(&m)
}
func (s *shortcutsService) EditData(m model2.ShortcutsDBModel) {
s.db.Save(&m)
}
func (s *shortcutsService) DeleteData(id string) {
var m model2.ShortcutsDBModel
s.db.Where("id=?", id).Delete(&m)
}
func (s *shortcutsService) GetList() (list []model2.ShortcutsDBModel) {
s.db.Order("sort desc,id").Find(&list)
return list
}
func NewShortcutsService(db *gorm.DB) ShortcutsService {
return &shortcutsService{db: db}
}

View File

@ -24,7 +24,6 @@ import (
) )
type SystemService interface { type SystemService interface {
UpSystemConfig(str string, widget string)
UpdateSystemVersion(version string) UpdateSystemVersion(version string)
GetSystemConfigDebug() []string GetSystemConfigDebug() []string
GetCasaOSLogs(lineNumber int) string GetCasaOSLogs(lineNumber int) string
@ -54,6 +53,12 @@ type SystemService interface {
type systemService struct { type systemService struct {
} }
func (s *systemService) UpdateUSBAutoMount(state string) {
config.ServerInfo.USBAutoMount = state
config.Cfg.Section("server").Key("USBAutoMount").SetValue(state)
config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath)
}
func (c *systemService) MkdirAll(path string) (int, error) { func (c *systemService) MkdirAll(path string) (int, error) {
_, err := os.Stat(path) _, err := os.Stat(path)
if err == nil { if err == nil {
@ -66,7 +71,7 @@ func (c *systemService) MkdirAll(path string) (int, error) {
return common_err.FILE_OR_DIR_EXISTS, err return common_err.FILE_OR_DIR_EXISTS, err
} }
} }
return common_err.ERROR, err return common_err.SERVICE_ERROR, err
} }
func (c *systemService) RenameFile(oldF, newF string) (int, error) { func (c *systemService) RenameFile(oldF, newF string) (int, error) {
@ -77,12 +82,12 @@ func (c *systemService) RenameFile(oldF, newF string) (int, error) {
if os.IsNotExist(err) { if os.IsNotExist(err) {
err := os.Rename(oldF, newF) err := os.Rename(oldF, newF)
if err != nil { if err != nil {
return common_err.ERROR, err return common_err.SERVICE_ERROR, err
} }
return common_err.SUCCESS, nil return common_err.SUCCESS, nil
} }
} }
return common_err.ERROR, err return common_err.SERVICE_ERROR, err
} }
func (c *systemService) CreateFile(path string) (int, error) { func (c *systemService) CreateFile(path string) (int, error) {
_, err := os.Stat(path) _, err := os.Stat(path)
@ -94,7 +99,7 @@ func (c *systemService) CreateFile(path string) (int, error) {
return common_err.SUCCESS, nil return common_err.SUCCESS, nil
} }
} }
return common_err.ERROR, err return common_err.SERVICE_ERROR, err
} }
func (c *systemService) GetDeviceTree() string { func (c *systemService) GetDeviceTree() string {
return command2.ExecResultStr("source " + config.AppInfo.ShellPath + "/helper.sh ;GetDeviceTree") return command2.ExecResultStr("source " + config.AppInfo.ShellPath + "/helper.sh ;GetDeviceTree")
@ -232,28 +237,13 @@ func (s *systemService) ExecUSBAutoMountShell(state string) {
func (s *systemService) GetSystemConfigDebug() []string { func (s *systemService) GetSystemConfigDebug() []string {
return command2.ExecResultStrArray("source " + config.AppInfo.ShellPath + "/helper.sh ;GetSysInfo") return command2.ExecResultStrArray("source " + config.AppInfo.ShellPath + "/helper.sh ;GetSysInfo")
} }
func (s *systemService) UpSystemConfig(str string, widget string) {
if len(str) > 0 && str != config.SystemConfigInfo.ConfigStr {
config.Cfg.Section("system").Key("ConfigStr").SetValue(str)
config.SystemConfigInfo.ConfigStr = str
}
if len(widget) > 0 && widget != config.SystemConfigInfo.WidgetList {
config.Cfg.Section("system").Key("WidgetList").SetValue(widget)
config.SystemConfigInfo.WidgetList = widget
}
config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath)
}
func (s *systemService) UpAppOrderFile(str, id string) { func (s *systemService) UpAppOrderFile(str, id string) {
file.WriteToPath([]byte(str), config.AppInfo.DBPath+"/"+id, "app_order.json") file.WriteToPath([]byte(str), config.AppInfo.DBPath+"/"+id, "app_order.json")
} }
func (s *systemService) GetAppOrderFile(id string) []byte { func (s *systemService) GetAppOrderFile(id string) []byte {
return file.ReadFullFile(config.AppInfo.UserDataPath + "/" + id + "/app_order.json") return file.ReadFullFile(config.AppInfo.UserDataPath + "/" + id + "/app_order.json")
} }
func (s *systemService) UpdateUSBAutoMount(state string) {
config.ServerInfo.USBAutoMount = state
config.Cfg.Section("server").Key("USBAutoMount").SetValue(state)
config.Cfg.SaveTo(config.SystemConfigInfo.ConfigPath)
}
func (s *systemService) UpSystemPort(port string) { func (s *systemService) UpSystemPort(port string) {
if len(port) > 0 && port != config.ServerInfo.HttpPort { if len(port) > 0 && port != config.ServerInfo.HttpPort {
config.Cfg.Section("server").Key("HttpPort").SetValue(port) config.Cfg.Section("server").Key("HttpPort").SetValue(port)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 394 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 468 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 66 65" fill="#fff" fill-rule="evenodd" stroke="#000" stroke-linecap="round" stroke-linejoin="round"><style><![CDATA[.B{stroke:none}.C{fill-rule:nonzero}.D{stroke:#fff}.E{stroke-width:3.271}]]></style><use xlink:href="#B" x=".5" y=".5"/><defs><linearGradient id="A" x1="49.97%" y1="99.94%" x2="49.97%" y2="0.00%"><stop offset="0%" stop-color="#0882c8"/><stop offset="100%" stop-color="#26b6db"/></linearGradient></defs><symbol id="B" overflow="visible"><path d="M0 32C0 14.272 14.272 0 32 0s32 14.272 32 32-14.272 32-32 32S0 49.728 0 32z" fill="url(#A)" class="B C"/><path d="M8.177 31.891C8.177 18.693 18.802 8.068 32 8.068s23.823 10.625 23.823 23.823S45.198 55.714 32 55.714 8.177 45.089 8.177 31.891z" fill="none" class="D E"/><path d="M51.625 26.058c2.562.872 5.342-.491 6.215-3.053s-.491-5.342-3.053-6.215-5.342.491-6.215 3.053.491 5.342 3.053 6.215z" class="B C"/><path d="M53.206 21.479L36.797 35.108" fill="none" class="D E"/><path d="M42.304 49.608c-.218 2.671 1.745 5.07 4.47 5.342 2.726.218 5.07-1.744 5.343-4.47.218-2.671-1.745-5.07-4.47-5.343-2.726-.218-5.124 1.745-5.342 4.47z" class="B C"/><path d="M47.155 50.044L36.797 35.107" fill="none" class="D E"/><path d="M32.708 37.779c1.472 2.29 4.525 2.944 6.76 1.472 2.29-1.472 2.944-4.525 1.472-6.76-1.472-2.29-4.525-2.944-6.76-1.472-2.29 1.417-2.944 4.47-1.472 6.76zm-21.152-4.307c-2.344-1.363-5.342-.6-6.705 1.69-1.363 2.344-.6 5.342 1.69 6.705 2.344 1.363 5.342.6 6.705-1.69s.6-5.288-1.69-6.705z" class="B C"/><path d="M9.049 37.669l27.748-2.562" fill="none" class="D E"/></symbol></svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="88" width="88"> <path style="fill:#00adef;" d="m0,12.402,35.687-4.8602,0.0156,34.423-35.67,0.20313zm35.67,33.529,0.0277,34.453-35.67-4.9041-0.002-29.78zm4.3261-39.025,47.318-6.906,0,41.527-47.318,0.37565zm47.329,39.349-0.0111,41.34-47.318-6.6784-0.0663-34.739z"/> </svg>

Before

Width:  |  Height:  |  Size: 486 B

View File

@ -20,7 +20,7 @@
<title> <title>
CasaOS CasaOS
</title> </title>
<link href="/ui/css/10.f0cf5fc3.css" rel="prefetch"><link href="/ui/css/11.32be8789.css" rel="prefetch"><link href="/ui/css/12.ee780c90.css" rel="prefetch"><link href="/ui/css/13.dc77452d.css" rel="prefetch"><link href="/ui/css/14.daa8e8be.css" rel="prefetch"><link href="/ui/css/18.1f93b660.css" rel="prefetch"><link href="/ui/css/19.046fd3d8.css" rel="prefetch"><link href="/ui/css/3.623fa25f.css" rel="prefetch"><link href="/ui/css/9.f27e442b.css" rel="prefetch"><link href="/ui/js/0.js" rel="prefetch"><link href="/ui/js/1.js" rel="prefetch"><link href="/ui/js/10.js" rel="prefetch"><link href="/ui/js/11.js" rel="prefetch"><link href="/ui/js/12.js" rel="prefetch"><link href="/ui/js/13.js" rel="prefetch"><link href="/ui/js/14.js" rel="prefetch"><link href="/ui/js/15.js" rel="prefetch"><link href="/ui/js/16.js" rel="prefetch"><link href="/ui/js/17.js" rel="prefetch"><link href="/ui/js/18.js" rel="prefetch"><link href="/ui/js/19.js" rel="prefetch"><link href="/ui/js/2.js" rel="prefetch"><link href="/ui/js/20.js" rel="prefetch"><link href="/ui/js/3.js" rel="prefetch"><link href="/ui/js/4.js" rel="prefetch"><link href="/ui/js/5.js" rel="prefetch"><link href="/ui/js/6.js" rel="prefetch"><link href="/ui/js/7.js" rel="prefetch"><link href="/ui/js/8.js" rel="prefetch"><link href="/ui/js/9.js" rel="prefetch"><link href="/ui/css/app.1fb33240.css" rel="preload" as="style"><link href="/ui/css/vendors~app.6b5df7e4.css" rel="preload" as="style"><link href="/ui/js/app.js" rel="preload" as="script"><link href="/ui/js/vendors~app.js" rel="preload" as="script"><link href="/ui/css/vendors~app.6b5df7e4.css" rel="stylesheet"><link href="/ui/css/app.1fb33240.css" rel="stylesheet"></head> <link href="/ui/css/1.73b4186b.css" rel="prefetch"><link href="/ui/css/10.daa8e8be.css" rel="prefetch"><link href="/ui/css/11.232c3bcb.css" rel="prefetch"><link href="/ui/css/15.1f93b660.css" rel="prefetch"><link href="/ui/css/16.046fd3d8.css" rel="prefetch"><link href="/ui/css/5.ae1e42db.css" rel="prefetch"><link href="/ui/css/6.f02d5b96.css" rel="prefetch"><link href="/ui/css/7.32be8789.css" rel="prefetch"><link href="/ui/css/8.ee780c90.css" rel="prefetch"><link href="/ui/css/9.a00e5221.css" rel="prefetch"><link href="/ui/js/0.js" rel="prefetch"><link href="/ui/js/1.js" rel="prefetch"><link href="/ui/js/10.js" rel="prefetch"><link href="/ui/js/11.js" rel="prefetch"><link href="/ui/js/12.js" rel="prefetch"><link href="/ui/js/13.js" rel="prefetch"><link href="/ui/js/14.js" rel="prefetch"><link href="/ui/js/15.js" rel="prefetch"><link href="/ui/js/16.js" rel="prefetch"><link href="/ui/js/17.js" rel="prefetch"><link href="/ui/js/2.js" rel="prefetch"><link href="/ui/js/3.js" rel="prefetch"><link href="/ui/js/4.js" rel="prefetch"><link href="/ui/js/5.js" rel="prefetch"><link href="/ui/js/6.js" rel="prefetch"><link href="/ui/js/7.js" rel="prefetch"><link href="/ui/js/8.js" rel="prefetch"><link href="/ui/js/9.js" rel="prefetch"><link href="/ui/css/app.e3d6571d.css" rel="preload" as="style"><link href="/ui/css/vendors~app.6b5df7e4.css" rel="preload" as="style"><link href="/ui/js/app.js" rel="preload" as="script"><link href="/ui/js/vendors~app.js" rel="preload" as="script"><link href="/ui/css/vendors~app.6b5df7e4.css" rel="stylesheet"><link href="/ui/css/app.e3d6571d.css" rel="stylesheet"></head>
<body> <body>
<noscript> <noscript>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long