Skip to content

Commit 693b9ea

Browse files
committed
Fix handling of backup tasks; closes pterodactyl#2067
1 parent 364b645 commit 693b9ea

File tree

5 files changed

+35
-11
lines changed

5 files changed

+35
-11
lines changed

app/Http/Controllers/Api/Client/Servers/ScheduleTaskController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public function store(StoreTaskRequest $request, Server $server, Schedule $sched
5858
'schedule_id' => $schedule->id,
5959
'sequence_id' => ($lastTask->sequence_id ?? 0) + 1,
6060
'action' => $request->input('action'),
61-
'payload' => $request->input('payload'),
61+
'payload' => $request->input('payload') ?? '',
6262
'time_offset' => $request->input('time_offset'),
6363
]);
6464

@@ -87,7 +87,7 @@ public function update(StoreTaskRequest $request, Server $server, Schedule $sche
8787

8888
$this->repository->update($task->id, [
8989
'action' => $request->input('action'),
90-
'payload' => $request->input('payload'),
90+
'payload' => $request->input('payload') ?? '',
9191
'time_offset' => $request->input('time_offset'),
9292
]);
9393

app/Http/Requests/Api/Client/Servers/Schedules/StoreTaskRequest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public function rules(): array
2525
{
2626
return [
2727
'action' => 'required|in:command,power,backup',
28-
'payload' => 'required_unless:action,backup|string',
28+
'payload' => 'required_unless:action,backup|string|nullable',
2929
'time_offset' => 'required|numeric|min:0|max:900',
3030
'sequence_id' => 'sometimes|required|numeric|min:1',
3131
];

app/Models/Task.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class Task extends Model
9090
'schedule_id' => 'required|numeric|exists:schedules,id',
9191
'sequence_id' => 'required|numeric|min:1',
9292
'action' => 'required|string',
93-
'payload' => 'required|string',
93+
'payload' => 'required_unless:action,backup|string',
9494
'time_offset' => 'required|numeric|between:0,900',
9595
'is_queued' => 'boolean',
9696
];

resources/scripts/components/server/schedules/ScheduleTaskRow.tsx

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,26 @@ import Can from '@/components/elements/Can';
1414
import useServer from '@/plugins/useServer';
1515
import useFlash from '@/plugins/useFlash';
1616
import { ServerContext } from '@/state/server';
17+
import { faFileArchive } from '@fortawesome/free-solid-svg-icons/faFileArchive';
1718

1819
interface Props {
1920
schedule: Schedule;
2021
task: Task;
2122
}
2223

24+
const getActionDetails = (action: string): [ string, any ] => {
25+
switch (action) {
26+
case 'command':
27+
return ['Send Command', faCode];
28+
case 'power':
29+
return ['Send Power Action', faToggleOn];
30+
case 'backup':
31+
return ['Create Backup', faFileArchive];
32+
default:
33+
return ['Unknown Action', faCode];
34+
}
35+
};
36+
2337
export default ({ schedule, task }: Props) => {
2438
const { uuid } = useServer();
2539
const { clearFlashes, addError } = useFlash();
@@ -43,6 +57,8 @@ export default ({ schedule, task }: Props) => {
4357
});
4458
};
4559

60+
const [ title, icon ] = getActionDetails(task.action);
61+
4662
return (
4763
<div className={'flex items-center bg-neutral-700 border border-neutral-600 mb-2 px-6 py-4 rounded'}>
4864
<SpinnerOverlay visible={isLoading} fixed={true} size={'large'}/>
@@ -56,14 +72,19 @@ export default ({ schedule, task }: Props) => {
5672
onDismissed={() => setVisible(false)}
5773
onConfirmed={() => onConfirmDeletion()}
5874
/>
59-
<FontAwesomeIcon icon={task.action === 'command' ? faCode : faToggleOn} className={'text-lg text-white'}/>
75+
<FontAwesomeIcon icon={icon} className={'text-lg text-white'}/>
6076
<div className={'flex-1'}>
61-
<p className={'ml-6 text-neutral-300 mb-2 uppercase text-xs'}>
62-
{task.action === 'command' ? 'Send command' : 'Send power action'}
77+
<p className={'ml-6 text-neutral-300 uppercase text-xs'}>
78+
{title}
6379
</p>
64-
<code className={'ml-6 font-mono bg-neutral-800 rounded py-1 px-2 text-sm'}>
65-
{task.payload}
66-
</code>
80+
{task.payload &&
81+
<div className={'ml-6 mt-2'}>
82+
{task.action === 'backup' && <p className={'text-xs uppercase text-neutral-400 mb-1'}>Ignoring files & folders:</p>}
83+
<div className={'font-mono bg-neutral-800 rounded py-1 px-2 text-sm w-auto whitespace-pre inline-block'}>
84+
{task.payload}
85+
</div>
86+
</div>
87+
}
6788
</div>
6889
{task.sequenceId > 1 &&
6990
<div className={'mr-6'}>

resources/scripts/components/server/schedules/TaskDetailsModal.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,10 @@ const TaskDetailsForm = ({ isEditingTask }: { isEditingTask: boolean }) => {
7171
:
7272
<div>
7373
<label className={'input-dark-label'}>Ignored Files</label>
74-
<FormikFieldWrapper name={'payload'}>
74+
<FormikFieldWrapper
75+
name={'payload'}
76+
description={'Optional. Include the files and folders to be excluded in this backup. By default, the contents of your .pteroignore file will be used.'}
77+
>
7578
<FormikField as={'textarea'} name={'payload'} className={'input-dark h-32'}/>
7679
</FormikFieldWrapper>
7780
</div>

0 commit comments

Comments
 (0)