github.com/hy3/cuto@v0.9.8-0.20160830082821-aa6652f877b7/show/main.go (about) 1 // Copyright 2015 unirita Inc. 2 // Created 2015/04/14 shanxia 3 4 package main 5 6 import ( 7 "flag" 8 "fmt" 9 "os" 10 "path/filepath" 11 "runtime" 12 13 "github.com/unirita/cuto/console" 14 "github.com/unirita/cuto/db" 15 "github.com/unirita/cuto/master/config" 16 "github.com/unirita/cuto/show/gen" 17 "github.com/unirita/cuto/utctime" 18 ) 19 20 // 実行時引数のオプション 21 type arguments struct { 22 help bool // Usageを表示 23 v bool // バージョン情報表示 24 nid int // ジョブネットワークのインスタンスID 25 jobnet string // ジョブネットワーク名 26 from string // From日付 27 to string // To日付 28 status string // ジョブネットワークのステータス 29 format string // 表示フォーマット 30 config string // 設定ファイルのパス 31 isUTC bool // 時刻を標準時として扱うかどうか 32 } 33 34 // 戻り値 35 const ( 36 rc_OK = 0 // 正常終了 37 rc_NOTHING = 4 // 出力件数が0件 38 rc_PARMERR = 8 // パラメータエラー 39 rc_ERROR = 12 // 実行時エラー 40 ) 41 42 // デフォルトの設定ファイル名 43 var defaultConfig string = getDefaultConfig() 44 45 func getDefaultConfig() string { 46 if runtime.GOOS == "windows" { 47 return "master.ini" 48 } 49 return filepath.Join(os.Getenv("CUTOROOT"), "bin", "master.ini") 50 } 51 52 // ステータス指定 53 const status_normal = "normal" 54 const status_abnormal = "abnormal" 55 const status_running = "running" 56 const status_warn = "warn" 57 58 func main() { 59 console.DisplayError("CTU001I", Version) 60 61 rc := realMain(fetchArgs()) 62 63 console.DisplayError("CTU002I", rc) 64 os.Exit(rc) 65 } 66 67 // 処理のメインルーチン 68 func realMain(args *arguments) int { 69 if args.v { // バージョン情報表示 70 showVersion() 71 return rc_OK 72 } 73 if args.help { // Usage表示 74 showUsage() 75 return rc_OK 76 } 77 // 設定ファイル名の取得 78 if len(args.config) == 0 { 79 args.config = defaultConfig 80 } 81 if err := config.Load(args.config); err != nil { // 設定ファイル読み込み。 82 console.DisplayError("CTU006E", args.config) 83 return rc_PARMERR 84 } 85 if len(args.from) == 0 && len(args.to) == 0 { // From-to指定無しの場合は、現在のCPU日付のみを対象とする 86 now := utctime.Now() 87 if args.isUTC { 88 args.from = now.Format(utctime.Date8Num) 89 args.to = args.from 90 } else { 91 args.from = now.FormatLocaltime(utctime.Date8Num) 92 args.to = args.from 93 } 94 } 95 from, to, err := parseFromTo(args.from, args.to, args.isUTC) 96 if err != nil { 97 console.DisplayError("CTU003E", err) 98 showUsage() 99 return rc_PARMERR 100 } 101 status, err := getStatusType(args.status) // status取得 102 if err != nil { 103 console.DisplayError("CTU003E", fmt.Sprintf("Invalid status option. [%v]", args.status)) 104 showUsage() 105 return rc_PARMERR 106 } 107 gen := getSeparatorType(args.format) // 出力形態 108 if gen == nil { 109 console.DisplayError("CTU003E", fmt.Sprintf("Invalid [format] format.[%v]", args.format)) 110 showUsage() 111 return rc_PARMERR 112 } 113 param := NewShowParam(args.nid, args.jobnet, from, to, status, gen) 114 rc, err := param.Run(config.DB.DBFile, args.isUTC) 115 if err != nil { 116 console.DisplayError("CTU004E", err) 117 return rc_ERROR 118 } else if rc == 0 { // 出力件数が0 119 return rc_NOTHING 120 } 121 return rc_OK 122 } 123 124 // 引数情報の取得 125 func fetchArgs() *arguments { 126 args := new(arguments) 127 flag.Usage = showUsage 128 flag.BoolVar(&args.help, "help", false, "usage option.") 129 flag.BoolVar(&args.v, "v", false, "version option.") 130 flag.IntVar(&args.nid, "nid", 0, "Jobnetwork instance ID.") 131 flag.StringVar(&args.jobnet, "jobnet", "", "jobnet name option.") 132 flag.StringVar(&args.from, "from", "", "From date.") 133 flag.StringVar(&args.to, "to", "", "To date.") 134 flag.StringVar(&args.status, "status", "", "Jobnetwork status.") 135 flag.StringVar(&args.format, "format", "", "Output format.") 136 flag.StringVar(&args.config, "c", "", "Input config-file.") 137 flag.BoolVar(&args.isUTC, "utc", false, "UTC option.") 138 flag.Parse() 139 return args 140 } 141 142 // バージョン情報の表示 143 func showVersion() { 144 fmt.Fprintf(os.Stderr, "%v show-utility version.\n", Version) 145 } 146 147 // usage情報の表示 148 func showUsage() { 149 fmt.Fprintf(os.Stderr, console.USAGE_SHOW) 150 } 151 152 // 出力形態の取得 153 func getSeparatorType(value string) gen.Generator { 154 if len(value) == 0 || value == "json" { 155 return new(gen.JsonGenerator) 156 } else if value == "csv" { 157 return new(gen.CsvGenerator) 158 } 159 return nil 160 } 161 162 // 取得するジョブネットステータスの取得 163 func getStatusType(status string) (int, error) { 164 if len(status) == 0 { // ステータス指定無し 165 return -1, nil 166 } else if status == status_normal { 167 return db.NORMAL, nil 168 } else if status == status_abnormal { 169 return db.ABNORMAL, nil 170 } else if status == status_running { 171 return db.RUNNING, nil 172 } else if status == status_warn { 173 return db.WARN, nil 174 } 175 return 0, fmt.Errorf("Unknown status type [%v].", status) 176 } 177 178 func parseFromTo(fromArg, toArg string, isUTC bool) (string, string, error) { 179 parseMethod := utctime.Parse 180 if !isUTC { 181 parseMethod = utctime.ParseLocaltime 182 } 183 var from, to string 184 if len(fromArg) != 0 { 185 f, err := parseMethod(utctime.Date8Num, fromArg) 186 if err != nil { 187 return "", "", fmt.Errorf("Invalid [from] format. [%s]", fromArg) 188 } 189 from = f.String() 190 } 191 if len(toArg) != 0 { 192 t, err := parseMethod(utctime.NoDelimiter, toArg+"235959.999") 193 if err != nil { 194 return "", "", fmt.Errorf("Invalid [to] format. [%s]", toArg) 195 } 196 197 to = t.String() 198 } 199 200 return from, to, nil 201 }