Working docker containerization
This commit is contained in:
131
app/Database/os.go
Normal file
131
app/Database/os.go
Normal file
@@ -0,0 +1,131 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
"log"
|
||||
|
||||
"gopkg.in/guregu/null.v4"
|
||||
)
|
||||
|
||||
type OS struct {
|
||||
ID int `json:"id"`
|
||||
Distribution null.String `json:"distribution"`
|
||||
Version null.String `json:"version"`
|
||||
EndOfSupport null.String `json:"EndOfSupport"`
|
||||
}
|
||||
|
||||
func GetOS(db *sql.DB) ([]OS, error) {
|
||||
var oses []OS
|
||||
rows, err := db.Query("SELECT * FROM dashboard_os")
|
||||
if err != nil {
|
||||
log.Println("Error querying list of OS", err)
|
||||
}
|
||||
defer func(rows *sql.Rows) {
|
||||
err := rows.Close()
|
||||
if err != nil {
|
||||
|
||||
}
|
||||
}(rows)
|
||||
|
||||
for rows.Next() {
|
||||
var os OS
|
||||
err := rows.Scan(&os.ID, &os.Distribution, &os.Version, &os.EndOfSupport)
|
||||
if err != nil {
|
||||
log.Println("Error building list", err)
|
||||
}
|
||||
oses = append(oses, os)
|
||||
}
|
||||
return oses, err
|
||||
}
|
||||
|
||||
func GetOSbyID(db *sql.DB, id int64) (OS, error) {
|
||||
var os OS
|
||||
if err := db.QueryRow("SELECT * FROM dashboard_os where id = ?", id).Scan(&os.ID, &os.Distribution, &os.Version, &os.EndOfSupport); err != nil {
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
return os, nil
|
||||
}
|
||||
log.Println("Error getting OS by ID", err)
|
||||
}
|
||||
return os, nil
|
||||
}
|
||||
|
||||
func GetDistributionList(db *sql.DB) ([]null.String, error) {
|
||||
var list []null.String
|
||||
rows, err := db.Query("SELECT DISTINCT distribution FROM dashboard_os")
|
||||
if err != nil {
|
||||
log.Println("Error getting distribution list", err)
|
||||
}
|
||||
for rows.Next() {
|
||||
var os OS
|
||||
err := rows.Scan(&os.Distribution)
|
||||
if err != nil {
|
||||
log.Println("Error building distribution list", err)
|
||||
}
|
||||
list = append(list, os.Distribution)
|
||||
}
|
||||
return list, nil
|
||||
}
|
||||
|
||||
func GetVersionsByDistributionList(db *sql.DB, d string) ([]null.String, error) {
|
||||
var list []null.String
|
||||
rows, err := db.Query("SELECT DISTINCT version FROM dashboard_os where distribution = ?", d)
|
||||
if err != nil {
|
||||
log.Println("Error getting distribution list", err)
|
||||
}
|
||||
for rows.Next() {
|
||||
var os OS
|
||||
err := rows.Scan(&os.Distribution)
|
||||
if err != nil {
|
||||
log.Println("Error building distribution list", err)
|
||||
}
|
||||
list = append(list, os.Distribution)
|
||||
}
|
||||
return list, nil
|
||||
}
|
||||
|
||||
func checkIfOsExists(os OS, db *sql.DB) bool {
|
||||
row := db.QueryRow("Select distribution, version from dashboard_os where distribution = ? and version = ?", os.Distribution, os.Version)
|
||||
err := row.Scan(&os.Distribution, &os.Version)
|
||||
if !errors.Is(err, sql.ErrNoRows) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func CreateOS(os OS, db *sql.DB) error {
|
||||
if checkIfOsExists(os, db) {
|
||||
log.Println("OS already exists")
|
||||
return nil
|
||||
}
|
||||
q, err := db.Prepare("INSERT INTO `dashboard_os` (`distribution`,`version`,`end_of_support`) VALUES (?,?,?)")
|
||||
if err != nil {
|
||||
log.Println("Error creating query", err)
|
||||
return err
|
||||
}
|
||||
_, err = q.Exec(&os.Distribution, &os.Version, &os.EndOfSupport)
|
||||
if err != nil {
|
||||
log.Println("Error inserting OS", err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func DeleteOS(os OS, db *sql.DB) (int, error) {
|
||||
if !checkIfOsExists(os, db) {
|
||||
log.Println("OS does not exist, nothing to delete")
|
||||
return 404, nil
|
||||
}
|
||||
q, err := db.Prepare("DELETE FROM dashboard_os WHERE distribution = ? AND version = ?")
|
||||
if err != nil {
|
||||
log.Println("Error deleting OS", err)
|
||||
return 500, err
|
||||
}
|
||||
_, err = q.Exec(&os.Distribution, &os.Version)
|
||||
if err != nil {
|
||||
log.Println("Error deleting OS", err)
|
||||
return 500, err
|
||||
}
|
||||
log.Println("OS deleted")
|
||||
return 200, nil
|
||||
}
|
||||
151
app/Database/package.go
Normal file
151
app/Database/package.go
Normal file
@@ -0,0 +1,151 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
"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 errors.Is(err, sql.ErrNoRows) {
|
||||
return pkg, nil
|
||||
}
|
||||
log.Println("Error getting OS by ID", err)
|
||||
}
|
||||
return pkg, nil
|
||||
}
|
||||
|
||||
func GetPackagebyName(db *sql.DB, id int64) (Package, error) {
|
||||
var pkg Package
|
||||
if err := db.QueryRow("SELECT * FROM dashboard_package where name = ?", id).Scan(&pkg.ID, &pkg.Name, &pkg.Active); err != nil {
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
return pkg, nil
|
||||
}
|
||||
log.Println("Error getting OS by ID", err)
|
||||
}
|
||||
return pkg, nil
|
||||
}
|
||||
|
||||
func checkIfPackageExists(pkg Package, db *sql.DB) bool {
|
||||
if err := db.QueryRow("Select name from dashboard_package where name = ?", pkg.Name).Scan(&pkg.Name); err != nil {
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func CreatePackage(pkg Package, db *sql.DB) error {
|
||||
if checkIfPackageExists(pkg, db) {
|
||||
/* If package exists but is not active we activate it */
|
||||
row := db.QueryRow("Select name, active from dashboard_package where name = ? and active = 1", pkg.Name)
|
||||
err := row.Scan(&pkg.Name, &pkg.Active)
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
q, err := db.Prepare("UPDATE dashboard_package set active = 1 where name = ?")
|
||||
if err != nil {
|
||||
log.Println("Error creating query", err)
|
||||
}
|
||||
_, err = q.Exec(pkg.Name)
|
||||
if err != nil {
|
||||
log.Println("Error activating Package", err)
|
||||
}
|
||||
log.Println("Activating new package", pkg.Name)
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
}
|
||||
q, err := db.Prepare("INSERT INTO dashboard_package (name, active) values (?, 1)")
|
||||
if err != nil {
|
||||
log.Println("Error creating query", err)
|
||||
return err
|
||||
}
|
||||
_, err = q.Exec(pkg.Name)
|
||||
if err != nil {
|
||||
log.Println("Error creating Package", err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func DisablePackage(pkg Package, db *sql.DB) (int, error) {
|
||||
if !checkIfPackageExists(pkg, db) {
|
||||
log.Println("Package does not exist", pkg.Name)
|
||||
return 404, nil
|
||||
}
|
||||
q, err := db.Prepare("UPDATE dashboard_package set active = 0 where name = ?")
|
||||
if err != nil {
|
||||
log.Println("Error creating query", err)
|
||||
return 500, err
|
||||
}
|
||||
_, err = q.Exec(pkg.Name)
|
||||
if err != nil {
|
||||
log.Println("Error disabling Package", err)
|
||||
return 500, err
|
||||
}
|
||||
return 200, nil
|
||||
}
|
||||
|
||||
func EnablePackage(pkg Package, db *sql.DB) (int, error) {
|
||||
if !checkIfPackageExists(pkg, db) {
|
||||
log.Println("Package does not exist", pkg.Name)
|
||||
return 404, nil
|
||||
}
|
||||
q, err := db.Prepare("UPDATE dashboard_package set active = 1 where name = ?")
|
||||
if err != nil {
|
||||
log.Println("Error creating query", err)
|
||||
return 500, err
|
||||
}
|
||||
_, err = q.Exec(pkg.Name)
|
||||
if err != nil {
|
||||
log.Println("Error disabling Package", err)
|
||||
return 500, err
|
||||
}
|
||||
return 200, nil
|
||||
}
|
||||
|
||||
func DeletePackage(pkg Package, db *sql.DB) (int, error) {
|
||||
if !checkIfPackageExists(pkg, db) {
|
||||
log.Println("Package does not exist", pkg.Name)
|
||||
return 404, nil
|
||||
}
|
||||
q, err := db.Prepare("DELETE FROM dashboard_package where name = ?")
|
||||
if err != nil {
|
||||
log.Println("Error creating query", err)
|
||||
return 500, err
|
||||
}
|
||||
_, err = q.Exec(pkg.Name)
|
||||
if err != nil {
|
||||
log.Println("Error deleting Package", err)
|
||||
return 500, err
|
||||
}
|
||||
return 200, nil
|
||||
}
|
||||
118
app/Database/server.go
Normal file
118
app/Database/server.go
Normal file
@@ -0,0 +1,118 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
"gopkg.in/guregu/null.v4"
|
||||
"log"
|
||||
)
|
||||
|
||||
type Server struct {
|
||||
ID int `json:"id"`
|
||||
Hostname null.String `json:"hostname"`
|
||||
OsId null.String `json:"OsId"`
|
||||
}
|
||||
|
||||
func GetServersList(db *sql.DB) ([]Server, error) {
|
||||
var servers []Server
|
||||
rows, err := db.Query("SELECT * FROM dashboard_server")
|
||||
if err != nil {
|
||||
log.Println("Error querying servers list", err)
|
||||
}
|
||||
defer func(rows *sql.Rows) {
|
||||
err := rows.Close()
|
||||
if err != nil {
|
||||
|
||||
}
|
||||
}(rows)
|
||||
|
||||
for rows.Next() {
|
||||
var s Server
|
||||
err := rows.Scan(&s.ID, &s.Hostname, &s.OsId)
|
||||
if err != nil {
|
||||
log.Println("Error building servers list", err)
|
||||
}
|
||||
servers = append(servers, s)
|
||||
}
|
||||
return servers, err
|
||||
}
|
||||
|
||||
func GetServersbyID(db *sql.DB, id int64) Server {
|
||||
var s Server
|
||||
rows := db.QueryRow("SELECT * FROM dashboard_server WHERE id = ?", id)
|
||||
err := rows.Scan(&s.ID, &s.Hostname, &s.OsId)
|
||||
if err != nil {
|
||||
return Server{}
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
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 {
|
||||
log.Println("Error querying servers list by os_id", err)
|
||||
}
|
||||
defer func(rows *sql.Rows) {
|
||||
err := rows.Close()
|
||||
if err != nil {
|
||||
|
||||
}
|
||||
}(rows)
|
||||
|
||||
for rows.Next() {
|
||||
var s Server
|
||||
err := rows.Scan(&s.ID, &s.Hostname, &s.OsId)
|
||||
if err != nil {
|
||||
log.Println("Error building servers list", err)
|
||||
}
|
||||
servers = append(servers, s)
|
||||
}
|
||||
return servers, err
|
||||
}
|
||||
|
||||
func checkIfServerExists(server Server, db *sql.DB) bool {
|
||||
row := db.QueryRow("Select hostname, os_id from dashboard_server where hostname = ? and os_id = ?", server.Hostname, server.OsId)
|
||||
err := row.Scan(&server.Hostname, &server.OsId)
|
||||
if !errors.Is(err, sql.ErrNoRows) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func CreateServer(server Server, db *sql.DB) error {
|
||||
if checkIfServerExists(server, db) {
|
||||
log.Println("Server already exists")
|
||||
return nil
|
||||
}
|
||||
q, err := db.Prepare("INSERT INTO `dashboard_server` (hostname, os_id) VALUES (?,?)")
|
||||
if err != nil {
|
||||
log.Println("Error creating query", err)
|
||||
return err
|
||||
}
|
||||
_, err = q.Exec(server.Hostname, server.OsId)
|
||||
if err != nil {
|
||||
log.Println("Error inserting Server", err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func DeleteServer(server Server, db *sql.DB) (int, error) {
|
||||
if !checkIfServerExists(server, db) {
|
||||
log.Println("Server does not exist, nothing to delete")
|
||||
return 404, nil
|
||||
}
|
||||
q, err := db.Prepare("DELETE FROM dashboard_server WHERE hostname = ? AND os_id = ?")
|
||||
if err != nil {
|
||||
log.Println("Error deleting Server", err)
|
||||
return 500, err
|
||||
}
|
||||
_, err = q.Exec(server.Hostname, server.OsId)
|
||||
if err != nil {
|
||||
log.Println("Error deleting Server", err)
|
||||
return 500, err
|
||||
}
|
||||
log.Println("Server deleted")
|
||||
return 200, nil
|
||||
}
|
||||
25
app/Database/utils.go
Normal file
25
app/Database/utils.go
Normal file
@@ -0,0 +1,25 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"log"
|
||||
"os"
|
||||
|
||||
"github.com/go-sql-driver/mysql"
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
)
|
||||
|
||||
func GetDatabaseConnection() *sql.DB {
|
||||
cfg := mysql.Config{
|
||||
User: os.Getenv("DATABASE_USER"),
|
||||
Passwd: os.Getenv("DATABASE_PASSWORD"),
|
||||
Net: "tcp",
|
||||
Addr: os.Getenv("DATABASE_HOST"),
|
||||
DBName: os.Getenv("DATABASE_NAME"),
|
||||
}
|
||||
DbConn, err := sql.Open("mysql", cfg.FormatDSN())
|
||||
if err != nil {
|
||||
log.Println("Database connection error : ", err)
|
||||
}
|
||||
return DbConn
|
||||
}
|
||||
151
app/Http/os.go
Normal file
151
app/Http/os.go
Normal file
@@ -0,0 +1,151 @@
|
||||
package http
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
db "infra-dashboard/Database"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
"gopkg.in/guregu/null.v4"
|
||||
)
|
||||
|
||||
func GetOS(w http.ResponseWriter, r *http.Request) {
|
||||
var list []db.OS
|
||||
var err error
|
||||
|
||||
t := time.Now()
|
||||
status := 200
|
||||
|
||||
dbConn := db.GetDatabaseConnection()
|
||||
defer dbConn.Close()
|
||||
list, err = db.GetOS(dbConn)
|
||||
if err != nil {
|
||||
log.Println("Error getting OS list")
|
||||
status = 500
|
||||
}
|
||||
logRequest(t, r, status)
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(list)
|
||||
}
|
||||
|
||||
func GetOSbyID(w http.ResponseWriter, r *http.Request) {
|
||||
var os db.OS
|
||||
var err error
|
||||
|
||||
t := time.Now()
|
||||
status := 200
|
||||
|
||||
params := mux.Vars(r)
|
||||
dbConn := db.GetDatabaseConnection()
|
||||
defer dbConn.Close()
|
||||
id, err := strconv.ParseInt(params["id"], 10, 64)
|
||||
if err != nil {
|
||||
log.Println("Error converting ID", err)
|
||||
status = 500
|
||||
}
|
||||
os, err = db.GetOSbyID(dbConn, int64(id))
|
||||
if err != nil {
|
||||
log.Println("Error getting OS")
|
||||
status = 500
|
||||
}
|
||||
logRequest(t, r, status)
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(os)
|
||||
}
|
||||
|
||||
func GetDistributionList(w http.ResponseWriter, r *http.Request) {
|
||||
var list []null.String
|
||||
var err error
|
||||
|
||||
t := time.Now()
|
||||
status := 200
|
||||
|
||||
dbConn := db.GetDatabaseConnection()
|
||||
defer dbConn.Close()
|
||||
list, err = db.GetDistributionList(dbConn)
|
||||
if err != nil {
|
||||
log.Println("Error getting distribution list")
|
||||
status = 500
|
||||
}
|
||||
logRequest(t, r, status)
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(list)
|
||||
}
|
||||
|
||||
func GetVersionsByDistributionList(w http.ResponseWriter, r *http.Request) {
|
||||
var list []null.String
|
||||
var err error
|
||||
|
||||
t := time.Now()
|
||||
status := 200
|
||||
|
||||
params := mux.Vars(r)
|
||||
dbConn := db.GetDatabaseConnection()
|
||||
defer dbConn.Close()
|
||||
list, err = db.GetVersionsByDistributionList(dbConn, params["distribution"])
|
||||
if err != nil {
|
||||
log.Println("Error getting distribution list")
|
||||
status = 500
|
||||
}
|
||||
logRequest(t, r, status)
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(list)
|
||||
}
|
||||
|
||||
func CreateOS(w http.ResponseWriter, r *http.Request) {
|
||||
var os db.OS
|
||||
var err error
|
||||
|
||||
t := time.Now()
|
||||
status := 204
|
||||
|
||||
body, err := io.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
log.Println("Error reading request body", err)
|
||||
}
|
||||
|
||||
params := make(map[string]null.String)
|
||||
json.Unmarshal(body, ¶ms)
|
||||
os.Distribution = params["distribution"]
|
||||
os.Version = params["version"]
|
||||
os.EndOfSupport = params["end_of_support"]
|
||||
dbConn := db.GetDatabaseConnection()
|
||||
defer dbConn.Close()
|
||||
err = db.CreateOS(os, dbConn)
|
||||
if err != nil {
|
||||
log.Println("Error creating new OS", err)
|
||||
status = 500
|
||||
}
|
||||
logRequest(t, r, status)
|
||||
w.WriteHeader(status)
|
||||
}
|
||||
|
||||
func DeleteOS(w http.ResponseWriter, r *http.Request) {
|
||||
var os db.OS
|
||||
var err error
|
||||
var status int
|
||||
t := time.Now()
|
||||
|
||||
body, err := ioutil.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
log.Println(err.Error(), "Error reading request body")
|
||||
}
|
||||
|
||||
params := make(map[string]null.String)
|
||||
json.Unmarshal(body, ¶ms)
|
||||
os.Distribution = params["distribution"]
|
||||
os.Version = params["version"]
|
||||
dbConn := db.GetDatabaseConnection()
|
||||
defer dbConn.Close()
|
||||
status, err = db.DeleteOS(os, dbConn)
|
||||
if err != nil {
|
||||
log.Println(err.Error(), "Error deleting OS")
|
||||
}
|
||||
logRequest(t, r, status)
|
||||
w.WriteHeader(status)
|
||||
}
|
||||
155
app/Http/package.go
Normal file
155
app/Http/package.go
Normal file
@@ -0,0 +1,155 @@
|
||||
package http
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"gopkg.in/guregu/null.v4"
|
||||
db "infra-dashboard/Database"
|
||||
"io/ioutil"
|
||||
"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)
|
||||
dbConn := db.GetDatabaseConnection()
|
||||
defer dbConn.Close()
|
||||
id, err := strconv.ParseInt(params["id"], 10, 64)
|
||||
if err != nil {
|
||||
log.Println("Error converting ID", err)
|
||||
status = 500
|
||||
}
|
||||
pkg, err = db.GetPackagebyID(dbConn, 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)
|
||||
}
|
||||
|
||||
func CreatePackage(w http.ResponseWriter, r *http.Request) {
|
||||
var pkg db.Package
|
||||
var err error
|
||||
t := time.Now()
|
||||
status := 200
|
||||
|
||||
body, err := ioutil.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
log.Println(err.Error(), "Error reading request body")
|
||||
}
|
||||
|
||||
params := make(map[string]null.String)
|
||||
json.Unmarshal(body, ¶ms)
|
||||
pkg.Name = params["name"]
|
||||
dbConn := db.GetDatabaseConnection()
|
||||
defer dbConn.Close()
|
||||
err = db.CreatePackage(pkg, dbConn)
|
||||
if err != nil {
|
||||
log.Println("Error creating package", pkg.Name)
|
||||
status = 500
|
||||
}
|
||||
logRequest(t, r, status)
|
||||
w.WriteHeader(status)
|
||||
}
|
||||
|
||||
func DisablePackage(w http.ResponseWriter, r *http.Request) {
|
||||
var pkg db.Package
|
||||
var err error
|
||||
var status int
|
||||
t := time.Now()
|
||||
|
||||
body, err := ioutil.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
log.Println(err.Error(), "Error reading request body")
|
||||
}
|
||||
|
||||
params := make(map[string]null.String)
|
||||
json.Unmarshal(body, ¶ms)
|
||||
pkg.Name = params["name"]
|
||||
dbConn := db.GetDatabaseConnection()
|
||||
defer dbConn.Close()
|
||||
status, err = db.DisablePackage(pkg, dbConn)
|
||||
if err != nil {
|
||||
log.Println(err.Error(), "Error disabling package", pkg.Name)
|
||||
}
|
||||
logRequest(t, r, status)
|
||||
w.WriteHeader(status)
|
||||
}
|
||||
|
||||
func EnablePackage(w http.ResponseWriter, r *http.Request) {
|
||||
var pkg db.Package
|
||||
var err error
|
||||
var status int
|
||||
t := time.Now()
|
||||
|
||||
body, err := ioutil.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
log.Println(err.Error(), "Error reading request body")
|
||||
}
|
||||
|
||||
params := make(map[string]null.String)
|
||||
json.Unmarshal(body, ¶ms)
|
||||
pkg.Name = params["name"]
|
||||
dbConn := db.GetDatabaseConnection()
|
||||
defer dbConn.Close()
|
||||
status, err = db.EnablePackage(pkg, dbConn)
|
||||
if err != nil {
|
||||
log.Println(err.Error(), "Error enabling package", pkg.Name)
|
||||
}
|
||||
logRequest(t, r, status)
|
||||
w.WriteHeader(status)
|
||||
}
|
||||
|
||||
func DeletePackage(w http.ResponseWriter, r *http.Request) {
|
||||
var pkg db.Package
|
||||
var err error
|
||||
var status int
|
||||
t := time.Now()
|
||||
|
||||
body, err := ioutil.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
log.Println(err.Error(), "Error reading request body")
|
||||
}
|
||||
|
||||
params := make(map[string]null.String)
|
||||
json.Unmarshal(body, ¶ms)
|
||||
pkg.Name = params["name"]
|
||||
dbConn := db.GetDatabaseConnection()
|
||||
defer dbConn.Close()
|
||||
status, err = db.DeletePackage(pkg, dbConn)
|
||||
if err != nil {
|
||||
log.Println(err.Error(), "Error deleting package", pkg.Name)
|
||||
}
|
||||
logRequest(t, r, status)
|
||||
w.WriteHeader(status)
|
||||
}
|
||||
131
app/Http/server.go
Normal file
131
app/Http/server.go
Normal file
@@ -0,0 +1,131 @@
|
||||
package http
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"gopkg.in/guregu/null.v4"
|
||||
db "infra-dashboard/Database"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
)
|
||||
|
||||
func GetServersList(w http.ResponseWriter, r *http.Request) {
|
||||
var list []db.Server
|
||||
var err error
|
||||
|
||||
t := time.Now()
|
||||
status := 200
|
||||
|
||||
dbConn := db.GetDatabaseConnection()
|
||||
defer dbConn.Close()
|
||||
list, err = db.GetServersList(dbConn)
|
||||
if err != nil {
|
||||
log.Println("Error getting OS list")
|
||||
status = 500
|
||||
}
|
||||
logRequest(t, r, status)
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(list)
|
||||
}
|
||||
|
||||
func GetServersbyID(w http.ResponseWriter, r *http.Request) {
|
||||
var server db.Server
|
||||
var err error
|
||||
|
||||
t := time.Now()
|
||||
status := 200
|
||||
|
||||
params := mux.Vars(r)
|
||||
id, err := strconv.ParseInt(params["id"], 10, 32)
|
||||
if err != nil {
|
||||
log.Println("Error converting ID", err)
|
||||
status = 500
|
||||
}
|
||||
dbConn := db.GetDatabaseConnection()
|
||||
defer dbConn.Close()
|
||||
server = db.GetServersbyID(dbConn, int64(id))
|
||||
logRequest(t, r, status)
|
||||
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)
|
||||
osId, err := strconv.ParseInt(params["os_id"], 10, 32)
|
||||
if err != nil {
|
||||
log.Println("Error converting ID", err)
|
||||
status = 500
|
||||
}
|
||||
dbConn := db.GetDatabaseConnection()
|
||||
defer dbConn.Close()
|
||||
servers, err = db.GetServersbyOS(dbConn, int64(osId))
|
||||
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)
|
||||
}
|
||||
|
||||
func CreateServer(w http.ResponseWriter, r *http.Request) {
|
||||
var server db.Server
|
||||
var err error
|
||||
|
||||
t := time.Now()
|
||||
status := 204
|
||||
|
||||
body, err := ioutil.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
log.Println(err.Error(), "Error reading request body")
|
||||
}
|
||||
|
||||
params := make(map[string]null.String)
|
||||
json.Unmarshal(body, ¶ms)
|
||||
server.Hostname = params["hostname"]
|
||||
server.OsId = params["os_id"]
|
||||
dbConn := db.GetDatabaseConnection()
|
||||
defer dbConn.Close()
|
||||
err = db.CreateServer(server, dbConn)
|
||||
if err != nil {
|
||||
log.Println(err.Error(), "Error creating server")
|
||||
status = 500
|
||||
}
|
||||
logRequest(t, r, status)
|
||||
w.WriteHeader(status)
|
||||
}
|
||||
|
||||
func DeleteServer(w http.ResponseWriter, r *http.Request) {
|
||||
var server db.Server
|
||||
var err error
|
||||
var status int
|
||||
t := time.Now()
|
||||
|
||||
body, err := ioutil.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
log.Println(err.Error(), "Error reading request body")
|
||||
}
|
||||
|
||||
params := make(map[string]null.String)
|
||||
json.Unmarshal(body, ¶ms)
|
||||
server.Hostname = params["hostname"]
|
||||
server.OsId = params["os_id"]
|
||||
dbConn := db.GetDatabaseConnection()
|
||||
defer dbConn.Close()
|
||||
status, err = db.DeleteServer(server, dbConn)
|
||||
if err != nil {
|
||||
log.Println(err.Error(), "Error deleting server")
|
||||
}
|
||||
logRequest(t, r, status)
|
||||
w.WriteHeader(status)
|
||||
}
|
||||
40
app/Http/utils.go
Normal file
40
app/Http/utils.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package http
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
func RequestHandler(w http.ResponseWriter, r *http.Request) {
|
||||
t := time.Now()
|
||||
logRequest(t, r, 418)
|
||||
w.WriteHeader(http.StatusTeapot)
|
||||
fmt.Fprint(w, "Bip Boop I'm a teapot")
|
||||
}
|
||||
|
||||
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 %d \"-\" \"%s\" %d\n",
|
||||
r.Host,
|
||||
t.Format("[02/Jan/2006:15:04:05 -0700]"),
|
||||
r.Method,
|
||||
r.URL.Path,
|
||||
r.Proto,
|
||||
s,
|
||||
r.ContentLength,
|
||||
r.UserAgent(),
|
||||
time.Since(t).Milliseconds(),
|
||||
)
|
||||
}
|
||||
12
app/Tools/utils.go
Normal file
12
app/Tools/utils.go
Normal file
@@ -0,0 +1,12 @@
|
||||
package Tools
|
||||
|
||||
import (
|
||||
"log"
|
||||
"os"
|
||||
)
|
||||
|
||||
// InitLog ensure log file exists and set appropriate flags (remove timestamp at start of line).
|
||||
func InitLog() {
|
||||
log.SetOutput(os.Stdout)
|
||||
log.SetFlags(log.Flags() &^ (log.Ldate | log.Ltime))
|
||||
}
|
||||
32
app/go.mod
Normal file
32
app/go.mod
Normal file
@@ -0,0 +1,32 @@
|
||||
module infra-dashboard
|
||||
|
||||
go 1.23.1
|
||||
|
||||
toolchain go1.23.3
|
||||
|
||||
require (
|
||||
github.com/alexflint/go-arg v1.5.1
|
||||
github.com/go-sql-driver/mysql v1.8.1
|
||||
github.com/gorilla/mux v1.8.1
|
||||
github.com/joho/godotenv v1.5.1
|
||||
gopkg.in/guregu/null.v4 v4.0.0
|
||||
)
|
||||
|
||||
require (
|
||||
filippo.io/edwards25519 v1.1.0 // indirect
|
||||
github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c // indirect
|
||||
github.com/alexflint/go-scalar v1.2.0 // indirect
|
||||
github.com/google/go-cmp v0.6.0 // indirect
|
||||
golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 // indirect
|
||||
golang.org/x/mod v0.22.0 // indirect
|
||||
golang.org/x/sync v0.9.0 // indirect
|
||||
golang.org/x/sys v0.27.0 // indirect
|
||||
golang.org/x/telemetry v0.0.0-20241106142447-58a1122356f5 // indirect
|
||||
golang.org/x/text v0.20.0 // indirect
|
||||
golang.org/x/tools v0.27.1-0.20241219162658-575221bfbda3 // indirect
|
||||
golang.org/x/tools/gopls v0.17.1 // indirect
|
||||
golang.org/x/vuln v1.0.4 // indirect
|
||||
honnef.co/go/tools v0.5.1 // indirect
|
||||
mvdan.cc/gofumpt v0.7.0 // indirect
|
||||
mvdan.cc/xurls/v2 v2.5.0 // indirect
|
||||
)
|
||||
51
app/go.sum
Normal file
51
app/go.sum
Normal file
@@ -0,0 +1,51 @@
|
||||
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
||||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
||||
github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c h1:pxW6RcqyfI9/kWtOwnv/G+AzdKuy2ZrqINhenH4HyNs=
|
||||
github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
||||
github.com/alexflint/go-arg v1.5.1 h1:nBuWUCpuRy0snAG+uIJ6N0UvYxpxA0/ghA/AaHxlT8Y=
|
||||
github.com/alexflint/go-arg v1.5.1/go.mod h1:A7vTJzvjoaSTypg4biM5uYNTkJ27SkNTArtYXnlqVO8=
|
||||
github.com/alexflint/go-scalar v1.2.0 h1:WR7JPKkeNpnYIOfHRa7ivM21aWAdHD0gEWHCx+WQBRw=
|
||||
github.com/alexflint/go-scalar v1.2.0/go.mod h1:LoFvNMqS1CPrMVltza4LvnGKhaSpc3oyLEBUZVhhS2o=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
|
||||
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
|
||||
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
|
||||
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
||||
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 h1:1P7xPZEwZMoBoz0Yze5Nx2/4pxj6nw9ZqHWXqP0iRgQ=
|
||||
golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
|
||||
golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
|
||||
golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
||||
golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
|
||||
golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
|
||||
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/telemetry v0.0.0-20241106142447-58a1122356f5 h1:TCDqnvbBsFapViksHcHySl/sW4+rTGNIAoJJesHRuMM=
|
||||
golang.org/x/telemetry v0.0.0-20241106142447-58a1122356f5/go.mod h1:8nZWdGp9pq73ZI//QJyckMQab3yq7hoWi7SI0UIusVI=
|
||||
golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
|
||||
golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
|
||||
golang.org/x/tools v0.27.1-0.20241219162658-575221bfbda3 h1:kgwdasJRsdDWYgWcEgMF424DiXwwXHSb3V8xVTi//i8=
|
||||
golang.org/x/tools v0.27.1-0.20241219162658-575221bfbda3/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q=
|
||||
golang.org/x/tools/gopls v0.17.1 h1:Mt/DSfnnSe3dyf6MH/dZZ0iww+viHNhAFc4rEYDiOAw=
|
||||
golang.org/x/tools/gopls v0.17.1/go.mod h1:niea3AFBDJrqLpvDQ8vjmtzjGcT44nAoYm/vd34SaH4=
|
||||
golang.org/x/vuln v1.0.4 h1:SP0mPeg2PmGCu03V+61EcQiOjmpri2XijexKdzv8Z1I=
|
||||
golang.org/x/vuln v1.0.4/go.mod h1:NbJdUQhX8jY++FtuhrXs2Eyx0yePo9pF7nPlIjo9aaQ=
|
||||
gopkg.in/guregu/null.v4 v4.0.0 h1:1Wm3S1WEA2I26Kq+6vcW+w0gcDo44YKYD7YIEJNHDjg=
|
||||
gopkg.in/guregu/null.v4 v4.0.0/go.mod h1:YoQhUrADuG3i9WqesrCmpNRwm1ypAgSHYqoOcTu/JrI=
|
||||
gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA=
|
||||
gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
honnef.co/go/tools v0.5.1 h1:4bH5o3b5ZULQ4UrBmP+63W9r7qIkqJClEA9ko5YKx+I=
|
||||
honnef.co/go/tools v0.5.1/go.mod h1:e9irvo83WDG9/irijV44wr3tbhcFeRnfpVlRqVwpzMs=
|
||||
mvdan.cc/gofumpt v0.7.0 h1:bg91ttqXmi9y2xawvkuMXyvAA/1ZGJqYAEGjXuP0JXU=
|
||||
mvdan.cc/gofumpt v0.7.0/go.mod h1:txVFJy/Sc/mvaycET54pV8SW8gWxTlUuGHVEcncmNUo=
|
||||
mvdan.cc/xurls/v2 v2.5.0 h1:lyBNOm8Wo71UknhUs4QTFUNNMyxy2JEIaKKo0RWOh+8=
|
||||
mvdan.cc/xurls/v2 v2.5.0/go.mod h1:yQgaGQ1rFtJUzkmKiHYSSfuQxqfYmd//X6PxvholpeE=
|
||||
43
app/main.go
Normal file
43
app/main.go
Normal file
@@ -0,0 +1,43 @@
|
||||
// Receive and send information about servers
|
||||
package main
|
||||
|
||||
import (
|
||||
h "infra-dashboard/Http"
|
||||
tools "infra-dashboard/Tools"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
)
|
||||
|
||||
func main() {
|
||||
tools.InitLog()
|
||||
|
||||
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")
|
||||
router.HandleFunc("/os/{id:[0-9]+}", h.GetOSbyID).Methods("GET")
|
||||
router.HandleFunc("/os/create", h.CreateOS).Methods("POST")
|
||||
router.HandleFunc("/os/distribution", h.GetDistributionList).Methods("GET")
|
||||
router.HandleFunc("/os/distribution/{distribution:[a-zA-Z]+}/versions", h.GetVersionsByDistributionList).Methods("GET")
|
||||
router.HandleFunc("/os/delete", h.DeleteOS).Methods("DELETE")
|
||||
|
||||
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("/server/create", h.CreateServer).Methods("POST")
|
||||
router.HandleFunc("/server/delete", h.DeleteServer).Methods("DELETE")
|
||||
|
||||
router.HandleFunc("/packages", h.GetAllPackages).Methods("GET")
|
||||
router.HandleFunc("/packages/create", h.CreatePackage).Methods("POST")
|
||||
router.HandleFunc("/packages/disable", h.DisablePackage).Methods("POST")
|
||||
router.HandleFunc("/packages/enable", h.EnablePackage).Methods("POST")
|
||||
router.HandleFunc("/packages/delete", h.DeletePackage).Methods("DELETE")
|
||||
router.HandleFunc("/packages/{id:[0-9]+}", h.GetPackagebyID).Methods("GET")
|
||||
|
||||
log.Fatal(http.ListenAndServe(":8080", router))
|
||||
}
|
||||
Reference in New Issue
Block a user