#!/usr/bin/perl # # Script: index.pl # # Project: AWLP - Alptekin's Wireless Linux Project # http://awlp.sourceforge.net/ # # Version: 1.2 # # Author: Alptekin Cakircali # http://www.cakircali.com/alptekin # (alptekin@cakircali.com) # # Date: August 24, 2005 # # Purpose: This script is part of AWLP. This script is the main one that # provides the web-based control functionality. # # Modification History: # v1.2 - August 24, 2005: o Added Captive Portal - NoCatAuth v0.82 # o Included 'links' Slackware package in tag files # # v1.1 - August 15, 2005: o Updated for the latest versions of Slackware 10.1 # o Incorporated latest releases of hostap-driver (v0.3.9), # hostap-utils (v0.3.7) and bridge-utils (v1.0.6) # o Updated IEEE Organizationally Unique Identifier # file (oui_filtered.txt) content # # v1.0 - December 20, 2004: o Initial code release # # # # Copyright and License: # ---------------------- # # Copyright (c) 2005 Alptekin Cakircali # Released under the GNU GPL - see http://www.gnu.org/copyleft/gpl.html # # This file is part of AWLP. # # AWLP 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. # # AWLP 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 AWLP; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Adding /var/www/cgi-bin to @INC BEGIN { push @INC, '/var/www/cgi-bin/awlp' } # Include the global_configuration.pl, engines1.pl, engines2.pl and error_messages.pl require("global_configuration.pl"); require("engines1.pl"); require("engines2.pl"); require("error_messages.pl"); use CGI; $TheQuery = new CGI; $FORM_Action1 = $TheQuery->param('Action1'); $FORM_Action2 = $TheQuery->param('Action2'); $FORM_Action3 = $TheQuery->param('Action3'); @MainPageLinksAction = ('Wireless', 'ShowEncryption', 'ShowACL', 'Firewall', 'Administration', 'ShowClients', 'ShowStatus'); @MainPageLinksName = ('Wireless', 'Encryption', 'ACL', 'Firewall', 'Administration', 'Clients', 'Status'); %ACLPolicyMenuList = ('open' => 0, 'allow' => 1, 'deny' => 2); %AuthenticationMenuList = (0 => 'Disabled', 1 => 'Open', 2 => 'Shared Key', 3 => 'Auto'); %OperationSpeedMenuList = (1 => '1 Mbps', 3 => '2 Mbps', 7 => '5.5 Mbps', 15 => '11 Mbps'); %ClientBridgingMenuList = (0 => 'Disabled', 1 => 'Enabled'); %RXAntennaMenuList = (0 => 'Card Defaults', 1 => 'Antenna Diversity'); %TXAntennaMenuList = (0 => 'Card Defaults', 1 => 'Antenna Diversity'); @EncryptionAlgorithmMenuList = ('WEP', 'none'); # If they are coming the first time, then show them the status page if (!$FORM_Action1) { $FORM_Action1 = "ShowStatus"; } # Check FORM_Action1 if it is in @MainPageLinksAction $Invalid_Action1 = 1; foreach (@MainPageLinksAction) { if ($_ eq $FORM_Action1) { $Invalid_Action1 = 0; } } if ($Invalid_Action1) { &possible_intruder_attack("${ERROR_MESSAGES_SHOW[101]}", 1); } # Check Wireless interfaces if it is UP or Down %WirelessInterface = &iwconfig_parser("${IWCONFIG_PATH}", "${WirelessInterfaceName}"); if ($WirelessInterface{'Mode'} =~ m/^Master$/i) { $WirelessInterfaceStatus = 'UP'; } else { # Wireless Interface is in Invalid State &output_invalid_wireless_interface_state(); exit; } &output_main_page(); # # Subroutines # sub output_main_page() { # This subroutines prints the main page, you need to pass $FORM_Action1 to this # subroutine to specify which page to output. # Build the link list depending on $FORM_Action1 # First define the links my $Left_Plane_Links, $Right_Plane_Output; $Left_Plane_Links = ""; for($i=0;$i<@MainPageLinksAction;$i++) { # Depending on $FORM_Action1, output in a different format if ($MainPageLinksAction[$i] eq $FORM_Action1) { $Left_Plane_Links .=<${MainPageLinksName[$i]}${FONTC}

HTMLCODE } else { $Left_Plane_Links .=<${FONT2}${MainPageLinksName[$i]}${FONTC}

HTMLCODE } } # Build the page to be output on the right plane depending on the Action Type if ($FORM_Action1 eq "Wireless") { my $i, $Attrib, $AttribValue; my $ChannelNumber, $ChannelMenu, $AuthenticationMenu, $OperationSpeedMenu, $ClientBridgingMenu, $RXAntennaMenu, $TXAntennaMenu, $OperationSpeedValid, $AuthenticationAlgorithmValid, $ClientBridgingValid, $RXAntennaValid, $TXAntennaValid, $LANUpdateErrorMessage, $WirelessUpdateErrorMessage, $TurnUpDownButton; my $RCWLANContent, $RCWLANContent_New; my $APMACShow; my %WANConfigDetails, %IWConfigDetails, %Prism2Parameters; if (!$FORM_Action2 || ($FORM_Action2 eq "Wireless")) { # Turn on/off the interface or update the configuration if ($FORM_Action3 eq "Turn UP") { &AP_Wireless_manage("${IWCONFIG_PATH}", "${WirelessInterfaceName}", "MasterMode"); sleep(3); } elsif ($FORM_Action3 eq "Turn Down") { &AP_Wireless_manage("${IWCONFIG_PATH}", "${WirelessInterfaceName}", "MonitorMode"); sleep(3); } # Update the configuration if ($FORM_Action3 eq "UPDATE") { my $FORM_SSID = $TheQuery->param('SSID'); my $FORM_ChannelNumber = $TheQuery->param('ChannelNumber'); my $FORM_OperationSpeed = $TheQuery->param('OperationSpeed'); my $FORM_ClientBridging = $TheQuery->param('ClientBridging'); my $FORM_RXAntenna = $TheQuery->param('RXAntenna'); my $FORM_TXAntenna = $TheQuery->param('TXAntenna'); my $FORM_BeaconInterval = $TheQuery->param('BeaconInterval'); my $FORM_DTIMPeriod = $TheQuery->param('DTIMPeriod'); my $FORM_APMaxInactivity = $TheQuery->param('APMaxInactivity'); my $FORM_AuthenticationAlgorithm = $TheQuery->param('AuthenticationAlgorithm'); # Check if OperationSpeed is in allowed list $OperationSpeedValid = 0; foreach (keys %OperationSpeedMenuList) { if ($_ == $FORM_OperationSpeed) { $OperationSpeedValid = 1; } } # Check if Authentication Algorithm is in allowed list $AuthenticationAlgorithmValid = 0; foreach (keys %AuthenticationMenuList) { if ($_ == $FORM_AuthenticationAlgorithm) { $AuthenticationAlgorithmValid = 1; } } # Check if Client Bridging is in allowed list $ClientBridgingValid = 0; foreach (keys %ClientBridgingMenuList) { if ($_ == $FORM_ClientBridging) { $ClientBridgingValid = 1; } } # Check if RX Antenna is in allowed list $RXAntennaValid = 0; foreach (keys %RXAntennaMenuList) { if ($_ == $FORM_RXAntenna) { $RXAntennaValid = 1; } } # Check if TX Antenna is in allowed list $TXAntennaValid = 0; foreach (keys %TXAntennaMenuList) { if ($_ == $FORM_TXAntenna) { $TXAntennaValid = 1; } } if ($FORM_SSID !~ m/^([0-9\w\s\-]){2,32}$/i) { $WirelessUpdateErrorMessage = "
Error:   ${ERROR_MESSAGES_SHOW[108]}

