From 74d86597a9ef35e42088f5e71373243aaebbb1d5 Mon Sep 17 00:00:00 2001 From: nbari Date: Mon, 1 Aug 2016 00:46:39 +0200 Subject: [PATCH] modified: cmd/immortal/main.go modified: config.go new file: example/env/DEBUG new file: example/env/ENVIROMENT new file: example/env/TOKEN modified: parser.go --- cmd/immortal/main.go | 2 +- config.go | 40 ++++------------- example/env/DEBUG | 1 + example/env/ENVIROMENT | 1 + example/env/TOKEN | 1 + parser.go | 99 ++++++++++++++++++++++++++++++++++-------- 6 files changed, 94 insertions(+), 50 deletions(-) create mode 100644 example/env/DEBUG create mode 100644 example/env/ENVIROMENT create mode 100644 example/env/TOKEN diff --git a/cmd/immortal/main.go b/cmd/immortal/main.go index 064a060..5660a8e 100644 --- a/cmd/immortal/main.go +++ b/cmd/immortal/main.go @@ -31,5 +31,5 @@ func main() { // create a new daemon // daemon = new(immortal.Daemon) - fmt.Println(cfg, fs.Args()) + fmt.Printf("%v", cfg) } diff --git a/config.go b/config.go index aefdff5..fafe4a7 100644 --- a/config.go +++ b/config.go @@ -1,18 +1,15 @@ package immortal import ( - "bufio" - "io/ioutil" - "os" "os/user" - "path/filepath" ) type Config struct { Cmd string `yaml:"cmd" json:"cmd"` + Ctrl bool `yaml:"ctrl,omitempty"` Cwd string `yaml:",omitempty" json:",omitempty"` Env map[string]string `yaml:",omitempty" json:",omitempty"` - Pid map[string]string `yaml:",omitempty" json:",omitempty"` + Pid `yaml:",omitempty" json:",omitempty"` Log `yaml:",omitempty" json:",omitempty"` Logger string `yaml:",omitempty" json:",omitempty"` User string `yaml:",omitempty" json:",omitempty"` @@ -20,6 +17,12 @@ type Config struct { user *user.User } +type Pid struct { + Follow string `yaml:",omitempty"` + Parent string `yaml:",omitempty"` + Child string `yaml:",omitempty"` +} + type Log struct { File string `yaml:",omitempty"` Age int `yaml:",omitempty"` @@ -27,33 +30,6 @@ type Log struct { Size int `yaml:",omitempty"` } -func (self *Config) GetEnv(dir string) (map[string]string, error) { - files, err := ioutil.ReadDir(dir) - if err != nil { - return nil, err - } - env := make(map[string]string) - for _, f := range files { - if f.Mode().IsRegular() { - lines := 0 - ff, err := os.Open(filepath.Join(dir, f.Name())) - if err != nil { - continue - } - defer ff.Close() - s := bufio.NewScanner(ff) - for s.Scan() { - if lines >= 1 { - break - } - env[f.Name()] = s.Text() - lines++ - } - } - } - return env, nil -} - //func AA() { //daemon := &Daemon{ //owner: u, diff --git a/example/env/DEBUG b/example/env/DEBUG new file mode 100644 index 0000000..27ba77d --- /dev/null +++ b/example/env/DEBUG @@ -0,0 +1 @@ +true diff --git a/example/env/ENVIROMENT b/example/env/ENVIROMENT new file mode 100644 index 0000000..c44e75e --- /dev/null +++ b/example/env/ENVIROMENT @@ -0,0 +1 @@ +production diff --git a/example/env/TOKEN b/example/env/TOKEN new file mode 100644 index 0000000..762db24 --- /dev/null +++ b/example/env/TOKEN @@ -0,0 +1 @@ +ABC-123 diff --git a/parser.go b/parser.go index 0472bfb..558567a 100644 --- a/parser.go +++ b/parser.go @@ -1,6 +1,7 @@ package immortal import ( + "bufio" "flag" "fmt" "github.com/immortal/natcasesort" @@ -8,7 +9,9 @@ import ( "io/ioutil" "os" "os/user" + "path/filepath" "sort" + "strings" ) type Parser interface { @@ -17,7 +20,7 @@ type Parser interface { isFile(path string) bool parseYml(file string) (*Config, error) checkWrkdir(dir string) error - checkEnvdir(dir string) error + parseEnvdir(dir string) (map[string]string, error) checkUser(user string) (*user.User, error) } @@ -87,11 +90,34 @@ func (self *Parse) checkWrkdir(dir string) (err error) { return } -func (self *Parse) checkEnvdir(dir string) (err error) { +func (self *Parse) parseEnvdir(dir string) (map[string]string, error) { if !self.isDir(dir) { - err = fmt.Errorf("-e %q does not exist or has wrong permissions, use (\"%s -h\") for help.", dir, os.Args[0]) + return nil, fmt.Errorf("-e %q does not exist or has wrong permissions, use (\"%s -h\") for help.", dir, os.Args[0]) } - return + files, err := ioutil.ReadDir(dir) + if err != nil { + return nil, err + } + env := make(map[string]string) + for _, f := range files { + if f.Mode().IsRegular() { + lines := 0 + ff, err := os.Open(filepath.Join(dir, f.Name())) + if err != nil { + continue + } + defer ff.Close() + s := bufio.NewScanner(ff) + for s.Scan() { + if lines >= 1 { + break + } + env[f.Name()] = s.Text() + lines++ + } + } + } + return env, nil } func (self *Parse) checkUser(u string) (usr *user.User, err error) { @@ -160,8 +186,26 @@ func ParseArgs(p Parser, fs *flag.FlagSet) (cfg *Config, err error) { if err != nil { return } - } else { - cfg = new(Config) + if cfg.Cwd != "" { + if err = p.checkWrkdir(cfg.Cwd); err != nil { + return + } + } + if cfg.User != "" { + if cfg.user, err = p.checkUser(cfg.User); err != nil { + return + } + } + return + } + + // create new cfg if not using run.yml + cfg = new(Config) + cfg.Cmd = strings.Join(fs.Args(), " ") + + // if -ctrl + if flags.Ctrl { + cfg.Ctrl = true } // if -d @@ -169,30 +213,51 @@ func ParseArgs(p Parser, fs *flag.FlagSet) (cfg *Config, err error) { if err = p.checkWrkdir(flags.Wrkdir); err != nil { return } - } - if cfg.Cwd != "" { - if err = p.checkWrkdir(cfg.Cwd); err != nil { - return - } + cfg.Cwd = flags.Wrkdir } // if -e if flags.Envdir != "" { - if err = p.checkEnvdir(flags.Envdir); err != nil { + if cfg.Env, err = p.parseEnvdir(flags.Envdir); err != nil { return } } + // if -f + if flags.FollowPid != "" { + cfg.Follow = flags.FollowPid + } + + // if -l + if flags.Logfile != "" { + cfg.File = flags.Logfile + } + + // if -logger + if flags.Logger != "" { + cfg.Logger = flags.Logger + } + + // if -P + if flags.ParentPid != "" { + cfg.Parent = flags.ParentPid + } + + // if -p + if flags.ChildPid != "" { + cfg.Child = flags.ChildPid + } + + // if -s + if flags.Seconds > 0 { + cfg.Wait = flags.Seconds + } + // if -u if flags.User != "" { if cfg.user, err = p.checkUser(flags.User); err != nil { return } } - if cfg.User != "" { - if cfg.user, err = p.checkUser(cfg.User); err != nil { - return - } - } return }