config_list.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package config
  2. import (
  3. "os"
  4. "sort"
  5. "github.com/0xJacky/Nginx-UI/internal/nginx"
  6. "github.com/uozi-tech/cosy/logger"
  7. )
  8. type ConfigsSort struct {
  9. Key string
  10. Order string
  11. ConfigList []Config
  12. }
  13. func boolToInt(b bool) int {
  14. if b {
  15. return 1
  16. }
  17. return 0
  18. }
  19. func (c ConfigsSort) Len() int {
  20. return len(c.ConfigList)
  21. }
  22. func (c ConfigsSort) Less(i, j int) bool {
  23. flag := false
  24. switch c.Key {
  25. case "name":
  26. flag = c.ConfigList[i].Name > c.ConfigList[j].Name
  27. case "modified_at":
  28. flag = c.ConfigList[i].ModifiedAt.After(c.ConfigList[j].ModifiedAt)
  29. case "is_dir":
  30. flag = boolToInt(c.ConfigList[i].IsDir) > boolToInt(c.ConfigList[j].IsDir)
  31. case "status":
  32. flag = c.ConfigList[i].Status > c.ConfigList[j].Status
  33. case "env_group_id":
  34. flag = c.ConfigList[i].EnvGroupID > c.ConfigList[j].EnvGroupID
  35. }
  36. if c.Order == "asc" {
  37. flag = !flag
  38. }
  39. return flag
  40. }
  41. func (c ConfigsSort) Swap(i, j int) {
  42. c.ConfigList[i], c.ConfigList[j] = c.ConfigList[j], c.ConfigList[i]
  43. }
  44. func Sort(key string, order string, configs []Config) []Config {
  45. configsSort := ConfigsSort{
  46. Key: key,
  47. ConfigList: configs,
  48. Order: order,
  49. }
  50. sort.Sort(configsSort)
  51. return configsSort.ConfigList
  52. }
  53. func GetConfigList(relativePath string, filter func(file os.FileInfo) bool) ([]Config, error) {
  54. configFiles, err := os.ReadDir(nginx.GetConfPath(relativePath))
  55. if err != nil {
  56. return nil, err
  57. }
  58. configs := make([]Config, 0)
  59. for i := range configFiles {
  60. file := configFiles[i]
  61. fileInfo, err := file.Info()
  62. if err != nil {
  63. logger.Error("Get File Info Error", file.Name(), err)
  64. continue
  65. }
  66. if filter != nil && !filter(fileInfo) {
  67. continue
  68. }
  69. switch mode := fileInfo.Mode(); {
  70. case mode.IsRegular(): // regular file, not a hidden file
  71. if "." == file.Name()[0:1] {
  72. continue
  73. }
  74. case mode&os.ModeSymlink != 0: // is a symbol
  75. var targetPath string
  76. targetPath, err = os.Readlink(nginx.GetConfPath(relativePath, file.Name()))
  77. if err != nil {
  78. logger.Error("Read Symlink Error", targetPath, err)
  79. continue
  80. }
  81. var targetInfo os.FileInfo
  82. targetInfo, err = os.Stat(targetPath)
  83. if err != nil {
  84. logger.Error("Stat Error", targetPath, err)
  85. continue
  86. }
  87. // hide the file if it's target file is a directory
  88. if targetInfo.IsDir() {
  89. continue
  90. }
  91. }
  92. configs = append(configs, Config{
  93. Name: file.Name(),
  94. ModifiedAt: fileInfo.ModTime(),
  95. Size: fileInfo.Size(),
  96. IsDir: fileInfo.IsDir(),
  97. })
  98. }
  99. return configs, nil
  100. }