"; } elsif ($FORM_ChannelNumber < 1 || $FORM_ChannelNumber > ${MAX_CHANNEL_NUMBER}) { $WirelessUpdateErrorMessage = "
Error:   ${ERROR_MESSAGES_SHOW[109]}

"; } elsif (!$OperationSpeedValid) { $WirelessUpdateErrorMessage = "
Error:   ${ERROR_MESSAGES_SHOW[114]}

"; } elsif (!$ClientBridgingValid) { $WirelessUpdateErrorMessage = "
Error:   ${ERROR_MESSAGES_SHOW[135]}

"; } elsif (!$RXAntennaValid) { $WirelessUpdateErrorMessage = "
Error:   ${ERROR_MESSAGES_SHOW[136]}

"; } elsif (!$TXAntennaValid) { $WirelessUpdateErrorMessage = "
Error:   ${ERROR_MESSAGES_SHOW[137]}

"; } elsif (($FORM_BeaconInterval < $BEACON_INT_MIN_VALUE) || ($FORM_BeaconInterval > $BEACON_INT_MAX_VALUE)) { $WirelessUpdateErrorMessage = "
Error:   ${ERROR_MESSAGES_SHOW[115]}

"; } elsif (($FORM_DTIMPeriod < $DTIM_PERIOD_MIN_VALUE) || ($FORM_DTIMPeriod > $DTIM_PERIOD_MAX_VALUE)) { $WirelessUpdateErrorMessage = "
Error:   ${ERROR_MESSAGES_SHOW[116]}

"; } elsif (($FORM_APMaxInactivity < $AP_MAX_INACTIVITY_MIN_VALUE) || ($FORM_APMaxInactivity > $AP_MAX_INACTIVITY_MAX_VALUE)) { $WirelessUpdateErrorMessage = "
Error:   ${ERROR_MESSAGES_SHOW[117]}

"; } elsif (!$AuthenticationAlgorithmValid) { $WirelessUpdateErrorMessage = "
Error:   ${ERROR_MESSAGES_SHOW[118]}

"; } else { # Now, do the updates # Update the AP Mode # Update SSID and Channel Number &AP_Wireless_manage("${IWCONFIG_PATH}", "${WirelessInterfaceName}", "SetSSID", "${FORM_SSID}"); &AP_Wireless_manage("${IWCONFIG_PATH}", "${WirelessInterfaceName}", "SetChannel", ${FORM_ChannelNumber}); # Update Operation Speed &set_prism2_parameter("${PRISM2_PARAM_PATH}", "${WirelessInterfaceName}", "oper_rates", ${FORM_OperationSpeed}); # Update Client Bridging &set_prism2_parameter("${PRISM2_PARAM_PATH}", "${WirelessInterfaceName}", "ap_bridge_packets", ${FORM_ClientBridging}); # Update RX Antenna &set_prism2_parameter("${PRISM2_PARAM_PATH}", "${WirelessInterfaceName}", "antsel_rx", ${FORM_RXAntenna}); # Update TX Antenna &set_prism2_parameter("${PRISM2_PARAM_PATH}", "${WirelessInterfaceName}", "antsel_tx", ${FORM_TXAntenna}); # Update Beacon Interval &set_prism2_parameter("${PRISM2_PARAM_PATH}", "${WirelessInterfaceName}", "beacon_int", ${FORM_BeaconInterval}); # Update DTIM Period &set_prism2_parameter("${PRISM2_PARAM_PATH}", "${WirelessInterfaceName}", "dtim_period", ${FORM_DTIMPeriod}); # Update Maximum Inactivity &set_prism2_parameter("${PRISM2_PARAM_PATH}", "${WirelessInterfaceName}", "ap_max_inactivity", ${FORM_APMaxInactivity}); # Update Authentication Algorithm &set_prism2_parameter("${PRISM2_PARAM_PATH}", "${WirelessInterfaceName}", "ap_auth_algs", ${FORM_AuthenticationAlgorithm}); # Updating ${RCWLAN_PATH} to make the changes permanent for the next restart $RCWLANContent = `cat $RCWLAN_PATH`; $RCWLANContent_New = $RCWLANContent; $RCWLANContent_New =~ s/CHANNEL=\d+/CHANNEL=${FORM_ChannelNumber}/is; $RCWLANContent_New =~ s/OPERATION_RATES=\d+/OPERATION_RATES=${FORM_OperationSpeed}/is; $RCWLANContent_New =~ s/CLIENT_BRIDGING=\d+/CLIENT_BRIDGING=${FORM_ClientBridging}/is; $RCWLANContent_New =~ s/RX_ANTENNA=\d+/RX_ANTENNA=${FORM_RXAntenna}/is; $RCWLANContent_New =~ s/TX_ANTENNA=\d+/TX_ANTENNA=${FORM_TXAntenna}/is; $RCWLANContent_New =~ s/CLIENT_BRIDGING=\d+/CLIENT_BRIDGING=${FORM_ClientBridging}/is; $RCWLANContent_New =~ s/ESSID=\".*?\"/ESSID=\"${FORM_SSID}\"/is; $RCWLANContent_New =~ s/BEACON_INTERVAL=\d+/BEACON_INTERVAL=${FORM_BeaconInterval}/is; $RCWLANContent_New =~ s/DTIM_PERIOD=\d+/DTIM_PERIOD=${FORM_DTIMPeriod}/is; $RCWLANContent_New =~ s/MAXIMUM_INACTIVITY=\d+/MAXIMUM_INACTIVITY=${FORM_APMaxInactivity}/is; $RCWLANContent_New =~ s/AUTHENTICATION_ALGORITHM=\d+/AUTHENTICATION_ALGORITHM=${FORM_AuthenticationAlgorithm}/is; open(FILE, ">${RCWLAN_PATH}"); flock FILE, 2; print FILE $RCWLANContent_New; flock FILE, 8; close(FILE); sleep(1); } } # Get the ifconfig values %IFConfigDetails = &ifconfig_parser("${IFCONFIG_PATH}", "${WirelessInterfaceName}"); # Get the iwconfig values %IWConfigDetails = &iwconfig_parser("${IWCONFIG_PATH}", "${WirelessInterfaceName}"); # Get the WAN IP Addresses %WANConfigDetails = &ifconfig_parser("${IFCONFIG_PATH}", "eth0"); # Need to re-check Wireless Interface Status if Action3 was Turn UP or Turn Down if ($IWConfigDetails{'Mode'} =~ m/^Master$/i) { $WirelessInterfaceStatus = 'UP'; } else { # Wireless Interface is in Invalid Mode &output_invalid_wireless_interface_state(); exit; } # Depending on whether we are in Master or Monitor mode, output it correctly. if ($WirelessInterfaceStatus eq "UP") { # Find the channel number based on the frequency $ChannelNumber = &find_ISM_channel_number($IWConfigDetails{'Frequency'}); # Build channel number drop-down menu $ChannelMenu = "\n"; # Get the Prism2Parameters %Prism2Parameters = &proc_get_prism2_parameters("${PRISM2_PARAM_PATH}", "${WirelessInterfaceName}"); # Build the AuthenticationMenu $AuthenticationMenu = "\n"; # Build the Operation Speed Menu List $OperationSpeedMenu = "\n"; # Build the Client Bridging Menu List $ClientBridgingMenu = "\n"; # Build the RX Antenna Menu List $RXAntennaMenu = "\n"; # Build the TX Antenna Menu List $TXAntennaMenu = "\n"; $Right_Plane_Output .=<
${FONT2}
   ${FONT2}Status:${FONTC}    ${FONT2}UP   >>>   ${FONTC} 

   ${FONT2}MAC:${FONTC}    ${FONT2}$IWConfigDetails{'AccessPoint'}${FONTC} 
   ${FONT2}LAN IP:${FONTC}    ${FONT2}$IFConfigDetails{'InetAddress'} / $IFConfigDetails{'NetMask'}${FONTC} 
   ${FONT2}WAN IP:${FONTC}    ${FONT2}$WANConfigDetails{'InetAddress'} / $WANConfigDetails{'NetMask'}${FONTC} 
 
   ${FONT2}Wireless Protocol:${FONTC}    ${FONT2}$IWConfigDetails{'IEEE'}${FONTC} 
   ${FONT2}SSID:${FONTC}    ${FONT2}${FONTC} 
   ${FONT2}Channel:${FONTC}    ${FONT2}${ChannelMenu}${FONTC} 
   ${FONT2}Client Bridging:${FONTC}    ${FONT2}${ClientBridgingMenu}${FONTC} 
   ${FONT2}RX Antenna:${FONTC}    ${FONT2}${RXAntennaMenu}${FONTC} 
   ${FONT2}TX Antenna:${FONTC}    ${FONT2}${TXAntennaMenu}${FONTC} 
   ${FONT2}Operation Speed:${FONTC}    ${FONT2}${OperationSpeedMenu}${FONTC} 
   ${FONT2}Beacon Interval:${FONTC}    ${FONT2} seconds   (${BEACON_INT_MIN_VALUE} - ${BEACON_INT_MAX_VALUE})${FONTC} 
   ${FONT2}DTIM Period:${FONTC}    ${FONT2} seconds   (${DTIM_PERIOD_MIN_VALUE} - ${DTIM_PERIOD_MAX_VALUE})${FONTC} 
   ${FONT2}Maximum Inactivity:${FONTC}    ${FONT2} seconds   (${AP_MAX_INACTIVITY_MIN_VALUE} - ${AP_MAX_INACTIVITY_MAX_VALUE})${FONTC} 
   ${FONT2}Authentication:${FONTC}    ${FONT2}${AuthenticationMenu}${FONTC} 

