283 lines
9.4 KiB
Perl
283 lines
9.4 KiB
Perl
#!/usr/bin/perl
|
|
|
|
require './jru-lib.pl';
|
|
|
|
sub build_cronline{
|
|
my $schid = $_[0];
|
|
|
|
my $cron_line = '';
|
|
if($in{'cron_period'} eq 'custom'){
|
|
$cron_line .= $in{'cron_custom'};
|
|
$cron_line .= ' root ';
|
|
}
|
|
$cron_line .= build_cmd_line(\%in);
|
|
|
|
return $cron_line;
|
|
}
|
|
|
|
&ReadParse();
|
|
|
|
if($in{'cron_period'} eq 'now'){
|
|
$in{'schid'} = '0'; #for on-demain schedules, we use the special ID 0
|
|
my $cmd0 = build_cmd_line(\%in);
|
|
|
|
#run the on-demand schedule
|
|
&redirect("/jri_publisher/report_run.cgi?schid=0&back=schedule");
|
|
return 0;
|
|
}
|
|
|
|
if($in{'submit_flag'} == 2){
|
|
my %schedules = load_schedules();
|
|
my %sched = %{$schedules{$in{'schid'}}};
|
|
|
|
my $old_period = 'custom';
|
|
if($sched{'cron'} =~ /^@(.*)/){
|
|
$old_period = $1;
|
|
}
|
|
my $cronfile = get_jri_cronfile($old_period); #file with old cron entry
|
|
my $sch_env = get_jasper_home().'/schedules/'.$sched{'schid'}.'_env.sh';
|
|
|
|
#get line number from id
|
|
my $ln=0;
|
|
if($sched{'fln'} =~ /[a-z]+([0-9]+)/){
|
|
$ln = $1;
|
|
}else{
|
|
&error('Invalid schedule ID '.$sched{'fln'});
|
|
}
|
|
|
|
my $lref = &read_file_lines($cronfile);
|
|
if($in{'cron_period'} ne $old_period){ #if period is different, files are different
|
|
@{$lref}[$ln] = '#'.@{$lref}[$ln]; #just comment out the line
|
|
$in{'submit_flag'} = 1; #change mode to add
|
|
&unlink_file($sch_env);
|
|
|
|
}elsif($in{'but_delete'}){
|
|
@{$lref}[$ln] = '#'.@{$lref}[$ln]; #just comment out the line
|
|
$in{'submit_flag'} = 0;
|
|
$in{'schid'} = 0;
|
|
&unlink_file($sch_env);
|
|
|
|
}else{ #period is the same, so just update line
|
|
|
|
@{$lref}[$ln] = build_cronline();
|
|
$in{'submit_flag'} = 0;
|
|
$in{'schid'} = 0;
|
|
}
|
|
&flush_file_lines($cronfile);
|
|
}
|
|
|
|
if($in{'submit_flag'} == 1){
|
|
my $cron_filename = get_jri_cronfile($in{'cron_period'});
|
|
|
|
if($in{'cron_period'} eq 'custom'){
|
|
#if file doesn't exist, add a header
|
|
if(! -f $cron_filename){
|
|
open(my $fh, '>', $cron_filename) or die "open:$!";
|
|
print $fh 'SHELL=/bin/sh'."\n";
|
|
print $fh 'PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin'."\n";
|
|
print $fh '# m h dom mon dow user command'."\n";
|
|
close $fh;
|
|
}
|
|
}
|
|
|
|
open(my $fh, '>>', $cron_filename) or die "open:$!".$cron_filename;
|
|
$fh->autoflush;
|
|
print $fh build_cronline()."\n";
|
|
close $fh;
|
|
unflush_file_lines($cron_filename);
|
|
|
|
$in{'submit_flag'} = 0;
|
|
}
|
|
|
|
&ui_print_header(undef, $text{'jru_schedule'}, "", "schedules", 0, 0);
|
|
|
|
print <<EOF;
|
|
<script type="text/javascript">
|
|
function update_select(){
|
|
var Sel = document.getElementById('cron_period');
|
|
if(Sel.options[Sel.selectedIndex].value == 'custom'){
|
|
document.getElementById('cron_custom').disabled = false;
|
|
}else{
|
|
document.getElementById('cron_custom').disabled = true;
|
|
}
|
|
}
|
|
|
|
function update_templ(){
|
|
var Sel = document.getElementById('repEmailTmpl');
|
|
if(Sel.options[Sel.selectedIndex].value != 'none'){
|
|
document.getElementById('repEmailTmpl').disabled = false;
|
|
}else{
|
|
document.getElementById('repEmailTmpl').disabled = true;
|
|
}
|
|
}
|
|
|
|
function save_opt_params(){
|
|
var Key = document.getElementsByName('optKey')[0];
|
|
var Val = document.getElementsByName('optVal')[0];
|
|
var Sel = document.getElementsByName('optSelParams')[0];
|
|
|
|
var label = Key.value + '=' + Val.value;
|
|
|
|
var option = document.createElement("option");
|
|
option.text = label;
|
|
option.value = label;
|
|
option.selected = true;
|
|
Sel.appendChild(option);
|
|
|
|
Key.value = Val.value = '';
|
|
}
|
|
|
|
function clear_opt_params(){
|
|
var Key = document.getElementsByName('optKey')[0];
|
|
var Val = document.getElementsByName('optVal')[0];
|
|
var Sel = document.getElementsByName('optSelParams')[0];
|
|
var i;
|
|
for(i = Sel.options.length - 1 ; i >= 0 ; i--)
|
|
{
|
|
Sel.remove(i);
|
|
}
|
|
Key.value = Val.value = '';
|
|
}
|
|
|
|
function clear_disable_obj(name){
|
|
var Obj = document.getElementsByName(name)[0];
|
|
Obj.disabled = !Obj.disabled;
|
|
}
|
|
|
|
function update_nomail(){
|
|
var mailObjs = ['repEmail', 'repEmailSubj', 'repEmailBody', 'repEmailTmpl'];
|
|
mailObjs.forEach(clear_disable_obj);
|
|
}
|
|
|
|
function update_with_templ(){
|
|
var mailObjs = ['repEmailTmpl', 'repEmailBody'];
|
|
mailObjs.forEach(clear_disable_obj);
|
|
}
|
|
|
|
</script>
|
|
EOF
|
|
|
|
# Show tabs
|
|
@tabs = ( [ "add", $text{'schedule_tab_add'}, "edit_schedule.cgi?mode=add" ],
|
|
[ "view", $text{'schedule_tab_view'}, "edit_schedule.cgi?mode=view" ]);
|
|
|
|
my @rep_formats = ('pdf', 'html', 'html2', 'rtf', 'xls', 'jxl', 'csv', 'xlsx', 'pptx', 'docx');
|
|
@opt_repformat = ();
|
|
foreach my $fmt (sort @rep_formats) {
|
|
push(@opt_repformat, [ $fmt, $fmt]);
|
|
}
|
|
|
|
#re-read the file, after we have added/removed a user
|
|
%datasources = get_jru_datasources();
|
|
@opt_rep_id = map { [$_, $_] } get_all_rep_ids();
|
|
@opt_datasources = map { [$_, $_]} sort keys %datasources;
|
|
|
|
@opt_cron_period = ();
|
|
unshift(@cron_period, 'now');
|
|
foreach my $per (@cron_period) {
|
|
if($per eq 'now' || $per eq 'custom' || -d '/etc/cron.'.$per){
|
|
push(@opt_cron_period, [ $per, $per]);
|
|
}
|
|
}
|
|
|
|
@opt_email_tmpl = map { [$_, $_]} get_email_templates();
|
|
|
|
%schedules = load_schedules();
|
|
|
|
print &ui_tabs_start(\@tabs, "mode", $in{'mode'} || "view", 1);
|
|
|
|
# START add tab
|
|
print &ui_tabs_start_tab("mode", "add");
|
|
print "$text{'schedule_desc1'}<p>\n";
|
|
|
|
print &ui_form_start("edit_schedule.cgi", "post");
|
|
|
|
print &ui_table_start($text{'schedule_params'}, undef, 2);
|
|
|
|
my %sched;
|
|
if($in{'name'}){
|
|
$sched{'rep_id'} = $in{'name'};
|
|
}
|
|
if($in{'schid'}){
|
|
%sched = %{$schedules{$in{'schid'}}};
|
|
|
|
my $old_period = 'custom';
|
|
if($sched{'cron'} =~ /^@(.*)/){
|
|
$old_period = $1;
|
|
}
|
|
$sched{'cron'} = $old_period;
|
|
print &ui_hidden('schid', $in{'schid'});
|
|
print &ui_hidden('submit_flag', 2); #edit
|
|
}else{
|
|
print &ui_hidden('submit_flag', 1); #add
|
|
}
|
|
|
|
#add cron variables - hour, minutes ...
|
|
print &ui_table_row($text{'schedule_cron'}, &ui_select("cron_period", $sched{'cron'}, \@opt_cron_period, 1, 0, undef, undef, 'id="cron_period" onchange="update_select()"').
|
|
" ".
|
|
&ui_textbox("cron_custom", '*/30 * * * *', 20, $sched{'cron'} eq 'custom' ? 0 : 1).
|
|
" ".
|
|
'<a href="https://crontab.guru" target="_blank">Cron helper</a>'
|
|
);
|
|
print &ui_table_row($text{'schedule_repname'}, &ui_select("repname", $sched{'rep_id'}, \@opt_rep_id, 1, 0));
|
|
print &ui_table_row($text{'schedule_repformat'}, &ui_select("repformat", $sched{'rep_format'}, \@opt_repformat, 1, 0));
|
|
print &ui_table_row($text{'schedule_datasource'}, &ui_select("datasource", $sched{'rep_ds'}, \@opt_datasources, 1, 0));
|
|
print &ui_table_row($text{'schedule_filename'}, &ui_textbox("filename", $sched{'rep_file'}, 20));
|
|
print &ui_table_row($text{'schedule_email'}, &ui_textbox("repEmail", $sched{'rep_rcpt'}, 20, $sched{'noemail'}).
|
|
&ui_checkbox("noemail", 1, '<i>'.$text{'schedule_noemail'}."</i>", $sched{'noemail'}, 'onclick="update_nomail()"'));
|
|
print &ui_table_end();
|
|
|
|
|
|
print &ui_hidden_table_start($text{'schedule_params_optional'}, undef, 2, 'optional_args', 0);
|
|
print &ui_table_row($text{'schedule_email_subj'}, &ui_textbox("repEmailSubj", $sched{'rep_email_subj'}, 20, $sched{'noemail'}));
|
|
|
|
my $with_tmpl = $sched{'rep_email_tmpl'} ? 1 : 0;
|
|
print &ui_table_row($text{'schedule_email_body'}, &ui_textarea("repEmailBody", $sched{'rep_email_body'}, 2, 20, 'off', $sched{'noemail'} || $with_tmpl));
|
|
print &ui_table_row($text{'schedule_email_tmpl'}, &ui_select("repEmailTmpl", $sched{'rep_email_tmpl'}, \@opt_email_tmpl, 1, 0, undef, !$with_tmpl).
|
|
&ui_checkbox("with_tmpl", 1, '<i>'.$text{'schedule_with_tmpl'}."</i>", $with_tmpl, 'onclick="update_with_templ()"'));
|
|
|
|
print &ui_table_row($text{'schedule_opt_params'},
|
|
&ui_textbox("optKey", '', 10, $sched{'noemail'}, 20, 'id=optKey').'='.
|
|
&ui_textbox("optVal", '', 10, $sched{'noemail'}, 20, 'id=optVal').
|
|
&ui_button('Save', 'btnOptParamSave', $sched{'noemail'}, 'onclick="save_opt_params()"').
|
|
&ui_button('Clear','btnOptParamClear', $sched{'noemail'}, 'onclick="clear_opt_params()"').
|
|
'</br>'.
|
|
&ui_select('optSelParams', [split(/&/, $sched{'url_opt_params'})], [split(/&/, $sched{'url_opt_params'})], undef, 1, undef, $sched{'noemail'})
|
|
);
|
|
print &ui_hidden_table_end('optional_args');
|
|
|
|
|
|
if($in{'schid'}){ #if we have and id, its edit mode
|
|
print &ui_form_end([ [ "but_update", $text{'jru_update'} ], ["but_delete", $text{'jru_delete'}] ]);
|
|
}else{
|
|
print &ui_form_end([ [ "", $text{'jru_addok'} ] ]);
|
|
}
|
|
print &ui_tabs_end_tab();
|
|
#END add tab
|
|
|
|
|
|
|
|
# START view tab
|
|
print &ui_tabs_start_tab("mode", "view");
|
|
print "$text{'schedule_desc2'}<p>\n";
|
|
|
|
my @tds = ( "width=5%", "width=10%", "width=25%", "width=5%", "width=10%", "width=20%", "width=15%", "width=10%");
|
|
print &ui_columns_start(['SchID', 'Cron', 'Name', 'Format', 'Datasource', 'Output', 'Email', 'Optional Params'], 100, 0, \@tds);
|
|
foreach my $schid (sort keys %schedules){
|
|
my %sched = %{$schedules{$schid}};
|
|
my @cols = ($schid, $sched{'cron'}, $sched{'rep_id'}, $sched{'rep_format'},
|
|
$sched{'rep_ds'}, $sched{'rep_file'}, $sched{'rep_rcpt'}, $sched{'url_opt_params'});
|
|
|
|
$cols[0] = '<a href="/jri_publisher/edit_schedule.cgi?mode=add&schid='.&urlize($schid).'">'.$schid."</a>";
|
|
$cols[7] = join('</br>', split(/&/, $cols[7]));
|
|
print &ui_columns_row(\@cols, \@tds);
|
|
}
|
|
print &ui_columns_end();
|
|
|
|
print &ui_tabs_end_tab();
|
|
#END list tab
|
|
|
|
print &ui_tabs_end(1);
|
|
|
|
&ui_print_footer("", $text{'index_return'});
|