Skip to content

Commit 7fafc6d

Browse files
authored
Merge pull request #88 from vadorovsky/lock-file
Acquire a lock file when performing a scan
2 parents 6ed6ea9 + ec71590 commit 7fafc6d

3 files changed

Lines changed: 92 additions & 0 deletions

File tree

core/lock.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package core
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"sync"
7+
"syscall"
8+
)
9+
10+
const lockFilePath = "/var/lock/deepfence-secret-scanner.lock"
11+
12+
type Flock struct {
13+
m sync.RWMutex
14+
}
15+
16+
func NewFlock() *Flock {
17+
return &Flock{}
18+
}
19+
20+
func getBootId() ([]byte, error) {
21+
bootId, err := os.ReadFile("/proc/sys/kernel/random/boot_id")
22+
if err != nil {
23+
return nil, fmt.Errorf("failed to read boot id: %w", err)
24+
}
25+
return bootId, nil
26+
}
27+
28+
// Acquires a shared lock on the file.
29+
func (f *Flock) LockFile() error {
30+
f.m.Lock()
31+
defer f.m.Unlock()
32+
33+
fd, err := os.OpenFile(lockFilePath, os.O_CREATE|os.O_RDWR, 0644)
34+
if err != nil {
35+
return fmt.Errorf("failed to open the lock file: %w", err)
36+
}
37+
defer fd.Close()
38+
39+
bootId, err := getBootId()
40+
if err != nil {
41+
return err
42+
}
43+
44+
file := os.NewFile(fd.Fd(), lockFilePath)
45+
file.Write(bootId)
46+
47+
if err := syscall.Flock(int(fd.Fd()), syscall.LOCK_SH); err != nil {
48+
return fmt.Errorf("failed to acquire the lock file: %w", err)
49+
}
50+
51+
return nil
52+
}
53+
54+
// Releases the lock on the file.
55+
func (f *Flock) UnlockFile() error {
56+
f.m.Lock()
57+
defer f.m.Unlock()
58+
59+
fd, err := os.OpenFile(lockFilePath, os.O_RDWR, 0644)
60+
if err != nil {
61+
return fmt.Errorf("failed to open the lock file: %w", err)
62+
}
63+
defer fd.Close()
64+
65+
if err := syscall.Flock(int(fd.Fd()), syscall.LOCK_UN); err != nil {
66+
return fmt.Errorf("failed to unlock the lock file: %w", err)
67+
}
68+
69+
return nil
70+
}

server/grpc.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ func (s *gRPCServer) GetUID(context.Context, *pb.Empty) (*pb.Uid, error) {
3232
}
3333

3434
func (s *gRPCServer) FindSecretInfo(_ context.Context, r *pb.FindRequest) (*pb.FindResult, error) {
35+
flock := core.NewFlock()
36+
if err := flock.LockFile(); err != nil {
37+
return nil, err
38+
}
39+
defer flock.UnlockFile()
40+
3541
if r.GetPath() != "" {
3642
var isFirstSecret bool = true
3743
var numSecrets uint = 0

server/http.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,22 @@ func runSecretScanStandalone(writer http.ResponseWriter, request *http.Request)
8888
fmt.Fprintf(writer, "Parse err: %v", err)
8989
return
9090
}
91+
92+
flock := core.NewFlock()
93+
if err := flock.LockFile(); err != nil {
94+
fmt.Fprintf(writer, err.Error())
95+
return
96+
}
97+
9198
fmt.Printf("Secret Scan triggered for %s: ", req.ImageNameWithTag)
9299
res, err := scan.ExtractAndScanImage(req.ImageNameWithTag)
93100
if err != nil {
94101
fmt.Fprintf(writer, "Image scan err: %v", err)
95102
return
96103
}
97104

105+
flock.UnlockFile()
106+
98107
jsonImageSecretsOutput := output.JsonImageSecretsOutput{ImageName: req.ImageNameWithTag}
99108
jsonImageSecretsOutput.SetTime()
100109
jsonImageSecretsOutput.SetImageId(res.ImageId)
@@ -113,6 +122,13 @@ func runSecretScanStandalone(writer http.ResponseWriter, request *http.Request)
113122
}
114123

115124
func processScans(form url.Values) {
125+
flock := core.NewFlock()
126+
if err := flock.LockFile(); err != nil {
127+
fmt.Println(err.Error())
128+
return
129+
}
130+
defer flock.UnlockFile()
131+
116132
imageNameList := form["image_name_with_tag_list"]
117133
for index, imageName := range imageNameList {
118134
go httpScanWorkerPool.Process(imageParameters{imageName: imageName, scanId: form["scan_id_list"][index], form: form})

0 commit comments

Comments
 (0)