diff options
Diffstat (limited to 'vendor/github.com/xlgmokha')
| -rw-r--r-- | vendor/github.com/xlgmokha/minit/.gitignore | 1 | ||||
| -rw-r--r-- | vendor/github.com/xlgmokha/minit/Makefile | 16 | ||||
| -rw-r--r-- | vendor/github.com/xlgmokha/minit/main.go | 122 | ||||
| -rw-r--r-- | vendor/github.com/xlgmokha/minit/pkg/procfile/parse.go | 44 | ||||
| -rw-r--r-- | vendor/github.com/xlgmokha/minit/pkg/procfile/proc.go | 27 |
5 files changed, 161 insertions, 49 deletions
diff --git a/vendor/github.com/xlgmokha/minit/.gitignore b/vendor/github.com/xlgmokha/minit/.gitignore new file mode 100644 index 0000000..5e56e04 --- /dev/null +++ b/vendor/github.com/xlgmokha/minit/.gitignore @@ -0,0 +1 @@ +/bin diff --git a/vendor/github.com/xlgmokha/minit/Makefile b/vendor/github.com/xlgmokha/minit/Makefile new file mode 100644 index 0000000..8979cb4 --- /dev/null +++ b/vendor/github.com/xlgmokha/minit/Makefile @@ -0,0 +1,16 @@ +SHELL = /bin/sh + +clean: + @rm -f ./bin/minit + +build: + @go build -o ./bin/minit main.go + +test-unit: + @go test ./... + +test-integration: build + @./bin/minit -h + +test: test-unit test-integration + diff --git a/vendor/github.com/xlgmokha/minit/main.go b/vendor/github.com/xlgmokha/minit/main.go index 8fcf0e0..1e94c00 100644 --- a/vendor/github.com/xlgmokha/minit/main.go +++ b/vendor/github.com/xlgmokha/minit/main.go @@ -1,79 +1,103 @@ package main import ( - "bufio" + "flag" + "log" "os" - "os/exec" "os/signal" "strings" "sync" "sync/atomic" "syscall" "time" + + "github.com/xlgmokha/minit/pkg/procfile" ) -func main() { - file, _ := os.Open("Procfile") - defer file.Close() +var ( + pidMutex sync.Mutex + pids []int + procfilePath *string +) + +func init() { + procfilePath = flag.String("f", "Procfile", "path to Procfile") + flag.Parse() + log.SetFlags(0) +} + +func addPid(pid int) { + pidMutex.Lock() + defer pidMutex.Unlock() + pids = append(pids, pid) +} + +func removePid(pid int) { + pidMutex.Lock() + defer pidMutex.Unlock() + + for i, p := range pids { + if p == pid { + pids = append(pids[:i], pids[i+1:]...) + break + } + } +} - var cmds []*exec.Cmd +func forwardSignalToAll(sig os.Signal) { + pidMutex.Lock() + defer pidMutex.Unlock() + + signal := sig.(syscall.Signal) + for _, pid := range pids { + syscall.Kill(-pid, signal) + } +} + +func main() { var wg sync.WaitGroup var shutdown int32 - scanner := bufio.NewScanner(file) - for scanner.Scan() { - line := strings.TrimSpace(scanner.Text()) - if line == "" || strings.HasPrefix(line, "#") { - continue + for _, path := range strings.Split(*procfilePath, ",") { + procs, err := procfile.ParseFile(path) + if err != nil { + log.Fatalln(err) } - parts := strings.SplitN(line, ":", 2) - if len(parts) != 2 { - continue - } + for _, proc := range procs { + wg.Add(1) + go func(proc *procfile.Proc) { + defer wg.Done() - args := strings.Fields(os.ExpandEnv(strings.TrimSpace(parts[1]))) - if len(args) == 0 { - continue - } + for atomic.LoadInt32(&shutdown) == 0 { + cmd := proc.NewCommand() + + if cmd.Start() != nil { + time.Sleep(2 * time.Second) + continue + } - cmd := exec.Command(args[0], args[1:]...) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} - - cmds = append(cmds, cmd) - - wg.Add(1) - go func(args []string) { - defer wg.Done() - for atomic.LoadInt32(&shutdown) == 0 { - cmd := exec.Command(args[0], args[1:]...) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} - - if cmd.Start() != nil { - time.Sleep(2 * time.Second) - continue + addPid(cmd.Process.Pid) + cmd.Wait() + removePid(cmd.Process.Pid) + time.Sleep(time.Second) } - cmd.Wait() - time.Sleep(time.Second) - } - }(args) + }(proc) + } } sigChan := make(chan os.Signal, 1) - signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) + signal.Notify(sigChan) go func() { - <-sigChan - atomic.StoreInt32(&shutdown, 1) - - for _, cmd := range cmds { - if cmd.Process != nil { - syscall.Kill(-cmd.Process.Pid, syscall.SIGTERM) + for sig := range sigChan { + if sig == syscall.SIGINT || sig == syscall.SIGTERM { + atomic.StoreInt32(&shutdown, 1) + forwardSignalToAll(sig) + return } + + forwardSignalToAll(sig) } }() diff --git a/vendor/github.com/xlgmokha/minit/pkg/procfile/parse.go b/vendor/github.com/xlgmokha/minit/pkg/procfile/parse.go new file mode 100644 index 0000000..8d3284b --- /dev/null +++ b/vendor/github.com/xlgmokha/minit/pkg/procfile/parse.go @@ -0,0 +1,44 @@ +package procfile + +import ( + "bufio" + "io" + "os" + "strings" +) + +func ParseFile(path string) ([]*Proc, error) { + file, err := os.Open(path) + if err != nil { + return nil, err + } + defer file.Close() + + return Parse(file), nil +} + +func Parse(file io.Reader) []*Proc { + var processes []*Proc + scanner := bufio.NewScanner(file) + + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" || strings.HasPrefix(line, "#") { + continue + } + + parts := strings.SplitN(line, ":", 2) + if len(parts) != 2 { + continue + } + + args := strings.Fields(os.ExpandEnv(strings.TrimSpace(parts[1]))) + if len(args) == 0 { + continue + } + + processes = append(processes, New(parts[0], args)) + } + + return processes +} diff --git a/vendor/github.com/xlgmokha/minit/pkg/procfile/proc.go b/vendor/github.com/xlgmokha/minit/pkg/procfile/proc.go new file mode 100644 index 0000000..59b1936 --- /dev/null +++ b/vendor/github.com/xlgmokha/minit/pkg/procfile/proc.go @@ -0,0 +1,27 @@ +package procfile + +import ( + "os" + "os/exec" + "syscall" +) + +type Proc struct { + name string + args []string +} + +func New(name string, args []string) *Proc { + return &Proc{ + name: name, + args: args, + } +} + +func (p *Proc) NewCommand() *exec.Cmd { + cmd := exec.Command(p.args[0], p.args[1:]...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} + return cmd +} |
