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  }