config_list.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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 "status":
  30. flag = c.ConfigList[i].Status > c.ConfigList[j].Status
  31. case "namespace_id":
  32. flag = c.ConfigList[i].NamespaceID > c.ConfigList[j].NamespaceID
  33. }
  34. if c.ConfigList[i].IsDir != c.ConfigList[j].IsDir {
  35. // Sort folders and files separately
  36. flag = boolToInt(c.ConfigList[i].IsDir) < boolToInt(c.ConfigList[j].IsDir)
  37. }
  38. if c.Order == "asc" {
  39. flag = !flag
  40. }
  41. return flag
  42. }
  43. func (c ConfigsSort) Swap(i, j int) {
  44. c.ConfigList[i], c.ConfigList[j] = c.ConfigList[j], c.ConfigList[i]
  45. }
  46. func Sort(key string, order string, configs []Config) []Config {
  47. configsSort := ConfigsSort{
  48. Key: key,
  49. ConfigList: configs,
  50. Order: order,
  51. }
  52. sort.Sort(configsSort)
  53. return configsSort.ConfigList
  54. }
  55. func GetConfigList(relativePath string, filter func(file os.FileInfo) bool) ([]Config, error) {
  56. configFiles, err := os.ReadDir(nginx.GetConfPath(relativePath))
  57. if err != nil {
  58. return nil, err
  59. }
  60. configs := make([]Config, 0)
  61. for i := range configFiles {
  62. file := configFiles[i]
  63. fileInfo, err := file.Info()
  64. if err != nil {
  65. logger.Error("Get File Info Error", file.Name(), err)
  66. continue
  67. }
  68. if filter != nil && !filter(fileInfo) {
  69. continue
  70. }
  71. switch mode := fileInfo.Mode(); {
  72. case mode.IsRegular(): // regular file, not a hidden file
  73. if "." == file.Name()[0:1] {
  74. continue
  75. }
  76. case mode&os.ModeSymlink != 0: // is a symbol
  77. var targetPath string
  78. targetPath, err = os.Readlink(nginx.GetConfPath(relativePath, file.Name()))
  79. if err != nil {
  80. logger.Error("Read Symlink Error", targetPath, err)
  81. continue
  82. }
  83. var targetInfo os.FileInfo
  84. targetInfo, err = os.Stat(targetPath)
  85. if err != nil {
  86. logger.Error("Stat Error", targetPath, err)
  87. continue
  88. }
  89. // hide the file if it's target file is a directory
  90. if targetInfo.IsDir() {
  91. continue
  92. }
  93. }
  94. configs = append(configs, Config{
  95. Name: file.Name(),
  96. ModifiedAt: fileInfo.ModTime(),
  97. Size: fileInfo.Size(),
  98. IsDir: fileInfo.IsDir(),
  99. })
  100. }
  101. return configs, nil
  102. }