X-Git-Url: http://git.ipfire.org/?p=people%2Fpmueller%2Fipfire-2.x.git;a=blobdiff_plain;f=html%2Fcgi-bin%2Fservices.cgi;h=424ca868f15161e1694d55217032080ddbc99ace;hp=688cdc9c05adb2cce1acfe8d0c8c032c38612752;hb=26906d98239bf79d9344e8f0796d5ca40d02ee73;hpb=cd1a2927226c734d96478e12bb768256fb64a06a diff --git a/html/cgi-bin/services.cgi b/html/cgi-bin/services.cgi index 688cdc9c05..424ca868f1 100644 --- a/html/cgi-bin/services.cgi +++ b/html/cgi-bin/services.cgi @@ -1,586 +1,306 @@ -#!/usr/bin/perl -# -# This file is part of the IPCop Firewall. -# -# IPCop 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 2 of the License, or -# (at your option) any later version. -# -# IPCop 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 IPCop; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# -# Copyright (C) 2003-09-22 Darren Critchley -# -# $Id: services.cgi,v 1.2.2.3 2005/04/29 23:37:07 franck78 Exp $ -# - -use strict; - -require 'CONFIG_ROOT/general-functions.pl'; -require "${General::swroot}/lang.pl"; -require "${General::swroot}/header.pl"; - -my @icmptypes = &get_icmptypes(); - -&Header::showhttpheaders(); - -my %cgiparams=(); -my %selected=(); -my %checked=(); -my $filename = "${General::swroot}/firewall/customservices"; -my $key = 0; # used for finding last sequence number used - -# Darren Critchley - vars for setting up sort order -my $sort_col = '1'; -my $sort_type = 'a'; -my $sort_dir = 'asc'; - -if ($ENV{'QUERY_STRING'} ne '') { - my ($item1, $item2, $item3) = split(/\&/,$ENV{'QUERY_STRING'}); - if ($item1 ne '') { - ($junk, $sort_col) = split(/\=/,$item1) - } - if ($item2 ne '') { - ($junk, $sort_type) = split(/\=/,$item2) - } - if ($item3 ne '') { - ($junk, $sort_dir) = split(/\=/,$item3) - } -} - -$cgiparams{'KEY'} = ''; -$cgiparams{'PORTS'} = ''; -$cgiparams{'PROTOCOL'} = '6'; -$cgiparams{'NAME'} = ''; -$cgiparams{'PORT_INVERT'} = 'off'; -$cgiparams{'PROTOCOL_INVERT'} = 'off'; -$cgiparams{'ICMP'} = 'BLANK'; - -&Header::getcgihash(\%cgiparams); - -if ($cgiparams{'ACTION'} eq $Lang::tr{'add'}){ - - &validateparams(); - unless($errormessage){ - $key++; # Add one to last sequence number - open(FILE,">>$filename") or die 'Unable to open config file.'; - flock FILE, 2; - print FILE "$key,$cgiparams{'NAME'},$cgiparams{'PORTS'},$cgiparams{'PROTOCOL'},$cgiparams{'PORT_INVERT'},$cgiparams{'PROTOCOL_INVERT'},$cgiparams{'ICMP'}\n"; - close(FILE); - &General::log("$Lang::tr{'service added'}: $cgiparams{'NAME'}"); - undef %cgiparams; - } -} - -if ($cgiparams{'ACTION'} eq $Lang::tr{'update'}) -{ - &validateparams(); - # Darren Critchley - If there is an error don't waste any more processing time - if ($errormessage) { $cgiparams{'ACTION'} = $Lang::tr{'edit'}; goto UPD_ERROR; } - - unless($errormessage){ - open(FILE, $filename) or die 'Unable to open custom services file.'; - my @current = ; - close(FILE); - my $line; - open(FILE, ">$filename") or die 'Unable to open config file.'; - flock FILE, 2; - foreach $line (@current) { - chomp($line); - my @temp = split(/\,/,$line); - if ($cgiparams{'KEY'} eq $temp[0]) { - print FILE "$cgiparams{'KEY'},$cgiparams{'NAME'},$cgiparams{'PORTS'},$cgiparams{'PROTOCOL'},$cgiparams{'PORT_INVERT'},$cgiparams{'PROTOCOL_INVERT'},$cgiparams{'ICMP'}\n"; - } else { - print FILE "$line\n"; - } - } - close(FILE); - &General::log("$Lang::tr{'service updated'}: $cgiparams{'NAME'}"); - undef %cgiparams; - } -UPD_ERROR: -} - -if ($cgiparams{'ACTION'} eq $Lang::tr{'edit'}) -{ - open(FILE, "$filename") or die 'Unable to open custom services file.'; - my @current = ; - close(FILE); - - unless ($errormessage) - { - foreach my $line (@current) - { - chomp($line); - my @temp = split(/\,/,$line); - if ($cgiparams{'KEY'} eq $temp[0]) { - $cgiparams{'NAME'} = $temp[1]; - $cgiparams{'PORTS'} = $temp[2]; - $cgiparams{'PROTOCOL'} = $temp[3]; - $cgiparams{'PORT_INVERT'} = $temp[4]; - $cgiparams{'PROTOCOL_INVERT'} = $temp[5]; - $cgiparams{'ICMP'} = $temp[6]; - } - - } - } -} - -if ($cgiparams{'ACTION'} eq $Lang::tr{'remove'}) -{ - open(FILE, $filename) or die 'Unable to open custom services file.'; - my @current = ; - close(FILE); - - open(FILE, ">$filename") or die 'Unable to open custom services file.'; - flock FILE, 2; - foreach my $line (@current) - { - chomp($line); - if ($line ne '') { - my @temp = split(/\,/,$line); - if ($cgiparams{'KEY'} eq $temp[0]) { - &General::log("$Lang::tr{'service removed'}: $temp[1]"); - } else { - print FILE "$temp[0],$temp[1],$temp[2],$temp[3],$temp[4],$temp[5],$temp[6]\n"; - } - } - } - close(FILE); - undef %cgiparams; -} - -if ($cgiparams{'ACTION'} eq $Lang::tr{'reset'}) -{ - undef %cgiparams; -} - -if ($cgiparams{'ACTION'} eq '') -{ - $cgiparams{'KEY'} = ''; - $cgiparams{'PORTS'} = ''; - $cgiparams{'PROTOCOL'} = '6'; - $cgiparams{'NAME'} = ''; - $cgiparams{'PORT_INVERT'} = 'off'; - $cgiparams{'PROTOCOL_INVERT'} = 'off'; - $cgiparams{'ICMP'} = 'BLANK'; -} - -# Darren Critchley - Bring in the protocols file built from /etc/protocols into hash %protocol -require "${General::swroot}/firewall/protocols.pl"; - -# Darren Critchley - figure out which protocol is selected -$selected{'PROTOCOL'}{'tcpudp'}= ''; -$selected{'PROTOCOL'}{'all'}= ''; -foreach $line (keys %protocols) { -# $selected{'PROTOCOL'}{"$protocols{$line}"}= ''; - $selected{'PROTOCOL'}{$line}= ''; -} -$selected{'PROTOCOL'}{$cgiparams{'PROTOCOL'}} = 'SELECTED'; - -# Darren Critchley - figure out which icmptype is selected -$selected{'ICMP'}{$cgiparams{'ICMP'}} = 'SELECTED'; - -$checked{'PORT_INVERT'}{'off'} = ''; -$checked{'PORT_INVERT'}{'on'} = ''; -$checked{'PORT_INVERT'}{$cgiparams{'PORT_INVERT'}} = 'CHECKED'; -$checked{'PROTOCOL_INVERT'}{'off'} = ''; -$checked{'PROTOCOL_INVERT'}{'on'} = ''; -$checked{'PROTOCOL_INVERT'}{$cgiparams{'PROTOCOL_INVERT'}} = 'CHECKED'; - -&Header::openpage($Lang::tr{'services settings'}, 1, ''); - -&Header::openbigbox('100%', 'LEFT', '', $errormessage); - -# DEBUG DEBUG -#&Header::openbox('100%', 'LEFT', 'DEBUG'); -#foreach $line (keys %cgiparams) { -# print "$line = $cgiparams{$line}
"; -#} -#print "$sort_col\n"; -#print "$ENV{'QUERY_STRING'}\n"; -#print " 
\n"; -#&Header::closebox(); - -if ($errormessage) { - &Header::openbox('100%', 'LEFT', $Lang::tr{'error messages'}); - print "$errormessage\n"; - print " \n"; - &Header::closebox(); -} - -if ($cgiparams{'ACTION'} eq $Lang::tr{'edit'}){ - &Header::openbox('100%', 'LEFT', "$Lang::tr{'edit service'}:"); -} else { - &Header::openbox('100%', 'LEFT', "$Lang::tr{'add service'}:"); -} -# Darren Critchley - Show protocols with TCP, UDP, etc at the top of the list. -print < -
- - - - - - - - - - - - - - - - - - - - - - - - - -END -; -if ($cgiparams{'ACTION'} eq $Lang::tr{'edit'}){ - print "\n"; - print "\n"; - print "\n"; -} else { - print "\n"; - print "\n"; -} -print < -
$Lang::tr{'servicename'}$Lang::tr{'invert'}$Lang::tr{'ports'}$Lang::tr{'invert'}$Lang::tr{'protocol'}  
- - - - - - - - -
   $Lang::tr{'icmp type'}: -
