From: Arne Fitzenreiter Date: Sat, 6 Jul 2013 09:50:01 +0000 (+0200) Subject: Merge remote-tracking branch 'stevee/wlan-client' into next X-Git-Url: http://git.ipfire.org/?p=people%2Fteissler%2Fipfire-2.x.git;a=commitdiff_plain;h=57097305a610383d013c87ef32ae117c18846e46;hp=b63dc827f21fa617246ec0aa1d8a690f46b4f58e Merge remote-tracking branch 'stevee/wlan-client' into next Conflicts: config/cfgroot/general-functions.pl --- diff --git a/config/cfgroot/general-functions.pl b/config/cfgroot/general-functions.pl index 90eacbdb0..3cdb36fbd 100644 --- a/config/cfgroot/general-functions.pl +++ b/config/cfgroot/general-functions.pl @@ -1008,4 +1008,26 @@ sub MakeUserAgent() { return $user_agent; } +sub RedIsWireless() { + # This function checks if a network device is a wireless device. + + my %settings = (); + &readhash("${General::swroot}/ethernet/settings", \%settings); + + # Find the name of the network device. + my $device = $settings{'RED_DEV'}; + + # Exit, if no device is configured. + return 0 if ($device eq ""); + + # Return 1 if the device is a wireless one. + my $path = "/sys/class/net/$device/wireless"; + if (-d $path) { + return 1; + } + + # Otherwise return zero. + return 0; +} + 1; diff --git a/config/cfgroot/header.pl b/config/cfgroot/header.pl index 0f10bf9f8..a7f209d9c 100644 --- a/config/cfgroot/header.pl +++ b/config/cfgroot/header.pl @@ -157,6 +157,10 @@ sub genmenu { if ( $ethsettings{'CONFIG_TYPE'} =~ /^(1|2|3|4)$/ && $ethsettings{'RED_TYPE'} eq 'STATIC' ) { $menu->{'03.network'}{'subMenu'}->{'70.aliases'}{'enabled'} = 1; } + + if (&General::RedIsWireless()) { + $menu->{'01.system'}{'subMenu'}->{'21.wlan'}{'enabled'} = 1; + } } sub showhttpheaders diff --git a/config/menu/10-system.menu b/config/menu/10-system.menu index 9248663bd..b56a1ec04 100644 --- a/config/menu/10-system.menu +++ b/config/menu/10-system.menu @@ -10,6 +10,12 @@ 'title' => "$Lang::tr{'alt dialup'}", 'enabled' => 1, }; + $subsystem->{'21.wlan'} = { + 'caption' => $Lang::tr{'wlan client'}, + 'uri' => '/cgi-bin/wirelessclient.cgi', + 'title' => "$Lang::tr{'wlan client'}", + 'enabled' => 0, + }; $subsystem->{'30.ssh'} = { 'caption' => $Lang::tr{'ssh access'}, 'uri' => '/cgi-bin/remote.cgi', diff --git a/config/rootfiles/common/armv5tel/initscripts b/config/rootfiles/common/armv5tel/initscripts index a4fa8a76e..17bbdb776 100644 --- a/config/rootfiles/common/armv5tel/initscripts +++ b/config/rootfiles/common/armv5tel/initscripts @@ -132,6 +132,7 @@ etc/rc.d/init.d/upnpd #etc/rc.d/init.d/vsftpd #etc/rc.d/init.d/watchdog #etc/rc.d/init.d/winbind +etc/rc.d/init.d/wlanclient #etc/rc.d/init.d/xinetd #etc/rc.d/rc0.d #etc/rc.d/rc0.d/K01imspetor diff --git a/config/rootfiles/common/i586/initscripts b/config/rootfiles/common/i586/initscripts index 606f8ea8e..55cee863d 100644 --- a/config/rootfiles/common/i586/initscripts +++ b/config/rootfiles/common/i586/initscripts @@ -66,6 +66,7 @@ etc/rc.d/init.d/network-vlans etc/rc.d/init.d/networking/any etc/rc.d/init.d/networking/blue etc/rc.d/init.d/networking/dhcpcd.exe +etc/rc.d/init.d/networking/functions.network etc/rc.d/init.d/networking/green etc/rc.d/init.d/networking/orange etc/rc.d/init.d/networking/red @@ -96,6 +97,7 @@ etc/rc.d/init.d/networking/red.up/98-leds etc/rc.d/init.d/networking/red.up/99-U-dialctrl.pl etc/rc.d/init.d/networking/red.up/99-fireinfo etc/rc.d/init.d/networking/red.up/99-pakfire-update +etc/rc.d/init.d/networking/wpa_supplicant.exe #etc/rc.d/init.d/nfs-server etc/rc.d/init.d/ntp #etc/rc.d/init.d/nut @@ -135,6 +137,7 @@ etc/rc.d/init.d/upnpd #etc/rc.d/init.d/vsftpd #etc/rc.d/init.d/watchdog #etc/rc.d/init.d/winbind +etc/rc.d/init.d/wlanclient #etc/rc.d/init.d/xinetd #etc/rc.d/rc0.d #etc/rc.d/rc0.d/K01imspetor @@ -152,6 +155,7 @@ etc/rc.d/rc0.d/K49cyrus-sasl etc/rc.d/rc0.d/K78snort etc/rc.d/rc0.d/K79leds etc/rc.d/rc0.d/K80network +etc/rc.d/rc0.d/K82wlanclient #etc/rc.d/rc0.d/K84bluetooth #etc/rc.d/rc0.d/K85messagebus etc/rc.d/rc0.d/K85tmpfs @@ -170,6 +174,7 @@ etc/rc.d/rc3.d/S12acpid #etc/rc.d/rc3.d/S16bluetooth #etc/rc.d/rc3.d/S18cpufreq etc/rc.d/rc3.d/S19smartenabler +etc/rc.d/rc3.d/S19wlanclient etc/rc.d/rc3.d/S20network etc/rc.d/rc3.d/S21leds etc/rc.d/rc3.d/S24cyrus-sasl @@ -200,6 +205,7 @@ etc/rc.d/rc6.d/K49cyrus-sasl etc/rc.d/rc6.d/K78snort etc/rc.d/rc6.d/K79leds etc/rc.d/rc6.d/K80network +etc/rc.d/rc6.d/K82wlanclient #etc/rc.d/rc6.d/K84bluetooth #etc/rc.d/rc6.d/K85messagebus etc/rc.d/rc6.d/K85tmpfs diff --git a/config/rootfiles/common/misc-progs b/config/rootfiles/common/misc-progs index d2cf7102c..3f48f8376 100644 --- a/config/rootfiles/common/misc-progs +++ b/config/rootfiles/common/misc-progs @@ -35,5 +35,6 @@ usr/local/bin/timectrl usr/local/bin/updxlratorctrl usr/local/bin/upnpctrl usr/local/bin/urlfilterctrl +usr/local/bin/wirelessclient usr/local/bin/wirelessctrl #usr/local/bin/wlanapctrl diff --git a/doc/language_issues.de b/doc/language_issues.de index de0c4d30c..6c4a5d8b7 100644 --- a/doc/language_issues.de +++ b/doc/language_issues.de @@ -429,7 +429,6 @@ WARNING: translation string unused: transparent on WARNING: translation string unused: umount WARNING: translation string unused: umount removable media before to unplug WARNING: translation string unused: unencrypted -WARNING: translation string unused: unknown WARNING: translation string unused: update transcript WARNING: translation string unused: updates WARNING: translation string unused: updates is old1 diff --git a/doc/language_issues.en b/doc/language_issues.en index d7a7d72ac..8f530a3f3 100644 --- a/doc/language_issues.en +++ b/doc/language_issues.en @@ -460,7 +460,6 @@ WARNING: translation string unused: transparent on WARNING: translation string unused: umount WARNING: translation string unused: umount removable media before to unplug WARNING: translation string unused: unencrypted -WARNING: translation string unused: unknown WARNING: translation string unused: update transcript WARNING: translation string unused: updates WARNING: translation string unused: updates is old1 diff --git a/doc/language_issues.es b/doc/language_issues.es index 0dea29c18..266361c35 100644 --- a/doc/language_issues.es +++ b/doc/language_issues.es @@ -456,7 +456,6 @@ WARNING: translation string unused: transparent on WARNING: translation string unused: umount WARNING: translation string unused: umount removable media before to unplug WARNING: translation string unused: unencrypted -WARNING: translation string unused: unknown WARNING: translation string unused: update transcript WARNING: translation string unused: updates WARNING: translation string unused: updates is old1 @@ -488,7 +487,10 @@ WARNING: translation string unused: use dov WARNING: translation string unused: use ibod WARNING: translation string unused: view log WARNING: translation string unused: vpn aggrmode +<<<<<<< HEAD WARNING: translation string unused: vpn incompatible use of defaultroute +======= +>>>>>>> 1b23ab3... Implement wireless client on RED. WARNING: translation string unused: vpn mtu invalid WARNING: translation string unused: vpn on blue WARNING: translation string unused: vpn on green @@ -621,4 +623,34 @@ WARNING: untranslated string: system information WARNING: untranslated string: uptime load average WARNING: untranslated string: visit us at WARNING: untranslated string: vpn keyexchange +WARNING: untranslated string: wlan client +WARNING: untranslated string: wlan client advanced settings +WARNING: untranslated string: wlan client and +WARNING: untranslated string: wlan client bssid +WARNING: untranslated string: wlan client ccmp +WARNING: untranslated string: wlan client configuration +WARNING: untranslated string: wlan client disconnected +WARNING: untranslated string: wlan client duplicate ssid +WARNING: untranslated string: wlan client edit entry +WARNING: untranslated string: wlan client encryption +WARNING: untranslated string: wlan client encryption none +WARNING: untranslated string: wlan client encryption wep +WARNING: untranslated string: wlan client encryption wpa +WARNING: untranslated string: wlan client encryption wpa2 +WARNING: untranslated string: wlan client group cipher +WARNING: untranslated string: wlan client group key algorithm +WARNING: untranslated string: wlan client invalid key length +WARNING: untranslated string: wlan client new entry +WARNING: untranslated string: wlan client new network +WARNING: untranslated string: wlan client pairwise cipher +WARNING: untranslated string: wlan client pairwise key algorithm +WARNING: untranslated string: wlan client pairwise key group key +WARNING: untranslated string: wlan client psk +WARNING: untranslated string: wlan client ssid +WARNING: untranslated string: wlan client tkip +WARNING: untranslated string: wlan client wpa mode +WARNING: untranslated string: wlan client wpa mode all +WARNING: untranslated string: wlan client wpa mode ccmp ccmp +WARNING: untranslated string: wlan client wpa mode ccmp tkip +WARNING: untranslated string: wlan client wpa mode tkip tkip WARNING: untranslated string: wlanap country diff --git a/doc/language_issues.fr b/doc/language_issues.fr index bec722394..f4f113154 100644 --- a/doc/language_issues.fr +++ b/doc/language_issues.fr @@ -455,7 +455,6 @@ WARNING: translation string unused: transparent on WARNING: translation string unused: umount WARNING: translation string unused: umount removable media before to unplug WARNING: translation string unused: unencrypted -WARNING: translation string unused: unknown WARNING: translation string unused: update transcript WARNING: translation string unused: updates WARNING: translation string unused: updates is old1 @@ -609,6 +608,36 @@ WARNING: untranslated string: urlfilter file ext block WARNING: untranslated string: urlfilter mode block WARNING: untranslated string: visit us at WARNING: untranslated string: vpn keyexchange +WARNING: untranslated string: wlan client +WARNING: untranslated string: wlan client advanced settings +WARNING: untranslated string: wlan client and +WARNING: untranslated string: wlan client bssid +WARNING: untranslated string: wlan client ccmp +WARNING: untranslated string: wlan client configuration +WARNING: untranslated string: wlan client disconnected +WARNING: untranslated string: wlan client duplicate ssid +WARNING: untranslated string: wlan client edit entry +WARNING: untranslated string: wlan client encryption +WARNING: untranslated string: wlan client encryption none +WARNING: untranslated string: wlan client encryption wep +WARNING: untranslated string: wlan client encryption wpa +WARNING: untranslated string: wlan client encryption wpa2 +WARNING: untranslated string: wlan client group cipher +WARNING: untranslated string: wlan client group key algorithm +WARNING: untranslated string: wlan client invalid key length +WARNING: untranslated string: wlan client new entry +WARNING: untranslated string: wlan client new network +WARNING: untranslated string: wlan client pairwise cipher +WARNING: untranslated string: wlan client pairwise key algorithm +WARNING: untranslated string: wlan client pairwise key group key +WARNING: untranslated string: wlan client psk +WARNING: untranslated string: wlan client ssid +WARNING: untranslated string: wlan client tkip +WARNING: untranslated string: wlan client wpa mode +WARNING: untranslated string: wlan client wpa mode all +WARNING: untranslated string: wlan client wpa mode ccmp ccmp +WARNING: untranslated string: wlan client wpa mode ccmp tkip +WARNING: untranslated string: wlan client wpa mode tkip tkip WARNING: untranslated string: wlanap access point WARNING: untranslated string: wlanap channel WARNING: untranslated string: wlanap country diff --git a/doc/language_issues.pl b/doc/language_issues.pl index 0dea29c18..266361c35 100644 --- a/doc/language_issues.pl +++ b/doc/language_issues.pl @@ -456,7 +456,6 @@ WARNING: translation string unused: transparent on WARNING: translation string unused: umount WARNING: translation string unused: umount removable media before to unplug WARNING: translation string unused: unencrypted -WARNING: translation string unused: unknown WARNING: translation string unused: update transcript WARNING: translation string unused: updates WARNING: translation string unused: updates is old1 @@ -488,7 +487,10 @@ WARNING: translation string unused: use dov WARNING: translation string unused: use ibod WARNING: translation string unused: view log WARNING: translation string unused: vpn aggrmode +<<<<<<< HEAD WARNING: translation string unused: vpn incompatible use of defaultroute +======= +>>>>>>> 1b23ab3... Implement wireless client on RED. WARNING: translation string unused: vpn mtu invalid WARNING: translation string unused: vpn on blue WARNING: translation string unused: vpn on green @@ -621,4 +623,34 @@ WARNING: untranslated string: system information WARNING: untranslated string: uptime load average WARNING: untranslated string: visit us at WARNING: untranslated string: vpn keyexchange +WARNING: untranslated string: wlan client +WARNING: untranslated string: wlan client advanced settings +WARNING: untranslated string: wlan client and +WARNING: untranslated string: wlan client bssid +WARNING: untranslated string: wlan client ccmp +WARNING: untranslated string: wlan client configuration +WARNING: untranslated string: wlan client disconnected +WARNING: untranslated string: wlan client duplicate ssid +WARNING: untranslated string: wlan client edit entry +WARNING: untranslated string: wlan client encryption +WARNING: untranslated string: wlan client encryption none +WARNING: untranslated string: wlan client encryption wep +WARNING: untranslated string: wlan client encryption wpa +WARNING: untranslated string: wlan client encryption wpa2 +WARNING: untranslated string: wlan client group cipher +WARNING: untranslated string: wlan client group key algorithm +WARNING: untranslated string: wlan client invalid key length +WARNING: untranslated string: wlan client new entry +WARNING: untranslated string: wlan client new network +WARNING: untranslated string: wlan client pairwise cipher +WARNING: untranslated string: wlan client pairwise key algorithm +WARNING: untranslated string: wlan client pairwise key group key +WARNING: untranslated string: wlan client psk +WARNING: untranslated string: wlan client ssid +WARNING: untranslated string: wlan client tkip +WARNING: untranslated string: wlan client wpa mode +WARNING: untranslated string: wlan client wpa mode all +WARNING: untranslated string: wlan client wpa mode ccmp ccmp +WARNING: untranslated string: wlan client wpa mode ccmp tkip +WARNING: untranslated string: wlan client wpa mode tkip tkip WARNING: untranslated string: wlanap country diff --git a/doc/language_issues.ru b/doc/language_issues.ru index b513b59f2..aa8e3edc5 100644 --- a/doc/language_issues.ru +++ b/doc/language_issues.ru @@ -449,7 +449,6 @@ WARNING: translation string unused: transparent on WARNING: translation string unused: umount WARNING: translation string unused: umount removable media before to unplug WARNING: translation string unused: unencrypted -WARNING: translation string unused: unknown WARNING: translation string unused: update transcript WARNING: translation string unused: updates WARNING: translation string unused: updates is old1 @@ -481,7 +480,10 @@ WARNING: translation string unused: use dov WARNING: translation string unused: use ibod WARNING: translation string unused: view log WARNING: translation string unused: vpn aggrmode +<<<<<<< HEAD WARNING: translation string unused: vpn incompatible use of defaultroute +======= +>>>>>>> 1b23ab3... Implement wireless client on RED. WARNING: translation string unused: vpn mtu invalid WARNING: translation string unused: vpn on blue WARNING: translation string unused: vpn on green @@ -585,4 +587,34 @@ WARNING: untranslated string: static routes WARNING: untranslated string: uptime load average WARNING: untranslated string: visit us at WARNING: untranslated string: vpn keyexchange +WARNING: untranslated string: wlan client +WARNING: untranslated string: wlan client advanced settings +WARNING: untranslated string: wlan client and +WARNING: untranslated string: wlan client bssid +WARNING: untranslated string: wlan client ccmp +WARNING: untranslated string: wlan client configuration +WARNING: untranslated string: wlan client disconnected +WARNING: untranslated string: wlan client duplicate ssid +WARNING: untranslated string: wlan client edit entry +WARNING: untranslated string: wlan client encryption +WARNING: untranslated string: wlan client encryption none +WARNING: untranslated string: wlan client encryption wep +WARNING: untranslated string: wlan client encryption wpa +WARNING: untranslated string: wlan client encryption wpa2 +WARNING: untranslated string: wlan client group cipher +WARNING: untranslated string: wlan client group key algorithm +WARNING: untranslated string: wlan client invalid key length +WARNING: untranslated string: wlan client new entry +WARNING: untranslated string: wlan client new network +WARNING: untranslated string: wlan client pairwise cipher +WARNING: untranslated string: wlan client pairwise key algorithm +WARNING: untranslated string: wlan client pairwise key group key +WARNING: untranslated string: wlan client psk +WARNING: untranslated string: wlan client ssid +WARNING: untranslated string: wlan client tkip +WARNING: untranslated string: wlan client wpa mode +WARNING: untranslated string: wlan client wpa mode all +WARNING: untranslated string: wlan client wpa mode ccmp ccmp +WARNING: untranslated string: wlan client wpa mode ccmp tkip +WARNING: untranslated string: wlan client wpa mode tkip tkip WARNING: untranslated string: wlanap country diff --git a/doc/language_missings b/doc/language_missings index 85e59ab73..b78b367b0 100644 --- a/doc/language_missings +++ b/doc/language_missings @@ -120,6 +120,7 @@ < vpn keyexchange < wlanap access point < wlanap channel +< wlanap country < wlanap debugging < wlanap del interface < wlanap encryption @@ -138,6 +139,36 @@ < wlanap wlan services < wlanap wlan settings < wlanap wlan status +< wlan client +< wlan client advanced settings +< wlan client and +< wlan client bssid +< wlan client ccmp +< wlan client configuration +< wlan client disconnected +< wlan client duplicate ssid +< wlan client edit entry +< wlan client encryption +< wlan client encryption none +< wlan client encryption wep +< wlan client encryption wpa +< wlan client encryption wpa2 +< wlan client group cipher +< wlan client group key algorithm +< wlan client invalid key length +< wlan client new entry +< wlan client new network +< wlan client pairwise cipher +< wlan client pairwise key algorithm +< wlan client pairwise key group key +< wlan client psk +< wlan client ssid +< wlan client tkip +< wlan client wpa mode +< wlan client wpa mode all +< wlan client wpa mode ccmp ccmp +< wlan client wpa mode ccmp tkip +< wlan client wpa mode tkip tkip ############################################################################ # Checking install/setup translations for language: es # ############################################################################ @@ -264,6 +295,37 @@ < uptime load average < visit us at < vpn keyexchange +< wlanap country +< wlan client +< wlan client advanced settings +< wlan client and +< wlan client bssid +< wlan client ccmp +< wlan client configuration +< wlan client disconnected +< wlan client duplicate ssid +< wlan client edit entry +< wlan client encryption +< wlan client encryption none +< wlan client encryption wep +< wlan client encryption wpa +< wlan client encryption wpa2 +< wlan client group cipher +< wlan client group key algorithm +< wlan client invalid key length +< wlan client new entry +< wlan client new network +< wlan client pairwise cipher +< wlan client pairwise key algorithm +< wlan client pairwise key group key +< wlan client psk +< wlan client ssid +< wlan client tkip +< wlan client wpa mode +< wlan client wpa mode all +< wlan client wpa mode ccmp ccmp +< wlan client wpa mode ccmp tkip +< wlan client wpa mode tkip tkip ############################################################################ # Checking install/setup translations for language: pl # ############################################################################ @@ -365,6 +427,37 @@ < uptime load average < visit us at < vpn keyexchange +< wlanap country +< wlan client +< wlan client advanced settings +< wlan client and +< wlan client bssid +< wlan client ccmp +< wlan client configuration +< wlan client disconnected +< wlan client duplicate ssid +< wlan client edit entry +< wlan client encryption +< wlan client encryption none +< wlan client encryption wep +< wlan client encryption wpa +< wlan client encryption wpa2 +< wlan client group cipher +< wlan client group key algorithm +< wlan client invalid key length +< wlan client new entry +< wlan client new network +< wlan client pairwise cipher +< wlan client pairwise key algorithm +< wlan client pairwise key group key +< wlan client psk +< wlan client ssid +< wlan client tkip +< wlan client wpa mode +< wlan client wpa mode all +< wlan client wpa mode ccmp ccmp +< wlan client wpa mode ccmp tkip +< wlan client wpa mode tkip tkip ############################################################################ # Checking install/setup translations for language: ru # ############################################################################ @@ -472,4 +565,35 @@ < visit us at < vpn keyexchange < week-graph +< wlanap country +< wlan client +< wlan client advanced settings +< wlan client and +< wlan client bssid +< wlan client ccmp +< wlan client configuration +< wlan client disconnected +< wlan client duplicate ssid +< wlan client edit entry +< wlan client encryption +< wlan client encryption none +< wlan client encryption wep +< wlan client encryption wpa +< wlan client encryption wpa2 +< wlan client group cipher +< wlan client group key algorithm +< wlan client invalid key length +< wlan client new entry +< wlan client new network +< wlan client pairwise cipher +< wlan client pairwise key algorithm +< wlan client pairwise key group key +< wlan client psk +< wlan client ssid +< wlan client tkip +< wlan client wpa mode +< wlan client wpa mode all +< wlan client wpa mode ccmp ccmp +< wlan client wpa mode ccmp tkip +< wlan client wpa mode tkip tkip < year-graph diff --git a/html/cgi-bin/wirelessclient.cgi b/html/cgi-bin/wirelessclient.cgi new file mode 100755 index 000000000..5ff0e2c42 --- /dev/null +++ b/html/cgi-bin/wirelessclient.cgi @@ -0,0 +1,703 @@ +#!/usr/bin/perl +############################################################################### +# # +# IPFire.org - A linux based firewall # +# Copyright (C) 2012 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 . # +# # +############################################################################### + +# DEVICE,ENABLED,MODE,WPA_MODE,SSID,PSK,PRIO +# wlan0,on,WPA2,,Use This One Mum,ThisIsTheKey,2 + +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"; + +#workaround to suppress a warning when a variable is used only once +my @dummy = ( ${Header::colouryellow} ); +undef (@dummy); + +# Files used +my $setting = "${General::swroot}/main/settings"; +our $datafile = "${General::swroot}/ethernet/wireless"; + +my %color = (); +my %mainsettings = (); +&General::readhash("${General::swroot}/main/settings", \%mainsettings); +&General::readhash("/srv/web/ipfire/html/themes/".$mainsettings{'THEME'}."/include/colors.txt", \%color); + +our %settings = (); +our %netsettings = (); + +$settings{'ID'} = ''; +$settings{'INTERFACE'} = ''; +$settings{'ENABLED'} = ''; +$settings{'ENCRYPTION'} = ''; +$settings{'WPA_MODE'} = ''; +$settings{'SSID'} = ''; +$settings{'PSK'} = ''; +$settings{'PRIO'} = ''; + +$settings{'ACTION'} = ''; # add/edit/remove +$settings{'ID'} = ''; # point record for ACTION + +my $errormessage = ''; +my $warnmessage = ''; + +&Header::showhttpheaders(); + +#Get GUI values +&Header::getcgihash(\%settings); + +# Load multiline data +our @configs = (); +if (open(FILE, "$datafile")) { + @configs = ; + close (FILE); +} + +&General::readhash("${General::swroot}/main/settings", \%settings); +&General::readhash("${General::swroot}/ethernet/settings", \%netsettings); + +# Toggle enable/disable field. +if ($settings{'ACTION'} eq $Lang::tr{'toggle enable disable'}) { + my @update; + + foreach my $line (@configs) { + chomp($line); + my @config = split(/\,/, $line); + + # Update the entry with the matching ID. + if ($config[0] eq $settings{'ID'}) { + # Toggle enabled/disabled status. + + if ($config[2] eq 'on') { + $config[2] = 'off'; + } else { + $config[2] = 'on'; + } + + $line = join(',', @config); + } + + push(@update, $line."\n"); + } + + # Save updated configuration settings. + open(FILE, ">$datafile") or die 'wlan client datafile error'; + print FILE @update; + close(FILE); + + @configs = @update; + + # Update configuration files. + &BuildConfiguration(); + + # Reset ACTION. + $settings{'ACTION'} = ''; +} + +if ($settings{'ACTION'} eq $Lang::tr{'add'}) { + # Validate input data. + $errormessage = ValidateInput("add"); + + unless ($errormessage) { + # Search for the next free id. + my $next_id = NextID(); + + my @config = ($next_id); + push(@config, $settings{'INTERFACE'}); + push(@config, $settings{'ENABLED'}); + push(@config, $settings{'ENCRYPTION'}); + push(@config, $settings{'WPA_MODE'}); + push(@config, $settings{'SSID'}); + push(@config, $settings{'PSK'}); + push(@config, $settings{'PRIO'}); + + # Add the new configuration and write all the stuff to the configuration file. + my $line = join(',', @config) . "\n"; + push(@configs, $line); + + # Save updated configuration settings. + open(FILE, ">$datafile") or die 'wlan client datafile error'; + print FILE @configs; + close(FILE); + + # Update configuration files. + &BuildConfiguration(); + + # Reset ACTION. + $settings{'ACTION'} = ''; + } +} + +if ($settings{'ACTION'} eq $Lang::tr{'edit'}) { + foreach my $line (@configs) { + chomp($line); + my @config = split(/\,/, $line); + + if ($config[0] eq $settings{'ID'}) { + $settings{'ID'} = $config[0]; + $settings{'INTERFACE'} = $config[1]; + $settings{'ENABLED'} = $config[2]; + $settings{'ENCRYPTION'} = $config[3]; + $settings{'WPA_MODE'} = $config[4]; + $settings{'SSID'} = $config[5]; + $settings{'PSK'} = $config[6]; + $settings{'PRIO'} = $config[7]; + } + } +} + +if ($settings{'ACTION'} eq $Lang::tr{'update'}) { + $errormessage = ValidateInput("update"); + + unless ($errormessage) { + my @update; + foreach my $line (@configs) { + chomp($line); + my @config = split(/\,/, $line); + + # Update the entry with the matching ID. + if ($config[0] eq $settings{'ID'}) { + # Update all configuration settings. + # ID and INTERFACE cannot be changed. + $config[2] = $settings{'ENABLED'}; + $config[3] = $settings{'ENCRYPTION'}; + $config[4] = $settings{'WPA_MODE'}; + $config[5] = $settings{'SSID'}; + $config[6] = $settings{'PSK'}; + $config[7] = $settings{'PRIO'}; + + $line = join(',', @config); + } + + push(@update, $line."\n"); + } + + # Save updated configuration settings. + open(FILE, ">$datafile") or die 'wlan client datafile error'; + print FILE @update; + close(FILE); + + @configs = @update; + + # Update configuration files. + &BuildConfiguration(); + + # Reset ACTION. + $settings{'ACTION'} = ''; + } +} + +if ($settings{'ACTION'} eq $Lang::tr{'remove'}) { + my @update; + + foreach my $line (@configs) { + chomp($line); + my @config = split(/\,/, $line); + + # Skip the to be removed entry. + if ($config[0] eq $settings{'ID'}) { + next; + } + + push(@update, $line."\n"); + } + + # Save updated configuration settings. + open(FILE, ">$datafile") or die 'wlan client datafile error'; + print FILE @update; + close(FILE); + + @configs = @update; + + # Update configuration files. + &BuildConfiguration(); + + # Reset ACTION. + $settings{'ACTION'} = ''; +} + +if ($settings{'ACTION'} eq '') { # First launch from GUI + &showMainBox(); +} else { + # Action has been set, so show the edit box. + &showEditBox(); +} + +sub showMainBox() { + &Header::openpage($Lang::tr{'wlan client configuration'}, 1, ''); + &Header::openbigbox('100%', 'left', '', $errormessage); + + &Header::openbox('100%', 'left', $Lang::tr{'wlan client configuration'}); + + print < + + + +


