github.com/hy3/cuto@v0.9.8-0.20160830082821-aa6652f877b7/master/main.go (about) 1 // Copyright 2015 unirita Inc. 2 // Created 2015/04/10 honda 3 4 package main 5 6 import ( 7 "flag" 8 "fmt" 9 "os" 10 11 "github.com/unirita/cuto/console" 12 "github.com/unirita/cuto/db" 13 "github.com/unirita/cuto/db/query" 14 "github.com/unirita/cuto/log" 15 "github.com/unirita/cuto/master/config" 16 "github.com/unirita/cuto/master/jobnet" 17 "github.com/unirita/cuto/message" 18 ) 19 20 // 実行時引数のオプション 21 type arguments struct { 22 versionFlag bool // バージョン情報表示フラグ 23 networkName string // ジョブネットワーク名 24 startFlag bool // 実行フラグ 25 rerunInstance int // リランを行うインスタンスID 26 configPath string // 設定ファイルのパス 27 } 28 29 // masterの戻り値 30 const ( 31 rc_OK = 0 32 rc_ERROR = 1 33 ) 34 35 // フラグ系実行時引数のON/OFF 36 const ( 37 flag_ON = true 38 flag_OFF = false 39 ) 40 41 const defaultConfig = `master.ini` 42 43 func main() { 44 args := fetchArgs() 45 rc := realMain(args) 46 os.Exit(rc) 47 } 48 49 func realMain(args *arguments) (rc int) { 50 rc = rc_OK 51 52 if args.versionFlag == flag_ON { 53 showVersion() 54 return 55 } 56 57 if args.networkName == "" && args.rerunInstance == 0 { 58 showUsage() 59 rc = rc_ERROR 60 return 61 } 62 63 if args.networkName != "" && args.rerunInstance != 0 { 64 console.Display("CTM019E", "Cannot use both -n and -r option.") 65 rc = rc_ERROR 66 return 67 } 68 69 if args.configPath == "" { 70 args.configPath = defaultConfig 71 } 72 73 message.MasterVersion = Version 74 75 if err := config.Load(args.configPath); err != nil { 76 console.Display("CTM019E", err) 77 console.Display("CTM004E", args.configPath) 78 rc = rc_ERROR 79 return 80 } 81 82 if err := config.DetectError(); err != nil { 83 console.Display("CTM005E", err) 84 rc = rc_ERROR 85 return 86 } 87 88 if err := log.Init(config.Dir.LogDir, 89 "master", 90 "", 91 config.Log.OutputLevel, 92 config.Log.MaxSizeKB, 93 config.Log.MaxGeneration, 94 config.Log.TimeoutSec); err != nil { 95 console.Display("CTM021E", err) 96 rc = rc_ERROR 97 return 98 } 99 defer log.Term() 100 console.Display("CTM001I", os.Getpid(), Version) 101 // master終了時のコンソール出力 102 defer func() { 103 console.Display("CTM002I", rc) 104 }() 105 106 if args.rerunInstance != 0 { 107 nwkResult, err := getNetworkResult(args.rerunInstance) 108 if err != nil { 109 console.Display("CTM019E", err) 110 rc = rc_ERROR 111 return 112 } 113 114 if nwkResult.Status == db.NORMAL || nwkResult.Status == db.WARN { 115 console.Display("CTM029I", args.rerunInstance) 116 return 117 } 118 119 args.networkName = nwkResult.JobnetWork 120 args.startFlag = flag_ON 121 } 122 123 nwk := jobnet.LoadNetwork(args.networkName) 124 if nwk == nil { 125 rc = rc_ERROR 126 return 127 } 128 defer nwk.Terminate() 129 130 if err := nwk.DetectFlowError(); err != nil { 131 console.Display("CTM011E", nwk.MasterPath, err) 132 rc = rc_ERROR 133 return 134 } 135 136 if args.startFlag == flag_OFF { 137 console.Display("CTM020I", nwk.MasterPath) 138 return 139 } 140 141 if err := nwk.LoadJobEx(); err != nil { 142 console.Display("CTM004E", nwk.JobExPath) 143 log.Error(err) 144 rc = rc_ERROR 145 return 146 } 147 148 var err error 149 if args.rerunInstance == 0 { 150 err = nwk.Run() 151 } else { 152 nwk.ID = args.rerunInstance 153 err = nwk.Rerun() 154 } 155 if err != nil { 156 console.Display("CTM013I", nwk.Name, nwk.ID, "ABNORMAL") 157 // ジョブ自体の異常終了では、エラーメッセージが空で返るので、出力しない 158 if len(err.Error()) != 0 { 159 log.Error(err) 160 } 161 rc = rc_ERROR 162 return 163 } 164 console.Display("CTM013I", nwk.Name, nwk.ID, "NORMAL") 165 return 166 } 167 168 // コマンドライン引数を解析し、arguments構造体を返す。 169 func fetchArgs() *arguments { 170 args := new(arguments) 171 flag.Usage = showUsage 172 flag.BoolVar(&args.versionFlag, "v", false, "version option") 173 flag.StringVar(&args.networkName, "n", "", "network name option") 174 flag.BoolVar(&args.startFlag, "s", false, "start option") 175 flag.IntVar(&args.rerunInstance, "r", 0, "rerun option") 176 flag.StringVar(&args.configPath, "c", "", "config file option") 177 flag.Parse() 178 return args 179 } 180 181 // バージョンを表示する。 182 func showVersion() { 183 fmt.Printf("%s\n", Version) 184 } 185 186 // オンラインヘルプを表示する。 187 func showUsage() { 188 console.Display("CTM003E") 189 fmt.Print(console.USAGE) 190 } 191 192 func getNetworkResult(instanceID int) (*db.JobNetworkResult, error) { 193 conn, err := db.Open(config.DB.DBFile) 194 if err != nil { 195 return nil, err 196 } 197 defer conn.Close() 198 199 return query.GetJobnetwork(conn, instanceID) 200 }