${WirelessUpdateErrorMessage}

${FONTC}



HTMLCODE } else { $Right_Plane_Output .=<
${FONT2}    Status: DOWN   >>>    

${FONTC}



HTMLCODE } } } elsif ($FORM_Action1 eq "Firewall") { my $i, $NoCatContent, $Temp_1, $Temp_2, $Temp_3, $Temp_4, $Temp_5, $Temp_6, $Temp_7, $Temp_8, $Temp_9, $ConfigFileInvalid, $NoCatPortListShow, $NoCatErrorMessages, $NoCatUpdateErrorMessage; my @Temp_3, @OpenPortList, @OpenPortListNew; # Check the existense of nocat.conf file if (!(-r ${NOCAT_CONFIG_PATH})) { $ConfigFileInvalid = 1; $NoCatErrorMessage = "
Error:   ${ERROR_MESSAGES_SHOW[123]}

"; } else { # Check if update is initated if ($FORM_Action2 =~ m/^UPDATE$/i) { if (!(-w ${NOCAT_CONFIG_PATH})) { $NoCatUpdateErrorMessage = "
Error:   ${ERROR_MESSAGES_SHOW[126]}

"; } else { # Get the form variables my $FORM_NumberOfPorts = $TheQuery->param('NumberOfPorts'); my $j, $PortNumber, $OldPortNumber, $PortListExisting, $PortListReplace; my @RemovedPorts, @AddedPorts; # Now, iterate through each value for($j=0;$j<$FORM_NumberOfPorts;$j++) { $PortNumber = $TheQuery->param("PortNumber_${j}"); if ($PortNumber < 1 || $PortNumber > 65535) { next; } push(@OpenPortListNew, "${PortNumber}"); } # Sort the new port list @OpenPortListNew = sort sort_OpenPorts_byportnumber @OpenPortListNew; # Construct the allowed outgoing port list by eliminating the duplicates foreach (@OpenPortListNew) { s/\s+//g; $PortNumber = $_; if (${PortNumber} =~ m/^${OldPortNumber}$/i) { next; } $PortListReplace .= "${PortNumber} "; $OldPortNumber = $PortNumber; } $PortListReplace =~ s/\s+$//; # Read the NoCat configuration file content $NoCatContent = `cat ${NOCAT_CONFIG_PATH}`; # Grab the existing allowed port list from the configuration file $NoCatContent =~ m/#IncludePorts_Start\s+IncludePorts\s+(.*?)\s+#IncludePorts_End/is; $PortListExisting = $1; $PortListExisting =~ s/\s+/ /g; if ("${PortListReplace}" ne "${PortListExisting}") { # Replace the allowed port list in the configuration file $NoCatContent =~ s/#IncludePorts_Start\s+IncludePorts\s+(.*?)#IncludePorts_End/#IncludePorts_Start\nIncludePorts ${PortListReplace}\n#IncludePorts_End/is; # Now, write the NoCat config file open(FILE, ">${NOCAT_CONFIG_PATH}"); flock FILE, 2; print FILE $NoCatContent; flock FILE, 8; close(FILE); # We need to alter the firewall rules for the updated port list # We first need to find removed ports foreach $Temp_8 (split(/\s+/, $PortListExisting)) { if (($PortListReplace !~ m/^${Temp_8}\s+/i) && ($PortListReplace !~ m/\s+${Temp_8}\s+/i) && ($PortListReplace !~ m/\s+${Temp_8}$/i)) { push(@RemovedPorts, $Temp_8); } } # Then, we find added ports foreach $Temp_9 (split(/\s+/, $PortListReplace)) { if (($PortListExisting !~ m/^${Temp_9}\s+/i) && ($PortListExisting !~ m/\s+${Temp_9}\s+/i) && ($PortListExisting !~ m/\s+${Temp_9}$/i)) { push(@AddedPorts, $Temp_9); } } # Remove the iptables rules for removed ports foreach $Temp_8 (@RemovedPorts) { if ($Temp_8 =~ m/^\d+$/) { system("${IPTABLES_PATH} -t filter -D NoCat_Ports -p tcp -i ${WirelessInterfaceName} --dport ${Temp_8} -m mark --mark 3 -j ACCEPT"); system("${IPTABLES_PATH} -t filter -D NoCat_Ports -p udp -i ${WirelessInterfaceName} --dport ${Temp_8} -m mark --mark 3 -j ACCEPT"); } } # Add iptables rules for added ports foreach $Temp_9 (@AddedPorts) { if ($Temp_9 =~ m/^\d+$/) { system("${IPTABLES_PATH} -t filter -A NoCat_Ports -p tcp -i ${WirelessInterfaceName} --dport ${Temp_9} -m mark --mark 3 -j ACCEPT"); system("${IPTABLES_PATH} -t filter -A NoCat_Ports -p udp -i ${WirelessInterfaceName} --dport ${Temp_9} -m mark --mark 3 -j ACCEPT"); } } # Do the final touch to iptables rule list system("${IPTABLES_PATH} -t filter -D NoCat_Ports -p tcp -i ${WirelessInterfaceName} -m mark --mark 3 -j DROP"); system("${IPTABLES_PATH} -t filter -D NoCat_Ports -p udp -i ${WirelessInterfaceName} -m mark --mark 3 -j DROP"); system("${IPTABLES_PATH} -t filter -A NoCat_Ports -p tcp -i ${WirelessInterfaceName} -m mark --mark 3 -j DROP"); system("${IPTABLES_PATH} -t filter -A NoCat_Ports -p udp -i ${WirelessInterfaceName} -m mark --mark 3 -j DROP"); } } } # Read the configuration file content $NoCatContent = `cat ${NOCAT_CONFIG_PATH}`; $Temp_1 = $NoCatContent; $Temp_1 =~ s/\s+//g; if (!$Temp_1) { $ConfigFileInvalid = 1; $NoCatErrorMessages = "
Error:   ${ERROR_MESSAGES_SHOW[124]}

"; } # Get the open ports list if (!$ConfigFileInvalid && ($NoCatContent =~ m/#IncludePorts_Start\s+IncludePorts\s+(.*?)\s+#IncludePorts_End/is)) { $Temp_2 = $1; @Temp_3 = split(/\s+/, $Temp_2); foreach (@Temp_3) { s/\s+//g; push(@OpenPortList, $_); } @OpenPortList = sort sort_OpenPorts_byportnumber @OpenPortList; } else { $ConfigFileInvalid = 1; $NoCatErrorMessages = "
Error:   ${ERROR_MESSAGES_SHOW[125]}

"; } } if (!$ConfigFileInvalid) { # Construct the Open Port List Form # Find the number of open ports, add 3 for expansion and compare it with the max value $Temp_7 = @OpenPortList; if (($Temp_7 < $ALLOWED_OUTGOING_PORTS_MAX_NUMBER) && (($Temp_7 + ${ALLOWED_OUTGOING_PORTS_INCREMENT_VALUE}) > $ALLOWED_OUTGOING_PORTS_MAX_NUMBER)) { $Temp_7 = $ALLOWED_OUTGOING_PORTS_MAX_NUMBER; } elsif ($Temp_7 >= $ALLOWED_OUTGOING_PORTS_MAX_NUMBER) { $Temp_7 = @OpenPortList; } else { $Temp_7 += ${ALLOWED_OUTGOING_PORTS_INCREMENT_VALUE}; } # Iterate through each port for($i=0;$i<$Temp_7;$i++) { $Temp_6 = $i + 1; if ($Temp_6 < 10) { $Temp_6 = "    ${Temp_6}"; } elsif ($Temp_6 < 100) { $Temp_6 = "  ${Temp_6}"; } $Temp_4 = $OpenPortList[$i]; $NoCatPortListShow .=<${Temp_6} -      $WELL_KNOWN_PORTS{$Temp_4}   
HTMLCODE } $Right_Plane_Output .=<
Allowed Outgoing Ports List

