phpnuxbill/update.php
2023-08-28 15:46:25 +07:00

275 lines
No EOL
9 KiB
PHP

<?php
/**
* PHP Mikrotik Billing (https://github.com/hotspotbilling/phpnuxbill/)
*
* This script is for updating PHPNuxBill
**/
session_start();
include "config.php";
if(empty($update_url)){
$update_url = 'https://github.com/hotspotbilling/phpnuxbill/archive/refs/heads/master.zip';
}
if (!isset($_SESSION['aid']) || empty($_SESSION['aid'])) {
r2("./?_route=login&You_are_not_admin", 'e', 'You are not admin');
}
set_time_limit(-1);
if (!is_writeable(pathFixer('system/cache/'))) {
r2("./?_route=community", 'e', 'Folder system/cache/ is not writable');
}
if (!is_writeable(pathFixer('.'))) {
r2("./?_route=community", 'e', 'Folder web is not writable');
}
$step = $_GET['step'];
$continue = true;
if (!extension_loaded('zip')) {
$msg = "No PHP ZIP extension is available";
$msgType = "danger";
$continue = false;
}
$file = pathFixer('system/cache/phpnuxbill.zip');
$folder = pathFixer('system/cache/phpnuxbill-'.basename($update_url, ".zip").'/');
if (empty($step)) {
$step++;
} else if ($step == 1) {
if (file_exists($file)) unlink($file);
// Download update
$fp = fopen($file, 'w+');
$ch = curl_init($update_url);
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 600);
curl_setopt($ch, CURLOPT_TIMEOUT, 600);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
curl_close($ch);
fclose($fp);
if (file_exists($file)) {
$step++;
} else {
$msg = "Failed to download Update file";
$msgType = "danger";
$continue = false;
}
} else if ($step == 2) {
$zip = new ZipArchive();
$zip->open($file);
$zip->extractTo(pathFixer('system/cache/'));
$zip->close();
if (file_exists($folder)) {
$step++;
} else {
$msg = "Failed to extract update file";
$msgType = "danger";
$continue = false;
}
// remove downloaded zip
if (file_exists($file)) unlink($file);
} else if ($step == 3) {
copyFolder($folder, pathFixer('./'));
deleteFolder('install/');
deleteFolder($folder);
if (!file_exists($folder . pathFixer('/system/'))) {
$step++;
} else {
$msg = "Failed to install update file.";
$msgType = "danger";
$continue = false;
}
} else if ($step == 4) {
if (file_exists("system/updates.json")) {
require 'config.php';
$db = new pdo(
"mysql:host=$db_host;dbname=$db_name",
$db_user,
$db_password,
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
);
$updates = json_decode(file_get_contents("system/updates.json"), true);
$dones = [];
if (file_exists("system/cache/updates.done.json")) {
$dones = json_decode(file_get_contents("system/cache/updates.done.json"), true);
}
foreach ($updates as $version => $queries) {
if (!in_array($version, $dones)) {
foreach ($queries as $q) {
try{
$db->exec($q);
}catch(PDOException $e){
//ignore, it exists already
}
}
$dones[] = $version;
}
}
file_put_contents("system/cache/updates.done.json", json_encode($dones));
}
$step++;
} else {
$version = json_decode(file_get_contents('version.json'), true)['version'];
$continue = false;
}
function pathFixer($path)
{
return str_replace("/", DIRECTORY_SEPARATOR, $path);
}
function r2($to, $ntype = 'e', $msg = '')
{
if ($msg == '') {
header("location: $to");
exit;
}
$_SESSION['ntype'] = $ntype;
$_SESSION['notify'] = $msg;
header("location: $to");
exit;
}
function copyFolder($from, $to, $exclude = [])
{
$files = scandir($from);
foreach ($files as $file) {
if (is_file($from . $file) && !in_array($file, $exclude)) {
if (file_exists($to . $file)) unlink($to . $file);
rename($from . $file, $to . $file);
} else if (is_dir($from . $file) && !in_array($file, ['.', '..'])) {
if (!file_exists($to . $file)) {
mkdir($to . $file);
}
copyFolder($from . $file . DIRECTORY_SEPARATOR, $to . $file . DIRECTORY_SEPARATOR);
}
}
}
function deleteFolder($path)
{
$files = scandir($path);
foreach ($files as $file) {
if (is_file($path . $file)) {
unlink($path . $file);
} else if (is_dir($path . $file) && !in_array($file, ['.', '..'])) {
deleteFolder($path . $file . DIRECTORY_SEPARATOR);
rmdir($path . $file);
}
}
rmdir($path);
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>PHPNuxBill Updater</title>
<link rel="shortcut icon" href="ui/ui/images/logo.png" type="image/x-icon" />
<link rel="stylesheet" href="ui/ui/styles/bootstrap.min.css">
<link rel="stylesheet" href="ui/ui/fonts/ionicons/css/ionicons.min.css">
<link rel="stylesheet" href="ui/ui/fonts/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" href="ui/ui/fonts/MaterialDesign/css/materialdesignicons.min.css">
<link rel="stylesheet" href="ui/ui/styles/adminlte.min.css">
<link rel="stylesheet" href="ui/ui/styles/skin-blue.min.css">
<?php if ($continue) { ?>
<meta http-equiv="refresh" content="3; ./update.php?step=<?= $step ?>">
<?php } ?>
<style>
::-moz-selection {
/* Code for Firefox */
color: red;
background: yellow;
}
::selection {
color: red;
background: yellow;
}
</style>
</head>
<body class="hold-transition skin-blue">
<div class="container">
<section class="content-header">
<h1 class="text-center">
Update PHPNuxBill
</h1>
</section>
<section class="content">
<div class="row">
<div class="col-md-4"></div>
<div class="col-md-4">
<?php if (!empty($msgType) && !empty($msg)) { ?>
<div class="alert alert-<?= $msgType ?>" role="alert">
<?= $msg ?>
</div>
<?php } ?>
<?php if ($continue || $step == 5) { ?>
<?php if ($step == 1) { ?>
<div class="panel panel-primary">
<div class="panel-heading">Step 1</div>
<div class="panel-body">
Downloading update<br>
Please wait....
</div>
</div>
<?php } else if ($step == 2) { ?>
<div class="panel panel-primary">
<div class="panel-heading">Step 2</div>
<div class="panel-body">
extracting<br>
Please wait....
</div>
</div>
<?php } else if ($step == 3) { ?>
<div class="panel panel-primary">
<div class="panel-heading">Step 3</div>
<div class="panel-body">
Installing<br>
Please wait....
</div>
</div>
<?php } else if ($step == 4) { ?>
<div class="panel panel-primary">
<div class="panel-heading">Step 4</div>
<div class="panel-body">
Updating database...
</div>
</div>
<?php } else if ($step == 5) { ?>
<div class="panel panel-success">
<div class="panel-heading">Update Finished</div>
<div class="panel-body">
PHPNuxBill has been updated to Version <b><?= $version ?></b>
</div>
</div>
<meta http-equiv="refresh" content="5; ./index.php?_route=dashboard">
<?php } ?>
<?php } ?>
</div>
</div>
</section>
<footer class="footer text-center">
PHPNuxBill by <a href="https://github.com/hotspotbilling/phpnuxbill" rel="nofollow noreferrer noopener" target="_blank">iBNuX</a>
</footer>
</div>
</body>
</html>