111 lines
2.8 KiB
Go
111 lines
2.8 KiB
Go
package routes
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"proxmoxaas-dashboard/app/common"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/go-viper/mapstructure/v2"
|
|
)
|
|
|
|
type InstanceBackup struct {
|
|
Volid string `json:"volid"`
|
|
Notes string `json:"notes"`
|
|
Size int64 `json:"size"`
|
|
CTime int64 `json:"ctime"`
|
|
SizeFormatted string
|
|
TimeFormatted string
|
|
}
|
|
|
|
func HandleGETBackups(c *gin.Context) {
|
|
auth, err := common.GetAuth(c)
|
|
if err == nil {
|
|
vm_path, err := common.ExtractVMPath(c)
|
|
if err != nil {
|
|
common.HandleNonFatalError(c, err)
|
|
}
|
|
|
|
backups, err := GetInstanceBackups(vm_path, auth)
|
|
if err != nil {
|
|
common.HandleNonFatalError(c, fmt.Errorf("error encountered getting instance backups: %s", err.Error()))
|
|
}
|
|
|
|
config, err := GetInstanceConfig(vm_path, auth) // only used for the VM's name
|
|
if err != nil {
|
|
common.HandleNonFatalError(c, fmt.Errorf("error encountered getting instance config: %s", err.Error()))
|
|
}
|
|
|
|
log.Printf("%+v", backups)
|
|
|
|
c.HTML(http.StatusOK, "html/backups.html", gin.H{
|
|
"global": common.Global,
|
|
"page": "backups",
|
|
"backups": backups,
|
|
"config": config,
|
|
})
|
|
} else {
|
|
c.Redirect(http.StatusFound, "/login")
|
|
}
|
|
}
|
|
|
|
func HandleGETBackupsFragment(c *gin.Context) {
|
|
auth, err := common.GetAuth(c)
|
|
if err == nil { // user should be authed, try to return index with population
|
|
vm_path, err := common.ExtractVMPath(c)
|
|
if err != nil {
|
|
common.HandleNonFatalError(c, err)
|
|
}
|
|
|
|
backups, err := GetInstanceBackups(vm_path, auth)
|
|
if err != nil {
|
|
common.HandleNonFatalError(c, fmt.Errorf("error encountered getting instance backups: %s", err.Error()))
|
|
}
|
|
|
|
c.Header("Content-Type", "text/plain")
|
|
common.TMPL.ExecuteTemplate(c.Writer, "html/backups-backups.go.tmpl", gin.H{
|
|
"backups": backups,
|
|
})
|
|
c.Status(http.StatusOK)
|
|
} else { // return 401
|
|
c.Status(http.StatusUnauthorized)
|
|
}
|
|
}
|
|
|
|
func GetInstanceBackups(vm common.VMPath, auth common.Auth) ([]InstanceBackup, error) {
|
|
backups := []InstanceBackup{}
|
|
path := fmt.Sprintf("/cluster/%s/%s/%s/backup", vm.Node, vm.Type, vm.VMID)
|
|
ctx := common.RequestContext{
|
|
Cookies: map[string]string{
|
|
"username": auth.Username,
|
|
"PVEAuthCookie": auth.Token,
|
|
"CSRFPreventionToken": auth.CSRF,
|
|
},
|
|
}
|
|
body := []any{}
|
|
res, code, err := common.RequestGetAPI(path, ctx, &body)
|
|
if err != nil {
|
|
return backups, err
|
|
}
|
|
if code != 200 {
|
|
return backups, fmt.Errorf("request to %s resulted in %+v", path, res)
|
|
}
|
|
|
|
err = mapstructure.Decode(body, &backups)
|
|
if err != nil {
|
|
return backups, err
|
|
}
|
|
|
|
for i := range backups {
|
|
size, prefix := common.FormatNumber(backups[i].Size, 1024)
|
|
backups[i].SizeFormatted = fmt.Sprintf("%.3g %sB", size, prefix)
|
|
|
|
t := time.Unix(backups[i].CTime, 0)
|
|
backups[i].TimeFormatted = t.Format("02-01-06 15:04:05")
|
|
}
|
|
|
|
return backups, nil
|
|
}
|