X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=html%2Fcgi-bin%2Fwlanap.cgi;h=58c6376feac996a2bdb018370bdc0e63ce9cf48e;hb=289d82ad6e87b8b22b6cb90d3b16fb1a6721734c;hp=1e5da201e4657a000d55a85eef7132dd97f001cc;hpb=54359730410b8a3ff27a48401fb76cfc730f2bc1;p=people%2Fteissler%2Fipfire-2.x.git diff --git a/html/cgi-bin/wlanap.cgi b/html/cgi-bin/wlanap.cgi old mode 100755 new mode 100644 index 1e5da201e..58c6376fe --- a/html/cgi-bin/wlanap.cgi +++ b/html/cgi-bin/wlanap.cgi @@ -2,7 +2,7 @@ ############################################################################### # # # IPFire.org - A linux based firewall # -# Copyright (C) 2007 Michael Tremer & Christian Schmidt # +# Copyright (C) 2005-2013 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 # @@ -25,18 +25,18 @@ use strict; # enable only the following on debugging purpose -use warnings; -use CGI::Carp 'fatalsToBrowser'; +#use warnings; +#use CGI::Carp 'fatalsToBrowser'; require '/var/ipfire/general-functions.pl'; require '/var/ipfire/lang.pl'; require '/var/ipfire/header.pl'; my $debug = 0; -my $i = 0; +my $status = ''; my $errormessage = ''; -my $status_started = "$Lang::tr{'running'}"; -my $status_stopped = "$Lang::tr{'stopped'}"; +my $status_started = "$Lang::tr{'running'}"; +my $status_stopped = "$Lang::tr{'stopped'}"; # get rid of used only once warnings my @onlyonce = ( $Header::colourgreen, $Header::colourred ); @@ -49,6 +49,7 @@ my %mainsettings = (); my %netsettings=(); my %wlanapsettings=(); my $channel = ''; +my $country = ''; my $txpower = ''; &General::readhash("${General::swroot}/main/settings", \%mainsettings); @@ -56,79 +57,107 @@ my $txpower = ''; &General::readhash("/var/ipfire/ethernet/settings", \%netsettings); $wlanapsettings{'APMODE'} = 'on'; -$wlanapsettings{'INTERFACE'} = $netsettings{'BLUE_DEV'}; +$wlanapsettings{'ACTION'} = ''; +$wlanapsettings{'MACMODE'} = '0'; +$wlanapsettings{'INTERFACE'} = ''; $wlanapsettings{'SSID'} = 'IPFire'; $wlanapsettings{'HIDESSID'} = 'off'; -$wlanapsettings{'ENC'} = 'wpa'; # none / wpa +$wlanapsettings{'ENC'} = 'wpa2'; # none / wpa1 /wpa2 $wlanapsettings{'TXPOWER'} = 'auto'; -# $wlanapsettings{'CC'} = '276'; # CountryCode, 276 = Germany -$wlanapsettings{'CHAN'} = '05'; +$wlanapsettings{'CHANNEL'} = '05'; +$wlanapsettings{'COUNTRY'} = '00'; +$wlanapsettings{'HW_MODE'} = 'g'; $wlanapsettings{'PWD'} = 'IPFire-2.x'; -$wlanapsettings{'PSK'} = '69eb868ed7b3cc36d767b729048c9c585234723d1eafbe66e5a16957b7c85e9c'; -$wlanapsettings{'WPA'} = '1'; - $wlanapsettings{'SYSLOGLEVEL'} = '0'; $wlanapsettings{'DEBUG'} = '4'; -$wlanapsettings{'DRIVER'} = 'MADWIFI'; # UNKNOWN / MADWIFI / RT2500 / PRISM54 / ... +$wlanapsettings{'DRIVER'} = 'MADWIFI'; +$wlanapsettings{'HTCAPS'} = ''; -# WLANMODE= (a/b/g) &General::readhash("/var/ipfire/wlanap/settings", \%wlanapsettings); +&Header::getcgihash(\%wlanapsettings); -my %cgiparams=(); -$cgiparams{'ACTION'} = ''; -$cgiparams{'RUNNING'} = 'off'; -$cgiparams{'APMODE'} = 'on'; -$cgiparams{'SSID'} = 'IPFire'; -$cgiparams{'HIDESSID'} = 'off'; -$cgiparams{'ENC'} = 'wpa'; # none / wep / wpa / wep+wpa -$cgiparams{'TXPOWER'} = 'auto'; -$cgiparams{'CHAN'} = '05'; +my @macs = $wlanapsettings{'MACS'}; -$cgiparams{'PWD'} = 'IPFire-2.x'; -$cgiparams{'PSK'} = '69eb868ed7b3cc36d767b729048c9c585234723d1eafbe66e5a16957b7c85e9c'; -$cgiparams{'WPA'} = '1'; +delete $wlanapsettings{'__CGI__'}; +delete $wlanapsettings{'x'}; +delete $wlanapsettings{'y'}; +delete $wlanapsettings{'MACS'}; +delete $wlanapsettings{'ACCEPT_MACS'}; +delete $wlanapsettings{'DENY_MACS'}; -$cgiparams{'SYSLOGLEVEL'} = '0'; -$cgiparams{'DEBUG'} = '4'; -&Header::getcgihash(\%cgiparams); +&Header::showhttpheaders(); + +my $string=(); +my $status=(); +my $errormessage = ''; +my $memory = 0; +my @memory=(); +my @pid=(); +my @hostapd=(); +sub pid +{ +# for pid and memory + open(FILE, '/usr/local/bin/addonctrl hostapd status | '); + @hostapd = ; + close(FILE); + $string = join("", @hostapd); + $string =~ s/[a-z_]//gi; + $string =~ s/\[[0-1]\;[0-9]+//gi; + $string =~ s/[\(\)\.]//gi; + $string =~ s/ //gi; + $string =~ s///gi; + @pid = split(/\s/,$string); + if (open(FILE, "/proc/$pid[0]/statm")){ + my $temp = ; + @memory = split(/ /,$temp); + close(FILE); + } + $memory+=$memory[0]; +} +pid(); -&Header::showhttpheaders(); -if ( $cgiparams{'ACTION'} eq "$Lang::tr{'save'}" ){ - $wlanapsettings{'APMODE'} = $cgiparams{'APMODE'}; - $wlanapsettings{'SSID'} = $cgiparams{'SSID'}; - $wlanapsettings{'HIDESSID'} = $cgiparams{'HIDESSID'}; - $wlanapsettings{'ENC'} = $cgiparams{'ENC'}; - $wlanapsettings{'CHAN'} = $cgiparams{'CHAN'}; - $wlanapsettings{'TXPOWER'} = $cgiparams{'TXPOWER'}; - - $wlanapsettings{'PWD'} = $cgiparams{'PWD'}; - $wlanapsettings{'PSK'} = $cgiparams{'PSK'}; - $wlanapsettings{'WPA'} = $cgiparams{'WPA'}; - $wlanapsettings{'SYSLOGLEVEL'}= $cgiparams{'SYSLOGLEVEL'}; - $wlanapsettings{'DEBUG'} = $cgiparams{'DEBUG'}; - - # verify WPA Passphrase, must be 8 .. 63 characters - if ( (length($wlanapsettings{'PWD'}) < 8) || (length($wlanapsettings{'PWD'}) > 63) ){ - $errormessage .= "Invalid length in WPA Passphrase. Must be between 8 and 63 characters.
"; +if ( $wlanapsettings{'ACTION'} eq "$Lang::tr{'wlanap del interface'}" ){ + delete $wlanapsettings{'INTERFACE'}; + &General::writehash("/var/ipfire/wlanap/settings", \%wlanapsettings); +} + +if ( $wlanapsettings{'ACTION'} eq "$Lang::tr{'save'}" ){ + # verify WPA Passphrase - only with enabled enc + if (($wlanapsettings{'ENC'} eq "wpa1") || ($wlanapsettings{'ENC'} eq "wpa2") || ($wlanapsettings{'ENC'} eq "wpa1+2")){ + # must be 8 .. 63 characters + if ( (length($wlanapsettings{'PWD'}) < 8) || (length($wlanapsettings{'PWD'}) > 63)){ + $errormessage .= "$Lang::tr{'wlanap invalid wpa'}
"; + } + # only ASCII alowed + if ( !($wlanapsettings{'PWD'} !~ /[^\x00-\x7f]/) ){ + $errormessage .= "$Lang::tr{'wlanap invalid wpa'}
"; + } } if ( $errormessage eq '' ){ - &WriteConfig(); + &General::writehash("/var/ipfire/wlanap/settings", \%wlanapsettings); &WriteConfig_hostapd(); - system("/usr/local/bin/wlanapctrl start >/dev/null 2>&1") if ( $cgiparams{'RUNNING'} eq 'on' ); + system("/usr/local/bin/wlanapctrl restart >/dev/null 2>&1"); + pid(); } -}elsif ( $cgiparams{'ACTION'} eq 'Start' ){ +}elsif ( $wlanapsettings{'ACTION'} eq "$Lang::tr{'wlanap interface'}" ){ + &General::writehash("/var/ipfire/wlanap/settings", \%wlanapsettings); +}elsif ( ($wlanapsettings{'ACTION'} eq "$Lang::tr{'start'}") && ($memory == 0) ){ system("/usr/local/bin/wlanapctrl start >/dev/null 2>&1"); -}elsif ( $cgiparams{'ACTION'} eq 'Stop' ){ + pid(); +}elsif ( $wlanapsettings{'ACTION'} eq "$Lang::tr{'stop'}" ){ system("/usr/local/bin/wlanapctrl stop >/dev/null 2>&1"); + $memory=0; +}elsif ( $wlanapsettings{'ACTION'} eq "$Lang::tr{'restart'}" ){ + system("/usr/local/bin/wlanapctrl restart >/dev/null 2>&1"); + pid(); } -&Header::openpage('WLAN', 1, '', ''); +&Header::openpage('Wireless LAN', 1, '', ''); &Header::openbigbox('100%', 'left', '', $errormessage); -print "
"; if ( $errormessage ){ &Header::openbox('100%', 'center', $Lang::tr{'error messages'}); @@ -145,8 +174,8 @@ if ( $errormessage ){ if ( $debug ){ &Header::openbox('100%', 'center', 'DEBUG'); my $debugCount = 0; - foreach my $line (sort keys %cgiparams) { - print "$line = '$cgiparams{$line}'
\n"; + foreach my $line (sort keys %wlanapsettings) { + print "$line = '$wlanapsettings{$line}'
\n"; $debugCount++; } print " Count: $debugCount\n"; @@ -155,30 +184,54 @@ if ( $debug ){ # DEBUG DEBUG ############### -my $test; - # # Driver and status detection # my $wlan_card_status = 'dummy'; my $wlan_ap_status = ''; -my $wlan_hostapd_status = ''; -my $blue_message = ""; +my $message = ""; + +$selected{'INTERFACE'}{'green0'} = ''; +$selected{'INTERFACE'}{'blue0'} = ''; +$selected{'ENC'}{$wlanapsettings{'INTERFACE'}} = "selected='selected'"; -if ( ($netsettings{'BLUE_DEV'} eq '') || ($netsettings{'BLUE_DRIVER'} eq '') ){ - $blue_message = "No BLUE Interface."; +if ( ($wlanapsettings{'INTERFACE'} eq '') ){ + $message = $Lang::tr{'wlanap select interface'}; + &Header::openbox('100%', 'center', "WLAN AP"); +print < + + +

