seccomp.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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() 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. defer func() {
  23. os.RemoveAll(tmp_dir)
  24. os.Remove(tmp_dir)
  25. }()
  26. // copy files to tmp dir
  27. for _, file_path := range paths {
  28. // create path in tmp dir
  29. // check if it's a dir
  30. file_info, err := os.Stat(file_path)
  31. if err != nil {
  32. return err
  33. }
  34. if file_info.IsDir() {
  35. err = os.MkdirAll(path.Join(tmp_dir, file_path), 0755)
  36. if err != nil {
  37. return err
  38. }
  39. } else {
  40. err = os.MkdirAll(path.Join(tmp_dir, path.Dir(file_path)), 0755)
  41. if err != nil {
  42. return err
  43. }
  44. }
  45. err = exec.Command("cp", "-r", file_path, path.Join(tmp_dir, file_path)).Run()
  46. if err != nil {
  47. return err
  48. }
  49. }
  50. // chdir
  51. err = syscall.Chdir(tmp_dir)
  52. if err != nil {
  53. return err
  54. }
  55. err = closures()
  56. if err != nil {
  57. return err
  58. }
  59. return nil
  60. }