vito/app/Models/Service.php
2024-03-27 11:41:29 +01:00

110 lines
2.8 KiB
PHP
Executable File

<?php
namespace App\Models;
use App\Actions\Service\Manage;
use App\Exceptions\ServiceInstallationFailed;
use App\SSH\Services\AddOnServices\AbstractAddOnService;
use App\SSH\Services\Database\Database as DatabaseHandler;
use App\SSH\Services\Firewall\Firewall as FirewallHandler;
use App\SSH\Services\PHP\PHP as PHPHandler;
use App\SSH\Services\ProcessManager\ProcessManager as ProcessManagerHandler;
use App\SSH\Services\Redis\Redis as RedisHandler;
use App\SSH\Services\Webserver\Webserver as WebserverHandler;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Str;
/**
* @property int $server_id
* @property string $type
* @property array $type_data
* @property string $name
* @property string $version
* @property string $unit
* @property string $logs
* @property string $status
* @property bool $is_default
* @property Server $server
*/
class Service extends AbstractModel
{
use HasFactory;
protected $fillable = [
'server_id',
'type',
'type_data',
'name',
'version',
'unit',
'logs',
'status',
'is_default',
];
protected $casts = [
'server_id' => 'integer',
'type_data' => 'json',
'is_default' => 'boolean',
];
public static function boot(): void
{
parent::boot();
static::creating(function (Service $service) {
if (array_key_exists($service->name, config('core.service_units'))) {
$service->unit = config('core.service_units')[$service->name][$service->server->os][$service->version];
}
});
}
public function server(): BelongsTo
{
return $this->belongsTo(Server::class);
}
public function handler(
): PHPHandler|WebserverHandler|DatabaseHandler|FirewallHandler|ProcessManagerHandler|RedisHandler|AbstractAddOnService {
$handler = config('core.service_handlers')[$this->name];
return new $handler($this);
}
/**
* @throws ServiceInstallationFailed
*/
public function validateInstall($result): void
{
if (! Str::contains($result, 'Active: active')) {
throw new ServiceInstallationFailed();
}
}
public function start(): void
{
$this->unit && app(Manage::class)->start($this);
}
public function stop(): void
{
$this->unit && app(Manage::class)->stop($this);
}
public function restart(): void
{
$this->unit && app(Manage::class)->restart($this);
}
public function enable(): void
{
$this->unit && app(Manage::class)->enable($this);
}
public function disable(): void
{
$this->unit && app(Manage::class)->disable($this);
}
}