auth.pyā¢2.31 kB
"""
Authentication utilities for the Proxmox MCP server.
"""
import os
from typing import Dict, Optional, Tuple
from pydantic import BaseModel
class ProxmoxAuth(BaseModel):
"""Proxmox authentication configuration."""
user: str
token_name: str
token_value: str
def load_auth_from_env() -> ProxmoxAuth:
"""
Load Proxmox authentication details from environment variables.
Environment Variables:
PROXMOX_USER: Username with realm (e.g., 'root@pam' or 'user@pve')
PROXMOX_TOKEN_NAME: API token name
PROXMOX_TOKEN_VALUE: API token value
Returns:
ProxmoxAuth: Authentication configuration
Raises:
ValueError: If required environment variables are missing
"""
user = os.getenv("PROXMOX_USER")
token_name = os.getenv("PROXMOX_TOKEN_NAME")
token_value = os.getenv("PROXMOX_TOKEN_VALUE")
if not all([user, token_name, token_value]):
missing = []
if not user:
missing.append("PROXMOX_USER")
if not token_name:
missing.append("PROXMOX_TOKEN_NAME")
if not token_value:
missing.append("PROXMOX_TOKEN_VALUE")
raise ValueError(f"Missing required environment variables: {', '.join(missing)}")
return ProxmoxAuth(
user=user,
token_name=token_name,
token_value=token_value,
)
def parse_user(user: str) -> Tuple[str, str]:
"""
Parse a Proxmox user string into username and realm.
Args:
user: User string in format 'username@realm'
Returns:
Tuple[str, str]: (username, realm)
Raises:
ValueError: If user string is not in correct format
"""
try:
username, realm = user.split("@")
return username, realm
except ValueError:
raise ValueError(
"Invalid user format. Expected 'username@realm' (e.g., 'root@pam' or 'user@pve')"
)
def get_auth_dict(auth: ProxmoxAuth) -> Dict[str, str]:
"""
Convert ProxmoxAuth model to dictionary for Proxmoxer API.
Args:
auth: ProxmoxAuth configuration
Returns:
Dict[str, str]: Authentication dictionary for Proxmoxer
"""
return {
"user": auth.user,
"token_name": auth.token_name,
"token_value": auth.token_value,
}