Beispiel #1
0
func receiveMessage(conn net.Conn, sq chan<- *Session) error {
	const timeout = 10

	deadLine := time.Now().Add(timeout * time.Second)
	if err := conn.SetReadDeadline(deadLine); err != nil {
		log.Error(fmt.Sprintf("[%v]: %v\n", conn.RemoteAddr(), err))
		return err
	}

	scanner := bufio.NewScanner(conn)
	if !scanner.Scan() {
		log.Error(fmt.Sprintf("[%v]: %v\n", conn.RemoteAddr(), scanner.Err()))
		return scanner.Err()
	}
	sq <- NewSession(conn, scanner.Text())
	return nil
}
Beispiel #2
0
func PrintStack() {
	for i := 2; ; i++ { // ここと、呼び出し元のconsoleは出さない。
		_, file, line, ok := runtime.Caller(i)
		if !ok {
			break
		}
		log.Error("\t", file, ":", line)
	}
}
Beispiel #3
0
func receiveLoopProcess(listener net.Listener, sq chan<- *Session) error {
	conn, err := listener.Accept()
	if err != nil {
		log.Error(err)
		return err
	}

	console.Display("CTS014I")
	go receiveMessage(conn, sq)
	return nil
}
Beispiel #4
0
// 標準エラー出力へメッセージコードcodeに対応したメッセージを表示する。
//
// param : code メッセージコードID。
//
// param : a... メッセージの書式制御文字に渡す内容。
//
// return : 出力文字数。
//
// return : エラー情報。
func DisplayError(code string, a ...interface{}) (int, error) {
	msg := GetMessage(code, a...)
	log.Error(msg)

	for _, s := range stack_msg {
		if code == s {
			PrintStack()
		}
	}
	return fmt.Fprintln(os.Stderr, msg)
}
Beispiel #5
0
// セッションに対応した処理を実行する。
// 引数:conf 設定情報
// 戻り値:なし
func (s *Session) Do(conf *config.ServantConfig) error {
	defer s.Conn.Close()
	defer s.endHeartbeat()

	var msg string
	req := new(message.Request)
	if err := req.ParseJSON(s.Body); err != nil {
		chk := new(message.JobCheck)
		if err := chk.ParseJSON(s.Body); err != nil {
			console.Display("CTS015E", err.Error())
			return err
		}

		resultMsg, err := s.doJobCheck(chk, conf)
		if err != nil {
			log.Error(err)
			return err
		}

		msg = resultMsg
	} else {
		resMsg, err := s.doRequest(req, conf)
		if err != nil {
			log.Error(err)
			return err
		}
		msg = resMsg
	}

	if _, err := s.Conn.Write([]byte(msg + MsgEnd)); err != nil {
		log.Error(err)
		return err
	}

	return nil
}
Beispiel #6
0
func realMain(args *arguments) int {
	if args.v {
		showVersion()
		return rc_OK
	}
	message.ServantVersion = Version

	// システム変数のセット
	message.AddSysValue("ROOT", "", util.GetRootPath())

	config.ReadConfig(args.configPath)
	if err := config.Servant.DetectError(); err != nil {
		console.Display("CTS005E", err)
		return rc_error
	}

	// ログ出力開始
	if err := log.Init(config.Servant.Dir.LogDir,
		"servant",
		strconv.Itoa(config.Servant.Sys.BindPort),
		config.Servant.Log.OutputLevel,
		config.Servant.Log.MaxSizeKB,
		config.Servant.Log.MaxGeneration,
		config.Servant.Log.TimeoutSec); err != nil {
		console.Display("CTS023E", err)
		return rc_error
	}
	defer log.Term()
	console.Display("CTS001I", os.Getpid(), Version)

	// メイン処理開始
	exitCode, err := Run()

	if err != nil {
		log.Error(err)
		exitCode = rc_error
	}
	console.Display("CTS002I", exitCode)
	return exitCode
}
Beispiel #7
0
// ネットワーク名nameを元にネットワーク定義ファイルをロードし、Network構造体のオブジェクトを返す。
//
// param : name ジョブネットワーク名。
//
// return : ジョブネットワーク構造体。
func LoadNetwork(name string) *Network {
	nwk, err := NewNetwork(name)
	if err != nil {
		console.Display("CTM019E", err)
		return nil
	}

	file, err := os.Open(nwk.MasterPath)
	if err != nil {
		console.Display("CTM010E", nwk.MasterPath)
		log.Error(err)
		return nil
	}
	defer file.Close()

	err = nwk.LoadElements(file)
	if err != nil {
		console.Display("CTM011E", nwk.MasterPath, err)
		return nil
	}

	return nwk
}
Beispiel #8
0
func realMain(args *arguments) int {
	if args.versionFlag == flag_ON {
		showVersion()
		return rc_OK
	}

	if args.networkName == "" && args.rerunInstance == 0 {
		showUsage()
		return rc_ERROR
	}

	if args.networkName != "" && args.rerunInstance != 0 {
		console.Display("CTM019E", "Cannot use both -n and -r option.")
		return rc_ERROR
	}

	if args.configPath == "" {
		args.configPath = defaultConfig
	}

	message.MasterVersion = Version

	if err := config.Load(args.configPath); err != nil {
		console.Display("CTM004E", args.configPath)
		return rc_ERROR
	}

	if err := config.DetectError(); err != nil {
		console.Display("CTM005E", err)
		return rc_ERROR
	}

	if err := log.Init(config.Dir.LogDir,
		"master",
		"",
		config.Log.OutputLevel,
		config.Log.MaxSizeKB,
		config.Log.MaxGeneration,
		config.Log.TimeoutSec); err != nil {
		console.Display("CTM021E", err)
		return rc_ERROR
	}
	defer log.Term()
	console.Display("CTM001I", os.Getpid(), Version)
	// master終了時のコンソール出力
	var rc int
	defer func() {
		console.Display("CTM002I", rc)
	}()

	if args.rerunInstance != 0 {
		nwkResult, err := getNetworkResult(args.rerunInstance)
		if err != nil {
			console.Display("CTM019E", err)
			return rc_ERROR
		}

		if nwkResult.Status == db.NORMAL || nwkResult.Status == db.WARN {
			console.Display("CTM029I", args.rerunInstance)
			return rc_OK
		}

		args.networkName = nwkResult.JobnetWork
		args.startFlag = flag_ON
	}

	nwk := jobnet.LoadNetwork(args.networkName)
	if nwk == nil {
		rc = rc_ERROR
		return rc
	}
	defer nwk.Terminate()

	err := nwk.DetectFlowError()
	if err != nil {
		console.Display("CTM011E", nwk.MasterPath, err)
		rc = rc_ERROR
		return rc
	}

	if args.startFlag == flag_OFF {
		console.Display("CTM020I", nwk.MasterPath)
		rc = rc_OK
		return rc
	}

	err = nwk.LoadJobEx()
	if err != nil {
		console.Display("CTM004E", nwk.JobExPath)
		log.Error(err)
		rc = rc_ERROR
		return rc
	}

	if args.rerunInstance == 0 {
		err = nwk.Run()
	} else {
		nwk.ID = args.rerunInstance
		err = nwk.Rerun()
	}
	if err != nil {
		console.Display("CTM013I", nwk.Name, nwk.ID, "ABNORMAL")
		// ジョブ自体の異常終了では、エラーメッセージが空で返るので、出力しない
		if len(err.Error()) != 0 {
			log.Error(err)
		}
		rc = rc_ERROR
		return rc
	}
	console.Display("CTM013I", nwk.Name, nwk.ID, "NORMAL")
	rc = rc_OK
	return rc
}