openstamanager/modules/backups/edit.php

338 lines
12 KiB
PHP
Raw Normal View History

<?php
2020-09-07 15:04:06 +02:00
/*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
2021-01-20 15:08:51 +01:00
* Copyright (C) DevCode s.r.l.
2020-09-07 15:04:06 +02:00
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
include_once __DIR__.'/../../core.php';
2019-02-09 14:44:30 +01:00
$backups = Backup::getList();
2018-09-20 12:05:22 +02:00
2024-03-03 17:52:50 +01:00
// Controllo sul requisito ZIP
if (!extension_loaded('zip')) {
echo "
<div class='alert alert-warning'>
<i class='fa fa-times'></i> ".tr('Estensione zip non supportata').'.
2018-03-22 17:20:33 +01:00
'.tr('Il backup verrà eseguito, ma non in formato ZIP. Sarà quindi scaricabile solo tramite FTP o con copia-incolla').'.
</div>';
}
if (!empty($backup_dir)) {
$message = tr('Il percorso di backup è attualmente in: _PATH_', [
'_PATH_' => '<b>'.slashes($backup_dir).'</b>',
]);
} else {
$message = tr('Sembra che tu non abbia ancora specificato un percorso per il backup').'.';
}
// Controllo sui permessi di scrittura
if (!is_writable($backup_dir) || !is_readable($backup_dir)) {
2018-03-22 17:20:33 +01:00
echo '
<div class="alert alert-danger">
<i class="fa fa-warning"></i> '.$message.'<br>'.tr('La cartella di backup indicata non è utilizzabile dal gestionale a causa di alcuni permessi di scrittura non impostati correttamente').'.
2018-03-22 17:20:33 +01:00
</div>';
return;
2018-03-22 17:20:33 +01:00
}
echo '<p>'.tr('Il backup è molto importante perché permette di creare una copia della propria installazione e relativi dati per poterla poi ripristinare in seguito a errori, cancellazioni accidentali o guasti hardware').'.</p>';
if (string_starts_with($backup_dir, base_dir())) {
2018-03-22 17:20:33 +01:00
echo '
<div class="alert alert-warning">
2023-03-14 16:56:33 +01:00
<i class="fa fa-warning"></i> '.tr('Per motivi di sicurezza si consiglia di modificare il percorso della cartella di backup al di fuori della cartella di OSM, possibilmente in una unità esterna. Puoi modificare il percorso di backup dal tuo file _FILE_', [
'_FILE_' => '<b>config.inc.php</b>',
]).'.
2018-03-22 17:20:33 +01:00
</div>';
}
2019-02-09 14:44:30 +01:00
// Operazioni JavaScript
2018-09-19 17:15:01 +02:00
echo '
<script>
2019-02-09 14:44:30 +01:00
// Ripristino backup
2018-09-19 17:15:01 +02:00
function restore() {
if ($("#blob").val()) {
swal({
title: "'.tr('Avviare la procedura?').'",
type: "warning",
showCancelButton: true,
confirmButtonText: "'.tr('Sì').'"
}).then(function (result) {
$("#restore").submit();
})
} else {
swal({
title: "'.tr('Selezionare un file!').'",
type: "error",
})
}
}
2019-02-09 14:44:30 +01:00
// Creazione backup
2024-03-03 17:52:50 +01:00
function creaBackup(button){
2019-02-09 14:44:30 +01:00
swal({
2024-03-03 17:52:50 +01:00
title: "'.tr('Creare un nuovo backup?').'",
text: "'.tr('Seleziona cosa escludere dal backup:').'",
input: "select",
inputOptions: {
"exclude_attachments": "📎 '.tr('Allegati').'",
"only_database": "🗃️ '.tr('Tutto tranne database').'"
},
inputAttributes: {
title: "'.tr('Seleziona cosa escludere dal backup').'"
},
inputPlaceholder: " '.tr('Non escludere nulla').'",
2019-02-09 14:44:30 +01:00
type: "warning",
showCancelButton: true,
confirmButtonClass: "btn btn-lg btn-success",
confirmButtonText: "'.tr('Crea').'",
2024-03-03 17:52:50 +01:00
}).then(function(result) {
let restore = buttonLoading(button);
$("#main_loading").show();
2024-03-03 17:52:50 +01:00
let selectedOption = result;
$.ajax({
url: globals.rootdir + "/actions.php",
type: "GET",
data: {
id_module: globals.id_module,
op: "backup",
2024-03-03 17:52:50 +01:00
exclude: selectedOption
},
success: function(data) {
$("#main_loading").fadeOut();
buttonRestore(button, restore);
// Ricaricamento della pagina corrente
window.location.reload();
},
error: function() {
swal("'.tr('Errore').'", "'.tr('Errore durante la creazione del backup').'", "error");
renderMessages();
buttonRestore(button, restore);
}
});
}).catch(swal.noop);
2019-02-09 14:44:30 +01:00
}
// Caricamento
2019-05-29 05:19:15 +02:00
function loadSize(number, id){
2019-02-09 14:44:30 +01:00
$("#" + id).html("'.tr('Calcolo in corso').'...");
$.ajax({
url: globals.rootdir + "/actions.php",
type: "GET",
2019-02-09 14:44:30 +01:00
data: {
id_module: globals.id_module,
op: "size",
2019-05-29 05:19:15 +02:00
number: number,
2019-02-09 14:44:30 +01:00
},
success: function(data) {
$("#" + id).html(data);
}
});
}
2018-09-19 17:15:01 +02:00
</script>';
2019-02-09 14:44:30 +01:00
echo '
<div class="row">
<div class="col-md-8">
2023-03-14 16:56:33 +01:00
<div class="alert bg-light-blue-active">
<p>'.$message.'</p><br>
<p>'.tr('Spazio totale occupato dai backup: _SPAZIO_', [
2019-02-09 14:44:30 +01:00
'_SPAZIO_' => '<i id="total_size"></i>',
2023-03-14 16:56:33 +01:00
]).'</p>
<p>'.tr('Numero di backup: _NUM_', [
2019-02-09 14:44:30 +01:00
'_NUM_' => count($backups),
2023-03-14 16:56:33 +01:00
]).'</p>
2019-02-09 14:44:30 +01:00
</div>
</div>
2019-02-09 14:44:30 +01:00
<script>
2021-06-28 12:53:14 +02:00
loadSize('.count($backups).', "total_size");
2019-02-09 14:44:30 +01:00
</script>';
$upload_max_filesize = ini_get('upload_max_filesize');
2018-12-21 16:54:34 +01:00
$max_execution_time = ini_get('max_execution_time');
if (setting('Permetti il ripristino di backup da file esterni')) {
echo '
2018-09-19 16:02:15 +02:00
<div class="col-md-4">
<div class="box box-success">
<div class="box-header with-border">
<h3 class="box-title">
2018-12-21 16:54:34 +01:00
'.tr('Ripristina backup').' <small>(upload_max_filesize: '.$upload_max_filesize.')</small> <small>(max_execution_time: '.$max_execution_time.')</small>
2018-09-19 16:02:15 +02:00
</h3>
</div>
<div class="box-body">
<form action="" method="post" enctype="multipart/form-data" id="restore">
<input type="hidden" name="op" value="restore">
2019-05-29 05:19:15 +02:00
{[ "type": "file", "name": "blob", "required": 1, "accept": ".zip" ]}
2018-09-19 16:02:15 +02:00
2018-09-19 17:15:01 +02:00
<button type="button" class="btn btn-primary pull-right" onclick="restore()">
2018-09-19 16:02:15 +02:00
<i class="fa fa-upload"></i> '.tr('Ripristina').'...
</button>
</form>
</div>
</div>
</div>';
}
echo '
2018-09-19 16:02:15 +02:00
</div>';
2018-09-19 16:02:15 +02:00
// Lettura file di backup
if (file_exists($backup_dir)) {
$backups_zip = [];
$backups_file = [];
2019-05-29 05:19:15 +02:00
foreach ($backups as $key => $backup) {
if (string_ends_with($backup, '.zip')) {
2019-05-29 05:19:15 +02:00
$backups_zip[$key] = $backup;
} else {
2019-05-29 05:19:15 +02:00
$backups_file[$key] = $backup;
}
}
if (empty($backups_zip) && empty($backups_file)) {
echo '
<div class="alert alert-info">
<i class="fa fa-warning"></i> '.tr('Non è ancora stato trovato alcun backup!').'
'.tr('Se hai già inserito dei dati su OSM crealo il prima possibile...').'
</div>';
} else {
echo '
<div class="row">
<div class="col-xs-12 col-md-6">
<h3>'.tr('Backup compressi').'</h3>';
if (!empty($backups_zip)) {
2019-02-09 14:44:30 +01:00
foreach ($backups_zip as $id => $backup) {
$name = basename($backup);
$info = Backup::readName($backup);
$data = $info['YYYY'].'-'.$info['m'].'-'.$info['d'];
$ora = $info['H'].':'.$info['i'].':'.$info['s'];
2024-03-03 18:42:16 +01:00
$tipo = $info['AAAAAAA'];
echo '
<div class="callout callout-info">
<h4>'.tr('Backup del _DATE_ alle _TIME_', [
'_DATE_' => Translator::dateToLocale($data),
'_TIME_' => Translator::timeToLocale($ora),
]).'</h4>
<p><small>
'.tr('Nome del file').': '.$name.'<br>
2024-03-03 18:42:16 +01:00
'.tr('Tipo').': '.(($tipo == 'PARTIAL')? '🟠 '.tr('Parziale'):'🟢 '.tr('Completo')).'<br>
2019-02-09 14:44:30 +01:00
'.tr('Dimensione').': <i id="c-'.$id.'"></i>
</small></p>
2019-02-09 14:44:30 +01:00
<script>
2019-05-29 05:19:15 +02:00
loadSize("'.$id.'", "c-'.$id.'");
2019-02-09 14:44:30 +01:00
</script>
<a class="btn btn-primary" href="'.base_path().'/modules/backups/actions.php?op=getfile&number='.$id.'" target="_blank"><i class="fa fa-download"></i> '.tr('Scarica').'</a>
2018-09-19 16:02:15 +02:00
<div class="pull-right">
<a class="btn btn-warning ask" data-backto="record-edit" data-method="post" data-op="restore" data-number="'.$id.'" data-msg="'.tr('Clicca su Ripristina per ripristinare questo backup').'" data-button="Ripristina" data-class="btn btn-lg btn-warning">
<i class="fa fa-upload"></i> '.tr('Ripristina').'
2018-09-19 16:02:15 +02:00
</a>
2019-05-29 05:19:15 +02:00
<a class="btn btn-danger ask" title="'.tr('Elimina backup').'" data-backto="record-list" data-op="del" data-number="'.$id.'">
2018-09-19 16:02:15 +02:00
<i class="fa fa-trash"></i>
</a>
</div>
</div>';
}
} else {
echo '
2023-03-14 16:56:33 +01:00
<div class="alert alert-info">
<i class="fa fa-info-circle"></i> '.tr('Non è stato trovato alcun backup di questa tipologia.').'
</div>';
}
echo '
</div>
<div class="col-xs-12 col-md-6">
<h3>'.tr('Backup non compressi').'</h3>';
// Backup non compressi e quindi non scaricabili
if (!empty($backups_file)) {
foreach ($backups_file as $backup) {
$name = basename($backup);
$info = Backup::readName($backup);
$data = $info['YYYY'].'-'.$info['m'].'-'.$info['d'];
$ora = $info['H'].':'.$info['i'].':'.$info['s'];
echo '
<div class="callout callout-warning">
<h4>'.tr('Backup del _DATE_ alle _TIME_', [
'_DATE_' => Translator::dateToLocale($data),
'_TIME_' => Translator::timeToLocale($ora),
]).'</h4>
<p><small>
'.tr('Nome del file').': '.$name.'<br>
2019-02-09 14:44:30 +01:00
'.tr('Dimensione').': <i id="n-'.$id.'"></i>
</small></p>
2019-02-09 14:44:30 +01:00
<script>
2019-05-29 05:19:15 +02:00
loadSize("'.$id.'", "n-'.$id.'");
2019-02-09 14:44:30 +01:00
</script>
<a class="btn btn-sm btn-warning disabled" href="javascript:;"><i class="fa fa-times"></i> '.tr('Non scaricabile').'</a>
2018-09-19 16:02:15 +02:00
<div class="pull-right">
2019-05-29 05:19:15 +02:00
<a class="btn btn-warning ask" data-backto="record-edit" data-method="post" data-op="restore" data-number="'.$id.'" data-msg="'.tr('Vuoi ripristinare questo backup?').'" data-button="Ripristina" data-class="btn btn-lg btn-warning">
2018-09-19 16:02:15 +02:00
<i class="fa fa-upload"></i>
</a>
2019-05-29 05:19:15 +02:00
<a class="btn btn-danger ask" title="'.tr('Elimina backup').'" data-backto="record-list" data-op="del" data-number="'.$id.'">
2018-09-19 16:02:15 +02:00
<i class="fa fa-trash"></i>
</a>
</div>
</div>';
}
} else {
echo '
2023-03-14 16:56:33 +01:00
<div class="alert alert-info">
<i class="fa fa-info-circle"></i> '.tr('Non è stato trovato alcun backup di questa tipologia.').'
</div>';
}
echo '
</div>
</div>';
}
} else {
echo '
<div class="alert alert-danger">'.tr('La cartella di backup non esiste!').' '.tr('Non è possibile eseguire i backup!').'</div>';
}
2019-02-09 14:44:30 +01:00
// Creazione backup
if (!empty($backup_dir)) {
echo '
<div class="btn-group pull-right">
<a class="btn btn-primary" aria-haspopup="true" aria-expanded="false" onclick="creaBackup(this)">
2024-03-03 12:55:26 +01:00
<i class="fa fa-archive"></i> '.tr('Crea backup').'
</a>
</div>
2019-02-09 14:44:30 +01:00
<div class="clearfix"></div>';
}