diff --git a/app/Database/migrations/2021_03_05_044305_add_kvp_table.php b/app/Database/migrations/2021_03_05_044305_add_kvp_table.php new file mode 100644 index 00000000..e7b75b6e --- /dev/null +++ b/app/Database/migrations/2021_03_05_044305_add_kvp_table.php @@ -0,0 +1,19 @@ +string('key')->index(); + $table->string('value'); + }); + } +} diff --git a/app/Database/seeds/settings.yml b/app/Database/seeds/settings.yml index 4ac3adbd..b2ba8910 100644 --- a/app/Database/seeds/settings.yml +++ b/app/Database/seeds/settings.yml @@ -361,3 +361,9 @@ options: '' type: 'text' description: 'Discord public channel ID for broadcasat notifications' +- key: 'cron.random_id' + name: 'Cron Randomized ID' + group: 'cron' + value: '' + type: 'hidden' + description: '' diff --git a/app/Exceptions/CronInvalid.php b/app/Exceptions/CronInvalid.php new file mode 100644 index 00000000..e629a379 --- /dev/null +++ b/app/Exceptions/CronInvalid.php @@ -0,0 +1,37 @@ +getMessage(); + } + + /** + * Return an array with the error details, merged with the RFC7807 response + */ + public function getErrorMetadata(): array + { + return []; + } +} diff --git a/app/Http/Controllers/Admin/MaintenanceController.php b/app/Http/Controllers/Admin/MaintenanceController.php index 3453b24b..dde5d995 100644 --- a/app/Http/Controllers/Admin/MaintenanceController.php +++ b/app/Http/Controllers/Admin/MaintenanceController.php @@ -6,6 +6,7 @@ use App\Contracts\Controller; use App\Repositories\KvpRepository; use App\Services\CronService; use App\Services\VersionService; +use App\Support\Utils; use Codedge\Updater\UpdaterManager; use Illuminate\Http\Request; use Illuminate\Support\Facades\Artisan; @@ -34,7 +35,12 @@ class MaintenanceController extends Controller public function index() { + // Get the cron URL + $cron_id = setting('cron.random_id'); + $cron_url = empty($cron_id) ? 'Not enabled' : url(route('api.maintenance.cron', $cron_id)); + return view('admin.maintenance.index', [ + 'cron_url' => $cron_url, 'cron_path' => $this->cronSvc->getCronExecString(), 'cron_problem_exists' => $this->cronSvc->cronProblemExists(), 'new_version' => $this->kvpRepo->get('new_version_available', false), @@ -117,4 +123,33 @@ class MaintenanceController extends Controller return redirect('/update/downloader'); } + + /** + * Enable the cron, or if it's enabled, change the ID that is used + * + * @param Request $request + */ + public function cron_enable(Request $request) + { + $id = Utils::generateNewId(24); + setting_save('cron.random_id', $id); + + Flash::success('Web cron refreshed!'); + return redirect(route('admin.maintenance.index')); + } + + /** + * Disable the web cron + * + * @param Request $request + * + * @return mixed + */ + public function cron_disable(Request $request) + { + setting_save('cron.random_id', ''); + + Flash::success('Web cron disabled!'); + return redirect(route('admin.maintenance.index')); + } } diff --git a/app/Http/Controllers/Admin/SettingsController.php b/app/Http/Controllers/Admin/SettingsController.php index 5f6c74a2..6371f73b 100644 --- a/app/Http/Controllers/Admin/SettingsController.php +++ b/app/Http/Controllers/Admin/SettingsController.php @@ -62,7 +62,7 @@ class SettingsController extends Controller */ public function index() { - $settings = Setting::orderBy('order', 'asc')->get(); + $settings = Setting::where('type', '!=', 'hidden')->orderBy('order')->get(); $settings = $settings->groupBy('group'); return view('admin.settings.index', [ diff --git a/app/Http/Controllers/Api/FlightController.php b/app/Http/Controllers/Api/FlightController.php index c1f186a4..7f51c399 100644 --- a/app/Http/Controllers/Api/FlightController.php +++ b/app/Http/Controllers/Api/FlightController.php @@ -4,7 +4,6 @@ namespace App\Http\Controllers\Api; use App\Contracts\Controller; use App\Exceptions\AssetNotFound; -use App\Exceptions\Unauthorized; use App\Http\Resources\Flight as FlightResource; use App\Http\Resources\Navdata as NavdataResource; use App\Models\SimBrief; diff --git a/app/Http/Controllers/Api/MaintenanceController.php b/app/Http/Controllers/Api/MaintenanceController.php new file mode 100644 index 00000000..053873eb --- /dev/null +++ b/app/Http/Controllers/Api/MaintenanceController.php @@ -0,0 +1,35 @@ + $output, + ]); + } +} diff --git a/app/Models/Kvp.php b/app/Models/Kvp.php new file mode 100644 index 00000000..f0cf43d0 --- /dev/null +++ b/app/Models/Kvp.php @@ -0,0 +1,23 @@ +name('maintenance.forcecheck')->middleware('ability:admin,maintenance'); + Route::match(['post'], 'maintenance/cron_enable', 'MaintenanceController@cron_enable') + ->name('maintenance.cron_enable')->middleware('ability:admin,maintenance'); + + Route::match(['post'], 'maintenance/cron_disable', 'MaintenanceController@cron_disable') + ->name('maintenance.cron_disable')->middleware('ability:admin,maintenance'); + // subfleet Route::get('subfleets/export', 'SubfleetController@export') ->name('subfleets.export')->middleware('ability:admin,fleet'); @@ -508,6 +514,8 @@ class RouteServiceProvider extends ServiceProvider Route::get('pireps/{pirep_id}', 'PirepController@get'); Route::get('pireps/{pirep_id}/acars/geojson', 'AcarsController@acars_geojson'); + Route::get('cron/{id}', 'MaintenanceController@cron')->name('maintenance.cron'); + Route::get('news', 'NewsController@index'); Route::get('status', 'StatusController@status'); Route::get('version', 'StatusController@status'); diff --git a/resources/views/admin/maintenance/cron.blade.php b/resources/views/admin/maintenance/cron.blade.php index 1244fdfb..e80065af 100644 --- a/resources/views/admin/maintenance/cron.blade.php +++ b/resources/views/admin/maintenance/cron.blade.php @@ -6,7 +6,8 @@
A cron must be created that runs every minute calling artisan. Example:
+A cron must be created that runs every minute calling artisan. An example is below. + See the docs
@@ -20,6 +21,45 @@ @endif+ If you don't have cron access on your server, you can use a web-cron service to + access this URL every minute. Keep it disabled if you're not using it. It's a + unique ID that can be reset/changed if needed for security. +
+| + {{ Form::open(['url' => route('admin.maintenance.cron_enable'), + 'method' => 'post']) }} + {{ Form::button('Enable/Change ID', ['type' => 'submit', 'class' => 'btn btn-success']) }} + {{ Form::close() }} + | ++ {{ Form::open(['url' => route('admin.maintenance.cron_disable'), + 'method' => 'post']) }} + {{ Form::button('Disable', ['type' => 'submit', 'class' => 'btn btn-warning']) }} + {{ Form::close() }} + | +