
- Added a new job, ServerPatchCheckJob, to handle server patch checks and notifications. - Introduced a new notification class, ServerPatchCheck, for sending updates via email, Discord, Slack, Pushover, and Telegram. - Updated notification settings models to include server patch notification options for email, Discord, Slack, Pushover, and Telegram. - Created a migration to add server patch notification fields to the respective settings tables. - Enhanced the UI to allow users to enable/disable server patch notifications across different channels.
122 lines
7.9 KiB
PHP
122 lines
7.9 KiB
PHP
<div>
|
|
<x-slot:title>
|
|
{{ data_get_str($server, 'name')->limit(10) }} > Security | Coolify
|
|
</x-slot>
|
|
<x-server.navbar :server="$server" />
|
|
<x-slide-over closeWithX fullScreen @startupdate.window="slideOverOpen = true">
|
|
<x-slot:title>Updating Packages</x-slot:title>
|
|
<x-slot:content>
|
|
<livewire:activity-monitor header="Logs" />
|
|
</x-slot:content>
|
|
</x-slide-over>
|
|
|
|
<div x-data="{ activeTab: window.location.hash ? window.location.hash.substring(1) : 'general' }" class="flex flex-col h-full gap-8 sm:flex-row">
|
|
<x-server.sidebar-security :server="$server" :parameters="$parameters" />
|
|
<form wire:submit='submit' class="w-full">
|
|
<div>
|
|
<div class="flex items-center gap-2 flex-row">
|
|
<h2>Server Patching</h2>
|
|
<span class="text-xs text-neutral-500">(experimental)</span>
|
|
<x-helper
|
|
helper="Only available for apt, dnf and zypper package managers atm, more coming
|
|
soon. <br/> Also scheduled patching and notifications are coming soon..." />
|
|
<x-forms.button type="button" wire:click="$dispatch('checkForUpdatesDispatch')">
|
|
Check Now</x-forms.button>
|
|
</div>
|
|
<div>Update your servers semi-automatically.</div>
|
|
<div>
|
|
<div class="flex flex-col gap-6 pt-4">
|
|
<div class="flex flex-col">
|
|
<div>
|
|
<div wire:target="checkForUpdates" wire:loading>
|
|
Checking for updates. It may take a few minutes. <x-loading />
|
|
</div>
|
|
@if ($error)
|
|
<div class="text-red-500">{{ $error }}</div>
|
|
@else
|
|
@if ($totalUpdates === 0)
|
|
<div class="text-green-500">Your server is up to date.</div>
|
|
@endif
|
|
@if (isset($updates) && count($updates) > 0)
|
|
<div class="pb-2">
|
|
<x-modal-confirmation title="Confirm package update?"
|
|
buttonTitle="Update All
|
|
Packages"
|
|
isHighlightedButton submitAction="updateAllPackages" dispatchAction
|
|
:actions="[
|
|
'All packages will be updated to the latest version.',
|
|
'This action could restart your currently running containers if docker will be updated.',
|
|
]" confirmationText="Update All Packages"
|
|
confirmationLabel="Please confirm the execution of the actions by entering the name below"
|
|
shortConfirmationLabel="Name" :confirmWithPassword=false
|
|
step2ButtonText="Update All
|
|
Packages" />
|
|
</div>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Package</th>
|
|
@if ($packageManager !== 'dnf')
|
|
<th>Current Version</th>
|
|
@endif
|
|
<th>New Version</th>
|
|
<th>Action</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@foreach ($updates as $update)
|
|
<tr>
|
|
<td class="inline-flex gap-2 justify-center items-center">
|
|
@if (data_get_str($update, 'package')->contains('docker') || data_get_str($update, 'package')->contains('kernel'))
|
|
<x-helper :helper="'This package will restart your currently running containers'">
|
|
<x-slot:icon>
|
|
<svg class="w-4 h-4 text-red-500 block"
|
|
viewBox="0 0 256 256"
|
|
xmlns="http://www.w3.org/2000/svg">
|
|
<path fill="currentColor"
|
|
d="M240.26 186.1L152.81 34.23a28.74 28.74 0 0 0-49.62 0L15.74 186.1a27.45 27.45 0 0 0 0 27.71A28.31 28.31 0 0 0 40.55 228h174.9a28.31 28.31 0 0 0 24.79-14.19a27.45 27.45 0 0 0 .02-27.71m-20.8 15.7a4.46 4.46 0 0 1-4 2.2H40.55a4.46 4.46 0 0 1-4-2.2a3.56 3.56 0 0 1 0-3.73L124 46.2a4.77 4.77 0 0 1 8 0l87.44 151.87a3.56 3.56 0 0 1 .02 3.73M116 136v-32a12 12 0 0 1 24 0v32a12 12 0 0 1-24 0m28 40a16 16 0 1 1-16-16a16 16 0 0 1 16 16">
|
|
</path>
|
|
</svg>
|
|
</x-slot:icon>
|
|
</x-helper>
|
|
@endif
|
|
{{ data_get($update, 'package') }}
|
|
</td>
|
|
@if ($packageManager !== 'dnf')
|
|
<td>{{ data_get($update, 'current_version') }}</td>
|
|
@endif
|
|
<td>{{ data_get($update, 'new_version') }}</td>
|
|
<td>
|
|
<x-forms.button type="button"
|
|
wire:click="$dispatch('updatePackage', { package: '{{ data_get($update, 'package') }}' })">Update</x-forms.button>
|
|
</td>
|
|
</tr>
|
|
@endforeach
|
|
</tbody>
|
|
</table>
|
|
@endif
|
|
@endif
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
@script
|
|
<script>
|
|
$wire.on('updateAllPackages', () => {
|
|
window.dispatchEvent(new CustomEvent('startupdate'));
|
|
$wire.$call('updateAllPackages');
|
|
});
|
|
$wire.on('updatePackage', (data) => {
|
|
window.dispatchEvent(new CustomEvent('startupdate'));
|
|
$wire.$call('updatePackage', data.package);
|
|
});
|
|
$wire.on('checkForUpdatesDispatch', () => {
|
|
$wire.$call('checkForUpdates');
|
|
});
|
|
</script>
|
|
@endscript
|
|
</div>
|