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 }
func PrintStack() { for i := 2; ; i++ { // ここと、呼び出し元のconsoleは出さない。 _, file, line, ok := runtime.Caller(i) if !ok { break } log.Error("\t", file, ":", line) } }
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 }
// 標準エラー出力へメッセージコード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) }
// セッションに対応した処理を実行する。 // 引数: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 }
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 }
// ネットワーク名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 }
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 }