diff --git a/panel/public/assets/js/admin.js b/panel/public/assets/js/admin.js index 6cca5c8..1ebb9b1 100644 --- a/panel/public/assets/js/admin.js +++ b/panel/public/assets/js/admin.js @@ -284,25 +284,587 @@ `; } - // ── Stub pages ───────────────────────────────────────────────────────────── - function stubPage(title, desc) { - return `
${desc}
-| Username | Domain | Reseller | Package | Disk | Status | Created | Actions |
|---|---|---|---|---|---|---|---|
| ${a.username} | +${a.domain} | +${a.reseller_username || 'admin'} | +${a.package_name || '—'} | +${a.disk_usage_mb || 0} MB | +${Nova.badge(a.status, a.status==='active'?'green':a.status==='suspended'?'yellow':'red')} | +${Nova.relTime(a.created_at)} | ++ ${a.status==='active' + ? `` + : ``} + + + | +
| Username | Accounts | Status | Actions | |
|---|---|---|---|---|
| ${r.username} | ${r.email||'—'} | +${r.account_count||0} | +${Nova.badge(r.status,r.status==='active'?'green':'red')} | ++ + + | +
| 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} | ++ + + | +
${r.value}| Name | Type | Value | TTL |
|---|
| Domain | Account | Type | Expires | Days | Actions |
|---|---|---|---|---|---|
| ${c.domain} | +${c.username||'—'} | +${Nova.badge(c.type,'default')} | +${c.expires_at||'—'} | +${badge} | ++ + + | +
${r?.data?.output || 'No output'}`);
+ };
+ window.adminUnban = async () => {
+ const ip = document.getElementById('fw-unban')?.value;
+ if (!ip) return;
+ Nova.toast(`Unbanning ${ip}…`,'info');
+ // Unban from all jails
+ for (const jail of ['sshd','novacpx-user','novacpx-admin','novacpx-reseller','novacpx-webmail']) {
+ await Nova.api('system','service',{method:'POST',body:{service:`fail2ban-client set ${jail} unbanip`,command:ip}}).catch(()=>{});
+ }
+ Nova.toast('Unban commands sent','success');
+ };
+
+ // ── MySQL/DB Manager ───────────────────────────────────────────────────────
+ async function mysqlManager() {
+ const res = await Nova.api('databases','list',{params:{account_id:0}});
+ const dbs = res?.data || [];
+ return `
+| Database | User | Type | Account | Size | Actions |
|---|---|---|---|---|---|
| ${d.db_name} | +${d.db_user} | +${Nova.badge(d.db_type,'default')} | +${d.username||'—'} | +${d.size||'—'} | ++ |
${r?.data?.output || 'Queue is empty'}`);
+ };
+
+ // ── FTP Server ────────────────────────────────────────────────────────────
+ async function ftpServer() {
+ const r = await Nova.api('system','stats');
+ const ftpStatus = r?.data?.services?.proftpd || 'unknown';
+ return `
+ProFTPD uses virtual users stored in /etc/proftpd/novacpx-users.passwd
FTP connections use SFTP on port 22 or passive FTP on ports 20/21.
+Per-account FTP management is available in each account's FTP page.
+| Account | Domain | Actions |
|---|---|---|
| ${a.username} | +${a.domain} | ++ + | +