From: Maniacikarus Date: Sat, 16 Aug 2008 11:24:57 +0000 (+0200) Subject: Further improvements on hostapd and wlan CGI X-Git-Tag: v2.3-beta3~33 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=54359730410b8a3ff27a48401fb76cfc730f2bc1;p=ipfire-2.x.git Further improvements on hostapd and wlan CGI --- diff --git a/html/cgi-bin/wlanap.cgi b/html/cgi-bin/wlanap.cgi index 83270b92b3..1e5da201e4 100755 --- a/html/cgi-bin/wlanap.cgi +++ b/html/cgi-bin/wlanap.cgi @@ -35,8 +35,8 @@ require '/var/ipfire/header.pl'; my $debug = 0; my $i = 0; 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 ); @@ -46,32 +46,26 @@ my %selected=(); my %checked=(); my %color = (); my %mainsettings = (); +my %netsettings=(); +my %wlanapsettings=(); my $channel = ''; my $txpower = ''; &General::readhash("${General::swroot}/main/settings", \%mainsettings); &General::readhash("/srv/web/ipfire/html/themes/".$mainsettings{'THEME'}."/include/colors.txt", \%color); +&General::readhash("/var/ipfire/ethernet/settings", \%netsettings); -my %wlanapsettings=(); $wlanapsettings{'APMODE'} = 'on'; -$wlanapsettings{'BOOTSTART'} = 'on'; +$wlanapsettings{'INTERFACE'} = $netsettings{'BLUE_DEV'}; $wlanapsettings{'SSID'} = 'IPFire'; $wlanapsettings{'HIDESSID'} = 'off'; -$wlanapsettings{'ENC'} = 'wpa'; # none / wep / wpa / wep+wpa -$wlanapsettings{'ANTENNA'} = 'both'; +$wlanapsettings{'ENC'} = 'wpa'; # none / wpa $wlanapsettings{'TXPOWER'} = 'auto'; # $wlanapsettings{'CC'} = '276'; # CountryCode, 276 = Germany -$wlanapsettings{'CHAN'} = '5'; - -$wlanapsettings{'WEPKEY1'} = 'BF715772DADA8A3E7AFFA5C26B'; -$wlanapsettings{'WEPKEY2'} = ''; -$wlanapsettings{'WEPKEY3'} = ''; -$wlanapsettings{'WEPKEY4'} = ''; -$wlanapsettings{'USEDKEY'} = '1'; - +$wlanapsettings{'CHAN'} = '05'; $wlanapsettings{'PWD'} = 'IPFire-2.x'; $wlanapsettings{'PSK'} = '69eb868ed7b3cc36d767b729048c9c585234723d1eafbe66e5a16957b7c85e9c'; -$wlanapsettings{'WPA'} = '3'; +$wlanapsettings{'WPA'} = '1'; $wlanapsettings{'SYSLOGLEVEL'} = '0'; $wlanapsettings{'DEBUG'} = '4'; @@ -80,32 +74,19 @@ $wlanapsettings{'DRIVER'} = 'MADWIFI'; # UNKNOWN / MADWIFI / RT2500 / # WLANMODE= (a/b/g) &General::readhash("/var/ipfire/wlanap/settings", \%wlanapsettings); -my %netsettings=(); -&General::readhash("/var/ipfire/ethernet/settings", \%netsettings); - my %cgiparams=(); $cgiparams{'ACTION'} = ''; $cgiparams{'RUNNING'} = 'off'; $cgiparams{'APMODE'} = 'on'; -$cgiparams{'BOOTSTART'} = 'on'; $cgiparams{'SSID'} = 'IPFire'; $cgiparams{'HIDESSID'} = 'off'; $cgiparams{'ENC'} = 'wpa'; # none / wep / wpa / wep+wpa -$cgiparams{'ANTENNA'} = 'both'; $cgiparams{'TXPOWER'} = 'auto'; -$cgiparams{'CHAN'} = '5'; - -$cgiparams{'WEPKEY1'} = 'BF715772DADA8A3E7AFFA5C26B'; -$cgiparams{'WEPKEY2'} = ''; -$cgiparams{'WEPKEY3'} = ''; -$cgiparams{'WEPKEY4'} = ''; -$cgiparams{'USEDKEY'} = '1'; -$cgiparams{'WEPPWD'} = ''; -$cgiparams{'WEPKEYCALC'} = ''; +$cgiparams{'CHAN'} = '05'; $cgiparams{'PWD'} = 'IPFire-2.x'; $cgiparams{'PSK'} = '69eb868ed7b3cc36d767b729048c9c585234723d1eafbe66e5a16957b7c85e9c'; -$cgiparams{'WPA'} = '3'; +$cgiparams{'WPA'} = '1'; $cgiparams{'SYSLOGLEVEL'} = '0'; $cgiparams{'DEBUG'} = '4'; @@ -116,43 +97,18 @@ $cgiparams{'DEBUG'} = '4'; if ( $cgiparams{'ACTION'} eq "$Lang::tr{'save'}" ){ $wlanapsettings{'APMODE'} = $cgiparams{'APMODE'}; - $wlanapsettings{'BOOTSTART'} = $cgiparams{'BOOTSTART'}; $wlanapsettings{'SSID'} = $cgiparams{'SSID'}; $wlanapsettings{'HIDESSID'} = $cgiparams{'HIDESSID'}; $wlanapsettings{'ENC'} = $cgiparams{'ENC'}; - $wlanapsettings{'ANTENNA'} = $cgiparams{'ANTENNA'}; $wlanapsettings{'CHAN'} = $cgiparams{'CHAN'}; $wlanapsettings{'TXPOWER'} = $cgiparams{'TXPOWER'}; - $wlanapsettings{'WEPKEY1'} = $cgiparams{'WEPKEY1'}; - $wlanapsettings{'WEPKEY2'} = $cgiparams{'WEPKEY2'}; - $wlanapsettings{'WEPKEY3'} = $cgiparams{'WEPKEY3'}; - $wlanapsettings{'WEPKEY4'} = $cgiparams{'WEPKEY4'}; - $wlanapsettings{'USEDKEY'} = $cgiparams{'USEDKEY'}; - $wlanapsettings{'PWD'} = $cgiparams{'PWD'}; $wlanapsettings{'PSK'} = $cgiparams{'PSK'}; $wlanapsettings{'WPA'} = $cgiparams{'WPA'}; $wlanapsettings{'SYSLOGLEVEL'}= $cgiparams{'SYSLOGLEVEL'}; $wlanapsettings{'DEBUG'} = $cgiparams{'DEBUG'}; - # verify WEP keys, allowed characters are 0..9A..F, length must be 10 or 26 characters - for $i ( 1 .. 4 ){ - my $wepkey = $wlanapsettings{"WEPKEY${i}"}; - next if ( $wepkey eq '' ); - if ( (length($wepkey) != 10) && (length($wepkey) != 26) ){ - $errormessage .= "Invalid length in WEP Key $i. Key must be 10 or 26 characters.
"; - next; - } - - if ( $wepkey !~ /[0-9A-Fa-f]$/ ){ - $errormessage .= "Invalid character in WEP Key $i. Only A..F and 0..9 allowed.
"; - next; - } - - $wlanapsettings{"WEPKEY${i}"} = uc($wepkey); - } - # 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.
"; @@ -168,15 +124,6 @@ if ( $cgiparams{'ACTION'} eq "$Lang::tr{'save'}" ){ system("/usr/local/bin/wlanapctrl start >/dev/null 2>&1"); }elsif ( $cgiparams{'ACTION'} eq 'Stop' ){ system("/usr/local/bin/wlanapctrl stop >/dev/null 2>&1"); -}elsif ( $cgiparams{'ACTION'} eq 'Calc WEP Key' ){ - $cgiparams{'WEPKEYCALC'} = ''; - $errormessage = "Invalid length in WEP Passphrase. Must be exactly 13 characters.
" if ( length($cgiparams{'WEPPWD'}) != 13 ); - - if ( $errormessage eq '' ){ - $cgiparams{'WEPKEYCALC'} = uc(&WEPKeyCalc($cgiparams{'WEPPWD'})); - } -}elsif ( $cgiparams{'ACTION'} eq 'Random WEP Key' ){ - $cgiparams{'WEPKEYCALC'} = &WEPKeyRandom(); } &Header::openpage('WLAN', 1, '', ''); @@ -184,7 +131,7 @@ if ( $cgiparams{'ACTION'} eq "$Lang::tr{'save'}" ){ print "
"; if ( $errormessage ){ - &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); + &Header::openbox('100%', 'center', $Lang::tr{'error messages'}); print "$errormessage\n"; print " \n"; &Header::closebox(); @@ -196,7 +143,7 @@ if ( $errormessage ){ ############### # DEBUG DEBUG if ( $debug ){ - &Header::openbox('100%', 'left', 'DEBUG'); + &Header::openbox('100%', 'center', 'DEBUG'); my $debugCount = 0; foreach my $line (sort keys %cgiparams) { print "$line = '$cgiparams{$line}'
\n"; @@ -208,6 +155,8 @@ if ( $debug ){ # DEBUG DEBUG ############### +my $test; + # # Driver and status detection # @@ -232,9 +181,6 @@ if ( ($netsettings{'BLUE_DEV'} eq '') || ($netsettings{'BLUE_DRIVER'} eq '') ){ $cmd_out = `/usr/sbin/iwconfig $netsettings{'BLUE_DEV'} | /bin/grep "Mode:Master"`; if ( $cmd_out ne '' ){ $wlan_ap_status = 'up'; - if ( -e "/var/run/hostapd.pid" ){ - $wlan_hostapd_status = 'up'; - } } } } @@ -244,64 +190,42 @@ my $disabled_apmode = "disabled='disabled'"; $disabled_apmode = '' if ( ($wlanapsettings{'DRIVER'} eq 'MADWIFI') || ($wlanapsettings{'DRIVER'} eq 'HOSTAP') || ($wlanapsettings{'DRIVER'} eq 'ACX100') ); my $checked_apmode = ''; -my $checked_bootstart = ''; my $checked_hidessid = ''; $checked_apmode = "checked='checked'" if ( $wlanapsettings{'APMODE'} eq 'on' ); -$checked_bootstart = "checked='checked'" if ( $wlanapsettings{'BOOTSTART'} eq 'on' ); $checked_hidessid = "checked='checked'" if ( $wlanapsettings{'HIDESSID'} eq 'on' ); $selected{'ENC'}{'none'} = ''; -$selected{'ENC'}{'wep'} = ''; $selected{'ENC'}{'wpa'} = ''; -$selected{'ENC'}{'wep+wpa'} = ''; $selected{'ENC'}{$wlanapsettings{'ENC'}} = "selected='selected'"; -$selected{'ANTENNA'}{'both'} = ''; -$selected{'ANTENNA'}{'1'} = ''; -$selected{'ANTENNA'}{'2'} = ''; -$selected{'ANTENNA'}{$wlanapsettings{'ANTENNA'}} = "selected='selected'"; +$selected{'CHAN'}{$wlanapsettings{'CHAN'}} = "selected='selected'"; +$selected{'TXPOWER'}{$wlanapsettings{'TXPOWER'}} = "selected='selected'"; -my @channellist; +my @channellist = `iwlist $netsettings{'BLUE_DEV'} channel`; # get available channels -if ( -e "/var/ipfire/wlanap/channels" ){ - open(CHANNELFILE, "/var/ipfire/wlanap/channels"); - @channellist=; - close CHANNELFILE; - foreach $channel (@channellist){ - chomp($channel); - $selected{'CHAN'}{$channel} = ''; - } - $selected{'CHAN'}{$wlanapsettings{'CHAN'}} = 'selected="selected"'; -}else{ - $channellist[0] = '1'; - $selected{'CHAN'}{'1'} = 'selected="selected"'; -} -my @txpowerlist; -# get available txpowers -if ( -e "/var/ipfire/wlanap/txpower" ){ - open(CHANNELFILE, "/var/ipfire/wlanap/txpower"); - @txpowerlist=; - close CHANNELFILE; - foreach $txpower (@txpowerlist){ - chomp($txpower); - $selected{'TXPOWER'}{$txpower} = ''; - } - $selected{'TXPOWER'}{$wlanapsettings{'TXPOWER'}} = 'selected="selected"'; -}else{ - $txpowerlist[0] = 'auto'; - $selected{'TXPOWER'}{'auto'} = 'selected="selected"'; +my @temp; +foreach (@channellist){ +$_ =~ /(.*)Channel (\d+)(.*):/; +my $channel = $2;chomp $channel; +if ( $channel =~ /\d+/ ){push(@temp,$channel);} } +@channellist = @temp; + +my @txpower = `iwlist $netsettings{'BLUE_DEV'} txpower`; +# get available channels -$selected{'USEDKEY'}{'1'} = ''; -$selected{'USEDKEY'}{'2'} = ''; -$selected{'USEDKEY'}{'3'} = ''; -$selected{'USEDKEY'}{'4'} = ''; -$selected{'USEDKEY'}{$wlanapsettings{'USEDKEY'}} = "selected='selected'"; +my @temp; +foreach (@txpower){ +$_ =~ /(\s)(\d+)(\s)dBm(\s)(.*)(\W)(\d+)(.*)/; +my $tx = $7;chomp $tx; +if ( $tx =~ /\d+/ ){push(@temp,$tx."mW");} +} +@txpower = @temp; +push(@txpower,"auto"); $selected{'WPA'}{'1'} = ''; $selected{'WPA'}{'2'} = ''; -$selected{'WPA'}{'3'} = ''; $selected{'WPA'}{$wlanapsettings{'WPA'}} = "selected='selected'"; $selected{'SYSLOGLEVEL'}{'0'} = ''; @@ -321,44 +245,26 @@ $selected{'DEBUG'}{$wlanapsettings{'DEBUG'}} = "selected='selected'"; # # Status box # -&Header::openbox('100%', 'left', "WLAN Status"); +&Header::openbox('100%', 'center', "WLAN AP"); print < + + END ; if ( $wlan_card_status ne '' ){ - print ""; + print ""; print $wlan_card_status eq 'up' ? $status_started : $status_stopped; - print ""; - print ""; + print ""; print $wlan_ap_status eq 'up' ? $status_started : $status_stopped; - print ""; - print ""; - print $wlan_hostapd_status eq 'up' ? $status_started : $status_stopped; - print ""; - print ""; - print ""; if ( $wlan_card_status eq 'up' ){ - print ""; + print ""; }else{ - print ""; + print ""; } - print ""; - print ""; }else{ - print ""; + print ""; } -print <
-END -; -&Header::closebox(); +print "
WLAN Services
WLAN card ($wlanapsettings{'DRIVER'})
WLAN card ($wlanapsettings{'DRIVER'}) 
Access Point
Access Point 
Hostapd 
  
 
$blue_message "; - if ( $netsettings{'CONFIG_TYPE'} & 0x04 ){ - print "" - }else{ - print " 
Use setup on IPCop Console first to configure a (dummy) BLUE interface." - } - print "  
$blue_message
"; if ( $wlan_card_status eq '' ){ print ""; @@ -366,32 +272,25 @@ if ( $wlan_card_status eq '' ){ &Header::closepage(); exit 0; } - -# -# WLAN settings -# -&Header::openbox('100%', 'left', "WLAN Settings"); print < -Access Point:  +
+ + +print < - - +END +; +print < --> -
WLAN Settings +END +; +#
Access Point: 
SSID: 
Autostart after Boot: 
Disable SSID broadcast: 
Encryption:  -
Use Antenna:  -
Select Country: 
Channel: 
Tx Power: 
-
- - - - -
 
