| package main |
| |
| import ( |
| "fmt" |
| "github.com/dotcloud/docker/engine" |
| "github.com/dotcloud/docker/engine/spawn" |
| "log" |
| "os" |
| "os/exec" |
| "strings" |
| ) |
| |
| func main() { |
| fmt.Printf("[%d] MAIN\n", os.Getpid()) |
| spawn.Init(&Worker{}) |
| fmt.Printf("[%d parent] spawning\n", os.Getpid()) |
| eng, err := spawn.Spawn() |
| if err != nil { |
| log.Fatal(err) |
| } |
| fmt.Printf("[parent] spawned\n") |
| job := eng.Job(os.Args[1], os.Args[2:]...) |
| job.Stdout.Add(os.Stdout) |
| job.Stderr.Add(os.Stderr) |
| job.Run() |
| // FIXME: use the job's status code |
| os.Exit(0) |
| } |
| |
| type Worker struct { |
| } |
| |
| func (w *Worker) Install(eng *engine.Engine) error { |
| eng.Register("exec", w.Exec) |
| eng.Register("cd", w.Cd) |
| eng.Register("echo", w.Echo) |
| return nil |
| } |
| |
| func (w *Worker) Exec(job *engine.Job) engine.Status { |
| fmt.Printf("--> %v\n", job.Args) |
| cmd := exec.Command(job.Args[0], job.Args[1:]...) |
| cmd.Stdout = job.Stdout |
| cmd.Stderr = os.Stderr |
| if err := cmd.Run(); err != nil { |
| return job.Errorf("%v\n", err) |
| } |
| return engine.StatusOK |
| } |
| |
| func (w *Worker) Cd(job *engine.Job) engine.Status { |
| if err := os.Chdir(job.Args[0]); err != nil { |
| return job.Errorf("%v\n", err) |
| } |
| return engine.StatusOK |
| } |
| |
| func (w *Worker) Echo(job *engine.Job) engine.Status { |
| fmt.Fprintf(job.Stdout, "%s\n", strings.Join(job.Args, " ")) |
| return engine.StatusOK |
| } |