core/envoy: clean up temporary directory on start (#4914)

This commit is contained in:
Caleb Doxsey 2024-01-24 15:53:44 -07:00 committed by GitHub
parent 4301da3648
commit 2a9e76eb7c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 64 additions and 3 deletions

View file

@ -12,12 +12,15 @@ import (
"strings" "strings"
"sync" "sync"
"github.com/rs/zerolog/log"
"github.com/pomerium/pomerium/pkg/envoy/files" "github.com/pomerium/pomerium/pkg/envoy/files"
) )
const ( const (
ownerRX = os.FileMode(0o500) ownerRX = os.FileMode(0o500)
maxExpandedEnvoySize = 1 << 30 maxExpandedEnvoySize = 1 << 30
envoyPrefix = "pomerium-envoy"
) )
type hashReader struct { type hashReader struct {
@ -53,17 +56,20 @@ func Extract() (fullEnvoyPath string, err error) {
return setupFullEnvoyPath, setupErr return setupFullEnvoyPath, setupErr
} }
dir, err := os.MkdirTemp(os.TempDir(), "pomerium-envoy") tmpDir := os.TempDir()
cleanTempDir(tmpDir)
dir, err := os.MkdirTemp(tmpDir, envoyPrefix)
if err != nil { if err != nil {
setupErr = fmt.Errorf("envoy: failed making temporary working dir: %w", err) setupErr = fmt.Errorf("envoy: failed making temporary working dir: %w", err)
return return setupFullEnvoyPath, setupErr
} }
setupFullEnvoyPath = filepath.Join(dir, "envoy") setupFullEnvoyPath = filepath.Join(dir, "envoy")
err = extract(setupFullEnvoyPath) err = extract(setupFullEnvoyPath)
if err != nil { if err != nil {
setupErr = fmt.Errorf("envoy: failed to extract embedded envoy binary: %w", err) setupErr = fmt.Errorf("envoy: failed to extract embedded envoy binary: %w", err)
return return setupFullEnvoyPath, setupErr
} }
setupDone = true setupDone = true
@ -97,3 +103,27 @@ func extract(dstName string) (err error) {
} }
return nil return nil
} }
func cleanTempDir(tmpDir string) {
d, err := os.Open(tmpDir)
if err != nil {
log.Warn().Msg("envoy: failed to open temp directory for clean up")
return
}
defer d.Close()
fs, err := d.Readdir(-1)
if err != nil {
log.Warn().Msg("envoy: failed to read files in temporary directory")
return
}
for _, f := range fs {
if f.IsDir() && strings.HasPrefix(f.Name(), envoyPrefix) {
err := os.RemoveAll(filepath.Join(tmpDir, f.Name()))
if err != nil {
log.Warn().Err(err).Msg("envoy: failed to delete previous extracted envoy")
}
}
}
}

31
pkg/envoy/extract_test.go Normal file
View file

@ -0,0 +1,31 @@
package envoy
import (
"io/fs"
"os"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestClean(t *testing.T) {
t.Parallel()
tmpDir := t.TempDir()
d1, err := os.MkdirTemp(tmpDir, envoyPrefix)
require.NoError(t, err)
d2, err := os.MkdirTemp(tmpDir, envoyPrefix)
require.NoError(t, err)
d3, err := os.MkdirTemp(tmpDir, envoyPrefix)
require.NoError(t, err)
cleanTempDir(tmpDir)
_, err = os.Stat(d1)
assert.ErrorIs(t, err, fs.ErrNotExist)
_, err = os.Stat(d2)
assert.ErrorIs(t, err, fs.ErrNotExist)
_, err = os.Stat(d3)
assert.ErrorIs(t, err, fs.ErrNotExist)
}