mirror of
https://github.com/community-scripts/ProxmoxVE
synced 2025-02-11 02:09:17 +00:00
168 lines
4.8 KiB
Go
168 lines
4.8 KiB
Go
// Copyright (c) 2021-2025 community-scripts ORG
|
|
// Author: Michel Roegl-Brunner (michelroegl-brunner)
|
|
// License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/gorilla/mux"
|
|
"github.com/joho/godotenv"
|
|
"github.com/rs/cors"
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
)
|
|
|
|
var client *mongo.Client
|
|
var collection *mongo.Collection
|
|
|
|
func loadEnv() {
|
|
if err := godotenv.Load(); err != nil {
|
|
log.Fatal("Error loading .env file")
|
|
}
|
|
}
|
|
|
|
type DataModel struct {
|
|
ID primitive.ObjectID `json:"id" bson:"_id,omitempty"`
|
|
CT_TYPE uint `json:"ct_type" bson:"ct_type"`
|
|
DISK_SIZE float32 `json:"disk_size" bson:"disk_size"`
|
|
CORE_COUNT uint `json:"core_count" bson:"core_count"`
|
|
RAM_SIZE uint `json:"ram_size" bson:"ram_size"`
|
|
OS_TYPE string `json:"os_type" bson:"os_type"`
|
|
OS_VERSION string `json:"os_version" bson:"os_version"`
|
|
DISABLEIP6 string `json:"disableip6" bson:"disableip6"`
|
|
NSAPP string `json:"nsapp" bson:"nsapp"`
|
|
METHOD string `json:"method" bson:"method"`
|
|
CreatedAt time.Time `json:"created_at" bson:"created_at"`
|
|
PVEVERSION string `json:"pve_version" bson:"pve_version"`
|
|
STATUS string `json:"status" bson:"status"`
|
|
RANDOM_ID string `json:"random_id" bson:"random_id"`
|
|
TYPE string `json:"type" bson:"type"`
|
|
ERROR string `json:"error" bson:"error"`
|
|
}
|
|
|
|
type StatusModel struct {
|
|
RANDOM_ID string `json:"random_id" bson:"random_id"`
|
|
ERROR string `json:"error" bson:"error"`
|
|
STATUS string `json:"status" bson:"status"`
|
|
}
|
|
|
|
func ConnectDatabase() {
|
|
loadEnv()
|
|
|
|
mongoURI := fmt.Sprintf("mongodb://%s:%s@%s:%s",
|
|
os.Getenv("MONGO_USER"),
|
|
os.Getenv("MONGO_PASSWORD"),
|
|
os.Getenv("MONGO_IP"),
|
|
os.Getenv("MONGO_PORT"))
|
|
|
|
database := os.Getenv("MONGO_DATABASE")
|
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
defer cancel()
|
|
|
|
var err error
|
|
client, err = mongo.Connect(ctx, options.Client().ApplyURI(mongoURI))
|
|
if err != nil {
|
|
log.Fatal("Failed to connect to MongoDB!", err)
|
|
}
|
|
collection = client.Database(database).Collection("data_models")
|
|
fmt.Println("Connected to MongoDB on 10.10.10.18")
|
|
}
|
|
|
|
func UploadJSON(w http.ResponseWriter, r *http.Request) {
|
|
var input DataModel
|
|
|
|
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
|
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
|
return
|
|
}
|
|
input.CreatedAt = time.Now()
|
|
|
|
_, err := collection.InsertOne(context.Background(), input)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
log.Println("Received data:", input)
|
|
w.WriteHeader(http.StatusCreated)
|
|
json.NewEncoder(w).Encode(map[string]string{"message": "Data saved successfully"})
|
|
}
|
|
|
|
func UpdateStatus(w http.ResponseWriter, r *http.Request) {
|
|
var input StatusModel
|
|
|
|
if err := json.NewDecoder(r.Body).Decode(&input); err != nil {
|
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
filter := bson.M{"random_id": input.RANDOM_ID}
|
|
update := bson.M{"$set": bson.M{"status": input.STATUS, "error": input.ERROR}}
|
|
|
|
_, err := collection.UpdateOne(context.Background(), filter, update)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
log.Println("Updated data:", input)
|
|
w.WriteHeader(http.StatusOK)
|
|
json.NewEncoder(w).Encode(map[string]string{"message": "Record updated successfully"})
|
|
}
|
|
|
|
func GetDataJSON(w http.ResponseWriter, r *http.Request) {
|
|
var records []DataModel
|
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
defer cancel()
|
|
|
|
cursor, err := collection.Find(ctx, bson.M{})
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
defer cursor.Close(ctx)
|
|
|
|
for cursor.Next(ctx) {
|
|
var record DataModel
|
|
if err := cursor.Decode(&record); err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
records = append(records, record)
|
|
}
|
|
|
|
w.Header().Set("Content-Type", "application/json")
|
|
json.NewEncoder(w).Encode(records)
|
|
}
|
|
|
|
func main() {
|
|
ConnectDatabase()
|
|
|
|
router := mux.NewRouter()
|
|
router.HandleFunc("/upload", UploadJSON).Methods("POST")
|
|
router.HandleFunc("/upload/updatestatus", UpdateStatus).Methods("POST")
|
|
router.HandleFunc("/data/json", GetDataJSON).Methods("GET")
|
|
|
|
c := cors.New(cors.Options{
|
|
AllowedOrigins: []string{"*"},
|
|
AllowedMethods: []string{"GET", "POST"},
|
|
AllowedHeaders: []string{"Content-Type", "Authorization"},
|
|
AllowCredentials: true,
|
|
})
|
|
|
|
handler := c.Handler(router)
|
|
|
|
fmt.Println("Server running on port 8080")
|
|
log.Fatal(http.ListenAndServe(":8080", handler))
|
|
}
|