154 lines
3.3 KiB
Go
154 lines
3.3 KiB
Go
package main
|
||
|
||
import (
|
||
"embed"
|
||
"flag"
|
||
"fmt"
|
||
"go_dreamfactory/cmd/upgrade/tools"
|
||
"html/template"
|
||
"io/ioutil"
|
||
"log"
|
||
"net/http"
|
||
"path"
|
||
"sort"
|
||
"strings"
|
||
"time"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
//go:embed views/*
|
||
var f embed.FS
|
||
|
||
var version = "0.0.1"
|
||
|
||
func main() {
|
||
|
||
host := flag.String("host", "10.0.0.9", "Host")
|
||
port := flag.String("port", "8080", "Port")
|
||
uploadsDir := flag.String("uploadsDir", "./uploads", "上传文件存储地址")
|
||
wwwDir := flag.String("wwwDir", "./www", "www服务地址,即解压地址")
|
||
|
||
flag.Parse()
|
||
|
||
gin.SetMode(gin.ReleaseMode)
|
||
r := gin.Default()
|
||
r.Static("/prd", "./www")
|
||
tmpl := template.Must(template.New("").ParseFS(f, "views/*"))
|
||
r.SetHTMLTemplate(tmpl)
|
||
|
||
r.GET("/version", func(c *gin.Context) {
|
||
c.JSON(http.StatusOK, gin.H{
|
||
"version": version,
|
||
})
|
||
})
|
||
|
||
r.GET("/", func(c *gin.Context) {
|
||
fmt.Println(tmpl.DefinedTemplates())
|
||
c.HTML(http.StatusOK, "index.html", nil)
|
||
})
|
||
|
||
r.GET("/upload", func(c *gin.Context) {
|
||
fmt.Println(tmpl.DefinedTemplates())
|
||
c.HTML(http.StatusOK, "upload.html", nil)
|
||
})
|
||
|
||
r.POST("/upload", func(c *gin.Context) {
|
||
f, err := c.FormFile("file")
|
||
if err != nil {
|
||
c.JSON(http.StatusBadRequest, gin.H{
|
||
"error": err.Error(),
|
||
})
|
||
}
|
||
|
||
//从上传的文件名获取到版本号
|
||
s := strings.SplitN(f.Filename, "-", 2)
|
||
if len(s) != 2 {
|
||
c.JSON(http.StatusBadRequest, gin.H{
|
||
"error": "上传的文件名中没有包含版本号 eg. update.zip-0.0.1",
|
||
})
|
||
return
|
||
}
|
||
version = s[1] //设置版本号
|
||
|
||
dst := path.Join(*uploadsDir, f.Filename)
|
||
err = c.SaveUploadedFile(f, dst)
|
||
if err != nil {
|
||
c.JSON(http.StatusInternalServerError, gin.H{
|
||
"error": err.Error(),
|
||
})
|
||
}
|
||
_, err = tools.Unzip(dst, *wwwDir)
|
||
if err != nil {
|
||
c.JSON(http.StatusInternalServerError, gin.H{
|
||
"error": err.Error(),
|
||
})
|
||
}
|
||
|
||
c.JSON(http.StatusOK, gin.H{
|
||
"msg": "upload success",
|
||
"url": strings.Join([]string{"http://" + *host + ":" + *port, "/prd/", strings.Split(f.Filename, ".")[0], "/index.html"}, ""),
|
||
})
|
||
})
|
||
|
||
r.GET("/dirs", func(c *gin.Context) {
|
||
dir, err := ioutil.ReadDir(*wwwDir)
|
||
if err != nil {
|
||
c.JSON(http.StatusInternalServerError, gin.H{
|
||
"error": err.Error(),
|
||
})
|
||
}
|
||
|
||
type Item struct {
|
||
Name string `json:"name"`
|
||
Url string `json:"url"`
|
||
DateTime string `json:"dateTime"`
|
||
}
|
||
|
||
var dirs []Item
|
||
for _, f := range dir {
|
||
// if f.IsDir() && len(f.Name()) > 0 && f.Name() != "__MACOSX" {
|
||
dirs = append(dirs, Item{
|
||
Name: f.Name(),
|
||
Url: strings.Join([]string{"http://" + *host + ":" + *port, "/prd/", f.Name()}, ""),
|
||
DateTime: f.ModTime().Format(time.RFC3339),
|
||
})
|
||
// }
|
||
}
|
||
|
||
// 排序
|
||
sort.SliceStable(dirs, func(i, j int) bool {
|
||
return dirs[i].DateTime > dirs[j].DateTime
|
||
})
|
||
|
||
c.JSON(http.StatusOK, gin.H{
|
||
"dirs": dirs,
|
||
})
|
||
})
|
||
|
||
// 同步配置
|
||
// 接受客户端上传的文件覆盖服务器上文件
|
||
r.POST("/sync", func(c *gin.Context) {
|
||
f, err := c.FormFile("file")
|
||
if err != nil {
|
||
log.Print(err)
|
||
return
|
||
}
|
||
if f.Filename!="config.json"{
|
||
log.Print("上传的配置文件不是config.json")
|
||
return
|
||
}
|
||
dst := path.Join(*wwwDir, f.Filename)
|
||
err = c.SaveUploadedFile(f, dst)
|
||
if err != nil {
|
||
log.Print(err)
|
||
return
|
||
}
|
||
})
|
||
|
||
err := r.Run("0.0.0.0:" + *port)
|
||
if err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
}
|