#!/usr/bin/perl # save_log.cgi # Save, create, delete or view a log require './syslog-lib.pl'; &ReadParse(); &foreign_require("proc", "proc-lib.pl"); $conf = &get_config(); if ($in{'delete'}) { # Deleting a log $access{'noedit'} && &error($text{'edit_ecannot'}); $access{'syslog'} || &error($text{'edit_ecannot'}); $log = $conf->[$in{'idx'}]; &lock_file($log->{'cfile'}); &can_edit_log($log) || &error($text{'save_ecannot1'}); &delete_log($log); &unlock_file($log->{'cfile'}); &redirect(""); } elsif ($in{'view'}) { # Viewing a log file @extras = &extra_log_files(); if ($in{'idx'} =~ /^\//) { # The drop-down selector on this page has chosen a file if (&indexof($in{'idx'}, (map { $_->{'file'} } @extras)) >= 0) { $in{'extra'} = $in{'idx'}; delete($in{'file'}); } else { $in{'file'} = $in{'idx'}; delete($in{'extra'}); } delete($in{'idx'}); delete($in{'oidx'}); } if ($in{'idx'} ne '') { # From syslog $log = $conf->[$in{'idx'}]; &can_edit_log($log) && $access{'syslog'} || &error($text{'save_ecannot2'}); $file = $log->{'file'}; } elsif ($in{'oidx'} ne '') { # From another module @others = &get_other_module_logs($in{'omod'}); ($other) = grep { $_->{'mindex'} == $in{'oidx'} } @others; &can_edit_log($other) && $access{'others'} || &error($text{'save_ecannot2'}); if ($other->{'file'}) { $file = $other->{'file'}; } else { $cmd = $other->{'cmd'}; } } elsif ($in{'extra'}) { # Extra log file ($extra) = grep { $_->{'file'} eq $in{'extra'} } @extras; $extra || &error($text{'save_ecannot7'}); &can_edit_log($extra) || &error($text{'save_ecannot2'}); $file = $extra->{'file'}; } elsif ($in{'file'}) { # Explicitly named file $access{'any'} || &error($text{'save_ecannot6'}); $file = $in{'file'}; &can_edit_log($file) || &error($text{'save_ecannot2'}); } else { &error($text{'save_emissing'}); } print "Refresh: $config{'refresh'}\r\n" if ($config{'refresh'}); &ui_print_header("<tt>".&html_escape($file || $cmd)."</tt>", $in{'linktitle'} || $text{'view_title'}, "", undef, undef, $in{'nonavlinks'}); $lines = $in{'lines'} ? int($in{'lines'}) : int($config{'lines'}); $filter = $in{'filter'} ? quotemeta($in{'filter'}) : ""; &filter_form(); $| = 1; print "<pre>"; local $tailcmd = $config{'tail_cmd'} || "tail -n LINES"; $tailcmd =~ s/LINES/$lines/g; if ($filter ne "") { # Are we supposed to filter anything? Then use grep. local @cats; if ($cmd) { # Getting output from a command push(@cats, $cmd); } elsif ($config{'compressed'}) { # All compressed versions foreach $l (&all_log_files($file)) { $c = &catter_command($l); push(@cats, $c) if ($c); } } else { # Just the one log @cats = ( "cat ".quotemeta($file) ); } $cat = "(".join(" ; ", @cats).")"; if ($config{'reverse'}) { $tailcmd .= " | tac"; } $eflag = $gconfig{'os_type'} =~ /-linux/ ? "-E" : ""; $dashflag = $gconfig{'os_type'} =~ /-linux/ ? "--" : ""; if (@cats) { $got = &proc::safe_process_exec( "$cat | grep -i -a $eflag $dashflag $filter ". "| $tailcmd", 0, 0, STDOUT, undef, 1, 0, undef, 1); } else { $got = undef; } } else { # Not filtering .. so cat the most recent non-empty file if ($cmd) { # Getting output from a command $fullcmd = $cmd." | ".$tailcmd; } elsif ($config{'compressed'}) { # Cat all compressed files local @cats; $total = 0; foreach $l (reverse(&all_log_files($file))) { next if (!-s $l); $c = &catter_command($l); if ($c) { $len = int(&backquote_command( "$c | wc -l")); $total += $len; push(@cats, $c); last if ($total > $in{'lines'}); } } if (@cats) { $cat = "(".join(" ; ", reverse(@cats)).")"; $fullcmd = $cat." | ".$tailcmd; } else { $fullcmd = undef; } } else { # Just run tail on the file $fullcmd = $tailcmd." ".quotemeta($file); } if ($config{'reverse'} && $fullcmd) { $fullcmd .= " | tac"; } if ($fullcmd) { $got = &proc::safe_process_exec( $fullcmd, 0, 0, STDOUT, undef, 1, 0, undef, 1); } else { $got = undef; } } print "<i>$text{'view_empty'}</i>\n" if (!$got); print "</pre>\n"; &filter_form(); $in{'nonavlinks'} ? &ui_print_footer() : &ui_print_footer( $access{'noedit'} || $other || $in{'file'} || $in{'extra'} ? () : ( "edit_log.cgi?idx=$in{'idx'}", $text{'edit_return'} ), "", $text{'index_return'}); exit; } else { # saving or updating a log $access{'noedit'} && &error($text{'edit_ecannot'}); $access{'syslog'} || &error($text{'edit_ecannot'}); &error_setup($text{'save_err'}); # Validate destination section if ($in{'mode'} == 0) { open(FILE, ">>$in{'file'}") || &error(&text('save_efile', $in{'file'}, $!)); close(FILE); my $user = $config{'log_user'} || 'root'; my $group = $config{'log_group'}; &set_ownership_permissions($user, $group, 644, $in{'file'}); $log->{'file'} = $in{'file'}; $log->{'sync'} = $in{'sync'}; } elsif ($in{'mode'} == 1 && $config{'pipe'} == 1) { -w $in{'pipe'} || &error(&text('save_epipe', $in{'pipe'})); $log->{'pipe'} = $in{'pipe'}; } elsif ($in{'mode'} == 1 && $config{'pipe'} == 2) { $in{'pipe'} || &error($text{'save_epipe2'}); $log->{'pipe'} = $in{'pipe'}; } elsif ($in{'mode'} == 2) { my $host = $in{'host'}; $host =~ s/:\d+$//; &to_ipaddress($host) || &to_ip6address($host) || &error(&text('save_ehost', $in{'host'})); $log->{'host'} = $in{'host'}; } elsif ($in{'mode'} == 3) { @users = split(/\s+/, $in{'users'}); @users || &error($text{'save_enousers'}); foreach $u (@users) { defined(getpwnam($u)) || &error(&text('save_euser', $u)); } $log->{'users'} = \@users; } elsif ($in{'mode'} == 5) { -S $in{'socket'} || &error($text{'save_esocket'}); $log->{'socket'} = $in{'socket'}; } else { $log->{'all'} = 1; } $log->{'active'} = $in{'active'}; if ($config{'tags'} && $in{'tag'} ne '') { $log->{'section'} = $conf->[$in{'tag'}]; } # Parse message types section for($i=0; defined($in{"fmode_$i"}); $i++) { local ($f, $p); if ($in{"fmode_$i"} == 0) { next if (!$in{"facil_$i"}); $f = $in{"facil_$i"}; } else { @facils = split(/\s+/, $in{"facils_$i"}); @facils || &error($text{'save_efacils'}); $f = join(",", @facils); } if ($in{"pmode_$i"} == 0) { $p = 'none'; } elsif ($in{"pmode_$i"} == 1) { $p = '*'; } else { $p = $in{"pdir_$i"}.$in{"pri_$i"}; $in{"pri_$i"} || &error($text{'save_epri'}); } push(@sel, "$f.$p"); } @sel || &error($text{'save_esel'}); $log->{'sel'} = \@sel; if ($in{'new'}) { &can_edit_log($log) || &error($text{'save_ecannot3'}); &lock_file($log->{'cfile'}); $log->{'cfile'} = $config{'syslog_conf'}; &create_log($log); &unlock_file($log->{'cfile'}); } else { &can_edit_log($log) || &error($text{'save_ecannot4'}); $old = $conf->[$in{'idx'}]; $log->{'cfile'} = $old->{'cfile'}; &lock_file($old->{'cfile'}); $log->{'format'} = $old->{'format'}; # Copy for now &can_edit_log($old) || &error($text{'save_ecannot5'}); &update_log($old, $log); &unlock_file($old->{'cfile'}); } &redirect(""); } &log_line($log) =~ /(\S+)$/; &webmin_log($in{'delete'} ? "delete" : $in{'new'} ? "create" : "modify", "log", "$1", $log); sub filter_form { print &ui_form_start("save_log.cgi"); print &ui_hidden("nonavlinks", $in{'nonavlinks'} ? 1 : 0),"\n"; print &ui_hidden("linktitle", $in{'linktitle'}),"\n"; print &ui_hidden("oidx", $in{'oidx'}),"\n"; print &ui_hidden("omod", $in{'omod'}),"\n"; print &ui_hidden("file", $in{'file'}),"\n"; print &ui_hidden("extra", $in{'extra'}),"\n"; print &ui_hidden("view", 1),"\n"; # Create list of logs and selector my @logfiles; my $found = 0; if ($access{'syslog'}) { # Logs from syslog my $conf = &get_config(); foreach $c (@$conf) { next if ($c->{'tag'}); next if (!&can_edit_log($c)); next if (!$c->{'file'} || !-f $c->{'file'}); push(@logfiles, [ $c->{'index'}, $c->{'file'} ]); $found++ if ($c->{'file'} eq $file); } } if ($config{'others'} && $access{'others'}) { foreach my $o (&get_other_module_logs()) { next if (!&can_edit_log($o)); next if (!$o->{'file'}); push(@logfiles, [ $o->{'file'} ]); $found++ if ($o->{'file'} eq $file); } } foreach $e (&extra_log_files()) { next if (!&can_edit_log($e)); push(@logfiles, [ $e->{'file'} ]); $found++ if ($e->{'file'} eq $file); } if (@logfiles && $found) { $sel = &ui_select("idx", $in{'idx'} eq '' ? $file : $in{'idx'}, [ @logfiles ]); } else { $sel = "<tt>".&html_escape($log->{'file'})."</tt>"; print &ui_hidden("idx", $in{'idx'}),"\n"; } print &text('view_header', " " . &ui_textbox("lines", $lines, 3), $sel),"\n"; print " \n"; print &text('view_filter', " " . &ui_textbox("filter", $in{'filter'}, 25)),"\n"; print " \n"; print &ui_submit($text{'view_refresh'}); print &ui_form_end(),"<br>\n"; }
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
images | Folder | 0755 |
|
|
lang | Folder | 0755 |
|
|
CHANGELOG | File | 1.43 KB | 0644 |
|
acl_security.pl | File | 1.47 KB | 0755 |
|
backup_config.pl | File | 643 B | 0755 |
|
cgi_args.pl | File | 799 B | 0755 |
|
config-AlmaLinux-6.0-ALL | File | 701 B | 0644 |
|
config-CentOS-Linux-6.0-ALL | File | 681 B | 0644 |
|
config-CentOS-Stream-Linux-8.0-ALL | File | 701 B | 0644 |
|
config-CloudLinux-8.0-ALL | File | 701 B | 0644 |
|
config-Oracle-Linux-8.0-ALL | File | 701 B | 0644 |
|
config-Redhat-Enterprise-Linux-6.0-ALL | File | 701 B | 0644 |
|
config-Rocky-Linux-6.0-ALL | File | 701 B | 0644 |
|
config-Ubuntu-Linux-10.04-ALL | File | 442 B | 0644 |
|
config-aix | File | 324 B | 0644 |
|
config-cobalt-linux | File | 410 B | 0644 |
|
config-coherent-linux | File | 676 B | 0644 |
|
config-corel-linux | File | 399 B | 0644 |
|
config-debian-linux | File | 399 B | 0644 |
|
config-debian-linux-3.1-3.2 | File | 443 B | 0644 |
|
config-debian-linux-4.0 | File | 471 B | 0644 |
|
config-debian-linux-5.0-9.0 | File | 475 B | 0644 |
|
config-debian-linux-9.0-ALL | File | 442 B | 0644 |
|
config-freebsd | File | 337 B | 0644 |
|
config-generic-linux | File | 330 B | 0644 |
|
config-gentoo-linux | File | 330 B | 0644 |
|
config-hpux | File | 304 B | 0644 |
|
config-irix | File | 293 B | 0644 |
|
config-macos | File | 389 B | 0644 |
|
config-mandrake-linux | File | 662 B | 0644 |
|
config-msc-linux | File | 672 B | 0644 |
|
config-netbsd | File | 308 B | 0644 |
|
config-open-linux | File | 634 B | 0644 |
|
config-openSUSE-Linux-15.0-ALL | File | 362 B | 0644 |
|
config-openbsd | File | 337 B | 0644 |
|
config-openserver | File | 311 B | 0644 |
|
config-pardus-linux | File | 330 B | 0644 |
|
config-redhat-linux-16.0-23.0 | File | 671 B | 0644 |
|
config-redhat-linux-24.0-ALL | File | 701 B | 0644 |
|
config-slackware-linux | File | 330 B | 0644 |
|
config-sol-linux | File | 330 B | 0644 |
|
config-solaris | File | 444 B | 0644 |
|
config-solaris-9-10 | File | 448 B | 0644 |
|
config-suse-linux | File | 330 B | 0644 |
|
config-suse-linux-11-ALL | File | 364 B | 0644 |
|
config-suse-linux-7.2-8.0 | File | 326 B | 0644 |
|
config-suse-linux-8.2-10.9 | File | 361 B | 0644 |
|
config-trustix-linux | File | 666 B | 0644 |
|
config-turbo-linux | File | 326 B | 0644 |
|
config-united-linux | File | 326 B | 0644 |
|
config-unixware | File | 324 B | 0644 |
|
config.info | File | 1.29 KB | 0644 |
|
config.info.bg | File | 2.24 KB | 0644 |
|
config.info.ca | File | 1.39 KB | 0644 |
|
config.info.cs | File | 752 B | 0644 |
|
config.info.de | File | 1.41 KB | 0644 |
|
config.info.el | File | 2.16 KB | 0644 |
|
config.info.es | File | 1.17 KB | 0644 |
|
config.info.fr | File | 1.2 KB | 0644 |
|
config.info.hu | File | 871 B | 0644 |
|
config.info.it | File | 1.34 KB | 0644 |
|
config.info.ja | File | 1.63 KB | 0644 |
|
config.info.ko | File | 1.2 KB | 0644 |
|
config.info.nl | File | 1.28 KB | 0644 |
|
config.info.no | File | 1.18 KB | 0644 |
|
config.info.pl | File | 1.34 KB | 0644 |
|
config.info.ru | File | 1.68 KB | 0644 |
|
config.info.sv | File | 609 B | 0644 |
|
config.info.tr | File | 1.12 KB | 0644 |
|
config.info.uk | File | 1.71 KB | 0644 |
|
config.info.zh | File | 555 B | 0644 |
|
config.info.zh_TW | File | 615 B | 0644 |
|
defaultacl | File | 31 B | 0644 |
|
edit_log.cgi | File | 5.01 KB | 0755 |
|
index.cgi | File | 4.96 KB | 0755 |
|
install_check.pl | File | 333 B | 0755 |
|
log_parser.pl | File | 722 B | 0755 |
|
m4.cgi | File | 804 B | 0755 |
|
module.info | File | 255 B | 0644 |
|
module.info.af | File | 0 B | 0644 |
|
module.info.af.auto | File | 116 B | 0644 |
|
module.info.ar | File | 0 B | 0644 |
|
module.info.ar.auto | File | 167 B | 0644 |
|
module.info.be | File | 0 B | 0644 |
|
module.info.be.auto | File | 205 B | 0644 |
|
module.info.bg | File | 0 B | 0644 |
|
module.info.bg.auto | File | 231 B | 0644 |
|
module.info.ca | File | 124 B | 0644 |
|
module.info.ca.auto | File | 15 B | 0644 |
|
module.info.cs | File | 25 B | 0644 |
|
module.info.cs.auto | File | 110 B | 0644 |
|
module.info.da | File | 0 B | 0644 |
|
module.info.da.auto | File | 113 B | 0644 |
|
module.info.de | File | 111 B | 0644 |
|
module.info.de.auto | File | 15 B | 0644 |
|
module.info.el | File | 0 B | 0644 |
|
module.info.el.auto | File | 213 B | 0644 |
|
module.info.es | File | 39 B | 0644 |
|
module.info.es.auto | File | 102 B | 0644 |
|
module.info.eu | File | 0 B | 0644 |
|
module.info.eu.auto | File | 144 B | 0644 |
|
module.info.fa | File | 0 B | 0644 |
|
module.info.fa.auto | File | 225 B | 0644 |
|
module.info.fi | File | 0 B | 0644 |
|
module.info.fi.auto | File | 145 B | 0644 |
|
module.info.fr | File | 26 B | 0644 |
|
module.info.fr.auto | File | 110 B | 0644 |
|
module.info.he | File | 0 B | 0644 |
|
module.info.he.auto | File | 170 B | 0644 |
|
module.info.hr | File | 0 B | 0644 |
|
module.info.hr.auto | File | 144 B | 0644 |
|
module.info.hu | File | 35 B | 0644 |
|
module.info.hu.auto | File | 114 B | 0644 |
|
module.info.it | File | 28 B | 0644 |
|
module.info.it.auto | File | 108 B | 0644 |
|
module.info.ja | File | 28 B | 0644 |
|
module.info.ja.auto | File | 121 B | 0644 |
|
module.info.ko | File | 25 B | 0644 |
|
module.info.ko.auto | File | 110 B | 0644 |
|
module.info.lt | File | 0 B | 0644 |
|
module.info.lt.auto | File | 146 B | 0644 |
|
module.info.lv | File | 0 B | 0644 |
|
module.info.lv.auto | File | 128 B | 0644 |
|
module.info.ms | File | 105 B | 0644 |
|
module.info.ms.auto | File | 15 B | 0644 |
|
module.info.mt | File | 0 B | 0644 |
|
module.info.mt.auto | File | 136 B | 0644 |
|
module.info.nl | File | 21 B | 0644 |
|
module.info.nl.auto | File | 101 B | 0644 |
|
module.info.no | File | 22 B | 0644 |
|
module.info.no.auto | File | 90 B | 0644 |
|
module.info.pl | File | 23 B | 0644 |
|
module.info.pl.auto | File | 104 B | 0644 |
|
module.info.pt | File | 30 B | 0644 |
|
module.info.pt.auto | File | 104 B | 0644 |
|
module.info.pt_BR | File | 33 B | 0644 |
|
module.info.pt_BR.auto | File | 110 B | 0644 |
|
module.info.ro | File | 0 B | 0644 |
|
module.info.ro.auto | File | 137 B | 0644 |
|
module.info.ru | File | 40 B | 0644 |
|
module.info.ru.auto | File | 184 B | 0644 |
|
module.info.sk | File | 0 B | 0644 |
|
module.info.sk.auto | File | 142 B | 0644 |
|
module.info.sl | File | 0 B | 0644 |
|
module.info.sl.auto | File | 136 B | 0644 |
|
module.info.sv | File | 21 B | 0644 |
|
module.info.sv.auto | File | 95 B | 0644 |
|
module.info.th | File | 0 B | 0644 |
|
module.info.th.auto | File | 216 B | 0644 |
|
module.info.tr | File | 27 B | 0644 |
|
module.info.tr.auto | File | 131 B | 0644 |
|
module.info.uk | File | 0 B | 0644 |
|
module.info.uk.auto | File | 203 B | 0644 |
|
module.info.ur | File | 0 B | 0644 |
|
module.info.ur.auto | File | 176 B | 0644 |
|
module.info.vi | File | 0 B | 0644 |
|
module.info.vi.auto | File | 203 B | 0644 |
|
module.info.zh | File | 21 B | 0644 |
|
module.info.zh.auto | File | 94 B | 0644 |
|
module.info.zh_TW | File | 24 B | 0644 |
|
module.info.zh_TW.auto | File | 100 B | 0644 |
|
prefs.info | File | 60 B | 0644 |
|
rbac-mapping | File | 119 B | 0644 |
|
restart.cgi | File | 253 B | 0755 |
|
safeacl | File | 33 B | 0644 |
|
save_log.cgi | File | 8.79 KB | 0755 |
|
start.cgi | File | 372 B | 0755 |
|
syslog-lib.pl | File | 8.94 KB | 0755 |
|