mirror of
https://github.com/stefanpejcic/openpanel
synced 2025-06-26 18:28:26 +00:00
1046 lines
43 KiB
HTML
1046 lines
43 KiB
HTML
{% extends 'base.html' %}
|
|
|
|
{% block content %}
|
|
|
|
{% if view_mode == 'table' %}
|
|
|
|
|
|
|
|
<style>
|
|
thead {
|
|
border: 1px solid rgb(90 86 86 / 11%);
|
|
}
|
|
th {
|
|
text-transform: uppercase;
|
|
font-weight: 400;
|
|
|
|
}
|
|
</style>
|
|
|
|
<p>{{ _('A cron job is a Linux command used to schedule tasks for future execution. It allows you to automate repetitive tasks, such as sending notifications or running scripts at specific intervals.') }}</p>
|
|
|
|
<div class="collapse mb-2
|
|
{% if not cronjobs_with_line_numbers %}show{% endif %}" id="collapseExample">
|
|
<div class="card card-body">
|
|
<div class="container">
|
|
<a href="#" class="nije-link" id="cancelLink" style="display: none;"><i class="bi bi-x-lg" style="right: 15px;top: 15px;position: absolute;color: black;padding: 6px 10px;border-radius: 50px;"></i></a>
|
|
|
|
<div class="row mt-4">
|
|
<div class="col-md-8">
|
|
<h4>{{ _('Add New Cron Job') }}</h4>
|
|
<select id="common_options" onchange="select_common_option()" class="form-select">
|
|
<option value="--">
|
|
{{ _('-- Common Settings --') }}
|
|
</option>
|
|
<option value="* * * * *">
|
|
{{ _('Once Per Minute') }}(* * * * *)
|
|
</option>
|
|
<option value="*/5 * * * *">
|
|
{{ _('Once Per Five Minutes') }}(*/5 * * * *)
|
|
</option>
|
|
<option value="0,30 * * * *">
|
|
{{ _('Twice Per Hour') }}(0,30 * * * *)
|
|
</option>
|
|
<option value="0 * * * *">
|
|
{{ _('Once Per Hour') }}(0 * * * *)
|
|
</option>
|
|
<option value="0 0,12 * * *">
|
|
{{ _('Twice Per Day') }}(0 0,12 * * *)
|
|
</option>
|
|
<option value="0 0 * * *">
|
|
{{ _('Once Per Day') }}(0 0 * * *)
|
|
</option>
|
|
<option value="0 0 * * 0">
|
|
{{ _('Once Per Week') }}(0 0 * * 0)
|
|
</option>
|
|
<option value="0 0 1,15 * *">
|
|
{{ _('On the 1st and 15th of the Month') }}(0 0 1,15 * *)
|
|
</option>
|
|
<option value="0 0 1 * *">
|
|
{{ _('Once Per Month') }}(0 0 1 * *)
|
|
</option>
|
|
<option value="0 0 1 1 *">
|
|
{{ _('Once Per Year') }}(0 0 1 1 *)
|
|
</option>
|
|
</select>
|
|
<form id="cronForm" action="{{ url_for('save_cronjob') }}" method="post" data-parsley-validate="" novalidate="">
|
|
<div class="form-group row">
|
|
<div class="col">
|
|
<label for="minute">{{ _('Minute:') }}</label>
|
|
<input type="text" class="form-control" id="minute" name="minute" placeholder="0-59">
|
|
</div>
|
|
<div class="col">
|
|
<label for="minute-settings">{{ _('Common Settings:') }}</label>
|
|
<select id="minute_options" class="form-select" onchange="update_minute_field()">
|
|
|
|
<option value="">
|
|
{{ _('-- Common Settings --') }}
|
|
</option>
|
|
<option value="*">
|
|
{{ _('Once Per Minute') }}(*)
|
|
</option>
|
|
<option value="*/2">
|
|
{{ _('Once Per Two Minutes') }}(*/2)
|
|
</option>
|
|
<option value="*/5">
|
|
{{ _('Once Per Five Minutes') }}(*/5)
|
|
</option>
|
|
<option value="*/10">
|
|
{{ _('Once Per Ten Minutes') }}(*/10)
|
|
</option>
|
|
<option value="*/15">
|
|
{{ _('Once Per Fifteen Minutes') }}(*/15)
|
|
</option>
|
|
<option value="0,30">
|
|
{{ _('Once Per Thirty Minutes') }}(0,30)
|
|
</option>
|
|
<option disabled value="">
|
|
{{ _('-- Minutes --') }}
|
|
</option>
|
|
<option value="0">
|
|
:00 ({{ _('At the beginning of the hour.') }}) (0)
|
|
</option>
|
|
<option value="1">
|
|
:01 (1)
|
|
</option>
|
|
<option value="2">
|
|
:02 (2)
|
|
</option>
|
|
<option value="3">
|
|
:03 (3)
|
|
</option>
|
|
<option value="4">
|
|
:04 (4)
|
|
</option>
|
|
<option value="5">
|
|
:05 (5)
|
|
</option>
|
|
<option value="6">
|
|
:06 (6)
|
|
</option>
|
|
<option value="7">
|
|
:07 (7)
|
|
</option>
|
|
<option value="8">
|
|
:08 (8)
|
|
</option>
|
|
<option value="9">
|
|
:09 (9)
|
|
</option>
|
|
<option value="10">
|
|
:10 (10)
|
|
</option>
|
|
<option value="11">
|
|
:11 (11)
|
|
</option>
|
|
<option value="12">
|
|
:12 (12)
|
|
</option>
|
|
<option value="13">
|
|
:13 (13)
|
|
</option>
|
|
<option value="14">
|
|
:14 (14)
|
|
</option>
|
|
<option value="15">
|
|
:15 ({{ _('At one quarter past the hour.') }}) (15)
|
|
</option>
|
|
<option value="16">
|
|
:16 (16)
|
|
</option>
|
|
<option value="17">
|
|
:17 (17)
|
|
</option>
|
|
<option value="18">
|
|
:18 (18)
|
|
</option>
|
|
<option value="19">
|
|
:19 (19)
|
|
</option>
|
|
<option value="20">
|
|
:20 (20)
|
|
</option>
|
|
<option value="21">
|
|
:21 (21)
|
|
</option>
|
|
<option value="22">
|
|
:22 (22)
|
|
</option>
|
|
<option value="23">
|
|
:23 (23)
|
|
</option>
|
|
<option value="24">
|
|
:24 (24)
|
|
</option>
|
|
<option value="25">
|
|
:25 (25)
|
|
</option>
|
|
<option value="26">
|
|
:26 (26)
|
|
</option>
|
|
<option value="27">
|
|
:27 (27)
|
|
</option>
|
|
<option value="28">
|
|
:28 (28)
|
|
</option>
|
|
<option value="29">
|
|
:29 (29)
|
|
</option>
|
|
<option value="30">
|
|
:30 ({{ _('At half past the hour.') }}) (30)
|
|
</option>
|
|
<option value="31">
|
|
:31 (31)
|
|
</option>
|
|
<option value="32">
|
|
:32 (32)
|
|
</option>
|
|
<option value="33">
|
|
:33 (33)
|
|
</option>
|
|
<option value="34">
|
|
:34 (34)
|
|
</option>
|
|
<option value="35">
|
|
:35 (35)
|
|
</option>
|
|
<option value="36">
|
|
:36 (36)
|
|
</option>
|
|
<option value="37">
|
|
:37 (37)
|
|
</option>
|
|
<option value="38">
|
|
:38 (38)
|
|
</option>
|
|
<option value="39">
|
|
:39 (39)
|
|
</option>
|
|
<option value="40">
|
|
:40 (40)
|
|
</option>
|
|
<option value="41">
|
|
:41 (41)
|
|
</option>
|
|
<option value="42">
|
|
:42 (42)
|
|
</option>
|
|
<option value="43">
|
|
:43 (43)
|
|
</option>
|
|
<option value="44">
|
|
:44 (44)
|
|
</option>
|
|
<option value="45">
|
|
:45 ({{ _('At one quarter until the hour.') }}) (45)
|
|
</option>
|
|
<option value="46">
|
|
:46 (46)
|
|
</option>
|
|
<option value="47">
|
|
:47 (47)
|
|
</option>
|
|
<option value="48">
|
|
:48 (48)
|
|
</option>
|
|
<option value="49">
|
|
:49 (49)
|
|
</option>
|
|
<option value="50">
|
|
:50 (50)
|
|
</option>
|
|
<option value="51">
|
|
:51 (51)
|
|
</option>
|
|
<option value="52">
|
|
:52 (52)
|
|
</option>
|
|
<option value="53">
|
|
:53 (53)
|
|
</option>
|
|
<option value="54">
|
|
:54 (54)
|
|
</option>
|
|
<option value="55">
|
|
:55 (55)
|
|
</option>
|
|
<option value="56">
|
|
:56 (56)
|
|
</option>
|
|
<option value="57">
|
|
:57 (57)
|
|
</option>
|
|
<option value="58">
|
|
:58 (58)
|
|
</option>
|
|
<option value="59">
|
|
:59 (59)
|
|
</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div class="form-group row">
|
|
<div class="col">
|
|
<label for="hour">{{ _('Hour:') }}</label>
|
|
<input type="text" class="form-control" id="hour" name="hour" placeholder="0-23">
|
|
</div>
|
|
<div class="col">
|
|
<label for="hour-settings">{{ _('Common Settings:') }}</label>
|
|
<select id="hour_options" class="form-select" onchange="update_hour_field()">
|
|
<option value="">{{ _('-- Common Settings --') }}</option>
|
|
<option value="*">{{ _('Every Hour') }} (*)</option>
|
|
<option value="*/2">{{ _('Every Other Hour') }} (*/2)</option>
|
|
<option value="*/3">{{ _('Every Third Hour') }} (*/3)</option>
|
|
<option value="*/4">{{ _('Every Fourth Hour') }} (*/4)</option>
|
|
<option value="*/6">{{ _('Every Sixth Hour') }}(*/6)</option>
|
|
<option value="0,12">{{ _('Every Twelve Hours') }}(0,12)</option>
|
|
<option disabled value="--">{{ _('-- Hours --') }}</option>
|
|
<option value="0">12:00 {{ _('a.m.Midnight') }} (0)</option>
|
|
<option value="1">1:00 {{ _('a.m.') }} (1)</option>
|
|
<option value="2">2:00 {{ _('a.m.') }} (2)</option>
|
|
<option value="3">3:00 {{ _('a.m.') }} (3)</option>
|
|
<option value="4">4:00 {{ _('a.m.') }} (4)</option>
|
|
<option value="5">5:00 {{ _('a.m.') }} (5)</option>
|
|
<option value="6">6:00 {{ _('a.m.') }} (6)</option>
|
|
<option value="7">7:00 {{ _('a.m.') }} (7)</option>
|
|
<option value="8">8:00 {{ _('a.m.') }} (8)</option>
|
|
<option value="9">9:00 {{ _('a.m.') }} (9)</option>
|
|
<option value="10">10:00 {{ _('a.m.') }} (10)</option>
|
|
<option value="11">11:00 {{ _('a.m.') }} (11)</option>
|
|
<option value="12">12:00 {{ _('p.m.Noon') }} (12)</option>
|
|
<option value="13">1:00 {{ _('p.m.') }} (13)</option>
|
|
<option value="14">2:00 {{ _('p.m.') }} (14)</option>
|
|
<option value="15">3:00 {{ _('p.m.') }} (15)</option>
|
|
<option value="16">4:00 {{ _('p.m.') }} (16)</option>
|
|
<option value="17">5:00 {{ _('p.m.') }} (17)</option>
|
|
<option value="18">6:00 {{ _('p.m.') }} (18)</option>
|
|
<option value="19">7:00 {{ _('p.m.') }} (19)</option>
|
|
<option value="20">8:00 {{ _('p.m.') }} (20)</option>
|
|
<option value="21">9:00 {{ _('p.m.') }} (21)</option>
|
|
<option value="22">10:00 {{ _('p.m.') }} (22)</option>
|
|
<option value="23">11:00 {{ _('p.m.') }} (23)</option>
|
|
</select>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
<div class="form-group row">
|
|
<div class="col">
|
|
<label for="day">{{ _('Day:') }}</label>
|
|
<input type="text" class="form-control" id="day" name="day" placeholder="1-31">
|
|
</div>
|
|
<div class="col">
|
|
<label for="day-settings">{{ _('Common Settings:') }}</label>
|
|
<select id="day_options" class="form-select" onchange="update_day_field()">
|
|
<option value="">
|
|
--
|
|
{{ _('Common Settings') }}
|
|
--
|
|
</option>
|
|
<option value="*">
|
|
{{ _('Every Day') }}
|
|
(*)
|
|
</option>
|
|
<option value="*/2">
|
|
{{ _('Every Other Day') }}
|
|
(*/2)
|
|
</option>
|
|
<option value="1,15">
|
|
{{ _('On the 1st and 15th of the Month') }}
|
|
(1,15)
|
|
</option>
|
|
<option disabled value="">
|
|
-- {{ _('Days') }} --
|
|
</option>
|
|
<option value="1">
|
|
1st (1)
|
|
</option>
|
|
<option value="2">
|
|
2nd (2)
|
|
</option>
|
|
<option value="3">
|
|
3rd (3)
|
|
</option>
|
|
<option value="4">
|
|
4th (4)
|
|
</option>
|
|
<option value="5">
|
|
5th (5)
|
|
</option>
|
|
<option value="6">
|
|
6th (6)
|
|
</option>
|
|
<option value="7">
|
|
7th (7)
|
|
</option>
|
|
<option value="8">
|
|
8th (8)
|
|
</option>
|
|
<option value="9">
|
|
9th (9)
|
|
</option>
|
|
<option value="10">
|
|
10th (10)
|
|
</option>
|
|
<option value="11">
|
|
11th (11)
|
|
</option>
|
|
<option value="12">
|
|
12th (12)
|
|
</option>
|
|
<option value="13">
|
|
13th (13)
|
|
</option>
|
|
<option value="14">
|
|
14th (14)
|
|
</option>
|
|
<option value="15">
|
|
15th (15)
|
|
</option>
|
|
<option value="16">
|
|
16th (16)
|
|
</option>
|
|
<option value="17">
|
|
17th (17)
|
|
</option>
|
|
<option value="18">
|
|
18th (18)
|
|
</option>
|
|
<option value="19">
|
|
19th (19)
|
|
</option>
|
|
<option value="20">
|
|
20th (20)
|
|
</option>
|
|
<option value="21">
|
|
21st (21)
|
|
</option>
|
|
<option value="22">
|
|
22nd (22)
|
|
</option>
|
|
<option value="23">
|
|
23rd (23)
|
|
</option>
|
|
<option value="24">
|
|
24th (24)
|
|
</option>
|
|
<option value="25">
|
|
25th (25)
|
|
</option>
|
|
<option value="26">
|
|
26th (26)
|
|
</option>
|
|
<option value="27">
|
|
27th (27)
|
|
</option>
|
|
<option value="28">
|
|
28th (28)
|
|
</option>
|
|
<option value="29">
|
|
29th (29)
|
|
</option>
|
|
<option value="30">
|
|
30th (30)
|
|
</option>
|
|
<option value="31">
|
|
31st (31)
|
|
</option>
|
|
</select>
|
|
|
|
</div>
|
|
</div>
|
|
<div class="form-group row">
|
|
<div class="col">
|
|
<label for="month">{{ _('Month:') }}</label>
|
|
<input type="text" class="form-control" id="month" name="month" placeholder="1-12"> </div>
|
|
<div class="col">
|
|
<label for="month-settings">{{ _('Common Settings:') }}</label>
|
|
<select id="month_options" class="form-select" onchange="update_month_field()">
|
|
<option value="">
|
|
-- {{ _('Common Settings') }} --
|
|
</option>
|
|
<option value="*">
|
|
{{ _('Every Month') }}
|
|
(*)
|
|
</option>
|
|
<option value="*/2">
|
|
{{ _('Every Other Month') }}
|
|
(*/2)
|
|
</option>
|
|
<option value="*/4">
|
|
{{ _('Every Third Month') }}
|
|
(*/4)
|
|
</option>
|
|
<option value="1,7">
|
|
{{ _('Every Six Months') }}
|
|
(1,7)
|
|
</option>
|
|
<option disabled value="">
|
|
-- {{ _('Months') }} --
|
|
</option>
|
|
<option value="1">
|
|
{{ _('January') }}
|
|
(1)
|
|
</option>
|
|
<option value="2">
|
|
{{ _('February') }}
|
|
(2)
|
|
</option>
|
|
<option value="3">
|
|
{{ _('March') }}
|
|
(3)
|
|
</option>
|
|
<option value="4">
|
|
{{ _('April') }}
|
|
(4)
|
|
</option>
|
|
<option value="5">
|
|
{{ _('May') }}
|
|
(5)
|
|
</option>
|
|
<option value="6">
|
|
{{ _('June') }}
|
|
(6)
|
|
</option>
|
|
<option value="7">
|
|
{{ _('July') }}
|
|
(7)
|
|
</option>
|
|
<option value="8">
|
|
{{ _('August') }}
|
|
(8)
|
|
</option>
|
|
<option value="9">
|
|
{{ _('September') }}
|
|
(9)
|
|
</option>
|
|
<option value="10">
|
|
{{ _('October') }}
|
|
(10)
|
|
</option>
|
|
<option value="11">
|
|
{{ _('November') }}
|
|
(11)
|
|
</option>
|
|
<option value="12">
|
|
{{ _('December') }}
|
|
(12)
|
|
</option>
|
|
</select>
|
|
|
|
</div>
|
|
</div>
|
|
<div class="form-group row">
|
|
<div class="col">
|
|
<label for="weekday">{{ _('Weekday:') }}</label>
|
|
<input type="text" class="form-control" id="weekday" name="weekday" placeholder="0-6 (Sunday to Saturday)">
|
|
</div>
|
|
<div class="col">
|
|
<label for="weekday-settings">{{ _('Common Settings:') }}</label>
|
|
<select id="weekday_options" class="form-select" onchange="update_weekday_field()">
|
|
<option value="">{{ _('-- Common Settings --') }}</option>
|
|
<option value="*">{{ _('Every Day (*)') }}</option>
|
|
<option value="1-5">{{ _('Every Weekday') }} (1-5) </option>
|
|
<option value="0,6">{{ _('Every Weekend Day') }} (6,0) </option>
|
|
<option value="1,3,5">{{ _('Every Monday, Wednesday, and Friday') }} (1,3,5) </option>
|
|
<option value="2,4">{{ _('Every Tuesday and Thursday') }} (2,4) </option>
|
|
<option disabled value="">{{ _(' -- Weekdays --') }}</option>
|
|
<option value="0">{{ _('Sunday') }} (0)</option>
|
|
<option value="1">{{ _('Monday') }} (1) </option>
|
|
<option value="2">{{ _('Tuesday') }} (2) </option>
|
|
<option value="3">{{ _('Wednesday') }} (3) </option>
|
|
<option value="4">{{ _('Thursday ') }}(4)</option>
|
|
<option value="5">{{ _('Friday') }} (5)</option>
|
|
<option value="6">{{ _('Saturday') }} (6)</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div class="form-group row">
|
|
<label for="command">{{ _('Command:') }}</label><br>
|
|
|
|
</div>
|
|
<div class="input-group mb-3">
|
|
<input type="text" class="form-control" id="command" name="command" placeholder="php /home/{{current_username}}/path/to/cron/script"> <div class="input-group-append">
|
|
<button type="button" class="btn btn-primary" onclick="mergeAndSubmit()">{{ _('Schedule CronJob') }}</button>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
function update_minute_field() {
|
|
const minuteSelect = document.getElementById("minute_options");
|
|
const minuteField = document.getElementById("minute");
|
|
minuteField.value = minuteSelect.value;
|
|
}
|
|
|
|
function update_hour_field() {
|
|
const hourSelect = document.getElementById("hour_options");
|
|
const hourField = document.getElementById("hour");
|
|
hourField.value = hourSelect.value;
|
|
}
|
|
|
|
function update_day_field() {
|
|
const daySelect = document.getElementById("day_options");
|
|
const dayField = document.getElementById("day");
|
|
dayField.value = daySelect.value;
|
|
}
|
|
|
|
function update_month_field() {
|
|
const monthSelect = document.getElementById("month_options");
|
|
const monthField = document.getElementById("month");
|
|
monthField.value = monthSelect.value;
|
|
}
|
|
|
|
function update_weekday_field() {
|
|
const weekdaySelect = document.getElementById("weekday_options");
|
|
const weekdayField = document.getElementById("weekday");
|
|
weekdayField.value = weekdaySelect.value;
|
|
}
|
|
|
|
function reset_select_elements() {
|
|
const minuteSelect = document.getElementById("minute_options");
|
|
const hourSelect = document.getElementById("hour_options");
|
|
const daySelect = document.getElementById("day_options");
|
|
const monthSelect = document.getElementById("month_options");
|
|
const weekdaySelect = document.getElementById("weekday_options");
|
|
|
|
minuteSelect.value = "";
|
|
hourSelect.value = "";
|
|
daySelect.value = "";
|
|
monthSelect.value = "";
|
|
weekdaySelect.value = "";
|
|
}
|
|
|
|
function select_common_option() {
|
|
const select = document.getElementById("common_options");
|
|
const selectedValue = select.value;
|
|
const minuteField = document.getElementById("minute");
|
|
const hourField = document.getElementById("hour");
|
|
const dayField = document.getElementById("day");
|
|
const monthField = document.getElementById("month");
|
|
const weekdayField = document.getElementById("weekday");
|
|
|
|
reset_select_elements();
|
|
|
|
switch (selectedValue) {
|
|
case "--":
|
|
minuteField.value = "";
|
|
hourField.value = "";
|
|
dayField.value = "";
|
|
monthField.value = "";
|
|
weekdayField.value = "";
|
|
break;
|
|
default:
|
|
const parts = selectedValue.split(" ");
|
|
if (parts.length === 5) {
|
|
minuteField.value = parts[0];
|
|
hourField.value = parts[1];
|
|
dayField.value = parts[2];
|
|
monthField.value = parts[3];
|
|
weekdayField.value = parts[4];
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function mergeAndSubmit() {
|
|
const minuteField = document.getElementById("minute").value;
|
|
const hourField = document.getElementById("hour").value;
|
|
const dayField = document.getElementById("day").value;
|
|
const monthField = document.getElementById("month").value;
|
|
const weekdayField = document.getElementById("weekday").value;
|
|
const commandField = document.getElementById("command").value;
|
|
|
|
if (
|
|
minuteField === "" ||
|
|
hourField === "" ||
|
|
dayField === "" ||
|
|
monthField === "" ||
|
|
weekdayField === "" ||
|
|
commandField === ""
|
|
) {
|
|
alert("{{ _('Please fill in all fields before submitting.') }}");
|
|
return;
|
|
}
|
|
|
|
const mergedValue = `${minuteField} ${hourField} ${dayField} ${monthField} ${weekdayField} ${commandField} `;
|
|
const mergedInput = document.createElement("input");
|
|
mergedInput.type = "hidden";
|
|
mergedInput.name = "mergedValue";
|
|
mergedInput.value = mergedValue;
|
|
|
|
const form = document.getElementById("cronForm");
|
|
form.appendChild(mergedInput);
|
|
form.submit();
|
|
}
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{% if cronjobs_with_line_numbers %}
|
|
|
|
<div class="table-responsive">
|
|
<table class="table table-stripped">
|
|
<thead>
|
|
<tr>
|
|
<th>{{ _('Minute') }}</th>
|
|
<th>{{ _('Hour') }}</th>
|
|
<th>{{ _('Day') }}</th>
|
|
<th>{{ _('Month') }}</th>
|
|
<th>{{ _('Weekday') }}</th>
|
|
<th>{{ _('Command') }}</th>
|
|
<th>{{ _('Actions') }}</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for item in cronjobs_with_line_numbers %}
|
|
{% if item.line.startswith('# ') or item.line.strip() == '' %}
|
|
<tr data-line-number="{{ item.line_number }}" class="d-none">
|
|
<td colspan="7"> {{item.line}}</td>
|
|
</tr>
|
|
{% else %}
|
|
|
|
|
|
|
|
<tr data-line-number="{{ item.line_number }}">
|
|
{% set cron_components = item.line.split(' ') %}
|
|
<td>
|
|
{% if cron_components[0].startswith('#') %}
|
|
{{ cron_components[0][1:] }}
|
|
{% else %}
|
|
{{ cron_components[0] }}
|
|
{% endif %}
|
|
</td>
|
|
<td>{{ cron_components[1] }}</td>
|
|
<td>{{ cron_components[2] }}</td>
|
|
<td>{{ cron_components[3] }}</td>
|
|
<td>{{ cron_components[4] }}</td>
|
|
<td>
|
|
<pre style="margin: 0px;">{{ item.line.split(' ', 5)[5] }}</pre>
|
|
</td>
|
|
<td>
|
|
|
|
|
|
<div class="btn-group" role="group" aria-label="Actions">
|
|
|
|
<button class="btn btn-outline-primary edit-button btn-flex" data-line="{{ item.line }}" data-line-number="{{ item.line_number }}"><i class="bi bi-pencil-fill"></i> {{ _('Edit') }}</button>
|
|
|
|
|
|
{% if item.line.startswith('#') %}
|
|
<button id="enableButton" class="btn btn-outline-primary cron-action-button btn-flex" data-action="enable"><i class="bi bi-play-fill"></i> {{ _('Enable') }} </button>
|
|
{% else %}
|
|
<button id="disableButton" class="btn btn-outline-warning cron-action-button btn-flex" data-action="disable"><i class="bi bi-pause-fill"></i> {{ _('Disable') }}</button>
|
|
{% endif %}
|
|
|
|
|
|
|
|
<button id="runButton" class="btn btn-outline-success btn-flex cron-action-button" data-action="run"><i class="bi bi-fast-forward-fill"></i> {{ _('Run Now') }}</button>
|
|
</div>
|
|
|
|
<button class="btn btn-outline-danger delete-button" data-line="{{ item.line }}" data-line-number="{{ item.line_number }}"><i class="bi bi-trash3"></i> {{ _('Delete') }}</button>
|
|
|
|
</td>
|
|
</tr>
|
|
|
|
{% endif %}
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="modal fade" id="editModal" tabindex="-1" aria-labelledby="editModalLabel" aria-hidden="true">
|
|
<div class="modal-dialog" role="document">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title" id="editModalLabel">{{ _('Edit Cron Job') }}</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="{{ _('Close') }}"></button>
|
|
</div>
|
|
<form id="editForm" method="post" action="/edit_cronjob">
|
|
<div class="modal-body">
|
|
<textarea id="editTextarea" class="form-control" name="editedValue" rows="3"></textarea>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{{ _('Close') }}</button>
|
|
<button type="submit" class="btn btn-primary">{{ _('Save changes') }}</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="modal fade" id="deleteModal" tabindex="-1" aria-labelledby="deleteModalLabel" aria-hidden="true">
|
|
<div class="modal-dialog" role="document">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title" id="deleteModalLabel">{{ _('Confirm Deletion') }}</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<p>{{ _('Are you sure you want to delete the following cron job?') }}</p>
|
|
<p><strong id="cronJobLineToDelete"></strong></p>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{{ _('Cancel') }}</button>
|
|
<button id="deleteConfirmButton" type="button" class="btn btn-danger">{{ _('Confirm Delete') }}</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<script>
|
|
// JavaScript to handle edit and delete buttons
|
|
$(document).ready(function () {
|
|
$(".edit-button").click(function () {
|
|
var line = $(this).data("line");
|
|
var lineNumber = $(this).data("line-number");
|
|
if (line.startsWith('#')) {
|
|
$("#editTextarea").val(line.substring(1));
|
|
} else {
|
|
$("#editTextarea").val(line);
|
|
}
|
|
$("#editTextarea").data("line-number", lineNumber);
|
|
$("#editModal").modal("show");
|
|
});
|
|
|
|
$(".delete-button").click(function () {
|
|
var line = $(this).data("line");
|
|
var lineNumber = $(this).data("line-number");
|
|
$("#cronJobLineToDelete").text(line);
|
|
$("#deleteConfirmButton").data("line", line);
|
|
$("#deleteConfirmButton").data("line-number", lineNumber);
|
|
$("#deleteModal").modal("show");
|
|
});
|
|
|
|
$("#editForm").submit(function (event) {
|
|
event.preventDefault();
|
|
var editedLine = $("#editTextarea").val();
|
|
var lineNumber = $("#editTextarea").data("line-number");
|
|
|
|
$.ajax({
|
|
type: "POST",
|
|
url: "/edit_cronjob",
|
|
data: {
|
|
editedLine: editedLine,
|
|
lineNumber: lineNumber
|
|
},
|
|
success: function (data) {
|
|
if (data.success) {
|
|
location.reload();
|
|
} else {
|
|
alert("{{ _('Error editing cron job.') }}");
|
|
}
|
|
},
|
|
error: function () {
|
|
alert("{{ _('AJAX error while editing cron job.') }}");
|
|
}
|
|
});
|
|
|
|
$("#editModal").modal("hide");
|
|
});
|
|
|
|
$("#deleteConfirmButton").click(function () {
|
|
var line = $(this).data("line");
|
|
var lineNumber = $(this).data("line-number");
|
|
|
|
$.ajax({
|
|
type: "POST",
|
|
url: "/delete_cronjob",
|
|
data: {
|
|
deletedLine: line,
|
|
lineNumber: lineNumber
|
|
},
|
|
success: function (data) {
|
|
if (data.success) {
|
|
location.reload();
|
|
} else {
|
|
alert("{{ _('Error deleting cron job.') }}");
|
|
}
|
|
},
|
|
error: function () {
|
|
alert("{{ _('AJAX error while deleting cron job.') }}");
|
|
}
|
|
});
|
|
|
|
$("#deleteModal").modal("hide");
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$(document).on("click", ".cron-action-button", function () {
|
|
var action = $(this).data("action");
|
|
var lineNumber = $(this).closest("tr").data("line-number");
|
|
performCronAction(action, lineNumber);
|
|
});
|
|
|
|
function performCronAction(action, lineNumber) {
|
|
$.ajax({
|
|
type: "POST",
|
|
url: "/" + action + "_cronjob",
|
|
data: {
|
|
lineNumber: lineNumber
|
|
},
|
|
success: function (data) {
|
|
if (data.success) {
|
|
location.reload();
|
|
} else {
|
|
alert("{{ _('Error ') }}" + action.replace('_', ' ') + "{{ _('ing cron job.') }}");
|
|
}
|
|
},
|
|
error: function () {
|
|
alert("{{ _('AJAX error while ') }}" + action.replace('_', ' ') + "{{ _('ing cron job.') }}");
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
});
|
|
</script>
|
|
|
|
|
|
</div>
|
|
{% else %}
|
|
<p>{{ _('No cronjobs.') }}</p>
|
|
{% endif %}
|
|
|
|
|
|
|
|
</section>
|
|
<footer class="main-footer btn-toolbar" role="toolbar">
|
|
|
|
<div class="btn-group" role="group" aria-label="{{ _('Advanced') }}">
|
|
<a type="button" href="/cronjobs?view=code" class="btn">
|
|
<i class="bi bi-pencil"></i> <span class="desktop-only">{{ _('Advanced') }} </span>{{ _('Editor') }}
|
|
</a>
|
|
</div>
|
|
|
|
|
|
<div class="ms-auto" role="group" aria-label="Actions">
|
|
<button type="button" class="btn btn-primary d-flex align-items-center gap-2" data-bs-toggle="collapse" data-bs-target="#collapseExample" aria-expanded="false" aria-controls="collapseExample"><i class="bi bi-plus-lg"></i> {{ _('Create CronJob') }}</button>
|
|
</div>
|
|
</footer>
|
|
|
|
|
|
{% elif view_mode == 'code' %}
|
|
|
|
<div class="alert alert-warning">
|
|
<strong>{{ _('Attention:') }}</strong> {{ _('Editing crontab file is intended for advanced users only. If you mistyped the cron entry in the file, you will not be warned as opposed to when saving cronjobs in basic editor.') }}
|
|
<br><br>
|
|
{{ _("Prepend # before the line to pause cronjob. To create a comment, prepend # followed by space: '# '.") }}
|
|
</div>
|
|
|
|
<form method="post" action="/domains/save-dns-zone/{{ domain }}">
|
|
<textarea style="height:60vh;" class="form-control" id="crontab_content" name="crontab_content" rows="10" cols="80">{{ crontab_content }}</textarea>
|
|
|
|
</section>
|
|
<footer class="main-footer btn-toolbar" role="toolbar">
|
|
<div class="btn-group" role="group" aria-label="{{ _('Advanced') }}">
|
|
<a type="button" href="/cronjobs?view=table" class="btn">
|
|
<i class="bi bi-arrow-left"></i> <span class="desktop-only">{{ _('Go') }} </span>{{ _('Back') }}
|
|
</a>
|
|
</div>
|
|
|
|
<div class="ms-auto" role="group" aria-label="{{ _('Actions') }}">
|
|
<button type="button" class="btn btn-primary" id="save_zone_button">
|
|
{{ _('Save') }}<span class="desktop-only"> {{ _('Crontab') }}</span>
|
|
</button>
|
|
</form>
|
|
</div>
|
|
</footer>
|
|
|
|
|
|
<script>
|
|
document.getElementById('save_zone_button').addEventListener('click', function() {
|
|
const zoneContent = document.getElementById('crontab_content').value;
|
|
|
|
console.log("Saving crontab..");
|
|
|
|
const params = new URLSearchParams();
|
|
params.append('crontab_content', zoneContent);
|
|
|
|
fetch(`/save_cronjob`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/x-www-form-urlencoded'
|
|
},
|
|
body: params.toString()
|
|
})
|
|
.then(response => response.text())
|
|
.then(responseText => {
|
|
let btnClass, toastMessage;
|
|
|
|
if (responseText.includes('saved')) {
|
|
btnClass = 'success';
|
|
toastMessage = "{{ _('Crontab file saved successfully') }}";
|
|
} else {
|
|
btnClass = 'danger';
|
|
toastMessage = responseText;
|
|
}
|
|
|
|
const toast = toaster({
|
|
body: toastMessage,
|
|
className: `border-0 text-white bg-${btnClass}`,
|
|
});
|
|
|
|
|
|
})
|
|
.catch(error => {
|
|
console.error('Error:', error);
|
|
// Handle error case
|
|
btnClass = 'danger';
|
|
toastMessage = data.error;
|
|
const toast = toaster({
|
|
body: toastMessage,
|
|
className: `border-0 text-white bg-${btnClass}`,
|
|
});
|
|
|
|
|
|
|
|
});
|
|
});
|
|
|
|
</script>
|
|
|
|
{% endif %}
|
|
|
|
|
|
|
|
|
|
{% endblock %}
|