github.com/Cloud-Foundations/Dominator@v0.3.4/cmd/imagetool/scanFilteredFiles.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  	"path/filepath"
     8  	"syscall"
     9  
    10  	"github.com/Cloud-Foundations/Dominator/lib/filter"
    11  	"github.com/Cloud-Foundations/Dominator/lib/log"
    12  	"github.com/Cloud-Foundations/Dominator/lib/wsyscall"
    13  )
    14  
    15  func scanFilteredFilesSubcommand(args []string, logger log.DebugLogger) error {
    16  	if err := scanFilteredFiles(args[0], args[1], logger); err != nil {
    17  		return fmt.Errorf("error scanning filtered files: %s", err)
    18  	}
    19  	return nil
    20  }
    21  
    22  func scanFilteredFiles(imageName, dirName string,
    23  	logger log.DebugLogger) error {
    24  	scanFilter, err := filter.New(scanExcludeList)
    25  	if err != nil {
    26  		return err
    27  	}
    28  	img, err := getTypedImageMetadata(imageName)
    29  	if err != nil {
    30  		return err
    31  	}
    32  	rootDir, err := ioutil.TempDir("", "")
    33  	if err != nil {
    34  		return err
    35  	}
    36  	defer os.Remove(rootDir)
    37  	errorChannel := make(chan error)
    38  	go func() {
    39  		errorChannel <- scanFilteredRoot(scanFilter, img.Filter, dirName,
    40  			rootDir, logger)
    41  	}()
    42  	return <-errorChannel
    43  }
    44  
    45  func scanFilteredRoot(scanFilter, imageFilter *filter.Filter,
    46  	dirName, rootDir string, logger log.DebugLogger) error {
    47  	return walkFilteredRoot(scanFilter, imageFilter, dirName, rootDir,
    48  		func(path string, fi os.FileInfo) error {
    49  			fmt.Println(path)
    50  			return nil
    51  		},
    52  		logger)
    53  }
    54  
    55  func walkFilteredRoot(scanFilter, imageFilter *filter.Filter,
    56  	dirName, rootDir string,
    57  	walkFunc func(path string, fi os.FileInfo) error,
    58  	logger log.DebugLogger) error {
    59  	if err := wsyscall.UnshareMountNamespace(); err != nil {
    60  		return fmt.Errorf("unable to unshare mount namesace: %s", err)
    61  	}
    62  	syscall.Unmount(rootDir, 0)
    63  	err := wsyscall.Mount(dirName, rootDir, "", wsyscall.MS_BIND, "")
    64  	if err != nil {
    65  		return fmt.Errorf("unable to bind mount %s to %s: %s",
    66  			dirName, rootDir, err)
    67  	}
    68  	logger.Debugf(0, "scanning directory: %s\n", dirName)
    69  	startPos := len(rootDir)
    70  	return filepath.Walk(rootDir,
    71  		func(path string, fi os.FileInfo, err error) error {
    72  			if err != nil {
    73  				return err
    74  			}
    75  			path = path[startPos:]
    76  			if scanFilter.Match(path) {
    77  				return nil
    78  			}
    79  			if imageFilter.Match(path) {
    80  				if err := walkFunc(path, fi); err != nil {
    81  					return err
    82  				}
    83  			}
    84  			return nil
    85  		})
    86  }