github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/cmd/jsrun/flag.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "io/ioutil" 7 "os" 8 "strings" 9 10 "golang.org/x/crypto/ssh/terminal" 11 12 "github.com/angenalZZZ/gofunc/f" 13 "github.com/angenalZZZ/gofunc/js" 14 "github.com/angenalZZZ/gofunc/log" 15 nat "github.com/angenalZZZ/gofunc/rpc/nats" 16 ) 17 18 var ( 19 flagConfig = flag.String("c", "jsrun.yaml", "set config file") 20 flagDaemon = flag.Bool("d", false, "set as daemons") 21 ) 22 23 func usage() { 24 flag.Usage() 25 os.Exit(0) 26 } 27 28 func initArgs() { 29 flag.Usage = func() { 30 fmt.Printf(" Usage of %s:\n e.g. > jsrun jsrun.js\n", os.Args[0]) 31 flag.PrintDefaults() 32 } 33 flag.Parse() 34 } 35 36 func inputArg() (string, error) { 37 args := flag.Args() 38 l := len(args) 39 if f.StringsContains(args, "-d") { 40 f.StringsExclude(args, "-d") 41 l-- 42 } 43 44 if l > 2 { 45 if args[0] == "-c" { 46 return args[2], nil 47 } 48 return args[0], nil 49 } 50 if l == 2 || l == 0 { 51 if terminal.IsTerminal(0) == false { 52 buf, err := ioutil.ReadAll(os.Stdin) 53 if err != nil { 54 return "", err 55 } 56 return f.String(buf), nil 57 } 58 } 59 if l == 1 { 60 return args[0], nil 61 } 62 63 return "", f.ErrBadInput 64 } 65 66 func checkArgs() { 67 if *flagConfig != "" { 68 configFile = *flagConfig 69 } 70 71 if err := initConfig(); err != nil { 72 panic(err) 73 } 74 75 if log.Log == nil { 76 log.Log = log.Init(configInfo.Log) 77 } 78 if nat.Log == nil { 79 nat.Log = log.Log 80 } 81 82 js.RunLogTimeFormat = configInfo.Log.TimeFormat 83 84 filename, err := inputArg() 85 if err != nil { 86 exit(err) 87 } 88 if filename != "" { 89 scriptFile = filename 90 } 91 92 // load js 93 if strings.HasSuffix(scriptFile, ".js") { 94 if isScriptMod() == false { 95 usage() 96 } 97 if err := doScriptMod(); err != nil { 98 usage() 99 } 100 } else { 101 configInfo.Script = strings.TrimSpace(scriptFile) 102 } 103 104 if configInfo.Script == "" { 105 usage() 106 } 107 108 log.Log.Debug().Msgf("configuration complete.") 109 } 110 111 func natClientConnect() { 112 var err error 113 114 // NatS 115 nat.Subject = "jsrun" 116 nat.Conn, err = nat.New("jsrun", configInfo.Nats.Addr, configInfo.Nats.Cred, configInfo.Nats.Token, configInfo.Nats.Cert, configInfo.Nats.Key) 117 if err != nil { 118 nat.Log.Error().Msgf("[nats] failed connect to server: %v\n", err) 119 os.Exit(1) 120 } 121 } 122 123 func run() { 124 var r = js.NewRuntime(nil) 125 defer func() { r.Clear() }() 126 log.Log.Debug().Msg("[js] run started.") 127 128 if _, err := r.RunString(configInfo.Script); err != nil { 129 exit(err) 130 } 131 132 log.Log.Debug().Msg("[js] run finished.") 133 134 if *flagDaemon == false { 135 os.Exit(0) 136 } 137 } 138 139 func exit(err error) { 140 nat.Log.Error().Msgf("[js] run error: %v\n", err) 141 os.Exit(0) 142 }