33acfababd
Added CasaOS own file manager, now you can browse, upload, download files from the system, even edit code online, preview photos and videos through it. It will appear in the first position of Apps. Added CPU core count display and memory capacity display.
254 lines
7.8 KiB
Go
254 lines
7.8 KiB
Go
package v1
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/IceWhaleTech/CasaOS/model"
|
|
"github.com/IceWhaleTech/CasaOS/pkg/utils/file"
|
|
oasis_err2 "github.com/IceWhaleTech/CasaOS/pkg/utils/oasis_err"
|
|
port2 "github.com/IceWhaleTech/CasaOS/pkg/utils/port"
|
|
"github.com/IceWhaleTech/CasaOS/service"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// @Summary 获取远程列表
|
|
// @Produce application/json
|
|
// @Accept application/json
|
|
// @Tags app
|
|
// @Param index query int false "页码"
|
|
// @Param size query int false "每页数量"
|
|
// @Param category_id query int false "分类id"
|
|
// @Param type query string false "rank,new"
|
|
// @Param key query string false "search key"
|
|
// @Security ApiKeyAuth
|
|
// @Success 200 {string} string "ok"
|
|
// @Router /app/list [get]
|
|
func AppList(c *gin.Context) {
|
|
|
|
//service.MyService.Docker().DockerContainerCommit("test2")
|
|
|
|
index := c.DefaultQuery("index", "1")
|
|
size := c.DefaultQuery("size", "10000")
|
|
t := c.DefaultQuery("type", "rank")
|
|
categoryId := c.DefaultQuery("category_id", "0")
|
|
key := c.DefaultQuery("key", "")
|
|
language := c.GetHeader("Language")
|
|
recommend, list, community := service.MyService.Casa().GetServerList(index, size, t, categoryId, key, language)
|
|
// for i := 0; i < len(recommend); i++ {
|
|
// ct, _ := service.MyService.Docker().DockerListByImage(recommend[i].Image, recommend[i].ImageVersion)
|
|
// if ct != nil {
|
|
// recommend[i].State = ct.State
|
|
// }
|
|
// }
|
|
// for i := 0; i < len(list); i++ {
|
|
// ct, _ := service.MyService.Docker().DockerListByImage(list[i].Image, list[i].ImageVersion)
|
|
// if ct != nil {
|
|
// list[i].State = ct.State
|
|
// }
|
|
// }
|
|
// for i := 0; i < len(community); i++ {
|
|
// ct, _ := service.MyService.Docker().DockerListByImage(community[i].Image, community[i].ImageVersion)
|
|
// if ct != nil {
|
|
// community[i].State = ct.State
|
|
// }
|
|
// }
|
|
data := make(map[string]interface{}, 3)
|
|
data["recommend"] = recommend
|
|
data["list"] = list
|
|
data["community"] = community
|
|
|
|
c.JSON(http.StatusOK, &model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: data})
|
|
}
|
|
|
|
// @Summary 获取一个可用端口
|
|
// @Produce application/json
|
|
// @Accept application/json
|
|
// @Tags app
|
|
// @Param type query string true "端口类型 udp/tcp"
|
|
// @Security ApiKeyAuth
|
|
// @Success 200 {string} string "ok"
|
|
// @Router /app/getport [get]
|
|
func GetPort(c *gin.Context) {
|
|
t := c.DefaultQuery("type", "tcp")
|
|
var p int
|
|
ok := true
|
|
for ok {
|
|
p, _ = port2.GetAvailablePort(t)
|
|
ok = !port2.IsPortAvailable(p, t)
|
|
}
|
|
c.JSON(http.StatusOK, &model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: p})
|
|
}
|
|
|
|
// @Summary 检查端口是否可用
|
|
// @Produce application/json
|
|
// @Accept application/json
|
|
// @Tags app
|
|
// @Param port path int true "端口号"
|
|
// @Param type query string true "端口类型 udp/tcp"
|
|
// @Security ApiKeyAuth
|
|
// @Success 200 {string} string "ok"
|
|
// @Router /app/check/{port} [get]
|
|
func PortCheck(c *gin.Context) {
|
|
p, _ := strconv.Atoi(c.Param("port"))
|
|
t := c.DefaultQuery("type", "tcp")
|
|
c.JSON(http.StatusOK, &model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: port2.IsPortAvailable(p, t)})
|
|
}
|
|
|
|
// @Summary 我的应用列表
|
|
// @Produce application/json
|
|
// @Accept application/json
|
|
// @Tags app
|
|
// @Security ApiKeyAuth
|
|
// @Param index query int false "index"
|
|
// @Param size query int false "size"
|
|
// @Param position query bool false "是否是首页应用"
|
|
// @Success 200 {string} string "ok"
|
|
// @Router /app/mylist [get]
|
|
func MyAppList(c *gin.Context) {
|
|
index, _ := strconv.Atoi(c.DefaultQuery("index", "1"))
|
|
size, _ := strconv.Atoi(c.DefaultQuery("size", "0"))
|
|
position, _ := strconv.ParseBool(c.DefaultQuery("position", "true"))
|
|
list := service.MyService.App().GetMyList(index, size, position)
|
|
c.JSON(http.StatusOK, &model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: list})
|
|
}
|
|
|
|
// @Summary my app hardware usage list
|
|
// @Produce application/json
|
|
// @Accept application/json
|
|
// @Tags app
|
|
// @Security ApiKeyAuth
|
|
// @Success 200 {string} string "ok"
|
|
// @Router /app/usage [get]
|
|
func AppUsageList(c *gin.Context) {
|
|
list := service.MyService.App().GetHardwareUsage()
|
|
c.JSON(http.StatusOK, &model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: list})
|
|
}
|
|
|
|
// @Summary 应用详情
|
|
// @Produce application/json
|
|
// @Accept application/json
|
|
// @Tags app
|
|
// @Param id path int true "id"
|
|
// @Security ApiKeyAuth
|
|
// @Success 200 {string} string "ok"
|
|
// @Router /app/appinfo/{id} [get]
|
|
func AppInfo(c *gin.Context) {
|
|
|
|
id := c.Param("id")
|
|
language := c.GetHeader("Language")
|
|
info := service.MyService.Casa().GetServerAppInfo(id, "", language)
|
|
if info.NetworkModel != "host" {
|
|
for i := 0; i < len(info.Ports); i++ {
|
|
if p, _ := strconv.Atoi(info.Ports[i].ContainerPort); port2.IsPortAvailable(p, info.Ports[i].Protocol) {
|
|
info.Ports[i].CommendPort = strconv.Itoa(p)
|
|
} else {
|
|
if info.Ports[i].Protocol == "tcp" {
|
|
if p, err := port2.GetAvailablePort("tcp"); err == nil {
|
|
info.Ports[i].CommendPort = strconv.Itoa(p)
|
|
}
|
|
} else if info.Ports[i].Protocol == "upd" {
|
|
if p, err := port2.GetAvailablePort("udp"); err == nil {
|
|
info.Ports[i].CommendPort = strconv.Itoa(p)
|
|
}
|
|
}
|
|
}
|
|
|
|
if info.Ports[i].Type == 0 {
|
|
info.PortMap = info.Ports[i].CommendPort
|
|
}
|
|
}
|
|
} else {
|
|
for i := 0; i < len(info.Ports); i++ {
|
|
if info.Ports[i].Type == 0 {
|
|
info.PortMap = info.Ports[i].ContainerPort
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
for i := 0; i < len(info.Devices); i++ {
|
|
if !file.CheckNotExist(info.Devices[i].ContainerPath) {
|
|
info.Devices[i].Path = info.Devices[i].ContainerPath
|
|
}
|
|
}
|
|
// if len(info.Tip) > 0 {
|
|
// info.Tip = env_helper.ReplaceStringDefaultENV(info.Tip)
|
|
// }
|
|
|
|
// portOrder := func(c1, c2 *model.Ports) bool {
|
|
// return c1.Type < c2.Type
|
|
// }
|
|
|
|
// envOrder := func(c1, c2 *model.Envs) bool {
|
|
// return c1.Type < c2.Type
|
|
// }
|
|
|
|
// volOrder := func(c1, c2 *model.Volume) bool {
|
|
// return c1.Type < c2.Type
|
|
// }
|
|
|
|
// devOrder := func(c1, c2 *model.Devices) bool {
|
|
// return c1.Type < c2.Type
|
|
// }
|
|
|
|
//sort
|
|
// if info.NetworkModel != "host" {
|
|
// sort.PortsSort(portOrder).Sort(info.Configures.TcpPorts)
|
|
// sort.PortsSort(portOrder).Sort(info.Configures.UdpPorts)
|
|
// }
|
|
|
|
// sort.EnvSort(envOrder).Sort(info.Envs)
|
|
// sort.VolSort(volOrder).Sort(info.Volumes.([]model.PathMap))
|
|
// sort.DevSort(devOrder).Sort(info.Devices)
|
|
|
|
info.MaxMemory = service.MyService.ZiMa().GetMemInfo().Total >> 20
|
|
|
|
c.JSON(http.StatusOK, &model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: info})
|
|
}
|
|
|
|
// @Summary 获取远程分类列表
|
|
// @Produce application/json
|
|
// @Accept application/json
|
|
// @Tags app
|
|
// @Security ApiKeyAuth
|
|
// @Success 200 {string} string "ok"
|
|
// @Router /app/category [get]
|
|
func CategoryList(c *gin.Context) {
|
|
list := service.MyService.Casa().GetServerCategoryList()
|
|
var count uint = 0
|
|
for _, category := range list {
|
|
count += category.Count
|
|
}
|
|
|
|
rear := append([]model.ServerCategoryList{}, list[0:]...)
|
|
list = append(list[:0], model.ServerCategoryList{Count: count, Name: "All", Font: "apps"})
|
|
list = append(list, rear...)
|
|
c.JSON(http.StatusOK, &model.Result{Success: oasis_err2.SUCCESS, Message: oasis_err2.GetMsg(oasis_err2.SUCCESS), Data: list})
|
|
}
|
|
|
|
// @Summary 分享该应用配置
|
|
// @Produce application/json
|
|
// @Accept application/json
|
|
// @Tags app
|
|
// @Security ApiKeyAuth
|
|
// @Success 200 {string} string "ok"
|
|
// @Router /app/share [post]
|
|
func ShareAppFile(c *gin.Context) {
|
|
str, _ := ioutil.ReadAll(c.Request.Body)
|
|
content := service.MyService.Casa().ShareAppFile(str)
|
|
c.JSON(http.StatusOK, json.RawMessage(content))
|
|
}
|
|
|
|
// @Summary Resource Usage
|
|
// @Produce application/json
|
|
// @Accept application/json
|
|
// @Tags app
|
|
// @Security ApiKeyAuth
|
|
// @Success 200 {string} string "ok"
|
|
// @Router /app/share [post]
|
|
func AppListResourceUsage() {
|
|
|
|
}
|