Pulse/internal/config/client_helpers.go

134 lines
3.9 KiB
Go

package config
import (
"net"
"net/url"
"strings"
"github.com/rcourtman/pulse-go-rewrite/pkg/pbs"
"github.com/rcourtman/pulse-go-rewrite/pkg/pmg"
"github.com/rcourtman/pulse-go-rewrite/pkg/proxmox"
)
const (
defaultPVEPort = "8006"
defaultPBSPort = "8007"
)
// normalizeHostPort ensures we always have a scheme and explicit port when talking to
// Proxmox APIs. It preserves existing ports/schemes and strips any path/query segments.
func normalizeHostPort(host, defaultPort string) string {
trimmed := strings.TrimSpace(host)
if trimmed == "" || defaultPort == "" {
return trimmed
}
candidate := trimmed
if !strings.HasPrefix(candidate, "http://") && !strings.HasPrefix(candidate, "https://") {
candidate = "https://" + candidate
}
parsed, err := url.Parse(candidate)
if err != nil || parsed.Host == "" {
return trimmed
}
// Drop any path fragments so we only persist host:port
parsed.Path = ""
parsed.RawPath = ""
parsed.RawQuery = ""
parsed.Fragment = ""
if parsed.Port() == "" {
parsed.Host = net.JoinHostPort(parsed.Hostname(), defaultPort)
}
return parsed.Scheme + "://" + parsed.Host
}
// CreateProxmoxConfig creates a proxmox.ClientConfig from a PVEInstance
func CreateProxmoxConfig(node *PVEInstance) proxmox.ClientConfig {
user := node.User
if node.TokenName == "" && node.TokenValue == "" && user != "" && !strings.Contains(user, "@") {
user = user + "@pam"
}
return proxmox.ClientConfig{
Host: normalizeHostPort(node.Host, defaultPVEPort),
User: user,
Password: node.Password,
TokenName: node.TokenName,
TokenValue: node.TokenValue,
VerifySSL: node.VerifySSL,
Fingerprint: node.Fingerprint,
}
}
// CreatePBSConfig creates a pbs.ClientConfig from a PBSInstance
func CreatePBSConfig(node *PBSInstance) pbs.ClientConfig {
return pbs.ClientConfig{
Host: normalizeHostPort(node.Host, defaultPBSPort),
User: node.User,
Password: node.Password,
TokenName: node.TokenName,
TokenValue: node.TokenValue,
VerifySSL: node.VerifySSL,
Fingerprint: node.Fingerprint,
}
}
// CreatePMGConfig creates a pmg.ClientConfig from a PMGInstance
func CreatePMGConfig(node *PMGInstance) pmg.ClientConfig {
return pmg.ClientConfig{
Host: normalizeHostPort(node.Host, defaultPVEPort),
User: node.User,
Password: node.Password,
TokenName: node.TokenName,
TokenValue: node.TokenValue,
VerifySSL: node.VerifySSL,
Fingerprint: node.Fingerprint,
}
}
// CreateProxmoxConfigFromFields creates a proxmox.ClientConfig from individual fields
func CreateProxmoxConfigFromFields(host, user, password, tokenName, tokenValue, fingerprint string, verifySSL bool) proxmox.ClientConfig {
if tokenName == "" && tokenValue == "" && user != "" && !strings.Contains(user, "@") {
user = user + "@pam"
}
return proxmox.ClientConfig{
Host: normalizeHostPort(host, defaultPVEPort),
User: user,
Password: password,
TokenName: tokenName,
TokenValue: tokenValue,
VerifySSL: verifySSL,
Fingerprint: fingerprint,
}
}
// CreatePBSConfigFromFields creates a pbs.ClientConfig from individual fields
func CreatePBSConfigFromFields(host, user, password, tokenName, tokenValue, fingerprint string, verifySSL bool) pbs.ClientConfig {
return pbs.ClientConfig{
Host: normalizeHostPort(host, defaultPBSPort),
User: user,
Password: password,
TokenName: tokenName,
TokenValue: tokenValue,
VerifySSL: verifySSL,
Fingerprint: fingerprint,
}
}
// CreatePMGConfigFromFields creates a pmg.ClientConfig from individual fields
func CreatePMGConfigFromFields(host, user, password, tokenName, tokenValue, fingerprint string, verifySSL bool) pmg.ClientConfig {
return pmg.ClientConfig{
Host: normalizeHostPort(host, defaultPVEPort),
User: user,
Password: password,
TokenName: tokenName,
TokenValue: tokenValue,
VerifySSL: verifySSL,
Fingerprint: fingerprint,
}
}