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  }