mirror of
https://github.com/0xJacky/nginx-ui.git
synced 2025-05-12 02:45:49 +02:00
142 lines
3 KiB
Go
142 lines
3 KiB
Go
package api
|
|
|
|
import (
|
|
"bufio"
|
|
"github.com/0xJacky/Nginx-UI/server/pkg/nginx"
|
|
"github.com/0xJacky/Nginx-UI/server/settings"
|
|
"github.com/0xJacky/Nginx-UI/template"
|
|
"github.com/gin-gonic/gin"
|
|
"io"
|
|
"net/http"
|
|
"path/filepath"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
func GetTemplate(c *gin.Context) {
|
|
content := `proxy_set_header Host $host;
|
|
proxy_set_header X-Real_IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
|
|
proxy_pass http://127.0.0.1:{{ HTTP01PORT }};
|
|
`
|
|
content = strings.ReplaceAll(content, "{{ HTTP01PORT }}",
|
|
settings.ServerSettings.HTTPChallengePort)
|
|
|
|
var ngxConfig *nginx.NgxConfig
|
|
|
|
ngxConfig = &nginx.NgxConfig{
|
|
Servers: []*nginx.NgxServer{
|
|
{
|
|
Directives: []*nginx.NgxDirective{
|
|
{
|
|
Directive: "listen",
|
|
Params: "80",
|
|
},
|
|
{
|
|
Directive: "listen",
|
|
Params: "[::]:80",
|
|
},
|
|
{
|
|
Directive: "server_name",
|
|
},
|
|
{
|
|
Directive: "root",
|
|
},
|
|
{
|
|
Directive: "index",
|
|
},
|
|
},
|
|
Locations: []*nginx.NgxLocation{
|
|
{
|
|
Path: "/.well-known/acme-challenge",
|
|
Content: content,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"message": "ok",
|
|
"template": ngxConfig.BuildConfig(),
|
|
"tokenized": ngxConfig,
|
|
})
|
|
}
|
|
|
|
func GetTemplateConfList(c *gin.Context) {
|
|
configs, err := template.DistFS.ReadDir("conf")
|
|
if err != nil {
|
|
ErrHandler(c, err)
|
|
return
|
|
}
|
|
type configItem struct {
|
|
Name string `json:"name"`
|
|
Description map[string]string `json:"description"`
|
|
Author string `json:"author"`
|
|
}
|
|
|
|
var configList []configItem
|
|
for _, config := range configs {
|
|
func() {
|
|
configListItem := configItem{
|
|
Description: make(map[string]string),
|
|
}
|
|
|
|
file, _ := template.DistFS.Open(filepath.Join("conf", config.Name()))
|
|
defer file.Close()
|
|
r := bufio.NewReader(file)
|
|
bytes, _, err := r.ReadLine()
|
|
if err == io.EOF {
|
|
return
|
|
}
|
|
line := strings.TrimSpace(string(bytes))
|
|
|
|
if line != "# Nginx UI Template Start" {
|
|
return
|
|
}
|
|
var content string
|
|
for {
|
|
bytes, _, err = r.ReadLine()
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
line = strings.TrimSpace(string(bytes))
|
|
if line == "# Nginx UI Template End" {
|
|
break
|
|
}
|
|
content += line + "\n"
|
|
}
|
|
re := regexp.MustCompile(`# (\S+): (.*)`)
|
|
matches := re.FindAllStringSubmatch(content, -1)
|
|
for _, match := range matches {
|
|
if len(match) < 3 {
|
|
continue
|
|
}
|
|
key := match[1]
|
|
switch {
|
|
case key == "Name":
|
|
configListItem.Name = match[2]
|
|
case key == "Author":
|
|
configListItem.Author = match[2]
|
|
case strings.Contains(key, "Description"):
|
|
re = regexp.MustCompile(`(\w+)\[(\w+)\]`)
|
|
matches = re.FindAllStringSubmatch(key, -1)
|
|
for _, m := range matches {
|
|
if len(m) < 3 {
|
|
continue
|
|
}
|
|
// lang => description
|
|
configListItem.Description[m[2]] = match[2]
|
|
}
|
|
}
|
|
}
|
|
|
|
configList = append(configList, configListItem)
|
|
}()
|
|
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"data": configList,
|
|
})
|
|
}
|