func loadFilter(image *image.Image, filterFilename string) error { filterFile, err := os.Open(filterFilename) if err != nil { return err } defer filterFile.Close() filterLines, err := readLines(filterFile) if err != nil { return errors.New("error reading filter: " + err.Error()) } image.Filter, err = filter.NewFilter(filterLines) return err }
func (t *rpcType) setConfiguration(request sub.SetConfigurationRequest, reply *sub.SetConfigurationResponse) error { var response sub.SetConfigurationResponse t.scannerConfiguration.FsScanContext.GetContext().SetSpeedPercent( request.ScanSpeedPercent) t.scannerConfiguration.NetworkReaderContext.SetSpeedPercent( request.NetworkSpeedPercent) newFilter, err := filter.NewFilter(request.ScanExclusionList) if err != nil { return err } t.scannerConfiguration.ScanFilter = newFilter response.Success = true *reply = response return nil }
func main() { flag.Parse() var err error bytesPerSecond, blocksPerSecond, err := fsbench.GetReadSpeed(*rootDir) if err != nil { fmt.Printf("Error! %s\n", err) return } var configuration scanner.Configuration configuration.ScanFilter, err = filter.NewFilter(nil) if err != nil { fmt.Printf("Unable to create empty filter\t%s\n", err) os.Exit(1) } configuration.FsScanContext = fsrateio.NewReaderContext(bytesPerSecond, blocksPerSecond, 0) if *scanSpeed != 0 { configuration.FsScanContext.GetContext().SetSpeedPercent(*scanSpeed) } fmt.Println(configuration.FsScanContext) syscall.Setpriority(syscall.PRIO_PROCESS, 0, 10) var prev_fs *scanner.FileSystem for iter := 0; *numScans < 0 || iter < *numScans; iter++ { timeStart := time.Now() fs, err := scanner.ScanFileSystem(*rootDir, *objectCache, &configuration) timeStop := time.Now() if iter > 0 { fmt.Println() } if err != nil { fmt.Printf("Error! %s\n", err) return } fmt.Print(fs) fmt.Printf("Total scanned: %s,\t", format.FormatBytes(fs.TotalDataBytes)) bytesPerSecond := uint64(float64(fs.TotalDataBytes) / timeStop.Sub(timeStart).Seconds()) fmt.Printf("%s/s\n", format.FormatBytes(bytesPerSecond)) if prev_fs != nil { if !scanner.CompareFileSystems(prev_fs, fs, os.Stdout) { fmt.Println("Scan results different from last run") } } runtime.GC() // Clean up before showing memory statistics. memstats.WriteMemoryStats(os.Stdout) if *debugFile != "" { file, err := os.Create(*debugFile) if err != nil { fmt.Printf("Error! %s\n", err) return } w := bufio.NewWriter(file) fs.DebugWrite(w, "") w.Flush() file.Close() } if *gobFile != "" { file, err := os.Create(*gobFile) if err != nil { fmt.Printf("Error creating: %s\t%s\n", *gobFile, err) os.Exit(1) } encoder := gob.NewEncoder(file) encoderStartTime := time.Now() encoder.Encode(fs) fmt.Printf("Encoder time: %s\n", time.Since(encoderStartTime)) file.Close() } prev_fs = fs time.Sleep(time.Duration(*interval) * time.Second) } }
func main() { flag.Parse() workingRootDir := path.Join(*subdDir, "root") objectsDir := path.Join(*subdDir, "objects") tmpDir := path.Join(*subdDir, "tmp") netbenchFilename := path.Join(*subdDir, "netbench") oldTriggersFilename := path.Join(*subdDir, "triggers.previous") if !createDirectory(workingRootDir) { os.Exit(1) } if !sanityCheck() { os.Exit(1) } if !createDirectory(objectsDir) { os.Exit(1) } if !createDirectory(tmpDir) { os.Exit(1) } if !mountTmpfs(tmpDir) { os.Exit(1) } if !unshareAndBind(workingRootDir) { os.Exit(1) } runtime.GOMAXPROCS(int(*maxThreads)) bytesPerSecond, blocksPerSecond, firstScan, ok := getCachedFsSpeed( workingRootDir, tmpDir) if !ok { os.Exit(1) } circularBuffer := logbuf.New(*logbufLines) logger := log.New(circularBuffer, "", log.LstdFlags) var configuration scanner.Configuration var err error configuration.ScanFilter, err = filter.NewFilter(constants.ScanExcludeList) if err != nil { fmt.Printf("Unable to set default scan exclusions\t%s\n", err) os.Exit(1) } configuration.FsScanContext = fsrateio.NewReaderContext(bytesPerSecond, blocksPerSecond, 0) defaultSpeed := configuration.FsScanContext.GetContext().SpeedPercent() if firstScan { configuration.FsScanContext.GetContext().SetSpeedPercent(100) } if *showStats { fmt.Println(configuration.FsScanContext) } var fsh scanner.FileSystemHistory fsChannel := scanner.StartScannerDaemon(workingRootDir, objectsDir, &configuration, logger) networkReaderContext := rateio.NewReaderContext( getCachedNetworkSpeed(netbenchFilename), constants.DefaultNetworkSpeedPercent, &rateio.ReadMeasurer{}) configuration.NetworkReaderContext = networkReaderContext rescanObjectCacheChannel := rpcd.Setup(&configuration, &fsh, objectsDir, networkReaderContext, netbenchFilename, oldTriggersFilename, logger) httpd.AddHtmlWriter(&fsh) httpd.AddHtmlWriter(&configuration) httpd.AddHtmlWriter(circularBuffer) html.RegisterHtmlWriterForPattern("/dumpFileSystem", "Scanned File System", &DumpableFileSystemHistory{&fsh}) err = httpd.StartServer(*portNum) if err != nil { fmt.Printf("Unable to create http server\t%s\n", err) os.Exit(1) } fsh.Update(nil) invalidateNextScanObjectCache := false sighupChannel := make(chan os.Signal) signal.Notify(sighupChannel, syscall.SIGHUP) sigtermChannel := make(chan os.Signal) signal.Notify(sigtermChannel, syscall.SIGTERM, syscall.SIGINT) writePidfile() for iter := 0; true; { select { case <-sighupChannel: err = syscall.Exec(os.Args[0], os.Args, os.Environ()) if err != nil { logger.Printf("Unable to Exec:%s\t%s\n", os.Args[0], err) } case <-sigtermChannel: gracefulCleanup() case fs := <-fsChannel: if *showStats { fmt.Printf("Completed cycle: %d\n", iter) } if invalidateNextScanObjectCache { fs.ScanObjectCache() invalidateNextScanObjectCache = false } fsh.Update(fs) iter++ runtime.GC() // An opportune time to take out the garbage. if *showStats { fmt.Print(fsh) fmt.Print(fsh.FileSystem()) memstats.WriteMemoryStats(os.Stdout) fmt.Println() } if firstScan { configuration.FsScanContext.GetContext().SetSpeedPercent( defaultSpeed) firstScan = false if *showStats { fmt.Println(configuration.FsScanContext) } } case <-rescanObjectCacheChannel: invalidateNextScanObjectCache = true fsh.UpdateObjectCacheOnly() } } }