i18n (Phase C batch 2): radius-settings — form & tab (cards, isolir, ip-pool, autogen, script) ID/EN + fix domain sky.id->openisp.id

This commit is contained in:
oxpoe committed 2026-10-09 07:06:18 +07:00
1 parent 8b3fc70c36
commit 136778aa0a
3 files changed
+226 -76

No files matched your search

+75
View File
@@ -1578,6 +1578,81 @@
"select_vendor": "Select Vendor", "select_vendor": "Select Vendor",
"hint_rescan": "Click \"Rescan\" to find unconfigured ONUs", "hint_rescan": "Click \"Rescan\" to find unconfigured ONUs",
"hint_reload": "Click \"Reload / Scan\" to monitor configured ONU status via SNMP" "hint_reload": "Click \"Reload / Scan\" to monitor configured ONU status via SNMP"
},
"rds": {
"card_status": "RADIUS Server Status",
"card_online": "RADIUS Users Online",
"card_online_sub": "Currently Connected Active Sessions",
"card_nas_sub": "Registered NAS Routers on Server",
"card_traffic": "RADIUS Traffic Today",
"card_log_today": "Accounting Logs Today",
"tab_sessions": "Active RADIUS Sessions",
"tab_settings": "RADIUS Settings",
"tab_nas": "NAS Router List",
"tab_log": "Accounting Log",
"svc_title": "RADIUS Server Service",
"svc_status": "RADIUS Service Status",
"opt_active_bg": "Active (Running Background UDP Service)",
"opt_inactive": "Inactive (Disabled)",
"desc_listen": "Listens for authentication & accounting requests from MikroTik NAS routers.",
"secret": "Global Shared Secret RADIUS",
"secret_desc": "Default secret used when the NAS IP is not specifically registered.",
"ports_title": "UDP Network Ports",
"port_auth": "Port Auth (UDP)",
"port_acct": "Port Acct (UDP)",
"limit_title": "Speed & Active Session Limits",
"simuse": "Limit Concurrent Active Sessions (Simultaneous-Use)",
"opt_simuse_on": "Active - Limit 1 Account to 1 Online Session (Reject Multiple Logins)",
"opt_simuse_off": "Inactive - Allow Multi-Login",
"simuse_desc": "Prevents one account from being used on many devices at once.",
"rate_default": "Default Rate Limit (Speed Fallback)",
"ph_rate": "Example: 5M/10M",
"rate_desc": "Used when the user/customer is not bound to a specific Internet Package. (Format: <code>Upload/Download</code>).",
"isolir_title": "RADIUS Isolir & Suspended Policy",
"isolir_action": "Isolated Customer Action",
"opt_isolir_pool": "Access-Accept with Isolir Dynamic IP Pool (Recommended)",
"opt_isolir_reject": "Access-Reject (Connection Fully Rejected)",
"isolir_pool_alloc": "Isolir IP Pool Allocation by RADIUS Server",
"opt_isolir_pool_on": "Active - RADIUS allocates a dedicated Isolir IP automatically",
"opt_isolir_pool_off": "Inactive - Only send Mikrotik-Group / Framed-Pool",
"isolir_pool_desc": "Isolated customers get a dedicated IP from the RADIUS isolir subnet without needing a user/pool on MikroTik.",
"isolir_start": "Isolir IP Pool Range (Start)",
"isolir_end": "Isolir IP Pool Range (End)",
"isolir_rate": "Isolated Customer Speed Limit (Rate-Limit)",
"ph_isolir_rate": "Example: 512k/512k or 1M/1M",
"isolir_rate_desc": "Format: <code>Upload/Download</code> (e.g.: 512k/512k, 1M/1M, 256k/512k). Sent directly to MikroTik when a customer is isolated.",
"isolir_pool_name": "RADIUS Isolir Pool / Group Name (Attribute)",
"isolir_pool_name_desc": "Extra Mikrotik-Group / Framed-Pool attribute for isolated customers.",
"ipool_title": "Automatic RADIUS IP Pool Allocation",
"ipool_alloc": "Dynamic IP Allocation by RADIUS Server",
"opt_ipool_on": "Active - RADIUS hands out IPs automatically from the IP Pool range (Recommended)",
"opt_ipool_off": "Inactive - Use Dynamic Pool from MikroTik (Framed-Pool)",
"ipool_desc": "If enabled, RADIUS automatically assigns dynamic IPs to customers without static IPs, independent of the local MikroTik pool.",
"ipool_start": "Normal IP Pool Range (Start)",
"ipool_end": "Normal IP Pool Range (End)",
"framed_pool": "Default Framed Pool Name (Fallback)",
"autogen_title": "Auto-Generate PPPoE Account (New Customer)",
"autogen_hint": "Used when an admin <b>approves a registrant</b> or clicks <b>Generate PPPoE Account</b>. Applies to both MikroTik and RADIUS modes.",
"autogen_label": "Automatically create PPPoE account",
"opt_yes": "Yes (automatic)",
"opt_no_manual": "No (manual)",
"pattern": "Username Pattern",
"opt_cust_code": "Customer ID (ISP-xxxxx)",
"default_pass": "Default Password",
"profile_title": "MikroTik Profile Mode (RADIUS)",
"profile_hint": "If <b>Yes</b>: RADIUS only authenticates & sends <b>Mikrotik-Group</b> (package name) — <b>rate-limit & IP are taken from the PPP profile on MikroTik</b> (RADIUS sends no Rate-Limit or IP attributes). Make sure the MikroTik profile name = package name.",
"profile_use": "Use Profile &amp; IP from MikroTik",
"opt_profile_off": "No (RADIUS sets rate-limit &amp; IP)",
"opt_profile_on": "Yes (take from MikroTik PPP profile)",
"script_title": "Automatic MikroTik Setup Script (RADIUS & Isolir)",
"billing_ip": "Billing Server IP:",
"copy_script": "Copy MikroTik Script",
"ufw_title": "1. Linux Server Firewall Command (UFW)",
"ufw_desc": "Run this command in the Linux server terminal (VPS / Production) so the router can reach the server:",
"mt_title": "2. RADIUS & Isolir Integration Script on MikroTik (RouterOS Terminal)",
"mt_desc": "Copy and paste the entire script below into the <strong>MikroTik Terminal</strong> (server IP is auto-filled from the field above):",
"save": "Save RADIUS Configuration",
"username_hint": "Username = pattern + @ + domain. Example: <span class=\"mono\">budi_santoso@openisp.id</span>"
} }
}, },
"tech": { "tech": {
+75
View File
@@ -1579,6 +1579,81 @@
"select_vendor": "Pilih Vendor", "select_vendor": "Pilih Vendor",
"hint_rescan": "Klik \"Scan Ulang\" untuk mencari ONU yang belum terkonfigurasi", "hint_rescan": "Klik \"Scan Ulang\" untuk mencari ONU yang belum terkonfigurasi",
"hint_reload": "Klik \"Muat Ulang / Scan\" untuk memantau status ONU terkonfigurasi via SNMP" "hint_reload": "Klik \"Muat Ulang / Scan\" untuk memantau status ONU terkonfigurasi via SNMP"
},
"rds": {
"card_status": "Status RADIUS Server",
"card_online": "User RADIUS Online",
"card_online_sub": "Sesi Aktif Terhubung Saat Ini",
"card_nas_sub": "Router NAS Terdaftar di Server",
"card_traffic": "Trafik RADIUS Hari Ini",
"card_log_today": "Log Accounting Hari Ini",
"tab_sessions": "Sesi Active RADIUS",
"tab_settings": "Pengaturan RADIUS",
"tab_nas": "Daftar NAS Router",
"tab_log": "Log Accounting",
"svc_title": "Layanan RADIUS Server",
"svc_status": "Status Service RADIUS",
"opt_active_bg": "Aktif (Running Background UDP Service)",
"opt_inactive": "Non-Aktif (Disabled)",
"desc_listen": "Mendengarkan request autentikasi & accounting dari Router NAS MikroTik.",
"secret": "Global Shared Secret RADIUS",
"secret_desc": "Secret default yang digunakan jika IP NAS tidak didaftarkan secara khusus.",
"ports_title": "Port Jaringan UDP",
"port_auth": "Port Auth (UDP)",
"port_acct": "Port Acct (UDP)",
"limit_title": "Limitasi Kecepatan & Sesi Aktif",
"simuse": "Pembatasan Sesi Aktif Ganda (Simultaneous-Use)",
"opt_simuse_on": "Aktif - Batasi 1 Akun 1 Sesi Online (Rejek Login Ganda)",
"opt_simuse_off": "Non-Aktif - Bebas Multi-Login",
"simuse_desc": "Mencegah 1 akun dipakai secara bersamaan di banyak perangkat.",
"rate_default": "Default Rate Limit (Fallback Kecepatan)",
"ph_rate": "Contoh: 5M/10M",
"rate_desc": "Digunakan jika pengguna/pelanggan tidak terikat pada Paket Internet khusus. (Format: <code>Upload/Download</code>).",
"isolir_title": "Isolir & Suspended Policy RADIUS",
"isolir_action": "Aksi Pelanggan Terisolir",
"opt_isolir_pool": "Access-Accept dengan Dynamic IP Pool Isolir (Rekomendasi)",
"opt_isolir_reject": "Access-Reject (Koneksi Ditolak Total)",
"isolir_pool_alloc": "Alokasi IP Pool Isolir oleh RADIUS Server",
"opt_isolir_pool_on": "Aktif - RADIUS Alokasikan IP Isolir Khusus Secara Otomatis",
"opt_isolir_pool_off": "Non-Aktif - Hanya Kirim Mikrotik-Group / Framed-Pool",
"isolir_pool_desc": "Pelanggan terisolir akan mendapatkan IP khusus dari subnet isolir RADIUS tanpa perlu user/pool di MikroTik.",
"isolir_start": "Rentang IP Pool Isolir (Awal)",
"isolir_end": "Rentang IP Pool Isolir (Akhir)",
"isolir_rate": "Kecepatan Limit Pelanggan Terisolir (Rate-Limit)",
"ph_isolir_rate": "Contoh: 512k/512k atau 1M/1M",
"isolir_rate_desc": "Format: <code>Upload/Download</code> (misal: 512k/512k, 1M/1M, 256k/512k). Dikirimkan langsung ke MikroTik saat pelanggan terisolir.",
"isolir_pool_name": "Nama Pool / Group Isolir RADIUS (Attribute)",
"isolir_pool_name_desc": "Atribut Mikrotik-Group / Framed-Pool tambahan untuk pelanggan terisolir.",
"ipool_title": "Pembagian IP Pool RADIUS Otomatis",
"ipool_alloc": "Alokasi IP Dinamis oleh RADIUS Server",
"opt_ipool_on": "Aktif - RADIUS Bagikan IP Otomatis dari Rentang IP Pool (Rekomendasi)",
"opt_ipool_off": "Non-Aktif - Gunakan Dynamic Pool dari MikroTik (Framed-Pool)",
"ipool_desc": "Jika aktif, RADIUS akan membagikan IP dinamis otomatis ke pelanggan tanpa IP statis sehingga tidak tergantung pada pool lokal MikroTik.",
"ipool_start": "Rentang IP Pool Normal (Awal)",
"ipool_end": "Rentang IP Pool Normal (Akhir)",
"framed_pool": "Nama Framed Pool Default (Fallback)",
"autogen_title": "Auto-Generate Akun PPPoE (Pelanggan Baru)",
"autogen_hint": "Dipakai saat admin <b>menyetujui pendaftar</b> atau menekan <b>Generate Akun PPPoE</b>. Berlaku untuk mode MikroTik maupun RADIUS.",
"autogen_label": "Otomatis buat akun PPPoE",
"opt_yes": "Ya (otomatis)",
"opt_no_manual": "Tidak (isi manual)",
"pattern": "Pola Username",
"opt_cust_code": "ID Pelanggan (ISP-xxxxx)",
"default_pass": "Password Default",
"profile_title": "Mode Profil MikroTik (RADIUS)",
"profile_hint": "Jika <b>Ya</b>: RADIUS hanya mengautentikasi & mengirim <b>Mikrotik-Group</b> (nama paket) — <b>rate-limit & IP diambil dari profil PPP di MikroTik</b> (RADIUS tidak mengirim atribut Rate-Limit maupun IP). Pastikan nama profil di MikroTik = nama paket.",
"profile_use": "Gunakan Profil &amp; IP dari MikroTik",
"opt_profile_off": "Tidak (RADIUS atur rate-limit &amp; IP)",
"opt_profile_on": "Ya (ambil dari profil PPP MikroTik)",
"script_title": "Script Setup Otomatis MikroTik (RADIUS & Isolir)",
"billing_ip": "IP Server Billing:",
"copy_script": "Salin Script MikroTik",
"ufw_title": "1. Perintah Firewall Linux Server (UFW)",
"ufw_desc": "Jalankan perintah ini di terminal server Linux (VPS / Server Produksi) agar router dapat menghubungi server:",
"mt_title": "2. Script Integrasi RADIUS & Isolir di MikroTik (RouterOS Terminal)",
"mt_desc": "Copy dan pastekan seluruh script di bawah ini ke <strong>Terminal MikroTik</strong> (IP server otomatis terisi dari IP di atas):",
"save": "Simpan Konfigurasi RADIUS",
"username_hint": "Username = pola + @ + domain. Contoh: <span class=\"mono\">budi_santoso@openisp.id</span>"
} }
}, },
"tech": { "tech": {
+76 -76
View File
@@ -110,7 +110,7 @@
<div class="sc p"> <div class="sc p">
<i class="bi bi-broadcast sc-icon"></i> <i class="bi bi-broadcast sc-icon"></i>
<div class="sc-label" style="display:flex;align-items:center;justify-content:space-between;gap:6px;"> <div class="sc-label" style="display:flex;align-items:center;justify-content:space-between;gap:6px;">
<span>Status RADIUS Server</span> <span><%= t('admin.rds.card_status','Status RADIUS Server') %></span>
<form action="/admin/radius/restart" method="POST" style="margin:0;"> <form action="/admin/radius/restart" method="POST" style="margin:0;">
<button type="submit" class="btn btn-w btn-sm" style="font-size:10px;padding:2px 8px;height:auto;" title="Restart Service UDP RADIUS (1812/1813)"> <button type="submit" class="btn btn-w btn-sm" style="font-size:10px;padding:2px 8px;height:auto;" title="Restart Service UDP RADIUS (1812/1813)">
<i class="bi bi-arrow-clockwise"></i> Restart <i class="bi bi-arrow-clockwise"></i> Restart
@@ -129,39 +129,39 @@
<div class="sc s"> <div class="sc s">
<i class="bi bi-wifi sc-icon"></i> <i class="bi bi-wifi sc-icon"></i>
<div class="sc-label">User RADIUS Online</div> <div class="sc-label"><%= t('admin.rds.card_online','User RADIUS Online') %></div>
<div class="sc-val"><%= onlineSessions.length %></div> <div class="sc-val"><%= onlineSessions.length %></div>
<div class="sc-sub">Sesi Aktif Terhubung Saat Ini</div> <div class="sc-sub"><%= t('admin.rds.card_online_sub','Sesi Aktif Terhubung Saat Ini') %></div>
</div> </div>
<div class="sc i"> <div class="sc i">
<i class="bi bi-router sc-icon"></i> <i class="bi bi-router sc-icon"></i>
<div class="sc-label">NAS Router Client</div> <div class="sc-label">NAS Router Client</div>
<div class="sc-val"><%= nasList.length %></div> <div class="sc-val"><%= nasList.length %></div>
<div class="sc-sub">Router NAS Terdaftar di Server</div> <div class="sc-sub"><%= t('admin.rds.card_nas_sub','Router NAS Terdaftar di Server') %></div>
</div> </div>
<div class="sc w"> <div class="sc w">
<i class="bi bi-activity sc-icon"></i> <i class="bi bi-activity sc-icon"></i>
<div class="sc-label">Trafik RADIUS Hari Ini</div> <div class="sc-label"><%= t('admin.rds.card_traffic','Trafik RADIUS Hari Ini') %></div>
<div class="sc-val"><%= typeof todayTrafficMB !== 'undefined' ? todayTrafficMB : '0.0' %><span style="font-size:14px;"> MB</span></div> <div class="sc-val"><%= typeof todayTrafficMB !== 'undefined' ? todayTrafficMB : '0.0' %><span style="font-size:14px;"> MB</span></div>
<div class="sc-sub"><%= typeof todayEvents !== 'undefined' ? todayEvents : 0 %> Log Accounting Hari Ini</div> <div class="sc-sub"><%= typeof todayEvents !== 'undefined' ? todayEvents : 0 %> <%= t('admin.rds.card_log_today','Log Accounting Hari Ini') %></div>
</div> </div>
</div> </div>
<!-- TABS NAVIGATION --> <!-- TABS NAVIGATION -->
<div class="mtabs mb16"> <div class="mtabs mb16">
<button type="button" class="mtab active" id="tab-btn-online" onclick="switchTab('online')"> <button type="button" class="mtab active" id="tab-btn-online" onclick="switchTab('online')">
<i class="bi bi-wifi"></i> Sesi Active RADIUS (<%= onlineSessions.length %>) <i class="bi bi-wifi"></i> <%= t('admin.rds.tab_sessions','Sesi Active RADIUS') %> (<%= onlineSessions.length %>)
</button> </button>
<button type="button" class="mtab" id="tab-btn-settings" onclick="switchTab('settings')"> <button type="button" class="mtab" id="tab-btn-settings" onclick="switchTab('settings')">
<i class="bi bi-sliders"></i> Pengaturan RADIUS <i class="bi bi-sliders"></i> <%= t('admin.rds.tab_settings','Pengaturan RADIUS') %>
</button> </button>
<button type="button" class="mtab" id="tab-btn-nas" onclick="switchTab('nas')"> <button type="button" class="mtab" id="tab-btn-nas" onclick="switchTab('nas')">
<i class="bi bi-router"></i> Daftar NAS Router (<%= nasList.length %>) <i class="bi bi-router"></i> <%= t('admin.rds.tab_nas','Daftar NAS Router') %> (<%= nasList.length %>)
</button> </button>
<button type="button" class="mtab" id="tab-btn-accounting" onclick="switchTab('accounting')"> <button type="button" class="mtab" id="tab-btn-accounting" onclick="switchTab('accounting')">
<i class="bi bi-journal-text"></i> Log Accounting <i class="bi bi-journal-text"></i> <%= t('admin.rds.tab_log','Log Accounting') %>
</button> </button>
</div> </div>
@@ -173,25 +173,25 @@
<!-- Card 1: Core Service Settings --> <!-- Card 1: Core Service Settings -->
<div class="card mb16"> <div class="card mb16">
<div class="card-hd"> <div class="card-hd">
<h6><i class="bi bi-cpu"></i> Layanan RADIUS Server</h6> <h6><i class="bi bi-cpu"></i> <%= t('admin.rds.svc_title','Layanan RADIUS Server') %></h6>
</div> </div>
<div class="card-bd"> <div class="card-bd">
<div class="fg"> <div class="fg">
<label class="fl">Status Service RADIUS</label> <label class="fl"><%= t('admin.rds.svc_status','Status Service RADIUS') %></label>
<select name="radius_enabled" class="fs"> <select name="radius_enabled" class="fs">
<option value="1" <%= radiusStatus.enabled ? 'selected' : '' %>>Aktif (Running Background UDP Service)</option> <option value="1" <%= radiusStatus.enabled ? 'selected' : '' %>><%= t('admin.rds.opt_active_bg','Aktif (Running Background UDP Service)') %></option>
<option value="0" <%= !radiusStatus.enabled ? 'selected' : '' %>>Non-Aktif (Disabled)</option> <option value="0" <%= !radiusStatus.enabled ? 'selected' : '' %>><%= t('admin.rds.opt_inactive','Non-Aktif (Disabled)') %></option>
</select> </select>
<small class="text-muted" style="font-size:11px;display:block;margin-top:4px;"> <small class="text-muted" style="font-size:11px;display:block;margin-top:4px;">
Mendengarkan request autentikasi & accounting dari Router NAS MikroTik. <%= t('admin.rds.desc_listen','Mendengarkan request autentikasi & accounting dari Router NAS MikroTik.') %>
</small> </small>
</div> </div>
<div class="fg"> <div class="fg">
<label class="fl">Global Shared Secret RADIUS</label> <label class="fl"><%= t('admin.rds.secret','Global Shared Secret RADIUS') %></label>
<input type="text" name="radius_secret" class="fc" value="<%= radiusStatus.secret %>" required> <input type="text" name="radius_secret" class="fc" value="<%= radiusStatus.secret %>" required>
<small class="text-muted" style="font-size:11px;display:block;margin-top:4px;"> <small class="text-muted" style="font-size:11px;display:block;margin-top:4px;">
Secret default yang digunakan jika IP NAS tidak didaftarkan secara khusus. <%= t('admin.rds.secret_desc','Secret default yang digunakan jika IP NAS tidak didaftarkan secara khusus.') %>
</small> </small>
</div> </div>
</div> </div>
@@ -200,18 +200,18 @@
<!-- Card 2: Port UDP & Protocol --> <!-- Card 2: Port UDP & Protocol -->
<div class="card mb16"> <div class="card mb16">
<div class="card-hd"> <div class="card-hd">
<h6><i class="bi bi-ethernet"></i> Port Jaringan UDP</h6> <h6><i class="bi bi-ethernet"></i> <%= t('admin.rds.ports_title','Port Jaringan UDP') %></h6>
</div> </div>
<div class="card-bd"> <div class="card-bd">
<div class="form-row"> <div class="form-row">
<div class="fg"> <div class="fg">
<label class="fl">Port Auth (UDP)</label> <label class="fl"><%= t('admin.rds.port_auth','Port Auth (UDP)') %></label>
<input type="number" name="radius_auth_port" class="fc" value="<%= radiusStatus.authPort %>" required> <input type="number" name="radius_auth_port" class="fc" value="<%= radiusStatus.authPort %>" required>
<small class="text-muted" style="font-size:11px;display:block;margin-top:4px;">Default: 1812</small> <small class="text-muted" style="font-size:11px;display:block;margin-top:4px;">Default: 1812</small>
</div> </div>
<div class="fg"> <div class="fg">
<label class="fl">Port Acct (UDP)</label> <label class="fl"><%= t('admin.rds.port_acct','Port Acct (UDP)') %></label>
<input type="number" name="radius_acct_port" class="fc" value="<%= radiusStatus.acctPort %>" required> <input type="number" name="radius_acct_port" class="fc" value="<%= radiusStatus.acctPort %>" required>
<small class="text-muted" style="font-size:11px;display:block;margin-top:4px;">Default: 1813</small> <small class="text-muted" style="font-size:11px;display:block;margin-top:4px;">Default: 1813</small>
</div> </div>
@@ -222,25 +222,25 @@
<!-- Card 3: Limitasi Koneksi & Sesi --> <!-- Card 3: Limitasi Koneksi & Sesi -->
<div class="card mb16"> <div class="card mb16">
<div class="card-hd"> <div class="card-hd">
<h6><i class="bi bi-speedometer2"></i> Limitasi Kecepatan & Sesi Aktif</h6> <h6><i class="bi bi-speedometer2"></i> <%= t('admin.rds.limit_title','Limitasi Kecepatan & Sesi Aktif') %></h6>
</div> </div>
<div class="card-bd"> <div class="card-bd">
<div class="fg"> <div class="fg">
<label class="fl">Pembatasan Sesi Aktif Ganda (Simultaneous-Use)</label> <label class="fl"><%= t('admin.rds.simuse','Pembatasan Sesi Aktif Ganda (Simultaneous-Use)') %></label>
<select name="radius_limit_simultaneous" class="fs"> <select name="radius_limit_simultaneous" class="fs">
<option value="1" <%= (typeof radiusStatus.limitSimultaneous === 'undefined' || radiusStatus.limitSimultaneous) ? 'selected' : '' %>>Aktif - Batasi 1 Akun 1 Sesi Online (Rejek Login Ganda)</option> <option value="1" <%= (typeof radiusStatus.limitSimultaneous === 'undefined' || radiusStatus.limitSimultaneous) ? 'selected' : '' %>><%= t('admin.rds.opt_simuse_on','Aktif - Batasi 1 Akun 1 Sesi Online (Rejek Login Ganda)') %></option>
<option value="0" <%= (typeof radiusStatus.limitSimultaneous !== 'undefined' && !radiusStatus.limitSimultaneous) ? 'selected' : '' %>>Non-Aktif - Bebas Multi-Login</option> <option value="0" <%= (typeof radiusStatus.limitSimultaneous !== 'undefined' && !radiusStatus.limitSimultaneous) ? 'selected' : '' %>><%= t('admin.rds.opt_simuse_off','Non-Aktif - Bebas Multi-Login') %></option>
</select> </select>
<small class="text-muted" style="font-size:11px;display:block;margin-top:4px;"> <small class="text-muted" style="font-size:11px;display:block;margin-top:4px;">
Mencegah 1 akun dipakai secara bersamaan di banyak perangkat. <%= t('admin.rds.simuse_desc','Mencegah 1 akun dipakai secara bersamaan di banyak perangkat.') %>
</small> </small>
</div> </div>
<div class="fg"> <div class="fg">
<label class="fl">Default Rate Limit (Fallback Kecepatan)</label> <label class="fl"><%= t('admin.rds.rate_default','Default Rate Limit (Fallback Kecepatan)') %></label>
<input type="text" name="radius_default_rate_limit" class="fc" value="<%= typeof radiusStatus.defaultRateLimit !== 'undefined' ? radiusStatus.defaultRateLimit : '5M/10M' %>" placeholder="Contoh: 5M/10M"> <input type="text" name="radius_default_rate_limit" class="fc" value="<%= typeof radiusStatus.defaultRateLimit !== 'undefined' ? radiusStatus.defaultRateLimit : '5M/10M' %>" placeholder="<%= t('admin.rds.ph_rate','Contoh: 5M/10M') %>">
<small class="text-muted" style="font-size:11px;display:block;margin-top:4px;"> <small class="text-muted" style="font-size:11px;display:block;margin-top:4px;">
Digunakan jika pengguna/pelanggan tidak terikat pada Paket Internet khusus. (Format: <code>Upload/Download</code>). <%- t('admin.rds.rate_desc','Digunakan jika pengguna/pelanggan tidak terikat pada Paket Internet khusus. (Format: <code>Upload/Download</code>).') %>
</small> </small>
</div> </div>
</div> </div>
@@ -249,47 +249,47 @@
<!-- Card 3: Isolir Settings --> <!-- Card 3: Isolir Settings -->
<div class="card mb16"> <div class="card mb16">
<div class="card-hd"> <div class="card-hd">
<h6><i class="bi bi-shield-slash"></i> Isolir & Suspended Policy RADIUS</h6> <h6><i class="bi bi-shield-slash"></i> <%= t('admin.rds.isolir_title','Isolir & Suspended Policy RADIUS') %></h6>
</div> </div>
<div class="card-bd"> <div class="card-bd">
<div class="fg"> <div class="fg">
<label class="fl">Aksi Pelanggan Terisolir</label> <label class="fl"><%= t('admin.rds.isolir_action','Aksi Pelanggan Terisolir') %></label>
<select name="radius_isolir_action" class="fs"> <select name="radius_isolir_action" class="fs">
<option value="pool" <%= radiusStatus.isolirAction === 'pool' ? 'selected' : '' %>>Access-Accept dengan Dynamic IP Pool Isolir (Rekomendasi)</option> <option value="pool" <%= radiusStatus.isolirAction === 'pool' ? 'selected' : '' %>><%= t('admin.rds.opt_isolir_pool','Access-Accept dengan Dynamic IP Pool Isolir (Rekomendasi)') %></option>
<option value="reject" <%= radiusStatus.isolirAction === 'reject' ? 'selected' : '' %>>Access-Reject (Koneksi Ditolak Total)</option> <option value="reject" <%= radiusStatus.isolirAction === 'reject' ? 'selected' : '' %>><%= t('admin.rds.opt_isolir_reject','Access-Reject (Koneksi Ditolak Total)') %></option>
</select> </select>
</div> </div>
<div class="fg"> <div class="fg">
<label class="fl">Alokasi IP Pool Isolir oleh RADIUS Server</label> <label class="fl"><%= t('admin.rds.isolir_pool_alloc','Alokasi IP Pool Isolir oleh RADIUS Server') %></label>
<select name="radius_isolir_ip_pool_enabled" class="fs"> <select name="radius_isolir_ip_pool_enabled" class="fs">
<option value="1" <%= (typeof radiusStatus.isolirIpPoolEnabled === 'undefined' || radiusStatus.isolirIpPoolEnabled) ? 'selected' : '' %>>Aktif - RADIUS Alokasikan IP Isolir Khusus Secara Otomatis</option> <option value="1" <%= (typeof radiusStatus.isolirIpPoolEnabled === 'undefined' || radiusStatus.isolirIpPoolEnabled) ? 'selected' : '' %>><%= t('admin.rds.opt_isolir_pool_on','Aktif - RADIUS Alokasikan IP Isolir Khusus Secara Otomatis') %></option>
<option value="0" <%= (typeof radiusStatus.isolirIpPoolEnabled !== 'undefined' && !radiusStatus.isolirIpPoolEnabled) ? 'selected' : '' %>>Non-Aktif - Hanya Kirim Mikrotik-Group / Framed-Pool</option> <option value="0" <%= (typeof radiusStatus.isolirIpPoolEnabled !== 'undefined' && !radiusStatus.isolirIpPoolEnabled) ? 'selected' : '' %>><%= t('admin.rds.opt_isolir_pool_off','Non-Aktif - Hanya Kirim Mikrotik-Group / Framed-Pool') %></option>
</select> </select>
<small class="text-muted" style="font-size:11px;display:block;margin-top:4px;">Pelanggan terisolir akan mendapatkan IP khusus dari subnet isolir RADIUS tanpa perlu user/pool di MikroTik.</small> <small class="text-muted" style="font-size:11px;display:block;margin-top:4px;"><%= t('admin.rds.isolir_pool_desc','Pelanggan terisolir akan mendapatkan IP khusus dari subnet isolir RADIUS tanpa perlu user/pool di MikroTik.') %></small>
</div> </div>
<div class="form-row"> <div class="form-row">
<div class="fg"> <div class="fg">
<label class="fl">Rentang IP Pool Isolir (Awal)</label> <label class="fl"><%= t('admin.rds.isolir_start','Rentang IP Pool Isolir (Awal)') %></label>
<input type="text" name="radius_isolir_ip_pool_start" class="fc" value="<%= typeof radiusStatus.isolirIpPoolStart !== 'undefined' ? radiusStatus.isolirIpPoolStart : '10.10.99.2' %>" placeholder="10.10.99.2" required> <input type="text" name="radius_isolir_ip_pool_start" class="fc" value="<%= typeof radiusStatus.isolirIpPoolStart !== 'undefined' ? radiusStatus.isolirIpPoolStart : '10.10.99.2' %>" placeholder="10.10.99.2" required>
</div> </div>
<div class="fg"> <div class="fg">
<label class="fl">Rentang IP Pool Isolir (Akhir)</label> <label class="fl"><%= t('admin.rds.isolir_end','Rentang IP Pool Isolir (Akhir)') %></label>
<input type="text" name="radius_isolir_ip_pool_end" class="fc" value="<%= typeof radiusStatus.isolirIpPoolEnd !== 'undefined' ? radiusStatus.isolirIpPoolEnd : '10.10.99.254' %>" placeholder="10.10.99.254" required> <input type="text" name="radius_isolir_ip_pool_end" class="fc" value="<%= typeof radiusStatus.isolirIpPoolEnd !== 'undefined' ? radiusStatus.isolirIpPoolEnd : '10.10.99.254' %>" placeholder="10.10.99.254" required>
</div> </div>
</div> </div>
<div class="fg"> <div class="fg">
<label class="fl">Kecepatan Limit Pelanggan Terisolir (Rate-Limit)</label> <label class="fl"><%= t('admin.rds.isolir_rate','Kecepatan Limit Pelanggan Terisolir (Rate-Limit)') %></label>
<input type="text" name="radius_isolir_rate_limit" class="fc" value="<%= typeof radiusStatus.isolirRateLimit !== 'undefined' ? radiusStatus.isolirRateLimit : '512k/512k' %>" placeholder="Contoh: 512k/512k atau 1M/1M" required> <input type="text" name="radius_isolir_rate_limit" class="fc" value="<%= typeof radiusStatus.isolirRateLimit !== 'undefined' ? radiusStatus.isolirRateLimit : '512k/512k' %>" placeholder="<%= t('admin.rds.ph_isolir_rate','Contoh: 512k/512k atau 1M/1M') %>" required>
<small class="text-muted" style="font-size:11px;display:block;margin-top:4px;">Format: <code>Upload/Download</code> (misal: 512k/512k, 1M/1M, 256k/512k). Dikirimkan langsung ke MikroTik saat pelanggan terisolir.</small> <small class="text-muted" style="font-size:11px;display:block;margin-top:4px;"><%- t('admin.rds.isolir_rate_desc','Format: <code>Upload/Download</code> (misal: 512k/512k, 1M/1M, 256k/512k). Dikirimkan langsung ke MikroTik saat pelanggan terisolir.') %></small>
</div> </div>
<div class="fg"> <div class="fg">
<label class="fl">Nama Pool / Group Isolir RADIUS (Attribute)</label> <label class="fl"><%= t('admin.rds.isolir_pool_name','Nama Pool / Group Isolir RADIUS (Attribute)') %></label>
<input type="text" name="radius_isolir_pool" class="fc" value="<%= radiusStatus.isolirPool %>" required> <input type="text" name="radius_isolir_pool" class="fc" value="<%= radiusStatus.isolirPool %>" required>
<small class="text-muted" style="font-size:11px;display:block;margin-top:4px;">Atribut Mikrotik-Group / Framed-Pool tambahan untuk pelanggan terisolir.</small> <small class="text-muted" style="font-size:11px;display:block;margin-top:4px;"><%= t('admin.rds.isolir_pool_name_desc','Atribut Mikrotik-Group / Framed-Pool tambahan untuk pelanggan terisolir.') %></small>
</div> </div>
</div> </div>
</div> </div>
@@ -297,33 +297,33 @@
<!-- Card 4: Dynamic IP Pool RADIUS --> <!-- Card 4: Dynamic IP Pool RADIUS -->
<div class="card mb16"> <div class="card mb16">
<div class="card-hd"> <div class="card-hd">
<h6><i class="bi bi-diagram-3-fill"></i> Pembagian IP Pool RADIUS Otomatis</h6> <h6><i class="bi bi-diagram-3-fill"></i> <%= t('admin.rds.ipool_title','Pembagian IP Pool RADIUS Otomatis') %></h6>
</div> </div>
<div class="card-bd"> <div class="card-bd">
<div class="fg"> <div class="fg">
<label class="fl">Alokasi IP Dinamis oleh RADIUS Server</label> <label class="fl"><%= t('admin.rds.ipool_alloc','Alokasi IP Dinamis oleh RADIUS Server') %></label>
<select name="radius_ip_pool_enabled" class="fs"> <select name="radius_ip_pool_enabled" class="fs">
<option value="1" <%= (typeof radiusStatus.ipPoolEnabled === 'undefined' || radiusStatus.ipPoolEnabled) ? 'selected' : '' %>>Aktif - RADIUS Bagikan IP Otomatis dari Rentang IP Pool (Rekomendasi)</option> <option value="1" <%= (typeof radiusStatus.ipPoolEnabled === 'undefined' || radiusStatus.ipPoolEnabled) ? 'selected' : '' %>><%= t('admin.rds.opt_ipool_on','Aktif - RADIUS Bagikan IP Otomatis dari Rentang IP Pool (Rekomendasi)') %></option>
<option value="0" <%= (typeof radiusStatus.ipPoolEnabled !== 'undefined' && !radiusStatus.ipPoolEnabled) ? 'selected' : '' %>>Non-Aktif - Gunakan Dynamic Pool dari MikroTik (Framed-Pool)</option> <option value="0" <%= (typeof radiusStatus.ipPoolEnabled !== 'undefined' && !radiusStatus.ipPoolEnabled) ? 'selected' : '' %>><%= t('admin.rds.opt_ipool_off','Non-Aktif - Gunakan Dynamic Pool dari MikroTik (Framed-Pool)') %></option>
</select> </select>
<small class="text-muted" style="font-size:11px;display:block;margin-top:4px;"> <small class="text-muted" style="font-size:11px;display:block;margin-top:4px;">
Jika aktif, RADIUS akan membagikan IP dinamis otomatis ke pelanggan tanpa IP statis sehingga tidak tergantung pada pool lokal MikroTik. <%= t('admin.rds.ipool_desc','Jika aktif, RADIUS akan membagikan IP dinamis otomatis ke pelanggan tanpa IP statis sehingga tidak tergantung pada pool lokal MikroTik.') %>
</small> </small>
</div> </div>
<div class="form-row"> <div class="form-row">
<div class="fg"> <div class="fg">
<label class="fl">Rentang IP Pool Normal (Awal)</label> <label class="fl"><%= t('admin.rds.ipool_start','Rentang IP Pool Normal (Awal)') %></label>
<input type="text" name="radius_ip_pool_start" class="fc" value="<%= typeof radiusStatus.ipPoolStart !== 'undefined' ? radiusStatus.ipPoolStart : '10.10.10.2' %>" placeholder="10.10.10.2" required> <input type="text" name="radius_ip_pool_start" class="fc" value="<%= typeof radiusStatus.ipPoolStart !== 'undefined' ? radiusStatus.ipPoolStart : '10.10.10.2' %>" placeholder="10.10.10.2" required>
</div> </div>
<div class="fg"> <div class="fg">
<label class="fl">Rentang IP Pool Normal (Akhir)</label> <label class="fl"><%= t('admin.rds.ipool_end','Rentang IP Pool Normal (Akhir)') %></label>
<input type="text" name="radius_ip_pool_end" class="fc" value="<%= typeof radiusStatus.ipPoolEnd !== 'undefined' ? radiusStatus.ipPoolEnd : '10.10.10.254' %>" placeholder="10.10.10.254" required> <input type="text" name="radius_ip_pool_end" class="fc" value="<%= typeof radiusStatus.ipPoolEnd !== 'undefined' ? radiusStatus.ipPoolEnd : '10.10.10.254' %>" placeholder="10.10.10.254" required>
</div> </div>
</div> </div>
<div class="fg"> <div class="fg">
<label class="fl">Nama Framed Pool Default (Fallback)</label> <label class="fl"><%= t('admin.rds.framed_pool','Nama Framed Pool Default (Fallback)') %></label>
<input type="text" name="radius_framed_pool" class="fc" value="<%= radiusStatus.framedPool %>" required> <input type="text" name="radius_framed_pool" class="fc" value="<%= radiusStatus.framedPool %>" required>
</div> </div>
</div> </div>
@@ -332,34 +332,34 @@
<!-- Card: Auto-Generate PPPoE --> <!-- Card: Auto-Generate PPPoE -->
<div class="card mb16"> <div class="card mb16">
<div class="card-hd"> <div class="card-hd">
<h6><i class="bi bi-key-fill"></i> Auto-Generate Akun PPPoE (Pelanggan Baru)</h6> <h6><i class="bi bi-key-fill"></i> <%= t('admin.rds.autogen_title','Auto-Generate Akun PPPoE (Pelanggan Baru)') %></h6>
</div> </div>
<div class="card-bd"> <div class="card-bd">
<div class="hint" style="margin-bottom:10px">Dipakai saat admin <b>menyetujui pendaftar</b> atau menekan <b>Generate Akun PPPoE</b>. Berlaku untuk mode MikroTik maupun RADIUS.</div> <div class="hint" style="margin-bottom:10px"><%- t('admin.rds.autogen_hint','Dipakai saat admin <b>menyetujui pendaftar</b> atau menekan <b>Generate Akun PPPoE</b>. Berlaku untuk mode MikroTik maupun RADIUS.') %></div>
<div class="form-row"> <div class="form-row">
<div class="fg"> <div class="fg">
<label class="fl">Otomatis buat akun PPPoE</label> <label class="fl"><%= t('admin.rds.autogen_label','Otomatis buat akun PPPoE') %></label>
<select name="pppoe_auto_generate" class="fs"> <select name="pppoe_auto_generate" class="fs">
<option value="1" <%= (String((typeof settings!=='undefined'&&settings&&settings.pppoe_auto_generate)||'1')==='1')?'selected':'' %>>Ya (otomatis)</option> <option value="1" <%= (String((typeof settings!=='undefined'&&settings&&settings.pppoe_auto_generate)||'1')==='1')?'selected':'' %>><%= t('admin.rds.opt_yes','Ya (otomatis)') %></option>
<option value="0" <%= (String((typeof settings!=='undefined'&&settings&&settings.pppoe_auto_generate)||'1')==='0')?'selected':'' %>>Tidak (isi manual)</option> <option value="0" <%= (String((typeof settings!=='undefined'&&settings&&settings.pppoe_auto_generate)||'1')==='0')?'selected':'' %>><%= t('admin.rds.opt_no_manual','Tidak (isi manual)') %></option>
</select> </select>
</div> </div>
<div class="fg"> <div class="fg">
<label class="fl">Pola Username</label> <label class="fl"><%= t('admin.rds.pattern','Pola Username') %></label>
<select name="pppoe_username_pattern" class="fs"> <select name="pppoe_username_pattern" class="fs">
<option value="name" <%= (String((typeof settings!=='undefined'&&settings&&settings.pppoe_username_pattern)||'name')==='name')?'selected':'' %>><%= t('iso.cust_name','Nama Pelanggan') %></option> <option value="name" <%= (String((typeof settings!=='undefined'&&settings&&settings.pppoe_username_pattern)||'name')==='name')?'selected':'' %>><%= t('iso.cust_name','Nama Pelanggan') %></option>
<option value="customer_code" <%= (String((typeof settings!=='undefined'&&settings&&settings.pppoe_username_pattern)||'name')==='customer_code')?'selected':'' %>>ID Pelanggan (SKY-xxxxx)</option> <option value="customer_code" <%= (String((typeof settings!=='undefined'&&settings&&settings.pppoe_username_pattern)||'name')==='customer_code')?'selected':'' %>><%= t('admin.rds.opt_cust_code','ID Pelanggan (ISP-xxxxx)') %></option>
</select> </select>
</div> </div>
</div> </div>
<div class="form-row"> <div class="form-row">
<div class="fg"> <div class="fg">
<label class="fl">Domain / Realm</label> <label class="fl">Domain / Realm</label>
<input type="text" name="pppoe_domain" class="fc" value="<%= (typeof settings!=='undefined'&&settings&&settings.pppoe_domain)||'sky.id' %>" placeholder="sky.id"> <input type="text" name="pppoe_domain" class="fc" value="<%= (typeof settings!=='undefined'&&settings&&settings.pppoe_domain)||'openisp.id' %>" placeholder="openisp.id">
<div class="hint">Username = pola + @ + domain. Contoh: <span class="mono">budi_santoso@sky.id</span></div> <div class="hint"><%- t('admin.rds.username_hint','Username = pola + @ + domain. Contoh: <span class="mono">budi_santoso@openisp.id</span>') %></div>
</div> </div>
<div class="fg"> <div class="fg">
<label class="fl">Password Default</label> <label class="fl"><%= t('admin.rds.default_pass','Password Default') %></label>
<input type="text" name="pppoe_default_password" class="fc" value="<%= (typeof settings!=='undefined'&&settings&&settings.pppoe_default_password)||'openisp' %>" placeholder="openisp"> <input type="text" name="pppoe_default_password" class="fc" value="<%= (typeof settings!=='undefined'&&settings&&settings.pppoe_default_password)||'openisp' %>" placeholder="openisp">
</div> </div>
</div> </div>
@@ -368,14 +368,14 @@
<!-- Card: Mode Profil MikroTik --> <!-- Card: Mode Profil MikroTik -->
<div class="card mb16"> <div class="card mb16">
<div class="card-hd"><h6><i class="bi bi-sliders"></i> Mode Profil MikroTik (RADIUS)</h6></div> <div class="card-hd"><h6><i class="bi bi-sliders"></i> <%= t('admin.rds.profile_title','Mode Profil MikroTik (RADIUS)') %></h6></div>
<div class="card-bd"> <div class="card-bd">
<div class="hint" style="margin-bottom:10px">Jika <b>Ya</b>: RADIUS hanya mengautentikasi & mengirim <b>Mikrotik-Group</b> (nama paket) — <b>rate-limit & IP diambil dari profil PPP di MikroTik</b> (RADIUS tidak mengirim atribut Rate-Limit maupun IP). Pastikan nama profil di MikroTik = nama paket.</div> <div class="hint" style="margin-bottom:10px"><%- t('admin.rds.profile_hint','Jika <b>Ya</b>: RADIUS hanya mengautentikasi & mengirim <b>Mikrotik-Group</b> (nama paket) — <b>rate-limit & IP diambil dari profil PPP di MikroTik</b> (RADIUS tidak mengirim atribut Rate-Limit maupun IP). Pastikan nama profil di MikroTik = nama paket.') %></div>
<div class="fg"> <div class="fg">
<label class="fl">Gunakan Profil &amp; IP dari MikroTik</label> <label class="fl"><%- t('admin.rds.profile_use','Gunakan Profil &amp; IP dari MikroTik') %></label>
<select name="radius_use_profile" class="fs"> <select name="radius_use_profile" class="fs">
<option value="0" <%= (String((typeof settings!=='undefined'&&settings&&settings.radius_use_profile)||'0')==='0')?'selected':'' %>>Tidak (RADIUS atur rate-limit &amp; IP)</option> <option value="0" <%= (String((typeof settings!=='undefined'&&settings&&settings.radius_use_profile)||'0')==='0')?'selected':'' %>><%- t('admin.rds.opt_profile_off','Tidak (RADIUS atur rate-limit &amp; IP)') %></option>
<option value="1" <%= (String((typeof settings!=='undefined'&&settings&&settings.radius_use_profile)||'0')==='1')?'selected':'' %>>Ya (ambil dari profil PPP MikroTik)</option> <option value="1" <%= (String((typeof settings!=='undefined'&&settings&&settings.radius_use_profile)||'0')==='1')?'selected':'' %>><%= t('admin.rds.opt_profile_on','Ya (ambil dari profil PPP MikroTik)') %></option>
</select> </select>
</div> </div>
</div> </div>
@@ -384,17 +384,17 @@
<!-- Card 5: Panduan Firewall Linux UFW & Script MikroTik --> <!-- Card 5: Panduan Firewall Linux UFW & Script MikroTik -->
<div class="card mb16"> <div class="card mb16">
<div class="card-hd" style="display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:8px;"> <div class="card-hd" style="display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:8px;">
<h6 style="margin:0;"><i class="bi bi-terminal-fill"></i> Script Setup Otomatis MikroTik (RADIUS & Isolir)</h6> <h6 style="margin:0;"><i class="bi bi-terminal-fill"></i> <%= t('admin.rds.script_title','Script Setup Otomatis MikroTik (RADIUS & Isolir)') %></h6>
<div style="display:flex;align-items:center;gap:8px;"> <div style="display:flex;align-items:center;gap:8px;">
<label style="font-size:12px;margin:0;color:var(--muted);white-space:nowrap;">IP Server Billing:</label> <label style="font-size:12px;margin:0;color:var(--muted);white-space:nowrap;"><%= t('admin.rds.billing_ip','IP Server Billing:') %></label>
<input type="text" id="billing-ip-input" class="fc" value="<%= typeof serverIp !== 'undefined' ? serverIp : '192.168.8.88' %>" oninput="updateScriptIp(this.value)" style="width:140px;height:30px;font-size:12px;padding:3px 8px;" title="Ubah IP server jika router mengakses lewat IP lain/VPS"> <input type="text" id="billing-ip-input" class="fc" value="<%= typeof serverIp !== 'undefined' ? serverIp : '192.168.8.88' %>" oninput="updateScriptIp(this.value)" style="width:140px;height:30px;font-size:12px;padding:3px 8px;" title="Ubah IP server jika router mengakses lewat IP lain/VPS">
<button type="button" class="btn btn-s btn-sm" onclick="copyMikrotikScript()"><i class="bi bi-clipboard-check"></i> Salin Script MikroTik</button> <button type="button" class="btn btn-s btn-sm" onclick="copyMikrotikScript()"><i class="bi bi-clipboard-check"></i> <%= t('admin.rds.copy_script','Salin Script MikroTik') %></button>
</div> </div>
</div> </div>
<div class="card-bd"> <div class="card-bd">
<div class="fg" style="margin-bottom:14px;"> <div class="fg" style="margin-bottom:14px;">
<label class="fl">1. Perintah Firewall Linux Server (UFW)</label> <label class="fl"><%= t('admin.rds.ufw_title','1. Perintah Firewall Linux Server (UFW)') %></label>
<small class="text-muted" style="font-size:11px;display:block;margin-bottom:6px;">Jalankan perintah ini di terminal server Linux (VPS / Server Produksi) agar router dapat menghubungi server:</small> <small class="text-muted" style="font-size:11px;display:block;margin-bottom:6px;"><%= t('admin.rds.ufw_desc','Jalankan perintah ini di terminal server Linux (VPS / Server Produksi) agar router dapat menghubungi server:') %></small>
<div style="background:var(--bg3);padding:10px 12px;border-radius:8px;border:1px solid var(--border);font-family:monospace;font-size:12px;color:var(--info);"> <div style="background:var(--bg3);padding:10px 12px;border-radius:8px;border:1px solid var(--border);font-family:monospace;font-size:12px;color:var(--info);">
sudo ufw allow <%= radiusStatus.authPort %>/udp<br> sudo ufw allow <%= radiusStatus.authPort %>/udp<br>
sudo ufw allow <%= radiusStatus.acctPort %>/udp sudo ufw allow <%= radiusStatus.acctPort %>/udp
@@ -402,8 +402,8 @@
</div> </div>
<div class="fg" style="margin-bottom:0;"> <div class="fg" style="margin-bottom:0;">
<label class="fl">2. Script Integrasi RADIUS & Isolir di MikroTik (RouterOS Terminal)</label> <label class="fl"><%= t('admin.rds.mt_title','2. Script Integrasi RADIUS & Isolir di MikroTik (RouterOS Terminal)') %></label>
<small class="text-muted" style="font-size:11px;display:block;margin-bottom:6px;">Copy dan pastekan seluruh script di bawah ini ke <strong>Terminal MikroTik</strong> (IP server otomatis terisi dari IP di atas):</small> <small class="text-muted" style="font-size:11px;display:block;margin-bottom:6px;"><%- t('admin.rds.mt_desc','Copy dan pastekan seluruh script di bawah ini ke <strong>Terminal MikroTik</strong> (IP server otomatis terisi dari IP di atas):') %></small>
<textarea id="mikrotik-script-area" class="fc" rows="14" style="font-family:monospace;font-size:11px;background:var(--bg3);color:#10b981;line-height:1.4;white-space:pre;" readonly># ========================================================= <textarea id="mikrotik-script-area" class="fc" rows="14" style="font-family:monospace;font-size:11px;background:var(--bg3);color:#10b981;line-height:1.4;white-space:pre;" readonly># =========================================================
# SCRIPT SETUP OTOMATIS RADIUS BILLING & ISOLIR MIKROTIK # SCRIPT SETUP OTOMATIS RADIUS BILLING & ISOLIR MIKROTIK
# ========================================================= # =========================================================
@@ -432,7 +432,7 @@
</div> </div>
<div> <div>
<button type="submit" class="btn btn-p"><i class="bi bi-save"></i> Simpan Konfigurasi RADIUS</button> <button type="submit" class="btn btn-p"><i class="bi bi-save"></i> <%= t('admin.rds.save','Simpan Konfigurasi RADIUS') %></button>
</div> </div>
</form> </form>
</div> </div>
@@ -558,7 +558,7 @@
<input type="hidden" name="username" value="<%= s.username %>"> <input type="hidden" name="username" value="<%= s.username %>">
<input type="hidden" name="session_id" value="<%= s.session_id %>"> <input type="hidden" name="session_id" value="<%= s.session_id %>">
<input type="hidden" name="nas_ip" value="<%= s.nas_ip %>"> <input type="hidden" name="nas_ip" value="<%= s.nas_ip %>">
<button type="submit" class="btn btn-d btn-sm" title="Putuskan Sesi Active RADIUS"> <button type="submit" class="btn btn-d btn-sm" title="Putuskan <%= t('admin.rds.tab_sessions','Sesi Active RADIUS') %>">
<i class="bi bi-power"></i> Putuskan <i class="bi bi-power"></i> Putuskan
</button> </button>
</form> </form>
@@ -581,7 +581,7 @@
<div id="tab-content-accounting" class="tab-pane" style="display:none;"> <div id="tab-content-accounting" class="tab-pane" style="display:none;">
<div class="card mb16"> <div class="card mb16">
<div class="card-hd"> <div class="card-hd">
<h6><i class="bi bi-journal-text"></i> Log Accounting RADIUS (100 Terakhir)</h6> <h6><i class="bi bi-journal-text"></i> <%= t('admin.rds.tab_log','Log Accounting') %> RADIUS (100 Terakhir)</h6>
</div> </div>
<div class="card-bd" style="padding:0;"> <div class="card-bd" style="padding:0;">
<div class="tbl-wrap"> <div class="tbl-wrap">