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  }