mirror of
https://github.com/vincentmli/bpfire.git
synced 2026-04-28 11:43:25 +02:00
- 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>
213 lines
5.7 KiB
Perl
Executable File
213 lines
5.7 KiB
Perl
Executable File
#!/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;
|
||
}
|