${NoCatPortListShow}
${NoCatUpdateErrorMessage}



${FONTC} HTMLCODE } else { $Right_Plane_Output .=< ${NoCatErrorMessages} ${FONTC} HTMLCODE } } elsif ($FORM_Action1 eq "Administration") { my $LogonSecurityRealmShow, $LogonSecurityUsernameShow; my $LogonSecurityUpdateStatus, $LogonSecurityUpdateMessage, $LogonSecurityUpdateErrorMessage; my $SystemRebootMessage; # System Logon Security if ($FORM_Action2 eq "LOGONSECURITYUPDATE") { # Get the form parameters my $FORM_LogonSecurityRealm = $TheQuery->param('LogonSecurityRealm'); my $FORM_LogonSecurityUsername = $TheQuery->param('LogonSecurityUsername'); my $FORM_LogonSecurityPassword = $TheQuery->param('LogonSecurityPassword'); # Clean-up the form parameters $FORM_LogonSecurityRealm =~ s/^\s*//; $FORM_LogonSecurityRealm =~ s/\s*$//; $FORM_LogonSecurityUsername =~ s/\s*//g; $FORM_LogonSecurityPassword =~ s/\s*//g; # Error check the parameters if ($FORM_LogonSecurityRealm !~ m/^([\'\-\_\s0-9a-zA-Z]){${LOGON_SECURITY_REALM_MIN_LENGTH},${LOGON_SECURITY_REALM_MAX_LENGTH}}$/) { $LogonSecurityUpdateErrorMessage = "
Error:   ${ERROR_MESSAGES_SHOW[131]}

"; } elsif ($FORM_LogonSecurityUsername !~ m/^([0-9a-zA-Z]){${LOGON_SECURITY_USERNAME_MIN_LENGTH},${LOGON_SECURITY_USERNAME_MAX_LENGTH}}$/) { $LogonSecurityUpdateErrorMessage = "
Error:   ${ERROR_MESSAGES_SHOW[132]}

"; } elsif ($FORM_LogonSecurityPassword !~ m/^([0-9a-zA-Z]){${LOGON_SECURITY_PASSWORD_MIN_LENGTH},${LOGON_SECURITY_PASSWORD_MAX_LENGTH}}$/) { $LogonSecurityUpdateErrorMessage = "
Error:   ${ERROR_MESSAGES_SHOW[133]}

"; } $LogonSecurityRealmShow = $FORM_LogonSecurityRealm; $LogonSecurityUsernameShow = $FORM_LogonSecurityUsername; # Now, you can update the logon security information $LogonSecurityUpdateStatus = &Logon_Security_control("${HTACCESS_CONFIG_PATH}", "${HTPASSWD_CONFIG_PATH}", 1, "${FORM_LogonSecurityRealm}", "${FORM_LogonSecurityUsername}", "${FORM_LogonSecurityPassword}"); if ($LogonSecurityUpdateStatus == 0) { $LogonSecurityUpdateMessage = "
Success:   Successfully Updated

"; } else { $LogonSecurityUpdateErrorMessage = "
Error:   ${ERROR_MESSAGES_SHOW[134]}

"; } } else { my %LogonSecurityDetails; %LogonSecurityDetails = &Logon_Security_control("${HTACCESS_CONFIG_PATH}", "${HTPASSWD_CONFIG_PATH}", 0); $LogonSecurityRealmShow = $LogonSecurityDetails{'Realm'}; $LogonSecurityUsernameShow = $LogonSecurityDetails{'Username'}; } # System Reboot if ($FORM_Action2 eq "SYSTEMREBOOT") { &System_reboot(); $SystemRebootMessage = "Success:   Rebooting the system. Please allow 2-3 minutes for the system to restart.

"; } $Right_Plane_Output .=<
- System Logon Security :   

${FONT2} Realm :   ${FONTC} ${FONT2}          ${FONTC}
${FONT2} Username :   ${FONTC} ${FONT2}          ${FONTC}
${FONT2} Password :   ${FONTC} ${FONT2}  (Current password is not shown)         ${FONTC}
  ${FONT2} ${LogonSecurityUpdateErrorMessage} ${LogonSecurityUpdateMessage} ${FONTC}


- System Restart:   

 ${SystemRebootMessage}  

${FONTC} HTMLCODE } elsif ($FORM_Action1 eq "ShowClients") { my $Temp_1, $Temp_3, $Temp_4, $Attrib, $Attrib_UC, $AttribValue, $ACLAddRemoveButton; my $TheMAC = $TheQuery->param('TheMAC'); my $DHCPLeaseInfo, $CardManufacturerInfo; my @ClientMACList; my %Temp_2, %ClientFlags, %ClientDetails, %LeaseDetails; # Check if we are kicking the station if ($FORM_Action2 eq "Kick Station") { if ($TheMAC =~ m/^[\da-f][\da-f]\:[\da-f][\da-f]\:[\da-f][\da-f]\:[\da-f][\da-f]\:[\da-f][\da-f]\:[\da-f][\da-f]$/i) { &kick_station_from_AP("${IWPRIV_PATH}", "${WirelessInterfaceName}", "${TheMAC}"); } } # Check if we are adding this to ACL if ($FORM_Action2 eq "Add to ACL") { # Add MAC to ACL but first remove itself &remove_mac_from_acl("${IWPRIV_PATH}", "${WirelessInterfaceName}", "${TheMAC}"); &add_mac_to_acl("${IWPRIV_PATH}", "${WirelessInterfaceName}", "${TheMAC}"); $FORM_Action2 = "ClientDetails"; } elsif ($FORM_Action2 eq "Remove from ACL") { # Remove MAC from ACL &remove_mac_from_acl("${IWPRIV_PATH}", "${WirelessInterfaceName}", "${TheMAC}"); $FORM_Action2 = "ClientDetails"; } # Now call proc_get_client_mac_list subroutine to get a listing of connected clients @ClientMACList = &proc_get_client_mac_list("${ProcWLANDir}"); $Right_Plane_Output .= "
"; if (@ClientMACList >= 1) { # Now, for each client get the details foreach $Temp_3 (@ClientMACList) { %Temp_2 = &proc_get_client_mac_details("${Temp_3}", "$ProcWLANDir"); $Temp_1 = $Temp_2{'flags'}; $Temp_1 =~ s/0x\d\d\d\d\s*//; $ClientFlags{$Temp_3} = $Temp_1; %Temp_2 = (); } $Right_Plane_Output .= "${FONT2}\n"; if ($FORM_Action2 eq "ClientDetails") { $TheMAC =~ s/\s+//g; if ($TheMAC =~ m/^[\da-f][\da-f]\:[\da-f][\da-f]\:[\da-f][\da-f]\:[\da-f][\da-f]\:[\da-f][\da-f]\:[\da-f][\da-f]$/i) { # Figure out if we are going to show Add to ACL or Remove from ACL button if(is_MAC_in_ACL("${ProcWLANDir}", "${TheMAC}") == 1) { $ACLAddRemoveButton = "   "; } else { $ACLAddRemoveButton = "   "; } %ClientDetails = &proc_get_client_mac_details("${TheMAC}", "$ProcWLANDir"); %LeaseDetails = &get_dhcpd_lease_info("${DHCPD_LEASES_PATH}", "${TheMAC}", 0); $CardManufacturerInfo = &get_card_manufacturer_info("${IEEE_OUI_FILTERED_PATH}", "${TheMAC}"); # Construct the DHCP Lease Info if available if ($LeaseDetails{'IPNo'} =~ m/^\d+\.\d+\.\d+\.\d+$/i) { $DHCPLeaseInfo =<Client Hostname:   $LeaseDetails{'ClientHostname'}   
   IP No:   $LeaseDetails{'IPNo'}   
   Lease Start:   $LeaseDetails{'LeaseStart'}   
   Lease End:   $LeaseDetails{'LeaseEnd'}   

HTMLCODE } $Right_Plane_Output .= <
${FONT2}
Client Details for ${TheMAC}

   Status:   $ClientFlags{$TheMAC}   
   Supported Rates:   $ClientDetails{'supported_rates'}   
   Users:   $ClientDetails{'users'}     Buffer Count:   $ClientDetails{'buffer_count'}   
   RX ->   Packets: $ClientDetails{'rx_packets'}   Bytes: $ClientDetails{'rx_bytes'}   
   TX ->   Packets: $ClientDetails{'tx_packets'}   Bytes: $ClientDetails{'tx_bytes'}   
   Radio ->   $ClientDetails{'last_rx_signal'}   
   Card Manufacturer ->   ${CardManufacturerInfo}   