+
+ +END +; + &Header::closebox(); + &Header::closebigbox(); + &Header::closepage(); + exit; }else{ - my $cmd_out = `/usr/sbin/iwconfig $netsettings{'BLUE_DEV'} 2>/dev/null`; + my $cmd_out = `/usr/sbin/iwconfig $wlanapsettings{'INTERFACE'} 2>/dev/null`; if ( $cmd_out eq '' ){ - $blue_message = "BLUE Interface is not a WLAN card."; + $message = "$Lang::tr{'wlanap no interface'}"; + $wlan_card_status = ''; }else{ - $cmd_out = `/sbin/ifconfig | /bin/grep $netsettings{'BLUE_DEV'}`; + $cmd_out = `/sbin/ifconfig | /bin/grep $wlanapsettings{'INTERFACE'}`; if ( $cmd_out eq '' ){ $wlan_card_status = 'down'; }else{ $wlan_card_status = 'up'; - $cmd_out = `/usr/sbin/iwconfig $netsettings{'BLUE_DEV'} | /bin/grep "Mode:Master"`; + $cmd_out = `/usr/sbin/iwconfig $wlanapsettings{'INTERFACE'} | /bin/grep "Mode:Master"`; if ( $cmd_out ne '' ){ $wlan_ap_status = 'up'; } @@ -186,60 +239,66 @@ if ( ($netsettings{'BLUE_DEV'} eq '') || ($netsettings{'BLUE_DRIVER'} eq '') ){ } } -my $disabled_apmode = "disabled='disabled'"; -$disabled_apmode = '' if ( ($wlanapsettings{'DRIVER'} eq 'MADWIFI') || ($wlanapsettings{'DRIVER'} eq 'HOSTAP') || ($wlanapsettings{'DRIVER'} eq 'ACX100') ); +# Change old "n" to "gn" +if ( $wlanapsettings{'HW_MODE'} eq 'n' ) { + $wlanapsettings{'HW_MODE'}='gn'; +} -my $checked_apmode = ''; -my $checked_hidessid = ''; -$checked_apmode = "checked='checked'" if ( $wlanapsettings{'APMODE'} eq 'on' ); -$checked_hidessid = "checked='checked'" if ( $wlanapsettings{'HIDESSID'} eq 'on' ); +$checked{'HIDESSID'}{'off'} = ''; +$checked{'HIDESSID'}{'on'} = ''; +$checked{'HIDESSID'}{$wlanapsettings{'HIDESSID'}} = "checked='checked'"; -$selected{'ENC'}{'none'} = ''; -$selected{'ENC'}{'wpa'} = ''; $selected{'ENC'}{$wlanapsettings{'ENC'}} = "selected='selected'"; - -$selected{'CHAN'}{$wlanapsettings{'CHAN'}} = "selected='selected'"; +$selected{'CHANNEL'}{$wlanapsettings{'CHANNEL'}} = "selected='selected'"; +$selected{'COUNTRY'}{$wlanapsettings{'COUNTRY'}} = "selected='selected'"; $selected{'TXPOWER'}{$wlanapsettings{'TXPOWER'}} = "selected='selected'"; +$selected{'HW_MODE'}{$wlanapsettings{'HW_MODE'}} = "selected='selected'"; +$selected{'MACMODE'}{$wlanapsettings{'MACMODE'}} = "selected='selected'"; + +my $monwlaninterface = $wlanapsettings{'INTERFACE'}; +if ( -d '/sys/class/net/mon.'.$wlanapsettings{'INTERFACE'} ) { + $monwlaninterface = 'mon.'.$wlanapsettings{'INTERFACE'}; +} -my @channellist = `iwlist $netsettings{'BLUE_DEV'} channel`; +my @channellist_cmd = `iwlist $monwlaninterface channel 2>/dev/null`; # get available channels my @temp; -foreach (@channellist){ +foreach (@channellist_cmd){ $_ =~ /(.*)Channel (\d+)(.*):/; -my $channel = $2;chomp $channel; +$channel = $2;chomp $channel; if ( $channel =~ /\d+/ ){push(@temp,$channel);} } -@channellist = @temp; +my @channellist = @temp; -my @txpower = `iwlist $netsettings{'BLUE_DEV'} txpower`; -# get available channels +my @countrylist_cmd = `regdbdump /usr/lib/crda/regulatory.bin 2>/dev/null`; +# get available country codes my @temp; -foreach (@txpower){ +foreach (@countrylist_cmd){ +$_ =~ /country (.*):/; +$country = $1;chomp $country; +if ( $country =~ /[0,A-Z][0,A-Z]/ ) {push(@temp,$country);} +} +my @countrylist = @temp; + +my @txpower_cmd = `iwlist $monwlaninterface txpower 2>/dev/null`; +if ( $wlanapsettings{'DRIVER'} eq 'NL80211' ){ + # There is a bug with NL80211 only all devices can displayed + @txpower_cmd = `iwlist txpower 2>/dev/null | sed -e "s|unknown transmit-power information.||g"`; +} +# get available power + +my @temp; +foreach (@txpower_cmd){ $_ =~ /(\s)(\d+)(\s)dBm(\s)(.*)(\W)(\d+)(.*)/; -my $tx = $7;chomp $tx; -if ( $tx =~ /\d+/ ){push(@temp,$tx."mW");} +$txpower = $7;chomp $txpower; +if ( $txpower =~ /\d+/ ){push(@temp,$txpower."mW");} } -@txpower = @temp; +my @txpower = @temp; push(@txpower,"auto"); -$selected{'WPA'}{'1'} = ''; -$selected{'WPA'}{'2'} = ''; -$selected{'WPA'}{$wlanapsettings{'WPA'}} = "selected='selected'"; - -$selected{'SYSLOGLEVEL'}{'0'} = ''; -$selected{'SYSLOGLEVEL'}{'1'} = ''; -$selected{'SYSLOGLEVEL'}{'2'} = ''; -$selected{'SYSLOGLEVEL'}{'3'} = ''; -$selected{'SYSLOGLEVEL'}{'4'} = ''; $selected{'SYSLOGLEVEL'}{$wlanapsettings{'SYSLOGLEVEL'}} = "selected='selected'"; - -$selected{'DEBUG'}{'0'} = ''; -$selected{'DEBUG'}{'1'} = ''; -$selected{'DEBUG'}{'2'} = ''; -$selected{'DEBUG'}{'3'} = ''; -$selected{'DEBUG'}{'4'} = ''; $selected{'DEBUG'}{$wlanapsettings{'DEBUG'}} = "selected='selected'"; # @@ -248,111 +307,215 @@ $selected{'DEBUG'}{$wlanapsettings{'DEBUG'}} = "selected='selected'"; &Header::openbox('100%', 'center', "WLAN AP"); print < -WLAN Services END ; + if ( $wlan_card_status ne '' ){ - print "WLAN card ($wlanapsettings{'DRIVER'})"; + print "$Lang::tr{'wlanap wlan services'}"; + print "$Lang::tr{'wlanap wlan card'} ($wlanapsettings{'DRIVER'})"; print $wlan_card_status eq 'up' ? $status_started : $status_stopped; - print "Access Point"; + print "$Lang::tr{'wlanap access point'}"; print $wlan_ap_status eq 'up' ? $status_started : $status_stopped; - if ( $wlan_card_status eq 'up' ){ - print ""; - }else{ - print ""; - } + }else{ - print "$blue_message"; + print "$message"; } + print ""; + +if ( ($memory != 0) && (@pid[0] ne "///") && ($wlan_card_status ne '') ){ + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print "
PID$Lang::tr{'memory'}
hostapd    @pid[0]$memory KB
"; +} + +if ( $wlan_card_status ne '' ){ +print "
"; +print ""; +print ""; +print ""; +print ""; +print ""; +print ""; +print ""; +print ""; +print ""; +print "
 
"; +}else{ +print "
"; +print ""; +print ""; +print ""; +print ""; +print ""; +print ""; +print ""; +print ""; +print ""; +print ""; print "

 
"; +} if ( $wlan_card_status eq '' ){ - print ""; + &Header::closebox(); &Header::closebigbox(); &Header::closepage(); exit 0; } print < +
- -print < - - + + + END ; + +if ( scalar @channellist > 0 ){ + print <" +} else { + print < +END +; +} + print < --> - -"; +} else { + print "" } print < - +
WLAN Settings -END -; -#
Access Point: 
$Lang::tr{'wlanap wlan settings'}
SSID: 
Disable SSID broadcast: 
Encryption:  + +
SSID Broadcast: on | off
HW Mode:  + +
$Lang::tr{'wlanap encryption'}: 
$Lang::tr{'wlanap channel'}:  +
$Lang::tr{'wlanap channel'}:  + +
Select Country: 
Channel:  -
$Lang::tr{'wlanap country'}:  +
Tx Power: 
Tx Power:  END ; -foreach $txpower (@txpower){ - print " dBm"; + +if ( $wlanapsettings{'DRIVER'} eq 'MADWIFI' ){ + print "
Passphrase: 
WPA Version:  - -
HT Caps: 
Loglevel (hostapd):  Debuglevel (hostapd): 
+END +; +if ( $wlanapsettings{'INTERFACE'} =~ /green0/ ){ + print < + + +
Mac Filter:  + +Mac Adress List (one per line)
+END +; +} +print < - - +
- -
+
+
+ +
END ; - -my $status = `cat /proc/net/madwifi/$netsettings{'BLUE_DEV'}/associated_sta`; +if ( $wlanapsettings{'DRIVER'} eq 'MADWIFI' ){ + $status = `wlanconfig $wlanapsettings{'INTERFACE'} list`; +} +if ( $wlanapsettings{'DRIVER'} eq 'NL80211' ){ + $status = `iw dev $wlanapsettings{'INTERFACE'} station dump`; +} print < - - + + + +
WLAN Status
$status
$Lang::tr{'wlanap wlan status'}
@channellist_cmd
@txpower_cmd
$status
+
+ + + +
WLan Clients
 $Lang::tr{'wlanap link wireless'}
 $Lang::tr{'wlanap link dhcp'}
END ; @@ -361,32 +524,55 @@ print ""; &Header::closebigbox(); &Header::closepage(); -sub WriteConfig{ - &General::writehash("/var/ipfire/wlanap/settings", \%wlanapsettings); -} - sub WriteConfig_hostapd{ $wlanapsettings{'DRIVER_HOSTAPD'} = lc($wlanapsettings{'DRIVER'}); open (CONFIGFILE, ">/var/ipfire/wlanap/hostapd.conf"); print CONFIGFILE <; chomp $pid; - close FILE; - if (open(FILE, "/proc/${pid}/status")) - { - while () - { - if (/^Name:\W+(.*)/) - { - $testcmd = $1; - } - } - close FILE; - if ($testcmd =~ /$exename/) - { - $status = "$Lang::tr{'running'}"; - } - } - } - return $status; + open (MACFILE, ">/var/ipfire/wlanap/macfile"); + foreach(@macs){ + $_ =~ s/\r//gi; + chomp($_); + if ( $_ ne "" ){print MACFILE $_;} } + close MACFILE; +}