-END -; -&Header::closebox(); - - -# -# WEP -# -&Header::openbox('100%', 'left', "WEP Configuration"); -print < -Key 1:  -Key 2: *  -Key 3: *  -Key 4: *  -WEP Key to Use:  - - - -
- - -
Passphrase: 
WEP Key: 
-
- - - - -
* $Lang::tr{'this field may be blank'}
-END -; -&Header::closebox(); - - -# -# WPA -# -&Header::openbox('100%', 'left', "WPA Configuration"); -print < Passphrase:  WPA Version:  Loglevel (hostapd):  @@ -481,47 +328,39 @@ print < Debuglevel (hostapd):  -
- - - +
+
 
+
+ +
END ; -&Header::closebox(); + +my $status = `cat /proc/net/madwifi/$netsettings{'BLUE_DEV'}/associated_sta`; +print < + + + +
WLAN Status
$status
+END +; +&Header::closebox(); print ""; &Header::closebigbox(); &Header::closepage(); -sub WEPKeyRandom{ - my $length = 26; # 10 is also allowed - my $string = "0123456789ABCDEF"; - my @chars = split(//,$string); - my $n = @chars; - my $index; - my $key = ''; - for ( $i = 0; $i < $length; $i++){ - $index = int(rand $n); - $key = $key . $chars[$index]; - } - return $key; -} - -sub WEPKeyCalc{ - require Digest::MD5; - return substr Digest::MD5::md5_hex( substr( shift() x 64, 0, 64 ) ), 0, 26; -} - sub WriteConfig{ &General::writehash("/var/ipfire/wlanap/settings", \%wlanapsettings); } @@ -531,30 +370,85 @@ sub WriteConfig_hostapd{ 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; + } diff --git a/src/initscripts/init.d/hostapd b/src/initscripts/init.d/hostapd index 2d228b3037..5fdb7057b2 100644 --- a/src/initscripts/init.d/hostapd +++ b/src/initscripts/init.d/hostapd @@ -2,6 +2,11 @@ . /etc/sysconfig/rc . ${rc_functions} +CHANNEL="05" +TXPOWER="auto" +INTERFACE="blue0" +eval $(/usr/local/bin/readhash /var/ipfire/wlanpap/settings) + case "${1}" in start) boot_mesg "Starting hostapd... " @@ -10,18 +15,19 @@ case "${1}" in sed -i -e "s|#LoadPlugin wireless|LoadPlugin wireless|g" /etc/collectd.conf # Set Atheros Card to master mode - /usr/bin/wlanconfig blue0 destroy > /dev/null - /usr/bin/wlanconfig blue0 create wlandev wifi0 wlanmode ap > /dev/null + /usr/bin/wlanconfig $INTERFACE destroy > /dev/null + /usr/bin/wlanconfig $INTERFACE create wlandev wifi0 wlanmode ap > /dev/null # Set other cards to master mode #/usr/sbin/iwconfig blue0 mode master - if [ "$(/usr/sbin/iwconfig blue0 | /bin/grep "Mode:Master")" == "" ]; then + if [ "$(/usr/sbin/iwconfig $INTERFACE | /bin/grep "Mode:Master")" == "" ]; then boot_mesg "Error! Can't set wlan master mode" echo_failure; exit 1; else - /usr/sbin/iwconfig blue0 channel 05 + /usr/sbin/iwconfig $INTERFACE channel $CHANNEL + /usr/sbin/iwconfig $INTERFACE channel $TXPOWER /usr/bin/hostapd -P /var/run/hostapd /etc/hostapd.conf /dev/tty12 2>&1 & evaluate_retval fi @@ -31,8 +37,72 @@ case "${1}" in boot_mesg "Stopping hostapd..." # Set Atheros Card to Managed mode - /usr/bin/wlanconfig blue0 destroy > /dev/null - /usr/bin/wlanconfig blue0 create wlandev wifi0 wlanmode sta > /dev/null + /usr/bin/wlanconfig $INTERFACE destroy > /dev/null + /usr/bin/wlanconfig #!/bin/sh +. /etc/sysconfig/rc +. ${rc_functions} + +CHANNEL="05" +TXPOWER="auto" +INTERFACE="blue0" +eval $(/usr/local/bin/readhash /var/ipfire/wlanpap/settings) + +case "${1}" in + start) + boot_mesg "Starting hostapd... " + mkdir -p /var/run/hostapd + # enable wlan module of collectd + sed -i -e "s|#LoadPlugin wireless|LoadPlugin wireless|g" /etc/collectd.conf + + # Set Atheros Card to master mode + /usr/bin/wlanconfig $INTERFACE destroy > /dev/null + /usr/bin/wlanconfig $INTERFACE create wlandev wifi0 wlanmode ap > /dev/null + + # Set other cards to master mode + #/usr/sbin/iwconfig blue0 mode master + + if [ "$(/usr/sbin/iwconfig $INTERFACE | /bin/grep "Mode:Master")" == "" ]; then + boot_mesg "Error! Can't set wlan master mode" + echo_failure; + exit 1; + else + /usr/sbin/iwconfig $INTERFACE channel $CHANNEL + /usr/sbin/iwconfig $INTERFACE channel $TXPOWER + /usr/bin/hostapd -P /var/run/hostapd /etc/hostapd.conf /dev/tty12 2>&1 & + evaluate_retval + fi + ;; + + stop) + boot_mesg "Stopping hostapd..." + + # Set Atheros Card to Managed mode + /usr/bin/wlanconfig $INTERFACE destroy > /dev/null + /usr/bin/wlanconfig $INTERFACE create wlandev wifi0 wlanmode sta > /dev/null + + # Set other cards to master mode + #/usr/sbin/iwconfig blue0 mode Managed + + killproc /usr/bin/hostapd + evaluate_retval + ;; + + restart) + ${0} stop + sleep 1 + ${0} start + ;; + + status) + statusproc /usr/bin/hostapd + ;; + + *) + echo "Usage: ${0} {start|stop|restart|status}" + exit 1 + ;; +esac + create wlandev wifi0 wlanmode sta > /dev/null # Set other cards to master mode #/usr/sbin/iwconfig blue0 mode Managed