diff --git a/panel/admin/index.php b/panel/admin/index.php index 31c96fe..4be53aa 100644 --- a/panel/admin/index.php +++ b/panel/admin/index.php @@ -38,10 +38,7 @@ require_once dirname(__DIR__) . '/_branding.php'; Dashboard - - - Server Status - +
| Installed | ${v.installed_version || '—'} |
| Version | ${v.installed_version || '—'} |
| Branch | ${v.git_branch || 'main'} |
| Commit | ${v.git_commit || '—'}${v.git_dirty ? ' dirty' : ''} |
| Commit | ${(v.git_commit||'—').substring(0,8)}${v.git_dirty ? ' dirty' : ''} |
| PHP | ${v.php_version || '—'} |
| OS | ${v.os || '—'} |
| OS | ${v.os || '—'} |
No history yet — stats are collected every 5 minutes.
Check that the collector cron is running: */5 * * * * root /usr/bin/php /opt/novacpx/bin/collect-stats.php
No history yet — collected every 5 minutes via cron.
' + : ''}Installed
${v.installed_version || '—'}
Latest (${ncpx.channel || 'stable'})
${ncpx.remote_version || (ncpxCount > 0 ? 'available' : v.installed_version || '—')}
Channel
${Nova.badge(ncpx.channel || 'stable', ncpx.channel === 'beta' ? 'yellow' : 'green')}PHP
${v.php_version || '—'}PHP syntax is validated before deploy. If the panel goes down after update, it will automatically restore from backup.
- - ` : `NovaCPX is up to date.
`} -| Package | From | To |
|---|---|---|
${Nova.escHtml(p.name)} |
- ${Nova.escHtml(p.from || '(new)')} | -${Nova.escHtml(p.to)} | -
Services are automatically restarted if an upgrade stops them. The NovaCPX web root is backed up before upgrade and restored if panel ports go down.
- - ` : `All OS packages are current.
`} -No tracked services found.
'; return; } - const statusDot = s => s === 'active' - ? '● running' - : s === null ? '—' - : '● stopped'; - body.innerHTML = `| Service | Description | Installed | Latest | Status | State |
|---|---|---|---|---|---|
${Nova.escHtml(s.label)}${Nova.escHtml(s.pkg)} |
- ${Nova.escHtml(s.desc)} | -${Nova.escHtml(s.installed)} |
- ${Nova.escHtml(s.latest)} |
- ${s.up_to_date === true ? Nova.badge('current','green') : s.up_to_date === false ? Nova.badge('update available','yellow') : '—'} | -${statusDot(s.status)} | -
| Time | User | Action | Resource | IP | |
|---|---|---|---|---|---|
| ${Nova.relTime(r.created_at)} | -${Nova.escHtml(r.username || '—')} | -${Nova.escHtml(r.action)} |
- ${Nova.escHtml(r.resource || '—')} | -${Nova.escHtml(r.ip_address || '—')} | -▾ | -
- ${
- r.detail ? JSON.stringify(JSON.parse(r.detail || '{}'), null, 2) : '(no detail)'
- }
- |
- |||||
No audit entries match the current filters.
NovaCPX itself runs on PHP ${panelPhp} (always the highest installed version, updated automatically when a new version is installed).
-Loading extensions for PHP ${ver}…
${r?.message || 'Failed to load'}
| Extension | Action |
|---|---|
${e} |
- - - | -
No templates found. Create one.
'; - return; - } - body.innerHTML = `| Trigger | Label | Subject | Status | Actions |
|---|---|---|---|---|
${Nova.escHtml(t.trigger_key)} |
- ${Nova.escHtml(t.label)} | -${Nova.escHtml(t.subject)} | -${t.enabled ? Nova.badge('enabled','green') : Nova.badge('disabled','red')} | -- - - - | -
| Username | Domain | Owner | Package | Status | Created | Actions |
|---|---|---|---|---|---|---|
| ${Nova.escHtml(a.username)} | -${Nova.escHtml(a.domain)} | -${a.reseller_username ? `${Nova.escHtml(a.reseller_username)}` : 'Admin'} | -${a.package_name ? Nova.escHtml(a.package_name) : '—'} | -${Nova.badge(a.status, a.status==='active'?'green':a.status==='suspended'?'yellow':'red')} | -${Nova.relTime(a.created_at)} | -- - - ${a.status==='active' - ? `` - : ``} - - - | -
| Username | Status | Created | Actions | |
|---|---|---|---|---|
| ${Nova.escHtml(r.username)} | -${Nova.escHtml(r.email||'—')} | -${Nova.badge(r.status, r.status==='active'?'green':'red')} | -${r.created_at ? r.created_at.slice(0,10) : '—'} | -- - ${r.status === 'active' - ? `` - : ``} - - | -
| Name | Disk | BW | DBs | Emails | Price | Accounts | Actions |
|---|---|---|---|---|---|---|---|
| ${p.name} | -${p.disk_mb > 0 ? p.disk_mb+'MB' : '∞'} | -${p.bandwidth_mb > 0 ? p.bandwidth_mb+'MB' : '∞'} | -${p.databases||'∞'} | -${p.email_accounts||'∞'} | -${p.price ? '$'+p.price : 'Free'} | -${p.account_count||0} | -- - - | -
| Domain | Account | Records | Actions |
|---|---|---|---|
| ${z.domain} | -${z.username||'—'} | -${z.record_count||0} | -- - - | -
${Nova.escHtml(r.content||r.value||'')}| Name | Type | Content | TTL | |
|---|---|---|---|---|
| No records yet. | ||||
← Click a log above to view it-