From 4ddeb76c0cd3e4d73ac2a4be8cd2df087d999c8a Mon Sep 17 00:00:00 2001 From: kirby Date: Fri, 19 Jul 2024 16:34:56 +0200 Subject: [PATCH] Adding support for packages --- Database/package.go | 44 +++++++++++++++++++++++++++++++++++ Database/server.go | 2 +- Http/package.go | 56 +++++++++++++++++++++++++++++++++++++++++++++ Http/server.go | 25 ++++++++++++++++++++ Http/utils.go | 6 +++++ main.go | 7 +++++- 6 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 Database/package.go create mode 100644 Http/package.go diff --git a/Database/package.go b/Database/package.go new file mode 100644 index 0000000..8bc44c4 --- /dev/null +++ b/Database/package.go @@ -0,0 +1,44 @@ +package database + +import ( + "database/sql" + "log" + + "gopkg.in/guregu/null.v4" +) + +type Package struct { + ID int `json:"id"` + Name null.String `json:"name"` + Active int `json:"active"` +} + +func GetPackage(db *sql.DB) ([]Package, error) { + var packages []Package + rows, err := db.Query("SELECT * FROM dashboard_package") + if err != nil { + log.Println("Error querying list of OS", err) + } + defer rows.Close() + + for rows.Next() { + var pkg Package + err := rows.Scan(&pkg.ID, &pkg.Name, &pkg.Active) + if err != nil { + log.Println("Error building list", err) + } + packages = append(packages, pkg) + } + return packages, err +} + +func GetPackagebyID(db *sql.DB, id int64) (Package, error) { + var pkg Package + if err := db.QueryRow("SELECT * FROM dashboard_package where id = ?", id).Scan(&pkg.ID, &pkg.Name, &pkg.Active); err != nil { + if err == sql.ErrNoRows { + return pkg, nil + } + log.Println("Error getting OS by ID", err) + } + return pkg, nil +} diff --git a/Database/server.go b/Database/server.go index beb0b9d..a259cae 100644 --- a/Database/server.go +++ b/Database/server.go @@ -37,7 +37,7 @@ func GetServersbyID(db *sql.DB, id int64) Server { return s } -func GetServersbyOS(db *sql.DB, id int) ([]Server, error) { +func GetServersbyOS(db *sql.DB, id int64) ([]Server, error) { var servers []Server rows, err := db.Query("SELECT * FROM dashboard_server WHERE os_id = ?", id) if err != nil { diff --git a/Http/package.go b/Http/package.go new file mode 100644 index 0000000..a4ef005 --- /dev/null +++ b/Http/package.go @@ -0,0 +1,56 @@ +package http + +import ( + "encoding/json" + db "infra-dashboard/Database" + "log" + "net/http" + "strconv" + "time" + + "github.com/gorilla/mux" +) + +func GetAllPackages(w http.ResponseWriter, r *http.Request) { + var list []db.Package + var err error + + t := time.Now() + status := 200 + + db_conn := db.GetDatabaseConnection() + defer db_conn.Close() + list, err = db.GetPackage(db_conn) + if err != nil { + log.Println("Error getting Package list") + status = 500 + } + logRequest(t, r, status) + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(list) +} + +func GetPackagebyID(w http.ResponseWriter, r *http.Request) { + var pkg db.Package + var err error + + t := time.Now() + status := 200 + + params := mux.Vars(r) + db_conn := db.GetDatabaseConnection() + defer db_conn.Close() + id, err := strconv.ParseInt(params["id"], 10, 64) + if err != nil { + log.Println("Error converting ID", err) + status = 500 + } + pkg, err = db.GetPackagebyID(db_conn, int64(id)) + if err != nil { + log.Println("Error getting Package") + status = 500 + } + logRequest(t, r, status) + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(pkg) +} diff --git a/Http/server.go b/Http/server.go index 8d8f634..7aa37c7 100644 --- a/Http/server.go +++ b/Http/server.go @@ -50,3 +50,28 @@ func GetServersbyID(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(server) } + +func GetServersbyOS(w http.ResponseWriter, r *http.Request) { + var servers []db.Server + var err error + + t := time.Now() + status := 200 + + params := mux.Vars(r) + os_id, err := strconv.ParseInt(params["os_id"], 10, 32) + if err != nil { + log.Println("Error converting ID", err) + status = 500 + } + db_conn := db.GetDatabaseConnection() + defer db_conn.Close() + servers, err = db.GetServersbyOS(db_conn, int64(os_id)) + if err != nil { + log.Println("Error getting servers by OS", err) + status = 500 + } + logRequest(t, r, status) + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(servers) +} diff --git a/Http/utils.go b/Http/utils.go index 1ff5d61..9074f33 100644 --- a/Http/utils.go +++ b/Http/utils.go @@ -19,6 +19,12 @@ func HealthHandler(w http.ResponseWriter, _ *http.Request) { _, _ = io.WriteString(w, "OK") } +func NotFound(w http.ResponseWriter, r *http.Request) { + t := time.Now() + logRequest(t, r, 404) + w.WriteHeader(http.StatusNotFound) +} + func logRequest(t time.Time, r *http.Request, s int) { log.Printf("%s - - %s \"%s %s %s\" %d 0 \"-\" \"%s\" %d\n", r.Host, diff --git a/main.go b/main.go index 76758db..865e131 100644 --- a/main.go +++ b/main.go @@ -15,7 +15,6 @@ var ( args struct { Log string `arg:"-l,--logfile" help:"location of output logfile." default:"infra-dashboard-access.log"` EnvFile string `arg:"-e,--envfile" help:"location of file containing environment variables." default:".env"` - Metrics bool `arg:"--metrics" help:"enable prometheus exporter on /metrics." default:"false"` } ) @@ -26,6 +25,8 @@ func main() { router := mux.NewRouter() + router.NotFoundHandler = http.HandlerFunc(h.NotFound) + router.HandleFunc("/", h.RequestHandler).Methods("GET") router.HandleFunc("/healthcheck", h.HealthHandler) router.HandleFunc("/os", h.GetOS).Methods("GET") @@ -36,6 +37,10 @@ func main() { router.HandleFunc("/servers", h.GetServersList).Methods("GET") router.HandleFunc("/server/{id:[0-9]+}", h.GetServersbyID).Methods("GET") + router.HandleFunc("/server/os/{os_id:[0-9]+}", h.GetServersbyOS).Methods("GET") + + router.HandleFunc("/packages", h.GetAllPackages).Methods("GET") + router.HandleFunc("/packages/{id:[0-9]+}", h.GetPackagebyID).Methods("GET") log.Fatal(http.ListenAndServe(":8080", router)) }