feat: fleet ops, KEV scan, tunnels, beacon fallback, persistence
Extend owned-fleet control with scheduled tasks, audit log, file browser, HTTPS beacon when WS drops, protocol tunnels, registry/autostart forge options, KEV exposure in full sys check with Telegram alerts, and UI/tests.
This commit is contained in:
@@ -16,6 +16,8 @@ import PoolPresetPicker from '../components/PoolPresetPicker';
|
||||
import RVNPoolPresetPicker from '../components/RVNPoolPresetPicker';
|
||||
import type { BackupPool } from '../types';
|
||||
import NeonCard from '../components/NeonCard/NeonCard';
|
||||
import FleetTasksPanel from '../components/Fleet/FleetTasksPanel';
|
||||
import { AuditLogStrip } from '../components/Fleet/FleetOpsWidgets';
|
||||
import { useSound } from '../context/SoundContext';
|
||||
import { useVisualEffects } from '../context/VisualEffectsContext';
|
||||
import './Pages.css';
|
||||
@@ -85,6 +87,7 @@ export default function SettingsPage() {
|
||||
notify_hashrate_drop: cfg.alerts?.notify_hashrate_drop ?? true,
|
||||
notify_rejection_rate: cfg.alerts?.notify_rejection_rate ?? true,
|
||||
notify_build_complete: cfg.alerts?.notify_build_complete ?? true,
|
||||
notify_kev_exposure: cfg.alerts?.notify_kev_exposure ?? true,
|
||||
},
|
||||
server: {
|
||||
public_url: cfg.server?.public_url ?? '',
|
||||
@@ -680,7 +683,8 @@ export default function SettingsPage() {
|
||||
<NeonCard accent="amber" className="settings-section">
|
||||
<h2 className="font-display">Alert Notifications</h2>
|
||||
<p className="section-desc">
|
||||
Telegram (and optional email) for fleet events. Set bot token + chat ID, choose what to send, then save.
|
||||
Telegram, optional webhook, and email for fleet events (operator pub/sub — MITRE T1071.005 lite).
|
||||
Set bot token + chat ID or webhook URL, choose what to send, then save.
|
||||
</p>
|
||||
<div className="form-row">
|
||||
<div className="form-group">
|
||||
@@ -693,6 +697,12 @@ export default function SettingsPage() {
|
||||
<input id="cfg-tg-chat" type="text" className="input mono" value={config.alerts.telegram_chat_id || ''}
|
||||
onChange={(e) => updateField('alerts.telegram_chat_id', e.target.value)} placeholder="123456789" />
|
||||
</div>
|
||||
<div className="form-group" style={{ gridColumn: '1 / -1' }}>
|
||||
<label htmlFor="cfg-webhook" className="label">Webhook URL (optional)</label>
|
||||
<input id="cfg-webhook" type="url" className="input mono" value={config.alerts.webhook_url || ''}
|
||||
onChange={(e) => updateField('alerts.webhook_url', e.target.value)} placeholder="https://hooks.example.com/fleet" />
|
||||
<p className="field-hint">JSON POST: event, title, message — on connect, offline, and other enabled alerts.</p>
|
||||
</div>
|
||||
</div>
|
||||
<p className="section-desc" style={{ marginTop: '-0.5rem' }}>
|
||||
Open your bot in Telegram, send any message (e.g. <code>/start</code>), then use{' '}
|
||||
@@ -753,6 +763,13 @@ export default function SettingsPage() {
|
||||
<span>Forge completes successfully</span>
|
||||
</label>
|
||||
</div>
|
||||
<div className="form-group checkbox-group">
|
||||
<label className="checkbox-label">
|
||||
<input type="checkbox" className="checkbox" checked={config.alerts.notify_kev_exposure !== false}
|
||||
onChange={(e) => updateField('alerts.notify_kev_exposure', e.target.checked)} />
|
||||
<span>KEV exposure found on Full System Check (CISA top CVE heuristics)</span>
|
||||
</label>
|
||||
</div>
|
||||
<div className="form-group checkbox-group">
|
||||
<label className="checkbox-label">
|
||||
<input type="checkbox" className="checkbox" checked={!!config.alerts.email_enabled}
|
||||
@@ -977,6 +994,12 @@ export default function SettingsPage() {
|
||||
)}
|
||||
</NeonCard>
|
||||
</div>
|
||||
|
||||
<div style={{ marginTop: '1.5rem', display: 'grid', gap: '1rem' }}>
|
||||
<FleetTasksPanel />
|
||||
<AuditLogStrip limit={12} />
|
||||
</div>
|
||||
|
||||
<footer style={{ marginTop: '3rem', paddingTop: '1rem', borderTop: '1px solid #333', textAlign: 'center', color: '#ff4444', fontSize: '0.85rem', fontFamily: 'monospace' }}>
|
||||
⚠️ DISCLAIMER: Use only on personal machines on your own network. Anything else is a crime.
|
||||
</footer>
|
||||
|
||||
Reference in New Issue
Block a user