mirror of
https://github.com/0xJacky/nginx-ui.git
synced 2025-05-11 10:25:52 +02:00
121 lines
2.5 KiB
Go
121 lines
2.5 KiB
Go
package config
|
|
|
|
import (
|
|
"os"
|
|
"sort"
|
|
|
|
"github.com/0xJacky/Nginx-UI/internal/nginx"
|
|
"github.com/uozi-tech/cosy/logger"
|
|
)
|
|
|
|
type ConfigsSort struct {
|
|
Key string
|
|
Order string
|
|
ConfigList []Config
|
|
}
|
|
|
|
func boolToInt(b bool) int {
|
|
if b {
|
|
return 1
|
|
}
|
|
return 0
|
|
}
|
|
|
|
func (c ConfigsSort) Len() int {
|
|
return len(c.ConfigList)
|
|
}
|
|
|
|
func (c ConfigsSort) Less(i, j int) bool {
|
|
flag := false
|
|
|
|
switch c.Key {
|
|
case "name":
|
|
flag = c.ConfigList[i].Name > c.ConfigList[j].Name
|
|
case "modified_at":
|
|
flag = c.ConfigList[i].ModifiedAt.After(c.ConfigList[j].ModifiedAt)
|
|
case "is_dir":
|
|
flag = boolToInt(c.ConfigList[i].IsDir) > boolToInt(c.ConfigList[j].IsDir)
|
|
case "status":
|
|
flag = c.ConfigList[i].Status > c.ConfigList[j].Status
|
|
case "env_group_id":
|
|
flag = c.ConfigList[i].EnvGroupID > c.ConfigList[j].EnvGroupID
|
|
}
|
|
|
|
if c.Order == "asc" {
|
|
flag = !flag
|
|
}
|
|
|
|
return flag
|
|
}
|
|
|
|
func (c ConfigsSort) Swap(i, j int) {
|
|
c.ConfigList[i], c.ConfigList[j] = c.ConfigList[j], c.ConfigList[i]
|
|
}
|
|
|
|
func Sort(key string, order string, configs []Config) []Config {
|
|
configsSort := ConfigsSort{
|
|
Key: key,
|
|
ConfigList: configs,
|
|
Order: order,
|
|
}
|
|
|
|
sort.Sort(configsSort)
|
|
|
|
return configsSort.ConfigList
|
|
}
|
|
|
|
func GetConfigList(relativePath string, filter func(file os.FileInfo) bool) ([]Config, error) {
|
|
configFiles, err := os.ReadDir(nginx.GetConfPath(relativePath))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
configs := make([]Config, 0)
|
|
|
|
for i := range configFiles {
|
|
file := configFiles[i]
|
|
fileInfo, err := file.Info()
|
|
if err != nil {
|
|
logger.Error("Get File Info Error", file.Name(), err)
|
|
continue
|
|
}
|
|
|
|
if filter != nil && !filter(fileInfo) {
|
|
continue
|
|
}
|
|
|
|
switch mode := fileInfo.Mode(); {
|
|
case mode.IsRegular(): // regular file, not a hidden file
|
|
if "." == file.Name()[0:1] {
|
|
continue
|
|
}
|
|
case mode&os.ModeSymlink != 0: // is a symbol
|
|
var targetPath string
|
|
targetPath, err = os.Readlink(nginx.GetConfPath(relativePath, file.Name()))
|
|
if err != nil {
|
|
logger.Error("Read Symlink Error", targetPath, err)
|
|
continue
|
|
}
|
|
|
|
var targetInfo os.FileInfo
|
|
targetInfo, err = os.Stat(targetPath)
|
|
if err != nil {
|
|
logger.Error("Stat Error", targetPath, err)
|
|
continue
|
|
}
|
|
// hide the file if it's target file is a directory
|
|
if targetInfo.IsDir() {
|
|
continue
|
|
}
|
|
}
|
|
|
|
configs = append(configs, Config{
|
|
Name: file.Name(),
|
|
ModifiedAt: fileInfo.ModTime(),
|
|
Size: fileInfo.Size(),
|
|
IsDir: fileInfo.IsDir(),
|
|
})
|
|
}
|
|
|
|
return configs, nil
|
|
}
|