${DHCPLeaseInfo}
${ACLAddRemoveButton}

${FONTC}

HTMLCODE } } # Now, sort the clients based on ClientFlag foreach $Attrib (sort sort_ClientFlags_byvalue keys %ClientFlags) { # Get the lease details for each client %LeaseDetails = get_dhcpd_lease_info("${DHCPD_LEASES_PATH}", "${Attrib}", 0); $Attrib_UC = uc(${Attrib}); # Check if we have the DHCP Info if ($LeaseDetails{'IPNo'}) { $Temp_4 .=<   ${FONT2}${Attrib_UC}${FONTC}    ${FONT2}$LeaseDetails{'IPNo'} / $LeaseDetails{'ClientHostname'}${FONTC}    ${FONT2}$ClientFlags{$Attrib}${FONTC}  HTMLCODE } else { $Temp_4 .=<   ${FONT2}${Attrib_UC}${FONTC}    ${FONT2}"No DHCP Lease Info"    ${FONT2}$ClientFlags{$Attrib}${FONTC}  HTMLCODE } %LeaseDetails = {}; } $Right_Plane_Output .=<
${FONT2} ${Temp_4}
${FONTC}
HTMLCODE } else { $Right_Plane_Output .=<There are no clients at this time.${FONTC}   
HTMLCODE } $Right_Plane_Output .= <

