Skip to content

Commit d176f7d

Browse files
authored
Set file permissions of code directory when layer present (#27)
1 parent bb1394a commit d176f7d

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

cmd/localstack/file_utils.go

+17
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"io"
45
"os"
56
"path/filepath"
67
)
@@ -20,3 +21,19 @@ func ChmodRecursively(root string, mode os.FileMode) error {
2021
return nil
2122
})
2223
}
24+
25+
// Check if a directory is empty
26+
// Source: https://stackoverflow.com/questions/30697324/how-to-check-if-directory-on-path-is-empty/30708914#30708914
27+
func IsDirEmpty(name string) (bool, error) {
28+
f, err := os.Open(name)
29+
if err != nil {
30+
return false, err
31+
}
32+
defer f.Close()
33+
34+
_, err = f.Readdirnames(1) // faster than f.Readdir(1)
35+
if err == io.EOF {
36+
return true, nil
37+
}
38+
return false, err // Either not empty or error, suits both cases
39+
}

cmd/localstack/main.go

+13-4
Original file line numberDiff line numberDiff line change
@@ -132,13 +132,22 @@ func main() {
132132
log.Fatal("Failed to download code archives: " + err.Error())
133133
}
134134

135-
// fix permissions of the layers directory for better AWS parity
135+
// set file permissions of the tmp directory for better AWS parity
136+
if err := ChmodRecursively("/tmp", 0700); err != nil {
137+
log.Warnln("Could not change file mode recursively of directory /tmp:", err)
138+
}
139+
// set file permissions of the layers directory for better AWS parity
136140
if err := ChmodRecursively("/opt", 0755); err != nil {
137141
log.Warnln("Could not change file mode recursively of directory /opt:", err)
138142
}
139-
// fix permissions of the tmp directory for better AWS parity
140-
if err := ChmodRecursively("/tmp", 0700); err != nil {
141-
log.Warnln("Could not change file mode recursively of directory /tmp:", err)
143+
// set file permissions of the code directory if at least one layer is present for better AWS parity
144+
// Limitation: hot reloading likely breaks file permission parity for /var/task in combination with layers
145+
// Heuristic for detecting the presence of layers. It might fail for an empty layer or image-based Lambda.
146+
if isDirEmpty, _ := IsDirEmpty("/opt"); !isDirEmpty {
147+
log.Debugln("Detected layer present")
148+
if err := ChmodRecursively("/var/task", 0755); err != nil {
149+
log.Warnln("Could not change file mode recursively of directory /var/task:", err)
150+
}
142151
}
143152

144153
// parse CLI args

0 commit comments

Comments
 (0)