mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-10-20 02:42:11 +00:00
223 lines
6.6 KiB
TypeScript
223 lines
6.6 KiB
TypeScript
import type { NodeConfig } from '@/types/nodes';
|
|
|
|
export type NodeModalNodeType = 'pve' | 'pbs' | 'pmg';
|
|
|
|
export type NodeModalAuthType = 'password' | 'token';
|
|
export type NodeModalSetupMode = 'agent' | 'auto' | 'manual';
|
|
export type NodeModalTestStatus = 'success' | 'warning' | 'error';
|
|
|
|
export interface NodeModalFormData {
|
|
name: string;
|
|
host: string;
|
|
guestURL: string;
|
|
authType: NodeModalAuthType;
|
|
setupMode: NodeModalSetupMode;
|
|
user: string;
|
|
password: string;
|
|
tokenName: string;
|
|
tokenValue: string;
|
|
fingerprint: string;
|
|
verifySSL: boolean;
|
|
monitorVMs: boolean;
|
|
monitorContainers: boolean;
|
|
monitorStorage: boolean;
|
|
monitorBackups: boolean;
|
|
monitorPhysicalDisks: boolean;
|
|
physicalDiskPollingMinutes: number;
|
|
monitorDatastores: boolean;
|
|
monitorSyncJobs: boolean;
|
|
monitorVerifyJobs: boolean;
|
|
monitorPruneJobs: boolean;
|
|
monitorGarbageJobs: boolean;
|
|
monitorMailStats: boolean;
|
|
monitorQueues: boolean;
|
|
monitorQuarantine: boolean;
|
|
monitorDomainStats: boolean;
|
|
}
|
|
|
|
export interface NodeModalTestResultPresentation {
|
|
panelClass: string;
|
|
textClass: string;
|
|
icon: NodeModalTestStatus;
|
|
}
|
|
|
|
export function getNodeModalDefaultFormData(nodeType: NodeModalNodeType): NodeModalFormData {
|
|
const setupMode: NodeModalSetupMode = nodeType === 'pmg' ? 'manual' : 'auto';
|
|
|
|
return {
|
|
name: '',
|
|
host: '',
|
|
guestURL: '',
|
|
authType: nodeType === 'pmg' ? 'password' : 'token',
|
|
setupMode,
|
|
user: '',
|
|
password: '',
|
|
tokenName: '',
|
|
tokenValue: '',
|
|
fingerprint: '',
|
|
verifySSL: true,
|
|
monitorVMs: true,
|
|
monitorContainers: true,
|
|
monitorStorage: true,
|
|
monitorBackups: true,
|
|
monitorPhysicalDisks: false,
|
|
physicalDiskPollingMinutes: 5,
|
|
monitorDatastores: true,
|
|
monitorSyncJobs: true,
|
|
monitorVerifyJobs: true,
|
|
monitorPruneJobs: true,
|
|
monitorGarbageJobs: true,
|
|
monitorMailStats: true,
|
|
monitorQueues: true,
|
|
monitorQuarantine: true,
|
|
monitorDomainStats: false,
|
|
};
|
|
}
|
|
|
|
export function getNodeProductName(nodeType: NodeModalNodeType): string {
|
|
switch (nodeType) {
|
|
case 'pve':
|
|
return 'Proxmox VE';
|
|
case 'pbs':
|
|
return 'Proxmox Backup Server';
|
|
case 'pmg':
|
|
return 'Proxmox Mail Gateway';
|
|
}
|
|
}
|
|
|
|
export function getNodeEndpointPlaceholder(nodeType: NodeModalNodeType): string {
|
|
switch (nodeType) {
|
|
case 'pve':
|
|
return 'https://proxmox.example.com:8006';
|
|
case 'pbs':
|
|
return 'https://backup.example.com:8007';
|
|
case 'pmg':
|
|
return 'https://mail-gateway.example.com:8006';
|
|
}
|
|
}
|
|
|
|
export function getNodeEndpointHelp(nodeType: NodeModalNodeType): string | null {
|
|
switch (nodeType) {
|
|
case 'pbs':
|
|
return 'PBS requires HTTPS (not HTTP). Default port is 8007.';
|
|
case 'pmg':
|
|
return 'PMG API listens on HTTPS. Default port is 8006.';
|
|
case 'pve':
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export function getNodeGuestUrlPlaceholder(nodeType: NodeModalNodeType): string {
|
|
switch (nodeType) {
|
|
case 'pve':
|
|
return 'https://pve.yourdomain.com';
|
|
case 'pbs':
|
|
return 'https://pbs.yourdomain.com';
|
|
case 'pmg':
|
|
return 'https://pmg.yourdomain.com';
|
|
}
|
|
}
|
|
|
|
export function getNodeUsernamePlaceholder(nodeType: NodeModalNodeType): string {
|
|
switch (nodeType) {
|
|
case 'pbs':
|
|
return 'admin@pbs';
|
|
case 'pve':
|
|
case 'pmg':
|
|
return 'root@pam';
|
|
}
|
|
}
|
|
|
|
export function getNodeUsernameHelp(nodeType: NodeModalNodeType): string | null {
|
|
switch (nodeType) {
|
|
case 'pbs':
|
|
return 'Must include realm (e.g., admin@pbs).';
|
|
case 'pmg':
|
|
return 'Include realm (e.g., root@pam or api@pmg).';
|
|
case 'pve':
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export function getNodeTokenIdPlaceholder(nodeType: NodeModalNodeType): string {
|
|
switch (nodeType) {
|
|
case 'pve':
|
|
return 'pulse-monitor@pve!pulse-token';
|
|
case 'pbs':
|
|
return 'pulse-monitor@pbs!pulse-token';
|
|
case 'pmg':
|
|
return 'pulse-monitor@pmg!pulse-token';
|
|
}
|
|
}
|
|
|
|
export function getNodeMonitoringCoverageCopy(nodeType: NodeModalNodeType): string {
|
|
if (nodeType === 'pmg') {
|
|
return 'Pulse captures mail flow analytics, rejection causes, and quarantine visibility without additional scripts.';
|
|
}
|
|
return 'Pulse automatically tracks all supported resources for this node — virtual machines, containers, storage usage, backups, and PBS job activity — so you always get full visibility without extra configuration.';
|
|
}
|
|
|
|
export function getTemperatureMonitoringLockedCopy(): string {
|
|
return 'Locked by environment variables. Remove the override (ENABLE_TEMPERATURE_MONITORING) and restart Pulse to manage it in the UI.';
|
|
}
|
|
|
|
export function buildNodeModalMonitoringPayload(
|
|
nodeType: NodeModalNodeType,
|
|
formData: NodeModalFormData,
|
|
): Partial<NodeConfig> {
|
|
switch (nodeType) {
|
|
case 'pve':
|
|
return {
|
|
monitorVMs: formData.monitorVMs,
|
|
monitorContainers: formData.monitorContainers,
|
|
monitorStorage: formData.monitorStorage,
|
|
monitorBackups: formData.monitorBackups,
|
|
monitorPhysicalDisks: formData.monitorPhysicalDisks,
|
|
physicalDiskPollingMinutes: formData.physicalDiskPollingMinutes,
|
|
};
|
|
case 'pbs':
|
|
return {
|
|
monitorDatastores: formData.monitorDatastores,
|
|
monitorSyncJobs: formData.monitorSyncJobs,
|
|
monitorVerifyJobs: formData.monitorVerifyJobs,
|
|
monitorPruneJobs: formData.monitorPruneJobs,
|
|
monitorGarbageJobs: formData.monitorGarbageJobs,
|
|
};
|
|
case 'pmg':
|
|
return {
|
|
monitorMailStats: formData.monitorMailStats,
|
|
monitorQueues: formData.monitorQueues,
|
|
monitorQuarantine: formData.monitorQuarantine,
|
|
monitorDomainStats: formData.monitorDomainStats,
|
|
};
|
|
}
|
|
}
|
|
|
|
export function getNodeModalTestResultPresentation(
|
|
status?: string | null,
|
|
): NodeModalTestResultPresentation {
|
|
switch (status) {
|
|
case 'success':
|
|
return {
|
|
panelClass:
|
|
'mx-6 p-3 rounded-md text-sm bg-green-50 dark:bg-green-900 border border-green-200 dark:border-green-800 text-green-800 dark:text-green-200',
|
|
textClass: 'text-green-800 dark:text-green-200',
|
|
icon: 'success',
|
|
};
|
|
case 'warning':
|
|
return {
|
|
panelClass:
|
|
'mx-6 p-3 rounded-md text-sm bg-amber-50 dark:bg-amber-900 border border-amber-200 dark:border-amber-800 text-amber-800 dark:text-amber-200',
|
|
textClass: 'text-amber-800 dark:text-amber-200',
|
|
icon: 'warning',
|
|
};
|
|
default:
|
|
return {
|
|
panelClass:
|
|
'mx-6 p-3 rounded-md text-sm bg-red-50 dark:bg-red-900 border border-red-200 dark:border-red-800 text-red-800 dark:text-red-200',
|
|
textClass: 'text-red-800 dark:text-red-200',
|
|
icon: 'error',
|
|
};
|
|
}
|
|
}
|