mirror of
				https://github.com/community-scripts/ProxmoxVE.git
				synced 2025-11-04 02:12:49 +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))
 | 
						|
}
 |