From 90cd2b677e696901934d9a44c7a5ab107ffd1b5f Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Sat, 26 Nov 2016 19:29:57 -0500 Subject: [PATCH] Add version checking to daemon and panel Also includes some buttons for users to get help from the panel. --- app/Console/Commands/ShowVersion.php | 3 +- app/Facades/Version.php | 35 ++++++++ app/Services/VersionService.php | 93 ++++++++++++++++++++++ config/app.php | 1 + resources/views/admin/index.blade.php | 32 ++++++-- resources/views/admin/nodes/view.blade.php | 2 +- 6 files changed, 157 insertions(+), 9 deletions(-) create mode 100644 app/Facades/Version.php create mode 100644 app/Services/VersionService.php diff --git a/app/Console/Commands/ShowVersion.php b/app/Console/Commands/ShowVersion.php index 0dcce04a1..2033f9b0f 100644 --- a/app/Console/Commands/ShowVersion.php +++ b/app/Console/Commands/ShowVersion.php @@ -24,6 +24,7 @@ namespace Pterodactyl\Console\Commands; use Illuminate\Console\Command; +use Version; class ShowVersion extends Command { @@ -58,6 +59,6 @@ class ShowVersion extends Command */ public function handle() { - $this->info('You are running Pterodactyl Panel ' . config('app.version')); + $this->info('You are running Pterodactyl Panel v' . Version::getCurrentPanel() . ' (' . ((Version::isLatestPanel()) ? 'Up to Date' : 'Latest: ' . Version::getDaemon()) . ')'); } } diff --git a/app/Facades/Version.php b/app/Facades/Version.php new file mode 100644 index 000000000..840862600 --- /dev/null +++ b/app/Facades/Version.php @@ -0,0 +1,35 @@ + + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +namespace Pterodactyl\Facades; + +use Illuminate\Support\Facades\Facade; + +class Version extends Facade +{ + + protected static function getFacadeAccessor() + { + return '\Pterodactyl\Services\VersionService'; + } +} diff --git a/app/Services/VersionService.php b/app/Services/VersionService.php new file mode 100644 index 000000000..5afb97e46 --- /dev/null +++ b/app/Services/VersionService.php @@ -0,0 +1,93 @@ + + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +namespace Pterodactyl\Services; + +use Cache; +use GuzzleHttp\Client; + +class VersionService +{ + + protected static $versions; + + /** + * Constructor + */ + public function __construct() + { + self::$versions = Cache::remember('versions', env('VERSION_CACHE_TIME', 60), function () { + $client = new Client(); + + try { + $response = $client->request('GET', env('VERSION_CHECK_URL', 'https://cdn.pterodactyl.io/releases/latest.json')); + + if ($response->getStatusCode() === 200) { + return json_decode($response->getBody()); + } else { + throw new \Exception('Invalid response code.'); + } + } catch (\Exception $ex) { + // Failed request, just return errored version. + return (object) [ + 'panel' => 'error', + 'daemon' => 'error', + ]; + } + }); + } + + public static function getPanel() + { + return self::$versions->panel; + } + + public static function getDaemon() + { + return self::$versions->daemon; + } + + public function getCurrentPanel() + { + return config('app.version'); + } + + public static function isLatestPanel() + { + if (config('app.version') === 'canary') { + return true; + } + + return (version_compare(config('app.version'), self::$versions->panel) >= 0); + } + + public static function isLatestDaemon($daemon) + { + if ($daemon === '0.0.0-canary') { + return true; + } + + return (version_compare($daemon, self::$versions->daemon) >= 0); + } + +} diff --git a/config/app.php b/config/app.php index 619e51039..a3c3ff532 100644 --- a/config/app.php +++ b/config/app.php @@ -217,6 +217,7 @@ return [ 'URL' => Illuminate\Support\Facades\URL::class, 'Uuid' => Webpatser\Uuid\Uuid::class, 'Validator' => Illuminate\Support\Facades\Validator::class, + 'Version' => Pterodactyl\Facades\Version::class, 'View' => Illuminate\Support\Facades\View::class, ], diff --git a/resources/views/admin/index.blade.php b/resources/views/admin/index.blade.php index 27e8d52e9..85ffa5708 100644 --- a/resources/views/admin/index.blade.php +++ b/resources/views/admin/index.blade.php @@ -24,13 +24,31 @@ @endsection @section('content') -
- -

Pterodactyl Admin Control Panel


-

Welcome to the most advanced, lightweight, and user-friendly open source game server control panel.

-

You are running version {{ config('app.version') }}.

+
+
+ +

Pterodactyl Admin Control Panel


+ @if (Version::isLatestPanel()) +
You are running Pterodactyl Panel version {{ Version::getCurrentPanel() }}. Your panel is up-to-date!
+ @else +
+ Your panel is not up-to-date! The latest version is {{ Version::getPanel() }} and you are currently running version {{ Version::getCurrentPanel() }}. +
+ @endif +
+
+