File "UpdateScriptVersionController.php"
Full Path: /home/isoftco/public_html/hrm/vendor/froiden/envato/src/Controllers/UpdateScriptVersionController.php
File size: 9.45 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace Froiden\Envato\Controllers;
use Froiden\Envato\Helpers\Reply;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Carbon\Carbon;
use GuzzleHttp\Client;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Session;
use Zip;
class UpdateScriptVersionController extends Controller
{
private $tmp_backup_dir = null;
private function checkPermission()
{
return config('froiden_envato.allow_users_id');
}
/*
* Download and Install Update.
*/
public function update()
{
$setting = config('froiden_envato.setting');
$this->appSetting = (new $setting)::first();
if (Carbon::parse($this->appSetting->supported_until)->isPast()) {
return Reply::error('Please renew your support for one-click updates.');
}
if (!$this->checkPermission()) {
return Reply::error("ACTION NOT ALLOWED.");
}
$lastVersionInfo = $this->getLastVersion();
if ($lastVersionInfo['version'] <= $this->getCurrentVersion()) {
return Reply::error("Your System IS ALREADY UPDATED to latest version !");
}
try {
$this->tmp_backup_dir = base_path() . '/backup_' . date('Ymd');
$lastVersionInfo = $this->getLastVersion();
$update_name = $lastVersionInfo['archive'];
$filename_tmp = config('froiden_envato.tmp_path') . '/' . $update_name;
if (file_exists($filename_tmp)) {
File::delete($filename_tmp); //delete old file if exist
}
// Clear cache when update button is clicked
$this->configClear();
return Reply::successWithData('Starting Download...', ['description' => $lastVersionInfo['description']]);
$status = $this->install($lastVersionInfo['version'], $update_path, $lastVersionInfo['archive']);
if ($status) {
echo '<p>» SYSTEM Mantence Mode => OFF</p>';
echo '<p class="text-success">SYSTEM IS NOW UPDATED TO VERSION: ' . $lastVersionInfo['version'] . '</p>';
echo '<p style="font-weight: bold;">RELOAD YOUR BROWSER TO SEE CHANGES</p>';
} else
throw new \Exception("Error during updating.");
} catch (\Exception $e) {
echo '<p>ERROR DURING UPDATE (!!check the update archive!!) --TRY to restore OLD status ........... ';
$this->restore();
echo '</p>';
}
}
public function install()
{
if (!$this->checkPermission()) {
return Reply::error("ACTION NOT ALLOWED.");
}
$lastVersionInfo = $this->getLastVersion();
$archive = $lastVersionInfo['archive'];
$update_path = config('froiden_envato.tmp_path') . '/' . $archive;
$zip = Zip::open($update_path);
// extract whole archive
$zip->extract(base_path());
$this->clean();
return Reply::success('Zip extracted successfully. Now installing...');
}
/*
* Download Update from $update_baseurl to $tmp_path (local folder).
*/
public function download(Request $request)
{
if (!$this->checkPermission()) {
return Reply::error("ACTION NOT ALLOWED.");
}
File::put(public_path() . '/percent-download.txt', '');
$lastVersionInfo = $this->getLastVersion();
$update_name = $lastVersionInfo['archive'];
$filename_tmp = config('froiden_envato.tmp_path') . '/' . $update_name;
$downloadRemoteUrl = config('froiden_envato.update_baseurl') . '/' . $update_name;
$dlHandler = fopen($filename_tmp, 'w');
$client = new Client();
$client->request('GET', $downloadRemoteUrl, [
'sink' => $dlHandler,
'progress' => function ($dl_total_size, $dl_size_so_far, $ul_total_size, $ul_size_so_far) {
$percentDownloaded = ($dl_total_size > 0) ? (($dl_size_so_far / $dl_total_size) * 100) : 0;
File::put(public_path() . '/percent-download.txt', $percentDownloaded);
},
'verify' => false
]);
return Reply::success('Download complete. Now Installing...');
}
/*
* Return current version (as plain text).
*/
public function getCurrentVersion()
{
$version = File::get(public_path() . '/version.txt');
return $version;
}
/*
* Check if a new Update exist.
*/
public function check()
{
$lastVersionInfo = $this->getLastVersion();
if ($lastVersionInfo['version'] > $this->getCurrentVersion()) {
return $lastVersionInfo['version'];
}
return '';
}
private function setCurrentVersion($last)
{
File::put(public_path() . '/version.txt', $last); //UPDATE $current_version to last version
}
private function getLastVersion()
{
$client = new Client();
$res = $client->request('GET', config('froiden_envato.updater_file_path'), ['verify' => false]);
$lastVersion = $res->getBody();
$content = json_decode($lastVersion, true);
return $content; //['version' => $v, 'archive' => 'RELEASE-$v.zip', 'description' => 'plain text...'];
}
private function backup($filename)
{
$backup_dir = $this->tmp_backup_dir;
if (!is_dir($backup_dir)) File::makeDirectory($backup_dir, $mode = 0755, true, true);
if (!is_dir($backup_dir . '/' . dirname($filename))) File::makeDirectory($backup_dir . '/' . dirname($filename), $mode = 0755, true, true);
File::copy(base_path() . '/' . $filename, $backup_dir . '/' . $filename); //to backup folder
}
private function restore()
{
if (!isset($this->tmp_backup_dir))
$this->tmp_backup_dir = base_path() . '/backup_' . date('Ymd');
try {
$backup_dir = $this->tmp_backup_dir;
$backup_files = File::allFiles($backup_dir);
foreach ($backup_files as $file) {
$filename = (string)$file;
$filename = substr($filename, (strlen($filename) - strlen($backup_dir) - 1) * (-1));
echo $backup_dir . '/' . $filename . " => " . base_path() . '/' . $filename;
File::copy($backup_dir . '/' . $filename, base_path() . '/' . $filename); //to respective folder
}
} catch (\Exception $e) {
echo "Exception => " . $e->getMessage();
echo "<BR>[ FAILED ]";
echo "<BR> Backup folder is located in: <i>" . $backup_dir . "</i>.";
echo "<BR> Remember to restore System UP-Status through shell command: <i>php artisan up</i>.";
return false;
}
echo "[ RESTORED ]";
return true;
}
public function formatSizeUnits($bytes)
{
if ($bytes >= 1073741824) {
$bytes = number_format($bytes / 1073741824, 2) . ' GB';
} elseif ($bytes >= 1048576) {
$bytes = number_format($bytes / 1048576, 2) . ' MB';
} elseif ($bytes >= 1024) {
$bytes = number_format($bytes / 1024, 2) . ' KB';
} elseif ($bytes > 1) {
$bytes = $bytes . ' bytes';
} elseif ($bytes == 1) {
$bytes = $bytes . ' byte';
} else {
$bytes = '0 bytes';
}
return $bytes;
}
public function downloadPercent(Request $request)
{
$percent = File::get(public_path() . '/percent-download.txt');
return $percent;
}
public function checkIfFileExtracted()
{
$lastVersionInfo = $this->getLastVersion();
if ($lastVersionInfo['version'] == $this->getCurrentVersion()) {
$status = Artisan::call('migrate:check');
if ($status) {
sleep(3);
Artisan::call('migrate', array('--force' => true)); //migrate database
}
$lastVersionInfo = $this->getLastVersion();
$this->setCurrentVersion($lastVersionInfo['version']); //update system version
//logout user after installing update
Auth::logout();
return Reply::success('Installed successfully.');
}
}
public function clean()
{
$this->configClear();
session()->forget('check_migrate_status');
Session::flush();
}
public function configClear()
{
Artisan::call('config:clear');
Artisan::call('route:clear');
Artisan::call('view:clear');
Artisan::call('cache:clear');
}
public function updateDatabase()
{
Artisan::call('migrate', array('--force' => true));
return 'Database updated successfully. <a href="' . route(config('froiden_envato.redirectRoute')) . '">Click here to Login</a>';
}
public function clearCache()
{
$this->configClear();
if (request()->ajax()) {
return Reply::success('Cache cleared successfully.');
}
return 'Cache cleared successfully. <a href="' . route(config('froiden_envato.redirectRoute')) . '">Click here to Login</a>';
}
public function refreshCache()
{
Artisan::call('optimize');
Artisan::call('route:clear');
if (request()->ajax()) {
return Reply::success('Cache refreshed successfully.');
}
return 'Cache refreshed successfully. <a href="' . route(config('froiden_envato.redirectRoute')) . '">Click here to Login</a>';
}
}