feat: backup and restore (#288)
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
<?php
|
||||
require_once '../../includes/connect_endpoint.php';
|
||||
session_start();
|
||||
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true) {
|
||||
die(json_encode([
|
||||
"success" => false,
|
||||
"message" => translate('session_expired', $i18n)
|
||||
]));
|
||||
}
|
||||
|
||||
function addFolderToZip($dir, $zipArchive, $zipdir = ''){
|
||||
if (is_dir($dir)) {
|
||||
if ($dh = opendir($dir)) {
|
||||
//Add the directory
|
||||
if(!empty($zipdir)) $zipArchive->addEmptyDir($zipdir);
|
||||
while (($file = readdir($dh)) !== false) {
|
||||
// Skip '.' and '..'
|
||||
if ($file == "." || $file == "..") {
|
||||
continue;
|
||||
}
|
||||
//If it's a folder, run the function again!
|
||||
if(is_dir($dir . $file)){
|
||||
$newdir = $dir . $file . '/';
|
||||
addFolderToZip($newdir, $zipArchive, $zipdir . $file . '/');
|
||||
}else{
|
||||
//Add the files
|
||||
$zipArchive->addFile($dir . $file, $zipdir . $file);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
die(json_encode([
|
||||
"success" => false,
|
||||
"message" => "Directory does not exist: $dir"
|
||||
]));
|
||||
}
|
||||
}
|
||||
|
||||
$zip = new ZipArchive();
|
||||
$filename = "backup_" . uniqid() . ".zip";
|
||||
$zipname = "../../.tmp/" . $filename;
|
||||
|
||||
if ($zip->open($zipname, ZipArchive::CREATE)!==TRUE) {
|
||||
die(json_encode([
|
||||
"success" => false,
|
||||
"message" => translate('cannot_open_zip', $i18n)
|
||||
]));
|
||||
}
|
||||
|
||||
addFolderToZip('../../db/', $zip);
|
||||
addFolderToZip('../../images/uploads/', $zip);
|
||||
|
||||
$numberOfFilesAdded = $zip->numFiles;
|
||||
|
||||
if ($zip->close() === false) {
|
||||
die(json_encode([
|
||||
"success" => false,
|
||||
"message" => "Failed to finalize the zip file"
|
||||
]));
|
||||
} else {
|
||||
flush();
|
||||
die(json_encode([
|
||||
"success" => true,
|
||||
"message" => "Zip file created successfully",
|
||||
"numFiles" => $numberOfFilesAdded,
|
||||
"file" => $filename
|
||||
]));
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,112 @@
|
||||
<?php
|
||||
require_once '../../includes/connect_endpoint.php';
|
||||
session_start();
|
||||
|
||||
$result = $db->query("SELECT COUNT(*) as count FROM user");
|
||||
$row = $result->fetchArray(SQLITE3_NUM);
|
||||
if ($row[0] > 0) {
|
||||
die(json_encode([
|
||||
"success" => false,
|
||||
"message" => "Denied"
|
||||
]));
|
||||
}
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
if (isset($_FILES['file'])) {
|
||||
$file = $_FILES['file'];
|
||||
$fileTmpName = $file['tmp_name'];
|
||||
$fileError = $file['error'];
|
||||
|
||||
if ($fileError === 0) {
|
||||
$fileDestination = '../../.tmp/restore.zip';
|
||||
move_uploaded_file($fileTmpName, $fileDestination);
|
||||
|
||||
$zip = new ZipArchive();
|
||||
if ($zip->open($fileDestination) === true) {
|
||||
$zip->extractTo('../../.tmp/restore/');
|
||||
$zip->close();
|
||||
} else {
|
||||
die(json_encode([
|
||||
"success" => false,
|
||||
"message" => "Failed to extract the uploaded file"
|
||||
]));
|
||||
}
|
||||
|
||||
if (file_exists('../../.tmp/restore/wallos.db')) {
|
||||
if (file_exists('../../db/wallos.db')) {
|
||||
unlink('../../db/wallos.db');
|
||||
}
|
||||
rename('../../.tmp/restore/wallos.db', '../../db/wallos.db');
|
||||
|
||||
if (file_exists('../../.tmp/restore/logos/')) {
|
||||
$dir = '../../images/uploads/logos/';
|
||||
$di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
|
||||
$ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST);
|
||||
|
||||
foreach ( $ri as $file ) {
|
||||
if ( $file->isDir() ) {
|
||||
rmdir($file->getPathname());
|
||||
} else {
|
||||
unlink($file->getPathname());
|
||||
}
|
||||
}
|
||||
|
||||
$dir = new RecursiveDirectoryIterator('../../.tmp/restore/logos/');
|
||||
$ite = new RecursiveIteratorIterator($dir);
|
||||
$allowedExtensions = ['png', 'jpg', 'jpeg', 'gif', 'webp'];
|
||||
|
||||
foreach ($ite as $filePath) {
|
||||
if (in_array(pathinfo($filePath, PATHINFO_EXTENSION), $allowedExtensions)) {
|
||||
$destination = str_replace('../../.tmp/restore/', '../../images/uploads/', $filePath);
|
||||
$destinationDir = pathinfo($destination, PATHINFO_DIRNAME);
|
||||
|
||||
if (!is_dir($destinationDir)) {
|
||||
mkdir($destinationDir, 0755, true);
|
||||
}
|
||||
|
||||
copy($filePath, $destination);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$files = new RecursiveIteratorIterator(
|
||||
new RecursiveDirectoryIterator('../../.tmp', RecursiveDirectoryIterator::SKIP_DOTS),
|
||||
RecursiveIteratorIterator::CHILD_FIRST
|
||||
);
|
||||
|
||||
foreach ($files as $fileinfo) {
|
||||
$removeFunction = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
|
||||
$removeFunction($fileinfo->getRealPath());
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"message" => translate("success", $i18n)
|
||||
]);
|
||||
} else {
|
||||
die(json_encode([
|
||||
"success" => false,
|
||||
"message" => "wallos.db does not exist in the backup file"
|
||||
]));
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
echo json_encode([
|
||||
"success" => false,
|
||||
"message" => "Failed to upload file"
|
||||
]);
|
||||
}
|
||||
} else {
|
||||
echo json_encode([
|
||||
"success" => false,
|
||||
"message" => "No file uploaded"
|
||||
]);
|
||||
}
|
||||
} else {
|
||||
echo json_encode([
|
||||
"success" => false,
|
||||
"message" => "Invalid request method"
|
||||
]);
|
||||
}
|
||||
?>
|
||||
@@ -0,0 +1,109 @@
|
||||
<?php
|
||||
require_once '../../includes/connect_endpoint.php';
|
||||
session_start();
|
||||
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true) {
|
||||
die(json_encode([
|
||||
"success" => false,
|
||||
"message" => translate('session_expired', $i18n)
|
||||
]));
|
||||
}
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
if (isset($_FILES['file'])) {
|
||||
$file = $_FILES['file'];
|
||||
$fileTmpName = $file['tmp_name'];
|
||||
$fileError = $file['error'];
|
||||
|
||||
if ($fileError === 0) {
|
||||
$fileDestination = '../../.tmp/restore.zip';
|
||||
move_uploaded_file($fileTmpName, $fileDestination);
|
||||
|
||||
$zip = new ZipArchive();
|
||||
if ($zip->open($fileDestination) === true) {
|
||||
$zip->extractTo('../../.tmp/restore/');
|
||||
$zip->close();
|
||||
} else {
|
||||
die(json_encode([
|
||||
"success" => false,
|
||||
"message" => "Failed to extract the uploaded file"
|
||||
]));
|
||||
}
|
||||
|
||||
if (file_exists('../../.tmp/restore/wallos.db')) {
|
||||
if (file_exists('../../db/wallos.db')) {
|
||||
unlink('../../db/wallos.db');
|
||||
}
|
||||
rename('../../.tmp/restore/wallos.db', '../../db/wallos.db');
|
||||
|
||||
if (file_exists('../../.tmp/restore/logos/')) {
|
||||
$dir = '../../images/uploads/logos/';
|
||||
$di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
|
||||
$ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST);
|
||||
|
||||
foreach ( $ri as $file ) {
|
||||
if ( $file->isDir() ) {
|
||||
rmdir($file->getPathname());
|
||||
} else {
|
||||
unlink($file->getPathname());
|
||||
}
|
||||
}
|
||||
|
||||
$dir = new RecursiveDirectoryIterator('../../.tmp/restore/logos/');
|
||||
$ite = new RecursiveIteratorIterator($dir);
|
||||
$allowedExtensions = ['png', 'jpg', 'jpeg', 'gif', 'webp'];
|
||||
|
||||
foreach ($ite as $filePath) {
|
||||
if (in_array(pathinfo($filePath, PATHINFO_EXTENSION), $allowedExtensions)) {
|
||||
$destination = str_replace('../../.tmp/restore/', '../../images/uploads/', $filePath);
|
||||
$destinationDir = pathinfo($destination, PATHINFO_DIRNAME);
|
||||
|
||||
if (!is_dir($destinationDir)) {
|
||||
mkdir($destinationDir, 0755, true);
|
||||
}
|
||||
|
||||
copy($filePath, $destination);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$files = new RecursiveIteratorIterator(
|
||||
new RecursiveDirectoryIterator('../../.tmp', RecursiveDirectoryIterator::SKIP_DOTS),
|
||||
RecursiveIteratorIterator::CHILD_FIRST
|
||||
);
|
||||
|
||||
foreach ($files as $fileinfo) {
|
||||
$removeFunction = ($fileinfo->isDir() ? 'rmdir' : 'unlink');
|
||||
$removeFunction($fileinfo->getRealPath());
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
"success" => true,
|
||||
"message" => translate("success", $i18n)
|
||||
]);
|
||||
} else {
|
||||
die(json_encode([
|
||||
"success" => false,
|
||||
"message" => "wallos.db does not exist in the backup file"
|
||||
]));
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
echo json_encode([
|
||||
"success" => false,
|
||||
"message" => "Failed to upload file"
|
||||
]);
|
||||
}
|
||||
} else {
|
||||
echo json_encode([
|
||||
"success" => false,
|
||||
"message" => "No file uploaded"
|
||||
]);
|
||||
}
|
||||
} else {
|
||||
echo json_encode([
|
||||
"success" => false,
|
||||
"message" => "Invalid request method"
|
||||
]);
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user