github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/sub/scanner/api.go (about) 1 package scanner 2 3 import ( 4 "fmt" 5 "io" 6 "sync" 7 "time" 8 9 "github.com/Cloud-Foundations/Dominator/lib/cpulimiter" 10 "github.com/Cloud-Foundations/Dominator/lib/filesystem/scanner" 11 "github.com/Cloud-Foundations/Dominator/lib/filter" 12 "github.com/Cloud-Foundations/Dominator/lib/format" 13 "github.com/Cloud-Foundations/Dominator/lib/fsrateio" 14 "github.com/Cloud-Foundations/Dominator/lib/log" 15 "github.com/Cloud-Foundations/Dominator/lib/objectcache" 16 "github.com/Cloud-Foundations/Dominator/lib/rateio" 17 "github.com/Cloud-Foundations/tricorder/go/tricorder" 18 ) 19 20 type Configuration struct { 21 CpuLimiter *cpulimiter.CpuLimiter 22 DefaultCpuPercent uint 23 FsScanContext *fsrateio.ReaderContext 24 NetworkReaderContext *rateio.ReaderContext 25 ScanFilter *filter.Filter 26 } 27 28 func (configuration *Configuration) BoostCpuLimit(logger log.Logger) { 29 configuration.boostCpuLimit(logger) 30 } 31 32 func (configuration *Configuration) RegisterMetrics( 33 dir *tricorder.DirectorySpec) error { 34 return configuration.registerMetrics(dir) 35 } 36 37 func (configuration *Configuration) RestoreCpuLimit(logger log.Logger) { 38 configuration.restoreCpuLimit(logger) 39 } 40 41 func (configuration *Configuration) WriteHtml(writer io.Writer) { 42 configuration.writeHtml(writer) 43 } 44 45 type FileSystemHistory struct { 46 rwMutex sync.RWMutex 47 fileSystem *FileSystem 48 scanCount uint64 49 generationCount uint64 50 timeOfLastScan time.Time 51 durationOfLastScan time.Duration 52 timeOfLastChange time.Time 53 } 54 55 func (fsh *FileSystemHistory) DurationOfLastScan() time.Duration { 56 fsh.rwMutex.RLock() 57 defer fsh.rwMutex.RUnlock() 58 return fsh.durationOfLastScan 59 } 60 61 func (fsh *FileSystemHistory) FileSystem() *FileSystem { 62 fsh.rwMutex.RLock() 63 defer fsh.rwMutex.RUnlock() 64 return fsh.fileSystem 65 } 66 67 func (fsh *FileSystemHistory) GenerationCount() uint64 { 68 fsh.rwMutex.RLock() 69 defer fsh.rwMutex.RUnlock() 70 return fsh.generationCount 71 } 72 73 func (fsh *FileSystemHistory) ScanCount() uint64 { 74 fsh.rwMutex.RLock() 75 defer fsh.rwMutex.RUnlock() 76 return fsh.scanCount 77 } 78 79 func (fsh *FileSystemHistory) String() string { 80 fsh.rwMutex.RLock() 81 defer fsh.rwMutex.RUnlock() 82 return fmt.Sprintf("GenerationCount=%d\n", fsh.generationCount) 83 } 84 85 func (fsh *FileSystemHistory) Update(newFS *FileSystem) { 86 fsh.update(newFS) 87 } 88 89 func (fsh *FileSystemHistory) UpdateObjectCacheOnly() error { 90 return fsh.updateObjectCacheOnly() 91 } 92 93 func (fsh *FileSystemHistory) WriteHtml(writer io.Writer) { 94 fsh.rwMutex.RLock() 95 defer fsh.rwMutex.RUnlock() 96 fsh.writeHtml(writer) 97 } 98 99 type FileSystem struct { 100 configuration *Configuration 101 rootDirectoryName string 102 scanner.FileSystem 103 cacheDirectoryName string 104 objectcache.ObjectCache 105 } 106 107 func ScanFileSystem(rootDirectoryName string, cacheDirectoryName string, 108 configuration *Configuration) (*FileSystem, error) { 109 return scanFileSystem(rootDirectoryName, cacheDirectoryName, configuration, 110 &FileSystem{}) 111 } 112 113 func (fs *FileSystem) ScanObjectCache() error { 114 return fs.scanObjectCache() 115 } 116 117 func (fs *FileSystem) Configuration() *Configuration { 118 return fs.configuration 119 } 120 121 func (fs *FileSystem) RootDirectoryName() string { 122 return fs.rootDirectoryName 123 } 124 125 func (fs *FileSystem) String() string { 126 return fmt.Sprintf("Tree: %d inodes, total file size: %s, number of regular inodes: %d\nObjectCache: %d objects\n", 127 len(fs.InodeTable), 128 format.FormatBytes(fs.TotalDataBytes), 129 fs.NumRegularInodes, 130 len(fs.ObjectCache)) 131 } 132 133 func (fs *FileSystem) WriteHtml(writer io.Writer) { 134 fs.writeHtml(writer) 135 } 136 137 func CompareFileSystems(left, right *FileSystem, logWriter io.Writer) bool { 138 return compareFileSystems(left, right, logWriter) 139 } 140 141 func StartScannerDaemon(rootDirectoryName string, cacheDirectoryName string, 142 configuration *Configuration, logger log.Logger) ( 143 <-chan *FileSystem, func(disableScanner bool)) { 144 return startScannerDaemon(rootDirectoryName, cacheDirectoryName, 145 configuration, logger) 146 } 147 148 func StartScanning(rootDirectoryName string, cacheDirectoryName string, 149 configuration *Configuration, logger log.Logger, 150 mainFunc func(<-chan *FileSystem, func(disableScanner bool))) { 151 startScanning(rootDirectoryName, cacheDirectoryName, configuration, logger, 152 mainFunc) 153 }