Show a message about setting up the cron and if there was an error running it (#425)

This commit is contained in:
Nabeel S 2019-10-30 09:55:32 -04:00 committed by GitHub
parent ec4f10d43a
commit a45770732a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 134 additions and 3 deletions

View File

@ -6,11 +6,22 @@ use App\Console\Cron\Hourly;
use App\Console\Cron\Monthly;
use App\Console\Cron\Nightly;
use App\Console\Cron\Weekly;
use App\Services\CronService;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
private $cronSvc;
public function __construct(Application $app, Dispatcher $events)
{
parent::__construct($app, $events);
$this->cronSvc = app(CronService::class);
}
/**
* Define the application's command schedule.
*
@ -28,6 +39,9 @@ class Kernel extends ConsoleKernel
// When spatie-backups runs
$schedule->command('backup:clean')->daily()->at('01:00');
$schedule->command('backup:run')->daily()->at('02:00');
// Update the last time the cron was run
$this->cronSvc->updateLastRunTime();
}
/**

View File

@ -3,19 +3,33 @@
namespace App\Http\Controllers\Admin;
use App\Contracts\Controller;
use App\Services\CronService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan;
use Laracasts\Flash\Flash;
class MaintenanceController extends Controller
{
public function __construct()
private $cronSvc;
public function __construct(CronService $cronSvc)
{
$this->cronSvc = $cronSvc;
}
public function index()
{
return view('admin.maintenance.index');
// Generate the cron path. Replace php-fpm with just php
$cron_path = [
'* * * * *',
$this->cronSvc->getCronPath(),
'>> /dev/null 2>&1',
];
return view('admin.maintenance.index', [
'cron_path' => implode(' ', $cron_path),
'cron_problem_exists' => $this->cronSvc->cronProblemExists(),
]);
}
/**

View File

@ -0,0 +1,73 @@
<?php
namespace App\Services;
use App\Contracts\Service;
use App\Repositories\KvpRepository;
use DateTime;
use DateTimeZone;
use Exception;
use Illuminate\Support\Facades\Log;
class CronService extends Service
{
private $kvpRepo;
public function __construct(
KvpRepository $kvpRepo
) {
$this->kvpRepo = $kvpRepo;
}
/**
* Get the path for running a cron job
*
* @return string
*/
public function getCronPath(): string
{
$path = [
'cd '.base_path(),
'&&',
str_replace('-fpm', '', PHP_BINARY),
'artisan schedule:run',
];
return implode(' ', $path);
}
/**
* Update the last time the cron was run in the kvp repo
*/
public function updateLastRunTime()
{
$dt = new DateTime('now', DateTimeZone::UTC);
$this->kvpRepo->save('cron_last_run', $dt->format(DateTime::ISO8601));
}
/**
* True/false if there's a problem with the cron. Now this is mainly
* if the cron hasn't run in the last 5 minutes at least
*
* @return bool
*/
public function cronProblemExists(): bool
{
$last_run = $this->kvpRepo->get('cron_last_run');
if (empty($last_run)) {
return true;
}
try {
$dt = DateTime::createFromFormat(DateTime::ISO8601, $last_run);
$dt_now = new DateTime('now', DateTimeZone::UTC);
} catch (Exception $e) {
Log::error('Error checking for cron problem: '.$e->getMessage());
return true;
}
// More than 5 minutes... there's a problem
$diff = $dt_now->diff($dt);
return $diff->i > 5;
}
}

View File

@ -4,7 +4,7 @@
<h6><i class="fas fa-clock"></i>
&nbsp;Reset Caches
</h6>
<div class="row">
<div class="row" style="padding-top: 5px">
<div class="col-sm-4 text-center">
{{ Form::open(['route' => 'admin.maintenance.cache']) }}
{{ Form::hidden('type', 'all') }}

View File

@ -0,0 +1,24 @@
<div class="row">
<div class="col-sm-12">
<div class="form-container">
<h6><i class="fas fa-clock"></i>
&nbsp;Cron
</h6>
<div class="row" style="padding-top: 5px">
<div class="col-sm-12">
<p>A cron must be created that runs every minute calling artisan. Example:</p>
<label style="width: 100%">
<input type="text" value="{{ $cron_path }}" class="form-control" style="width: 100%"/>
</label>
@if($cron_problem_exists)
<div class="alert alert-danger" role="alert">
There was a problem running the cron; make sure it's setup and check logs at
<span class="text-monospace bg-gradient-dark">storage/logs/cron.log</span>
</div>
@endif
</div>
</div>
</div>
</div>
</div>

View File

@ -4,6 +4,12 @@
@section('content')
@include('flash::message')
<div class="card border-blue-bottom">
<div class="content">
@include('admin.maintenance.cron')
</div>
</div>
<div class="card border-blue-bottom">
<div class="content">
@include('admin.maintenance.caches')