master
go 91 lines 1.85 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package filecheck
4
5 import (
6 "fmt"
7 "os"
8 "path/filepath"
9 "time"
10 )
11
12 func (c *Collector) collectDirs(mx map[string]int64) {
13 now := time.Now()
14
15 if c.isTimeToDiscoverDirs(now) {
16 c.lastDiscDirsTime = now
17 c.curDirs = c.discoveryDirs()
18 }
19
20 var infos []*statInfo
21
22 for _, dir := range c.curDirs {
23 si := getStatInfo(dir)
24 infos = append(infos, si)
25
26 c.collectDir(mx, si, now)
27 }
28
29 c.updateDirCharts(infos)
30 }
31
32 func (c *Collector) collectDir(mx map[string]int64, si *statInfo, now time.Time) {
33 px := fmt.Sprintf("dir_%s_", si.path)
34
35 mx[px+"existence_status_exist"] = 0
36 mx[px+"existence_status_not_exist"] = 0
37 if !si.exists {
38 mx[px+"existence_status_not_exist"] = 1
39 } else {
40 mx[px+"existence_status_exist"] = 1
41 }
42
43 if si.fi == nil || !si.fi.IsDir() {
44 return
45 }
46
47 mx[px+"mtime_ago"] = int64(now.Sub(si.fi.ModTime()).Seconds())
48
49 if v, err := calcFilesInDir(si.path); err == nil {
50 mx[px+"files_count"] = v
51 }
52 if c.Dirs.CollectDirSize {
53 if v, err := calcDirSize(si.path); err == nil {
54 mx[px+"size_bytes"] = v
55 }
56 }
57 }
58
59 func (c *Collector) discoveryDirs() (dirs []string) {
60 return discoverFilesOrDirs(c.Dirs.Include, func(v string, fi os.FileInfo) bool {
61 return fi.IsDir() && !c.dirsFilter.MatchString(v)
62 })
63 }
64
65 func (c *Collector) isTimeToDiscoverDirs(now time.Time) bool {
66 return now.After(c.lastDiscDirsTime.Add(c.DiscoveryEvery.Duration()))
67 }
68
69 func calcFilesInDir(dirPath string) (int64, error) {
70 f, err := os.Open(dirPath)
71 if err != nil {
72 return 0, err
73 }
74 defer func() { _ = f.Close() }()
75 names, err := f.Readdirnames(-1)
76 return int64(len(names)), err
77 }
78
79 func calcDirSize(dirPath string) (int64, error) {
80 var size int64
81 err := filepath.Walk(dirPath, func(_ string, fi os.FileInfo, err error) error {
82 if err != nil {
83 return err
84 }
85 if !fi.IsDir() {
86 size += fi.Size()
87 }
88 return nil
89 })
90 return size, err
91 }