This commit is contained in:
illustris
2026-03-11 15:01:20 +05:30
commit d8f4a77657
30 changed files with 3164 additions and 0 deletions

View File

@@ -0,0 +1,68 @@
package pveconfig
import (
"strings"
"pve_local_exporter/internal/cache"
)
// PoolInfo holds parsed pool hierarchy info.
type PoolInfo struct {
LevelCount int
Level1 string
Level2 string
Level3 string
}
// FileReader abstracts file reading for testability.
type FileReader interface {
ReadFile(path string) (string, error)
Stat(path string) (cache.StatFunc, error)
}
// ParsePoolConfig parses /etc/pve/user.cfg for pool definitions.
// Returns (vm_pool_map, pools).
// vm_pool_map: vmid -> pool_name
// pools: pool_name -> PoolInfo
func ParsePoolConfig(data string) (map[string]string, map[string]PoolInfo) {
vmPoolMap := make(map[string]string)
pools := make(map[string]PoolInfo)
for _, line := range strings.Split(data, "\n") {
if !strings.HasPrefix(line, "pool:") {
continue
}
parts := strings.Split(strings.TrimSpace(line), ":")
if len(parts) < 2 {
continue
}
poolName := parts[1]
poolParts := strings.Split(poolName, "/")
info := PoolInfo{
LevelCount: len(poolParts),
}
if len(poolParts) > 0 {
info.Level1 = poolParts[0]
}
if len(poolParts) > 1 {
info.Level2 = poolParts[1]
}
if len(poolParts) > 2 {
info.Level3 = poolParts[2]
}
pools[poolName] = info
// VM list is in parts[3] if it exists
if len(parts) > 3 && parts[3] != "" {
for _, vmid := range strings.Split(parts[3], ",") {
vmid = strings.TrimSpace(vmid)
if vmid != "" {
vmPoolMap[vmid] = poolName
}
}
}
}
return vmPoolMap, pools
}