$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<\Database\Factories\ServiceFactory> */ 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): void { if (array_key_exists($service->name, config('core.service_units'))) { $service->unit = config('core.service_units')[$service->name][$service->server->os][$service->version]; } }); } /** * @var array */ public static array $statusColors = [ ServiceStatus::READY => 'success', ServiceStatus::INSTALLING => 'warning', ServiceStatus::INSTALLATION_FAILED => 'danger', ServiceStatus::UNINSTALLING => 'warning', ServiceStatus::FAILED => 'danger', ServiceStatus::STARTING => 'warning', ServiceStatus::STOPPING => 'warning', ServiceStatus::RESTARTING => 'warning', ServiceStatus::STOPPED => 'danger', ServiceStatus::ENABLING => 'warning', ServiceStatus::DISABLING => 'warning', ServiceStatus::DISABLED => 'gray', ]; /** * @return BelongsTo */ public function server(): BelongsTo { return $this->belongsTo(Server::class); } public function handler(): ServiceInterface|Webserver|PHP|Firewall|\App\SSH\Services\Database\Database|ProcessManager { $handler = config('core.service_handlers')[$this->name]; /** @var ServiceInterface $service */ $service = new $handler($this); return $service; } /** * @throws ServiceInstallationFailed */ public function validateInstall(string $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); } }