-
Notifications
You must be signed in to change notification settings - Fork 98
/
table_util.go
122 lines (105 loc) · 2.69 KB
/
table_util.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package table
import (
"io/ioutil"
"os"
"path/filepath"
"runtime"
"github.com/go-kit/kit/log"
"github.com/go-kit/kit/log/level"
)
type findFile struct {
username string
}
type FindFileOpt func(*findFile)
func WithUsername(username string) FindFileOpt {
return func(ff *findFile) {
ff.username = username
}
}
var homeDirLocations = map[string][]string{
"windows": {"/Users"}, // windows10 uses /Users
"darwin": {"/Users"},
}
var homeDirDefaultLocation = []string{"/home"}
type userFileInfo struct {
user string
path string
}
// findFileInUserDirs looks for the existence of a specified path as a
// subdirectory of users' home directories. It does this by searching
// likely paths
func findFileInUserDirs(pattern string, logger log.Logger, opts ...FindFileOpt) ([]userFileInfo, error) {
ff := &findFile{}
for _, opt := range opts {
opt(ff)
}
homedirRoots, ok := homeDirLocations[runtime.GOOS]
if !ok {
homedirRoots = homeDirDefaultLocation
level.Debug(logger).Log(
"msg", "platform not found using default",
"homeDirRoot", homedirRoots,
)
}
foundPaths := []userFileInfo{}
// Redo/remove when we make username a required parameter
if ff.username == "" {
for _, possibleHome := range homedirRoots {
userDirs, err := ioutil.ReadDir(possibleHome)
if err != nil {
// This possibleHome doesn't exist. Move on
continue
}
// For each user's dir, in this possibleHome, check!
for _, ud := range userDirs {
userPathPattern := filepath.Join(possibleHome, ud.Name(), pattern)
fullPaths, err := filepath.Glob(userPathPattern)
if err != nil {
// skipping ErrBadPattern
level.Debug(logger).Log(
"msg", "bad file pattern",
"pattern", userPathPattern,
)
continue
}
for _, fullPath := range fullPaths {
if stat, err := os.Stat(fullPath); err == nil && stat.Mode().IsRegular() {
foundPaths = append(foundPaths, userFileInfo{
user: ud.Name(),
path: fullPath,
})
}
}
}
}
return foundPaths, nil
}
// We have a username. Future normal path here
for _, possibleHome := range homedirRoots {
userPathPattern := filepath.Join(possibleHome, ff.username, pattern)
fullPaths, err := filepath.Glob(userPathPattern)
if err != nil {
// skipping ErrBadPattern
level.Debug(logger).Log(
"msg", "bad file pattern",
"pattern", userPathPattern,
)
continue
}
for _, fullPath := range fullPaths {
if stat, err := os.Stat(fullPath); err == nil && stat.Mode().IsRegular() {
foundPaths = append(foundPaths, userFileInfo{
user: ff.username,
path: fullPath,
})
}
}
}
return foundPaths, nil
}
func btoi(value bool) int {
if value {
return 1
}
return 0
}