diff --git a/.tmux.conf b/.tmux.conf new file mode 100644 index 000000000..e14a99824 --- /dev/null +++ b/.tmux.conf @@ -0,0 +1,36 @@ +# Mouse mode toggle with Ctrl+Space - direct color setting +bind-key -n C-Space if-shell "tmux show-options -g mouse | grep on" "set-option -g mouse off; set-option -g status-style bg=yellow,fg=black; display-message \"Text Mode\"" "set-option -g mouse on; set-option -g status-style bg=blue,fg=white; display-message \"Mouse Mode\"" + +# Status bar configuration +set-option -g status-position bottom +set-option -g status-style bg=blue,fg=white +set-option -g status-left "[#S] " +set-option -g status-right "Ctrl+Space: toggle mouse | Ctrl+Shift+Arrows: new pane | Ctrl+X: kill pane" +set-option -g status-left-length 20 +set-option -g status-right-length 90 + +# Option+Shift+Arrow keys for pane creation +bind-key -n M-S-Right split-window -h +bind-key -n M-S-Down split-window -v +bind-key -n M-S-Left split-window -hb +bind-key -n M-S-Up split-window -vb + +# Shift+Arrow for pane navigation +bind-key -n S-Right select-pane -R +bind-key -n S-Down select-pane -D +bind-key -n S-Left select-pane -L +bind-key -n S-Up select-pane -U + +# Kill pane without confirmation +bind-key -n x kill-pane + +# Enable mouse mode by default +set-option -g mouse on + +# Pane highlighting +set-option -g window-style "bg=colour236" +set-option -g window-active-style "bg=black" + +# Other useful settings +set-option -g history-limit 10000 +set-window-option -g mode-keys vi diff --git a/docs/VM_DISK_MONITORING.md b/docs/VM_DISK_MONITORING.md index 667899dd0..9be79d007 100644 --- a/docs/VM_DISK_MONITORING.md +++ b/docs/VM_DISK_MONITORING.md @@ -84,6 +84,25 @@ pveum aclmod / -user pulse-monitor@pam -role PulseMonitor ## Troubleshooting +### Quick Diagnostic Tool + +Pulse includes a diagnostic script that can identify why a VM isn't showing disk usage: + +```bash +# Run on your Proxmox host +curl -sSL https://raw.githubusercontent.com/rcourtman/Pulse/main/scripts/test-vm-disk.sh | bash + +# Or if Pulse is installed locally: +/opt/pulse/scripts/test-vm-disk.sh +``` + +Enter the VM ID when prompted. The script will check: +- VM running status +- Guest agent configuration +- Guest agent runtime status +- Filesystem information +- API permissions + ### Guest Agent Not Responding **Check if agent is running inside VM:** diff --git a/frontend-modern/src/api/notifications.ts b/frontend-modern/src/api/notifications.ts index f62a0907d..6e59f0e5d 100644 --- a/frontend-modern/src/api/notifications.ts +++ b/frontend-modern/src/api/notifications.ts @@ -67,20 +67,20 @@ export class NotificationsAPI { // Email configuration static async getEmailConfig(): Promise { - const backendConfig = await apiFetchJSON(`${this.baseUrl}/email`); + const backendConfig = await apiFetchJSON>(`${this.baseUrl}/email`); // Backend already returns fields with correct names (server, port) return { - enabled: backendConfig.enabled || false, - provider: backendConfig.provider || '', - server: backendConfig.server || '', - port: backendConfig.port || 587, - username: backendConfig.username || '', - password: backendConfig.password || '', - from: backendConfig.from || '', - to: backendConfig.to || [], - tls: backendConfig.tls || false, - startTLS: backendConfig.startTLS || false + enabled: (backendConfig.enabled as boolean) || false, + provider: (backendConfig.provider as string) || '', + server: (backendConfig.server as string) || '', + port: (backendConfig.port as number) || 587, + username: (backendConfig.username as string) || '', + password: (backendConfig.password as string) || '', + from: (backendConfig.from as string) || '', + to: (backendConfig.to as string[]) || [], + tls: (backendConfig.tls as boolean) || false, + startTLS: (backendConfig.startTLS as boolean) || false }; } diff --git a/frontend-modern/src/components/Alerts/ResourceTable.tsx b/frontend-modern/src/components/Alerts/ResourceTable.tsx index d03492bc5..8e7f83d8c 100644 --- a/frontend-modern/src/components/Alerts/ResourceTable.tsx +++ b/frontend-modern/src/components/Alerts/ResourceTable.tsx @@ -1,21 +1,33 @@ import { For, Show } from 'solid-js'; import type { Alert } from '@/types/api'; +interface Resource { + id: string; + name: string; + node?: string; + instance?: string; + type?: string; + thresholds?: Record; + disabled?: boolean; + nodeConnectivity?: boolean; + [key: string]: unknown; +} + interface ResourceTableProps { title: string; - resources?: any[]; - groupedResources?: Record; + resources?: Resource[]; + groupedResources?: Record; columns: string[]; activeAlerts?: Record; - onEdit: (resourceId: string, thresholds: any, defaults: any) => void; + onEdit: (resourceId: string, thresholds: Record, defaults: Record) => void; onSaveEdit: (resourceId: string) => void; onCancelEdit: () => void; onRemoveOverride: (resourceId: string) => void; onToggleDisabled?: (resourceId: string) => void; onToggleNodeConnectivity?: (nodeId: string) => void; editingId: () => string | null; - editingThresholds: () => Record; - setEditingThresholds: (value: Record) => void; + editingThresholds: () => Record; + setEditingThresholds: (value: Record) => void; formatMetricValue: (metric: string, value: number | undefined) => string; hasActiveAlert: (resourceId: string, metric: string) => boolean; } @@ -201,7 +213,7 @@ export function ResourceTable(props: ResourceTableProps) {