seccomp.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package runner
  2. import (
  3. "os"
  4. "os/exec"
  5. "path"
  6. "syscall"
  7. "github.com/google/uuid"
  8. )
  9. type SeccompRunner struct {
  10. }
  11. func (s *SeccompRunner) WithTempDir(paths []string, closures func(path string) error) error {
  12. uuid, err := uuid.NewRandom()
  13. if err != nil {
  14. return err
  15. }
  16. // create a tmp dir
  17. tmp_dir := path.Join("/tmp", "sandbox-"+uuid.String())
  18. err = os.Mkdir(tmp_dir, 0755)
  19. if err != nil {
  20. return err
  21. }
  22. // copy files to tmp dir
  23. for _, file_path := range paths {
  24. // create path in tmp dir
  25. // check if it's a dir
  26. file_info, err := os.Stat(file_path)
  27. if err != nil {
  28. return err
  29. }
  30. if file_info.IsDir() {
  31. err = os.MkdirAll(path.Join(tmp_dir, file_path), 0755)
  32. if err != nil {
  33. return err
  34. }
  35. } else {
  36. err = os.MkdirAll(path.Join(tmp_dir, path.Dir(file_path)), 0755)
  37. if err != nil {
  38. return err
  39. }
  40. }
  41. err = exec.Command("cp", "-r", file_path, path.Join(tmp_dir, file_path)).Run()
  42. if err != nil {
  43. return err
  44. }
  45. }
  46. // chdir
  47. err = syscall.Chdir(tmp_dir)
  48. if err != nil {
  49. return err
  50. }
  51. err = closures(tmp_dir)
  52. if err != nil {
  53. return err
  54. }
  55. return nil
  56. }