From ecfd34f9eb1fba2ac6518bb39042f85fd7930500 Mon Sep 17 00:00:00 2001 From: shengxiang Date: Sat, 5 Sep 2015 14:14:33 +0800 Subject: [PATCH] add plugin for gosuv --- README.md | 11 +++++++++++ gosuv.go | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/README.md b/README.md index af4ed06..5a9c941 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,17 @@ # gosuv golang port of python-supervisor +# Plugin Design + +If executable file put in folder `$HOME/.gosuv/cmdplugin` with prefix `gosuv-`, gosuv will treat this file as a subcommand. + +for example: + + $HOME/.gosuv/cmdplugin/ --. + |- gosuv-showpid -rwx + +When run `gosuv showpid`, file `gosuv-showpid` will be called. + # Design Has a folder `.gosuv` under `$HOME` path. diff --git a/gosuv.go b/gosuv.go index 4a34b15..a3671d7 100644 --- a/gosuv.go +++ b/gosuv.go @@ -3,11 +3,13 @@ package main import ( "encoding/json" "fmt" + "io/ioutil" "net/http" "os" "os/exec" "path/filepath" "strconv" + "strings" "time" "github.com/codegangsta/cli" @@ -15,6 +17,10 @@ import ( "github.com/qiniu/log" ) +var ( + CMDPLUGIN_DIR = filepath.Join(GOSUV_HOME, "cmdplugin") +) + func MkdirIfNoExists(dir string) error { dir = os.ExpandEnv(dir) if _, err := os.Stat(dir); err != nil { @@ -23,6 +29,17 @@ func MkdirIfNoExists(dir string) error { return nil } +func ShellTestFile(flag string, file string) bool { + finfo, err := os.Stat(file) + switch flag { + case "x": + if err == nil && (finfo.Mode()&os.ModeExclusive) == 0 { + return true + } + } + return false +} + func chttp(method string, url string, v ...interface{}) (res *JSONResponse, err error) { var resp *http.Response switch method { @@ -224,6 +241,25 @@ func init() { Action: ServAction, }, } + finfos, err := ioutil.ReadDir(CMDPLUGIN_DIR) + log.Println(err) + if err != nil { + return + } + for _, finfo := range finfos { + if finfo.IsDir() { + continue + } + modeExec := os.FileMode(0500) + if strings.HasPrefix(finfo.Name(), "gosuv-") && (finfo.Mode()&modeExec) == modeExec { + log.Println(finfo) + cmdName := string(finfo.Name()[6:]) + app.Commands = append(app.Commands, cli.Command{ + Name: cmdName, + Usage: "Plugin command", + }) + } + } } var (