func GetPGStatus2(dbConn *sql.DB, nodename string, hostname string) (string, error) { //fetch cpmtest user credentials nodeuser, err := admindb.GetContainerUser(dbConn, nodename, "cpmtest") if err != nil { logit.Error.Println(err.Error()) return "", err } logit.Info.Println("cpmtest password is " + nodeuser.Passwd) var pgport admindb.Setting pgport, err = admindb.GetSetting(dbConn, "PG-PORT") dbConn2, err := util.GetMonitoringConnection(hostname, "cpmtest", pgport.Value, "cpmtest", nodeuser.Passwd) defer dbConn2.Close() if err != nil { logit.Error.Println(err.Error()) return "", err } var value string err = dbConn2.QueryRow(fmt.Sprintf("select now()::text")).Scan(&value) switch { case err == sql.ErrNoRows: logit.Info.Println("getpgstatus 2 no rows returned") return "OFFLINE", nil case err != nil: logit.Info.Println("getpgstatus2 error " + err.Error()) return "OFFLINE", nil default: logit.Info.Println("getpgstatus2 returned " + value) } return "RUNNING", nil }
//return id, password, database func getCredential(dbConn *sql.DB, containerName string, containerRole string) (string, string, string, error) { var err error var userID string var password string var database string if containerRole == "pgpool" { userID = "cpmtest" database = "cpmtest" } else { userID = "cpmtest" database = "cpmtest" } var nodeuser admindb.ContainerUser nodeuser, err = admindb.GetContainerUser(dbConn, containerName, userID) if err != nil { logit.Error.Println(err.Error()) return userID, password, database, err } logit.Info.Println("got user credentials....containerName= " + containerName + " passwd=" + nodeuser.Passwd) return userID, nodeuser.Passwd, database, nil }
func MonitorStatements(w rest.ResponseWriter, r *rest.Request) { dbConn, err := util.GetConnection(CLUSTERADMIN_DB) if err != nil { logit.Error.Println("BackupNow: error " + err.Error()) rest.Error(w, err.Error(), 400) return } defer dbConn.Close() err = secimpl.Authorize(dbConn, r.PathParam("Token"), "perm-read") if err != nil { logit.Error.Println("MonitorStatements: authorize error " + err.Error()) rest.Error(w, err.Error(), http.StatusUnauthorized) return } ID := r.PathParam("ID") if ID == "" { rest.Error(w, "ID required", http.StatusBadRequest) return } container, err := admindb.GetContainer(dbConn, ID) if err != nil { logit.Error.Println("MonitorStatements:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } var host = container.Name if KubeEnv { host = container.Name + "-db" } //fetch cpmtest user credentials var nodeuser admindb.ContainerUser nodeuser, err = admindb.GetContainerUser(dbConn, container.Name, CPMTEST_USER) if err != nil { logit.Error.Println(err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } //get port var pgport admindb.Setting pgport, err = admindb.GetSetting(dbConn, "PG-PORT") dbConn2, err := util.GetMonitoringConnection(host, CPMTEST_DB, pgport.Value, CPMTEST_USER, nodeuser.Passwd) defer dbConn2.Close() //get the list of databases databases := make([]string, 0) var rows *sql.Rows rows, err = dbConn2.Query( "SELECT datname from pg_database where datname not in ('template1', 'template0') order by datname") if err != nil { logit.Error.Println("MonitorStatements:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } var datname string for rows.Next() { if err = rows.Scan( &datname, ); err != nil { logit.Error.Println("MonitorContainerSettings:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } databases = append(databases, datname) } if err = rows.Err(); err != nil { logit.Error.Println("MonitorStatements:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } rows.Close() statements := make([]PostgresStatement, 0) for i := range databases { //get a database connection to a specific database dbConn3, err := util.GetMonitoringConnection(host, databases[i], pgport.Value, CPMTEST_USER, nodeuser.Passwd) defer dbConn3.Close() rows, err = dbConn3.Query( "SELECT query, calls, total_time, rows, to_char(coalesce(100.0 * shared_blks_hit / nullif(shared_blks_hit + shared_blks_read, 0), -1), '999D99') AS hit_percent FROM pg_stat_statements ORDER BY total_time DESC LIMIT 5") if err != nil { logit.Error.Println("MonitorStatements:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } defer rows.Close() for rows.Next() { stat := PostgresStatement{} stat.Database = databases[i] if err = rows.Scan( &stat.Query, &stat.Calls, &stat.TotalTime, &stat.Rows, &stat.HitPercent, ); err != nil { logit.Error.Println("MonitorContainerSettings:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } statements = append(statements, stat) } if err = rows.Err(); err != nil { logit.Error.Println("MonitorStatements:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } } w.WriteHeader(http.StatusOK) w.WriteJson(&statements) }
func loadtest(dbConn *sql.DB, nodename string, host string, writes int) ([]Loadtestresults, error) { var err error var name string var query string var id int var i int var dbConn2 *sql.DB var results = make([]Loadtestresults, 4) //get port var pgport admindb.Setting pgport, err = admindb.GetSetting(dbConn, "PG-PORT") //fetch cpmtest user credentials var nodeuser admindb.ContainerUser nodeuser, err = admindb.GetContainerUser(dbConn, nodename, CPMTEST_USER) if err != nil { logit.Error.Println(err.Error()) return results, err } //get db connection dbConn2, err = util.GetMonitoringConnection(host, CPMTEST_USER, pgport.Value, CPMTEST_DB, nodeuser.Passwd) if err != nil { logit.Error.Println("loadtest connection error:" + err.Error()) return results, err } defer dbConn2.Close() start := time.Now() //inserts results[0].Operation = "inserts" results[0].Count = writes for i = 0; i < writes; i++ { query = fmt.Sprintf("insert into loadtest ( id, name ) values ( %d, 'this is a row for load test') returning id ", i) err = dbConn2.QueryRow(query).Scan(&id) switch { case err != nil: logit.Error.Println("loadtest insert error:" + err.Error()) return results, err } } results[0].Results = time.Since(start).String() start = time.Now() //selects results[1].Operation = "selects" results[1].Count = writes for i = 0; i < writes; i++ { err = dbConn2.QueryRow(fmt.Sprintf("select name from loadtest where id=%d", i)).Scan(&name) switch { case err == sql.ErrNoRows: logit.Error.Println("no row with that id") return results, err case err != nil: logit.Error.Println(err.Error()) return results, err } } results[1].Results = time.Since(start).String() start = time.Now() //updates results[2].Operation = "updates" results[2].Count = writes for i = 0; i < writes; i++ { query = fmt.Sprintf("update loadtest set ( name ) = ('howdy' ) where id = %d returning id", i) err = dbConn2.QueryRow(query).Scan(&id) switch { case err != nil: return results, err } } results[2].Results = time.Since(start).String() start = time.Now() //deletes results[3].Operation = "deletes" results[3].Count = writes for i = 0; i < writes; i++ { query = fmt.Sprintf("delete from loadtest where id=%d returning id", i) err := dbConn2.QueryRow(query).Scan(&id) switch { case err != nil: return results, err } } results[3].Results = time.Since(start).String() return results, nil }
func ContainerInfoStatrepl(w rest.ResponseWriter, r *rest.Request) { dbConn, err := util.GetConnection(CLUSTERADMIN_DB) if err != nil { logit.Error.Println("BackupNow: error " + err.Error()) rest.Error(w, err.Error(), 400) return } defer dbConn.Close() err = secimpl.Authorize(dbConn, r.PathParam("Token"), "perm-read") if err != nil { logit.Error.Println("ContainerStatrepl: authorize error " + err.Error()) rest.Error(w, err.Error(), http.StatusUnauthorized) return } ID := r.PathParam("ID") if ID == "" { rest.Error(w, "ID required", http.StatusBadRequest) return } node, err := admindb.GetContainer(dbConn, ID) if err != nil { logit.Error.Println("ContainerStatrepl:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } var host = node.Name if KubeEnv { host = node.Name + "-db" } //fetch cpmtest user credentials var nodeuser admindb.ContainerUser nodeuser, err = admindb.GetContainerUser(dbConn, node.Name, CPMTEST_USER) if err != nil { logit.Error.Println(err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } //get port var pgport admindb.Setting pgport, err = admindb.GetSetting(dbConn, "PG-PORT") dbConn2, err := util.GetMonitoringConnection(host, CPMTEST_DB, pgport.Value, CPMTEST_USER, nodeuser.Passwd) defer dbConn2.Close() stats := make([]Statrepl, 0) var rows *sql.Rows rows, err = dbConn2.Query("SELECT pid , usesysid , usename , application_name , client_addr , coalesce(client_hostname, ' ') , client_port , to_char(backend_start, 'YYYY-MM-DD HH24:MI-SS') as backend_start , state , sent_location , write_location , flush_location , replay_location , sync_priority , sync_state from pg_stat_replication") if err != nil { logit.Error.Println("ContainerStatrepl:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } defer rows.Close() for rows.Next() { stat := Statrepl{} if err = rows.Scan( &stat.Pid, &stat.Usesysid, &stat.Usename, &stat.AppName, &stat.ClientAddr, &stat.ClientHostname, &stat.ClientPort, &stat.BackendStart, &stat.State, &stat.SentLocation, &stat.WriteLocation, &stat.FlushLocation, &stat.ReplayLocation, &stat.SyncPriority, &stat.SyncState, ); err != nil { logit.Error.Println("ContainerStatrepl:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } stats = append(stats, stat) } if err = rows.Err(); err != nil { logit.Error.Println("ContainerStatrepl:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } w.WriteHeader(http.StatusOK) w.WriteJson(&stats) }
func MonitorContainerSettings(w rest.ResponseWriter, r *rest.Request) { dbConn, err := util.GetConnection(CLUSTERADMIN_DB) if err != nil { logit.Error.Println("BackupNow: error " + err.Error()) rest.Error(w, err.Error(), 400) return } defer dbConn.Close() err = secimpl.Authorize(dbConn, r.PathParam("Token"), "perm-read") if err != nil { logit.Error.Println("MonitorContainerSettings: authorize error " + err.Error()) rest.Error(w, err.Error(), http.StatusUnauthorized) return } ID := r.PathParam("ID") if ID == "" { rest.Error(w, "ID required", http.StatusBadRequest) return } node, err := admindb.GetContainer(dbConn, ID) if err != nil { logit.Error.Println("MonitorContainerGetInfo:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } var host = node.Name if KubeEnv { host = node.Name + "-db" } //fetch cpmtest user credentials var nodeuser admindb.ContainerUser nodeuser, err = admindb.GetContainerUser(dbConn, node.Name, CPMTEST_USER) if err != nil { logit.Error.Println(err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } logit.Info.Println("cpmtest password is " + nodeuser.Passwd) //get port var pgport admindb.Setting pgport, err = admindb.GetSetting(dbConn, "PG-PORT") dbConn2, err := util.GetMonitoringConnection(host, CPMTEST_DB, pgport.Value, CPMTEST_USER, nodeuser.Passwd) defer dbConn2.Close() settings := make([]PostgresSetting, 0) var rows *sql.Rows rows, err = dbConn2.Query("select name, current_setting(name), source from pg_settings where source not in ('default','override')") if err != nil { logit.Error.Println("MonitorContainerSettings:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } defer rows.Close() for rows.Next() { setting := PostgresSetting{} if err = rows.Scan( &setting.Name, &setting.CurrentSetting, &setting.Source, ); err != nil { logit.Error.Println("MonitorContainerSettings:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } settings = append(settings, setting) } if err = rows.Err(); err != nil { logit.Error.Println("MonitorContainerSettings:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } w.WriteHeader(http.StatusOK) w.WriteJson(&settings) }
func ContainerInfoStatdatabase(w rest.ResponseWriter, r *rest.Request) { dbConn, err := util.GetConnection(CLUSTERADMIN_DB) if err != nil { logit.Error.Println("BackupNow: error " + err.Error()) rest.Error(w, err.Error(), 400) return } defer dbConn.Close() err = secimpl.Authorize(dbConn, r.PathParam("Token"), "perm-read") if err != nil { logit.Error.Println("ContainerStatdatabase: authorize error " + err.Error()) rest.Error(w, err.Error(), http.StatusUnauthorized) return } ID := r.PathParam("ID") if ID == "" { rest.Error(w, "ID required", http.StatusBadRequest) return } node, err := admindb.GetContainer(dbConn, ID) if err != nil { logit.Error.Println("ContainerStatdatabase:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } var host = node.Name if KubeEnv { host = node.Name + "-db" } //get password var nodeuser admindb.ContainerUser nodeuser, err = admindb.GetContainerUser(dbConn, node.Name, CPMTEST_USER) if err != nil { logit.Error.Println(err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } //get port var pgport admindb.Setting pgport, err = admindb.GetSetting(dbConn, "PG-PORT") dbConn2, err := util.GetMonitoringConnection(host, CPMTEST_DB, pgport.Value, CPMTEST_USER, nodeuser.Passwd) defer dbConn2.Close() stats := make([]Statdatabase, 0) var rows *sql.Rows rows, err = dbConn2.Query("SELECT datname, blks_read::text, tup_returned::text, tup_fetched::text, tup_inserted::text, tup_updated::text, tup_deleted::text, coalesce(to_char(stats_reset, 'YYYY-MM-DD HH24:MI:SS'), ' ') as stats_reset from pg_stat_database") if err != nil { logit.Error.Println("ContainerStatdatabase:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } defer rows.Close() for rows.Next() { stat := Statdatabase{} if err = rows.Scan( &stat.Datname, &stat.BlksRead, &stat.TupReturned, &stat.TupFetched, &stat.TupInserted, &stat.TupUpdated, &stat.TupDeleted, &stat.StatsReset, ); err != nil { logit.Error.Println("ContainerStatdatabase:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } stats = append(stats, stat) } if err = rows.Err(); err != nil { logit.Error.Println("ContainerStatdatabase:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } w.WriteHeader(http.StatusOK) w.WriteJson(&stats) }
func ContainerInfoBgwriter(w rest.ResponseWriter, r *rest.Request) { dbConn, err := util.GetConnection(CLUSTERADMIN_DB) if err != nil { logit.Error.Println("BackupNow: error " + err.Error()) rest.Error(w, err.Error(), 400) return } defer dbConn.Close() err = secimpl.Authorize(dbConn, r.PathParam("Token"), "perm-read") if err != nil { logit.Error.Println("ContainerBgwriter: authorize error " + err.Error()) rest.Error(w, err.Error(), http.StatusUnauthorized) return } ID := r.PathParam("ID") if ID == "" { rest.Error(w, "ID required", http.StatusBadRequest) return } node, err := admindb.GetContainer(dbConn, ID) if err != nil { logit.Error.Println("ContainerBgwriter:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } var host = node.Name if KubeEnv { host = node.Name + "-db" } //get password var nodeuser admindb.ContainerUser nodeuser, err = admindb.GetContainerUser(dbConn, node.Name, CPMTEST_USER) if err != nil { logit.Error.Println("ContainerBgwriter:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } //get port var pgport admindb.Setting pgport, err = admindb.GetSetting(dbConn, "PG-PORT") var dbConn2 *sql.DB dbConn2, err = util.GetMonitoringConnection(host, CPMTEST_DB, pgport.Value, CPMTEST_USER, nodeuser.Passwd) defer dbConn2.Close() info := Bgwriter{} err = dbConn2.QueryRow("SELECT to_char(now(), 'mm/dd/yy HH12:MI:SS') now, to_char(block_size::numeric * buffers_alloc / (1024 * 1024 * seconds), 'FM999999999999D9999') AS alloc_mbps, to_char(block_size::numeric * buffers_checkpoint / (1024 * 1024 * seconds), 'FM999999999999D9999') AS checkpoint_mbps, to_char(block_size::numeric * buffers_clean / (1024 * 1024 * seconds), 'FM999999999999D9999') AS clean_mbps, to_char(block_size::numeric * buffers_backend/ (1024 * 1024 * seconds), 'FM999999999999D9999') AS backend_mbps, to_char(block_size::numeric * (buffers_checkpoint + buffers_clean + buffers_backend) / (1024 * 1024 * seconds), 'FM999999999999D9999') AS write_mbps FROM ( SELECT now() AS sample,now() - stats_reset AS uptime,EXTRACT(EPOCH FROM now()) - extract(EPOCH FROM stats_reset) AS seconds, b.*,p.setting::integer AS block_size FROM pg_stat_bgwriter b,pg_settings p WHERE p.name='block_size') bgw").Scan(&info.Now, &info.AllocMbps, &info.CheckpointMbps, &info.CleanMbps, &info.BackendMbps, &info.WriteMbps) switch { case err == sql.ErrNoRows: logit.Error.Println("ContainerBgwriter:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return case err != nil: logit.Error.Println("ContainerBgwriter:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } w.WriteHeader(http.StatusOK) w.WriteJson(&info) }
func UpdateContainerUser(w rest.ResponseWriter, r *rest.Request) { dbConn, err := util.GetConnection(CLUSTERADMIN_DB) if err != nil { logit.Error.Println("BackupNow: error " + err.Error()) rest.Error(w, err.Error(), 400) return } defer dbConn.Close() postMsg := NodeUser{} err = r.DecodeJsonPayload(&postMsg) if err != nil { logit.Error.Println("UpdateContainerUser: error in decode" + err.Error()) rest.Error(w, err.Error(), http.StatusInternalServerError) return } err = secimpl.Authorize(dbConn, postMsg.Token, "perm-user") if err != nil { logit.Error.Println("UpdateContainerUser: validate token error " + err.Error()) rest.Error(w, err.Error(), http.StatusUnauthorized) return } if postMsg.ID == "" { logit.Error.Println("UpdateContainerUser: error node ID required") rest.Error(w, "ID required", 400) return } if postMsg.Rolname == "" { logit.Error.Println("UpdateContainerUser: error node Rolname required") rest.Error(w, "Rolname required", 400) return } //create user on the container //get container info var node admindb.Container node, err = admindb.GetContainer(dbConn, postMsg.ID) if err != nil { logit.Error.Println("AddContainUser: "******"" { } else { //update the password } //get connection to container's database var host = node.Name if KubeEnv { host = node.Name + "-db" } //fetch cpmtest user credentials var cpmuser admindb.ContainerUser cpmuser, err = admindb.GetContainerUser(dbConn, node.Name, CPMTEST_USER) if err != nil { logit.Error.Println(err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } //get port var pgport admindb.Setting pgport, err = admindb.GetSetting(dbConn, "PG-PORT") var dbConn2 *sql.DB dbConn2, err = util.GetMonitoringConnection(host, CPMTEST_DB, pgport.Value, CPMTEST_USER, cpmuser.Passwd) defer dbConn2.Close() var SUPERUSER = "******" var INHERIT = "INHERIT" var CREATEROLE = "CREATEROLE" var CREATEDB = "CREATEDB" var LOGIN = "******" var REPLICATION = "REPLICATION" logit.Info.Println("Rolsuper is " + strconv.FormatBool(postMsg.Rolsuper)) if !postMsg.Rolsuper { SUPERUSER = "******" } if !postMsg.Rolinherit { INHERIT = "NOINHERIT" } if !postMsg.Rolcreaterole { CREATEROLE = "NOCREATEROLE" } if !postMsg.Rolcreatedb { CREATEDB = "NOCREATEDB" } if !postMsg.Rollogin { LOGIN = "******" } if !postMsg.Rolreplication { REPLICATION = "NOREPLICATION" } query := "alter user " + postMsg.Rolname + " " + SUPERUSER + " " + INHERIT + " " + CREATEROLE + " " + CREATEDB + " " + LOGIN + " " + REPLICATION + " " if postMsg.Passwd != "" { query = query + " PASSWORD '" + postMsg.Passwd + "'" } logit.Info.Println(query) _, err = dbConn2.Query(query) if err != nil { logit.Error.Println("UpdateContainerUser:"******"" { //update user's password dbuser := admindb.ContainerUser{} dbuser.Containername = node.Name dbuser.Passwd = postMsg.Passwd dbuser.Rolname = postMsg.Rolname err = admindb.UpdateContainerUser(dbConn, dbuser) if err != nil { logit.Error.Println("UpdateContainerUser: "******"OK" w.WriteJson(&status) }
func GetAllUsersForContainer(w rest.ResponseWriter, r *rest.Request) { dbConn, err := util.GetConnection(CLUSTERADMIN_DB) if err != nil { logit.Error.Println("BackupNow: error " + err.Error()) rest.Error(w, err.Error(), 400) return } defer dbConn.Close() err = secimpl.Authorize(dbConn, r.PathParam("Token"), "perm-read") if err != nil { logit.Error.Println("GetAllUsersForContainer: validate token error " + err.Error()) rest.Error(w, err.Error(), http.StatusUnauthorized) return } ID := r.PathParam("ID") if ID == "" { rest.Error(w, "ID required", 400) return } //get container info var node admindb.Container node, err = admindb.GetContainer(dbConn, ID) if err != nil { logit.Error.Println("GetAllUsersForContainer: " + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } //get connection to container's database var host = node.Name if KubeEnv { host = node.Name + "-db" } //fetch cpmtest user credentials var nodeuser admindb.ContainerUser nodeuser, err = admindb.GetContainerUser(dbConn, node.Name, CPMTEST_USER) if err != nil { logit.Error.Println(err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } logit.Info.Println("cpmtest password is " + nodeuser.Passwd) //get port var pgport admindb.Setting pgport, err = admindb.GetSetting(dbConn, "PG-PORT") var dbConn2 *sql.DB dbConn2, err = util.GetMonitoringConnection(host, CPMTEST_DB, pgport.Value, CPMTEST_USER, nodeuser.Passwd) defer dbConn2.Close() users := make([]admindb.ContainerUser, 0) //query results var rows *sql.Rows rows, err = dbConn2.Query("select rolname::text, rolsuper::text, rolinherit::text, rolcreaterole::text, rolcreatedb::text, rolcatupdate::text, rolcanlogin::text, rolreplication::text from pg_roles order by rolname") if err != nil { logit.Error.Println("GetAllUsersForContainer:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } defer rows.Close() for rows.Next() { user := admindb.ContainerUser{} if err = rows.Scan( &user.Rolname, &user.Rolsuper, &user.Rolinherit, &user.Rolcreaterole, &user.Rolcreatedb, &user.Rolcatupdate, &user.Rolcanlogin, &user.Rolreplication, ); err != nil { logit.Error.Println("GetAllUsersForContainer:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } user.Containername = node.Name user.ContainerID = node.ID users = append(users, user) } if err = rows.Err(); err != nil { logit.Error.Println("GetAllUsersForContainer:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } w.WriteHeader(http.StatusOK) w.WriteJson(&users) }
func GetContainerUser(w rest.ResponseWriter, r *rest.Request) { dbConn, err := util.GetConnection(CLUSTERADMIN_DB) if err != nil { logit.Error.Println("BackupNow: error " + err.Error()) rest.Error(w, err.Error(), 400) return } defer dbConn.Close() err = secimpl.Authorize(dbConn, r.PathParam("Token"), "perm-read") if err != nil { logit.Error.Println("GetContainerUser: validate token error " + err.Error()) rest.Error(w, err.Error(), http.StatusUnauthorized) return } ContainerID := r.PathParam("ContainerID") if ContainerID == "" { rest.Error(w, "ContainerID required", 400) return } Rolname := r.PathParam("Rolname") if Rolname == "" { rest.Error(w, "Rolname required", 400) return } //get container info node, err := admindb.GetContainer(dbConn, ContainerID) if err != nil { logit.Error.Println("AddContainUser: "******"-db" } //fetch user credentials var nodeuser admindb.ContainerUser nodeuser, err = admindb.GetContainerUser(dbConn, node.Name, Rolname) if err != nil { logit.Error.Println(err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } //fetch cpmtest user credentials var cpmuser admindb.ContainerUser cpmuser, err = admindb.GetContainerUser(dbConn, node.Name, CPMTEST_USER) if err != nil { logit.Error.Println(err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } //get port var pgport admindb.Setting pgport, err = admindb.GetSetting(dbConn, "PG-PORT") dbConn2, err := util.GetMonitoringConnection(host, CPMTEST_DB, pgport.Value, CPMTEST_USER, cpmuser.Passwd) defer dbConn2.Close() query := "select rolname::text, rolsuper::text, rolinherit::text, rolcreaterole::text, rolcreatedb::text, rolcatupdate::text, rolcanlogin::text, rolreplication::text from pg_roles where rolname = '" + Rolname + "' order by rolname" logit.Info.Println(query) err = dbConn2.QueryRow(query).Scan( &nodeuser.Rolname, &nodeuser.Rolsuper, &nodeuser.Rolinherit, &nodeuser.Rolcreaterole, &nodeuser.Rolcreatedb, &nodeuser.Rolcatupdate, &nodeuser.Rolcanlogin, &nodeuser.Rolreplication) if err != nil { logit.Error.Println("GetContainerUser:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } w.WriteJson(&nodeuser) }
func DeleteContainerUser(w rest.ResponseWriter, r *rest.Request) { dbConn, err := util.GetConnection(CLUSTERADMIN_DB) if err != nil { logit.Error.Println("BackupNow: error " + err.Error()) rest.Error(w, err.Error(), 400) return } defer dbConn.Close() err = secimpl.Authorize(dbConn, r.PathParam("Token"), "perm-backup") if err != nil { logit.Error.Println("DeleteContainerUser: validate token error " + err.Error()) rest.Error(w, err.Error(), http.StatusUnauthorized) return } ContainerID := r.PathParam("ContainerID") if ContainerID == "" { rest.Error(w, "ContainerID required", 400) return } rolname := r.PathParam("Rolname") if rolname == "" { rest.Error(w, "Rolname required", 400) return } //get node info node, err := admindb.GetContainer(dbConn, ContainerID) if err != nil { logit.Error.Println("AddContainUser: "******"DeleteContainerUser: "******"-db" } //fetch cpmtest user credentials var cpmuser admindb.ContainerUser cpmuser, err = admindb.GetContainerUser(dbConn, node.Name, CPMTEST_USER) if err != nil { logit.Error.Println(err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } //get port var pgport admindb.Setting pgport, err = admindb.GetSetting(dbConn, "PG-PORT") dbConn2, err := util.GetMonitoringConnection(host, CPMTEST_DB, pgport.Value, CPMTEST_USER, cpmuser.Passwd) defer dbConn2.Close() query := "drop role " + rolname logit.Info.Println(query) _, err = dbConn2.Query(query) if err != nil { logit.Error.Println("DeleteContainerUser:"******"OK" w.WriteJson(&status) }