mirror of
https://github.com/LinkStackOrg/LinkStack.git
synced 2025-03-10 00:20:06 +01:00
Add custom updater remove dependency
This commit is contained in:
parent
4236a50baa
commit
6fd0847d73
@ -7,7 +7,6 @@
|
|||||||
"require": {
|
"require": {
|
||||||
"php": ">=8.0",
|
"php": ">=8.0",
|
||||||
"awssat/laravel-visits": "^6.0",
|
"awssat/laravel-visits": "^6.0",
|
||||||
"codedge/laravel-selfupdater": "^3.6",
|
|
||||||
"cohensive/oembed": "^0.17",
|
"cohensive/oembed": "^0.17",
|
||||||
"doctrine/dbal": "^3.0",
|
"doctrine/dbal": "^3.0",
|
||||||
"fideloper/proxy": "^4.4",
|
"fideloper/proxy": "^4.4",
|
||||||
|
@ -1,161 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
|
|
||||||
if (env('JOIN_BETA') == true) {
|
|
||||||
$userver = 'https://beta.linkstack.org/';
|
|
||||||
} else {
|
|
||||||
$userver = 'https://update.linkstack.org/';
|
|
||||||
}
|
|
||||||
|
|
||||||
return [
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Default source repository type
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| The default source repository type you want to pull your updates from.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
|
|
||||||
'default' => env('SELF_UPDATER_SOURCE', 'http'),
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Version installed
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| Set this to the version of your software installed on your system.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
|
|
||||||
'version_installed' => file_get_contents(base_path("version.json")),
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Repository types
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| A repository can be of different types, which can be specified here.
|
|
||||||
| Current options:
|
|
||||||
| - github
|
|
||||||
| - gitlab
|
|
||||||
| - http
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
|
|
||||||
'repository_types' => [
|
|
||||||
'github' => [
|
|
||||||
'type' => 'github',
|
|
||||||
'repository_vendor' => env('SELF_UPDATER_REPO_VENDOR', ''),
|
|
||||||
'repository_name' => env('SELF_UPDATER_REPO_NAME', ''),
|
|
||||||
'repository_url' => '',
|
|
||||||
'download_path' => env('SELF_UPDATER_DOWNLOAD_PATH', '/tmp'),
|
|
||||||
'private_access_token' => env('SELF_UPDATER_GITHUB_PRIVATE_ACCESS_TOKEN', ''),
|
|
||||||
'use_branch' => env('SELF_UPDATER_USE_BRANCH', ''),
|
|
||||||
],
|
|
||||||
'gitlab' => [
|
|
||||||
'type' => 'gitlab',
|
|
||||||
'repository_id' => env('SELF_UPDATER_REPO_URL', ''),
|
|
||||||
'download_path' => env('SELF_UPDATER_DOWNLOAD_PATH', '/tmp'),
|
|
||||||
'private_access_token' => env('SELF_UPDATER_GITLAB_PRIVATE_ACCESS_TOKEN', ''),
|
|
||||||
],
|
|
||||||
'http' => [
|
|
||||||
'type' => 'http',
|
|
||||||
'repository_url' => env('SELF_UPDATER_REPO_URL', $userver),
|
|
||||||
'pkg_filename_format' => env('SELF_UPDATER_PKG_FILENAME_FORMAT', '_VERSION_'),
|
|
||||||
'download_path' => env('SELF_UPDATER_DOWNLOAD_PATH', '/tmp'),
|
|
||||||
'private_access_token' => env('SELF_UPDATER_HTTP_PRIVATE_ACCESS_TOKEN', ''),
|
|
||||||
],
|
|
||||||
],
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Exclude folders from update
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| Specific folders which should not be updated and will be skipped during the
|
|
||||||
| update process.
|
|
||||||
|
|
|
||||||
| Here's already a list of good examples to skip. You may want to keep those.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
|
|
||||||
'exclude_folders' => [
|
|
||||||
'__MACOSX',
|
|
||||||
'node_modules',
|
|
||||||
'bootstrap/cache',
|
|
||||||
'bower',
|
|
||||||
'storage/app',
|
|
||||||
'storage/framework',
|
|
||||||
'storage/logs',
|
|
||||||
'storage/self-update',
|
|
||||||
],
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Event Logging
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| Configure if fired events should be logged
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
|
|
||||||
'log_events' => env('SELF_UPDATER_LOG_EVENTS', true),
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Notifications
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| Specify for which events you want to get notifications. Out of the box you can use 'mail'.
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
|
|
||||||
'notifications' => [
|
|
||||||
'notifications' => [
|
|
||||||
\Codedge\Updater\Notifications\Notifications\UpdateSucceeded::class => ['mail'],
|
|
||||||
\Codedge\Updater\Notifications\Notifications\UpdateFailed::class => ['mail'],
|
|
||||||
\Codedge\Updater\Notifications\Notifications\UpdateAvailable::class => ['mail'],
|
|
||||||
],
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Here you can specify the notifiable to which the notifications should be sent. The default
|
|
||||||
* notifiable will use the variables specified in this config file.
|
|
||||||
*/
|
|
||||||
'notifiable' => \Codedge\Updater\Notifications\Notifiable::class,
|
|
||||||
|
|
||||||
'mail' => [
|
|
||||||
'to' => [
|
|
||||||
'address' => env('SELF_UPDATER_MAILTO_ADDRESS', 'notifications@example.com'),
|
|
||||||
'name' => env('SELF_UPDATER_MAILTO_NAME', ''),
|
|
||||||
],
|
|
||||||
|
|
||||||
'from' => [
|
|
||||||
'address' => env('SELF_UPDATER_MAIL_FROM_ADDRESS', 'updater@example.com'),
|
|
||||||
'name' => env('SELF_UPDATER_MAIL_FROM_NAME', 'Update'),
|
|
||||||
],
|
|
||||||
],
|
|
||||||
],
|
|
||||||
|
|
||||||
/*
|
|
||||||
|---------------------------------------------------------------------------
|
|
||||||
| Register custom artisan commands
|
|
||||||
|---------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
'artisan_commands' => [
|
|
||||||
'pre_update' => [
|
|
||||||
//'command:signature' => [
|
|
||||||
// 'class' => Command class
|
|
||||||
// 'params' => []
|
|
||||||
//]
|
|
||||||
],
|
|
||||||
'post_update' => [
|
|
||||||
|
|
||||||
],
|
|
||||||
],
|
|
||||||
|
|
||||||
];
|
|
@ -8,6 +8,8 @@ use Illuminate\Support\Facades\File;
|
|||||||
use Database\Seeders\ButtonSeeder;
|
use Database\Seeders\ButtonSeeder;
|
||||||
use App\Models\Page;
|
use App\Models\Page;
|
||||||
|
|
||||||
|
set_time_limit(0);
|
||||||
|
|
||||||
//run before finishing:
|
//run before finishing:
|
||||||
if(EnvEditor::keyExists('JOIN_BETA')){ /* Do nothing if key already exists */
|
if(EnvEditor::keyExists('JOIN_BETA')){ /* Do nothing if key already exists */
|
||||||
} else { EnvEditor::addKey('JOIN_BETA', 'false');} // Adds key to .env file
|
} else { EnvEditor::addKey('JOIN_BETA', 'false');} // Adds key to .env file
|
||||||
|
@ -6,6 +6,12 @@ use App\Models\Link;
|
|||||||
|
|
||||||
set_time_limit(0);
|
set_time_limit(0);
|
||||||
|
|
||||||
|
try {
|
||||||
|
if(!isset($preUpdateServer)){$preUpdateServer = 'https://pre-update.linkstack.org/';}
|
||||||
|
$file = Http::timeout(10)->get($preUpdateServer . 'update')->body();
|
||||||
|
file_put_contents(base_path('resources\views\update.blade.php'), $file);
|
||||||
|
} catch (Exception $e) {}
|
||||||
|
|
||||||
if(trim(file_get_contents(base_path("version.json"))) < '4.0.0'){
|
if(trim(file_get_contents(base_path("version.json"))) < '4.0.0'){
|
||||||
try {
|
try {
|
||||||
$file = base_path('storage/RSTAC');
|
$file = base_path('storage/RSTAC');
|
||||||
|
@ -133,6 +133,7 @@ body {
|
|||||||
button {
|
button {
|
||||||
border-style: none;
|
border-style: none;
|
||||||
background-color: #0085ff;
|
background-color: #0085ff;
|
||||||
|
margin: 5px;
|
||||||
}
|
}
|
||||||
button:hover {
|
button:hover {
|
||||||
background-color: #0065c1;
|
background-color: #0065c1;
|
||||||
@ -144,6 +145,24 @@ button:hover {
|
|||||||
color: #FFF !important;
|
color: #FFF !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.noteslink:hover {
|
||||||
|
color: #006fd5;
|
||||||
|
text-shadow: 0px 6px 7px rgba(23, 10, 6, 0.66);
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-box {
|
||||||
|
padding: 10px 15px;
|
||||||
|
margin: 10px 0;
|
||||||
|
border-left: 5px solid;
|
||||||
|
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-box-error {
|
||||||
|
background-color: #f0cccc;
|
||||||
|
color: #a94442;
|
||||||
|
border-color: #db5552;
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
@ -1,251 +1,319 @@
|
|||||||
@extends('layouts.updater')
|
@extends('layouts.updater')
|
||||||
|
|
||||||
@Push('updater-body')
|
@push('updater-body')
|
||||||
<div class="container">
|
|
||||||
|
|
||||||
<?php // Requests newest version from server and sets it as variable
|
@php
|
||||||
$Vgit = external_file_get_contents("https://version.linkstack.org/");
|
// Must end with '/'
|
||||||
|
$betaServer = env('BETA_SERVER', 'https://beta.linkstack.org/');
|
||||||
|
$updateServer = env('UPDATE_SERVER', 'https://update.linkstack.org/');
|
||||||
|
$versionServer = env('VERSION_SERVER', 'https://version.linkstack.org/');
|
||||||
|
$preUpdateServer = env('PRE_UPDATE_SERVER', 'https://pre-update.linkstack.org/');
|
||||||
|
$repositoryUrl = env('REPOSITORY_URL', 'https://github.com/linkstackorg/linkstack/');
|
||||||
|
|
||||||
// Requests current version from the local version file and sets it as variable
|
|
||||||
$Vlocal = file_get_contents(base_path("version.json"));
|
|
||||||
?>
|
|
||||||
@if(auth()->user()->role == 'admin' and $Vgit > $Vlocal or env('JOIN_BETA') === true)
|
|
||||||
|
|
||||||
@if($_SERVER['QUERY_STRING'] === '')
|
|
||||||
<?php //landing page ?>
|
|
||||||
|
|
||||||
<div class="logo-container fadein">
|
|
||||||
<img class="logo-img" src="{{ asset('assets/linkstack/images/logo.svg') }}" alt="Logo">
|
|
||||||
</div>
|
|
||||||
<h1>{{__('messages.Updater')}}</h1>
|
|
||||||
@if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')
|
|
||||||
@if(env('JOIN_BETA') === true)
|
|
||||||
<p><?php echo __('messages.Latest beta version')."= " . external_file_get_contents("https://beta.linkstack.org/vbeta.json"); ?></p>
|
|
||||||
<p><?php if(file_exists(base_path("vbeta.json"))) {echo __('messages.Installed beta version')."= " . file_get_contents(base_path("vbeta.json"));} else {echo __('messages.Installed beta version')."= ".__('messages.none');} ?></p>
|
|
||||||
<p><?php if($Vgit > $Vlocal) {echo __('messages.You need to update to the latest mainline release');} else {echo __("messages.You’re running the latest mainline release");} ?></p>
|
|
||||||
@else
|
|
||||||
<h4>{{__('messages.update.manually')}}</h4>
|
|
||||||
<h5>{{__('messages.update.windows')}}</h5>
|
|
||||||
@endif
|
|
||||||
<br><div class="row">
|
|
||||||
 <a class="btn" href="{{url()->current()}}/?updating-windows"><button><i class="fa-solid fa-user-gear btn"></i> {{__('messages.Update automatically')}}</button></a> 
|
|
||||||
 <a class="btn" href="https://linkstack.org/update" target="_blank"><button><i class="fa-solid fa-download btn"></i> {{__('messages.Update manually')}}</button></a> 
|
|
||||||
</div>
|
|
||||||
@else
|
|
||||||
@if(env('JOIN_BETA') === true)
|
|
||||||
<p><?php echo __('messages.Latest beta version')."= " . external_file_get_contents("https://beta.linkstack.org/vbeta.json"); ?></p>
|
|
||||||
<p><?php if(file_exists(base_path("vbeta.json"))) {echo __('messages.Installed beta version')."= " . file_get_contents(base_path("vbeta.json"));} else {echo __('messages.Installed beta version')."= ".__('messages.none');} ?></p>
|
|
||||||
<p><?php if($Vgit > $Vlocal) {echo __('messages.You need to update to the latest mainline release');} else {echo __("messages.You’re running the latest mainline release");} ?></p>
|
|
||||||
@else
|
|
||||||
<a target="_blank" href="https://github.com/linkstackorg/linkstack/releases"><code style="color:#222;transform:scale(.9);">{{$Vlocal}} -> {{$Vgit}}</code></a>
|
|
||||||
<h4>{{__('messages.update.manually')}}</h4>
|
|
||||||
@endif
|
|
||||||
<br><div class="row">
|
|
||||||
@if(env('SKIP_UPDATE_BACKUP') == true)
|
|
||||||
 <a class="btn" href="{{url()->current()}}/?preparing"><button><i class="fa-solid fa-user-gear btn"></i> {{__('messages.Update automatically')}}</button></a> 
|
|
||||||
@else
|
|
||||||
 <a class="btn" href="{{url()->current()}}/?backup"><button><i class="fa-solid fa-user-gear btn"></i> {{__('messages.Update automatically')}}</button></a> 
|
|
||||||
@endif
|
|
||||||
 <a class="btn" href="https://linkstack.org/update" target="_blank"><button><i class="fa-solid fa-download btn"></i> {{__('messages.Update manually')}}</button></a> 
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
@endif
|
|
||||||
|
|
||||||
|
|
||||||
@if($_SERVER['QUERY_STRING'] === 'updating-windows' and strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')
|
|
||||||
<?php //updating on Windows ?>
|
|
||||||
<div class="logo-container fadein">
|
|
||||||
<img class="logo-img" src="{{ asset('assets/linkstack/images/logo-loading.svg') }}" alt="Logo">
|
|
||||||
</div>
|
|
||||||
<h1 class="loadingtxt">{{__('messages.Updating')}}</h1>
|
|
||||||
@Push('updater-head')
|
|
||||||
<meta http-equiv="refresh" content="2; URL={{url()->current()}}/?preparing" />
|
|
||||||
@endpush
|
|
||||||
@endif
|
|
||||||
|
|
||||||
@if($_SERVER['QUERY_STRING'] === 'updating-windows-bat' and strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')
|
|
||||||
<?php //updating on Windows ?>
|
|
||||||
<?php
|
|
||||||
|
|
||||||
|
|
||||||
// Download the zip file
|
|
||||||
|
|
||||||
$latestversion = trim(external_file_get_contents("https://version.linkstack.org/"));
|
|
||||||
|
|
||||||
if(env('JOIN_BETA') === true){
|
|
||||||
$fileUrl = 'https://beta.linkstack.org/'. $latestversion . '.zip';
|
|
||||||
} else {
|
|
||||||
$fileUrl = 'https://update.linkstack.org/'. $latestversion . '.zip';
|
|
||||||
}
|
|
||||||
|
|
||||||
$curl = curl_init();
|
|
||||||
curl_setopt($curl, CURLOPT_URL, $fileUrl);
|
|
||||||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
|
|
||||||
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
|
|
||||||
$result = curl_exec($curl);
|
|
||||||
curl_close($curl);
|
|
||||||
|
|
||||||
file_put_contents(base_path('storage/update.zip'), $result);
|
|
||||||
|
|
||||||
|
|
||||||
$zip = new ZipArchive;
|
|
||||||
$zip->open(base_path() . '/storage/update.zip');
|
|
||||||
$zip->extractTo(base_path());
|
|
||||||
$zip->close();
|
|
||||||
unlink(base_path() . '/storage/update.zip');
|
|
||||||
|
|
||||||
echo "<meta http-equiv=\"refresh\" content=\"0; " . url()->current() . "/?finishing\" />";
|
|
||||||
|
|
||||||
?>
|
|
||||||
|
|
||||||
|
|
||||||
@endif
|
|
||||||
|
|
||||||
@if($_SERVER['QUERY_STRING'] === 'backup')
|
|
||||||
<?php //creating backup... ?>
|
|
||||||
@Push('updater-head')
|
|
||||||
<meta http-equiv="refresh" content="2; URL={{url()->current()}}/?backups" />
|
|
||||||
@endpush
|
|
||||||
<div class="logo-container fadein">
|
|
||||||
<img class="logo-img" src="{{ asset('assets/linkstack/images/logo-loading.svg') }}" alt="Logo">
|
|
||||||
</div>
|
|
||||||
<h1 class="loadingtxt">{{__('messages.Creating backup')}}</h1>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
@if($_SERVER['QUERY_STRING'] === 'backups')
|
|
||||||
<?php
|
|
||||||
try {Artisan::call('backup:clean');}
|
|
||||||
catch (exception $e) {}
|
|
||||||
Artisan::call('backup:run', ['--only-files' => true, '--disable-notifications' => true]);
|
|
||||||
$tst = base_path('backups/');
|
|
||||||
file_put_contents($tst.'CANUPDATE', '');
|
|
||||||
$URL = Route::current()->getName();
|
|
||||||
header("Location: ".$URL."?preparing");
|
|
||||||
exit(); ?>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
@if($_SERVER['QUERY_STRING'] === 'preparing')
|
|
||||||
<?php //preparing update ?>
|
|
||||||
<div class="logo-container fadein">
|
|
||||||
<img class="logo-img" src="{{ asset('assets/linkstack/images/logo-loading.svg') }}" alt="Logo">
|
|
||||||
</div>
|
|
||||||
<h1 class="loadingtxt">{{__('messages.Preparing update')}}</h1>
|
|
||||||
|
|
||||||
<?php // Get update preperation script from GitHub
|
|
||||||
try {
|
try {
|
||||||
$file = external_file_get_contents('https://pre-update.linkstack.org');
|
$isBeta = env('JOIN_BETA', false);
|
||||||
$newfile = base_path('resources/views/components/pre-update.blade.php');
|
$Vbeta = trim(Http::timeout(5)->get($betaServer . 'vbeta.json')->body());
|
||||||
file_put_contents($newfile, $file);
|
$Vbeta_git = trim(Http::timeout(5)->get($betaServer . 'version.json')->body());
|
||||||
} catch (exception $e) {}
|
$Vgit = trim(Http::timeout(5)->get($versionServer)->body());
|
||||||
?>
|
$Vlocal = trim(file_get_contents(base_path('version.json')));
|
||||||
|
} catch (Exception $e) {
|
||||||
@include('components.pre-update')
|
session(['update_error' => 'Unexpected error. ' . $e->getMessage()]);
|
||||||
|
}
|
||||||
@if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')
|
@endphp
|
||||||
<meta http-equiv="refresh" content="2; URL={{url()->current()}}/?updating-windows-bat" />
|
|
||||||
@else
|
|
||||||
<?php echo "<meta http-equiv=\"refresh\" content=\"1; " . url()->current() . "?updating\" />" ?>
|
|
||||||
@endif
|
|
||||||
@endif
|
|
||||||
|
|
||||||
@if($_SERVER['QUERY_STRING'] === 'updating' and (file_exists(base_path("backups/CANUPDATE")) or env('SKIP_UPDATE_BACKUP') == true))
|
<div class="container">
|
||||||
<?php //updating... ?>
|
@if ((auth()->user()->role == 'admin' && $Vgit > $Vlocal) || $isBeta)
|
||||||
<div class="logo-container fadein">
|
@if (empty($_SERVER['QUERY_STRING']))
|
||||||
<img class="logo-img" src="{{ asset('assets/linkstack/images/logo-loading.svg') }}" alt="Logo">
|
<div class="logo-container fadein">
|
||||||
</div>
|
<img class="logo-img" src="{{ asset('assets/linkstack/images/logo.svg') }}" alt="Logo">
|
||||||
<h1 class="loadingtxt">{{__('messages.Updating')}}</h1>
|
</div>
|
||||||
@Push('updater-head')
|
<h1>{{ __('messages.Updater') }}</h1>
|
||||||
<meta http-equiv="refresh" content="2; URL={{url()->current()}}/../updating" />
|
@if ($isBeta)
|
||||||
@endpush
|
<p>{{ __('messages.Latest beta version') }} =
|
||||||
@endif
|
{{ $Vbeta }}</p>
|
||||||
|
<p>{{ __('messages.Installed beta version') }} =
|
||||||
|
{{ file_exists(base_path('vbeta.json')) ? file_get_contents(base_path('vbeta.json')) : __('messages.none') }}
|
||||||
|
</p>
|
||||||
|
<p>{{ $Vgit > $Vlocal ? __('messages.You need to update to the latest mainline release') : __('messages.You’re running the latest mainline release') }}
|
||||||
|
</p>
|
||||||
|
@else
|
||||||
|
<a target="_blank" href="{{ $repositoryUrl }}releases">
|
||||||
|
<code style="color:#222;transform:scale(.9);">{{ $Vlocal }} -> {{ $Vgit }}</code>
|
||||||
|
</a>
|
||||||
|
<h4>{{ __('messages.update.manually') }}</h4>
|
||||||
|
@endif
|
||||||
|
<br>
|
||||||
|
<div class="row">
|
||||||
|
<a class="btn"
|
||||||
|
href="{{ url()->current() }}/?{{ env('SKIP_UPDATE_BACKUP') == true ? 'preparing' : 'backup' }}">
|
||||||
|
<button><i class="fa-solid fa-user-gear btn"></i>
|
||||||
|
{{ __('messages.Update automatically') }}</button>
|
||||||
|
</a>
|
||||||
|
<a class="btn" href="https://linkstack.org/update" target="_blank">
|
||||||
|
<button><i class="fa-solid fa-download btn"></i> {{ __('messages.Update manually') }}</button>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
@elseif($_SERVER['QUERY_STRING'] === '')
|
@if ($_SERVER['QUERY_STRING'] === 'updating')
|
||||||
<?php //if no new version available ?>
|
@php
|
||||||
|
set_time_limit(0);
|
||||||
<div class="logo-container fadein">
|
try {
|
||||||
<img class="logo-img" src="{{ asset('assets/linkstack/images/logo.svg') }}" alt="Logo">
|
// Determine the latest version and file URL
|
||||||
</div>
|
$latestVersion = $isBeta ? $Vbeta_git : $Vgit;
|
||||||
<h1>{{__('messages.No new version')}}</h1>
|
$fileUrl = $isBeta ? $betaServer . $latestVersion . '.zip' : $updateServer . $latestVersion . '.zip';
|
||||||
<h4>{{__('messages.There is no new version available')}}</h4>
|
|
||||||
<br><div class="row">
|
|
||||||
 <a class="btn" href="{{ url('dashboard') }}"><button><i class="fa-solid fa-house-laptop btn"></i> {{__('messages.Admin Panel')}}</button></a> 
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@endif
|
|
||||||
|
|
||||||
@if($_SERVER['QUERY_STRING'] === 'finishing')
|
// Download the update file
|
||||||
<?php //finishing up update ?>
|
$response = Http::timeout(120)->get($fileUrl);
|
||||||
<?php
|
|
||||||
$debug = NULL;
|
|
||||||
if(EnvEditor::getKey('APP_DEBUG') == 'false'){
|
|
||||||
if(EnvEditor::keyExists('APP_DEBUG')){EnvEditor::editKey('APP_DEBUG', 'true');}
|
|
||||||
if(EnvEditor::keyExists('APP_ENV')){EnvEditor::editKey('APP_ENV', 'local');}
|
|
||||||
if(EnvEditor::keyExists('LOG_LEVEL')){EnvEditor::editKey('LOG_LEVEL', 'debug');}
|
|
||||||
$debug = true;
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
<div class="logo-container fadein">
|
|
||||||
<img class="logo-img" src="{{ asset('assets/linkstack/images/logo-loading.svg') }}" alt="Logo">
|
|
||||||
</div>
|
|
||||||
<h1 class="loadingtxt">{{__('messages.Finishing up')}}</h1>
|
|
||||||
|
|
||||||
@include('components.finishing')
|
|
||||||
|
|
||||||
<?php EnvEditor::editKey('MAINTENANCE_MODE', false); ?>
|
|
||||||
<?php
|
|
||||||
if($debug === true){
|
|
||||||
if(EnvEditor::keyExists('APP_DEBUG')){EnvEditor::editKey('APP_DEBUG', 'false');}
|
|
||||||
if(EnvEditor::keyExists('APP_ENV')){EnvEditor::editKey('APP_ENV', 'production');}
|
|
||||||
if(EnvEditor::keyExists('LOG_LEVEL')){EnvEditor::editKey('LOG_LEVEL', 'error');}
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
|
|
||||||
<?php echo "<meta http-equiv=\"refresh\" content=\"0; " . url()->current() . "?success\" />"; ?>
|
if ($response->failed()) {
|
||||||
@endif
|
throw new Exception("HTTP request failed: {$response->status()} - {$response->body()}");
|
||||||
|
}
|
||||||
|
|
||||||
@if($_SERVER['QUERY_STRING'] === 'success')
|
// Save the downloaded ZIP file to storage
|
||||||
<?php //after successfully updating ?>
|
$zipPath = storage_path('update.zip');
|
||||||
|
$result = file_put_contents($zipPath, $response->body());
|
||||||
<div class="logo-container fadein">
|
if ($result === false) {
|
||||||
<img class="logo-img" src="{{ asset('assets/linkstack/images/logo.svg') }}" alt="Logo">
|
throw new Exception('Failed to write update.zip to storage.');
|
||||||
</div>
|
}
|
||||||
<h1>{{__('messages.Success!')}}</h1>
|
|
||||||
@if(env('JOIN_BETA') === true)
|
// Initialize the ZIP archive
|
||||||
<p><?php echo __('messages.Latest beta version')."= " . external_file_get_contents("https://beta.linkstack.org/vbeta.json"); ?></p>
|
$zip = new ZipArchive();
|
||||||
<p><?php if(file_exists(base_path("vbeta.json"))) {echo __('messages.Installed beta version')."= " . file_get_contents(base_path("vbeta.json"));} else {echo __('messages.Installed beta version')."= ".__('messages.none');} ?></p>
|
if ($zip->open($zipPath) !== true) {
|
||||||
<p><?php if($Vgit > $Vlocal) {echo __('messages.You need to update to the latest mainline release');} else {echo __("messages.You’re running the latest mainline release");} ?></p>
|
throw new Exception('Failed to open ZIP archive for extraction.');
|
||||||
@else
|
}
|
||||||
<h4>{{__('messages.The update was successful')}}</h4>
|
|
||||||
<style>.noteslink:hover{color:#006fd5;text-shadow:0px 6px 7px rgba(23,10,6,0.66);}</style>
|
// Extract the contents to the base path
|
||||||
<a class="noteslink" href="https://github.com/linkstackorg/linkstack/releases/latest" target="_blank"><i class="fa-solid fa-up-right-from-square"></i> {{__('messages.View the release notes')}}</a>
|
$extractPath = base_path();
|
||||||
<br>
|
if (!$zip->extractTo($extractPath)) {
|
||||||
|
throw new Exception('ZIP extraction failed.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$zip->close();
|
||||||
|
|
||||||
|
// Delete the ZIP file after extraction
|
||||||
|
if (!unlink($zipPath)) {
|
||||||
|
Log::warning("Failed to delete ZIP file: $zipPath");
|
||||||
|
}
|
||||||
|
} catch (Exception $e) {
|
||||||
|
session(['update_error' => 'Fatal error. ' . $e->getMessage()]);
|
||||||
|
}
|
||||||
|
@endphp
|
||||||
|
<meta http-equiv="refresh" content="0; {{ url()->current() }}/?finishing" />
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if ($_SERVER['QUERY_STRING'] === 'backup')
|
||||||
|
@push('updater-head')
|
||||||
|
<meta http-equiv="refresh" content="2; URL={{ url()->current() }}/?backups" />
|
||||||
|
@endpush
|
||||||
|
<div class="logo-container fadein">
|
||||||
|
<img class="logo-img" src="{{ asset('assets/linkstack/images/logo-loading.svg') }}" alt="Logo">
|
||||||
|
</div>
|
||||||
|
<h1 class="loadingtxt">{{ __('messages.Creating backup') }}</h1>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if ($_SERVER['QUERY_STRING'] === 'backups')
|
||||||
|
@php
|
||||||
|
set_time_limit(0);
|
||||||
|
// Test if the Artisan command is available
|
||||||
|
try {
|
||||||
|
$exitCode = Artisan::call('list');
|
||||||
|
|
||||||
|
if ($exitCode !== 0) {
|
||||||
|
session(['update_error' => "Backup creation failed. Your system doesn't support backups. Consider disabling update backups in your config. Exit code: $exitCode"]);
|
||||||
|
}
|
||||||
|
} catch (Exception $e) {
|
||||||
|
session(['update_error' => "Backup creation failed. This may indicate that your system doesn't support backups or that the process exceeded the time limit. Consider disabling update backups in your config. Exit code: " . $e->getMessage()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
Artisan::call('backup:clean', ['--disable-notifications' => true]);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
session(['update_error' => $e->getMessage()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
Artisan::call('backup:run', ['--only-files' => true, '--disable-notifications' => true]);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
session(['update_error' => $e->getMessage()]);
|
||||||
|
}
|
||||||
|
@endphp
|
||||||
|
|
||||||
|
@if (session()->has('update_error'))
|
||||||
|
<meta http-equiv="refresh" content="1; {{ url()->current() }}/?error" />
|
||||||
|
@else
|
||||||
|
@php file_put_contents(base_path('backups/CANUPDATE'), ''); @endphp
|
||||||
|
<meta http-equiv="refresh" content="1; {{ url()->current() }}?preparing" />
|
||||||
|
@endif
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if ($_SERVER['QUERY_STRING'] === 'preparing')
|
||||||
|
<div class="logo-container fadein">
|
||||||
|
<img class="logo-img" src="{{ asset('assets/linkstack/images/logo-loading.svg') }}" alt="Logo">
|
||||||
|
</div>
|
||||||
|
<h1 class="loadingtxt">{{ __('messages.Preparing update') }}</h1>
|
||||||
|
@php
|
||||||
|
set_time_limit(0);
|
||||||
|
|
||||||
|
if (file_exists(base_path() . '/storage/update.zip')) {
|
||||||
|
try {
|
||||||
|
unlink(base_path() . '/storage/update.zip');
|
||||||
|
} catch (Exception $e) {
|
||||||
|
session(['update_error' => 'File permission error. ' . $e->getMessage()]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$file = Http::timeout(10)->get($preUpdateServer)->body();
|
||||||
|
file_put_contents(base_path('resources/views/components/pre-update.blade.php'), $file);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
session(['update_error' => 'Could not prepare update. ' . $e->getMessage()]);
|
||||||
|
}
|
||||||
|
@endphp
|
||||||
|
@if (session()->has('update_error'))
|
||||||
|
<meta http-equiv="refresh" content="1; {{ url()->current() }}/?error" />
|
||||||
|
@else
|
||||||
|
@include('components.pre-update')
|
||||||
|
<meta http-equiv="refresh" content="1; {{ url()->current() }}?updating" />
|
||||||
|
@endif
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if (
|
||||||
|
$_SERVER['QUERY_STRING'] === 'updating' &&
|
||||||
|
(file_exists(base_path('backups/CANUPDATE')) || env('SKIP_UPDATE_BACKUP') == true))
|
||||||
|
<div class="logo-container fadein">
|
||||||
|
<img class="logo-img" src="{{ asset('assets/linkstack/images/logo-loading.svg') }}" alt="Logo">
|
||||||
|
</div>
|
||||||
|
<h1 class="loadingtxt">{{ __('messages.Updating') }}</h1>
|
||||||
|
@push('updater-head')
|
||||||
|
<meta http-equiv="refresh" content="2; URL={{ url()->current() }}/../updating" />
|
||||||
|
@endpush
|
||||||
|
@endif
|
||||||
|
@elseif(empty($_SERVER['QUERY_STRING']))
|
||||||
|
<div class="logo-container fadein">
|
||||||
|
<img class="logo-img" src="{{ asset('assets/linkstack/images/logo.svg') }}" alt="Logo">
|
||||||
|
</div>
|
||||||
|
<h1>{{ __('messages.No new version') }}</h1>
|
||||||
|
<h4>{{ __('messages.There is no new version available') }}</h4>
|
||||||
|
<br>
|
||||||
|
<div class="row">
|
||||||
|
<a class="btn" href="{{ url('dashboard') }}">
|
||||||
|
<button><i class="fa-solid fa-house-laptop btn"></i> {{ __('messages.Admin Panel') }}</button>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
@endif
|
@endif
|
||||||
<br><div class="row">
|
|
||||||
 <a class="btn" href="{{ url('dashboard') }}"><button><i class="fa-solid fa-house-laptop btn"></i> {{__('messages.Admin Panel')}}</button></a> 
|
|
||||||
|
|
||||||
@if(env('JOIN_BETA') === true)
|
@if ($_SERVER['QUERY_STRING'] === 'finishing')
|
||||||
 <a class="btn" href="{{url()->current()}}/"><button><i class="fa-solid fa-arrow-rotate-right btn"></i> {{__('messages.Run again')}}</button></a> 
|
@php
|
||||||
|
set_time_limit(0);
|
||||||
|
$debug = null;
|
||||||
|
if (EnvEditor::getKey('APP_DEBUG') == 'false') {
|
||||||
|
if (EnvEditor::keyExists('APP_DEBUG')) {
|
||||||
|
EnvEditor::editKey('APP_DEBUG', 'true');
|
||||||
|
}
|
||||||
|
if (EnvEditor::keyExists('APP_ENV')) {
|
||||||
|
EnvEditor::editKey('APP_ENV', 'local');
|
||||||
|
}
|
||||||
|
if (EnvEditor::keyExists('LOG_LEVEL')) {
|
||||||
|
EnvEditor::editKey('LOG_LEVEL', 'debug');
|
||||||
|
}
|
||||||
|
$debug = true;
|
||||||
|
}
|
||||||
|
@endphp
|
||||||
|
<div class="logo-container fadein">
|
||||||
|
<img class="logo-img" src="{{ asset('assets/linkstack/images/logo-loading.svg') }}" alt="Logo">
|
||||||
|
</div>
|
||||||
|
<h1 class="loadingtxt">{{ __('messages.Finishing up') }}</h1>
|
||||||
|
@include('components.finishing')
|
||||||
|
@php
|
||||||
|
EnvEditor::editKey('MAINTENANCE_MODE', false);
|
||||||
|
if ($debug === true) {
|
||||||
|
if (EnvEditor::keyExists('APP_DEBUG')) {
|
||||||
|
EnvEditor::editKey('APP_DEBUG', 'false');
|
||||||
|
}
|
||||||
|
if (EnvEditor::keyExists('APP_ENV')) {
|
||||||
|
EnvEditor::editKey('APP_ENV', 'production');
|
||||||
|
}
|
||||||
|
if (EnvEditor::keyExists('LOG_LEVEL')) {
|
||||||
|
EnvEditor::editKey('LOG_LEVEL', 'error');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@endphp
|
||||||
|
@if(!session()->has('update_error') && ($isBeta || $Vgit === $Vlocal))
|
||||||
|
<meta http-equiv="refresh" content="0; {{ url()->current() }}?success" />
|
||||||
|
@else
|
||||||
|
@php
|
||||||
|
if (!session()->has('update_error')) {
|
||||||
|
session(['update_error' => 'Update failed unexpectedly. Please try again later.']);
|
||||||
|
}
|
||||||
|
@endphp
|
||||||
|
<meta http-equiv="refresh" content="0; {{ url()->current() }}?error" />
|
||||||
|
@endif
|
||||||
@endif
|
@endif
|
||||||
</div>
|
|
||||||
|
|
||||||
@endif
|
|
||||||
|
|
||||||
@if($_SERVER['QUERY_STRING'] === 'error')
|
@if ($_SERVER['QUERY_STRING'] === 'success')
|
||||||
<?php //on error ?>
|
<div class="logo-container fadein">
|
||||||
|
<img class="logo-img" src="{{ asset('assets/linkstack/images/logo.svg') }}" alt="Logo">
|
||||||
<?php EnvEditor::editKey('MAINTENANCE_MODE', false); ?>
|
</div>
|
||||||
|
<h1>{{ __('messages.Success!') }}</h1>
|
||||||
|
@if ($isBeta)
|
||||||
|
<p>{{ __('messages.Latest beta version') }} =
|
||||||
|
{{ $Vbeta }}</p>
|
||||||
|
<p>{{ __('messages.Installed beta version') }} =
|
||||||
|
{{ file_exists(base_path('vbeta.json')) ? file_get_contents(base_path('vbeta.json')) : __('messages.none') }}
|
||||||
|
</p>
|
||||||
|
<p>{{ $Vgit > $Vlocal ? __('messages.You need to update to the latest mainline release') : __('messages.You’re running the latest mainline release') }}
|
||||||
|
</p>
|
||||||
|
@else
|
||||||
|
<h4>{{ __('messages.The update was successful') }}</h4>
|
||||||
|
<a class="noteslink" href="{{ $repositoryUrl }}releases/latest" target="_blank">
|
||||||
|
<i class="fa-solid fa-up-right-from-square"></i> {{ __('messages.View the release notes') }}
|
||||||
|
</a>
|
||||||
|
<br>
|
||||||
|
@endif
|
||||||
|
<br>
|
||||||
|
<div class="row">
|
||||||
|
<a class="btn" href="{{ url('dashboard') }}">
|
||||||
|
<button><i class="fa-solid fa-house-laptop btn"></i> {{ __('messages.Admin Panel') }}</button>
|
||||||
|
</a>
|
||||||
|
@if ($isBeta)
|
||||||
|
<a class="btn" href="{{ url()->current() }}/">
|
||||||
|
<button><i class="fa-solid fa-arrow-rotate-right btn"></i> {{ __('messages.Run again') }}</button>
|
||||||
|
</a>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
<div class="logo-container fadein">
|
@if ($_SERVER['QUERY_STRING'] === 'error')
|
||||||
<img class="logo-img" src="{{ asset('assets/linkstack/images/logo.svg') }}" alt="Logo">
|
<?php EnvEditor::editKey('MAINTENANCE_MODE', false); ?>
|
||||||
</div>
|
|
||||||
<h1>{{__('messages.Error')}}</h1>
|
|
||||||
<h4>{{__('messages.Something went wrong with the update')}} :(</h4>
|
|
||||||
<br><div class="row">
|
|
||||||
 <a class="btn" href="{{ url('dashboard') }}"><button><i class="fa-solid fa-house-laptop btn"></i> {{__('messages.Admin Panel')}}</button></a> 
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@endif
|
|
||||||
|
|
||||||
</div>
|
<div class="logo-container fadein">
|
||||||
|
<img class="logo-img" src="{{ asset('assets/linkstack/images/logo.svg') }}" alt="Logo">
|
||||||
|
</div>
|
||||||
|
<h1>{{ __('messages.Error') }}</h1>
|
||||||
|
<h4>{{ __('messages.Something went wrong with the update') }} :(</h4>
|
||||||
|
|
||||||
|
@if (session()->has('update_error'))
|
||||||
|
<div class="alert-box alert-box-error">
|
||||||
|
<strong>Error:</strong>
|
||||||
|
{{ session('update_error') }}
|
||||||
|
</div>
|
||||||
|
@php
|
||||||
|
session()->forget('update_error');
|
||||||
|
@endphp
|
||||||
|
@else
|
||||||
|
<div class="alert-box alert-box-error">
|
||||||
|
<strong>Error:</strong>
|
||||||
|
Unknown error
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
<br>
|
||||||
|
<div class="row">
|
||||||
|
 <a class="btn" href="{{ url('dashboard') }}"><button><i class="fa-solid fa-house-laptop btn"></i>
|
||||||
|
{{ __('messages.Admin Panel') }}</button></a> 
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
</div>
|
||||||
@endpush
|
@endpush
|
@ -191,38 +191,8 @@ Route::group([
|
|||||||
'linktype'=>LinkTypeController::class
|
'linktype'=>LinkTypeController::class
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
Route::get('/updating', function (\Codedge\Updater\UpdaterManager $updater) {
|
}); // End Admin authenticated routes
|
||||||
|
|
||||||
// Check if new version is available
|
|
||||||
if($updater->source()->isNewVersionAvailable() and (file_exists(base_path("backups/CANUPDATE")) or env('SKIP_UPDATE_BACKUP') == true)) {
|
|
||||||
|
|
||||||
EnvEditor::editKey('MAINTENANCE_MODE', true);
|
|
||||||
|
|
||||||
// Get the current installed version
|
|
||||||
echo $updater->source()->getVersionInstalled();
|
|
||||||
|
|
||||||
// Get the new version available
|
|
||||||
$versionAvailable = $updater->source()->getVersionAvailable();
|
|
||||||
|
|
||||||
// Create a release
|
|
||||||
$release = $updater->source()->fetch($versionAvailable);
|
|
||||||
|
|
||||||
// Run the update process
|
|
||||||
$updater->source()->update($release);
|
|
||||||
|
|
||||||
if(env('SKIP_UPDATE_BACKUP') != true) {unlink(base_path("backups/CANUPDATE"));}
|
|
||||||
|
|
||||||
echo "<meta http-equiv=\"refresh\" content=\"0; " . url()->current() . "/../update?finishing\" />";
|
|
||||||
|
|
||||||
} else {
|
|
||||||
echo "<meta http-equiv=\"refresh\" content=\"0; " . url()->current() . "/../update?error\" />";
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
}); // ENd Admin authenticated routes
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Displays Maintenance Mode page
|
// Displays Maintenance Mode page
|
||||||
|
Loading…
x
Reference in New Issue
Block a user