123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- 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
- }
|