From 5e2374edf0155ef312a07ad89b00cbef626cb75e Mon Sep 17 00:00:00 2001 From: Don Hsieh Date: Thu, 22 Oct 2015 11:13:15 +0800 Subject: [PATCH] [OWL-143] refactor Zabbix API using Beego ORM --- g/cfg.go | 21 +- http/http.go | 24 + http/zabbix_http.go | 1041 ++++++++++++++++++++++++------------------- 3 files changed, 631 insertions(+), 455 deletions(-) diff --git a/g/cfg.go b/g/cfg.go index 0ab09e1..059e551 100644 --- a/g/cfg.go +++ b/g/cfg.go @@ -22,10 +22,25 @@ type GraphConfig struct { Cluster map[string]string `json:"cluster"` } +type ApiConfig struct { + Name string `json:"name"` + Token string `json:"token"` + Url string `json:"url"` +} + +type DatabaseConfig struct { + Ip string `json:"ip"` + Port string `json:"port"` + Account string `json:"account"` + Password string `json:"password"` +} + type GlobalConfig struct { - Debug string `json:"debug"` - Http *HttpConfig `json:"http"` - Graph *GraphConfig `json:"graph"` + Debug string `json:"debug"` + Http *HttpConfig `json:"http"` + Graph *GraphConfig `json:"graph"` + Api *ApiConfig `json:"api"` + Database *DatabaseConfig `json:"database"` } var ( diff --git a/http/http.go b/http/http.go index 390a4e1..5dc0085 100644 --- a/http/http.go +++ b/http/http.go @@ -1,6 +1,9 @@ package http import ( + "github.com/astaxie/beego/orm" + _ "github.com/go-sql-driver/mysql" + "encoding/json" "log" "net/http" @@ -26,6 +29,27 @@ func Start() { configGraphRoutes() configZabbixRoutes() + // start mysql database + account := g.Config().Database.Account + password := g.Config().Database.Password + ip := g.Config().Database.Ip + port := g.Config().Database.Port + database := "graph" + strConn := account + ":" + password + "@tcp(" + ip + ":" + port + ")/" + database + "?charset=utf8" + orm.RegisterDriver("mysql", orm.DR_MySQL) + maxIdle := 30 + maxConn := 30 + orm.RegisterDataBase("default", "mysql", strConn, maxIdle, maxConn) + + database = "falcon_portal" + strConn = account + ":" + password + "@tcp(" + ip + ":" + port + ")/" + database + "?charset=utf8" + orm.RegisterDataBase("falcon_portal", "mysql", strConn, maxIdle, maxConn) + orm.RegisterModel(new(Endpoint)) + orm.RegisterModel(new(Grp)) + orm.RegisterModel(new(Grp_host)) + orm.RegisterModel(new(Grp_tpl)) + orm.RegisterModel(new(Tpl)) + // start http server addr := g.Config().Http.Listen s := &http.Server{ diff --git a/http/zabbix_http.go b/http/zabbix_http.go index 5cb58e7..c4fdd1d 100644 --- a/http/zabbix_http.go +++ b/http/zabbix_http.go @@ -2,126 +2,89 @@ package http import ( "bytes" - "database/sql" "encoding/json" - "flag" + "github.com/astaxie/beego/orm" "github.com/bitly/go-simplejson" - _ "github.com/go-sql-driver/mysql" - "github.com/toolkits/file" "log" "net/http" - "os" "reflect" "strconv" - "sync" "time" ) -type DatabaseConfig struct { - Addr string `json:"addr"` - Account string `json:"account"` - Password string `json:"password"` +type Endpoint struct { + Id int + Endpoint string + Ts int64 + T_create string + T_modify string } -type GlobalConfig struct { - Debug bool `json:"debug"` - Hostname string `json:"hostname"` - IP string `json:"ip"` - Database *DatabaseConfig `json:"database"` +type Grp struct { + Id int + Grp_name string + Create_user string + Create_at string + Come_from int } -var ( - ConfigFile string - config *GlobalConfig - lock = new(sync.RWMutex) -) - -func initDb() { - str := config.Database.Account + ":" + config.Database.Password + "@tcp(" + config.Database.Addr + ")/graph?charset=utf8" - db, err := sql.Open("mysql", str) - db.SetMaxOpenConns(2000) - db.SetMaxIdleConns(1000) - defer db.Close() - - if err != nil { - log.Println("Oh noez, could not connect to database") - return - } +type Tpl struct { + Id int + Tpl_name string + Parent_id int + Action_id int + Create_user string + Create_at string } -func readDb(endpointId int) { - str := config.Database.Account + ":" + config.Database.Password + "@tcp(" + config.Database.Addr + ")/graph?charset=utf8" - db, err := sql.Open("mysql", str) - db.SetMaxOpenConns(2000) - db.SetMaxIdleConns(1000) - defer db.Close() - - if err != nil { - log.Println("Oh noez, could not connect to database") - return - } - - stmtOut, err := db.Prepare("SELECT endpoint FROM graph.endpoint WHERE id = ?") - if err != nil { - log.Println(err.Error()) - } - defer stmtOut.Close() - - var endpoint string // we "scan" the result in here - - err = stmtOut.QueryRow(endpointId).Scan(&endpoint) // WHERE id = endpointId - if err != nil { - log.Println(err.Error()) - return - } - log.Printf("The endpoint name of %d is: %s", endpointId, endpoint) +type Grp_tpl struct { + Id int + Grp_id int + Tpl_id int + Bind_user string } -func writeDb(sqlcmd string, args []interface{}) { - str := config.Database.Account + ":" + config.Database.Password + "@tcp(" + config.Database.Addr + ")/graph?charset=utf8" - db, err := sql.Open("mysql", str) - db.SetMaxOpenConns(2000) - db.SetMaxIdleConns(1000) - defer db.Close() - - if err != nil { - log.Println("Oh noez, could not connect to database") - return - } - - stmtIns, err := db.Prepare(sqlcmd) - if err != nil { - log.Println(err.Error()) - return - } - defer stmtIns.Close() - - if result, err := stmtIns.Exec(args); err == nil { - if id, err := result.LastInsertId(); err == nil { - log.Println("insert id :", id) - } else { - log.Println(err.Error()) - } - } else { - log.Println(err.Error()) - } +type Grp_host struct { + Id int + Grp_id int + Host_id int } -func RenderJson(w http.ResponseWriter, v interface{}) { - bs, err := json.Marshal(v) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.Write(bs) +/** + * @function name: func getNow() string + * @description: This function gets string of current time. + * @related issues: OWL-093 + * @param: void + * @return: now sting + * @author: Don Hsieh + * @since: 10/21/2015 + * @last modified: 10/21/2015 + * @called by: func hostCreate(nodes map[string]interface{}, rw http.ResponseWriter) + * func hostgroupCreate(nodes map[string]interface{}, rw http.ResponseWriter) + * func templateCreate(nodes map[string]interface{}, rw http.ResponseWriter) + * func hostUpdate(nodes map[string]interface{}, rw http.ResponseWriter) + */ +func getNow() string { + t := time.Now() + now := t.Format("2006-01-02 15:04:05") + return now } -func RenderMsgJson(w http.ResponseWriter, msg string) { - RenderJson(w, map[string]string{"msg": msg}) -} +/** + * @function name: func hostCreate(nodes map[string]interface{}, rw http.ResponseWriter) + * @description: This function gets host data for database insertion. + * @related issues: OWL-093, OWL-086, OWL-085 + * @param: nodes map[string]interface{} + * @param: rw http.ResponseWriter + * @return: void + * @author: Don Hsieh + * @since: 09/11/2015 + * @last modified: 10/21/2015 + * @called by: func apiParser(rw http.ResponseWriter, req *http.Request) + */ func hostCreate(nodes map[string]interface{}, rw http.ResponseWriter) { + log.Println("func hostCreate()") params := nodes["params"].(map[string]interface{}) host := params["host"].(string) interfaces := params["interfaces"].([]interface{}) @@ -152,142 +115,220 @@ func hostCreate(nodes map[string]interface{}, rw http.ResponseWriter) { inventory := params["inventory"].(map[string]interface{}) macAddr := inventory["macaddress_a"].(string) + inventory["macaddress_b"].(string) - args2 := map[string]string{ - "host": host, - "ip": ip, - "port": port, - "groupId": groupId, + args2 := map[string]string { + "host": host, + "ip": ip, + "port": port, + "groupId": groupId, "templateId": templateId, - "macAddr": macAddr, + "macAddr": macAddr, } + log.Println(args2) t := time.Now() timestamp := t.Unix() - now := t.Format("2006-01-02 15:04:05") - args := []interface{}{} - args = append(args, host) - args = append(args, timestamp) - args = append(args, now) - args = append(args, now) - - sqlcmd := "INSERT INTO graph.endpoint (endpoint,ts,t_create,t_modify) VALUES(?, ?, ?, ?)" - str := config.Database.Account + ":" + config.Database.Password + "@tcp(" + config.Database.Addr + ")/graph?charset=utf8" - db, err := sql.Open("mysql", str) - db.SetMaxOpenConns(2000) - db.SetMaxIdleConns(1000) - defer db.Close() + log.Println(timestamp) + now := getNow() - if err != nil { - log.Println("Oh noez, could not connect to database") - return - } + database := "graph" + o := orm.NewOrm() + o.Using(database) - stmtIns, err := db.Prepare(sqlcmd) - if err != nil { - log.Println(err.Error()) - return + endpoint := Endpoint{ + Endpoint: host, + Ts: timestamp, + T_create: now, + T_modify: now, } - defer stmtIns.Close() - resp := nodes delete(resp, "params") var result = make(map[string]interface{}) - if sqlResult, err := stmtIns.Exec(host, timestamp, now, now); err == nil { - if id, err := sqlResult.LastInsertId(); err == nil { + + log.Println("endpoint =", endpoint) + id, err := o.Insert(&endpoint) + if err != nil { + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} + } else { + grp_id, err := strconv.Atoi(groupId) + grp_host := Grp_host{ + Grp_id: grp_id, + Host_id: int(id), + } + log.Println("grp_host =", grp_host) + database := "falcon_portal" + o.Using(database) + created, grp_host_id, err := o.ReadOrCreate(&grp_host, "Grp_id", "Host_id") + if err != nil { + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} + } else { + log.Println("is created:", created) + log.Println("grp_host_id:", grp_host_id) hostid := strconv.Itoa(int(id)) hostids := [1]string{string(hostid)} result["hostids"] = hostids - } else { - log.Println(err.Error()) } - } else { - log.Println(err.Error()) } resp["result"] = result RenderJson(rw, resp) } +/** + * @function name: func hostDelete(nodes map[string]interface{}, rw http.ResponseWriter) + * @description: This function deletes host from "endpoint" table. + * @related issues: OWL-093, OWL-086, OWL-085 + * @param: nodes map[string]interface{} + * @param: rw http.ResponseWriter + * @return: void + * @author: Don Hsieh + * @since: 09/11/2015 + * @last modified: 10/21/2015 + * @called by: func apiParser(rw http.ResponseWriter, req *http.Request) + */ func hostDelete(nodes map[string]interface{}, rw http.ResponseWriter) { - params := nodes["params"].([]interface{}) - - str := config.Database.Account + ":" + config.Database.Password + "@tcp(" + config.Database.Addr + ")/graph?charset=utf8" - db, err := sql.Open("mysql", str) - db.SetMaxOpenConns(2000) - db.SetMaxIdleConns(1000) - defer db.Close() - - if err != nil { - log.Println("Oh noez, could not connect to database") - return - } - - sqlcmd := "DELETE FROM graph.endpoint WHERE id=?" - stmtIns, err := db.Prepare(sqlcmd) - if err != nil { - log.Println(err.Error()) - return - } - defer stmtIns.Close() + params := nodes["params"].([]interface {}) + resp := nodes + delete(resp, "params") + var result = make(map[string]interface{}) + o := orm.NewOrm() hostids := []string{} for _, hostId := range params { - if result, err := stmtIns.Exec(hostId); err == nil { - if RowsAffected, err := result.RowsAffected(); err == nil { - if RowsAffected > 0 { + if id, err := strconv.Atoi(hostId.(string)); err == nil { + num, err := o.Delete(&Endpoint{Id: id}) + if err != nil { + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} + } else { + if num > 0 { hostids = append(hostids, hostId.(string)) + log.Println("RowsDeleted:", num) } - } else { - log.Println(err.Error()) } - } else { - log.Println(err.Error()) } } - resp := nodes - delete(resp, "params") - var result = make(map[string]interface{}) + + database := "falcon_portal" + o.Using(database) + for _, hostId := range params { + sql := "DELETE FROM grp_host WHERE host_id = ?" + res, err := o.Raw(sql, hostId).Exec() + if err != nil { + log.Println("Error:", err) + } + num, _ := res.RowsAffected() + log.Println("mysql row affected nums:", num) + } + result["hostids"] = hostids resp["result"] = result RenderJson(rw, resp) } +/** + * @function name: func hostUpdate(nodes map[string]interface{}, rw http.ResponseWriter) + * @description: This function updates host data. + * @related issues: OWL-093, OWL-086 + * @param: nodes map[string]interface{} + * @param: rw http.ResponseWriter + * @return: void + * @author: Don Hsieh + * @since: 09/23/2015 + * @last modified: 10/21/2015 + * @called by: func apiParser(rw http.ResponseWriter, req *http.Request) + */ func hostUpdate(nodes map[string]interface{}, rw http.ResponseWriter) { log.Println("func hostUpdate()") params := nodes["params"].(map[string]interface{}) - hostName := params["host"].(string) - hostId := params["hostid"].(string) - now := time.Now().Format("2006-01-02 15:04:05") - sqlcmd := "UPDATE graph.endpoint SET endpoint = ?, t_modify = ? WHERE id = ?" - - str := config.Database.Account + ":" + config.Database.Password + "@tcp(" + config.Database.Addr + ")/graph?charset=utf8" - db, err := sql.Open("mysql", str) - db.SetMaxOpenConns(2000) - db.SetMaxIdleConns(1000) - defer db.Close() - + var result = make(map[string]interface{}) + hostId, err := strconv.Atoi(params["hostid"].(string)) if err != nil { - log.Println("Oh noez, could not connect to database") - return + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} } + now := getNow() + log.Println("now:", now) - stmtIns, err := db.Prepare(sqlcmd) - if err != nil { - log.Println(err.Error()) - return + o := orm.NewOrm() + + if _, ok := params["host"]; ok { + hostName := params["host"].(string) + log.Println("hostName:", hostName) + + if hostName != "" { + endpoint := Endpoint{Id: hostId} + log.Println("endpoint:", endpoint) + err := o.Read(&endpoint) + if err != nil { + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} + } else { + log.Println("endpoint:", endpoint) + endpoint.Endpoint = hostName + endpoint.T_modify = now + num, err := o.Update(&endpoint) + if err != nil { + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} + } else { + if num > 0 { + hostids := [1]string{strconv.Itoa(hostId)} + result["hostids"] = hostids + log.Println("update hostId:", hostId) + log.Println("mysql row affected nums:", num) + } + } + } + } } - defer stmtIns.Close() - var result = make(map[string]interface{}) - if sqlResult, err := stmtIns.Exec(hostName, now, hostId); err == nil { - if RowsAffected, err := sqlResult.RowsAffected(); err == nil { - if RowsAffected > 0 { - hostids := [1]string{hostId} - result["hostids"] = hostids + if _, ok := params["groups"]; ok { + groups := params["groups"].([]interface{}) + log.Println("groups:", groups) + + count := 0 + for _, group := range groups { + log.Println("group:", group) + count += 1 + } + log.Println("count:", count) + + if count > 0 { + database := "falcon_portal" + o.Using(database) + + sqlcmd := "DELETE FROM falcon_portal.grp_host WHERE host_id=?" + res, err := o.Raw(sqlcmd, hostId).Exec() + if err != nil { + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} + } else { + num, _ := res.RowsAffected() + if num > 0 { + log.Println("mysql row affected nums:", num) + } + } + + for _, group := range groups { + log.Println("group:", group) + groupId, err := strconv.Atoi(group.(map[string]interface{})["groupid"].(string)) + log.Println("groupId:", groupId) + grp_host := Grp_host{Grp_id: groupId, Host_id: hostId} + log.Println("grp_host:", grp_host) + + database := "falcon_portal" + o.Using(database) + _, err = o.Insert(&grp_host) + if err != nil { + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} + } else { + hostids := [1]string{strconv.Itoa(hostId)} + result["hostids"] = hostids + log.Println("update hostId:", hostId) + } } - } else { - log.Println(err.Error()) } - } else { - log.Println(err.Error()) } resp := nodes delete(resp, "params") @@ -295,136 +336,162 @@ func hostUpdate(nodes map[string]interface{}, rw http.ResponseWriter) { RenderJson(rw, resp) } +/** + * @function name: func hostgroupCreate(nodes map[string]interface{}, rw http.ResponseWriter) + * @description: This function gets hostgroup data for database insertion. + * @related issues: OWL-093, OWL-086 + * @param: nodes map[string]interface{} + * @param: rw http.ResponseWriter + * @return: void + * @author: Don Hsieh + * @since: 09/21/2015 + * @last modified: 10/21/2015 + * @called by: func apiParser(rw http.ResponseWriter, req *http.Request) + */ func hostgroupCreate(nodes map[string]interface{}, rw http.ResponseWriter) { + log.Println("func hostgroupCreate()") params := nodes["params"].(map[string]interface{}) hostgroupName := params["name"].(string) + user := "zabbix" + now := getNow() - sqlcmd := "INSERT INTO falcon_portal.grp (grp_name) VALUES(?)" - str := config.Database.Account + ":" + config.Database.Password + "@tcp(" + config.Database.Addr + ")/falcon_portal?charset=utf8" - db, err := sql.Open("mysql", str) - db.SetMaxOpenConns(2000) - db.SetMaxIdleConns(1000) - defer db.Close() + database := "falcon_portal" + o := orm.NewOrm() + o.Using(database) - if err != nil { - log.Println("Oh noez, could not connect to database") - return - } - - stmtIns, err := db.Prepare(sqlcmd) - if err != nil { - log.Println(err.Error()) - return + grp := Grp{ + Grp_name: hostgroupName, + Create_user: user, + Create_at: now, } - defer stmtIns.Close() + log.Println("grp =", grp) + resp := nodes + delete(resp, "params") var result = make(map[string]interface{}) - if sqlResult, err := stmtIns.Exec(hostgroupName); err == nil { - if id, err := sqlResult.LastInsertId(); err == nil { - groupid := strconv.Itoa(int(id)) - groupids := [1]string{string(groupid)} - result["groupids"] = groupids - } else { - log.Println(err.Error()) - } + + id, err := o.Insert(&grp) + if err != nil { + log.Println("Error:", err) + log.Println("TypeOf(err):", reflect.TypeOf(err)) // *mysql.MySQLError + log.Println("TypeOf(err.Error()):", reflect.TypeOf(err.Error())) // string + result["error"] = [1]string{string(err.Error())} } else { - log.Println(err.Error()) + groupid := strconv.Itoa(int(id)) + groupids := [1]string{string(groupid)} + result["groupids"] = groupids } - resp := nodes - delete(resp, "params") resp["result"] = result RenderJson(rw, resp) } +/** + * @function name: func hostgroupDelete(nodes map[string]interface{}, rw http.ResponseWriter) + * @description: This function gets hostgroup data for database insertion. + * @related issues: OWL-093, OWL-086 + * @param: nodes map[string]interface{} + * @param: rw http.ResponseWriter + * @return: void + * @author: Don Hsieh + * @since: 09/21/2015 + * @last modified: 10/21/2015 + * @called by: func apiParser(rw http.ResponseWriter, req *http.Request) + */ func hostgroupDelete(nodes map[string]interface{}, rw http.ResponseWriter) { - params := nodes["params"].([]interface{}) + log.Println("func hostgroupDelete()") + params := nodes["params"].([]interface {}) - str := config.Database.Account + ":" + config.Database.Password + "@tcp(" + config.Database.Addr + ")/falcon_portal?charset=utf8" - db, err := sql.Open("mysql", str) - db.SetMaxOpenConns(2000) - db.SetMaxIdleConns(1000) - defer db.Close() + resp := nodes + delete(resp, "params") + var result = make(map[string]interface{}) - if err != nil { - log.Println("Oh noez, could not connect to database") - return - } + o := orm.NewOrm() + database := "falcon_portal" + o.Using(database) args := []interface{}{} args = append(args, "DELETE FROM falcon_portal.grp WHERE id=?") args = append(args, "DELETE FROM falcon_portal.grp_host WHERE grp_id=?") args = append(args, "DELETE FROM falcon_portal.grp_tpl WHERE grp_id=?") args = append(args, "DELETE FROM falcon_portal.plugin_dir WHERE grp_id=?") + log.Println("args =", args) groupids := []string{} for _, sqlcmd := range args { - stmtIns, err := db.Prepare(sqlcmd.(string)) - if err != nil { - log.Println(err.Error()) - return - } - defer stmtIns.Close() - for _, hostgroupId := range params { - if result, err := stmtIns.Exec(hostgroupId); err == nil { - if RowsAffected, err := result.RowsAffected(); err == nil { - if RowsAffected > 0 && sqlcmd == "DELETE FROM falcon_portal.grp WHERE id=?" { - groupids = append(groupids, hostgroupId.(string)) - log.Println("delete hostgroup id:", hostgroupId) - } - } else { - log.Println(err.Error()) - } + res, err := o.Raw(sqlcmd.(string), hostgroupId).Exec() + if err != nil { + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} } else { - log.Println(err.Error()) + num, _ := res.RowsAffected() + if num > 0 && sqlcmd == "DELETE FROM falcon_portal.grp WHERE id=?" { + groupids = append(groupids, hostgroupId.(string)) + log.Println("delete hostgroup id:", hostgroupId) + log.Println("mysql row affected nums:", num) + } } } } - resp := nodes - delete(resp, "params") - var result = make(map[string]interface{}) result["groupids"] = groupids resp["result"] = result RenderJson(rw, resp) } +/** + * @function name: func hostgroupUpdate(nodes map[string]interface{}, rw http.ResponseWriter) + * @description: This function gets hostgroup data for database insertion. + * @related issues: OWL-093, OWL-086 + * @param: nodes map[string]interface{} + * @param: rw http.ResponseWriter + * @return: void + * @author: Don Hsieh + * @since: 09/21/2015 + * @last modified: 10/21/2015 + * @called by: func apiParser(rw http.ResponseWriter, req *http.Request) + */ func hostgroupUpdate(nodes map[string]interface{}, rw http.ResponseWriter) { + log.Println("func hostgroupUpdate()") params := nodes["params"].(map[string]interface{}) - hostgroupId := params["groupid"].(string) - hostgroupName := params["name"].(string) - sqlcmd := "UPDATE falcon_portal.grp SET grp_name = ? WHERE id = ?" - - str := config.Database.Account + ":" + config.Database.Password + "@tcp(" + config.Database.Addr + ")/falcon_portal?charset=utf8" - db, err := sql.Open("mysql", str) - db.SetMaxOpenConns(2000) - db.SetMaxIdleConns(1000) - defer db.Close() - + var result = make(map[string]interface{}) + hostgroupId, err := strconv.Atoi(params["groupid"].(string)) if err != nil { - log.Println("Oh noez, could not connect to database") - return + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} } + o := orm.NewOrm() + database := "falcon_portal" + o.Using(database) - stmtIns, err := db.Prepare(sqlcmd) - if err != nil { - log.Println(err.Error()) - return - } - defer stmtIns.Close() + if _, ok := params["name"]; ok { + hostgroupName := params["name"].(string) + log.Println("hostgroupName:", hostgroupName) - var result = make(map[string]interface{}) - if sqlResult, err := stmtIns.Exec(hostgroupName, hostgroupId); err == nil { - if RowsAffected, err := sqlResult.RowsAffected(); err == nil { - if RowsAffected > 0 { - groupids := [1]string{hostgroupId} - result["groupids"] = groupids - log.Println("update groupid : ", hostgroupId) + if hostgroupName != "" { + grp := Grp{Id: hostgroupId} + log.Println("grp:", grp) + err := o.Read(&grp) + if err != nil { + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} + } else { + log.Println("grp:", grp) + grp.Grp_name = hostgroupName + log.Println("grp:", grp) + num, err := o.Update(&grp) + if err != nil { + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} + } else { + if num > 0 { + groupids := [1]string{strconv.Itoa(hostgroupId)} + result["groupids"] = groupids + log.Println("update groupid:", hostgroupId) + log.Println("mysql row affected nums:", num) + } + } } - } else { - log.Println(err.Error()) } - } else { - log.Println(err.Error()) } resp := nodes delete(resp, "params") @@ -432,242 +499,312 @@ func hostgroupUpdate(nodes map[string]interface{}, rw http.ResponseWriter) { RenderJson(rw, resp) } +/** + * @function name: func templateCreate(nodes map[string]interface{}, rw http.ResponseWriter) + * @description: This function gets template data for database insertion. + * @related issues: OWL-093, OWL-086 + * @param: nodes map[string]interface{} + * @param: rw http.ResponseWriter + * @return: void + * @author: Don Hsieh + * @since: 09/22/2015 + * @last modified: 10/21/2015 + * @called by: func apiParser(rw http.ResponseWriter, req *http.Request) + */ func templateCreate(nodes map[string]interface{}, rw http.ResponseWriter) { + log.Println("func templateCreate()") params := nodes["params"].(map[string]interface{}) templateName := params["host"].(string) - user := "root" + user := "zabbix" groups := params["groups"] groupid := groups.(map[string]interface{})["groupid"].(json.Number) hostgroupId := string(groupid) + now := getNow() - str := config.Database.Account + ":" + config.Database.Password + "@tcp(" + config.Database.Addr + ")/falcon_portal?charset=utf8" - db, err := sql.Open("mysql", str) - db.SetMaxOpenConns(2000) - db.SetMaxIdleConns(1000) - defer db.Close() + database := "falcon_portal" + o := orm.NewOrm() + o.Using(database) - if err != nil { - log.Println("Oh noez, could not connect to database") - return + tpl := Tpl{ + Tpl_name: templateName, + Create_user: user, + Create_at: now, } + log.Println("tpl =", tpl) - sqlcmd := "INSERT INTO falcon_portal.tpl (tpl_name, create_user) VALUES(?, ?)" + resp := nodes + delete(resp, "params") + var result = make(map[string]interface{}) - stmtIns, err := db.Prepare(sqlcmd) + id, err := o.Insert(&tpl) if err != nil { - log.Println(err.Error()) - return - } - defer stmtIns.Close() - - var result = make(map[string]interface{}) - if sqlResult, err := stmtIns.Exec(templateName, user); err == nil { - if id, err := sqlResult.LastInsertId(); err == nil { - templateId := strconv.Itoa(int(id)) - templateids := [1]string{string(templateId)} - result["templateids"] = templateids - - sqlcmd = "INSERT INTO falcon_portal.grp_tpl (grp_id, tpl_id, bind_user) VALUES(?, ?, ?)" - stmtIns, err = db.Prepare(sqlcmd) - if err != nil { - log.Println(err.Error()) - return - } - defer stmtIns.Close() + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} + } else { + templateId := strconv.Itoa(int(id)) + templateids := [1]string{string(templateId)} + result["templateids"] = templateids + + groupId, err := strconv.Atoi(hostgroupId) + grp_tpl := Grp_tpl{ + Grp_id: groupId, + Tpl_id: int(id), + Bind_user: user, + } + log.Println("grp_tpl =", grp_tpl) - if result, err := stmtIns.Exec(hostgroupId, templateId, user); err == nil { - if id, err := result.LastInsertId(); err == nil { - log.Println("insert id :", id) - } else { - log.Println(err.Error()) - } - } else { - log.Println(err.Error()) - } - } else { - log.Println(err.Error()) + _, err = o.Insert(&grp_tpl) + if err != nil { + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} } - } else { - log.Println(err.Error()) } - resp := nodes - delete(resp, "params") resp["result"] = result RenderJson(rw, resp) } +/** + * @function name: func templateDelete(nodes map[string]interface{}, rw http.ResponseWriter) + * @description: This function deletes template data. + * @related issues: OWL-093, OWL-086 + * @param: nodes map[string]interface{} + * @param: rw http.ResponseWriter + * @return: void + * @author: Don Hsieh + * @since: 09/22/2015 + * @last modified: 10/21/2015 + * @called by: func apiParser(rw http.ResponseWriter, req *http.Request) + */ func templateDelete(nodes map[string]interface{}, rw http.ResponseWriter) { - params := nodes["params"].([]interface{}) - - str := config.Database.Account + ":" + config.Database.Password + "@tcp(" + config.Database.Addr + ")/falcon_portal?charset=utf8" - db, err := sql.Open("mysql", str) - db.SetMaxOpenConns(2000) - db.SetMaxIdleConns(1000) - defer db.Close() - - if err != nil { - log.Println("Oh noez, could not connect to database") - return - } - + log.Println("func templateDelete()") + params := nodes["params"].([]interface {}) + resp := nodes + delete(resp, "params") + var result = make(map[string]interface{}) + o := orm.NewOrm() args := []interface{}{} args = append(args, "DELETE FROM falcon_portal.tpl WHERE id=?") args = append(args, "DELETE FROM falcon_portal.grp_tpl WHERE tpl_id=?") + log.Println("args =", args) templateids := []string{} for _, sqlcmd := range args { log.Println(sqlcmd) - stmtIns, err := db.Prepare(sqlcmd.(string)) - if err != nil { - log.Println(err.Error()) - return - } - defer stmtIns.Close() - for _, templateId := range params { - if result, err := stmtIns.Exec(templateId); err == nil { - if RowsAffected, err := result.RowsAffected(); err == nil { - if RowsAffected > 0 { - templateids = append(templateids, templateId.(string)) - } - log.Println("delete id:", templateId) - } else { - log.Println(err.Error()) - } + log.Println("templateId =", templateId) + res, err := o.Raw(sqlcmd.(string), templateId).Exec() + if err != nil { + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} } else { - log.Println(err.Error()) + num, _ := res.RowsAffected() + if num > 0 && sqlcmd == "DELETE FROM falcon_portal.tpl WHERE id=?" { + templateids = append(templateids, templateId.(string)) + log.Println("delete template id:", templateId) + log.Println("mysql row affected nums:", num) + } } } } - resp := nodes - delete(resp, "params") - var result = make(map[string]interface{}) result["templateids"] = templateids resp["result"] = result RenderJson(rw, resp) } +/** + * @function name: func templateUpdate(nodes map[string]interface{}, rw http.ResponseWriter) + * @description: This function gets hostgroup data for database insertion. + * @related issues: OWL-093, OWL-086 + * @param: nodes map[string]interface{} + * @param: rw http.ResponseWriter + * @return: void + * @author: Don Hsieh + * @since: 09/22/2015 + * @last modified: 10/21/2015 + * @called by: func apiParser(rw http.ResponseWriter, req *http.Request) + */ func templateUpdate(nodes map[string]interface{}, rw http.ResponseWriter) { params := nodes["params"].(map[string]interface{}) - templateId := params["templateid"].(string) - templateName := params["name"].(string) - sqlcmd := "UPDATE falcon_portal.tpl SET tpl_name = ? WHERE id = ?" - - str := config.Database.Account + ":" + config.Database.Password + "@tcp(" + config.Database.Addr + ")/falcon_portal?charset=utf8" - db, err := sql.Open("mysql", str) - db.SetMaxOpenConns(2000) - db.SetMaxIdleConns(1000) - defer db.Close() - + var result = make(map[string]interface{}) + templateId, err := strconv.Atoi(params["templateid"].(string)) if err != nil { - log.Println("Oh noez, could not connect to database") - return + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} } + o := orm.NewOrm() + database := "falcon_portal" + o.Using(database) - stmtIns, err := db.Prepare(sqlcmd) - if err != nil { - log.Println(err.Error()) - return + if _, ok := params["name"]; ok { + templateName := params["name"].(string) + log.Println("templateName:", templateName) + + if templateName != "" { + tpl := Tpl{Id: templateId} + log.Println("tpl:", tpl) + err := o.Read(&tpl) + if err != nil { + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} + } else { + log.Println("tpl:", tpl) + tpl.Tpl_name = templateName + log.Println("tpl:", tpl) + num, err := o.Update(&tpl) + if err != nil { + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} + } else { + if num > 0 { + templateids := [1]string{strconv.Itoa(templateId)} + result["templateids"] = templateids + log.Println("update template id:", templateId) + log.Println("mysql row affected nums:", num) + } + } + } + } } - defer stmtIns.Close() - templateids := []string{} - if result, err := stmtIns.Exec(templateName, templateId); err == nil { - if RowsAffected, err := result.RowsAffected(); err == nil { - if RowsAffected > 0 { - templateids = append(templateids, templateId) - log.Println("update groupid : ", templateId) + if _, ok := params["groups"]; ok { + groups := params["groups"].([]interface{}) + log.Println("groups:", groups) + + count := 0 + for _, group := range groups { + log.Println("group:", group) + count += 1 + } + log.Println("count:", count) + + if count > 0 { + sqlcmd := "DELETE FROM falcon_portal.grp_tpl WHERE tpl_id=?" + res, err := o.Raw(sqlcmd, templateId).Exec() + if err != nil { + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} + } else { + num, _ := res.RowsAffected() + if num > 0 { + log.Println("mysql row affected nums:", num) + } + } + + for _, group := range groups { + log.Println("group:", group) + groupId, err := strconv.Atoi(group.(map[string]interface{})["groupid"].(string)) + log.Println("groupId:", groupId) + grp_tpl := Grp_tpl{Grp_id: groupId, Tpl_id: templateId} + log.Println("grp_tpl:", grp_tpl) + + _, err = o.Insert(&grp_tpl) + if err != nil { + log.Println("Error:", err) + result["error"] = [1]string{string(err.Error())} + } else { + templateids := [1]string{strconv.Itoa(templateId)} + result["templateids"] = templateids + log.Println("update template id:", templateId) + } } - } else { - log.Println(err.Error()) } - } else { - log.Println(err.Error()) } resp := nodes delete(resp, "params") - var result = make(map[string]interface{}) - result["templateids"] = templateids resp["result"] = result RenderJson(rw, resp) } +/** + * @function name: func apiAlert(rw http.ResponseWriter, req *http.Request) + * @description: This function parses the method of API request. + * @related issues: OWL-093 + * @param: rw http.ResponseWriter + * @param: req *http.Request + * @return: void + * @author: Don Hsieh + * @since: 09/29/2015 + * @last modified: 09/30/2015 + * @called by: func apiParser(rw http.ResponseWriter, req *http.Request) + */ +func apiAlert(rw http.ResponseWriter, req *http.Request) { +} + +/** + * @function name: func apiParser(rw http.ResponseWriter, req *http.Request) + * @description: This function parses the method of API request. + * @related issues: OWL-085 + * @param: rw http.ResponseWriter + * @param: req *http.Request + * @return: void + * @author: Don Hsieh + * @since: 09/11/2015 + * @last modified: 09/23/2015 + * @called by: http.HandleFunc("/api", apiParser) + * in func main() + */ func apiParser(rw http.ResponseWriter, req *http.Request) { + log.Println("func apiParser(rw http.ResponseWriter, req *http.Request)") buf := new(bytes.Buffer) buf.ReadFrom(req.Body) - s := buf.String() // Does a complete copy of the bytes in the buffer. - - json, err := simplejson.NewJson(buf.Bytes()) - if err != nil { - log.Println(err.Error()) - } - - f, err := os.OpenFile("falcon_api.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) - if err != nil { - log.Fatal("error opening file: %v", err) - } - defer f.Close() - log.SetOutput(f) - - var nodes = make(map[string]interface{}) - nodes, _ = json.Map() - - method := nodes["method"] - delete(nodes, "method") - delete(nodes, "auth") - - if method == "host.create" { - hostCreate(nodes, rw) - } else if method == "host.delete" { - hostDelete(nodes, rw) - } else if method == "host.update" { - hostUpdate(nodes, rw) - } else if method == "host.exists" { - // hostExist(params) - } else if method == "hostgroup.create" { - hostgroupCreate(nodes, rw) - } else if method == "hostgroup.delete" { - hostgroupDelete(nodes, rw) - } else if method == "hostgroup.update" { - hostgroupUpdate(nodes, rw) - } else if method == "hostgroup.exists" { - // hostgroupExist(params) - } else if method == "template.create" { - templateCreate(nodes, rw) - } else if method == "template.delete" { - templateDelete(nodes, rw) - } else if method == "template.update" { - templateUpdate(nodes, rw) - } else if method == "template.exists" { - // templateExist(params) - } -} - -func parseConfig(cfg string) { - if !file.IsExist(cfg) { - log.Fatalln("config file:", cfg, "is not existent. maybe you need `mv cfg.example.json cfg.json`") - } - ConfigFile = cfg - configContent, err := file.ToTrimString(cfg) - if err != nil { - log.Fatalln("read config file:", cfg, "fail:", err) - } + log.Println(buf.Len()) + if buf.Len() == 0 { + apiAlert(rw, req) + } else { + s := buf.String() // Does a complete copy of the bytes in the buffer. + log.Println("s =", s) + json, err := simplejson.NewJson(buf.Bytes()) + if err != nil { + log.Println(err.Error()) + } - var c GlobalConfig - err = json.Unmarshal([]byte(configContent), &c) - if err != nil { - log.Fatalln("parse config file:", cfg, "fail:", err) - return + var nodes = make(map[string]interface{}) + nodes, _ = json.Map() + + method := nodes["method"] + log.Println(method) + delete(nodes, "method") + delete(nodes, "auth") + + if method == "host.create" { + hostCreate(nodes, rw) + } else if method == "host.delete" { + hostDelete(nodes, rw) + } else if method == "host.update" { + hostUpdate(nodes, rw) + } else if method == "host.exists" { + // hostExist(params) + } else if method == "hostgroup.create" { + hostgroupCreate(nodes, rw) + } else if method == "hostgroup.delete" { + hostgroupDelete(nodes, rw) + } else if method == "hostgroup.update" { + hostgroupUpdate(nodes, rw) + } else if method == "hostgroup.exists" { + // hostgroupExist(params) + } else if method == "template.create" { + templateCreate(nodes, rw) + } else if method == "template.delete" { + templateDelete(nodes, rw) + } else if method == "template.update" { + templateUpdate(nodes, rw) + } else if method == "template.exists" { + // templateExist(params) + } } - lock.Lock() - defer lock.Unlock() - config = &c - log.Println("read config file:", cfg, "successfully") } +/** + * @function name: func configZabbixRoutes() + * @description: This function handles API requests. + * @related issues: OWL-093, OWL-085 + * @param: void + * @return: void + * @author: Don Hsieh + * @since: 09/09/2015 + * @last modified: 10/21/2015 + * @called by: + */ func configZabbixRoutes() { - cfg := flag.String("c", "cfg.json", "configuration file") - flag.Parse() - parseConfig(*cfg) http.HandleFunc("/api", apiParser) }