bilibili-backup/app/service/ops/log-agent/input/file/glob.go
2019-04-22 02:59:20 +00:00

75 lines
1.8 KiB
Go

package file
import (
"os"
"path/filepath"
"path"
"go-common/library/log"
)
func (f *File) getFiles() map[string]os.FileInfo {
paths := map[string]os.FileInfo{}
for _, p := range f.c.Paths {
// logs in docker overlay2
if MergedDir := f.ctx.Value("MergedDir"); MergedDir != nil {
p = path.Join(MergedDir.(string), p)
}
matches, err := filepath.Glob(p)
if err != nil {
log.Error("glob(%s) failed: %v", p, err)
continue
}
// Check any matched files to see if we need to start a harvester
for _, file := range matches {
// check if the file is in the exclude_files list
//if f.isFileExcluded(file) {
// log.Info("input", "Exclude file: %s", file)
// continue
//}
// Fetch Lstat File info to detected also symlinks
fileInfo, err := os.Lstat(file)
if err != nil {
log.Warn("lstat(%s) failed: %s", file, err)
continue
}
if fileInfo.IsDir() {
log.Warn("Skipping directory: %s", file)
continue
}
isSymlink := fileInfo.Mode()&os.ModeSymlink > 0
if isSymlink && !f.c.Symlinks {
log.Warn("File %s skipped as it is a symlink.", file)
continue
}
// Fetch Stat file info which fetches the inode. In case of a symlink, the original inode is fetched
fileInfo, err = os.Stat(file)
if err != nil {
log.Warn("stat(%s) failed: %s", file, err)
continue
}
// If symlink is enabled, it is checked that original is not part of same input
// It original is harvested by other input, states will potentially overwrite each other
//if p.config.Symlinks {
// for _, finfo := range paths {
// if os.SameFile(finfo, fileInfo) {
// log.Info("Same file found as symlink and originap. Skipping file: %s", file)
// continue OUTER
// }
// }
//}
paths[file] = fileInfo
}
}
return paths
}