Files
bpfire/config/zabbix_agentd/ipfire_services.pl
Robin Roevens a66263b4f5 zabbix_agentd: Add IPFire services.get item
- Adds Zabbix Agent userparameter `ipfire.services.get` for the agent to get details about configured IPFire services (builtin and addon-services)
- Includes `ipfire_services.pl` script in sudoers for Zabbix Agent as it needs root permission to call addonctrl for addon service states.
- Adapts lfs install script to install new script
- Adds new script to rootfiles

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
2024-09-11 09:45:03 +00:00

213 lines
5.7 KiB
Perl
Executable File
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/perl
###############################################################################
# ipfire_services.pl - Retrieves available IPFire services information and
# return this as a JSON array suitable for easy processing
# by Zabbix server
#
# Author: robin.roevens (at) disroot.org
# Version: 3.0
#
# Copyright (C) 2007-2024 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;
# Load General functions
require "/var/ipfire/general-functions.pl";
# Load Pakfire functions
require "/opt/pakfire/lib/functions.pl";
my $first = 1;
print "[";
# Built-in services
my %services = (
# DHCP Server
'DHCP Server' => {
"process" => "dhcpd",
},
# Web Server
'Web Server' => {
"process" => "httpd",
},
# Cron Server
'CRON Server' => {
"process" => "fcron",
},
# DNS Proxy
'DNS Proxy Server' => {
"process" => "unbound",
},
# Syslog
'Logging Server' => {
"process" => "syslogd",
},
# Kernel Logger
'Kernel Logging Server' => {
"process" => "klogd",
},
# Time Server
'NTP Server' => {
"process" => "ntpd",
},
# SSH Server
'Secure Shell Server' => {
"process" => "sshd",
},
# IPsec
'VPN' => {
"process" => "charon",
},
# Web Proxy
'Web Proxy' => {
"process" => "squid",
},
# IPS
'Intrusion Prevention System' => {
"process" => "suricata",
"pidfile" => "/var/run/suricata.pid",
},
# OpenVPN Roadwarrior
'OpenVPN Roadwarrior Server' => {
"process" => "openvpn",
"pidfile" => "/var/run/openvpn.pid",
}
);
foreach my $service (sort keys %services){
my %config = %{ $services{$service} };
my $pidfile = $config{"pidfile"};
my $process = $config{"process"};
# Collect all pids
my @pids = ();
# Read the PID file or go search...
if (defined $pidfile) {
@pids = &General::read_pids("${pidfile}");
} else {
@pids = &General::find_pids("${process}");
}
# Not Running
my $status = "\"state\":\"0\"";
# Running?
if (scalar @pids) {
# Get memory consumption
my $mem = &General::get_memory_consumption(@pids);
$status = "\"state\":1,\"pids\":[" . join(',', @pids) . "],\"memory\":$mem";
}
print "," if not $first;
$first = 0;
print "{";
print "\"service\":\"$service\",\"servicename\":\"$process\",$status";
print "}";
}
# Generate list of installed addon pak's
my %paklist = &Pakfire::dblist("installed");
foreach my $pak (keys %paklist) {
my %metadata = &Pakfire::getmetadata($pak, "installed");
# If addon contains services
if ("$metadata{'Services'}") {
foreach my $service (split(/ /, "$metadata{'Services'}")) {
print ",";
print "{";
print "\"service\":\"Addon: $metadata{'Name'}\",";
print "\"servicename\":\"$service\",";
my $onboot = isautorun($pak, $service);
print "\"onboot\":$onboot,";
print &addonservicestats($pak, $service);
print "}";
}
}
}
print "]";
sub isautorun() {
my ($pak, $service) = @_;
my @testcmd = &General::system_output("/usr/local/bin/addonctrl", "$pak", "boot-status", "$service");
my $testcmd = @testcmd[0];
my $status = 9;
# Check if autorun for the given service is enabled.
if ( $testcmd =~ /enabled\ on\ boot/ ) {
$status = 1;
} elsif ( $testcmd =~ /disabled\ on\ boot/ ) {
$status = 0;
}
# Return the status.
return $status;
}
sub addonservicestats() {
my ($pak, $service) = @_;
my $testcmd = '';
my $exename;
my @memory = (0);
my @testcmd = &General::system_output("/usr/local/bin/addonctrl", "$pak", "status", "$service");
my $testcmd = @testcmd[0];
my $status = "\"state\":0";
if ( $testcmd =~ /is\ running/ && $testcmd !~ /is\ not\ running/){
$testcmd =~ s/.* //gi;
$testcmd =~ s/[a-z_]//gi;
$testcmd =~ s/\[[0-1]\;[0-9]+//gi;
$testcmd =~ s/[\(\)\.]//gi;
$testcmd =~ s/ //gi;
$testcmd =~ s///gi;
my @pids = split(/\s/,$testcmd);
# Fetch the memory consumption
my $memory = &General::get_memory_consumption(@pids);
$status = "\"state\":1,\"pids\":[" . join(',', @pids) . "],\"memory\":$memory";
}
return $status;
}