// Copyright 2022 The Goploy Authors. All rights reserved.
// Use of this source code is governed by a GPLv3-style
// license that can be found in the LICENSE file.
package server
import (
"bytes"
"encoding/csv"
"encoding/json"
"fmt"
"github.com/pkg/sftp"
log "github.com/sirupsen/logrus"
"github.com/zhenorzz/goploy/cmd/server/api"
"github.com/zhenorzz/goploy/cmd/server/api/middleware"
"github.com/zhenorzz/goploy/config"
"github.com/zhenorzz/goploy/internal/model"
"github.com/zhenorzz/goploy/internal/pkg"
"github.com/zhenorzz/goploy/internal/server"
"github.com/zhenorzz/goploy/internal/server/response"
"github.com/zhenorzz/goploy/internal/validator"
"io"
"net/http"
"os"
"path"
"regexp"
"strconv"
"strings"
"sync"
)
// Server struct
type Server api.API
func (s Server) Handler() []server.Route {
return []server.Route{
server.NewRoute("/server/getList", http.MethodGet, s.GetList).Permissions(config.ShowServerPage),
server.NewRoute("/server/getOption", http.MethodGet, s.GetOption),
server.NewRoute("/server/getBindProjectList", http.MethodGet, s.GetBindProjectList).Permissions(config.ShowServerPage),
server.NewRoute("/server/getPublicKey", http.MethodGet, s.GetPublicKey).Permissions(config.AddServer, config.EditServer).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/check", http.MethodPost, s.Check).Permissions(config.AddServer, config.EditServer).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/import", http.MethodPost, s.Import).Permissions(config.ImportCSV).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/add", http.MethodPost, s.Add).Permissions(config.AddServer).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/edit", http.MethodPut, s.Edit).Permissions(config.EditServer).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/toggle", http.MethodPut, s.Toggle).Permissions(config.EditServer).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/unbindProject", http.MethodDelete, s.UnbindProject).Permissions(config.UnbindServerProject).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/installAgent", http.MethodPost, s.InstallAgent).Permissions(config.InstallAgent).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/previewFile", http.MethodGet, s.PreviewFile).Permissions(config.SFTPPreviewFile).LogFunc(middleware.AddPreviewLog),
server.NewRoute("/server/downloadFile", http.MethodGet, s.DownloadFile).Permissions(config.SFTPDownloadFile).LogFunc(middleware.AddDownloadLog),
server.NewRoute("/server/uploadFile", http.MethodPost, s.UploadFile).Permissions(config.SFTPTransferFile).LogFunc(middleware.AddUploadLog),
server.NewRoute("/server/editFile", http.MethodPut, s.EditFile).Permissions(config.SFTPEditFile).LogFunc(middleware.AddEditLog),
server.NewRoute("/server/renameFile", http.MethodPut, s.RenameFile).Permissions(config.SFTPEditFile).LogFunc(middleware.AddRenameLog),
server.NewRoute("/server/copyFile", http.MethodPut, s.CopyFile).Permissions(config.SFTPUploadFile).LogFunc(middleware.AddCopyLog),
server.NewRoute("/server/deleteFile", http.MethodDelete, s.DeleteFile).Permissions(config.SFTPDeleteFile).LogFunc(middleware.AddDeleteLog),
server.NewRoute("/server/transferFile", http.MethodPost, s.TransferFile).Permissions(config.SFTPUploadFile),
server.NewRoute("/server/report", http.MethodGet, s.Report).Permissions(config.ShowServerMonitorPage),
server.NewRoute("/server/getAllMonitor", http.MethodGet, s.GetAllMonitor).Permissions(config.ShowServerMonitorPage),
server.NewRoute("/server/addMonitor", http.MethodPost, s.AddMonitor).Permissions(config.AddServerWarningRule).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/editMonitor", http.MethodPut, s.EditMonitor).Permissions(config.EditServerWarningRule).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/deleteMonitor", http.MethodDelete, s.DeleteMonitor).Permissions(config.DeleteServerWarningRule).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/getProcessList", http.MethodGet, s.GetProcessList).Permissions(config.ShowServerProcessPage),
server.NewRoute("/server/addProcess", http.MethodPost, s.AddProcess).Permissions(config.AddServerProcess).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/editProcess", http.MethodPut, s.EditProcess).Permissions(config.EditServerProcess).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/deleteProcess", http.MethodDelete, s.DeleteProcess).Permissions(config.DeleteServerProcess).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/execProcess", http.MethodPost, s.ExecProcess).Permissions(config.ShowServerProcessPage).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/execScript", http.MethodPost, s.ExecScript).Permissions(config.ShowServerScriptPage).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/getNginxConfigList", http.MethodGet, s.GetNginxConfigList).Permissions(config.ShowServerNginxPage),
server.NewRoute("/server/getNginxConfigContent", http.MethodGet, s.GetNginxConfContent).Permissions(config.ShowServerNginxPage),
server.NewRoute("/server/getNginxPath", http.MethodGet, s.GetNginxPath).Permissions(config.ShowServerNginxPage),
server.NewRoute("/server/manageNginx", http.MethodPost, s.ManageNginx).Permissions(config.ManageServerNginx).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/copyNginxConfig", http.MethodPost, s.CopyNginxConfig).Permissions(config.AddNginxConfig).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/editNginxConfig", http.MethodPut, s.EditNginxConfig).Permissions(config.EditNginxConfig).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/renameNginxConfig", http.MethodPut, s.RenameNginxConfig).Permissions(config.EditNginxConfig).LogFunc(middleware.AddOPLog),
server.NewRoute("/server/deleteNginxConfig", http.MethodDelete, s.DeleteNginxConfig).Permissions(config.DeleteNginxConfig).LogFunc(middleware.AddOPLog),
}
}
func (Server) GetList(gp *server.Goploy) server.Response {
serverList, err := model.Server{NamespaceID: gp.Namespace.ID}.GetList()
if err != nil {
return response.JSON{Code: response.Error, Message: err.Error()}
}
return response.JSON{
Data: struct {
Servers model.Servers `json:"list"`
}{Servers: serverList},
}
}
func (Server) GetOption(gp *server.Goploy) server.Response {
serverList, err := model.Server{NamespaceID: gp.Namespace.ID}.GetAll()
if err != nil {
return response.JSON{Code: response.Error, Message: err.Error()}
}
return response.JSON{
Data: struct {
Servers model.Servers `json:"list"`
}{Servers: serverList},
}
}
// GetBindProjectList lists all binding projects
// @Summary List all binding projects
// @Tags Server
// @Produce json
// @Param request query server.GetBindUserList.ReqData true "query params"
// @Success 200 {object} response.JSON{data=project.GetBindProjectList.RespData}
// @Router /server/getBindProjectList [get]
func (Server) GetBindProjectList(gp *server.Goploy) server.Response {
type ReqData struct {
ID int64 `json:"id" validate:"gt=0"`
}
var reqData ReqData
if err := gp.Decode(&reqData); err != nil {
return response.JSON{Code: response.Error, Message: err.Error()}
}
projectServers, err := model.ProjectServer{ServerID: reqData.ID}.GetBindProjectListByServerID()
if err != nil {
return response.JSON{Code: response.Error, Message: err.Error()}
}
type RespData struct {
ProjectServers model.ProjectServers `json:"list"`
}
return response.JSON{
Data: RespData{ProjectServers: projectServers},
}
}
func (Server) GetPublicKey(gp *server.Goploy) server.Response {
publicKeyPath := gp.URLQuery.Get("path")
contentByte, err := os.ReadFile(publicKeyPath + ".pub")
if err != nil {
return response.JSON{Code: response.Error, Message: err.Error()}
}
return response.JSON{
Data: struct {
Key string `json:"key"`
}{Key: string(contentByte)},
}
}
func (Server) Check(gp *server.Goploy) server.Response {
type ReqData struct {
IP string `json:"ip" validate:"required,ip|hostname