generated by cgit v1.2.3 (git 2.25.1) at 2025-07-31 09:23:19 +0000 class="w"> elsif ($opts{'w'}) { print_ip_hw_list(); } elsif ($opts{'n'}) { generate_nagios_config(); } else { print_list(); } exit 0; sub handle_host { my $hostid = shift; my $address = get_dns_address($hostid); $hostnames{$address} = $hostid; } sub print_list { for my $hostname (sort keys %hostnames) { print "$hostname\n"; } } sub is_pkg_installed { my ($hostid, $pkgname) = @_; # Check debian/dpkg-l for 'ii *pkgname ' my $path = get_filepath_current($hostid, "/debian/dpkg-l"); if (open (my $fh, $path)) { while(<$fh>) { if (m/^ii *$pkgname /) { close($fh); return 1 } } close($fh); } return undef; } sub is_munin_client { my $hostid = shift; return is_pkg_installed($hostid, "munin-node"); } sub is_nagios_client { my $hostid = shift; return is_pkg_installed($hostid, "nagios-nrpe-server") || is_pkg_installed($hostid, "nagios-text") || is_pkg_installed($hostid, "nagios2") || is_pkg_installed($hostid, "nagios3"); } sub is_laptop { my $hostid = shift; my $path = get_filepath_current($hostid, "/system/laptop"); return -e $path; } sub print_munin_list { for my $hostname (sort keys %hostnames) { next unless (is_munin_client($hostnames{$hostname})); # Using hostname as address, to avoid hardcoding IP addresses in # the file. Might be an idea to fetch the IP address from # system/ifconfig-a print <<EOF; [$hostname] address $hostname use_node_name yes EOF } } sub print_ip_hw_list { for my $hostname (sort keys %hostnames) { my $macaddress = get_primary_macaddress($hostnames{$hostname}); print "$hostname $macaddress\n"; } } sub is_remote_nagios_client { my $hostid = shift; return is_pkg_installed($hostid, "nagios-nrpe-server") && ! (is_pkg_installed($hostid, "nagios-text") || is_pkg_installed($hostid, "nagios2") || is_pkg_installed($hostid, "nagios3")); } sub print_nagios_service_check { my ($remote, $hostname, $description, $check, $check_args) = @_; my $template = "server-service"; my $cmd; return if $opts{'r'} && $remote; if ($remote) { $cmd = "check_nrpe!$check"; if (defined $check_args) { $check_args =~ s/!/ /g; $cmd .= " -a $check_args"; } } else { $cmd = "$check"; $cmd .= "!$check_args" if defined $check_args; } print <<EOF; define service { use $template; host_name $hostname service_description $description check_command $cmd } EOF } sub print_nagios_host_check { my ($hostname, $address) = @_; my $template = "server-host"; print <<EOF; define host { use $template host_name $hostname address $address } EOF } sub generate_nagios_config { for my $hostname (sort keys %hostnames) { my $hostid = $hostnames{$hostname}; my $address = get_dns_address($hostid); my $redirect = ""; my $remote = is_remote_nagios_client($hostid); # Only check laptops that have the nagios tools installed next if is_laptop($hostid) && ! $remote; print <<EOF; ##################### $hostname ####################### EOF print_nagios_host_check($hostname, $address); # first, check ping to see if the other checks should be performed print_nagios_service_check(0, $hostname, "ping", "check_ping", "100.0,20%!500.0,60%"); my %tcpservices = ( 139 => { name => 'samba', package => 'samba' }, 389 => { name => 'ldap', package => 'slapd' }, 631 => { name => 'CUPS', package => 'cupsys' }, 4949 => { name => 'munin', package => 'munin-node' }, 7100 => { name => 'xfs', package => 'xfs' }, # check X font server ); for my $port (sort { $a <=> $b } keys %tcpservices) { next if (exists $tcpservices{$port}->{package} && ! is_pkg_installed($hostid, $tcpservices{$port}->{package})); my $servicename = $tcpservices{$port}->{name}; print_nagios_service_check(0, $hostname, $servicename, "check_tcp", $port); } # Check SSH server print_nagios_service_check(0, $hostname, "ssh", "check_ssh") if is_pkg_installed($hostid, "openssh-server"); print_nagios_service_check(0, $hostname, "http", "check_http") if (is_pkg_installed($hostid, "apache") || is_pkg_installed($hostid, "apache2")); # The rest of the checks only work if NRPE is installed and configured next unless (is_nagios_client($hostid)); print_nagios_service_check($remote, $hostname, "swap", "check_swap", "10%!5%"); print_nagios_service_check($remote, $hostname, "current users", "check_users", "20!50"); print_nagios_service_check($remote, $hostname, "processes total", "check_procs", "500!1000"); print_nagios_service_check($remote, $hostname, "processes zombie", "check_procs_zombie", "20!100"); print_nagios_service_check($remote, $hostname, "apt-updates", "check_apt"); # Check unix load print_nagios_service_check($remote, $hostname, "load as in top", "check_load", "75,75,75!90,90,90"); # check disk free space my $path = get_filepath_current($hostid, "/system/procmounts"); if ( -e $path ) { open (F, "<", $path) || die "unable to read from $path"; my %checked; while (<F>) { chomp; my ($device, $partition, $fs, $opts) = split; next if (exists $checked{$device}); next if ($fs eq "devpts" || $fs eq "autofs" || $fs eq "binfmt_misc" || $fs eq "fusectl" || $fs eq "iso9660" || $fs eq "nfs" || $fs eq "nfsd" || $fs eq "proc" || $fs eq "rootfs" || $fs eq "rpc_pipefs" || $fs eq "sysfs" || $fs eq "tmpfs" || $fs eq "usbfs"); $checked{$device} = 1; my $warn = 10; my $crit = 5; print_nagios_service_check($remote, $hostname, "disk $partition", "check_disk", "$warn%!$crit%!$partition"); } } # check software raid status if ( -e get_filepath_current($hostid, "/system/mdstat") ) { print_nagios_service_check($remote, $hostname, "sw-raid", "check_linux_raid"); } # check munin if munin-node is installed # check hw raid status # check hardware status # check LDAP and LDAPS using the protocol # Check DNS server print_nagios_service_check($remote, $hostname, "dns", "check_dns") if is_pkg_installed($hostid, "pdns-server"); # Check IMAPS server print_nagios_service_check($remote, $hostname, "imaps", "check_imaps") if is_pkg_installed($hostid, "courier-imap-ssl"); # Check NFS server print_nagios_service_check($remote, $hostname, "nfs", "check_nfs") if is_pkg_installed($hostid, "nfs-kernel-server"); # Check Squid web proxy print_nagios_service_check($remote, $hostname, "squid", "check_squid", "3128!http://www") if is_pkg_installed($hostid, "squid"); print_nagios_service_check($remote, $hostname, "ntp time server", "check_ntp", "-H!localhost") if (is_pkg_installed($hostid, "ntp") || is_pkg_installed($hostid, "ntp-server")); # Detect if cron no longer is running print_nagios_service_check($remote, $hostname, "process - cron", "check_procs_cron", "1:15!1:25") if (is_pkg_installed($hostid, "cron")); print_nagios_service_check($remote, $hostname, "dhcp", "check_dhcp") if is_pkg_installed($hostid, "dhcp3-server"); } }