mirror of https://github.com/aredn/aredn.git
854 lines
25 KiB
Perl
Executable File
854 lines
25 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
=for commnet
|
|
|
|
Part of AREDN -- Used for creating Amateur Radio Emergency Data Networks
|
|
Copyright (C) 2015 Conrad Lara
|
|
See Contributors file for additional contributors
|
|
|
|
Copyright (c) 2013 David Rivenburg et al. BroadBand-HamNet
|
|
|
|
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 version 3 of the License.
|
|
|
|
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 <http://www.gnu.org/licenses/>.
|
|
|
|
Additional Terms:
|
|
|
|
Additional use restrictions exist on the AREDN(TM) trademark and logo.
|
|
See AREDNLicense.txt for more info.
|
|
|
|
Attributions to the AREDN Project must be retained in the source code.
|
|
If importing this code into a new or existing project attribution
|
|
to the AREDN project must be added to the source code.
|
|
|
|
You must not misrepresent the origin of the material conained within.
|
|
|
|
Modified versions must be modified to attribute to the original source
|
|
and be marked in reasonable ways as differentiate it from the original
|
|
version.
|
|
|
|
=cut
|
|
|
|
$debug = 0;
|
|
|
|
BEGIN {push @INC, '/www/cgi-bin'};
|
|
use perlfunc;
|
|
use channelmaps;
|
|
#
|
|
# load the config parms
|
|
#
|
|
|
|
read_postdata();
|
|
|
|
($config = $parms{config}) or
|
|
($config = nvram_get("config") and -d "/etc/config.$config") or
|
|
($config = "mesh");
|
|
|
|
# convert the %parms into scalars for convenience
|
|
if($parms{button_default})
|
|
{
|
|
load_cfg("/etc/config.$config/_setup.default");
|
|
foreach(keys %cfg)
|
|
{
|
|
eval (sprintf "\$$_ = \"%s\"", quotemeta $cfg{$_});
|
|
}
|
|
}
|
|
else
|
|
{
|
|
foreach(keys %parms)
|
|
{
|
|
next unless /^\w+$/;
|
|
$parms{$_} =~ s/^\s+//;
|
|
$parms{$_} =~ s/\s+$//;
|
|
eval (sprintf "\$$_ = \"%s\"", quotemeta $parms{$_});
|
|
}
|
|
|
|
if($button_reset or $config ne $oldconfig)
|
|
{
|
|
load_cfg("/etc/config.$config/_setup");
|
|
foreach(keys %cfg)
|
|
{
|
|
eval (sprintf "\$$_ = \"%s\"", quotemeta $cfg{$_});
|
|
}
|
|
}
|
|
}
|
|
|
|
if($parms{button_reset} or $parms{button_default} or (not $nodetac and not keys %parms))
|
|
{
|
|
$nodetac = nvram_get("node");
|
|
$tactical = nvram_get("tactical");
|
|
$nodetac .= " / $tactical" if $tactical;
|
|
}
|
|
else
|
|
{
|
|
$nodetac = $parms{nodetac};
|
|
}
|
|
|
|
# make sure unchecked checkboxes are accounted for
|
|
foreach(qw(lan_dhcp olsrd_bridge olsrd_gw wifi_hidden))
|
|
{
|
|
$parms{$_} = 0 unless $parms{$_};
|
|
}
|
|
|
|
# lan is always static
|
|
$lan_proto = "static";
|
|
|
|
# enforce direct mode settings
|
|
# (formerly known as dmz mode)
|
|
$dmz_mode = 0 unless $config eq "mesh";
|
|
$dmz_mode = 2 if $dmz_mode != 0 and $dmz_mode < 2;
|
|
$dmz_mode = 4 if $dmz_mode > 4;
|
|
|
|
if($dmz_mode)
|
|
{
|
|
$ipshift = (ip2decimal($wifi_ip) << $dmz_mode) & 0xffffff;
|
|
$dmz_lan_ip = add_ip_address("1" . decimal2ip($ipshift), 1);
|
|
$dmz_lan_mask = decimal2ip(0xffffffff << $dmz_mode);
|
|
($octet) = $dmz_lan_ip =~ /\d+\.\d+\.\d+\.(\d+)/;
|
|
$dmz_dhcp_start = $octet + 1;
|
|
$dmz_dhcp_end = $dmz_dhcp_start + (1 << $dmz_mode) - 4;
|
|
$parms{dmz_lan_ip} = $dmz_lan_ip;
|
|
$parms{dmz_lan_mask} = $dmz_lan_mask;
|
|
$parms{dmz_dhcp_start} = $dmz_dhcp_start;
|
|
$parms{dmz_dhcp_end} = $dmz_dhcp_end;
|
|
}
|
|
|
|
# derive values which are not explicitly defined
|
|
$parms{dhcp_limit} = $dhcp_limit = $dhcp_end - $dhcp_start + 1;
|
|
$parms{dmz_dhcp_limit} = $dmz_dhcp_limit = $dmz_dhcp_end - $dmz_dhcp_start + 1;
|
|
|
|
#
|
|
# get the active wifi settings on a fresh page load
|
|
#
|
|
|
|
unless($parms{reload})
|
|
{
|
|
my $wifiintf = get_interface("wifi");
|
|
($wifi_txpower) = `iwinfo $wifiintf info 2>/dev/null` =~ /Tx-Power: (\d+)/;
|
|
(my $doesiwoffset) = `iwinfo $wifiintf info 2>/dev/null` =~ /TX power offset: (\d+)/;
|
|
if ( $doesiwoffset ) {
|
|
$wifi_txpower -= $1;
|
|
}
|
|
if (wifi_useschains()){
|
|
$wifi_txant = `cat /sys/kernel/debug/ieee80211/phy0/ath9k/tx_chainmask`;
|
|
$wifi_rxant = `cat /sys/kernel/debug/ieee80211/phy0/ath9k/rx_chainmask`;
|
|
$wifi_txant = hex($wifi_txant);
|
|
$wifi_rxant = hex($wifi_rxant);
|
|
}
|
|
else {
|
|
foreach ( `iw phy phy0 info` ) {
|
|
next unless /Configured Antennas: TX 0x([\d]+) RX 0x([\d]+)/;
|
|
$wifi_txant = $1;
|
|
$wifi_rxant = $2;
|
|
}
|
|
}
|
|
$slottime = "";
|
|
}
|
|
|
|
# sanitize the active settings
|
|
$valid_ant = wifi_validant();
|
|
$wifi_txpower = wifi_maxpower() if not defined $wifi_txpower or $wifi_txpower > wifi_maxpower();
|
|
$wifi_txpower = 1 if $wifi_txpower < 1;
|
|
$wifi_rxant = wifi_defaultant() if not defined $wifi_rxant or not exists $valid_ant->{$wifi_rxant};
|
|
$wifi_txant = wifi_defaultant() if not defined $wifi_txant or not exists $valid_ant->{$wifi_txant};
|
|
$wifi_distance = 0 unless defined $wifi_distance;
|
|
$wifi_distance = 0 if $wifi_distance =~ /\D/;
|
|
|
|
# stuff the sanitized data back into the parms hash
|
|
# so they get saved correctly
|
|
$parms{wifi_distance} = $wifi_distance;
|
|
$parms{wifi_txpower} = $wifi_txpower;
|
|
$parms{wifi_txant} = $wifi_txant;
|
|
$parms{wifi_rxant} = $wifi_rxant;
|
|
|
|
#
|
|
# apply the wifi settings
|
|
#
|
|
|
|
if($parms{button_apply} or $parms{button_save})
|
|
{
|
|
my $wifiintf = get_interface("wifi");
|
|
$cmd = "";
|
|
if(wifi_useschains()){
|
|
$cmd .= "echo $wifi_rxant > /sys/kernel/debug/ieee80211/phy0/ath9k/rx_chainmask;";
|
|
$cmd .= "echo $wifi_txant > /sys/kernel/debug/ieee80211/phy0/ath9k/tx_chainmask;";
|
|
} else {
|
|
$cmd .= "ifdown wifi >/dev/null 2>&1;";
|
|
$cmd .= "ifdown wifi_mon >/dev/null 2>&1;";
|
|
$cmd .= "iw phy phy0 set antenna $wifi_txantenna $wifi_rxantenna >/dev/null 2>&1;";
|
|
$cmd .= "ifup wifi >/dev/null 2>&1;";
|
|
$cmd .= "ifup wifi_mon >/dev/null 2>&1;";
|
|
}
|
|
$cmd .= "iw phy phy0 set distance $wifi_distance >/dev/null 2>&1;";
|
|
$cmd .= "iw dev $wifiintf set txpower fixed ${wifi_txpower}00 >/dev/null 2>&1;";
|
|
system $cmd;
|
|
}
|
|
|
|
|
|
# validate and save configuration
|
|
|
|
@errors = ();
|
|
|
|
if($parms{button_save})
|
|
{
|
|
if($wifi_proto eq "static")
|
|
{
|
|
if(not validate_netmask($wifi_mask))
|
|
{
|
|
push @errors, "invalid WiFi netmask";
|
|
}
|
|
elsif(not validate_ip_netmask($wifi_ip, $wifi_mask))
|
|
{
|
|
push @errors, "invalid WiFi IP address";
|
|
}
|
|
}
|
|
|
|
if ($config eq "mesh"){
|
|
push (@errors, "invalid WiFi SSID") unless length $wifi_ssid <= 27;
|
|
} else
|
|
{
|
|
push (@errors, "invalid WiFi SSID") unless length $wifi_ssid <= 32;
|
|
}
|
|
|
|
if ( is_channel_valid($wifi_channel) != 1 )
|
|
{
|
|
push (@errors, "invalid WiFi channel")
|
|
}
|
|
|
|
if ( !is_wifi_chanbw_valid($wifi_chanbw,$wifi_ssid) )
|
|
{
|
|
push (@errors, "Invalid WiFi channel width");
|
|
$wifi_chanbw = 20;
|
|
}
|
|
|
|
push (@errors, "invalid WiFi distance") if $wifi_distance < 0 or $wifi_distance =~ /\D/;
|
|
|
|
$wifi_country_validated=0;
|
|
foreach my $testcountry (split(',',"00,HX,AD,AE,AL,AM,AN,AR,AT,AU,AW,AZ,BA,BB,BD,BE,BG,BH,BL,BN,BO,BR,BY,BZ,CA,CH,CL,CN,CO,CR,CY,CZ,DE,DK,DO,DZ,EC,EE,EG,ES,FI,FR,GE,GB,GD,GR,GL,GT,GU,HN,HK,HR,HT,HU,ID,IE,IL,IN,IS,IR,IT,JM,JP,JO,KE,KH,KP,KR,KW,KZ,LB,LI,LK,LT,LU,LV,MC,MA,MO,MK,MT,MY,MX,NL,NO,NP,NZ,OM,PA,PE,PG,PH,PK,PL,PT,PR,QA,RO,RS,RU,RW,SA,SE,SG,SI,SK,SV,SY,TW,TH,TT,TN,TR,UA,US,UY,UZ,VE,VN,YE,ZA,ZW")) {
|
|
if ( $testcountry eq $wifi_country ) {
|
|
$wifi_country_validated=1;
|
|
break;
|
|
}
|
|
}
|
|
if ( $wifi_country_validated ne 1 ) {
|
|
$wifi_country="00";
|
|
push (@errors, "Invalid country");
|
|
}
|
|
|
|
|
|
if($lan_proto eq "static")
|
|
{
|
|
if(not validate_netmask($lan_mask))
|
|
{
|
|
push @errors, "invalid LAN netmask";
|
|
}
|
|
elsif($lan_mask !~ /^255\.255\.255\./)
|
|
{
|
|
push @errors, "LAN netmask must begin with 255.255.255";
|
|
}
|
|
elsif(not validate_ip_netmask($lan_ip, $lan_mask))
|
|
{
|
|
push @errors, "invalid LAN IP address";
|
|
}
|
|
else
|
|
{
|
|
if($lan_dhcp)
|
|
{
|
|
my $start_addr = change_ip_address($lan_ip, $dhcp_start);
|
|
my $end_addr = change_ip_address($lan_ip, $dhcp_end);
|
|
|
|
unless(validate_ip_netmask($start_addr, $lan_mask) and
|
|
validate_same_subnet($start_addr, $lan_ip, $lan_mask))
|
|
{
|
|
push @errors, "invalid DHCP start address";
|
|
}
|
|
|
|
unless(validate_ip_netmask($end_addr, $lan_mask) and
|
|
validate_same_subnet($end_addr, $lan_ip, $lan_mask))
|
|
{
|
|
push @errors, "invalid DHCP end address";
|
|
}
|
|
|
|
if($dhcp_start > $dhcp_end)
|
|
{
|
|
push @errors, "invalid DHCP start/end addresses";
|
|
}
|
|
}
|
|
|
|
if($lan_gw and not
|
|
(validate_ip_netmask($lan_gw, $lan_mask) and
|
|
validate_same_subnet($lan_ip, $lan_gw, $lan_mask)))
|
|
{
|
|
push @errors, "invalid LAN gateway";
|
|
}
|
|
}
|
|
}
|
|
|
|
if($wan_proto eq "static")
|
|
{
|
|
if(not validate_netmask($wan_mask))
|
|
{
|
|
push @errors, "invalid WAN netmask";
|
|
}
|
|
elsif(not validate_ip_netmask($wan_ip, $wan_mask))
|
|
{
|
|
push @errors, "invalid WAN IP address";
|
|
}
|
|
else
|
|
{
|
|
unless (validate_ip_netmask($wan_gw, $wan_mask) and
|
|
validate_same_subnet($wan_ip, $wan_gw, $wan_mask))
|
|
{
|
|
push @errors, "invalid WAN gateway";
|
|
}
|
|
}
|
|
}
|
|
|
|
push (@errors, "invalid WAN DNS 1") unless validate_ip($wan_dns1);
|
|
push (@errors, "invalid WAN DNS 2") if $wan_dns2 ne "" and not validate_ip($wan_dns2);
|
|
|
|
|
|
if($passwd1 or $passwd2)
|
|
{
|
|
push (@errors, "passwords do not match") if $passwd1 ne $passwd2;
|
|
push (@errors, "passwords cannot contain '#'") if $passwd1 =~ /#/;
|
|
push (@errors, "password must be changed") if $passwd1 eq "hsmm";
|
|
}
|
|
elsif(-f "/etc/config/unconfigured")
|
|
{
|
|
push @errors, "password must be changed during initial configuration";
|
|
}
|
|
|
|
if($aprs_lat or $aprs_lon)
|
|
{
|
|
push (@errors, "invalid latitude") unless validate_latitude($aprs_lat);
|
|
push (@errors, "invalid longitude") unless validate_longitude($aprs_lon);
|
|
}
|
|
|
|
if($nodetac =~ /\//)
|
|
{
|
|
$nodetac =~ /^\s*([\w\-]+)\s*\/\s*([\w\-]+)\s*$/;
|
|
$node = $1;
|
|
$tactical = $2;
|
|
push(@errors, "invalid node/tactical name") if not $2;
|
|
}
|
|
else
|
|
{
|
|
$node = $nodetac;
|
|
$tactical = "";
|
|
push(@errors, "you must set the node name") if $node eq "";
|
|
}
|
|
|
|
if($node and ($node =~ /[^\w\-]/ or $node =~ /_/))
|
|
{
|
|
push(@errors, "invalid node name");
|
|
}
|
|
|
|
if($tactical =~ /[^\w\-]/ or $tactical =~ /_/)
|
|
{
|
|
push(@errors, "invalid tactical name");
|
|
}
|
|
|
|
if($debug == 3) # don't save the config, just validate it
|
|
{
|
|
push (@errors, "OK") unless @errors;
|
|
}
|
|
|
|
unless(@errors)
|
|
{
|
|
$parms{node} = $node;
|
|
$parms{tactical} = $tactical;
|
|
system "touch /tmp/unconfigured" if -f "/etc/config/unconfigured";
|
|
$rc = save_setup("/etc/config.$config/_setup");
|
|
if(-s "/tmp/web/save/node-setup.out")
|
|
{
|
|
push @errors, `cat /tmp/web/save/node-setup.out`;
|
|
}
|
|
elsif(not $rc)
|
|
{
|
|
push @errors, "error saving setup";
|
|
}
|
|
reboot_page("/cgi-bin/status") if -f "/tmp/unconfigured" and not @errors;
|
|
}
|
|
}
|
|
|
|
system "rm -rf /tmp/web/save";
|
|
reboot_page("/cgi-bin/status") if $parms{button_reboot};
|
|
|
|
|
|
#
|
|
# generate the page
|
|
#
|
|
|
|
http_header() unless $debug == 2;
|
|
html_header(nvram_get("node") . " setup", 1);
|
|
print "<body><center>\n";
|
|
alert_banner();
|
|
print "<form method=post action=/cgi-bin/setup enctype='multipart/form-data'>\n" unless $debug == 2;
|
|
print "<form method=post action=test>\n" if $debug == 2;
|
|
|
|
print "<table width=790>\n";
|
|
print "<tr><td>\n";
|
|
navbar("setup");
|
|
print "</td></tr>\n";
|
|
|
|
#
|
|
# control buttons
|
|
#
|
|
|
|
print "<tr><td align=center>
|
|
<a href='/help.html#setup' target='_blank'>Help</a>
|
|
|
|
<input type=submit name=button_save value='Save Changes' title='Store these settings'>
|
|
<input type=submit name=button_reset value='Reset Values' title='Revert to the last saved settings'>
|
|
<input type=submit name=button_default value='Default Values' title='Set all values to their default'>
|
|
<input type=submit name=button_reboot value=Reboot style='font-weight:bold' title='Immediately reboot this node'>
|
|
</td></tr>
|
|
<tr><td> </td></tr>\n";
|
|
|
|
# messages
|
|
|
|
if(@errors)
|
|
{
|
|
print "<tr><th>Configuration NOT saved!</th></tr>\n";
|
|
print "<tr><td align=center><table>\n";
|
|
print "<tr><td><ul style='padding-left:0'>\n";
|
|
foreach(@errors) { print "<li>$_</li>\n" }
|
|
print "</ul></td></tr></table>\n";
|
|
print "</td></tr>\n";
|
|
}
|
|
elsif($parms{button_save})
|
|
{
|
|
print "<tr><td align=center>";
|
|
print "<b>Configuration saved.</b><br><br>\n";
|
|
print "</td></tr>\n";
|
|
}
|
|
|
|
if(not @errors and -f "/tmp/reboot-required")
|
|
{
|
|
print "<tr><td align=center><h3>Reboot is required for changes to take effect</h3></td></tr>";
|
|
}
|
|
|
|
#
|
|
# node name and type, password
|
|
#
|
|
|
|
print "<tr><td align=center>\n";
|
|
print "<table cellpadding=5 border=0>
|
|
|
|
<tr>
|
|
<td>Node Name</td>
|
|
<td><input type=text name=nodetac value='$nodetac' tabindex=1></td>
|
|
<td align=right>Password</td>
|
|
<td><input type=password name=passwd1 value='$passwd1' size=8 tabindex=2></td>";
|
|
|
|
if(0)#$config eq "mesh")
|
|
{
|
|
print "<td> </td>";
|
|
print "<td align=right>Latitude</td>";
|
|
print "<td><input type=text size=8 name=aprs_lat value='$aprs_lat' tabindex=4></td>\n";
|
|
}
|
|
|
|
print "
|
|
</tr>
|
|
<tr>
|
|
<td>Node Type</td>
|
|
<td><select name=config onChange='form.submit()' tabindex=6>\n";
|
|
selopt("Mesh Node", "mesh", $config);
|
|
selopt("Mesh Access Point", "mesh_ap", $config);
|
|
selopt("Standard Access Point", "ap", $config);
|
|
selopt("Wireless Client", "client", $config);
|
|
selopt("Wired Router", "router", $config);
|
|
#selopt("User", "user", $config, "disabled");
|
|
$oldconfig = $config;
|
|
print "</select></td>
|
|
<td>Verify Password</td>
|
|
<td><input type=password name=passwd2 value='$passwd2' size=8 tabindex=3></td>";
|
|
|
|
if(0)#$config eq "mesh")
|
|
{
|
|
print "<td> </td>";
|
|
print "<td align=right>Longitude</td>";
|
|
print "<td><input type=text size=8 name=aprs_lon value='$aprs_lon' tabindex=5></td>\n";
|
|
}
|
|
|
|
print "
|
|
</tr>
|
|
</table>
|
|
|
|
</td></tr><tr><td>
|
|
<br>
|
|
|
|
<table cellpadding=5 border=1 width=100%>
|
|
<tr><td valign=top width=33%>\n";
|
|
|
|
#
|
|
# WiFi settings
|
|
#
|
|
|
|
print "<table width=100%>
|
|
<tr><th colspan=2>WiFi</th></tr>
|
|
<tr><td>Protocol</td>
|
|
<td>";
|
|
|
|
#if($config ne "user" and $config ne "client")
|
|
if($config ne "user")
|
|
{
|
|
push @hidden, "<input type=hidden name=wifi_proto value='$wifi_proto'>";
|
|
print "<select name=wifi_proto disabled>\n";
|
|
}
|
|
else
|
|
{
|
|
print "<select name=wifi_proto onChange='form.submit()'>\n";
|
|
}
|
|
|
|
$dis = "";
|
|
$dis = "disabled" if $config eq "client";
|
|
selopt("Static", "static", $wifi_proto);
|
|
selopt("DHCP", "dhcp", $wifi_proto);
|
|
selopt("Bridged", "bridged", $wifi_proto, $dis);
|
|
selopt("disabled", "disabled", $wifi_proto, $dis);
|
|
print "</select></td>\n</tr>\n";
|
|
if($wifi_proto eq "static")
|
|
{
|
|
print "<tr><td><nobr>IP Address</nobr></td>\n";
|
|
print "<td><input type=text size=15 name=wifi_ip value='$wifi_ip'></td></tr>\n";
|
|
print "<tr><td>Netmask</td>\n";
|
|
print "<td><input type=text size=15 name=wifi_mask value='$wifi_mask'></td></tr>\n";
|
|
}
|
|
else
|
|
{
|
|
push @hidden, "<input type=hidden name=wifi_ip value='$wifi_ip'>";
|
|
push @hidden, "<input type=hidden name=wifi_mask value='$wifi_mask'>";
|
|
}
|
|
if($wifi_proto ne "disabled")
|
|
{
|
|
print "<tr><td>SSID</td>\n";
|
|
print "<td><input type=text size=15 name=wifi_ssid value='$wifi_ssid'>";
|
|
if ($config eq "mesh")
|
|
{
|
|
print "-$wifi_chanbw-v3</td></tr>\n";
|
|
} else
|
|
{
|
|
print "</td></tr>\n";
|
|
}
|
|
|
|
if($wifi_mode eq "ap")
|
|
{
|
|
print "<tr><td>Hidden</td>";
|
|
print "<td><input type=checkbox name=wifi_hidden value=1";
|
|
print " checked" if $wifi_hidden;
|
|
print "></td></tr>\n";
|
|
}
|
|
|
|
print "<tr><td>Mode</td>\n";
|
|
|
|
if($config ne "user")
|
|
{
|
|
push @hidden, "<input type=hidden name=wifi_mode value='$wifi_mode'>";
|
|
print "<td><select name=wifi_mode disabled>\n";
|
|
} else {
|
|
print "<td><select name=wifi_mode>\n";
|
|
}
|
|
|
|
selopt("Access Point", "ap", $wifi_mode);
|
|
selopt("Client", "sta", $wifi_mode);
|
|
selopt("Ad-Hoc", "adhoc", $wifi_mode);
|
|
print "</select></td></tr>\n";
|
|
|
|
if($wifi_mode ne "sta")
|
|
{
|
|
print "<tr><td>Channel</td>\n";
|
|
print "<td><select name=wifi_channel>\n";
|
|
my $rfchannels=rf_channels_list();
|
|
foreach $channelnumber (sort {$a <=> $b} keys %{$rfchannels} )
|
|
{
|
|
selopt($rfchannels->{$channelnumber}, $channelnumber, $wifi_channel);
|
|
}
|
|
print "</select></td></tr>\n";
|
|
}
|
|
else
|
|
{
|
|
push @hidden, "<input type=hidden name=wifi_channel value='$wifi_channel'>";
|
|
}
|
|
|
|
{
|
|
print "<tr><td>Channel Width</td>\n";
|
|
print "<td><select name=wifi_chanbw>\n";
|
|
selopt("20 MHz","20",$wifi_chanbw);
|
|
selopt("10 MHz","10",$wifi_chanbw);
|
|
selopt("5 MHz","5",$wifi_chanbw);
|
|
print "</select></td></tr>\n";
|
|
}
|
|
|
|
if ($config ne "mesh")
|
|
{
|
|
print "<tr><td>Country</td>\n";
|
|
print "<td><select name=wifi_country>\n";
|
|
foreach my $country (split(',',"00,HX,AD,AE,AL,AM,AN,AR,AT,AU,AW,AZ,BA,BB,BD,BE,BG,BH,BL,BN,BO,BR,BY,BZ,CA,CH,CL,CN,CO,CR,CY,CZ,DE,DK,DO,DZ,EC,EE,EG,ES,FI,FR,GE,GB,GD,GR,GL,GT,GU,HN,HK,HR,HT,HU,ID,IE,IL,IN,IS,IR,IT,JM,JP,JO,KE,KH,KP,KR,KW,KZ,LB,LI,LK,LT,LU,LV,MC,MA,MO,MK,MT,MY,MX,NL,NO,NP,NZ,OM,PA,PE,PG,PH,PK,PL,PT,PR,QA,RO,RS,RU,RW,SA,SE,SG,SI,SK,SV,SY,TW,TH,TT,TN,TR,UA,US,UY,UZ,VE,VN,YE,ZA,ZW")) {
|
|
selopt($country,$country,$wifi_country)
|
|
}
|
|
print "</select></td></tr>\n";
|
|
}
|
|
else
|
|
{
|
|
push (@hidden, "<input type=hidden name=wifi_country value='HX'>");
|
|
}
|
|
|
|
print "<tr><td colspan=2 align=center><hr><small>Active Settings</small></td></tr>\n";
|
|
|
|
print "<tr><td><nobr>Rx Antenna</nobr></td>\n";
|
|
print "<td><select name=wifi_rxant>\n";
|
|
$validants = wifi_validant();
|
|
while (($value, $name) = each (%{$validants})){
|
|
selopt($name, $value, $wifi_rxant);
|
|
}
|
|
print "</select></td></tr>\n";
|
|
|
|
print "<tr><td><nobr>Tx Antenna</nobr></td>\n";
|
|
print "<td><select name=wifi_txant>\n";
|
|
while (($value, $name) = each (%{$validants})){
|
|
selopt($name, $value, $wifi_txant);
|
|
}
|
|
print "</select></td></tr>\n";
|
|
|
|
print "<tr><td><nobr>Tx Power</nobr></td>\n";
|
|
print "<td><select name=wifi_txpower>\n";
|
|
my $txpoweroffset = wifi_txpoweroffset();
|
|
for($i = wifi_maxpower(); $i >= 1; --$i) { selopt($i+$txpoweroffset ." dBm", $i, $wifi_txpower) }
|
|
print "</select></td></tr>\n";
|
|
|
|
print "<tr><td>Distance</td>\n";
|
|
print "<td><input type=text size=8 name=wifi_distance value='$wifi_distance' title='Distance in meters to the farthest neighbor; 0=automatic'></td></tr>\n";
|
|
|
|
print "<tr><td></td><td><input type=submit name=button_apply value=Apply title='Immediately use these active settings'></td></tr>\n";
|
|
}
|
|
else
|
|
{
|
|
push @hidden, "<input type=hidden name=wifi_ssid value='$wifi_ssid'>";
|
|
push @hidden, "<input type=hidden name=wifi_mode value='$wifi_mode'>";
|
|
push @hidden, "<input type=hidden name=wifi_channel value='$wifi_channel'>";
|
|
}
|
|
print "</table></td>\n";
|
|
|
|
|
|
#
|
|
# LAN settings
|
|
#
|
|
|
|
print "<td valign=top width=33%><table width=100%>
|
|
<tr><th colspan=2>LAN</th></tr>
|
|
<tr>
|
|
<td>LAN Mode</td>
|
|
<td><select name=dmz_mode onChange='form.submit()'";
|
|
print " disabled" unless $config eq "mesh";
|
|
print ">\n";
|
|
selopt("NAT", 0, $dmz_mode);
|
|
selopt("1 host Direct", 2, $dmz_mode);
|
|
selopt("5 host Direct", 3, $dmz_mode);
|
|
selopt("13 host Direct", 4, $dmz_mode);
|
|
print "</select></td>\n</tr>\n";
|
|
push @hidden, "<input type=hidden name=lan_proto value='static'>";
|
|
|
|
if($dmz_mode)
|
|
{
|
|
print "<tr><td><nobr>IP Address</nobr></td>";
|
|
#print "<td><input type=text size=15 name=dmz_lan_ip value='$dmz_lan_ip' disabled></td></tr>\n";
|
|
print "<td>$dmz_lan_ip</td></tr>\n";
|
|
push @hidden, "<input type=hidden name=dmz_lan_ip value='$dmz_lan_ip'>";
|
|
|
|
print "<tr><td>Netmask</td>";
|
|
#print "<td><input type=text size=15 name=dmz_lan_mask value='$dmz_lan_mask' disabled></td></tr>\n";
|
|
print "<td>$dmz_lan_mask</td></tr>\n";
|
|
push @hidden, "<input type=hidden name=dmz_lan_mask value='$dmz_lan_mask'>";
|
|
|
|
print "<tr><td><nobr>DHCP Server</nobr></td>";
|
|
print "<td><input type=checkbox name=lan_dhcp value=1";
|
|
print " checked" if $lan_dhcp;
|
|
print "></td></tr>\n";
|
|
|
|
print "<tr><td><nobr>DHCP Start</nobr></td>";
|
|
#print "<td><input type=text size=4 name=dmz_dhcp_start value='$dmz_dhcp_start' disabled></td></tr>\n";
|
|
print "<td>$dmz_dhcp_start</td></tr>\n";
|
|
push @hidden, "<input type=hidden name=dmz_dhcp_start value='$dmz_dhcp_start'>";
|
|
|
|
print "<tr><td><nobr>DHCP End</nobr></td>";
|
|
#print "<td><input type=text size=4 name=dmz_dhcp_end value='$dmz_dhcp_end' disabled></td></tr>\n";
|
|
print "<td>$dmz_dhcp_end</td></tr>\n";
|
|
|
|
print "<tr><td colspan=2><hr></hr></td></tr>";
|
|
print "<tr><th colspan=2>Advanced</th></tr>";
|
|
|
|
print "<tr><td>Disable<br>Default Route</td>";
|
|
print "<td><input type=checkbox name=lan_dhcp_noroute value=1";
|
|
print " checked" if $lan_dhcp_noroute;
|
|
print "></td></tr>\n";
|
|
|
|
push @hidden, "<input type=hidden name=dmz_dhcp_end value='$dmz_dhcp_end'>";
|
|
|
|
push @hidden, "<input type=hidden name=dmz_dhcp_limit value='$dmz_dhcp_limit'>";
|
|
|
|
push @hidden, "<input type=hidden name=lan_ip value='$lan_ip'>";
|
|
push @hidden, "<input type=hidden name=lan_mask value='$lan_mask'>";
|
|
push @hidden, "<input type=hidden name=dhcp_start value='$dhcp_start'>";
|
|
push @hidden, "<input type=hidden name=dhcp_end value='$dhcp_end'>";
|
|
}
|
|
else
|
|
{
|
|
print "<tr><td><nobr>IP Address</nobr></td>";
|
|
print "<td><input type=text size=15 name=lan_ip value='$lan_ip'></td></tr>\n";
|
|
|
|
print "<tr><td>Netmask</td>";
|
|
print "<td><input type=text size=15 name=lan_mask value='$lan_mask'></td></tr>\n";
|
|
|
|
if($wan_proto eq "disabled" and $wifi_proto ne "dhcp")
|
|
{
|
|
print "<tr><td>Gateway</td>";
|
|
print "<td><input type=text size=15 name=lan_gw value='$lan_gw' title='leave blank if not needed'></td></tr>\n";
|
|
}
|
|
|
|
print "<tr><td><nobr>DHCP Server</nobr></td>";
|
|
print "<td><input type=checkbox name=lan_dhcp value=1";
|
|
if($config eq "mesh_ap")
|
|
{
|
|
print " disabled";
|
|
push @hidden, "<input type=hidden name=lan_dhcp value='$lan_dhcp'>";
|
|
}
|
|
print " checked" if $lan_dhcp;
|
|
print "></td></tr>\n";
|
|
|
|
print "<tr><td><nobr>DHCP Start</nobr></td>";
|
|
print "<td><input type=text size=4 name=dhcp_start value='$dhcp_start'";
|
|
if($config eq "mesh_ap")
|
|
{
|
|
print " disabled";
|
|
push @hidden, "<input type=hidden name=dhcp_start value='$dhcp_start'>";
|
|
}
|
|
print "></td></tr>\n";
|
|
|
|
print "<tr><td><nobr>DHCP End</nobr></td>";
|
|
print "<td><input type=text size=4 name=dhcp_end value='$dhcp_end'";
|
|
if($config eq "mesh_ap")
|
|
{
|
|
print " disabled";
|
|
push @hidden, "<input type=hidden name=dhcp_end value='$dhcp_end'>";
|
|
}
|
|
print "></td></tr>\n";
|
|
|
|
push @hidden, "<input type=hidden name=dhcp_limit value='$dhcp_limit'>";
|
|
|
|
push @hidden, "<input type=hidden name=dmz_lan_ip value='$dmz_lan_ip'>";
|
|
push @hidden, "<input type=hidden name=dmz_lan_mask value='$dmz_lan_mask'>";
|
|
push @hidden, "<input type=hidden name=dmz_dhcp_start value='$dmz_dhcp_start'>";
|
|
push @hidden, "<input type=hidden name=dmz_dhcp_end value='$dmz_dhcp_end'>";
|
|
}
|
|
|
|
if($config eq "mesh" and 0) # disable for now
|
|
{
|
|
print "<tr><td colspan=2><hr></td></tr>\n";
|
|
print "<tr><td><nobr><i>Mesh Bridge</i></nobr></td>\n";
|
|
print "<td><input type=checkbox name=olsrd_bridge value=1";
|
|
print " checked" if $olsrd_bridge;
|
|
print "></td></tr>\n";
|
|
}
|
|
|
|
print "</table></td>\n";
|
|
|
|
|
|
#
|
|
# WAN settings
|
|
#
|
|
|
|
print "<td valign=top width=33%><table width=100%>
|
|
<tr><th colspan=2>WAN</th></tr>
|
|
<tr>
|
|
<td width=50%>Protocol</td>\n";
|
|
|
|
if($config ne "client" and $config ne "mesh_ap")
|
|
{
|
|
print "<td><select name=wan_proto onChange='form.submit()'>\n";
|
|
}
|
|
else
|
|
{
|
|
push @hidden, "<input type=hidden name=wan_proto value='$wan_proto'>";
|
|
print "<td><select name=wan_proto disabled>\n";
|
|
}
|
|
|
|
selopt("Static", "static", $wan_proto);
|
|
selopt("DHCP", "dhcp", $wan_proto);
|
|
selopt("disabled", "disabled", $wan_proto);
|
|
print "</select></td>\n</tr>\n";
|
|
|
|
if($wan_proto eq "static")
|
|
{
|
|
print "<tr><td><nobr>IP Address</nobr></td>\n";
|
|
print "<td><input type=text size=15 name=wan_ip value='$wan_ip'></td></tr>\n";
|
|
print "<tr><td>Netmask</td>\n";
|
|
print "<td><input type=text size=15 name=wan_mask value='$wan_mask'></td></tr>\n";
|
|
print "<tr><td>Gateway</td>\n";
|
|
print "<td><input type=text size=15 name=wan_gw value='$wan_gw'></td></tr>\n";
|
|
}
|
|
else
|
|
{
|
|
push @hidden, "<input type=hidden name=wan_ip value='$wan_ip'>";
|
|
push @hidden, "<input type=hidden name=wan_mask value='$wan_mask'>";
|
|
push @hidden, "<input type=hidden name=wan_gw value='$wan_gw'>";
|
|
}
|
|
|
|
print "<tr><td><nobr>DNS 1</nobr></td>\n";
|
|
print "<td><input type=text size=15 name=wan_dns1 value='$wan_dns1'></td></tr>\n";
|
|
print "<tr><td><nobr>DNS 2</nobr></td>\n";
|
|
print "<td><input type=text size=15 name=wan_dns2 value='$wan_dns2'></td></tr>\n";
|
|
|
|
if($config eq "mesh")
|
|
{
|
|
print "<tr><td colspan=2><hr></td></tr>\n";
|
|
print "<tr><td><nobr>Mesh Gateway</nobr></td>\n";
|
|
print "<td><input type=checkbox name=olsrd_gw value=1 title='Allow this node to provide internet access to all other nodes'";
|
|
print " checked" if $olsrd_gw;
|
|
print "></td></tr>\n";
|
|
}
|
|
|
|
print "</table>
|
|
|
|
</td></tr>
|
|
</table><br>
|
|
|
|
</td></tr>\n";
|
|
|
|
print "</table>\n";
|
|
|
|
push @hidden, "<input type=hidden name=oldconfig value='$oldconfig'>";
|
|
push @hidden, "<input type=hidden name=reload value=1>";
|
|
push @hidden, "<input type=hidden name=dtdlink_ip value='$dtdlink_ip'>";
|
|
foreach(@hidden) { print "$_\n" }
|
|
|
|
print "</form></center>\n";
|
|
|
|
show_debug_info();
|
|
|
|
if($debug)
|
|
{
|
|
print "<br><b>config</b><br>\n";
|
|
foreach(sort keys %cfg)
|
|
{
|
|
$tmp = $cfg{$_};
|
|
$tmp =~ s/ /\(space\)/g;
|
|
if($cfg{$_} eq "") { print "$_ = (null)<br>\n" }
|
|
else { print "$_ = $tmp<br>\n" }
|
|
}
|
|
}
|
|
|
|
show_parse_errors();
|
|
|
|
page_footer();
|
|
print "</body>\n";
|
|
print "</html>\n";
|