${FONTC} HTMLCODE if (@ClientMACList >= 1) { $Right_Plane_Output .=<
${FONT2}AUTH:${FONTC} ${FONT2}   Client is Authenticated.   ${FONTC}
${FONT2}ASSOC:${FONTC} ${FONT2}   Client is Associated.   ${FONTC}
${FONT2}PERM:${FONTC} ${FONT2}   Station-specific encryption is specified.   ${FONTC}
${FONT2}POLL:${FONTC} ${FONT2}   Client is Polling AP.   ${FONTC}



HTMLCODE } } elsif ($FORM_Action1 eq "ShowACL") { my $ACLMACListCurrent, $TextAreaRows, $PolicyMenu, $ACLMACPolicyIncorrect; my @MACList, $InvalidMACEntriesShow; my %ACLDetails; if ($FORM_Action2 eq "UpdateACL") { # Now, check form variables for incorrect values # First, get the form variables my $FORM_ACLMACPolicy = $TheQuery->param('ACLMACPolicy'); my $FORM_ACLMACList = $TheQuery->param('ACLMACList'); my $Temp_1, $Temp_2, $Temp_3, @ClientMACList, @IncorrectMACList; my $RCWLANContent, $RCWLANContent_New, $NewMACList; $ACLMACPolicyIncorrect = 1; foreach (keys(%ACLPolicyMenuList)) { if ($_ =~ m/^${FORM_ACLMACPolicy}$/i) { $ACLMACPolicyIncorrect = 0; } } if ($ACLMACPolicyIncorrect) { &possible_intruder_attack("${ERROR_MESSAGES_SHOW[100]}", 1); } # Now, call ACL_policy_modify to change the ACL policy $Temp_1 = $ACLPolicyMenuList{$FORM_ACLMACPolicy}; &ACL_policy_modify("${IWPRIV_PATH}", "${WirelessInterfaceName}", ${Temp_1}); # Now, flush MAC list, then update it with the newlist. &ACL_policy_modify("${IWPRIV_PATH}", "${WirelessInterfaceName}", 3); # Now, accumulate invalid MAC entries in @IncorrectMACList, then add each valid MAC into ACL chomp($FORM_ACLMACList); $FORM_ACLMACList =~ s/^\s+//g; $FORM_ACLMACList =~ s/\s+$//g; @MACList = split(/\s+/, $FORM_ACLMACList); foreach(@MACList) { if (/^[\da-f][\da-f]\:[\da-f][\da-f]\:[\da-f][\da-f]\:[\da-f][\da-f]\:[\da-f][\da-f]\:[\da-f][\da-f]$/i) { $Temp_2 = "${_}"; &add_mac_to_acl("${IWPRIV_PATH}", "${WirelessInterfaceName}", "${Temp_2}"); $NewMACList .= "${Temp_2}\n"; # If MAC Policy is to deny, then kick this stations if ($FORM_ACLMACPolicy =~ m/^deny$/i) { &kick_station_from_AP("${IWPRIV_PATH}", "${WirelessInterfaceName}", "${Temp_2}"); } } else { push(@IncorrectMACList, $_); } } foreach(@IncorrectMACList) { $InvalidMACEntriesShow .= "   $_
\n"; } if ($InvalidMACEntriesShow) { $InvalidMACEntriesShow = "Warning:
The following MAC entries were incorrect:
\n${InvalidMACEntriesShow}"; } # if new ACL policy is allow, then we need to kick all stations # except allowed stations so that there will not be any leftovers. if ($FORM_ACLMACPolicy =~ m/^allow$/i) { # Get all the connected clients and kick them one by one except if it is allowed @ClientMACList = &proc_get_client_mac_list("${ProcWLANDir}"); foreach $Temp_3 (@ClientMACList) { if ($FORM_ACLMACList !~ m/${Temp_3}/is) { &kick_station_from_AP("${IWPRIV_PATH}", "${WirelessInterfaceName}", "${Temp_3}"); } } } # Updating ${RCWLAN_PATH} to make the changes permanent for the next restart $RCWLANContent = `cat $RCWLAN_PATH`; $RCWLANContent_New = $RCWLANContent; $RCWLANContent_New =~ s/ACL_POLICY\=\d+/ACL_POLICY\=${Temp_1}/is; $RCWLANContent_New =~ s/HERE_MAC_LIST\s*.*?HERE_MAC_LIST/HERE_MAC_LIST\n${NewMACList}HERE_MAC_LIST/is; open(FILE, ">${RCWLAN_PATH}"); flock FILE, 2; print FILE $RCWLANContent_New; flock FILE, 8; close(FILE); } # Now call ACL_Status to get ACL info %ACLDetails = &ACL_status("${ProcWLANDir}"); # Prepare the drop-down menu foreach (@{$ACLDetails{MACList}}) { $ACLMACListCurrent .= "$_\n"; } $PolicyMenu = "\n\n"; $TextAreaRows = $ACLDetails{'MACEntries'} + 5; $Right_Plane_Output .=<
${FONT2} MAC Policy:   ${PolicyMenu}

MAC List:   ($ACLDetails{'MACEntries'} entries)

${InvalidMACEntriesShow}

${FONTC}


HTMLCODE } elsif ($FORM_Action1 eq "ShowEncryption") { # If it is empty, then it is the DefaultKeys if (!$FORM_Action2) { $FORM_Action2 = "DefaultKeys"; } if ($FORM_Action2 eq "DefaultKeys") { if ($FORM_Action3 eq "UPDATE") { my $i, $EncryptionAlgorithmIncorrect, $ValidKeysFound, $KickAllStations, $UpdateErrorMessage; my @ClientMACList, @FORM_DefaultKeys; my $FORM_DefaultKeysAlgorithm = $TheQuery->param('DefaultKeysAlgorithm'); my $FORM_NumberOfKeys = $TheQuery->param('NumberOfKeys'); my $FORM_TXKeyIdx = $TheQuery->param('TXKeyIdx'); my $RCWLANContent, $RCWLANContent_New; # Get All the keys for($i=1;$i<=$FORM_NumberOfKeys;$i++) { $FORM_DefaultKeys[$i] = $TheQuery->param("Keys${i}"); $FORM_DefaultKeys[$i] =~ s/\s+//g; } # Now, do error checking on form variables # First, check encryption algorithm $EncryptionAlgorithmIncorrect = 1; foreach (@EncryptionAlgorithmMenuList) { if ($FORM_DefaultKeysAlgorithm eq $_) { $EncryptionAlgorithmIncorrect = 0; } } if ($EncryptionAlgorithmIncorrect) { &possible_intruder_attack("${ERROR_MESSAGES_SHOW[102]}", 1); } # Read the RCWLAN_PATH content $RCWLANContent = `cat $RCWLAN_PATH`; $RCWLANContent_New = $RCWLANContent; # Do the rest of the error checking based on the encryption algorithm if ($FORM_DefaultKeysAlgorithm eq "WEP") { # Now, check keys, only 40-bit or 104-bit keys are allowed $ValidKeysFound = 0; for($i=1;$i<=${FORM_NumberOfKeys};$i++) { if (($FORM_DefaultKeys[$i] =~ m/^([\da-f]){10}$/i) || ($FORM_DefaultKeys[$i] =~ m/^([\da-f]){26}$/i)) { $ValidKeysFound = 1; } } if (!$ValidKeysFound) { $UpdateErrorMessage = "Error:
${ERROR_MESSAGES_SHOW[103]}

"; } else { $RCWLANContent_New =~ s/ENCRYPTION_ALGORITHM\=\".*?\"/ENCRYPTION_ALGORITHM\=\"WEP\"/is; # Now, adjust TXKeyIdx if ($FORM_TXKeyIdx < 1 || $FORM_TXKeyIdx > $FORM_NumberOfKeys) { $FORM_TXKeyIdx = 1; } # Now, iterate through each valid key and set it for($i=1;$i<=${FORM_NumberOfKeys};$i++) { if (($FORM_DefaultKeys[$i] =~ m/^([\da-f]){10}$/i) || ($FORM_DefaultKeys[$i] =~ m/^([\da-f]){26}$/i) || (!$FORM_DefaultKeys[$i])) { if ($i == $FORM_TXKeyIdx) { &Encryption_control("${HOSTAP_CRYPT_CONF_PATH}", "${WirelessInterfaceName}", "SetDefaultKey", "${FORM_DefaultKeysAlgorithm}", $i, "$FORM_DefaultKeys[$i]", 1); $RCWLANContent_New =~ s/KEYS\[${i}\]\=\".*?\"/KEYS\[${i}]\=\"t${FORM_DefaultKeys[$i]}\"/is; $KickAllStations = 1; } else { &Encryption_control("${HOSTAP_CRYPT_CONF_PATH}", "${WirelessInterfaceName}", "SetDefaultKey", "${FORM_DefaultKeysAlgorithm}", $i, "$FORM_DefaultKeys[$i]", 0); $RCWLANContent_New =~ s/KEYS\[${i}\]\=\".*?\"/KEYS\[${i}]\=\"${FORM_DefaultKeys[$i]}\"/is; $KickAllStations = 1; } } } } } elsif ($FORM_DefaultKeysAlgorithm =~ m/^none$/i) { # Clear out each key for($i=1;$i<=${FORM_NumberOfKeys};$i++) { # Clear out each key before setting it &Encryption_control("${HOSTAP_CRYPT_CONF_PATH}", "${WirelessInterfaceName}", "SetDefaultKey", "WEP", $i, "", 0); } # Now, change the algorithm to none &Encryption_control("${HOSTAP_CRYPT_CONF_PATH}", "${WirelessInterfaceName}", "SetDefaultKey", "${FORM_DefaultKeysAlgorithm}"); $RCWLANContent_New =~ s/ENCRYPTION_ALGORITHM\=\".*?\"/ENCRYPTION_ALGORITHM\=\"none\"/is; $RCWLANContent_New =~ s/KEYS\[(\d+)\]\=\".*?\"/KEYS\[${1}\]\=\"\"/isg; $KickAllStations = 1; } # Updating ${RCWLAN_PATH} to make the changes permanent for the next restart open(FILE, ">${RCWLAN_PATH}"); flock FILE, 2; print FILE $RCWLANContent_New; flock FILE, 8; close(FILE); # Since the encryption method or keys are changed, kick all stations so # they will not stay stalled if ($KickAllStations) { # Get all the connected clients and kick them one by one @ClientMACList = &proc_get_client_mac_list("${ProcWLANDir}"); foreach (@ClientMACList) { &kick_station_from_AP("${IWPRIV_PATH}", "${WirelessInterfaceName}", "${_}"); } } } my $i, $KeysFormOutput, $DefaultKeysAlgorithmMenu, $none_HelpMessage; my %DefaultKeys; # Call Encryption_control to get the default keys %DefaultKeys = &Encryption_control("${HOSTAP_CRYPT_CONF_PATH}", "${WirelessInterfaceName}", "ListDefaultKeys"); # Build the Encryption Algorithm Drop-down menu $DefaultKeysAlgorithmMenu = "\n\n"; # Build the Encryption Key input forms $KeysFormOutput = ""; for ($i=1;$i<=${PRISM2_MAX_WEP_KEYS};$i++) { if (($i == 1) && !$DefaultKeys{'TXKeyIdx'}) { $KeysFormOutput .=<Key ${i}:   TX   
HTMLCODE } elsif ($i == $DefaultKeys{'TXKeyIdx'}) { $KeysFormOutput .=<Key ${i}:   TX   
HTMLCODE } else { $KeysFormOutput .=<Key ${i}:   TX   
HTMLCODE } } # Add the ASCII to HEX Conversion Tool Link $KeysFormOutput .= <  Note:   Keys should be either 10-digit or 24-digit hexadecimal
    ${FONT2}ASCII -> HEX Conversion Tool${FONTC}
    ${FONT2}HEX -> ASCII Conversion Tool${FONTC}