-
- -END -; - -&Header::closebox(); - -&Header::openbox('100%', 'LEFT', "$Lang::tr{'custom services'}:"); -print < - - -END -; - -if ($sort_dir eq 'asc' && $sort_col eq '2') { - print "\n"; -} else { - print "\n"; -} -if ($sort_dir eq 'asc' && $sort_col eq '3') { - print "\n"; -} else { - print "\n"; -} -if ($sort_dir eq 'asc' && $sort_col eq '4') { - print "\n"; -} else { - print "\n"; -} - -print <$Lang::tr{'icmp type'} - - - -END -; -&display_custom_services(); -print < - -END -; -&Header::closebox(); - -&Header::openbox('100%', 'LEFT', "$Lang::tr{'default services'}:"); -print < -
$Lang::tr{'servicename'}$Lang::tr{'servicename'}$Lang::tr{'ports'}$Lang::tr{'ports'}$Lang::tr{'protocol'}$Lang::tr{'protocol'}  
- - - - - -END -; -&display_default_services(); -print < - -END -; -&Header::closebox(); - - print "$Lang::tr{'this feature has been sponsored by'} : "; - print "Kobelt Development Inc..\n"; - - -&Header::closebigbox(); - -&Header::closepage(); - -sub display_custom_services -{ - - open(FILE, "$filename") or die 'Unable to open services file.'; - my @current = ; - close(FILE); - - my $id = 0; - my $port_inv = ''; - my $prot_inv = ''; - my $port_inv_tail = ''; - my $prot_inv_tail = ''; - my @outarray = &General::srtarray($sort_col,$sort_type,$sort_dir,@current); - foreach $line (@outarray) - { - chomp($line); - if ($line ne ''){ - my @temp = split(/\,/,$line); - # Darren Critchley highlight the row we are editing - if ( $cgiparams{'ACTION'} eq $Lang::tr{'edit'} && $cgiparams{'KEY'} eq $temp[0] ) { - print "\n"; - } else { - if ($id % 2) { - print "\n"; - } else { - print "\n"; - } - } - print "\n"; - if ($temp[4] eq 'on'){$port_inv = " ! (";$port_inv_tail = ")";}else{$port_inv='';$port_inv_tail='';} - print "\n"; - if ($temp[5] eq 'on'){$prot_inv = " ! (";$prot_inv_tail = ")";}else{$prot_inv='';$prot_inv_tail='';} - print "\n"; - if ($temp[6] eq 'BLANK') { - print "\n"; - } else { - print "\n"; - } - print < - - - - - -END -; - print "\n"; - $id++; - } - } -} - -sub display_default_services -{ - my $fname = "${General::swroot}/firewall/defaultservices"; - my $prev = ""; - my $newline=""; - - open(FILE, "$fname") or die 'Unable to open default services file.'; - my @current = ; - close(FILE); - - my $id = 0; - - foreach my $line (sort @current) - { - my @temp = split(/\,/,$line); - if ($id % 2) { - print "\n"; - } else { - print "\n"; - } - print "\n"; - print "\n"; - print "\n"; - print "\n"; - $id++; - } -} - -sub cleanprotocol -{ - my $prtcl = $_[0]; - chomp($prtcl); - if ($prtcl eq 'tcpudp') { - $prtcl = 'TCP & UDP'; - } else { - $prtcl = uc($prtcl); - } - return $prtcl; -} - -sub cleanport -{ - my $prt = $_[0]; - chomp($prt); - # Darren Critchley - Format the ports - $prt =~ s/-/ - /; - $prt =~ s/:/ - /; - return $prt; -} - -# Validate Field Entries -sub validateparams -{ - $erromessage=''; - if ($cgiparams{'PROTOCOL'} eq 'tcp' || $cgiparams{'PROTOCOL'} eq 'udp' || $cgiparams{'PROTOCOL'} eq 'tcpudp' || $cgiparams{'PROTOCOL'} eq 'all') { - # Darren Critchley - Get rid of dashes in port ranges - $cgiparams{'PORTS'}=~ tr/-/:/; - # Darren Critchley - code to substitue wildcards - if ($cgiparams{'PORTS'} eq "*") { - $cgiparams{'PORTS'} = "1:65535"; - } - if ($cgiparams{'PORTS'} =~ /^(\D)\:(\d+)$/) { - $cgiparams{'PORTS'} = "1:$2"; - } - if ($cgiparams{'PORTS'} =~ /^(\d+)\:(\D)$/) { - $cgiparams{'PORTS'} = "$1:65535"; - } - # Darren Critchley - watch the order here, the validportrange sets errormessage='' - $errormessage = &General::validportrange($cgiparams{'PORTS'}, 'src'); - if ($errormessage) {return;} - } else { - $cgiparams{'PORTS'} = ""; - } - if ($cgiparams{'PROTOCOL'} eq 'tcp') { - $cgiparams{'ICMP'} = "BLANK"; - } - - if($cgiparams{'PORTS'} eq '' && $cgiparams{'PORT_INVERT'} ne 'off'){ - $cgiparams{'PORT_INVERT'} = 'off'; - } - if ($cgiparams{'NAME'} eq '') { - $errormessage = $Lang::tr{'noservicename'}; - return; - } - if ($cgiparams{'PROTOCOL'} eq 'icmp' && $cgiparams{'ICMP'} eq 'BLANK'){ - $errormessage = $Lang::tr{'icmp selected but no type'}; - return; - } - unless($errormessage){ - $cgiparams{'NAME'}=&Header::cleanhtml($cgiparams{'NAME'}); - open(FILE, $filename) or die 'Unable to open custom services file.'; - my @current = ; - close(FILE); - foreach my $line (@current) - { - chomp($line); - if ($line ne '') { - my @temp = split(/\,/,$line); - if ($cgiparams{'NAME'} eq $temp[1] && $cgiparams{'KEY'} ne $temp[0]) { - $errormessage=$Lang::tr{'duplicate name'}; - return; - } - $key=$temp[0]; - } - } - unless($errormessage){ - my $fname = "${General::swroot}/firewall/defaultservices"; - my $prev = ""; - my $newline=""; - - open(FILE, "$fname") or die 'Unable to open default services file.'; - my @current = ; - close(FILE); - - foreach my $line (sort @current) - { - my @temp = split(/\,/,$line); - if ($cgiparams{'NAME'} eq $temp[0]) { - $errormessage=$Lang::tr{'duplicate name'}; - return; - } - } - } - } -} - -sub get_icmptypes -{ - my $fname = "${General::swroot}/firewall/icmptypes"; - my $newline=""; - my @newarray=(); - - open(FILE, "$fname") or die 'Unable to open icmp file.'; - my @current = ; - close(FILE); - - foreach $newline (sort @current) - { - chomp ($newline); - if (substr($newline, 0, 1) ne "#") { - push (@newarray, $newline); - } - } - return (@newarray); -} - +#!/usr/bin/perl +############################################################################### +# # +# IPFire.org - A linux based firewall # +# Copyright (C) 2005-2010 IPFire Team # +# # +# 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 < +
$Lang::tr{'servicename'}$Lang::tr{'ports'}$Lang::tr{'protocol'}
$temp[1]" . $port_inv . &cleanport("$temp[2]") . $port_inv_tail . "" . $prot_inv . &cleanprotocol("$temp[3]") . $prot_inv_tail . "N/A$temp[6] - - - -
- - - -
$temp[0]$temp[1]" . &cleanprotocol("$temp[2]") . "
+ +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 "
AddonBoot$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 2>/dev/null`; + + 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; +}