mirror of
https://github.com/pomerium/pomerium.git
synced 2025-05-03 12:26:03 +02:00
66 lines
2 KiB
Go
66 lines
2 KiB
Go
package envoy
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io/fs"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/natefinch/atomic"
|
|
resources "gopkg.in/cookieo9/resources-go.v2"
|
|
|
|
"github.com/pomerium/pomerium/internal/log"
|
|
)
|
|
|
|
const embeddedEnvoyPermissions fs.FileMode = 0o700
|
|
const embeddedDirectoryPermissions fs.FileMode = 0o755
|
|
|
|
var embeddedFilesBaseDirectory = filepath.Join(os.TempDir(), "pomerium-embedded-files")
|
|
|
|
func extractEmbeddedEnvoy(ctx context.Context) (outPath string, err error) {
|
|
exePath, err := resources.ExecutablePath()
|
|
if err != nil {
|
|
return "", fmt.Errorf("error finding executable path: %w", err)
|
|
}
|
|
bundle, err := resources.OpenZip(exePath)
|
|
if err != nil {
|
|
return "", fmt.Errorf("error opening binary zip file: %w", err)
|
|
}
|
|
defer bundle.Close()
|
|
|
|
rc, err := bundle.Open("envoy")
|
|
if err != nil {
|
|
return "", fmt.Errorf("error opening embedded envoy binary: %w", err)
|
|
}
|
|
defer rc.Close()
|
|
|
|
// clean up our base directory before starting
|
|
err = os.RemoveAll(embeddedFilesBaseDirectory)
|
|
if err != nil {
|
|
return "", fmt.Errorf("error cleaning embedded file directory: (directory=%s): %w", embeddedFilesBaseDirectory, err)
|
|
}
|
|
|
|
// create known directory base to clean at startup
|
|
err = os.MkdirAll(embeddedFilesBaseDirectory, embeddedDirectoryPermissions)
|
|
if err != nil {
|
|
return "", fmt.Errorf("error creating embedded file directory: (directory=%s): %w", embeddedFilesBaseDirectory, err)
|
|
}
|
|
|
|
// build a random temp directory inside our base directory to guarantee permissions
|
|
tmpDir, err := os.MkdirTemp(embeddedFilesBaseDirectory, "envoy-")
|
|
outPath = filepath.Join(tmpDir, "envoy")
|
|
|
|
log.Info(ctx).Str("path", outPath).Msg("extracting envoy binary")
|
|
err = atomic.WriteFile(outPath, rc)
|
|
if err != nil {
|
|
return "", fmt.Errorf("error extracting embedded envoy binary to temporary directory (path=%s): %w", outPath, err)
|
|
}
|
|
|
|
err = os.Chmod(outPath, embeddedEnvoyPermissions)
|
|
if err != nil {
|
|
return "", fmt.Errorf("error chmoding embedded envoy binary: %w", err)
|
|
}
|
|
|
|
return outPath, nil
|
|
}
|