HTMLCODE # This is necessary while passing the NumberOfKeys $i--; $Right_Plane_Output = < ${FONT2}
Algorithm:   ${DefaultKeysAlgorithmMenu}

${UpdateErrorMessage} ${KeysFormOutput}
${FONTC}


HTMLCODE } } elsif ($FORM_Action1 eq "ShowStatus") { my $Temp_1, $CardDetails, $CardDetailsShow, $WirelessCardManufacturerInfo, $WiredCardManufacturerInfo, $CurrentDateTime, $SecurityEncryptionShow; my $UptimeInfoShow, $MemoryUsageInfoShow, $DiskUsageInfoShow; my $CARDMGRStatusShow, $CRONDStatusShow, $DHCPDStatusShow, $GATEWAYStatusShow, $HTTPDStatusShow, $NAMEDStatusShow, $NTPDStatusShow, $SSHDStatusShow, $SYSLOGDStatusShow; my @DiskUsageInfo, @DiskUsageInfoParts, @MemoryUsageInfo, @MemoryUsageInfoParts; my %CARDMGRStatus, %CRONDStatusShow, %DHCPDStatus, %HTTPDStatus, %GATEWAYStatus, %NAMEDStatus, %NTPDStatus, %SSHDStatus, %SYSLOGDStatus; my %UptimeInfoDetails, %IWConfigDetails, %IFConfigDetailsWireless, %IFConfigDetailsWired; # Get the current date & time $CurrentDateTime = &show_date_time(0); # Get the uptime info %UptimeInfoDetails = &get_uptime_info("${UPTIME_PATH}"); $UptimeInfoShow = "UP $UptimeInfoDetails{'Uptime'} with Loads: $UptimeInfoDetails{'LoadAverage'} 
"; # Get the disk usage info @DiskUsageInfo = &get_disk_usage_info("${DF_COMMAND_PATH}", "${DF_COMMAND_SWITCHES}"); # Get the memory usage info @MemoryUsageInfo = &get_memory_usage_info("${FREE_COMMAND_PATH}", "${FREE_COMMAND_SWITCHES}"); # Get the iwconfig values %IWConfigDetails = &iwconfig_parser("${IWCONFIG_PATH}", "${WirelessInterfaceName}"); # Get the ifconfig values of the wireless interface %IFConfigDetailsWireless = &ifconfig_parser("${IFCONFIG_PATH}", "${WirelessInterfaceName}"); # Get the ifconfig values of the wired interface %IFConfigDetailsWired = &ifconfig_parser("${IFCONFIG_PATH}", "${WiredInterfaceName}"); # Get the cardctl values $CardDetails = &Card_Identification("${CARDCTL_PATH}"); $CardDetailsShow = $CardDetails; $CardDetailsShow =~ s/\n+/
/g; # Get the wireless card manufacturer info $WirelessCardManufacturerInfo = uc(&get_card_manufacturer_info("${IEEE_OUI_FILTERED_PATH}", "$IFConfigDetailsWireless{'HardwareAddress'}")); # Get the wired card manufacturer info $WiredCardManufacturerInfo = uc(&get_card_manufacturer_info("${IEEE_OUI_FILTERED_PATH}", "$IFConfigDetailsWired{'HardwareAddress'}")); # Get the Daemon status %CARDMGRStatus = &check_daemon_status("cardmgr"); %CRONDStatus = &check_daemon_status("crond"); %DHCPDStatus = &check_daemon_status("dhcpd", "${WirelessInterfaceName}"); %GATEWAYStatus = &check_daemon_status("gateway"); %HTTPDStatus = &check_daemon_status("httpd"); %NAMEDStatus = &check_daemon_status("named"); %NTPDStatus = &check_daemon_status("ntpd"); %SSHDStatus = &check_daemon_status("sshd"); %SYSLOGDStatus = &check_daemon_status("syslogd"); # Construct the Daemon Status Section if ($DHCPDStatus{'Code'} == 1) { $DHCPDStatusShow = "$DHCPDStatus{'Info'}"; } else { $DHCPDStatusShow = "!!! $DHCPDStatus{'Info'}"; } if ($HTTPDStatus{'Code'} == 1) { $HTTPDStatusShow = "$HTTPDStatus{'Info'}"; } else { $HTTPDStatusShow = "!!! $HTTPDStatus{'Info'}"; } if ($GATEWAYStatus{'Code'} == 1) { $GATEWAYStatusShow = "$GATEWAYStatus{'Info'}"; } else { $GATEWAYStatusShow = "!!! $GATEWAYStatus{'Info'}"; } if ($NAMEDStatus{'Code'} == 1) { $NAMEDStatusShow = "$NAMEDStatus{'Info'}"; } else { $NAMEDStatusShow = "!!! $NAMEDStatus{'Info'}"; } if ($NTPDStatus{'Code'} == 1) { $NTPDStatusShow = "$NTPDStatus{'Info'}"; } else { $NTPDStatusShow = "!!! $NTPDStatus{'Info'}"; } if ($SSHDStatus{'Code'} == 1) { $SSHDStatusShow = "$SSHDStatus{'Info'}"; } else { $SSHDStatusShow = "!!! $SSHDStatus{'Info'}"; } if ($SYSLOGDStatus{'Code'} == 1) { $SYSLOGDStatusShow = "$SYSLOGDStatus{'Info'}"; } else { $SYSLOGDStatusShow = "!!! $SYSLOGDStatus{'Info'}"; } if ($CARDMGRStatus{'Code'} == 1) { $CARDMGRStatusShow = "$CARDMGRStatus{'Info'}"; } else { $CARDMGRStatusShow = "!!! $CARDMGRStatus{'Info'}"; } if ($CRONDStatus{'Code'} == 1) { $CRONDStatusShow = "$CRONDStatus{'Info'}"; } else { $CRONDStatusShow = "!!! $CRONDStatus{'Info'}"; } # Get the security details if ($IWConfigDetails{'SecurityMode'}) { $SecurityEncryptionShow =<$IWConfigDetails{'SecurityMode'}     Encryption Key: $IWConfigDetails{'EncryptionKey'} 
HTMLCODE } # Construct the disk usage info section foreach (@DiskUsageInfo) { @DiskUsageInfoParts = split(/,/, $_); if (${DiskUsageInfoParts[5]} >= ${DF_CAPACITY_ALARM_LEVEL}) { $DiskUsageInfoShow .= "${FONT2}${DiskUsageInfoParts[0]}   ${FONTC}${FONT2}${DiskUsageInfoParts[1]}   ${FONTC}${FONT2}${DiskUsageInfoParts[2]}   ${FONTC}${FONT2}${DiskUsageInfoParts[3]}   ${FONTC}${FONT2}${DiskUsageInfoParts[4]}   ${FONTC}${FONT2}${DiskUsageInfoParts[5]}   ${FONTC}${FONT2}${DiskUsageInfoParts[6]}   ${FONTC}\n"; } else { $DiskUsageInfoShow .= "${FONT2}${DiskUsageInfoParts[0]}   ${FONTC}${FONT2}${DiskUsageInfoParts[1]}   ${FONTC}${FONT2}${DiskUsageInfoParts[2]}   ${FONTC}${FONT2}${DiskUsageInfoParts[3]}   ${FONTC}${FONT2}${DiskUsageInfoParts[4]}   ${FONTC}${FONT2}${DiskUsageInfoParts[5]}   ${FONTC}${FONT2}${DiskUsageInfoParts[6]}   ${FONTC}\n"; } @DiskUsageInfoParts = (); } if ($DiskUsageInfoShow) { $DiskUsageInfoShow =< ${FONT2}Filesystem   ${FONTC}${FONT2}Type   ${FONTC}${FONT2}Size   ${FONTC}${FONT2}Used   ${FONTC}${FONT2}Available   ${FONTC}${FONT2}Use%   ${FONTC}${FONT2}Mounted on   ${FONTC} ${DiskUsageInfoShow} HTMLCODE } else { $DiskUsageInfoShow = "
N/A
\n"; } # Construct the memory usage info section foreach (@MemoryUsageInfo) { @MemoryUsageInfoParts = split(/,/, $_); $MemoryUsageInfoShow .= "${FONT2}${MemoryUsageInfoParts[0]}   ${FONTC}${FONT2}${MemoryUsageInfoParts[1]}   ${FONTC}${FONT2}${MemoryUsageInfoParts[2]}   ${FONTC}${FONT2}${MemoryUsageInfoParts[3]}   ${FONTC}${FONT2}${MemoryUsageInfoParts[4]}   ${FONTC}${FONT2}${MemoryUsageInfoParts[5]}   ${FONTC}${FONT2}${MemoryUsageInfoParts[6]}   ${FONTC}\n"; @MemoryUsageInfoParts = (); } if ($MemoryUsageInfoShow) { $MemoryUsageInfoShow =< ${FONT2} ${FONTC}${FONT2}Total   ${FONTC}${FONT2}Used   ${FONTC}${FONT2}Free   ${FONTC}${FONT2}Shared   ${FONTC}${FONT2}Buffers   ${FONTC}${FONT2}Cached   ${FONTC} ${MemoryUsageInfoShow} HTMLCODE } else { $MemoryUsageInfoShow = "
N/A
\n"; } $Right_Plane_Output .=<
${CurrentDateTime}

