mirror of
https://github.com/myronblair/web-dashboard
synced 2026-07-27 20:02:31 -05:00
Add MSP360 backup status card: last-success date per host
This commit is contained in:
+221
-4
@@ -178,7 +178,7 @@
|
||||
<a class="link-item" href="https://jarvis.orbishosting.com/login.php" target="_blank">
|
||||
<span class="dot dot-blue"></span><span class="name">JARVIS Dashboard</span><span class="sub">Main UI</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://jarvis.orbishosting.com/admin" target="_blank">
|
||||
<a class="link-item" href="https://jarvis.orbishosting.com/admin/" target="_blank">
|
||||
<span class="dot dot-purple"></span><span class="name">JARVIS Admin</span><span class="sub">Admin panel</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<div class="divider"></div>
|
||||
@@ -210,19 +210,32 @@
|
||||
<!-- DOWNLOADS -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="icon icon-green">📄</div>
|
||||
<div class="icon icon-cyan">📥</div>
|
||||
<h2>Downloads</h2>
|
||||
</div>
|
||||
<div class="links">
|
||||
<a class="link-item" href="/downloads/INFRASTRUCTURE-REFERENCE.md" download="INFRASTRUCTURE-REFERENCE.md">
|
||||
<span class="dot dot-green"></span><span class="name">Infrastructure Reference</span><span class="sub">Complete system map & credentials</span><span class="arrow">↓</span>
|
||||
<span class="dot dot-cyan"></span><span class="name">Infrastructure Reference</span><span class="sub">Complete system map & credentials</span><span class="arrow">↓</span>
|
||||
</a>
|
||||
<a class="link-item" href="/downloads/msp360-linux-installer.zip" download="msp360-linux-installer.zip">
|
||||
<span class="dot dot-cyan"></span><span class="name">MSP360 Linux Installer</span><span class="sub">Backup setup scripts + Gitea config fetch</span><span class="arrow">↓</span>
|
||||
<span class="dot dot-green"></span><span class="name">MSP360 Linux Installer</span><span class="sub">Backup setup scripts + Gitea config fetch</span><span class="arrow">↓</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- BACKUP STATUS -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="icon icon-green">🗄️</div>
|
||||
<h2>Backup Status</h2>
|
||||
</div>
|
||||
<div class="links" id="backup-status-list">
|
||||
<div class="link-item"><span class="sub">Loading…</span></div>
|
||||
</div>
|
||||
<p id="backup-status-updated" style="color:var(--muted);font-size:0.7rem;margin-top:0.5rem;padding:0 0.25rem;"></p>
|
||||
</div>
|
||||
|
||||
<!-- HOME AUTOMATION -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
@@ -314,6 +327,10 @@
|
||||
<a class="link-item" href="https://parkerslingshotrentals.com" target="_blank">
|
||||
<span class="dot dot-red"></span><span class="name">Parker Slingshot Rentals</span><span class="sub">parkerslingshotrentals.com</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<div class="divider"></div>
|
||||
<a class="link-item" href="https://www.facebook.com/tomtomenterprises" target="_blank">
|
||||
<span class="dot dot-blue"></span><span class="name">Tom Tom Enterprises</span><span class="sub">facebook.com/tomtomenterprises</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -426,6 +443,167 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- BWJ TRAVEL -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="icon icon-cyan">✈️</div>
|
||||
<h2>BWJ Travel</h2>
|
||||
</div>
|
||||
<div class="links">
|
||||
<a class="link-item" href="https://agents.bwjtravel.com/agent_dashboard?view=dashboard" target="_blank">
|
||||
<span class="dot dot-cyan"></span><span class="name">BWJ Travel</span><span class="sub">Agent dashboard</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://exchange.bwjtravel.com/feed" target="_blank">
|
||||
<span class="dot dot-blue"></span><span class="name">BWJ Exchange</span><span class="sub">Feed</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://epictravelexpeditions.com/" target="_blank">
|
||||
<span class="dot dot-green"></span><span class="name">Epic Travel & Expeditions</span><span class="sub">epictravelexpeditions.com</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<div class="divider"></div>
|
||||
<a class="link-item" href="https://www.vaxvacationaccess.com/" target="_blank">
|
||||
<span class="dot dot-blue"></span><span class="name">VAX VacationAccess</span><span class="sub">Vacation packages</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://app.bedsonline.com/main" target="_blank">
|
||||
<span class="dot dot-purple"></span><span class="name">Bedsonline</span><span class="sub">Hotels & packages</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://www.expediataap.com/" target="_blank">
|
||||
<span class="dot dot-yellow"></span><span class="name">Expedia TAAP</span><span class="sub">Travel agent portal</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://www.mscbook.com/us/welcome" target="_blank">
|
||||
<span class="dot dot-cyan"></span><span class="name">MSC Book</span><span class="sub">MSC Cruises booking</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://sherpa.gadventures.com/login/" target="_blank">
|
||||
<span class="dot dot-green"></span><span class="name">Sherpa</span><span class="sub">G Adventures</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<div class="divider"></div>
|
||||
<a class="link-item" href="https://secure.cruisingpower.com/login" target="_blank">
|
||||
<span class="dot dot-blue"></span><span class="name">Royal Caribbean / Celebrity</span><span class="sub">cruisingpower.com</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://sso.ncl.com/secureauth1/" target="_blank">
|
||||
<span class="dot dot-cyan"></span><span class="name">Norwegian Cruise Line</span><span class="sub">sso.ncl.com</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://www.goccl.com/" target="_blank">
|
||||
<span class="dot dot-orange"></span><span class="name">Carnival Cruises</span><span class="sub">goccl.com</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://www.viking.com/travel-advisor/home" target="_blank">
|
||||
<span class="dot dot-purple"></span><span class="name">Viking Cruises</span><span class="sub">Travel advisor portal</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<div class="divider"></div>
|
||||
<a class="link-item" href="https://www.worldagentdirect.com/delta/home/index" target="_blank">
|
||||
<span class="dot dot-red"></span><span class="name">Delta Vacations</span><span class="sub">worldagentdirect.com</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://agents.globusfamily.com/login/" target="_blank">
|
||||
<span class="dot dot-blue"></span><span class="name">Globus Travel</span><span class="sub">agents.globusfamily.com</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://downtowntravel.com/" target="_blank">
|
||||
<span class="dot dot-green"></span><span class="name">Downtown Travel</span><span class="sub">Pays commission</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://www.bookalimo.com/booker/" target="_blank">
|
||||
<span class="dot dot-gray"></span><span class="name">Book A Limo</span><span class="sub">bookalimo.com</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<div class="divider"></div>
|
||||
<a class="link-item" href="https://www.imglobal.com/img-producer-insurance-plans?IMGAC=546034&uservar=MyronBlair&productType=trip&sort=popularity" target="_blank">
|
||||
<span class="dot dot-yellow"></span><span class="name">Travel Insurance</span><span class="sub">IMG Global</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://www.travelagentinstitute.com/community/c/travel-agent-certification/module-1-onboarding/module-1-lesson-1-welcome" target="_blank">
|
||||
<span class="dot dot-purple"></span><span class="name">Training & Certification</span><span class="sub">Travel Agent Institute</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://agentprofiler.travelleaders.com/" target="_blank">
|
||||
<span class="dot dot-cyan"></span><span class="name">Agent Universe</span><span class="sub">agentprofiler.travelleaders.com</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://calendly.com/app/scheduling/meeting_types/user/me" target="_blank">
|
||||
<span class="dot dot-blue"></span><span class="name">Calendly</span><span class="sub">Travel booking scheduler</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- HAM RADIO -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="icon icon-green">📻</div>
|
||||
<h2>Ham Radio</h2>
|
||||
</div>
|
||||
<div class="links">
|
||||
<a class="link-item" href="https://hamradioprep.com/" target="_blank">
|
||||
<span class="dot dot-blue"></span><span class="name">Ham Radio Prep</span><span class="sub">License class & study</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://openhamclock.com/" target="_blank">
|
||||
<span class="dot dot-cyan"></span><span class="name">OpenHamClock</span><span class="sub">Amateur radio dashboard</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://web.odmaster.net/login" target="_blank">
|
||||
<span class="dot dot-purple"></span><span class="name">Odmaster System</span><span class="sub">web.odmaster.net</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<div class="divider"></div>
|
||||
<a class="link-item" href="https://www.youtube.com/watch?v=USkzZgZUXxw" target="_blank">
|
||||
<span class="dot dot-red"></span><span class="name">Baofeng UV-5R: Repeater & Store</span><span class="sub">YouTube — programming guide</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://www.youtube.com/watch?v=WPyYh3nlpUg" target="_blank">
|
||||
<span class="dot dot-red"></span><span class="name">Baofeng UV-5R: Easy Repeater</span><span class="sub">YouTube — repeater programming</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://www.buytwowayradios.com/blog/2016/08/how_to_manually_program_the_baofeng_uv-5r_from_the_keypad.html" target="_blank">
|
||||
<span class="dot dot-orange"></span><span class="name">Baofeng UV-5R: Keypad Manual</span><span class="sub">Manual keypad programming</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://www.baofengradio.com/blogs/news/how-to-program-baofeng-uv-5r-series-with-programming-software" target="_blank">
|
||||
<span class="dot dot-orange"></span><span class="name">Baofeng UV-5R: CHIRP Software</span><span class="sub">Software programming guide</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<div class="divider"></div>
|
||||
<a class="link-item" href="https://www.repeaterbook.com/index.php/en-us/" target="_blank">
|
||||
<span class="dot dot-green"></span><span class="name">Repeaterbook</span><span class="sub">repeaterbook.com</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://www.repeaterbook.com/repeaters/location_search.php?type=county&state_id=48&loc=Parker" target="_blank">
|
||||
<span class="dot dot-green"></span><span class="name">Repeaterbook — Parker County</span><span class="sub">Local TX repeaters</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://www.radioreference.com/" target="_blank">
|
||||
<span class="dot dot-blue"></span><span class="name">RadioReference</span><span class="sub">Frequency database</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="http://www.interceptradio.com/fcc_county.php?sstate=TX&scounty=Tarrant" target="_blank">
|
||||
<span class="dot dot-yellow"></span><span class="name">InterceptRadio — Tarrant Co.</span><span class="sub">FCC frequency search</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://www.txvhffm.org/coordination/bandplan.php" target="_blank">
|
||||
<span class="dot dot-cyan"></span><span class="name">Texas VHF-FM Band Plans</span><span class="sub">txvhffm.org</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- LASER ENGRAVING -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="icon icon-orange">🔆</div>
|
||||
<h2>Laser Engraving</h2>
|
||||
</div>
|
||||
<div class="links">
|
||||
<a class="link-item" href="https://lasergrbl.com/" target="_blank">
|
||||
<span class="dot dot-blue"></span><span class="name">LaserGRBL</span><span class="sub">Free laser engraving software</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://docs.lightburnsoftware.com/index.html" target="_blank">
|
||||
<span class="dot dot-orange"></span><span class="name">LightBurn Docs</span><span class="sub">Documentation</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://docs.lightburnsoftware.com/legacy/LightBurnBridge" target="_blank">
|
||||
<span class="dot dot-yellow"></span><span class="name">LightBurn Bridge</span><span class="sub">Bridge setup guide</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://docs.lightburnsoftware.com/legacy/LightBurnBridge-Advanced#flashing-the-lightburn-bridge-image-to-an-sd-card" target="_blank">
|
||||
<span class="dot dot-yellow"></span><span class="name">LightBurn Bridge (Advanced)</span><span class="sub">SD card flashing guide</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<div class="divider"></div>
|
||||
<a class="link-item" href="https://omtechlaser.com/collections/diy-craft-kits" target="_blank">
|
||||
<span class="dot dot-cyan"></span><span class="name">OMTech Free Files</span><span class="sub">DIY laser cut kits</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://freesvgdesigns.com/free-svg-downloads/" target="_blank">
|
||||
<span class="dot dot-green"></span><span class="name">Free SVG Designs</span><span class="sub">freesvgdesigns.com</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://www.creativefabrica.com/freebies/free-crafts/" target="_blank">
|
||||
<span class="dot dot-pink"></span><span class="name">Creative Fabrica</span><span class="sub">Free SVGs for Cricut & laser</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<a class="link-item" href="https://creativemeadow.com/yearly-access/" target="_blank">
|
||||
<span class="dot dot-purple"></span><span class="name">Creative Meadow</span><span class="sub">Laser-ready file subscription</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
<div class="divider"></div>
|
||||
<a class="link-item" href="https://www.fokoostech.com/" target="_blank">
|
||||
<span class="dot dot-gray"></span><span class="name">Fokoos Tech</span><span class="sub">FDM 3D printer & laser store</span><span class="arrow">↗</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- DO SERVER -->
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
@@ -507,6 +685,45 @@
|
||||
}
|
||||
tick(); setInterval(tick, 1000);
|
||||
|
||||
// ── Backup Status card — reads daily-refreshed JSON from MSP360 collector ──
|
||||
async function loadBackupStatus() {
|
||||
const el = document.getElementById('backup-status-list');
|
||||
const updatedEl = document.getElementById('backup-status-updated');
|
||||
try {
|
||||
const r = await fetch('/downloads/backup-status.json', { cache: 'no-store' });
|
||||
const data = await r.json();
|
||||
const dotFor = (result) => {
|
||||
const s = (result || '').toLowerCase();
|
||||
if (s === 'success') return 'dot-green';
|
||||
if (s === 'warning') return 'dot-yellow';
|
||||
if (s === 'running') return 'dot-cyan';
|
||||
if (s === 'fail') return 'dot-red';
|
||||
return 'dot-gray';
|
||||
};
|
||||
const lastSuccessText = (iso) => {
|
||||
if (!iso) return 'Never succeeded';
|
||||
const d = new Date(iso);
|
||||
return 'Last success ' + d.toLocaleString('en-US', {month:'short', day:'numeric', hour:'2-digit', minute:'2-digit'});
|
||||
};
|
||||
el.innerHTML = data.hosts.map(h => `
|
||||
<div class="link-item">
|
||||
<span class="dot ${dotFor(h.result)}"></span>
|
||||
<span class="name">${h.name}</span>
|
||||
<span class="sub">${h.ip} · ${h.state} · ${lastSuccessText(h.last_success)}</span>
|
||||
<span class="arrow">${h.result}</span>
|
||||
</div>
|
||||
`).join('');
|
||||
if (data.updated) {
|
||||
const d = new Date(data.updated);
|
||||
updatedEl.textContent = 'Updated ' + d.toLocaleString('en-US', {month:'short', day:'numeric', hour:'2-digit', minute:'2-digit'});
|
||||
}
|
||||
} catch (e) {
|
||||
el.innerHTML = '<div class="link-item"><span class="sub">Status unavailable</span></div>';
|
||||
}
|
||||
}
|
||||
loadBackupStatus();
|
||||
|
||||
|
||||
// ── Notes — server-backed so they sync across all devices ─────────────
|
||||
const API = '/notes.php';
|
||||
let _notes = [];
|
||||
|
||||
Reference in New Issue
Block a user