Hi all
Since CU 173 the Zabbix Agent userparameter "ipfire.net.fw.hits.raw" did no longer work correctly due to grep complaining about a stray \ since grep v3.8. This is fixed in PATCH 2 of this set (by simply removing the stray 's).
And since I had to up the pak version for this fix I decided to also update the zabbix_agentd binary from 6.0.6 to 6.0.15 despite the fact that there are no subtantial code changes in the Zabbix Agent for Linux part of the codebase. (see PATCH 1 of this set)
I also had a Zabbix Agent logfile viewer for the webGUI still lying around here, waiting to be finished and released, I also included that in this updated pak version (PATCH 3) integrating Zabbix Agent a bit more into IPFire.
Regards
Robin
- Update from version 6.0.6 to 6.0.15 - Update of rootfile not required - Changelog No substantial changes for Agent Linux version Changelogs since 6.0.6: - https://www.zabbix.com/rn/rn6.0.7 - https://www.zabbix.com/rn/rn6.0.8 - https://www.zabbix.com/rn/rn6.0.9 - https://www.zabbix.com/rn/rn6.0.10 - https://www.zabbix.com/rn/rn6.0.11 - https://www.zabbix.com/rn/rn6.0.12 - https://www.zabbix.com/rn/rn6.0.13 - https://www.zabbix.com/rn/rn6.0.14 - https://www.zabbix.com/rn/rn6.0.15
Signed-off-by: Robin Roevens robin.roevens@disroot.org --- lfs/zabbix_agentd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/lfs/zabbix_agentd b/lfs/zabbix_agentd index d7b5a4b37..281bd9fa3 100644 --- a/lfs/zabbix_agentd +++ b/lfs/zabbix_agentd @@ -26,7 +26,7 @@ include Config
SUMMARY = Zabbix Agent
-VER = 6.0.6 +VER = 6.0.15
THISAPP = zabbix-$(VER) DL_FILE = $(THISAPP).tar.gz @@ -34,7 +34,7 @@ DL_FROM = $(URL_IPFIRE) DIR_APP = $(DIR_SRC)/$(THISAPP) TARGET = $(DIR_INFO)/$(THISAPP) PROG = zabbix_agentd -PAK_VER = 6 +PAK_VER = 7
DEPS = fping
@@ -48,7 +48,7 @@ objects = $(DL_FILE)
$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
-$(DL_FILE)_BLAKE2 = f9d07ca8938ae4e5e47048c32872644caeda0ecdef17513c63c63d1ce2aaa4ac0c92e6c70932bc598ff908419dae05bab32924f5973a5528b5668f7c7c2c5a17 +$(DL_FILE)_BLAKE2 = dfef2036df2afbc50f4706a98105311e859f21cd01b430bc26f960bc650ff2d83c0db2977a85561cc75ddeb5fbb7a6704948dfa17749b238583f4f50e15f18a7
install : $(TARGET)
Reviewed-by: Adolf Belka adolf.belka@ipfire.org
On 02/04/2023 13:07, Robin Roevens wrote:
- Update from version 6.0.6 to 6.0.15
- Update of rootfile not required
- Changelog No substantial changes for Agent Linux version Changelogs since 6.0.6:
- https://www.zabbix.com/rn/rn6.0.7
- https://www.zabbix.com/rn/rn6.0.8
- https://www.zabbix.com/rn/rn6.0.9
- https://www.zabbix.com/rn/rn6.0.10
- https://www.zabbix.com/rn/rn6.0.11
- https://www.zabbix.com/rn/rn6.0.12
- https://www.zabbix.com/rn/rn6.0.13
- https://www.zabbix.com/rn/rn6.0.14
- https://www.zabbix.com/rn/rn6.0.15
Signed-off-by: Robin Roevens robin.roevens@disroot.org
lfs/zabbix_agentd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/lfs/zabbix_agentd b/lfs/zabbix_agentd index d7b5a4b37..281bd9fa3 100644 --- a/lfs/zabbix_agentd +++ b/lfs/zabbix_agentd @@ -26,7 +26,7 @@ include Config
SUMMARY = Zabbix Agent
-VER = 6.0.6 +VER = 6.0.15
THISAPP = zabbix-$(VER) DL_FILE = $(THISAPP).tar.gz @@ -34,7 +34,7 @@ DL_FROM = $(URL_IPFIRE) DIR_APP = $(DIR_SRC)/$(THISAPP) TARGET = $(DIR_INFO)/$(THISAPP) PROG = zabbix_agentd -PAK_VER = 6 +PAK_VER = 7
DEPS = fping
@@ -48,7 +48,7 @@ objects = $(DL_FILE)
$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
-$(DL_FILE)_BLAKE2 = f9d07ca8938ae4e5e47048c32872644caeda0ecdef17513c63c63d1ce2aaa4ac0c92e6c70932bc598ff908419dae05bab32924f5973a5528b5668f7c7c2c5a17 +$(DL_FILE)_BLAKE2 = dfef2036df2afbc50f4706a98105311e859f21cd01b430bc26f960bc650ff2d83c0db2977a85561cc75ddeb5fbb7a6704948dfa17749b238583f4f50e15f18a7
install : $(TARGET)
Fix "grep: warning: stray \ before /" message on Zabbix Agent ipfire.net.fw.hits item introduced by grep 3.8 in https://git.ipfire.org/?p=ipfire-2.x.git;a=commit;h=40b5df3942149738529c22c9...
Signed-off-by: Robin Roevens robin.roevens@disroot.org --- config/zabbix_agentd/userparameter_ipfire.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/zabbix_agentd/userparameter_ipfire.conf b/config/zabbix_agentd/userparameter_ipfire.conf index 10c09c25d..c5a636edf 100644 --- a/config/zabbix_agentd/userparameter_ipfire.conf +++ b/config/zabbix_agentd/userparameter_ipfire.conf @@ -5,7 +5,7 @@ UserParameter=ipfire.net.gateway.pingtime,sudo /usr/sbin/fping -c 3 gateway 2>&1 # Internet Gateway availability, can be used to check Internet connection UserParameter=ipfire.net.gateway.ping,sudo /usr/sbin/fping -q -r 3 gateway; [ ! $? ]; echo $? # Firewall Filter Forward chain drops in bytes/chain (JSON), can be used for discovery of firewall chains and monitoring of firewall hits on each chain -UserParameter=ipfire.net.fw.hits.raw,sudo /usr/local/bin/getipstat -xf | grep "/* DROP_.* */$" | awk 'BEGIN { ORS = ""; print "["} { printf "%s{"chain": "%s", "bytes": "%s"}", separator, substr($11, 6), $2; separator = ", "; } END { print"]" }' +UserParameter=ipfire.net.fw.hits.raw,sudo /usr/local/bin/getipstat -xf | grep "/* DROP_.* */$" | awk 'BEGIN { ORS = ""; print "["} { printf "%s{"chain": "%s", "bytes": "%s"}", separator, substr($11, 6), $2; separator = ", "; } END { print"]" }' # Number of currently Active DHCP leases UserParameter=ipfire.dhcpd.clients,grep -s -E 'lease|bind' /var/state/dhcp/dhcpd.leases | sed ':a;/{$/{N;s/\n//;ba}' | grep "state active" | wc -l # Number of Captive Portal clients
Reviewed-by: Adolf Belka adolf.belka@ipfire.org
On 02/04/2023 13:07, Robin Roevens wrote:
Fix "grep: warning: stray \ before /" message on Zabbix Agent ipfire.net.fw.hits item introduced by grep 3.8 in https://git.ipfire.org/?p=ipfire-2.x.git;a=commit;h=40b5df3942149738529c22c9...
Signed-off-by: Robin Roevens robin.roevens@disroot.org
config/zabbix_agentd/userparameter_ipfire.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/zabbix_agentd/userparameter_ipfire.conf b/config/zabbix_agentd/userparameter_ipfire.conf index 10c09c25d..c5a636edf 100644 --- a/config/zabbix_agentd/userparameter_ipfire.conf +++ b/config/zabbix_agentd/userparameter_ipfire.conf @@ -5,7 +5,7 @@ UserParameter=ipfire.net.gateway.pingtime,sudo /usr/sbin/fping -c 3 gateway 2>&1 # Internet Gateway availability, can be used to check Internet connection UserParameter=ipfire.net.gateway.ping,sudo /usr/sbin/fping -q -r 3 gateway; [ ! $? ]; echo $? # Firewall Filter Forward chain drops in bytes/chain (JSON), can be used for discovery of firewall chains and monitoring of firewall hits on each chain -UserParameter=ipfire.net.fw.hits.raw,sudo /usr/local/bin/getipstat -xf | grep "/* DROP_.* */$" | awk 'BEGIN { ORS = ""; print "["} { printf "%s{"chain": "%s", "bytes": "%s"}", separator, substr($11, 6), $2; separator = ", "; } END { print"]" }' +UserParameter=ipfire.net.fw.hits.raw,sudo /usr/local/bin/getipstat -xf | grep "/* DROP_.* */$" | awk 'BEGIN { ORS = ""; print "["} { printf "%s{"chain": "%s", "bytes": "%s"}", separator, substr($11, 6), $2; separator = ", "; } END { print"]" }' # Number of currently Active DHCP leases UserParameter=ipfire.dhcpd.clients,grep -s -E 'lease|bind' /var/state/dhcp/dhcpd.leases | sed ':a;/{$/{N;s/\n//;ba}' | grep "state active" | wc -l # Number of Captive Portal clients
- Adds a simple logs viewer page logs.cgi/zabbix_agentd.dat, based on logs.cgi/logs.dat, to the Logs menu in GUI. - Changes permission of zabbix_agentd logfiles in logrotate config for GUI to be able to access the log files (640 to 644) - Changes file permissions of existing zabbix_agentd logfiles upon update of the package - Rootfile changes: added gui page, menu item-file, and addon language files - configroot rootfile changes: added logs menu item-file as comment - web-user-interface rootfile changes: added log viewer .dat as comment - Update language cache during install/uninstall
Signed-off-by: Robin Roevens robin.roevens@disroot.org --- config/menu/EX-zabbix_agentd.menu | 5 + config/rootfiles/common/configroot | 1 + config/rootfiles/common/web-user-interface | 1 + config/rootfiles/packages/zabbix_agentd | 6 + config/zabbix_agentd/logrotate | 2 +- config/zabbix_agentd/zabbix_agentd.de.pl | 8 + config/zabbix_agentd/zabbix_agentd.en.pl | 8 + config/zabbix_agentd/zabbix_agentd.fr.pl | 8 + config/zabbix_agentd/zabbix_agentd.nl.pl | 8 + html/cgi-bin/logs.cgi/zabbix_agentd.dat | 341 +++++++++++++++++++++ lfs/zabbix_agentd | 4 + src/paks/zabbix_agentd/install.sh | 1 + src/paks/zabbix_agentd/uninstall.sh | 1 + src/paks/zabbix_agentd/update.sh | 3 + 14 files changed, 396 insertions(+), 1 deletion(-) create mode 100644 config/menu/EX-zabbix_agentd.menu create mode 100644 config/zabbix_agentd/zabbix_agentd.de.pl create mode 100644 config/zabbix_agentd/zabbix_agentd.en.pl create mode 100644 config/zabbix_agentd/zabbix_agentd.fr.pl create mode 100644 config/zabbix_agentd/zabbix_agentd.nl.pl create mode 100644 html/cgi-bin/logs.cgi/zabbix_agentd.dat
diff --git a/config/menu/EX-zabbix_agentd.menu b/config/menu/EX-zabbix_agentd.menu new file mode 100644 index 000000000..dddd7f05e --- /dev/null +++ b/config/menu/EX-zabbix_agentd.menu @@ -0,0 +1,5 @@ + $sublogs->{'95.zabbixagent'} = {'caption' => $Lang::tr{'zabbix agent logs'}, + 'uri' => '/cgi-bin/logs.cgi/zabbix_agentd.dat', + 'title' => "$Lang::tr{'zabbix agent logs'}", + 'enabled' => 1 + }; diff --git a/config/rootfiles/common/configroot b/config/rootfiles/common/configroot index bc979cf2c..f12e2e0f0 100644 --- a/config/rootfiles/common/configroot +++ b/config/rootfiles/common/configroot @@ -126,6 +126,7 @@ var/ipfire/menu.d/70-log.menu #var/ipfire/menu.d/EX-samba.menu #var/ipfire/menu.d/EX-tor.menu #var/ipfire/menu.d/EX-wlanap.menu +#var/ipfire/menu.d/EX-zabbix_agentd.menu var/ipfire/modem var/ipfire/modem-lib.pl #var/ipfire/modem/defaults diff --git a/config/rootfiles/common/web-user-interface b/config/rootfiles/common/web-user-interface index 33f0d30a7..bc17b4ce4 100644 --- a/config/rootfiles/common/web-user-interface +++ b/config/rootfiles/common/web-user-interface @@ -49,6 +49,7 @@ srv/web/ipfire/cgi-bin/logs.cgi/showrequestfromip.dat srv/web/ipfire/cgi-bin/logs.cgi/showrequestfromport.dat srv/web/ipfire/cgi-bin/logs.cgi/summary.dat srv/web/ipfire/cgi-bin/logs.cgi/urlfilter.dat +#srv/web/ipfire/cgi-bin/logs.cgi/zabbix_agentd.dat srv/web/ipfire/cgi-bin/mac.cgi srv/web/ipfire/cgi-bin/mail.cgi srv/web/ipfire/cgi-bin/mdstat.cgi diff --git a/config/rootfiles/packages/zabbix_agentd b/config/rootfiles/packages/zabbix_agentd index 6f2c831d7..5b57026f5 100644 --- a/config/rootfiles/packages/zabbix_agentd +++ b/config/rootfiles/packages/zabbix_agentd @@ -7,6 +7,7 @@ etc/zabbix_agentd/scripts etc/zabbix_agentd/zabbix_agentd.conf etc/zabbix_agentd/zabbix_agentd.conf.example etc/zabbix_agentd/zabbix_agentd.d +srv/web/ipfire/cgi-bin/logs.cgi/zabbix_agentd.dat usr/bin/zabbix_get usr/bin/zabbix_sender #usr/lib/modules @@ -16,6 +17,11 @@ usr/sbin/zabbix_agentd #usr/share/man/man1/zabbix_sender.1 #usr/share/man/man8/zabbix_agentd.8 var/ipfire/backup/addons/includes/zabbix_agentd +var/ipfire/addon-lang/zabbix_agentd.de.pl +var/ipfire/addon-lang/zabbix_agentd.en.pl +var/ipfire/addon-lang/zabbix_agentd.fr.pl +var/ipfire/addon-lang/zabbix_agentd.nl.pl +var/ipfire/menu.d/EX-zabbix_agentd.menu var/ipfire/zabbix_agentd var/ipfire/zabbix_agentd/zabbix_agentd_ipfire_mandatory.conf var/ipfire/zabbix_agentd/userparameters diff --git a/config/zabbix_agentd/logrotate b/config/zabbix_agentd/logrotate index 83bbca9fb..46fee44f2 100644 --- a/config/zabbix_agentd/logrotate +++ b/config/zabbix_agentd/logrotate @@ -5,5 +5,5 @@ delaycompress missingok notifempty - create 0640 zabbix zabbix + create 0644 zabbix zabbix } diff --git a/config/zabbix_agentd/zabbix_agentd.de.pl b/config/zabbix_agentd/zabbix_agentd.de.pl new file mode 100644 index 000000000..910225242 --- /dev/null +++ b/config/zabbix_agentd/zabbix_agentd.de.pl @@ -0,0 +1,8 @@ +%tr = ( +%tr, + +'zabbix agent logs' => "Zabbix Agent-Protokolldateien", + +); + +#EOF diff --git a/config/zabbix_agentd/zabbix_agentd.en.pl b/config/zabbix_agentd/zabbix_agentd.en.pl new file mode 100644 index 000000000..1f523f926 --- /dev/null +++ b/config/zabbix_agentd/zabbix_agentd.en.pl @@ -0,0 +1,8 @@ +%tr = ( +%tr, + +'zabbix agent logs' => "Zabbix Agent Logs", + +); + +#EOF diff --git a/config/zabbix_agentd/zabbix_agentd.fr.pl b/config/zabbix_agentd/zabbix_agentd.fr.pl new file mode 100644 index 000000000..f7576ad2f --- /dev/null +++ b/config/zabbix_agentd/zabbix_agentd.fr.pl @@ -0,0 +1,8 @@ +%tr = ( +%tr, + +'zabbix agent logs' => "Rapports de Zabbix Agent", + +); + +#EOF diff --git a/config/zabbix_agentd/zabbix_agentd.nl.pl b/config/zabbix_agentd/zabbix_agentd.nl.pl new file mode 100644 index 000000000..1f523f926 --- /dev/null +++ b/config/zabbix_agentd/zabbix_agentd.nl.pl @@ -0,0 +1,8 @@ +%tr = ( +%tr, + +'zabbix agent logs' => "Zabbix Agent Logs", + +); + +#EOF diff --git a/html/cgi-bin/logs.cgi/zabbix_agentd.dat b/html/cgi-bin/logs.cgi/zabbix_agentd.dat new file mode 100644 index 000000000..047ca2e98 --- /dev/null +++ b/html/cgi-bin/logs.cgi/zabbix_agentd.dat @@ -0,0 +1,341 @@ +#!/usr/bin/perl +############################################################################### +# # +# IPFire.org - A linux based firewall # +# Copyright (C) 2020 IPFire Team info@ipfire.org # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see http://www.gnu.org/licenses/. # +# # +############################################################################### + +use strict; + +# enable only the following on debugging purpose +# use warnings; +# use CGI::Carp 'fatalsToBrowser'; + +require '/var/ipfire/general-functions.pl'; +require "${General::swroot}/lang.pl"; +require "${General::swroot}/header.pl"; + +my %color = (); +my %mainsettings = (); +&General::readhash("${General::swroot}/main/settings", %mainsettings); +&General::readhash("/srv/web/ipfire/html/themes/ipfire/include/colors.txt", %color); + +use POSIX(); + +my %cgiparams=(); +my %logsettings=(); +my $errormessage = ''; + +my @shortmonths = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', + 'Sep', 'Oct', 'Nov', 'Dec' ); +my @longmonths = ( $Lang::tr{'january'}, $Lang::tr{'february'}, $Lang::tr{'march'}, + $Lang::tr{'april'}, $Lang::tr{'may'}, $Lang::tr{'june'}, $Lang::tr{'july'}, $Lang::tr{'august'}, + $Lang::tr{'september'}, $Lang::tr{'october'}, $Lang::tr{'november'}, + $Lang::tr{'december'} ); + +my @now = localtime(); +my $dow = $now[6]; +my $doy = $now[7]; +my $tdoy = $now[7]; +my $year = $now[5]+1900; + +$cgiparams{'DAY'} = $now[3]; +$cgiparams{'MONTH'} = $now[4]; +$cgiparams{'ACTION'} = ''; + +&Header::getcgihash(%cgiparams); +$logsettings{'LOGVIEW_REVERSE'} = 'off'; +&General::readhash("${General::swroot}/logging/settings", %logsettings); +${Header::viewsize} = defined ($logsettings{'LOGVIEW_VIEWSIZE'}) ? $logsettings{'LOGVIEW_VIEWSIZE'} : 150; + +my $start = ($logsettings{'LOGVIEW_REVERSE'} eq 'on') ? 0x7FFFF000 : 0; #index of first line number to display + +if ($ENV{'QUERY_STRING'} && $cgiparams{'ACTION'} ne $Lang::tr{'update'}) { + my @temp = split(',',$ENV{'QUERY_STRING'}); + $start = $temp[0]; + $cgiparams{'MONTH'} = $temp[1]; + $cgiparams{'DAY'} = $temp[2]; +} + +if (!($cgiparams{'MONTH'} =~ /^(0|1|2|3|4|5|6|7|8|9|10|11)$/) || + !($cgiparams{'DAY'} =~ /^(0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)$/)) { + $cgiparams{'DAY'} = $now[3]; + $cgiparams{'MONTH'} = $now[4]; +} elsif($cgiparams{'ACTION'} eq '>>') { + my @temp_then=(); + my @temp_now = localtime(time); + $temp_now[4] = $cgiparams{'MONTH'}; + $temp_now[3] = $cgiparams{'DAY'}; + @temp_then = localtime(POSIX::mktime(@temp_now) + 86400); + ## Retrieve the same time on the next day + + ## 86400 seconds in a day + $cgiparams{'MONTH'} = $temp_then[4]; + $cgiparams{'DAY'} = $temp_then[3]; +} elsif($cgiparams{'ACTION'} eq '<<') { + my @temp_then=(); + my @temp_now = localtime(time); + $temp_now[4] = $cgiparams{'MONTH'}; + $temp_now[3] = $cgiparams{'DAY'}; + @temp_then = localtime(POSIX::mktime(@temp_now) - 86400); + ## Retrieve the same time on the next day - + ## 86400 seconds in a day + $cgiparams{'MONTH'} = $temp_then[4]; + $cgiparams{'DAY'} = $temp_then[3]; +} + +# Find in which file.gz is the log. Can be calculated because MONTHLY ROTATING of zabbix_agentd.log +my $gzindex; +my $date = $cgiparams{'DAY'} == 0 ? '' : $cgiparams{'DAY'} <= 9 ? "0$cgiparams{'DAY'}" : "$cgiparams{'DAY'}"; + +my @then = (); + +my $monthstr = ($cgiparams{'MONTH'} + 1) <= 9 ? "0" . ($cgiparams{'MONTH'} + 1) : ($cgiparams{'MONTH'} + 1); +my $daystr = $cgiparams{'DAY'} == 0 ? '..' : $cgiparams{'DAY'} <= 9 ? "0$cgiparams{'DAY'}" : "$cgiparams{'DAY'}"; +my $yearstr = $year; + +# Calculate time. If future date, calculate for past year !!! +if (( $cgiparams{'MONTH'} eq $now[4]) && ($cgiparams{'DAY'} > $now[3]) || + ( $cgiparams{'MONTH'} > $now[4] ) ) { + @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'}, $cgiparams{'MONTH'}, $year - 1901 )); + $date = "$longmonths[$cgiparams{'MONTH'}] $date, ". int($year-1); + $yearstr--; +} else { + @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'}, $cgiparams{'MONTH'}, $year - 1900 )); + $date = "$longmonths[$cgiparams{'MONTH'}] $date, $year"; +} + +$gzindex = $now[4] - $then[4]; +$gzindex += 12 if $gzindex < 0; + +my $lines = 0; +my @log=(); + +my $loop = 1; +my $filestr = 0; +my $search_for_end = 0; + +while ($gzindex >=0 && $loop) { + # calculate file name + if ($gzindex == 0) { + $filestr = "/var/log/zabbix/zabbix_agentd.log"; + } else { + $filestr = "/var/log/zabbix/zabbix_agentd.log.$gzindex"; + $filestr = "$filestr.gz" if -f "$filestr.gz"; + } + # now read file if existing + if (open (FILE,($filestr =~ /.gz$/ ? "gzip -dc $filestr |" : $filestr))) { + READ:while (<FILE>) { + my $line = $_; + if ($line =~ /^ *[0-9]+:${yearstr}${monthstr}${daystr}:[0-9]{6}.[0-9]{3} (.*)/) { + # when standard viewing, just keep in memory the correct slice + # it starts at '$start' and size is $viewport + # If export, then keep all lines... + if ($cgiparams{'ACTION'} eq $Lang::tr{'export'}){ + $log[$lines++] = "$line"; + } else { + if ($lines++ < ($start + $Header::viewsize)) { + push(@log,"$line"); + if (@log > $Header::viewsize) { + shift (@log); + } + } + } + $search_for_end = 1; # we find the start of slice, can look for end now + } else { + if ($search_for_end == 1) { + #finish read files when date is over (test month equality only) + $line =~ /^ *[0-9]+:[0-9]{4}([0-9]{2})([0-9]{2}):[0-9]{6}.[0-9]{3} .*$/; + $loop = 0 if ( ($1 ne $monthstr) || ( ($daystr ne '..') && ($daystr ne $2) ) ); + } + } + } + close (FILE); + } + $gzindex--; # will try next gz file eg 40,39,38,.... because it may have holes +} + +if ($cgiparams{'ACTION'} eq $Lang::tr{'export'}) { + print "Content-type: text/plain\n\n"; + print "IPFire $Lang::tr{'zabbix agent logs'}\r\n"; + print "$Lang::tr{'date'}: $date\r\n\r\n"; + + if ($logsettings{'LOGVIEW_REVERSE'} eq 'on') { @log = reverse @log; } + + foreach $_ (@log) { + /^ *([0-9]+):[0-9]{6}([0-9]{2}):([0-9]{2})([0-9]{2})([0-9]{2}.[0-9]{3}) (.*)$/; + my $pid = $1; + my $day = $2; + $day =~ tr / /0/; + my $time = $cgiparams{'DAY'} ? "$3:$4:$5" : "$day/$3:$4:$5" ; + print "$time ($pid) $6\r\n"; + } + exit 0; +} + +&Header::showhttpheaders(); + +&Header::openpage($Lang::tr{'zabbix agent logs'}, 1, ''); + +&Header::openbigbox('100%', 'left', '', $errormessage); + +if ($errormessage) { + &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); + print "<font class='base'>$errormessage </font>\n"; + &Header::closebox(); +} + +&Header::openbox('100%', 'left', "$Lang::tr{'settings'}:"); + +print <<END +<form method='post' action='$ENV{'SCRIPT_NAME'}'> +<table width='100%'> +<tr> + <td width='10%' class='base'>$Lang::tr{'month'}:</td> + <td width='25%'> + <select name='MONTH'> +END +; +for (my $month = 0; $month < 12; $month++) { + print "\t<option "; + if ($month == $cgiparams{'MONTH'}) { + print "selected='selected' "; } + print "value='$month'>$longmonths[$month]</option>\n"; +} +print <<END + </select> + </td> + <td width='10%' class='base'>$Lang::tr{'day'}:</td> + <td width='25%'> + <select name='DAY'> +END +; +print "<option value='0'>$Lang::tr{'all'}</option>\n"; +for (my $day = 1; $day <= 31; $day++) { + print "\t<option "; + if ($day == $cgiparams{'DAY'}) { + print "selected='selected' "; } + print "value='$day'>$day</option>\n"; +} +print <<END +</select> +</td> +<td width='5%' align='center'><input type='submit' name='ACTION' title='$Lang::tr{'day before'}' value='<<' /></td> +<td width='5%' align='center'><input type='submit' name='ACTION' title='$Lang::tr{'day after'}' value='>>' /></td> +<td width='10%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'update'}' /></td> +<td width='10%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'export'}' /></td> +</tr> +</table> +</form> +END +; + +&Header::closebox(); + +&Header::openbox('100%', 'left', $Lang::tr{'log'}); +print "<p><b>$Lang::tr{'total hits for log section'} $date: $lines</b></p>"; + +$start = $lines - ${Header::viewsize} if ($start >= $lines - ${Header::viewsize}); +$start = 0 if ($start < 0); + +my $prev; +if ($start == 0) { + $prev = -1; +} else { + $prev = $start - ${Header::viewsize}; + $prev = 0 if ( $prev < 0); +} + +my $next; +if ($start == $lines - ${Header::viewsize}) { + $next = -1; +} else { + $next = $start + ${Header::viewsize}; + $next = $lines - ${Header::viewsize} if ($next >= $lines - ${Header::viewsize}); +} + +if ($logsettings{'LOGVIEW_REVERSE'} eq 'on') { @log = reverse @log; } +if ($lines != 0) { &oldernewer(); } + +print <<END +<table width='100%' class='tbl'> +<tr> + <th width='15%' align='center' class='boldbase'><b>$Lang::tr{'time'}</b></th> + <th width='10%' align='center' class='boldbase'><b>PID</b></th> + <th width='75%'> </th> +</tr> +END +; + +$lines = 0; +foreach $_ (@log) { + /^ *([0-9]+):[0-9]{6}([0-9]{2}):([0-9]{2})([0-9]{2})([0-9]{2}.[0-9]{3}) (.*)$/; + my $pid = $1; + my $day = $2; + $day =~ tr / /0/; + my $time = $cgiparams{'DAY'} ? "$3:$4:$5" : "$day/$3:$4:$5" ; + my $data = $6; + my $col=""; + + if ($lines % 2) { + print "<tr>"; + $col="bgcolor='$color{'color20'}'"; + } else { + print "<tr>"; + $col="bgcolor='$color{'color22'}'"; + } + print "<td $col>$time<td $col>$pid<td $col>" .&Header::cleanhtml ("$data", 'y') . "</td></tr>\n"; + $lines++; +} +print "</table>"; + +&oldernewer(); + +&Header::closebox(); + +&Header::closebigbox(); + +&Header::closepage(); + +sub oldernewer { + print <<END +<table width='100%'> +<tr> +END + ; + + print "<td align='center' width='50%'>"; + if ($prev != -1) { + print "<a href='/cgi-bin/logs.cgi/zabbix_agentd.dat?$prev,$cgiparams{'MONTH'},$cgiparams{'DAY'}'>$Lang::tr{'older'}</a>"; + } else { + print "$Lang::tr{'older'}"; + } + print "</td>\n"; + + print "<td align='center' width='50%'>"; + if ($next >= 0) { + print "<a href='/cgi-bin/logs.cgi/zabbix_agentd.dat?$next,$cgiparams{'MONTH'},$cgiparams{'DAY'}'>$Lang::tr{'newer'}</a>"; + } else { + print "$Lang::tr{'newer'}"; + } + print "</td>\n"; + + print <<END +</tr> +</table> +END + ; +} diff --git a/lfs/zabbix_agentd b/lfs/zabbix_agentd index 281bd9fa3..49b8440f8 100644 --- a/lfs/zabbix_agentd +++ b/lfs/zabbix_agentd @@ -139,6 +139,10 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) -mkdir -pv /etc/logrotate.d install -v -m 644 $(DIR_SRC)/config/zabbix_agentd/logrotate \ /etc/logrotate.d/zabbix_agentd + + # Install addon-specific language-files. + install -v -m 004 $(DIR_SRC)/config/zabbix_agentd/zabbix_agentd.*.pl \ + /var/ipfire/addon-lang/
@rm -rf $(DIR_APP) @$(POSTBUILD) diff --git a/src/paks/zabbix_agentd/install.sh b/src/paks/zabbix_agentd/install.sh index 80632d1ec..465ea7e8a 100644 --- a/src/paks/zabbix_agentd/install.sh +++ b/src/paks/zabbix_agentd/install.sh @@ -32,6 +32,7 @@ if ! getent passwd zabbix; then fi
extract_files +/usr/local/bin/update-lang-cache
# Create symlinks for runlevel interaction. ln -sf ../init.d/zabbix_agentd /etc/rc.d/rc3.d/S65zabbix_agentd diff --git a/src/paks/zabbix_agentd/uninstall.sh b/src/paks/zabbix_agentd/uninstall.sh index edff3b818..4342384de 100644 --- a/src/paks/zabbix_agentd/uninstall.sh +++ b/src/paks/zabbix_agentd/uninstall.sh @@ -25,6 +25,7 @@ stop_service ${NAME} make_backup ${NAME} remove_files +/usr/local/bin/update-lang-cache
# Remove init-scripts and symlinks rm -rfv /etc/rc.d/rc*.d/*zabbix_agentd diff --git a/src/paks/zabbix_agentd/update.sh b/src/paks/zabbix_agentd/update.sh index a41e72ab4..f01e32810 100644 --- a/src/paks/zabbix_agentd/update.sh +++ b/src/paks/zabbix_agentd/update.sh @@ -40,6 +40,9 @@ if [ -f /etc/sudoers.d/zabbix ]; then fi fi
+# Fix permissions on /var/log/zabbix/* to allow GUI to read the logfiles. +find /var/log/zabbix -perm 640 -exec chmod 644 {} ; + extract_backup_includes ./uninstall.sh ./install.sh
Hello Robin,
Thanks for the patch.
On 2 Apr 2023, at 12:07, Robin Roevens robin.roevens@disroot.org wrote:
- Adds a simple logs viewer page logs.cgi/zabbix_agentd.dat, based
on logs.cgi/logs.dat, to the Logs menu in GUI.
Why is an extra CGI script needed? Could not this not be integrated into logs.dat?
-Michael
- Changes permission of zabbix_agentd logfiles in logrotate config
for GUI to be able to access the log files (640 to 644)
- Changes file permissions of existing zabbix_agentd logfiles upon
update of the package
- Rootfile changes: added gui page, menu item-file, and addon
language files
- configroot rootfile changes: added logs menu item-file as comment
- web-user-interface rootfile changes: added log viewer .dat as comment
- Update language cache during install/uninstall
Signed-off-by: Robin Roevens robin.roevens@disroot.org
config/menu/EX-zabbix_agentd.menu | 5 + config/rootfiles/common/configroot | 1 + config/rootfiles/common/web-user-interface | 1 + config/rootfiles/packages/zabbix_agentd | 6 + config/zabbix_agentd/logrotate | 2 +- config/zabbix_agentd/zabbix_agentd.de.pl | 8 + config/zabbix_agentd/zabbix_agentd.en.pl | 8 + config/zabbix_agentd/zabbix_agentd.fr.pl | 8 + config/zabbix_agentd/zabbix_agentd.nl.pl | 8 + html/cgi-bin/logs.cgi/zabbix_agentd.dat | 341 +++++++++++++++++++++ lfs/zabbix_agentd | 4 + src/paks/zabbix_agentd/install.sh | 1 + src/paks/zabbix_agentd/uninstall.sh | 1 + src/paks/zabbix_agentd/update.sh | 3 + 14 files changed, 396 insertions(+), 1 deletion(-) create mode 100644 config/menu/EX-zabbix_agentd.menu create mode 100644 config/zabbix_agentd/zabbix_agentd.de.pl create mode 100644 config/zabbix_agentd/zabbix_agentd.en.pl create mode 100644 config/zabbix_agentd/zabbix_agentd.fr.pl create mode 100644 config/zabbix_agentd/zabbix_agentd.nl.pl create mode 100644 html/cgi-bin/logs.cgi/zabbix_agentd.dat
diff --git a/config/menu/EX-zabbix_agentd.menu b/config/menu/EX-zabbix_agentd.menu new file mode 100644 index 000000000..dddd7f05e --- /dev/null +++ b/config/menu/EX-zabbix_agentd.menu @@ -0,0 +1,5 @@
- $sublogs->{'95.zabbixagent'} = {'caption' => $Lang::tr{'zabbix agent logs'},
- 'uri' => '/cgi-bin/logs.cgi/zabbix_agentd.dat',
- 'title' => "$Lang::tr{'zabbix agent logs'}",
- 'enabled' => 1
- };
diff --git a/config/rootfiles/common/configroot b/config/rootfiles/common/configroot index bc979cf2c..f12e2e0f0 100644 --- a/config/rootfiles/common/configroot +++ b/config/rootfiles/common/configroot @@ -126,6 +126,7 @@ var/ipfire/menu.d/70-log.menu #var/ipfire/menu.d/EX-samba.menu #var/ipfire/menu.d/EX-tor.menu #var/ipfire/menu.d/EX-wlanap.menu +#var/ipfire/menu.d/EX-zabbix_agentd.menu var/ipfire/modem var/ipfire/modem-lib.pl #var/ipfire/modem/defaults diff --git a/config/rootfiles/common/web-user-interface b/config/rootfiles/common/web-user-interface index 33f0d30a7..bc17b4ce4 100644 --- a/config/rootfiles/common/web-user-interface +++ b/config/rootfiles/common/web-user-interface @@ -49,6 +49,7 @@ srv/web/ipfire/cgi-bin/logs.cgi/showrequestfromip.dat srv/web/ipfire/cgi-bin/logs.cgi/showrequestfromport.dat srv/web/ipfire/cgi-bin/logs.cgi/summary.dat srv/web/ipfire/cgi-bin/logs.cgi/urlfilter.dat +#srv/web/ipfire/cgi-bin/logs.cgi/zabbix_agentd.dat srv/web/ipfire/cgi-bin/mac.cgi srv/web/ipfire/cgi-bin/mail.cgi srv/web/ipfire/cgi-bin/mdstat.cgi diff --git a/config/rootfiles/packages/zabbix_agentd b/config/rootfiles/packages/zabbix_agentd index 6f2c831d7..5b57026f5 100644 --- a/config/rootfiles/packages/zabbix_agentd +++ b/config/rootfiles/packages/zabbix_agentd @@ -7,6 +7,7 @@ etc/zabbix_agentd/scripts etc/zabbix_agentd/zabbix_agentd.conf etc/zabbix_agentd/zabbix_agentd.conf.example etc/zabbix_agentd/zabbix_agentd.d +srv/web/ipfire/cgi-bin/logs.cgi/zabbix_agentd.dat usr/bin/zabbix_get usr/bin/zabbix_sender #usr/lib/modules @@ -16,6 +17,11 @@ usr/sbin/zabbix_agentd #usr/share/man/man1/zabbix_sender.1 #usr/share/man/man8/zabbix_agentd.8 var/ipfire/backup/addons/includes/zabbix_agentd +var/ipfire/addon-lang/zabbix_agentd.de.pl +var/ipfire/addon-lang/zabbix_agentd.en.pl +var/ipfire/addon-lang/zabbix_agentd.fr.pl +var/ipfire/addon-lang/zabbix_agentd.nl.pl +var/ipfire/menu.d/EX-zabbix_agentd.menu var/ipfire/zabbix_agentd var/ipfire/zabbix_agentd/zabbix_agentd_ipfire_mandatory.conf var/ipfire/zabbix_agentd/userparameters diff --git a/config/zabbix_agentd/logrotate b/config/zabbix_agentd/logrotate index 83bbca9fb..46fee44f2 100644 --- a/config/zabbix_agentd/logrotate +++ b/config/zabbix_agentd/logrotate @@ -5,5 +5,5 @@ delaycompress missingok notifempty
- create 0640 zabbix zabbix
- create 0644 zabbix zabbix
} diff --git a/config/zabbix_agentd/zabbix_agentd.de.pl b/config/zabbix_agentd/zabbix_agentd.de.pl new file mode 100644 index 000000000..910225242 --- /dev/null +++ b/config/zabbix_agentd/zabbix_agentd.de.pl @@ -0,0 +1,8 @@ +%tr = ( +%tr,
+'zabbix agent logs' => "Zabbix Agent-Protokolldateien",
+);
+#EOF diff --git a/config/zabbix_agentd/zabbix_agentd.en.pl b/config/zabbix_agentd/zabbix_agentd.en.pl new file mode 100644 index 000000000..1f523f926 --- /dev/null +++ b/config/zabbix_agentd/zabbix_agentd.en.pl @@ -0,0 +1,8 @@ +%tr = ( +%tr,
+'zabbix agent logs' => "Zabbix Agent Logs",
+);
+#EOF diff --git a/config/zabbix_agentd/zabbix_agentd.fr.pl b/config/zabbix_agentd/zabbix_agentd.fr.pl new file mode 100644 index 000000000..f7576ad2f --- /dev/null +++ b/config/zabbix_agentd/zabbix_agentd.fr.pl @@ -0,0 +1,8 @@ +%tr = ( +%tr,
+'zabbix agent logs' => "Rapports de Zabbix Agent",
+);
+#EOF diff --git a/config/zabbix_agentd/zabbix_agentd.nl.pl b/config/zabbix_agentd/zabbix_agentd.nl.pl new file mode 100644 index 000000000..1f523f926 --- /dev/null +++ b/config/zabbix_agentd/zabbix_agentd.nl.pl @@ -0,0 +1,8 @@ +%tr = ( +%tr,
+'zabbix agent logs' => "Zabbix Agent Logs",
+);
+#EOF diff --git a/html/cgi-bin/logs.cgi/zabbix_agentd.dat b/html/cgi-bin/logs.cgi/zabbix_agentd.dat new file mode 100644 index 000000000..047ca2e98 --- /dev/null +++ b/html/cgi-bin/logs.cgi/zabbix_agentd.dat @@ -0,0 +1,341 @@ +#!/usr/bin/perl +############################################################################### +# # +# IPFire.org - A linux based firewall # +# Copyright (C) 2020 IPFire Team info@ipfire.org # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see http://www.gnu.org/licenses/. # +# # +###############################################################################
+use strict;
+# enable only the following on debugging purpose +# use warnings; +# use CGI::Carp 'fatalsToBrowser';
+require '/var/ipfire/general-functions.pl'; +require "${General::swroot}/lang.pl"; +require "${General::swroot}/header.pl";
+my %color = (); +my %mainsettings = (); +&General::readhash("${General::swroot}/main/settings", %mainsettings); +&General::readhash("/srv/web/ipfire/html/themes/ipfire/include/colors.txt", %color);
+use POSIX();
+my %cgiparams=(); +my %logsettings=(); +my $errormessage = '';
+my @shortmonths = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug',
- 'Sep', 'Oct', 'Nov', 'Dec' );
+my @longmonths = ( $Lang::tr{'january'}, $Lang::tr{'february'}, $Lang::tr{'march'},
- $Lang::tr{'april'}, $Lang::tr{'may'}, $Lang::tr{'june'}, $Lang::tr{'july'}, $Lang::tr{'august'},
- $Lang::tr{'september'}, $Lang::tr{'october'}, $Lang::tr{'november'},
- $Lang::tr{'december'} );
+my @now = localtime(); +my $dow = $now[6]; +my $doy = $now[7]; +my $tdoy = $now[7]; +my $year = $now[5]+1900;
+$cgiparams{'DAY'} = $now[3]; +$cgiparams{'MONTH'} = $now[4]; +$cgiparams{'ACTION'} = '';
+&Header::getcgihash(%cgiparams); +$logsettings{'LOGVIEW_REVERSE'} = 'off'; +&General::readhash("${General::swroot}/logging/settings", %logsettings); +${Header::viewsize} = defined ($logsettings{'LOGVIEW_VIEWSIZE'}) ? $logsettings{'LOGVIEW_VIEWSIZE'} : 150;
+my $start = ($logsettings{'LOGVIEW_REVERSE'} eq 'on') ? 0x7FFFF000 : 0; #index of first line number to display
+if ($ENV{'QUERY_STRING'} && $cgiparams{'ACTION'} ne $Lang::tr{'update'}) {
- my @temp = split(',',$ENV{'QUERY_STRING'});
- $start = $temp[0];
- $cgiparams{'MONTH'} = $temp[1];
- $cgiparams{'DAY'} = $temp[2];
+}
+if (!($cgiparams{'MONTH'} =~ /^(0|1|2|3|4|5|6|7|8|9|10|11)$/) ||
- !($cgiparams{'DAY'} =~ /^(0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31)$/)) {
- $cgiparams{'DAY'} = $now[3];
- $cgiparams{'MONTH'} = $now[4];
+} elsif($cgiparams{'ACTION'} eq '>>') {
- my @temp_then=();
- my @temp_now = localtime(time);
- $temp_now[4] = $cgiparams{'MONTH'};
- $temp_now[3] = $cgiparams{'DAY'};
- @temp_then = localtime(POSIX::mktime(@temp_now) + 86400);
- ## Retrieve the same time on the next day +
- ## 86400 seconds in a day
- $cgiparams{'MONTH'} = $temp_then[4];
- $cgiparams{'DAY'} = $temp_then[3];
+} elsif($cgiparams{'ACTION'} eq '<<') {
- my @temp_then=();
- my @temp_now = localtime(time);
- $temp_now[4] = $cgiparams{'MONTH'};
- $temp_now[3] = $cgiparams{'DAY'};
- @temp_then = localtime(POSIX::mktime(@temp_now) - 86400);
- ## Retrieve the same time on the next day -
- ## 86400 seconds in a day
- $cgiparams{'MONTH'} = $temp_then[4];
- $cgiparams{'DAY'} = $temp_then[3];
+}
+# Find in which file.gz is the log. Can be calculated because MONTHLY ROTATING of zabbix_agentd.log +my $gzindex; +my $date = $cgiparams{'DAY'} == 0 ? '' : $cgiparams{'DAY'} <= 9 ? "0$cgiparams{'DAY'}" : "$cgiparams{'DAY'}";
+my @then = ();
+my $monthstr = ($cgiparams{'MONTH'} + 1) <= 9 ? "0" . ($cgiparams{'MONTH'} + 1) : ($cgiparams{'MONTH'} + 1); +my $daystr = $cgiparams{'DAY'} == 0 ? '..' : $cgiparams{'DAY'} <= 9 ? "0$cgiparams{'DAY'}" : "$cgiparams{'DAY'}"; +my $yearstr = $year;
+# Calculate time. If future date, calculate for past year !!! +if (( $cgiparams{'MONTH'} eq $now[4]) && ($cgiparams{'DAY'} > $now[3]) ||
- ( $cgiparams{'MONTH'} > $now[4] ) ) {
- @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'}, $cgiparams{'MONTH'}, $year - 1901 ));
- $date = "$longmonths[$cgiparams{'MONTH'}] $date, ". int($year-1);
- $yearstr--;
+} else {
- @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'}, $cgiparams{'MONTH'}, $year - 1900 ));
- $date = "$longmonths[$cgiparams{'MONTH'}] $date, $year";
+}
+$gzindex = $now[4] - $then[4]; +$gzindex += 12 if $gzindex < 0;
+my $lines = 0; +my @log=();
+my $loop = 1; +my $filestr = 0; +my $search_for_end = 0;
+while ($gzindex >=0 && $loop) {
- # calculate file name
- if ($gzindex == 0) {
- $filestr = "/var/log/zabbix/zabbix_agentd.log";
- } else {
- $filestr = "/var/log/zabbix/zabbix_agentd.log.$gzindex";
- $filestr = "$filestr.gz" if -f "$filestr.gz";
- }
- # now read file if existing
- if (open (FILE,($filestr =~ /.gz$/ ? "gzip -dc $filestr |" : $filestr))) {
- READ:while (<FILE>) {
- my $line = $_;
- if ($line =~ /^ *[0-9]+:${yearstr}${monthstr}${daystr}:[0-9]{6}.[0-9]{3} (.*)/) {
- # when standard viewing, just keep in memory the correct slice
- # it starts at '$start' and size is $viewport
- # If export, then keep all lines...
- if ($cgiparams{'ACTION'} eq $Lang::tr{'export'}){
- $log[$lines++] = "$line";
- } else {
- if ($lines++ < ($start + $Header::viewsize)) {
- push(@log,"$line");
- if (@log > $Header::viewsize) {
- shift (@log);
- }
- }
- }
- $search_for_end = 1; # we find the start of slice, can look for end now
- } else {
- if ($search_for_end == 1) {
- #finish read files when date is over (test month equality only)
- $line =~ /^ *[0-9]+:[0-9]{4}([0-9]{2})([0-9]{2}):[0-9]{6}.[0-9]{3} .*$/;
- $loop = 0 if ( ($1 ne $monthstr) || ( ($daystr ne '..') && ($daystr ne $2) ) );
- }
- }
- }
- close (FILE);
- }
- $gzindex--; # will try next gz file eg 40,39,38,.... because it may have holes
+}
+if ($cgiparams{'ACTION'} eq $Lang::tr{'export'}) {
- print "Content-type: text/plain\n\n";
- print "IPFire $Lang::tr{'zabbix agent logs'}\r\n";
- print "$Lang::tr{'date'}: $date\r\n\r\n";
- if ($logsettings{'LOGVIEW_REVERSE'} eq 'on') { @log = reverse @log; }
- foreach $_ (@log) {
- /^ *([0-9]+):[0-9]{6}([0-9]{2}):([0-9]{2})([0-9]{2})([0-9]{2}.[0-9]{3}) (.*)$/;
- my $pid = $1;
- my $day = $2;
- $day =~ tr / /0/;
- my $time = $cgiparams{'DAY'} ? "$3:$4:$5" : "$day/$3:$4:$5" ;
- print "$time ($pid) $6\r\n";
- }
- exit 0;
+}
+&Header::showhttpheaders();
+&Header::openpage($Lang::tr{'zabbix agent logs'}, 1, '');
+&Header::openbigbox('100%', 'left', '', $errormessage);
+if ($errormessage) {
- &Header::openbox('100%', 'left', $Lang::tr{'error messages'});
- print "<font class='base'>$errormessage </font>\n";
- &Header::closebox();
+}
+&Header::openbox('100%', 'left', "$Lang::tr{'settings'}:");
+print <<END +<form method='post' action='$ENV{'SCRIPT_NAME'}'> +<table width='100%'> +<tr>
<td width='10%' class='base'>$Lang::tr{'month'}:</td>
<td width='25%'>
<select name='MONTH'>
+END +; +for (my $month = 0; $month < 12; $month++) {
- print "\t<option ";
- if ($month == $cgiparams{'MONTH'}) {
- print "selected='selected' "; }
- print "value='$month'>$longmonths[$month]</option>\n";
+} +print <<END
</select>
</td>
<td width='10%' class='base'>$Lang::tr{'day'}:</td>
<td width='25%'>
<select name='DAY'>
+END +; +print "<option value='0'>$Lang::tr{'all'}</option>\n"; +for (my $day = 1; $day <= 31; $day++) {
- print "\t<option ";
- if ($day == $cgiparams{'DAY'}) {
- print "selected='selected' "; }
- print "value='$day'>$day</option>\n";
+} +print <<END +</select> +</td> +<td width='5%' align='center'><input type='submit' name='ACTION' title='$Lang::tr{'day before'}' value='<<' /></td> +<td width='5%' align='center'><input type='submit' name='ACTION' title='$Lang::tr{'day after'}' value='>>' /></td> +<td width='10%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'update'}' /></td> +<td width='10%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'export'}' /></td> +</tr> +</table> +</form> +END +;
+&Header::closebox();
+&Header::openbox('100%', 'left', $Lang::tr{'log'}); +print "<p><b>$Lang::tr{'total hits for log section'} $date: $lines</b></p>";
+$start = $lines - ${Header::viewsize} if ($start >= $lines - ${Header::viewsize}); +$start = 0 if ($start < 0);
+my $prev; +if ($start == 0) {
- $prev = -1;
+} else {
- $prev = $start - ${Header::viewsize};
- $prev = 0 if ( $prev < 0);
+}
+my $next; +if ($start == $lines - ${Header::viewsize}) {
- $next = -1;
+} else {
- $next = $start + ${Header::viewsize};
- $next = $lines - ${Header::viewsize} if ($next >= $lines - ${Header::viewsize});
+}
+if ($logsettings{'LOGVIEW_REVERSE'} eq 'on') { @log = reverse @log; } +if ($lines != 0) { &oldernewer(); }
+print <<END +<table width='100%' class='tbl'> +<tr>
<th width='15%' align='center' class='boldbase'><b>$Lang::tr{'time'}</b></th>
<th width='10%' align='center' class='boldbase'><b>PID</b></th>
<th width='75%'> </th>
+</tr> +END +;
+$lines = 0; +foreach $_ (@log) {
- /^ *([0-9]+):[0-9]{6}([0-9]{2}):([0-9]{2})([0-9]{2})([0-9]{2}.[0-9]{3}) (.*)$/;
- my $pid = $1;
- my $day = $2;
- $day =~ tr / /0/;
- my $time = $cgiparams{'DAY'} ? "$3:$4:$5" : "$day/$3:$4:$5" ;
- my $data = $6;
- my $col="";
- if ($lines % 2) {
- print "<tr>";
- $col="bgcolor='$color{'color20'}'";
- } else {
- print "<tr>";
- $col="bgcolor='$color{'color22'}'";
- }
- print "<td $col>$time<td $col>$pid<td $col>" .&Header::cleanhtml ("$data", 'y') . "</td></tr>\n";
- $lines++;
+} +print "</table>";
+&oldernewer();
+&Header::closebox();
+&Header::closebigbox();
+&Header::closepage();
+sub oldernewer {
- print <<END
+<table width='100%'> +<tr> +END
- ;
- print "<td align='center' width='50%'>";
- if ($prev != -1) {
- print "<a href='/cgi-bin/logs.cgi/zabbix_agentd.dat?$prev,$cgiparams{'MONTH'},$cgiparams{'DAY'}'>$Lang::tr{'older'}</a>";
- } else {
- print "$Lang::tr{'older'}";
- }
- print "</td>\n";
- print "<td align='center' width='50%'>";
- if ($next >= 0) {
- print "<a href='/cgi-bin/logs.cgi/zabbix_agentd.dat?$next,$cgiparams{'MONTH'},$cgiparams{'DAY'}'>$Lang::tr{'newer'}</a>";
- } else {
- print "$Lang::tr{'newer'}";
- }
- print "</td>\n";
- print <<END
+</tr> +</table> +END
- ;
+} diff --git a/lfs/zabbix_agentd b/lfs/zabbix_agentd index 281bd9fa3..49b8440f8 100644 --- a/lfs/zabbix_agentd +++ b/lfs/zabbix_agentd @@ -139,6 +139,10 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) -mkdir -pv /etc/logrotate.d install -v -m 644 $(DIR_SRC)/config/zabbix_agentd/logrotate \ /etc/logrotate.d/zabbix_agentd
- # Install addon-specific language-files.
- install -v -m 004 $(DIR_SRC)/config/zabbix_agentd/zabbix_agentd.*.pl \
- /var/ipfire/addon-lang/
@rm -rf $(DIR_APP) @$(POSTBUILD) diff --git a/src/paks/zabbix_agentd/install.sh b/src/paks/zabbix_agentd/install.sh index 80632d1ec..465ea7e8a 100644 --- a/src/paks/zabbix_agentd/install.sh +++ b/src/paks/zabbix_agentd/install.sh @@ -32,6 +32,7 @@ if ! getent passwd zabbix; then fi
extract_files +/usr/local/bin/update-lang-cache
# Create symlinks for runlevel interaction. ln -sf ../init.d/zabbix_agentd /etc/rc.d/rc3.d/S65zabbix_agentd diff --git a/src/paks/zabbix_agentd/uninstall.sh b/src/paks/zabbix_agentd/uninstall.sh index edff3b818..4342384de 100644 --- a/src/paks/zabbix_agentd/uninstall.sh +++ b/src/paks/zabbix_agentd/uninstall.sh @@ -25,6 +25,7 @@ stop_service ${NAME} make_backup ${NAME} remove_files +/usr/local/bin/update-lang-cache
# Remove init-scripts and symlinks rm -rfv /etc/rc.d/rc*.d/*zabbix_agentd diff --git a/src/paks/zabbix_agentd/update.sh b/src/paks/zabbix_agentd/update.sh index a41e72ab4..f01e32810 100644 --- a/src/paks/zabbix_agentd/update.sh +++ b/src/paks/zabbix_agentd/update.sh @@ -40,6 +40,9 @@ if [ -f /etc/sudoers.d/zabbix ]; then fi fi
+# Fix permissions on /var/log/zabbix/* to allow GUI to read the logfiles. +find /var/log/zabbix -perm 640 -exec chmod 644 {} ;
extract_backup_includes ./uninstall.sh ./install.sh -- 2.40.0
-- Dit bericht is gescanned op virussen en andere gevaarlijke inhoud door MailScanner en lijkt schoon te zijn.
Hi Michael
Michael Tremer schreef op di 11-04-2023 om 13:48 [+0100]:
Hello Robin,
Thanks for the patch.
On 2 Apr 2023, at 12:07, Robin Roevens robin.roevens@disroot.org wrote:
- Adds a simple logs viewer page logs.cgi/zabbix_agentd.dat, based
on logs.cgi/logs.dat, to the Logs menu in GUI.
Why is an extra CGI script needed? Could not this not be integrated into logs.dat?
I don't see how to integrate it into logs.dat as a conditional item only displayed when the addon is installed in a clean way and without 'contaminating' ipfire core wui files with too much addon-specific code.
Logs.dat is currently designed to read syslog-style formatted logging lines (from /var/log/messages and /var/log/mail) but for zabbix_agent (/var/log/zabbix/zabbix_agentd.log) both the line format and the date/time format of the zabbix_agentd logs are different, as is the log rotation frequency (monthly vs weekly).
This would mean I would have to have implement an alternative log-file- index calculation, and different regexes for parsing log lines when zabbix_agent is selected in logs.dat and even conditionally reformatting the log-line itself by adding the logging PID to it in a clear way. I don't see how I would be able to do that in a clean way in the current code. And again, I don't think it would be a good idea to add too much addon-specific code in core wui files.
Better would be that logs.dat is rewritten, mainly from scratch I think, to be a modular viewer with the ability for addons to add specifications by dropping a config or even perl script somewhere for example overloading functions for parsing the log lines format, calculating rotation file indexes, columns to display in the ui, etc. But that is not immediately something that I can pull out of my sleeve some time soon :-)
So until someone does implement such a modular logs viewer, I think this is the best and easiest alternative with this code explicitly only installed when the addon is installed.
Regards
Robin
-Michael
- Changes permission of zabbix_agentd logfiles in logrotate config
for GUI to be able to access the log files (640 to 644)
- Changes file permissions of existing zabbix_agentd logfiles upon
update of the package
- Rootfile changes: added gui page, menu item-file, and addon
language files
- configroot rootfile changes: added logs menu item-file as comment
- web-user-interface rootfile changes: added log viewer .dat as
comment
- Update language cache during install/uninstall
Signed-off-by: Robin Roevens robin.roevens@disroot.org
config/menu/EX-zabbix_agentd.menu | 5 + config/rootfiles/common/configroot | 1 + config/rootfiles/common/web-user-interface | 1 + config/rootfiles/packages/zabbix_agentd | 6 + config/zabbix_agentd/logrotate | 2 +- config/zabbix_agentd/zabbix_agentd.de.pl | 8 + config/zabbix_agentd/zabbix_agentd.en.pl | 8 + config/zabbix_agentd/zabbix_agentd.fr.pl | 8 + config/zabbix_agentd/zabbix_agentd.nl.pl | 8 + html/cgi-bin/logs.cgi/zabbix_agentd.dat | 341 +++++++++++++++++++++ lfs/zabbix_agentd | 4 + src/paks/zabbix_agentd/install.sh | 1 + src/paks/zabbix_agentd/uninstall.sh | 1 + src/paks/zabbix_agentd/update.sh | 3 + 14 files changed, 396 insertions(+), 1 deletion(-) create mode 100644 config/menu/EX-zabbix_agentd.menu create mode 100644 config/zabbix_agentd/zabbix_agentd.de.pl create mode 100644 config/zabbix_agentd/zabbix_agentd.en.pl create mode 100644 config/zabbix_agentd/zabbix_agentd.fr.pl create mode 100644 config/zabbix_agentd/zabbix_agentd.nl.pl create mode 100644 html/cgi-bin/logs.cgi/zabbix_agentd.dat
diff --git a/config/menu/EX-zabbix_agentd.menu b/config/menu/EX- zabbix_agentd.menu new file mode 100644 index 000000000..dddd7f05e --- /dev/null +++ b/config/menu/EX-zabbix_agentd.menu @@ -0,0 +1,5 @@
- $sublogs->{'95.zabbixagent'} = {'caption' => $Lang::tr{'zabbix
agent logs'},
- 'uri' => '/cgi-bin/logs.cgi/zabbix_agentd.dat',
- 'title' => "$Lang::tr{'zabbix agent logs'}",
- 'enabled' => 1
- };
diff --git a/config/rootfiles/common/configroot b/config/rootfiles/common/configroot index bc979cf2c..f12e2e0f0 100644 --- a/config/rootfiles/common/configroot +++ b/config/rootfiles/common/configroot @@ -126,6 +126,7 @@ var/ipfire/menu.d/70-log.menu #var/ipfire/menu.d/EX-samba.menu #var/ipfire/menu.d/EX-tor.menu #var/ipfire/menu.d/EX-wlanap.menu +#var/ipfire/menu.d/EX-zabbix_agentd.menu var/ipfire/modem var/ipfire/modem-lib.pl #var/ipfire/modem/defaults diff --git a/config/rootfiles/common/web-user-interface b/config/rootfiles/common/web-user-interface index 33f0d30a7..bc17b4ce4 100644 --- a/config/rootfiles/common/web-user-interface +++ b/config/rootfiles/common/web-user-interface @@ -49,6 +49,7 @@ srv/web/ipfire/cgi- bin/logs.cgi/showrequestfromip.dat srv/web/ipfire/cgi-bin/logs.cgi/showrequestfromport.dat srv/web/ipfire/cgi-bin/logs.cgi/summary.dat srv/web/ipfire/cgi-bin/logs.cgi/urlfilter.dat +#srv/web/ipfire/cgi-bin/logs.cgi/zabbix_agentd.dat srv/web/ipfire/cgi-bin/mac.cgi srv/web/ipfire/cgi-bin/mail.cgi srv/web/ipfire/cgi-bin/mdstat.cgi diff --git a/config/rootfiles/packages/zabbix_agentd b/config/rootfiles/packages/zabbix_agentd index 6f2c831d7..5b57026f5 100644 --- a/config/rootfiles/packages/zabbix_agentd +++ b/config/rootfiles/packages/zabbix_agentd @@ -7,6 +7,7 @@ etc/zabbix_agentd/scripts etc/zabbix_agentd/zabbix_agentd.conf etc/zabbix_agentd/zabbix_agentd.conf.example etc/zabbix_agentd/zabbix_agentd.d +srv/web/ipfire/cgi-bin/logs.cgi/zabbix_agentd.dat usr/bin/zabbix_get usr/bin/zabbix_sender #usr/lib/modules @@ -16,6 +17,11 @@ usr/sbin/zabbix_agentd #usr/share/man/man1/zabbix_sender.1 #usr/share/man/man8/zabbix_agentd.8 var/ipfire/backup/addons/includes/zabbix_agentd +var/ipfire/addon-lang/zabbix_agentd.de.pl +var/ipfire/addon-lang/zabbix_agentd.en.pl +var/ipfire/addon-lang/zabbix_agentd.fr.pl +var/ipfire/addon-lang/zabbix_agentd.nl.pl +var/ipfire/menu.d/EX-zabbix_agentd.menu var/ipfire/zabbix_agentd var/ipfire/zabbix_agentd/zabbix_agentd_ipfire_mandatory.conf var/ipfire/zabbix_agentd/userparameters diff --git a/config/zabbix_agentd/logrotate b/config/zabbix_agentd/logrotate index 83bbca9fb..46fee44f2 100644 --- a/config/zabbix_agentd/logrotate +++ b/config/zabbix_agentd/logrotate @@ -5,5 +5,5 @@ delaycompress missingok notifempty - create 0640 zabbix zabbix + create 0644 zabbix zabbix } diff --git a/config/zabbix_agentd/zabbix_agentd.de.pl b/config/zabbix_agentd/zabbix_agentd.de.pl new file mode 100644 index 000000000..910225242 --- /dev/null +++ b/config/zabbix_agentd/zabbix_agentd.de.pl @@ -0,0 +1,8 @@ +%tr = ( +%tr,
+'zabbix agent logs' => "Zabbix Agent-Protokolldateien",
+);
+#EOF diff --git a/config/zabbix_agentd/zabbix_agentd.en.pl b/config/zabbix_agentd/zabbix_agentd.en.pl new file mode 100644 index 000000000..1f523f926 --- /dev/null +++ b/config/zabbix_agentd/zabbix_agentd.en.pl @@ -0,0 +1,8 @@ +%tr = ( +%tr,
+'zabbix agent logs' => "Zabbix Agent Logs",
+);
+#EOF diff --git a/config/zabbix_agentd/zabbix_agentd.fr.pl b/config/zabbix_agentd/zabbix_agentd.fr.pl new file mode 100644 index 000000000..f7576ad2f --- /dev/null +++ b/config/zabbix_agentd/zabbix_agentd.fr.pl @@ -0,0 +1,8 @@ +%tr = ( +%tr,
+'zabbix agent logs' => "Rapports de Zabbix Agent",
+);
+#EOF diff --git a/config/zabbix_agentd/zabbix_agentd.nl.pl b/config/zabbix_agentd/zabbix_agentd.nl.pl new file mode 100644 index 000000000..1f523f926 --- /dev/null +++ b/config/zabbix_agentd/zabbix_agentd.nl.pl @@ -0,0 +1,8 @@ +%tr = ( +%tr,
+'zabbix agent logs' => "Zabbix Agent Logs",
+);
+#EOF diff --git a/html/cgi-bin/logs.cgi/zabbix_agentd.dat b/html/cgi- bin/logs.cgi/zabbix_agentd.dat new file mode 100644 index 000000000..047ca2e98 --- /dev/null +++ b/html/cgi-bin/logs.cgi/zabbix_agentd.dat @@ -0,0 +1,341 @@ +#!/usr/bin/perl +################################################################## ############# +# # +# IPFire.org - A linux based firewall # +# Copyright (C) 2020 IPFire Team info@ipfire.org # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see http://www.gnu.org/licenses/. # +# # +################################################################## #############
+use strict;
+# enable only the following on debugging purpose +# use warnings; +# use CGI::Carp 'fatalsToBrowser';
+require '/var/ipfire/general-functions.pl'; +require "${General::swroot}/lang.pl"; +require "${General::swroot}/header.pl";
+my %color = (); +my %mainsettings = (); +&General::readhash("${General::swroot}/main/settings", %mainsettings); +&General::readhash("/srv/web/ipfire/html/themes/ipfire/include/col ors.txt", %color);
+use POSIX();
+my %cgiparams=(); +my %logsettings=(); +my $errormessage = '';
+my @shortmonths = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug',
- 'Sep', 'Oct', 'Nov', 'Dec' );
+my @longmonths = ( $Lang::tr{'january'}, $Lang::tr{'february'}, $Lang::tr{'march'},
- $Lang::tr{'april'}, $Lang::tr{'may'}, $Lang::tr{'june'},
$Lang::tr{'july'}, $Lang::tr{'august'},
- $Lang::tr{'september'}, $Lang::tr{'october'},
$Lang::tr{'november'},
- $Lang::tr{'december'} );
+my @now = localtime(); +my $dow = $now[6]; +my $doy = $now[7]; +my $tdoy = $now[7]; +my $year = $now[5]+1900;
+$cgiparams{'DAY'} = $now[3]; +$cgiparams{'MONTH'} = $now[4]; +$cgiparams{'ACTION'} = '';
+&Header::getcgihash(%cgiparams); +$logsettings{'LOGVIEW_REVERSE'} = 'off'; +&General::readhash("${General::swroot}/logging/settings", %logsettings); +${Header::viewsize} = defined ($logsettings{'LOGVIEW_VIEWSIZE'}) ? $logsettings{'LOGVIEW_VIEWSIZE'} : 150;
+my $start = ($logsettings{'LOGVIEW_REVERSE'} eq 'on') ? 0x7FFFF000 : 0; #index of first line number to display
+if ($ENV{'QUERY_STRING'} && $cgiparams{'ACTION'} ne $Lang::tr{'update'}) {
- my @temp = split(',',$ENV{'QUERY_STRING'});
- $start = $temp[0];
- $cgiparams{'MONTH'} = $temp[1];
- $cgiparams{'DAY'} = $temp[2];
+}
+if (!($cgiparams{'MONTH'} =~ /^(0|1|2|3|4|5|6|7|8|9|10|11)$/) ||
- !($cgiparams{'DAY'} =~
/^(0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24 |25|26|27|28|29|30|31)$/)) {
- $cgiparams{'DAY'} = $now[3];
- $cgiparams{'MONTH'} = $now[4];
+} elsif($cgiparams{'ACTION'} eq '>>') {
- my @temp_then=();
- my @temp_now = localtime(time);
- $temp_now[4] = $cgiparams{'MONTH'};
- $temp_now[3] = $cgiparams{'DAY'};
- @temp_then = localtime(POSIX::mktime(@temp_now) + 86400);
- ## Retrieve the same time on the next day +
- ## 86400 seconds in a day
- $cgiparams{'MONTH'} = $temp_then[4];
- $cgiparams{'DAY'} = $temp_then[3];
+} elsif($cgiparams{'ACTION'} eq '<<') {
- my @temp_then=();
- my @temp_now = localtime(time);
- $temp_now[4] = $cgiparams{'MONTH'};
- $temp_now[3] = $cgiparams{'DAY'};
- @temp_then = localtime(POSIX::mktime(@temp_now) - 86400);
- ## Retrieve the same time on the next day -
- ## 86400 seconds in a day
- $cgiparams{'MONTH'} = $temp_then[4];
- $cgiparams{'DAY'} = $temp_then[3];
+}
+# Find in which file.gz is the log. Can be calculated because MONTHLY ROTATING of zabbix_agentd.log +my $gzindex; +my $date = $cgiparams{'DAY'} == 0 ? '' : $cgiparams{'DAY'} <= 9 ? "0$cgiparams{'DAY'}" : "$cgiparams{'DAY'}";
+my @then = ();
+my $monthstr = ($cgiparams{'MONTH'} + 1) <= 9 ? "0" . ($cgiparams{'MONTH'} + 1) : ($cgiparams{'MONTH'} + 1); +my $daystr = $cgiparams{'DAY'} == 0 ? '..' : $cgiparams{'DAY'} <= 9 ? "0$cgiparams{'DAY'}" : "$cgiparams{'DAY'}"; +my $yearstr = $year;
+# Calculate time. If future date, calculate for past year !!! +if (( $cgiparams{'MONTH'} eq $now[4]) && ($cgiparams{'DAY'} > $now[3]) ||
- ( $cgiparams{'MONTH'} > $now[4] ) ) {
- @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'},
$cgiparams{'MONTH'}, $year - 1901 ));
- $date = "$longmonths[$cgiparams{'MONTH'}] $date, ". int($year-1);
- $yearstr--;
+} else {
- @then = localtime(POSIX::mktime( 0, 0, 0, $cgiparams{'DAY'},
$cgiparams{'MONTH'}, $year - 1900 ));
- $date = "$longmonths[$cgiparams{'MONTH'}] $date, $year";
+}
+$gzindex = $now[4] - $then[4]; +$gzindex += 12 if $gzindex < 0;
+my $lines = 0; +my @log=();
+my $loop = 1; +my $filestr = 0; +my $search_for_end = 0;
+while ($gzindex >=0 && $loop) {
- # calculate file name
- if ($gzindex == 0) {
- $filestr = "/var/log/zabbix/zabbix_agentd.log";
- } else {
- $filestr = "/var/log/zabbix/zabbix_agentd.log.$gzindex";
- $filestr = "$filestr.gz" if -f "$filestr.gz";
- }
- # now read file if existing
- if (open (FILE,($filestr =~ /.gz$/ ? "gzip -dc $filestr |" :
$filestr))) { + READ:while (<FILE>) {
- my $line = $_;
- if ($line =~ /^ *[0-9]+:${yearstr}${monthstr}${daystr}:[0-
9]{6}.[0-9]{3} (.*)/) {
- # when standard viewing, just keep in memory the correct slice
- # it starts at '$start' and size is $viewport
- # If export, then keep all lines...
- if ($cgiparams{'ACTION'} eq $Lang::tr{'export'}){
- $log[$lines++] = "$line";
- } else {
- if ($lines++ < ($start + $Header::viewsize)) {
- push(@log,"$line");
- if (@log > $Header::viewsize) {
- shift (@log);
- }
- }
- }
- $search_for_end = 1; # we find the start of slice, can look for
end now
- } else {
- if ($search_for_end == 1) {
- #finish read files when date is over (test month equality only)
- $line =~ /^ *[0-9]+:[0-9]{4}([0-9]{2})([0-9]{2}):[0-9]{6}.[0-
9]{3} .*$/;
- $loop = 0 if ( ($1 ne $monthstr) || ( ($daystr ne '..') &&
($daystr ne $2) ) );
- }
- }
+ } + close (FILE);
- }
- $gzindex--; # will try next gz file eg 40,39,38,.... because
it may have holes +}
+if ($cgiparams{'ACTION'} eq $Lang::tr{'export'}) {
- print "Content-type: text/plain\n\n";
- print "IPFire $Lang::tr{'zabbix agent logs'}\r\n";
- print "$Lang::tr{'date'}: $date\r\n\r\n";
- if ($logsettings{'LOGVIEW_REVERSE'} eq 'on') { @log = reverse
@log; }
- foreach $_ (@log) {
- /^ *([0-9]+):[0-9]{6}([0-9]{2}):([0-9]{2})([0-9]{2})([0-
9]{2}.[0-9]{3}) (.*)$/;
- my $pid = $1;
- my $day = $2;
- $day =~ tr / /0/;
- my $time = $cgiparams{'DAY'} ? "$3:$4:$5" : "$day/$3:$4:$5" ;
- print "$time ($pid) $6\r\n";
- }
- exit 0;
+}
+&Header::showhttpheaders();
+&Header::openpage($Lang::tr{'zabbix agent logs'}, 1, '');
+&Header::openbigbox('100%', 'left', '', $errormessage);
+if ($errormessage) {
- &Header::openbox('100%', 'left', $Lang::tr{'error messages'});
- print "<font class='base'>$errormessage </font>\n";
- &Header::closebox();
+}
+&Header::openbox('100%', 'left', "$Lang::tr{'settings'}:");
+print <<END +<form method='post' action='$ENV{'SCRIPT_NAME'}'> +<table width='100%'> +<tr>
<td width='10%' class='base'>$Lang::tr{'month'}:</td>
<td width='25%'>
<select name='MONTH'>
+END +; +for (my $month = 0; $month < 12; $month++) {
- print "\t<option ";
- if ($month == $cgiparams{'MONTH'}) {
- print "selected='selected' "; }
- print "value='$month'>$longmonths[$month]</option>\n";
+} +print <<END
</select>
</td>
<td width='10%' class='base'>$Lang::tr{'day'}:</td>
<td width='25%'>
<select name='DAY'>
+END +; +print "<option value='0'>$Lang::tr{'all'}</option>\n"; +for (my $day = 1; $day <= 31; $day++) {
- print "\t<option ";
- if ($day == $cgiparams{'DAY'}) {
- print "selected='selected' "; }
- print "value='$day'>$day</option>\n";
+} +print <<END +</select> +</td> +<td width='5%' align='center'><input type='submit' name='ACTION' title='$Lang::tr{'day before'}' value='<<' /></td> +<td width='5%' align='center'><input type='submit' name='ACTION' title='$Lang::tr{'day after'}' value='>>' /></td> +<td width='10%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'update'}' /></td> +<td width='10%' align='center'><input type='submit' name='ACTION' value='$Lang::tr{'export'}' /></td> +</tr> +</table> +</form> +END +;
+&Header::closebox();
+&Header::openbox('100%', 'left', $Lang::tr{'log'}); +print "<p><b>$Lang::tr{'total hits for log section'} $date: $lines</b></p>";
+$start = $lines - ${Header::viewsize} if ($start >= $lines - ${Header::viewsize}); +$start = 0 if ($start < 0);
+my $prev; +if ($start == 0) {
- $prev = -1;
+} else {
- $prev = $start - ${Header::viewsize};
- $prev = 0 if ( $prev < 0);
+}
+my $next; +if ($start == $lines - ${Header::viewsize}) {
- $next = -1;
+} else {
- $next = $start + ${Header::viewsize};
- $next = $lines - ${Header::viewsize} if ($next >= $lines -
${Header::viewsize}); +}
+if ($logsettings{'LOGVIEW_REVERSE'} eq 'on') { @log = reverse @log; } +if ($lines != 0) { &oldernewer(); }
+print <<END +<table width='100%' class='tbl'> +<tr>
<th width='15%' align='center'
class='boldbase'><b>$Lang::tr{'time'}</b></th>
<th width='10%' align='center' class='boldbase'><b>PID</b></th>
<th width='75%'> </th>
+</tr> +END +;
+$lines = 0; +foreach $_ (@log) {
- /^ *([0-9]+):[0-9]{6}([0-9]{2}):([0-9]{2})([0-9]{2})([0-
9]{2}.[0-9]{3}) (.*)$/;
- my $pid = $1;
- my $day = $2;
- $day =~ tr / /0/;
- my $time = $cgiparams{'DAY'} ? "$3:$4:$5" : "$day/$3:$4:$5" ;
- my $data = $6;
- my $col="";
- if ($lines % 2) {
- print "<tr>";
- $col="bgcolor='$color{'color20'}'";
- } else {
- print "<tr>";
- $col="bgcolor='$color{'color22'}'";
- }
- print "<td $col>$time<td $col>$pid<td $col>" .&Header::cleanhtml
("$data", 'y') . "</td></tr>\n";
- $lines++;
+} +print "</table>";
+&oldernewer();
+&Header::closebox();
+&Header::closebigbox();
+&Header::closepage();
+sub oldernewer {
- print <<END
+<table width='100%'> +<tr> +END
- ;
- print "<td align='center' width='50%'>";
- if ($prev != -1) {
- print "<a href='/cgi-
bin/logs.cgi/zabbix_agentd.dat?$prev,$cgiparams{'MONTH'},$cgiparams {'DAY'}'>$Lang::tr{'older'}</a>";
- } else {
- print "$Lang::tr{'older'}";
- }
- print "</td>\n";
- print "<td align='center' width='50%'>";
- if ($next >= 0) {
- print "<a href='/cgi-
bin/logs.cgi/zabbix_agentd.dat?$next,$cgiparams{'MONTH'},$cgiparams {'DAY'}'>$Lang::tr{'newer'}</a>";
- } else {
- print "$Lang::tr{'newer'}";
- }
- print "</td>\n";
- print <<END
+</tr> +</table> +END
- ;
+} diff --git a/lfs/zabbix_agentd b/lfs/zabbix_agentd index 281bd9fa3..49b8440f8 100644 --- a/lfs/zabbix_agentd +++ b/lfs/zabbix_agentd @@ -139,6 +139,10 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) -mkdir -pv /etc/logrotate.d install -v -m 644 $(DIR_SRC)/config/zabbix_agentd/logrotate \ /etc/logrotate.d/zabbix_agentd
- # Install addon-specific language-files.
- install -v -m 004
$(DIR_SRC)/config/zabbix_agentd/zabbix_agentd.*.pl \
- /var/ipfire/addon-lang/
@rm -rf $(DIR_APP) @$(POSTBUILD) diff --git a/src/paks/zabbix_agentd/install.sh b/src/paks/zabbix_agentd/install.sh index 80632d1ec..465ea7e8a 100644 --- a/src/paks/zabbix_agentd/install.sh +++ b/src/paks/zabbix_agentd/install.sh @@ -32,6 +32,7 @@ if ! getent passwd zabbix; then fi
extract_files +/usr/local/bin/update-lang-cache
# Create symlinks for runlevel interaction. ln -sf ../init.d/zabbix_agentd /etc/rc.d/rc3.d/S65zabbix_agentd diff --git a/src/paks/zabbix_agentd/uninstall.sh b/src/paks/zabbix_agentd/uninstall.sh index edff3b818..4342384de 100644 --- a/src/paks/zabbix_agentd/uninstall.sh +++ b/src/paks/zabbix_agentd/uninstall.sh @@ -25,6 +25,7 @@ stop_service ${NAME} make_backup ${NAME} remove_files +/usr/local/bin/update-lang-cache
# Remove init-scripts and symlinks rm -rfv /etc/rc.d/rc*.d/*zabbix_agentd diff --git a/src/paks/zabbix_agentd/update.sh b/src/paks/zabbix_agentd/update.sh index a41e72ab4..f01e32810 100644 --- a/src/paks/zabbix_agentd/update.sh +++ b/src/paks/zabbix_agentd/update.sh @@ -40,6 +40,9 @@ if [ -f /etc/sudoers.d/zabbix ]; then fi fi
+# Fix permissions on /var/log/zabbix/* to allow GUI to read the logfiles. +find /var/log/zabbix -perm 640 -exec chmod 644 {} ;
extract_backup_includes ./uninstall.sh ./install.sh -- 2.40.0
-- Dit bericht is gescanned op virussen en andere gevaarlijke inhoud door MailScanner en lijkt schoon te zijn.
Hi Michael, all
I was forgotten that I could set up Zabbix Agent to simply log to syslog instead of to it's own logs. (It came to me while reading #12922 about adding haproxy to the logviewer) This way the default logviewer can indeed easily parse the zabbix agent logging and there is no seperate log viewer required. The PID of the reporting process is displayed in the section column, so also no problem there.
Hence hereby a new patchset. - Patch 1: meanwhile zabbix 6.0.16 is out, so I updated this to 6.0.16 - Patch 2: remains unchanged - Patch 3: now configures the agent to log to syslog and add a section to logs.dat logviewer for filtering on zabbix_agentd logs.
Best Regards
Robin
- Update from version 6.0.6 to 6.0.16 - Update of rootfile not required - Changelog No substantial changes for Agent Linux version Changelogs since 6.0.6: - https://www.zabbix.com/rn/rn6.0.7 - https://www.zabbix.com/rn/rn6.0.8 - https://www.zabbix.com/rn/rn6.0.9 - https://www.zabbix.com/rn/rn6.0.10 - https://www.zabbix.com/rn/rn6.0.11 - https://www.zabbix.com/rn/rn6.0.12 - https://www.zabbix.com/rn/rn6.0.13 - https://www.zabbix.com/rn/rn6.0.14 - https://www.zabbix.com/rn/rn6.0.15 - https://www.zabbix.com/rn/rn6.0.16
Signed-off-by: Robin Roevens robin.roevens@disroot.org --- lfs/zabbix_agentd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/lfs/zabbix_agentd b/lfs/zabbix_agentd index d7b5a4b37..45f7cec1f 100644 --- a/lfs/zabbix_agentd +++ b/lfs/zabbix_agentd @@ -26,7 +26,7 @@ include Config
SUMMARY = Zabbix Agent
-VER = 6.0.6 +VER = 6.0.16
THISAPP = zabbix-$(VER) DL_FILE = $(THISAPP).tar.gz @@ -34,7 +34,7 @@ DL_FROM = $(URL_IPFIRE) DIR_APP = $(DIR_SRC)/$(THISAPP) TARGET = $(DIR_INFO)/$(THISAPP) PROG = zabbix_agentd -PAK_VER = 6 +PAK_VER = 7
DEPS = fping
@@ -48,7 +48,7 @@ objects = $(DL_FILE)
$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
-$(DL_FILE)_BLAKE2 = f9d07ca8938ae4e5e47048c32872644caeda0ecdef17513c63c63d1ce2aaa4ac0c92e6c70932bc598ff908419dae05bab32924f5973a5528b5668f7c7c2c5a17 +$(DL_FILE)_BLAKE2 = 87f7c043f30ef9902b3673e2d444e37b32ef998d178fa5718ed9aa098f841f23237d79e54985ba3a415a86433a685387af33810f53a78837be6a1aa2870ed65a
install : $(TARGET)
Fix "grep: warning: stray \ before /" message on Zabbix Agent ipfire.net.fw.hits item introduced by grep 3.8 in https://git.ipfire.org/?p=ipfire-2.x.git;a=commit;h=40b5df3942149738529c22c9...
Signed-off-by: Robin Roevens robin.roevens@disroot.org --- config/zabbix_agentd/userparameter_ipfire.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/zabbix_agentd/userparameter_ipfire.conf b/config/zabbix_agentd/userparameter_ipfire.conf index 10c09c25d..c5a636edf 100644 --- a/config/zabbix_agentd/userparameter_ipfire.conf +++ b/config/zabbix_agentd/userparameter_ipfire.conf @@ -5,7 +5,7 @@ UserParameter=ipfire.net.gateway.pingtime,sudo /usr/sbin/fping -c 3 gateway 2>&1 # Internet Gateway availability, can be used to check Internet connection UserParameter=ipfire.net.gateway.ping,sudo /usr/sbin/fping -q -r 3 gateway; [ ! $? ]; echo $? # Firewall Filter Forward chain drops in bytes/chain (JSON), can be used for discovery of firewall chains and monitoring of firewall hits on each chain -UserParameter=ipfire.net.fw.hits.raw,sudo /usr/local/bin/getipstat -xf | grep "/* DROP_.* */$" | awk 'BEGIN { ORS = ""; print "["} { printf "%s{"chain": "%s", "bytes": "%s"}", separator, substr($11, 6), $2; separator = ", "; } END { print"]" }' +UserParameter=ipfire.net.fw.hits.raw,sudo /usr/local/bin/getipstat -xf | grep "/* DROP_.* */$" | awk 'BEGIN { ORS = ""; print "["} { printf "%s{"chain": "%s", "bytes": "%s"}", separator, substr($11, 6), $2; separator = ", "; } END { print"]" }' # Number of currently Active DHCP leases UserParameter=ipfire.dhcpd.clients,grep -s -E 'lease|bind' /var/state/dhcp/dhcpd.leases | sed ':a;/{$/{N;s/\n//;ba}' | grep "state active" | wc -l # Number of Captive Portal clients
- Configure Zabbix Agent to log to syslog instead of its own logs. - Remove old zabbix log-dir and logrotate settings from rootfile, lfs and install-script. - Update log.dat to view Zabbix Agent logging from syslog.
Signed-off-by: Robin Roevens robin.roevens@disroot.org --- config/rootfiles/packages/zabbix_agentd | 2 -- config/zabbix_agentd/logrotate | 9 --------- config/zabbix_agentd/zabbix_agentd_ipfire_mandatory.conf | 5 ++--- html/cgi-bin/logs.cgi/log.dat | 6 ++++-- lfs/zabbix_agentd | 9 --------- src/paks/zabbix_agentd/install.sh | 4 +--- 6 files changed, 7 insertions(+), 28 deletions(-) delete mode 100644 config/zabbix_agentd/logrotate
diff --git a/config/rootfiles/packages/zabbix_agentd b/config/rootfiles/packages/zabbix_agentd index 6f2c831d7..729a47ac6 100644 --- a/config/rootfiles/packages/zabbix_agentd +++ b/config/rootfiles/packages/zabbix_agentd @@ -1,4 +1,3 @@ -etc/logrotate.d/zabbix_agentd etc/rc.d/init.d/zabbix_agentd etc/sudoers.d/zabbix_agentd etc/sudoers.d/zabbix_agentd_user @@ -21,4 +20,3 @@ var/ipfire/zabbix_agentd/zabbix_agentd_ipfire_mandatory.conf var/ipfire/zabbix_agentd/userparameters var/ipfire/zabbix_agentd/userparameters/userparameter_pakfire.conf var/ipfire/zabbix_agentd/userparameters/userparameter_ipfire.conf -#var/log/zabbix diff --git a/config/zabbix_agentd/logrotate b/config/zabbix_agentd/logrotate deleted file mode 100644 index 83bbca9fb..000000000 --- a/config/zabbix_agentd/logrotate +++ /dev/null @@ -1,9 +0,0 @@ -/var/log/zabbix/zabbix_agentd.log { - monthly - rotate 12 - compress - delaycompress - missingok - notifempty - create 0640 zabbix zabbix -} diff --git a/config/zabbix_agentd/zabbix_agentd_ipfire_mandatory.conf b/config/zabbix_agentd/zabbix_agentd_ipfire_mandatory.conf index c6be948be..f6580f3ba 100644 --- a/config/zabbix_agentd/zabbix_agentd_ipfire_mandatory.conf +++ b/config/zabbix_agentd/zabbix_agentd_ipfire_mandatory.conf @@ -1,8 +1,7 @@ PidFile=/var/run/zabbix/zabbix_agentd.pid
-# Log rotation is managed by logrotate -LogFile=/var/log/zabbix/zabbix_agentd.log -LogFileSize=0 +# Logs go to syslog so it can be viewed in WUI logviewer +LogType=system
# These paths are included in the IPFire backups. Do not put user modules # or configuration files in other locations if you want them included in the diff --git a/html/cgi-bin/logs.cgi/log.dat b/html/cgi-bin/logs.cgi/log.dat index 53b9073fc..01c382a0d 100644 --- a/html/cgi-bin/logs.cgi/log.dat +++ b/html/cgi-bin/logs.cgi/log.dat @@ -78,7 +78,8 @@ my %sections = ( 'ssh' => '(sshd(?:(.*))?[.*]: )', 'unbound' => '(unbound: [.*?])(.*:.*$)', 'urlfilter bl' => '(installpackage[urlfilter]: )', - 'wireless' => '(hostapd:|kernel: ath.*:|kernel: wifi[0-9]:)' + 'wireless' => '(hostapd:|kernel: ath.*:|kernel: wifi[0-9]:)', + 'zabbix_agentd' => '(zabbix_agentd[.*?]: )' );
# Translations for the %sections array. @@ -112,7 +113,8 @@ my %trsections = ( 'ssh' => 'SSH', 'unbound' => 'DNS: Unbound', 'urlfilter bl' => 'URLFilter Blacklist', - 'wireless' => 'Wireless' + 'wireless' => 'Wireless', + 'zabbix_agentd' => 'Zabbix Agent' );
diff --git a/lfs/zabbix_agentd b/lfs/zabbix_agentd index 45f7cec1f..4f2a8b5d8 100644 --- a/lfs/zabbix_agentd +++ b/lfs/zabbix_agentd @@ -114,10 +114,6 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) # Create directory for additional agent modules -mkdir -pv /usr/lib/zabbix
- # Create directory for logging - -mkdir -pv /var/log/zabbix - chown zabbix.zabbix /var/log/zabbix - # Create directory for pid. -mkdir -pv /var/run/zabbix chown zabbix.zabbix /var/run/zabbix @@ -135,10 +131,5 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) install -v -m 644 $(DIR_SRC)/config/backup/includes/zabbix_agentd \ /var/ipfire/backup/addons/includes/zabbix_agentd
- # Install include file for Logrotate - -mkdir -pv /etc/logrotate.d - install -v -m 644 $(DIR_SRC)/config/zabbix_agentd/logrotate \ - /etc/logrotate.d/zabbix_agentd - @rm -rf $(DIR_APP) @$(POSTBUILD) diff --git a/src/paks/zabbix_agentd/install.sh b/src/paks/zabbix_agentd/install.sh index 80632d1ec..e3f988c34 100644 --- a/src/paks/zabbix_agentd/install.sh +++ b/src/paks/zabbix_agentd/install.sh @@ -39,7 +39,6 @@ ln -sf ../init.d/zabbix_agentd /etc/rc.d/rc0.d/K02zabbix_agentd ln -sf ../init.d/zabbix_agentd /etc/rc.d/rc6.d/K02zabbix_agentd
# Create additonal directories and set permissions -[ -d /var/log/zabbix ] || ( mkdir -pv /var/log/zabbix && chown zabbix.zabbix /var/log/zabbix ) [ -d /usr/lib/zabbix ] || ( mkdir -pv /usr/lib/zabbix && chown zabbix.zabbix /usr/lib/zabbix )
restore_backup ${NAME} @@ -66,8 +65,7 @@ grep -q "Include=/var/ipfire/zabbix_agentd/zabbix_agentd_ipfire_mandatory.conf" if [ $? -eq 1 ]; then # Remove settings that are now in our own config sed -i -e "|^PidFile=.*$|d" /etc/zabbix_agentd/zabbix_agentd.conf - sed -i -e "|^LogFile=.*$|d" /etc/zabbix_agentd/zabbix_agentd.conf - sed -i -e "|^LogFileSize=.*$|d" /etc/zabbix_agentd/zabbix_agentd.conf + sed -i -e "|^LogType=.*$|d" /etc/zabbix_agentd/zabbix_agentd.conf sed -i -e "|^LoadModulePath=.*$|d" /etc/zabbix_agentd/zabbix_agentd.conf sed -i -e "|^Include=/etc/zabbix_agentd/zabbix_agentd.d/*.conf$|d" /etc/zabbix_agentd/zabbix_agentd.conf # Include our own config in main config