main.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/dotcloud/docker/engine"
  5. "github.com/dotcloud/docker/engine/spawn"
  6. "log"
  7. "os"
  8. "os/exec"
  9. "strings"
  10. )
  11. func main() {
  12. fmt.Printf("[%d] MAIN\n", os.Getpid())
  13. spawn.Init(&Worker{})
  14. fmt.Printf("[%d parent] spawning\n", os.Getpid())
  15. eng, err := spawn.Spawn()
  16. if err != nil {
  17. log.Fatal(err)
  18. }
  19. fmt.Printf("[parent] spawned\n")
  20. job := eng.Job(os.Args[1], os.Args[2:]...)
  21. job.Stdout.Add(os.Stdout)
  22. job.Stderr.Add(os.Stderr)
  23. job.Run()
  24. // FIXME: use the job's status code
  25. os.Exit(0)
  26. }
  27. type Worker struct {
  28. }
  29. func (w *Worker) Install(eng *engine.Engine) error {
  30. eng.Register("exec", w.Exec)
  31. eng.Register("cd", w.Cd)
  32. eng.Register("echo", w.Echo)
  33. return nil
  34. }
  35. func (w *Worker) Exec(job *engine.Job) engine.Status {
  36. fmt.Printf("--> %v\n", job.Args)
  37. cmd := exec.Command(job.Args[0], job.Args[1:]...)
  38. cmd.Stdout = job.Stdout
  39. cmd.Stderr = os.Stderr
  40. if err := cmd.Run(); err != nil {
  41. return job.Errorf("%v\n", err)
  42. }
  43. return engine.StatusOK
  44. }
  45. func (w *Worker) Cd(job *engine.Job) engine.Status {
  46. if err := os.Chdir(job.Args[0]); err != nil {
  47. return job.Errorf("%v\n", err)
  48. }
  49. return engine.StatusOK
  50. }
  51. func (w *Worker) Echo(job *engine.Job) engine.Status {
  52. fmt.Fprintf(job.Stdout, "%s\n", strings.Join(job.Args, " "))
  53. return engine.StatusOK
  54. }