${UptimeInfoShow}


${FONT2}
  •  ${FONT2}Client SNR Radar${FONTC} ${FONT1}(Refreshed every ${SNR_RADAR_REFRESH_INTERVAL} sec.)${FONTC}
  •  ${FONT2}Bandwidth Radar${FONTC} ${FONT1}(Refreshed every ${BW_RADAR_REFRESH_INTERVAL} sec.)${FONTC}
  •  ${FONT2}DHCP Lease Table${FONTC} ${FONT1}(Refreshed every ${DHCP_LEASE_TABLE_REFRESH_INTERVAL} sec.)${FONTC}
  •  ${FONT2}Error Codes List${FONTC} 
  •  ${FONT2}Check for Updates${FONTC} 


  • DISK:
    ${DiskUsageInfoShow}
  • MEMORY:
    ${MemoryUsageInfoShow}
  • CARD(s):
    ${CardDetailsShow}
  • DAEMONS:
    ${DHCPDStatusShow}
    ${HTTPDStatusShow}
    ${GATEWAYStatusShow}
    ${NAMEDStatusShow}
    ${SSHDStatusShow}
    ${NTPDStatusShow}

  • WIRELESS: ${WirelessInterfaceName}
    Mode: $IWConfigDetails{'Mode'} 
    ${SecurityEncryptionShow} Bit Rate: $IWConfigDetails{'BitRate'}     Sensitivity: $IWConfigDetails{'Sensitivity'} 
    Retry Min Limit: $IWConfigDetails{'RetryMinLimit'}     RTS Threshold: $IWConfigDetails{'RTSThr'}     Fragment Threshold: $IWConfigDetails{'FragmentThr'} 
    RX Invalid NWID: $IWConfigDetails{'RxInvalidNWID'}     RX Invalid Crypt: $IWConfigDetails{'RxInvalidCrypt'}     RX Invalid Frag: $IWConfigDetails{'RxInvalidFrag'} 
    TX Excessive Retries: $IWConfigDetails{'TxExcessiveRetries'}     Invalid Misc: $IWConfigDetails{'InvalidMisc'}     Missed Beacon: $IWConfigDetails{'MissedBeacon'} 
    Link Encapsulation: $IFConfigDetailsWireless{'LinkEncapsulation'}     MAC Address: $IFConfigDetailsWireless{'HardwareAddress'} 
    Card Manufacturer: ${WirelessCardManufacturerInfo} 
    MTU: $IFConfigDetailsWireless{'MTU'}     Metric: $IFConfigDetailsWireless{'Metric'} 
    RX -> Packets: $IFConfigDetailsWireless{'RxPackets'}   Bytes: $IFConfigDetailsWireless{'RxBytes'}   Errors: $IFConfigDetailsWireless{'RxErrors'}      Dropped: $IFConfigDetailsWireless{'RxDropped'} 
    TX -> Packets: $IFConfigDetailsWireless{'TxPackets'}   Bytes: $IFConfigDetailsWireless{'TxBytes'}   Errors: $IFConfigDetailsWireless{'TxErrors'}      Dropped: $IFConfigDetailsWireless{'TxDropped'} 
    Collisions: $IFConfigDetailsWireless{'Collisions'}     Queue Length: $IFConfigDetailsWireless{'TxQueueLength'} 

  • LAN: ${WiredInterfaceName}
    Link Encapsulation: $IFConfigDetailsWired{'LinkEncapsulation'}     MAC Address: $IFConfigDetailsWired{'HardwareAddress'} 
    Card Manufacturer: ${WiredCardManufacturerInfo} 
    MTU: $IFConfigDetailsWired{'MTU'}     Metric: $IFConfigDetailsWired{'Metric'} 
    RX -> Packets: $IFConfigDetailsWired{'RxPackets'}   Bytes: $IFConfigDetailsWired{'RxBytes'}   Errors: $IFConfigDetailsWired{'RxErrors'}      Dropped: $IFConfigDetailsWired{'RxDropped'} 
    TX -> Packets: $IFConfigDetailsWired{'TxPackets'}   Bytes: $IFConfigDetailsWired{'TxBytes'}   Errors: $IFConfigDetailsWired{'TxErrors'}      Dropped: $IFConfigDetailsWired{'TxDropped'} 
    Collisions: $IFConfigDetailsWired{'Collisions'}     Queue Length: $IFConfigDetailsWired{'TxQueueLength'} 





${FONTC} HTMLCODE } print "Content-type: text/html\nCharset: ${CHARACTER_SET}\nPragma: no-cache\n\n"; print < ${MAIN_TITLE}
${FONT3}${PROJECT_NAME} - v${PROJECT_VERSION}${FONTC}

${Left_Plane_Links}



${Right_Plane_Output}
${FONT1}    Powered by:   AWLP  v${PROJECT_VERSION}   
   Copyright (c) 2005, Alptekin Cakircali   

${FONTC}
HTMLCODE return; } sub output_invalid_wireless_interface_state() { my $ErrorMessageShow; $ErrorMessageShow = ${ERROR_MESSAGES_SHOW[120]}; $ErrorMessageShow =~ s/\(\:\d+\)//; print "Content-type: text/html\nCharset: ${CHARACTER_SET}\nPragma: no-cache\n\n"; print < ${MAIN_TITLE}
${FONT3}${PROJECT_NAME} - v${PROJECT_VERSION}${FONTC}

${FONT2} ERROR:

${ErrorMessageShow} ${FONTC}


${FONT1}    Powered by:   AWLP v${PROJECT_VERSION}   
   Copyright (c) 2005, Alptekin Cakircali   

${FONTC}
HTMLCODE return; } sub possible_intruder_attack() { my $ErrorMessage = $_[0], $TerminateProgram = $_[1]; print "Content-type: text/html\nCharset: ${CHARACTER_SET}\nPragma: no-cache\n\n"; print < ($ErrorMessage)


HTMLCODE if ($TerminateProgram) { exit; } } exit;