+ + + + + + + +END + + # + # Print each line of @configs list + # + + my $key = 0; + foreach my $line (@configs) { + # Skip commented lines. + my $firstchar = substr($line, 0, 1); + next if ($firstchar eq "#"); + + chomp($line); + my @config = split(/\,/,$line); + + #Choose icon for checkbox + my $gif = ''; + my $gdesc = ''; + if ($config[2] eq 'on' ) { + $gif = 'on.gif'; + $gdesc = $Lang::tr{'click to disable'}; + } else { + $gif = 'off.gif'; + $gdesc = $Lang::tr{'click to enable'}; + } + + # Colorize each line + if ($key % 2) { + print ""; + } else { + print ""; + } + + my $encryption_mode = $Lang::tr{'unknown'}; + if ($config[3] eq "NONE") { + $encryption_mode = $Lang::tr{'wlan client encryption none'}; + } elsif ($config[3] eq "WEP") { + $encryption_mode = $Lang::tr{'wlan client encryption wep'}; + } elsif ($config[3] eq "WPA") { + $encryption_mode = $Lang::tr{'wlan client encryption wpa'}; + } elsif ($config[3] eq "WPA2") { + $encryption_mode = $Lang::tr{'wlan client encryption wpa2'}; + } + + if (($config[3] eq "WPA") || ($config[3] eq "WPA2")) { + my $wpa_pairwise = "$Lang::tr{'wlan client ccmp'} $Lang::tr{'wlan client and'} $Lang::tr{'wlan client tkip'}"; + my $wpa_group = "$Lang::tr{'wlan client ccmp'} $Lang::tr{'wlan client and'} $Lang::tr{'wlan client tkip'}"; + + if ($config[4] eq "CCMP-CCMP") { + $wpa_pairwise = $Lang::tr{'wlan client ccmp'}; + $wpa_group = $Lang::tr{'wlan client ccmp'}; + } elsif ($config[4] eq "CCMP-TKIP") { + $wpa_pairwise = $Lang::tr{'wlan client ccmp'}; + $wpa_group = $Lang::tr{'wlan client tkip'}; + } elsif ($config[4] eq "TKIP-TKIP") { + $wpa_pairwise = $Lang::tr{'wlan client tkip'}; + $wpa_group = $Lang::tr{'wlan client tkip'}; + } + + $encryption_mode .= "
"; + $encryption_mode .= "$Lang::tr{'wlan client pairwise key algorithm'}: "; + $encryption_mode .= $wpa_pairwise; + $encryption_mode .= "
"; + $encryption_mode .= "$Lang::tr{'wlan client group key algorithm'}: "; + $encryption_mode .= $wpa_group; + } + + print <$config[5] + + + + + + +END + $key++; + } + print "
$Lang::tr{'wlan client ssid'}$Lang::tr{'wlan client encryption'}$Lang::tr{'priority'}
$encryption_mode$config[7] +
+ + + +
+
+
+ + + +
+
+
+ + + +
+
"; + + # If table contains entries, print 'Key to action icons' + if ($key) { + print < + +  $Lang::tr{'legend'}:  + $Lang::tr{ + $Lang::tr{'click to disable'} +    + $Lang::tr{ + $Lang::tr{'click to enable'} +    + $Lang::tr{ + $Lang::tr{'edit'} +    + $Lang::tr{ + $Lang::tr{'remove'} + + +END + } + + &Header::closebox(); + + # Show status box. + &ShowStatus(); + + &Header::closebigbox(); + &Header::closepage(); +} + +sub showEditBox() { + &Header::openpage($Lang::tr{'wlan client configuration'}, 1, ''); + &Header::openbigbox('100%', 'left', '', $errormessage); + + if ($errormessage) { + &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); + print "$errormessage "; + &Header::closebox(); + } + + my $buttontext = $Lang::tr{'add'}; + if ($settings{'ID'} ne '') { + $buttontext = $Lang::tr{'update'}; + &Header::openbox('100%', 'left', $Lang::tr{'wlan client edit entry'}); + } else { + &Header::openbox('100%', 'left', $Lang::tr{'wlan client new entry'}); + $settings{'ENABLED'} = 'on'; + } + my $action = $buttontext; + + my %checked = (); + $checked{'ENABLED'} = ($settings{'ENABLED'} ne 'on' ) ? '' : "checked='checked'"; + + my %selected = (); + $selected{'ENCRYPTION'} = (); + $selected{'ENCRYPTION'}{'NONE'} = ''; + $selected{'ENCRYPTION'}{'WPA2'} = ''; + $selected{'ENCRYPTION'}{'WPA'} = ''; + $selected{'ENCRYPTION'}{'WEP'} = ''; + $selected{'ENCRYPTION'}{$settings{'ENCRYPTION'}} = "selected='selected'"; + + $selected{'WPA_MODE'} = (); + $selected{'WPA_MODE'}{''} = ''; + $selected{'WPA_MODE'}{'CCMP-CCMP'} = ''; + $selected{'WPA_MODE'}{'CCMP-TKIP'} = ''; + $selected{'WPA_MODE'}{'TKIP-TKIP'} = ''; + $selected{'WPA_MODE'}{$settings{'WPA_MODE'}} = "selected='selected'"; + + $selected{'PRIO'} = (); + $selected{'PRIO'}{'0'} = ''; + $selected{'PRIO'}{'1'} = ''; + $selected{'PRIO'}{'2'} = ''; + $selected{'PRIO'}{'3'} = ''; + $selected{'PRIO'}{'4'} = ''; + $selected{'PRIO'}{$settings{'PRIO'}} = "selected='selected'"; + + print < + + + + + + + + + + + + + + + + + + + +
$Lang::tr{'wlan client ssid'}:$Lang::tr{'enabled'}
$Lang::tr{'wlan client encryption'}: + +
$Lang::tr{'wlan client psk'}: 
+ +
+
+ + + $Lang::tr{'wlan client advanced settings'}: + + + + + + + + + + + + + +
+ $Lang::tr{'wlan client wpa mode'}: + + + + ($Lang::tr{'wlan client pairwise key group key'}) +
+ $Lang::tr{'priority'}: + + +
+ +
+
+ + + + + +
+ + +
+ +END + &Header::closebox(); + + &Header::closebigbox(); + &Header::closepage(); +} + +sub ShowStatus() { + my $device = $netsettings{'RED_DEV'}; + + # Exit if no device is configured. + return if ($device eq ""); + + # Exit if wpa_supplicant is not running on this interface. + #return if (! -e "/var/run/wpa_supplicant/$device"); + + open(FILE, "/usr/local/bin/wirelessclient status |"); + + my %status = (); + while () { + chomp($_); + + my ($key, $value) = split("=", $_); + $status{$key} = $value; + } + + close(FILE); + + # End here, if no there is no input. + return if (!keys %status); + + &Header::openbox('100%', 'left', $Lang::tr{'status'}); + + if ($status{'ssid'} eq "") { + print "

$Lang::tr{'wlan client disconnected'}

"; + + } else { + print < + + + $Lang::tr{'wlan client ssid'} + + + $status{'ssid'} + + + + + $Lang::tr{'wlan client bssid'} + + + $status{'bssid'} + + +END + + if (($status{'pairwise_cipher'} ne "NONE") || ($status{'group_cipher'} ne "NONE")) { + print < + + $Lang::tr{'wlan client encryption wpa'} + + + + + $Lang::tr{'wlan client pairwise cipher'} + + + $status{'pairwise_cipher'} + + + + + $Lang::tr{'wlan client group cipher'} + + + $status{'group_cipher'} + + +END + } + + print ""; + } + + &Header::closebox(); +} + +sub BuildConfiguration() { + system("/usr/local/bin/wirelessclient restart"); +} + +sub NextID() { + my $highest_id = 0; + foreach my $line (@configs) { + # Skip commented lines. + my $firstchar = substr($line, 0, 1); + next if ($firstchar eq "#"); + + my @config = split(/\,/, $line); + if ($config[0] > $highest_id) { + $highest_id = $config[0]; + } + } + + return $highest_id + 1; +} + +sub DuplicateSSID($) { + my $ssid = shift; + + foreach my $line (@configs) { + # Skip commented lines. + my $firstchar = substr($line, 0, 1); + next if ($firstchar eq "#"); + + my @config = split(/\,/, $line); + if ($config[5] eq $ssid) { + return 1; + } + } + + return 0; +} + +sub ValidKeyLength($$) { + my $algo = shift; + my $key = shift; + + my $key_length = length($key); + + if ($algo eq "WEP") { + # Key must be 13 or 26 characters. + if (($key_length == 13) || ($key_length == 26)) { + return 0; + } + + return 1; + + } elsif (($algo eq "WPA2") || ($algo eq "WPA")) { + # Key must be between 8 and 63 chars. + if (($key_length >= 8) && ($key_length <= 63)) { + return 0; + } + + return 1; + } + + # Say okay for all other algorithms. + return 0; +} + +sub ValidateInput($) { + my $mode = shift; + + # Check for duplicate SSIDs. + if (($mode eq "add") && (DuplicateSSID($settings{'SSID'}))) { + return "$Lang::tr{'wlan client duplicate ssid'}: $settings{'SSID'}"; + + # Check for invalid key length. + } elsif (ValidKeyLength($settings{'ENCRYPTION'}, $settings{'PSK'})) { + return "$Lang::tr{'wlan client invalid key length'}"; + + } + + # Reset WPA mode, if WPA(2) is not selected. + if (($settings{'ENCRYPTION'} ne "WPA") && ($settings{'ENCRYPTION'} ne "WPA2")) { + $settings{'WPA_MODE'} = ''; + } + + if ($settings{'ENABLED'} ne "") { + $settings{'ENABLED'} = 'on'; + } else { + $settings{'ENABLED'} = 'off'; + } + + return; +} diff --git a/langs/de/cgi-bin/de.pl b/langs/de/cgi-bin/de.pl index 6275d8a07..84b102f36 100644 --- a/langs/de/cgi-bin/de.pl +++ b/langs/de/cgi-bin/de.pl @@ -2212,8 +2212,39 @@ 'wireless config added' => 'Wireless-Konfiguration hinzugefügt', 'wireless config changed' => 'Wireless-Konfiguration geändert', 'wireless configuration' => 'Wireless-Konfiguration', +'wlan client' => 'WLAN-Client', +'wlan client advanced settings' => 'Erweiterte Einstellungen', +'wlan client and' => 'und', +'wlan client bssid' => 'BSSID', +'wlan client ccmp' => 'CCMP', +'wlan client configuration' => 'WLAN-Client-Konfiguration', +'wlan client disconnected' => 'Nicht verbunden', +'wlan client duplicate ssid' => 'Doppelte SSID', +'wlan client edit entry' => 'Verbindung bearbeiten', +'wlan client encryption' => 'Verschlüsselung', +'wlan client encryption none' => 'Keine', +'wlan client encryption wep' => 'WEP', +'wlan client encryption wpa' => 'WPA', +'wlan client encryption wpa2' => 'WPA2', +'wlan client group cipher' => 'Gruppenchiffre', +'wlan client group key algorithm' => 'GKA', +'wlan client invalid key length' => 'Ungültige Schlüssellänge.', +'wlan client new entry' => 'Neue WLAN-Client-Konfiguration erstellen', +'wlan client new network' => 'Neues Netzwerk', +'wlan client pairwise cipher' => 'Paarweise Chiffre', +'wlan client pairwise key algorithm' => 'PKA', +'wlan client pairwise key group key' => 'Paarweise-/Gruppenschlüssel', +'wlan client psk' => 'Schlüssel', +'wlan client ssid' => 'SSID', +'wlan client tkip' => 'TKIP', +'wlan client wpa mode' => 'WPA-Modus', +'wlan client wpa mode all' => 'Automatisch', +'wlan client wpa mode ccmp ccmp' => 'CCMP-CCMP', +'wlan client wpa mode ccmp tkip' => 'CCMP-TKIP', +'wlan client wpa mode tkip tkip' => 'TKIP-TKIP', 'wlanap access point' => 'Access Point', 'wlanap channel' => 'Kanal', +'wlanap country' => 'Ländercode', 'wlanap debugging' => 'Debugging', 'wlanap del interface' => 'Ausgewähltes Interface zurücksetzen?', 'wlanap encryption' => 'Verschlüsselung', diff --git a/langs/en/cgi-bin/en.pl b/langs/en/cgi-bin/en.pl index 75138f557..8ff2608a0 100644 --- a/langs/en/cgi-bin/en.pl +++ b/langs/en/cgi-bin/en.pl @@ -2246,6 +2246,36 @@ 'wireless config added' => 'Wireless config added', 'wireless config changed' => 'Wireless config changed', 'wireless configuration' => 'Wireless Configuration', +'wlan client' => 'Wireless client', +'wlan client advanced settings' => 'Advanced settings', +'wlan client and' => 'and', +'wlan client bssid' => 'BSSID', +'wlan client ccmp' => 'CCMP', +'wlan client configuration' => 'Wireless Client Configuration', +'wlan client disconnected' => 'Disconnected', +'wlan client duplicate ssid' => 'Duplicate SSID', +'wlan client edit entry' => 'Edit wireless client configuration', +'wlan client encryption' => 'Encryption', +'wlan client encryption none' => 'None', +'wlan client encryption wep' => 'WEP', +'wlan client encryption wpa' => 'WPA', +'wlan client encryption wpa2' => 'WPA2', +'wlan client group cipher' => 'Group cipher', +'wlan client group key algorithm' => 'GKA', +'wlan client invalid key length' => 'Invalid key length.', +'wlan client new entry' => 'Create new wireless client configuration', +'wlan client new network' => 'New network', +'wlan client pairwise cipher' => 'Pairwise cipher', +'wlan client pairwise key algorithm' => 'PKA', +'wlan client pairwise key group key' => 'Pairwise key/group key', +'wlan client psk' => 'Pre-shared key', +'wlan client ssid' => 'SSID', +'wlan client tkip' => 'TKIP', +'wlan client wpa mode' => 'WPA mode', +'wlan client wpa mode all' => 'Auto', +'wlan client wpa mode ccmp ccmp' => 'CCMP-CCMP', +'wlan client wpa mode ccmp tkip' => 'CCMP-TKIP', +'wlan client wpa mode tkip tkip' => 'TKIP-TKIP', 'wlanap access point' => 'Access Point', 'wlanap channel' => 'Channel', 'wlanap country' => 'Country Code', diff --git a/lfs/initscripts b/lfs/initscripts index 213b46e27..6549147a8 100644 --- a/lfs/initscripts +++ b/lfs/initscripts @@ -173,6 +173,9 @@ $(TARGET) : ln -sf ../init.d/localnet /etc/rc.d/rcsysinit.d/S80localnet ln -sf ../init.d/sysctl /etc/rc.d/rcsysinit.d/S90sysctl ln -sf ../init.d/network-vlans /etc/rc.d/rcsysinit.d/S91network-vlans + ln -sf ../init.d/wlanclient /etc/rc.d/rc0.d/K82wlanclient + ln -sf ../init.d/wlanclient /etc/rc.d/rc3.d/S19wlanclient + ln -sf ../init.d/wlanclient /etc/rc.d/rc6.d/K82wlanclient ln -sf ../../dnsmasq /etc/rc.d/init.d/networking/red.up/05-RS-dnsmasq ln -sf ../../firewall /etc/rc.d/init.d/networking/red.up/20-RL-firewall diff --git a/src/initscripts/init.d/networking/functions.network b/src/initscripts/init.d/networking/functions.network new file mode 100755 index 000000000..26cc65c7c --- /dev/null +++ b/src/initscripts/init.d/networking/functions.network @@ -0,0 +1,154 @@ +#!/bin/sh +# +######################################################################## +# Begin +# +# Description : A collection of functions for the IPFire network scripts +# +# Authors : IPFire Development Team +# +# Version : 01.00 +# +# Notes : +# +######################################################################## + +. /etc/sysconfig/rc +. $rc_functions + + +eval $(/usr/local/bin/readhash /var/ipfire/ethernet/settings) +eval $(/usr/local/bin/readhash /var/ipfire/dns/settings) + +dhcpcd_get_pid() { + # This function returns the pid of a dhcpcd by a given + # network device, if a pidfile exists. + + local device="$1" + local pidfile="/var/run/dhcpcd-${device}.pid" + + # Check if a pid file exists. + if [ -f "${pidfile}" ] ; then + + # Get the pid from the file. + local pid="$(<"${pidfile}")" + + echo "${pid}" + fi +} + +dhcpcd_is_running() { + # This functions checks if a dhcpcd is running by a given pid. + + local pid="$1" + + # Check if a dhcpcd is running. + if [ -n "${pid}" -a -d "/proc/${pid}" ]; then + # Return "0" (True) if a dhcpcd is running. + return 0 + fi + + # Return 1 (False) no dhcpcd is running. + return 1 +} + +dhcpcd_start() { + # This function will start a dhcpcd on a speciefied device. + + local device="$1" + local dhcp_start="" + + boot_mesg -n "Starting dhcpcd on the ${device} interface..." + + # Check if a dhcpcd is already running. + local pid="$(dhcpcd_get_pid "${device}")" + + if dhcpcd_is_running "${pid}"; then + boot_mesg "dhcpcd already running!" ${WARNING} + echo_warning + exit 2 + fi + + # Check if a DHCP hostname has been set. + if [ -n "${RED_DHCP_HOSTNAME}" ]; then + dhcp_start+="-h ${RED_DHCP_HOSTNAME}" + fi + + # Start dhcpcd. + /sbin/dhcpcd "${device}" "${dhcp_start}" >/dev/null 2>&1 + ret="$?" + + if [ "${ret}" -eq 0 ]; then + . /var/ipfire/dhcpc/dhcpcd-"${device}".info + echo "" + echo_ok + boot_mesg " DHCP Assigned Settings for ${device}:" + boot_mesg_flush + boot_mesg " IP Address: $ip_address" + boot_mesg_flush + + if [ -n "${RED_DHCP_HOSTNAME}" ]; then + boot_mesg " Hostname: $RED_DHCP_HOSTNAME" + boot_mesg_flush + fi + + boot_mesg " Subnet Mask: $subnet_mask" + boot_mesg_flush + boot_mesg " Default Gateway: $routers" + boot_mesg_flush + boot_mesg " DNS Server: $domain_name_servers" + boot_mesg_flush + else + echo "" + $(exit "${ret}") + evaluate_retval + fi +} + +dhcpcd_stop() { + # This function stops a previously started dhcpcd on a given device. + + local device="$1" + local dhcp_stop="-k" + local leaseinfo="/var/ipfire/dhcpc/dhcpcd-${device}.info" + + boot_mesg -n "Stopping dhcpcd on the ${device} interface..." + + # Check if a dhcpcd is running. + local pid="$(dhcpcd_get_pid "${device}")" + + if ! dhcpcd_is_running "${pid}"; then + boot_mesg "dhcpcd not running!" ${WARNING} + echo_warning + exit 1 + fi + + # Check if we got a valid lease. + if [ -e $leaseinfo ]; then + . $leaseinfo + if [ "$dchp_lease_time" = "4294967295" ]; then + # do nothing, just echo ok + echo_ok + else + # Stop dhcpcd. + /sbin/dhcpcd "${device}" "${dhcp_stop}" &> /dev/null + ret="$?" + + # Wait until dhcpd has stopped. + while [ -d "/proc/${pid}" ]; do + sleep 1 + done + + # Display console message, depended on the exit code + # of the stopped dhcpcd. + if [ "${ret}" -eq 0 ]; then + echo_ok + elif [ "${ret}" -eq 1 ]; then + boot_mesg "failed to stop dhcpcd!" ${WARNING} + echo_warning + else + echo_failure + fi + fi + fi +} diff --git a/src/initscripts/init.d/networking/red b/src/initscripts/init.d/networking/red old mode 100644 new mode 100755 index 421c6f684..e28b2e67b --- a/src/initscripts/init.d/networking/red +++ b/src/initscripts/init.d/networking/red @@ -17,6 +17,7 @@ . /etc/sysconfig/rc . ${rc_functions} +. /etc/init.d/networking/functions.network #Define some defaults INET_VLAN=7 @@ -77,11 +78,6 @@ if [ "${TYPE}" == "STATIC" ]; then fi fi -PIDFILE="/var/run/dhcpcd-${DEVICE}.pid" -LEASEINFO="/var/ipfire/dhcpc/dhcpcd-${DEVICE}.info" -DHCP_START=" " -DHCP_STOP="-k " - case "${1}" in start) if [ "${DEVICE}" != "${GREEN_DEV}" ] && [ "${DEVICE}" != "" ]; then @@ -137,87 +133,24 @@ case "${1}" in /usr/local/bin/setaliases elif [ "${TYPE}" == "DHCP" ]; then + # Add firewall rules to allow comunication with the dhcp server on red. + iptables -A REDINPUT -p tcp --source-port 67 --destination-port 68 -i ${DEVICE} -j ACCEPT + iptables -A REDINPUT -p udp --source-port 67 --destination-port 68 -i ${DEVICE} -j ACCEPT - if [ -e $LEASEINFO ]; then - boot_mesg -n "Stopping dhcpcd on the ${DEVICE} interface..." - . $LEASEINFO - if [ "$dhcp_lease_time" = "4294967295" ]; then - # do nothing, just echo ok - echo "" - echo_ok - else - if [ -n "$DHCP_STOP" ]; then - /sbin/dhcpcd ${DEVICE} $DHCP_STOP &> /dev/null - RET="$?" - if [ "$RET" -eq 0 ]; then - echo "" - echo_ok - elif [ "$RET" -eq 1 ]; then - boot_mesg "dhcpcd not running!" ${WARNING} - echo_warning - else - echo "" - echo_failure - fi - else - echo "" - killproc dhcpcd - fi - fi - fi - - boot_mesg -n "Starting dhcpcd on the ${DEVICE} interface..." echo -n "${DEVICE}" > /var/ipfire/red/iface + # Check if the wlan-client is used on red. + # To determine this we check if a wpa_supplicant is running. + pid="$(pidof wpa_supplicant)" + + if [ -z "${pid}" ]; then + # No wpa_supplicant is running. So it's save to start dhcpcd. + dhcpcd_start "${DEVICE}" + fi + ## Create & Enable vnstat /usr/bin/vnstat -u -i ${DEVICE} -r --enable --force > /dev/null 2>&1 - # Test to see if there is a stale pid file - if [ -f "$PIDFILE" ]; then - ps `cat "$PIDFILE"` | grep dhcpcd > /dev/null - if [ $? != 0 ]; then - rm -f /var/run/dhcpcd-${DEVICE}.pid > /dev/null - else - boot_mesg "dhcpcd already running!" ${WARNING} - echo_warning - exit 2 - fi - fi - - iptables -A REDINPUT -p tcp --source-port 67 --destination-port 68 -i ${DEVICE} -j ACCEPT - iptables -A REDINPUT -p udp --source-port 67 --destination-port 68 -i ${DEVICE} -j ACCEPT - - if [ -n "${RED_DHCP_HOSTNAME}" ]; then - DHCP_START+="-h ${RED_DHCP_HOSTNAME} " - fi - - /sbin/dhcpcd ${DEVICE} ${DHCP_START} >/dev/null 2>&1 - RET="$?" - - if [ "$RET" = "0" ]; then - . /var/ipfire/dhcpc/dhcpcd-${DEVICE}.info - echo "" - echo_ok - boot_mesg " DHCP Assigned Settings for ${DEVICE}:" - boot_mesg_flush - boot_mesg " IP Address: $ip_address" - boot_mesg_flush - if [ -n "${RED_DHCP_HOSTNAME}" ]; then - boot_mesg " Hostname: $RED_DHCP_HOSTNAME" - boot_mesg_flush - fi - boot_mesg " Subnet Mask: $subnet_mask" - boot_mesg_flush - boot_mesg " Default Gateway: $routers" - boot_mesg_flush - boot_mesg " DNS Server: $domain_name_servers" - boot_mesg_flush - else - echo "" - $(exit "$RET") - evaluate_retval - fi - elif [ "$TYPE" == "PPPOE" ]; then if ( ps ax | grep -q [p]ppd ); then @@ -525,33 +458,15 @@ case "${1}" in # Add a NaN value to ppp0 rrd to supress spikes at reconnect rrdtool update $RRDLOG/collectd/localhost/interface/if_octets-ppp0.rrd \ $(date +%s):: > /dev/null 2>&1 - fi - if [ -e $LEASEINFO ]; then - boot_mesg -n "Stopping dhcpcd on the ${DEVICE} interface..." - . $LEASEINFO - if [ "$dchp_lease_time" = "4294967295" ]; then - # do nothing, just echo ok - echo "" - echo_ok - else - if [ -n "$DHCP_STOP" ]; then - /sbin/dhcpcd ${DEVICE} $DHCP_STOP &> /dev/null - RET="$?" - if [ "$RET" -eq 0 ]; then - echo "" - echo_ok - elif [ "$RET" -eq 1 ]; then - boot_mesg "dhcpcd not running!" ${WARNING} - echo_warning - else - echo "" - echo_failure - fi - else - echo "" - killproc dhcpcd - fi + elif [ "$TYPE" == "DHCP" ]; then + # Check if the wlan-client is used on red. + # To determine this we check if a wpa_supplicant is running. + pid="$(pidof wpa_supplicant)" + + if [ -z "${pid}" ]; then + # Stop dhcpcd. + dhcpcd_stop "${DEVICE}" fi fi diff --git a/src/initscripts/init.d/networking/wpa_supplicant.exe b/src/initscripts/init.d/networking/wpa_supplicant.exe new file mode 100755 index 000000000..b5ad8ffa1 --- /dev/null +++ b/src/initscripts/init.d/networking/wpa_supplicant.exe @@ -0,0 +1,50 @@ +#!/bin/bash +######################################################################## +# Begin +# +# Description : wpa_supplicant Script +# +# Authors : IPFire Development Team +# +# Version : 01.00 +# +# Notes : This script starts/stops the dhclient if a WPA/WPA2 +# connection to an AP successfull has been established +# or disconnected. +# +######################################################################## + +. /etc/sysconfig/rc +. ${rc_functions} +. /etc/init.d/networking/functions.network + +# Gather required information from wpa_cli. +device="$1" +wpa_state="$2" + +# Check if the RED device has been configured to use DHCP or exit immediately. +eval $(/usr/local/bin/readhash /var/ipfire/ethernet/settings) +if [ ! "${RED_TYPE}" == "DHCP" ] ; then + exit 0 +fi + +case "${wpa_state}" in + CONNECTED) + # Start dhcpcd. + dhcpcd_start "${device}" + + exit 0 + ;; + + DISCONNECTED) + # Stop dhcpcd. + dhcpcd_stop "${device}" + + exit 0 + ;; + + *) + # When we ever got here, there is a really big problem. + exit 1 + ;; +esac diff --git a/src/initscripts/init.d/wlanclient b/src/initscripts/init.d/wlanclient new file mode 100755 index 000000000..ee24c43a1 --- /dev/null +++ b/src/initscripts/init.d/wlanclient @@ -0,0 +1,283 @@ +#!/bin/sh +######################################################################## +# Begin $rc_base/init.d/wlan_client +# +# Description : Wireless client initscript +# +######################################################################## + +. /etc/sysconfig/rc +. ${rc_functions} + +eval $(/usr/local/bin/readhash /var/ipfire/ethernet/settings) + +WIRELESS_CONFIG="/var/ipfire/ethernet/wireless" + +function device_is_wireless() { + local device=${1} + + if [ -d "/sys/class/net/${device}/wireless" ]; then + return 0 + fi + + return 1 +} + +function wpa_supplicant_make_config() { + local device=${1} + local config=${2} + shift 2 + + # Check if device is wireless. + local wireless="false" + if device_is_wireless ${device}; then + wireless="true" + fi + + # Write a configuration file header. + ( + echo "#" + echo "# THIS FILE IS AUTOMATICALLY GENERATED AND" + echo "# ANY CUSTOM CHANGES WILL BE OVERWRITTEN!" + echo "#" + echo + echo "ctrl_interface=/var/run/wpa_supplicant" + echo + ) > ${config} + + local items=0 + + local line + while IFS="," read -ra line; do + # Skip commented lines. + [ "${line:0:1}" = "#" ] && continue + + # Skip disabled entries. + [ "${line[2]}" = "on" ] || continue + + wpa_supplicant_config_line \ + ${device} ${config} \ + --wireless="${wireless}" \ + --mode="${line[3]}" \ + --wpa-mode="${line[4]}" \ + --ssid="${line[5]}" \ + --psk="${line[6]}" \ + --priority="${line[7]}" + + items=$(( ${items} + 1 )) + + done < ${WIRELESS_CONFIG} + + # Return exit code 2, when there are no entries in the + # configuration file. + if [ "${items}" = "0" ]; then + return 2 + fi + + return 0 +} + +function wpa_supplicant_config_line() { + local device=${1} + local config=${2} + shift 2 + + local auth_alg + local proto + local key_mgmt + local pairwise + local group + local mode + local priority + local psk + local ssid + local wep_tx_keyidx + local wep_key0 + local wireless="true" + local wpa_mode + + while [ $# -gt 0 ]; do + case "${1}" in + --mode=*) + mode=${1#--mode=} + ;; + --priority=*) + priority=${1#--priority=} + ;; + --psk=*) + psk=${1#--psk=} + ;; + --ssid=*) + ssid=${1#--ssid=} + ;; + --wireless=*) + wireless=${1#--wireless=} + ;; + --wpa-mode=*) + wpa_mode=${1#--wpa-mode=} + ;; + esac + shift + done + + case "${mode}" in + WPA2) + auth_alg="OPEN" + proto="RSN" + key_mgmt="WPA-PSK" + ;; + WPA) + auth_alg="OPEN" + proto="WPA" + key_mgmt="WPA-PSK" + ;; + WEP) + auth_alg="SHARED" + key_mgmt="NONE" + + wep_tx_keyidx=0 + wep_key0=${psk} + psk="" + ;; + NONE) + auth_alg="OPEN" + key_mgmt="NONE" + ;; + *) + # Unsupported mode. + return 1 + ;; + esac + + if [ "${mode}" = "WPA" -o "${mode}" = "WPA2" ]; then + case "${wpa_mode}" in + CCMP-CCMP) + pairwise="CCMP" + group="CCMP" + ;; + CCMP-TKIP) + pairwise="CCMP" + group="TKIP" + ;; + TKIP-TKIP) + pairwise="TKIP" + group="TKIP" + ;; + *) + pairwise="CCMP TKIP" + group="CCMP TKIP" + ;; + esac + fi + + ( + echo "network={" + + if [ -n "${ssid}" ]; then + echo " ssid=\"${ssid}\"" + fi + if [ "${wireless}" = "true" ]; then + echo " scan_ssid=1" + fi + if [ -n "${auth_alg}" ]; then + echo " auth_alg=${auth_alg}" + fi + if [ -n "${key_mgmt}" ]; then + echo " key_mgmt=${key_mgmt}" + fi + if [ -n "${psk}" ]; then + echo " psk=\"${psk}\"" + fi + if [ -n "${wep_tx_keyidx}" ]; then + echo " wep_tx_keyidx=${wep_tx_keyidx}" + fi + if [ -n "${wep_key0}" ]; then + echo " wep_key0=\"${wep_key0}\"" + fi + if [ -n "${proto}" ]; then + echo " proto=${proto}" + fi + if [ -n "${pairwise}" -a -n "${group}" ]; then + echo " pairwise=${pairwise}" + echo " group=${group}" + fi + if [ -n "${priority}" ]; then + echo " priority=${priority}" + fi + + echo "}" + echo + ) >> ${config} +} + +function wpa_supplicant_start() { + local device=${1} + local config="/etc/wpa_supplicant.conf" + + # Write configuration file. + wpa_supplicant_make_config ${device} ${config} + [ $? -eq 0 ] || return 0 + + # Build wpa_supplicant command line. + local wpa_suppl_cmd="wpa_supplicant -B -qqq -i${device} -c${config}" + + if device_is_wireless ${device}; then + wpa_suppl_cmd="${wpa_suppl_cmd} -Dwext" + else + wpa_suppl_cmd="${wpa_suppl_cmd} -Dwired" + fi + + # Run the shiz. + boot_mesg "Starting wireless client on ${RED_DEV}..." + loadproc ${wpa_suppl_cmd} + + # Run wpa_cli to handle reconnection events. + boot_mesg "Starting wireless event handler on ${RED_DEV}..." + wpa_cli -B -a /etc/rc.d/init.d/networking/wpa_supplicant.exe +} + +function wpa_supplicant_stop() { + boot_mesg "Stopping wireless event handler on ${RED_DEV}..." + killproc wpa_cli + + # wpa_cli does not send a disconnect event when get stopped. + # So we manually have to send it to the wpa_supplicant.exe. + /etc/rc.d/init.d/networking/wpa_supplicant.exe "${RED_DEV}" DISCONNECTED + + boot_mesg "Stopping wireless client on ${RED_DEV}..." + killproc wpa_supplicant + + # Tidy up /tmp directory. + rm -f /tmp/wpa_ctrl_* +} + +case "${1}" in + start) + if [ -n "${RED_DEV}" ] && device_is_wireless ${RED_DEV}; then + wpa_supplicant_start ${RED_DEV} + fi + ;; + + stop) + if [ -n "${RED_DEV}" ] && device_is_wireless ${RED_DEV}; then + wpa_supplicant_stop + fi + ;; + + restart) + ${0} stop + sleep 1 + ${0} start + ;; + + status) + statusproc wpa_supplicant + ;; + + *) + echo "Usage: ${0} {start|stop|restart|status}" + exit 1 + ;; +esac + +# End $rc_base/init.d/wlan_client diff --git a/src/misc-progs/Makefile b/src/misc-progs/Makefile index cc33266d0..0a4fda63e 100644 --- a/src/misc-progs/Makefile +++ b/src/misc-progs/Makefile @@ -33,7 +33,8 @@ SUID_PROGS = setdmzholes setportfw setxtaccess \ redctrl syslogdctrl extrahdctrl sambactrl upnpctrl tripwirectrl \ smartctrl clamavctrl addonctrl pakfire mpfirectrl wlanapctrl \ setaliases urlfilterctrl updxlratorctrl fireinfoctrl rebuildroutes \ - getconntracktable + getconntracktable wirelessclient +SUID_UPDX = updxsetperms install : all install -m 755 $(PROGS) /usr/local/bin @@ -157,3 +158,6 @@ rebuildroutes: rebuildroutes.c setuid.o ../install+setup/libsmooth/varval.o getconntracktable: getconntracktable.c setuid.o ../install+setup/libsmooth/varval.o $(COMPILE) -I../install+setup/libsmooth/ getconntracktable.c setuid.o ../install+setup/libsmooth/varval.o -o $@ + +wirelessclient: wirelessclient.c setuid.o ../install+setup/libsmooth/varval.o + $(COMPILE) -I../install+setup/libsmooth/ wirelessclient.c setuid.o ../install+setup/libsmooth/varval.o -o $@ diff --git a/src/misc-progs/wirelessclient.c b/src/misc-progs/wirelessclient.c new file mode 100644 index 000000000..c85e5316f --- /dev/null +++ b/src/misc-progs/wirelessclient.c @@ -0,0 +1,26 @@ +/* IPFire helper program - wirelessclient + * + * This program is distributed under the terms of the GNU General Public + * Licence. See the file COPYING for details. + */ + +#include +#include +#include "setuid.h" + +int main(int argc, char *argv[]) { + if (!(initsetuid())) + exit(1); + + if (strcmp(argv[1], "restart") == 0) { + safe_system("/etc/rc.d/init.d/wlanclient restart >/dev/null 2>&1"); + return 0; + } + + if (strcmp(argv[1], "status") == 0) { + safe_system("/usr/sbin/wpa_cli status verbose"); + return 0; + } + + return 0; +}