diff --git a/APIServer.go b/APIServer.go index 9bfc764..0bd909c 100644 --- a/APIServer.go +++ b/APIServer.go @@ -189,6 +189,7 @@ func startSvc() { http.HandleFunc("/getuutinfo/", handleGetUutInfo) http.HandleFunc("/racs/inbound/", handleRacsInbound) http.HandleFunc("/racs/outbound/", handleRacsOutbound) + http.HandleFunc("/racs/getfaillist/", handleRacsGetFailList) logger.Printf("[MSG] Starting HTTP Server On Port: %s\r\n", cfg.Settings.ListenPort) err := http.ListenAndServe(":"+cfg.Settings.ListenPort, nil) if err != nil { @@ -569,6 +570,23 @@ func handleRacsOutbound(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "%v", strings.ReplaceAll(fmt.Sprintf("%#v", rst), "map[string]string", "")) } +func handleRacsGetFailList(w http.ResponseWriter, r *http.Request) { + defer r.Body.Close() + if r.RequestURI == "/favicon.ico" { + return + } + addr := strings.Split(r.RemoteAddr, ":")[0] + uri := r.RequestURI + racs := new(racs.RACS) + rst := racs.GetFailList(cfg, logger, addr, uri) + rpl := strings.NewReplacer( + "map[string]string", "", + "map[int]map[string]string", "", + ) + w.WriteHeader(http.StatusOK) + fmt.Fprintf(w, "%v", rpl.Replace(fmt.Sprintf("%s", rst))) +} + func parseReqParams(r *http.Request) (map[string]string, error) { params := make(map[string]string, 0) if err := r.ParseForm(); err != nil { diff --git a/APIServer.yml b/APIServer.yml index 6c3d3b4..90fe696 100644 --- a/APIServer.yml +++ b/APIServer.yml @@ -13,10 +13,11 @@ MySQL: Database: ewsv3_f715 User: apisvc Password: wcqte - StorageTable: racs IssuesTable: issues IssuesView: v_issues OfflineView: v_offline + StorageTable: racs + GetFailListSQL: SELECT * FROM v_racs Remark: Columns_UutInfo: [usn,mac,ipaddr,status,message,first_ack,last_ack,last_change] Columns_LocInfo: [mac,line,col,row,num,last_found] diff --git a/cnf/cnf.go b/cnf/cnf.go index 7babbbc..69288fa 100644 --- a/cnf/cnf.go +++ b/cnf/cnf.go @@ -16,13 +16,14 @@ type Settings struct { } type MySQL struct { - Server string `yaml:"Server"` - Port string `yaml:"Port"` - Database string `yaml:"Database"` - User string `yaml:"User"` - Password string `yaml:"Password"` - IssuesTable string `yaml:"IssuesTable"` - StorageTable string `yaml:"StorageTable"` - IssuesView string `yaml:"IssuesView"` - OfflineView string `yaml:"OfflineView"` + Server string `yaml:"Server"` + Port string `yaml:"Port"` + Database string `yaml:"Database"` + User string `yaml:"User"` + Password string `yaml:"Password"` + IssuesTable string `yaml:"IssuesTable"` + IssuesView string `yaml:"IssuesView"` + OfflineView string `yaml:"OfflineView"` + StorageTable string `yaml:"StorageTable"` + GetFailListSQL string `yaml:"GetFailListSQL"` } diff --git a/racs/racs.go b/racs/racs.go index d67d1c5..a8ea85a 100644 --- a/racs/racs.go +++ b/racs/racs.go @@ -3,6 +3,7 @@ package racs import ( "APIServer/cnf" "database/sql" + "encoding/json" "fmt" "log" @@ -35,6 +36,7 @@ func (r *RACS) Inbound(cfg cnf.Cfg, logger *log.Logger, addr string, uri string, logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, rst["ErrMsg"]) return rst } + defer dbo.Close() dml := fmt.Sprintf(`INSERT INTO %s (usn,storage,update_time,mark1,mark2,mark3) VALUES ('%s','%s',%s,'%s','%s','%s') ON DUPLICATE KEY UPDATE @@ -77,6 +79,7 @@ func (r *RACS) Outbound(cfg cnf.Cfg, logger *log.Logger, addr string, uri string logger.Printf("[ERR] %s; %s; %#v; %s\r\n", addr, uri, params, rst["ErrMsg"]) return rst } + defer dbo.Close() dml := fmt.Sprintf(`INSERT INTO %s (usn,storage,update_time,mark1,mark2,mark3) VALUES ('%s','%s',%s,'%s','%s','%s') ON DUPLICATE KEY UPDATE @@ -102,3 +105,67 @@ func (r *RACS) Outbound(cfg cnf.Cfg, logger *log.Logger, addr string, uri string } return rst } + +func (r *RACS) GetFailList(cfg cnf.Cfg, logger *log.Logger, addr string, uri string) interface{} { + rst := map[string]interface{}{"Result": "OK", "ErrMsg": ""} + dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", + cfg.MySQL.User, + cfg.MySQL.Password, + cfg.MySQL.Server, + cfg.MySQL.Port, + cfg.MySQL.Database, + ) + dbo, err := sql.Open("mysql", dsn) + if err != nil { + rst["Result"] = "NG" + rst["ErrMsg"] = "racs.GetFailList: " + err.Error() + logger.Printf("[ERR] %s; %s; %s\r\n", addr, uri, rst["ErrMsg"]) + return rst + } + defer dbo.Close() + dml := cfg.MySQL.GetFailListSQL + qry, err := dbo.Query(dml) + if err != nil { + rst["Result"] = "NG" + rst["ErrMsg"] = "racs.GetFailList: " + err.Error() + logger.Printf("[ERR] %s; %s; %s\r\n", addr, uri, rst["ErrMsg"]) + return rst + } + cols, err := qry.Columns() + if err != nil { + rst["Result"] = "NG" + rst["ErrMsg"] = "racs.GetFailList: " + err.Error() + logger.Printf("[ERR] %s; %s; %s\r\n", addr, uri, rst["ErrMsg"]) + return rst + } + vals := make([][]byte, len(cols)) + scans := make([]interface{}, len(cols)) + for v := range vals { + scans[v] = &vals[v] + } + + list := make([]map[string]string, 0) + for qry.Next() { + if err := qry.Scan(scans...); err != nil { + rst["Result"] = "NG" + rst["ErrMsg"] = "racs.GetFailList: " + err.Error() + logger.Printf("[ERR] %s; %s; %s\r\n", addr, uri, rst["ErrMsg"]) + return rst + } + row := make(map[string]string) + for k, v := range vals { + key := cols[k] + row[key] = string(v) + } + list = append(list, row) + } + rst["List"] = list + jsonData, err := json.Marshal(rst) + if err != nil { + rst["Result"] = "NG" + rst["ErrMsg"] = "racs.GetFailList: " + err.Error() + logger.Printf("[ERR] %s; %s; %s\r\n", addr, uri, rst["ErrMsg"]) + return rst + } + return jsonData +}