#!/usr/bin/perl ############################################################################### # # # IPFire.org - A linux based firewall # # Copyright (C) 2008 Michael Tremer & Christian Schmidt # # # # 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 . # # # ############################################################################### 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"; require "${General::swroot}/graphs.pl"; my %color = (); my %mainsettings = (); my %netsettings=(); &General::readhash("${General::swroot}/main/settings", \%mainsettings); &General::readhash("/srv/web/ipfire/html/themes/".$mainsettings{'THEME'}."/include/colors.txt", \%color); &General::readhash("${General::swroot}/ethernet/settings", \%netsettings); #workaround to suppress a warning when a variable is used only once my @dummy = ( ${Header::colourred} ); undef (@dummy); my %cgiparams=(); # Maps a nice printable name to the changing part of the pid file, which # is also the name of the program my %servicenames =( $Lang::tr{'dhcp server'} => 'dhcpd', $Lang::tr{'web server'} => 'httpd', $Lang::tr{'cron server'} => 'fcron', $Lang::tr{'dns proxy server'} => 'dnsmasq', $Lang::tr{'logging server'} => 'syslogd', $Lang::tr{'kernel logging server'} => 'klogd', $Lang::tr{'ntp server'} => 'ntpd', $Lang::tr{'secure shell server'} => 'sshd', $Lang::tr{'vpn'} => 'pluto', $Lang::tr{'web proxy'} => 'squid', 'OpenVPN' => 'openvpn' ); my %link =( $Lang::tr{'dhcp server'} => "$Lang::tr{'dhcp server'}", $Lang::tr{'web server'} => $Lang::tr{'web server'}, $Lang::tr{'cron server'} => $Lang::tr{'cron server'}, $Lang::tr{'dns proxy server'} => $Lang::tr{'dns proxy server'}, $Lang::tr{'logging server'} => $Lang::tr{'logging server'}, $Lang::tr{'kernel logging server'} => $Lang::tr{'kernel logging server'}, $Lang::tr{'ntp server'} => "$Lang::tr{'ntp server'}", $Lang::tr{'secure shell server'} => "$Lang::tr{'secure shell server'}", $Lang::tr{'vpn'} => "$Lang::tr{'vpn'}", $Lang::tr{'web proxy'} => "$Lang::tr{'web proxy'}", 'OpenVPN' => "OpenVPN", "$Lang::tr{'intrusion detection system'} (GREEN)" => "$Lang::tr{'intrusion detection system'} (GREEN)", "$Lang::tr{'intrusion detection system'} (RED)" => "$Lang::tr{'intrusion detection system'} (RED)", "$Lang::tr{'intrusion detection system'} (ORANGE)" => "$Lang::tr{'intrusion detection system'} (ORANGE)", "$Lang::tr{'intrusion detection system'} (BLUE)" => "$Lang::tr{'intrusion detection system'} (BLUE)" ); my $lines=0; # Used to count the outputlines to make different bgcolor my $iface = ''; if (open(FILE, "${General::swroot}/red/iface")){ $iface = ; close FILE; chomp $iface; } $servicenames{"$Lang::tr{'intrusion detection system'} (RED)"} = "snort_${iface}"; $servicenames{"$Lang::tr{'intrusion detection system'} (GREEN)"} = "snort_$netsettings{'GREEN_DEV'}"; if ($netsettings{'ORANGE_DEV'} ne ''){ $servicenames{"$Lang::tr{'intrusion detection system'} (ORANGE)"} = "snort_$netsettings{'ORANGE_DEV'}"; } if ($netsettings{'BLUE_DEV'} ne ''){ $servicenames{"$Lang::tr{'intrusion detection system'} (BLUE)"} = "snort_$netsettings{'BLUE_DEV'}"; } my @querry = split(/\?/,$ENV{'QUERY_STRING'}); $querry[0] = '' unless defined $querry[0]; $querry[1] = 'hour' unless defined $querry[1]; if ( $querry[0] =~ "processescpu"){ print "Content-type: image/png\n\n"; binmode(STDOUT); &Graphs::updateprocessescpugraph($querry[1]); }elsif ( $querry[0] =~ "processesmemory"){ print "Content-type: image/png\n\n"; binmode(STDOUT); &Graphs::updateprocessesmemorygraph($querry[1]); }else{ &Header::showhttpheaders(); &Header::openpage($Lang::tr{'status information'}, 1, ''); &Header::openbigbox('100%', 'left'); &Header::openbox('100%', 'left', $Lang::tr{'services'}); print < END ; my $key = ''; foreach $key (sort keys %servicenames){ $lines++; if ($lines % 2){ print "\n\n"; }else{ print "\n\n"; } my $shortname = $servicenames{$key}; my $status = &isrunning($shortname); print "$status\n"; print "\n"; } print "
$Lang::tr{'services'}$Lang::tr{'status'}PID$Lang::tr{'memory'}
"; print %link->{$key}; print "
"; print %link->{$key}; print "
\n"; &Header::closebox(); &Header::openbox('100%', 'left', "Addon - $Lang::tr{services}"); my $paramstr=$ENV{QUERY_STRING}; my @param=split(/!/, $paramstr); if ($param[1] ne ''){ system("/usr/local/bin/addonctrl @param[0] @param[1] > /dev/null 2>&1"); } print < END ; my $lines=0; # Used to count the outputlines to make different bgcolor # Generate list of installed addon pak's my @pak = `find /opt/pakfire/db/installed/meta-* 2>/dev/null | cut -d"-" -f2`; foreach (@pak){ chomp($_); # Check which of the paks are services my @svc = `find /etc/init.d/$_ 2>/dev/null | cut -d"/" -f4`; foreach (@svc){ # blacklist some packages # # alsa has trouble with the volume saving and was not really stopped # chomp($_); if ($_ ne "alsa"){ $lines++; if ($lines % 2){ print ""; }else{ print ""; } print " "; my $status = isautorun($_); print "$status "; print ""; print " "; my $status = &isrunningaddon($_); $status =~ s/\\[[0-1]\;[0-9]+m//g; chomp($status); print "$status"; print ""; } } } print "
Addon Boot $Lang::tr{'action'} $Lang::tr{'status'} PID $Lang::tr{'memory'}
$_$Lang::tr{$Lang::tr{
\n"; &Header::closebox(); &Header::openbox('100%', 'center', "$Lang::tr{'processes'} $Lang::tr{'graph'}"); &Graphs::makegraphbox("services.cgi","processescpu","day"); &Header::closebox(); &Header::openbox('100%', 'center', "$Lang::tr{'processes'} $Lang::tr{'memory'} $Lang::tr{'graph'}"); &Graphs::makegraphbox("services.cgi","processesmemory","day"); &Header::closebox(); &Header::closebigbox(); &Header::closepage(); } sub isautorun{ my $cmd = $_[0]; my $status = ""; my $init = `find /etc/rc.d/rc3.d/S??${cmd} 2>/dev/null`; chomp ($init); if ($init ne ''){ $status = "$Lang::tr{"; } $init = `find /etc/rc.d/rc3.d/off/S??${cmd} 2>/dev/null`; chomp ($init); if ($init ne ''){ $status = "$Lang::tr{"; } return $status; } sub isrunning{ my $cmd = $_[0]; my $status = "$Lang::tr{'stopped'}"; my $pid = ''; my $testcmd = ''; my $exename; my @memory; $cmd =~ /(^[a-z]+)/; $exename = $1; if (open(FILE, "/var/run/${cmd}.pid")){ $pid = ; chomp $pid; close FILE; if (open(FILE, "/proc/${pid}/status")){ while (){ if (/^Name:\W+(.*)/) { $testcmd = $1; } } close FILE; } if (open(FILE, "/proc/${pid}/statm")){ my $temp = ; @memory = split(/ /,$temp); } close FILE; if ($testcmd =~ /$exename/){ $status = "$Lang::tr{'running'}$pid$memory[0] KB"; } } return $status; } sub isrunningaddon{ my $cmd = $_[0]; my $status = "$Lang::tr{'stopped'}"; my $pid = ''; my $testcmd = ''; my $exename; my @memory; my $testcmd = `/usr/local/bin/addonctrl $_ status`; if ( $testcmd =~ /is\ running/ && $testcmd !~ /is\ not\ running/){ $status = "$Lang::tr{'running'}"; $testcmd =~ s/[a-z_]//gi; $testcmd =~ s/\[[0-1]\;[0-9]+//gi; $testcmd =~ s/[\(\)\.]//gi; $testcmd =~ s/ //gi; $testcmd =~ s///gi; my @pid = split(/\s/,$testcmd); $status .="$pid[0]"; my $memory = 0; foreach (@pid){ chomp($_); if (open(FILE, "/proc/$_/statm")){ my $temp = ; @memory = split(/ /,$temp); } $memory+=$memory[0]; } $status .="$memory KB"; }else{ $status = "$Lang::tr{'stopped'}"; } return $status; }