#!/usr/bin/perl =for comment Part of AREDN -- Used for creating Amateur Radio Emergency Data Networks Copyright (C) 2019 Joe Ayers AE6XE 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 . 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 contained 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; use ucifunc; # # load the config parms # # test for web connectivity (for maps) $pingOk=is_online(); @output = (); @errors = (); read_postdata(); my $tz_db_strings = tz_names_hash(); my $tz_db_names = tz_names_array(); $wifiintf = get_interface("wifi"); $phy = get_wlan2phy("$wifiintf"); chomp ($phycount = `ls -1d /sys/class/ieee80211/* | wc -l`); my @ctwo=(1,2,3,4,5,6,7,8,9,10,11); my @cfive=(36,40,44,48,149,153,157,161,165); if($parms{button_uploaddata}) { my $si=`curl 'http://localnode:8080/cgi-bin/sysinfo.json?hosts=1' 2>/dev/null`; # strip closing }\n from si chomp($si); chop($si); # get olsrd topo information my $topo=`curl 'http://localnode:9090/links' 2>/dev/null`; chomp($topo); # add topo subdoc and close root doc my $newsi= sprintf "%s,\"olsr\": %s}",$si, $topo; # PUT it to the server my $upcurl=`curl -H 'Accept: application/json' -X PUT -d '$newsi' http://data.arednmesh.org/sysinfo`; if($? == 0) { push @output, "AREDN online map updated"; } else { push @errors, "ERROR: Cannot update online map. Please ensure this node has access to the internet."; } } # convert the %parms into scalars for convenience if($parms{button_default}) { load_cfg("/etc/config.mesh/_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 not keys %parms) { load_cfg("/etc/config.mesh/_setup"); foreach(keys %cfg) { eval (sprintf "\$$_ = \"%s\"", quotemeta $cfg{$_}); } $wifi2_key =~ s/([a-f0-9][a-f0-9])/chr(hex($1))/eg; $wifi2_ssid =~ s/([a-f0-9][a-f0-9])/chr(hex($1))/eg; $wifi3_key =~ s/([a-f0-9][a-f0-9])/chr(hex($1))/eg; $wifi3_ssid =~ s/([a-f0-9][a-f0-9])/chr(hex($1))/eg; } } 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 wifi2_enable lan_dhcp_noroute wifi_enable wifi3_enable)) { $parms{$_} = 0 unless $parms{$_}; } # lan is always static $lan_proto = "static"; # enforce direct mode settings # (formerly known as dmz mode) $dmz_mode = 2 if $dmz_mode != 0 and $dmz_mode < 2; $dmz_mode = 5 if $dmz_mode > 5; 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_end - $dhcp_start + 1; $parms{dmz_dhcp_limit} = $dmz_dhcp_end - $dmz_dhcp_start + 1; # # get the active wifi settings on a fresh page load # unless($parms{reload}) { ($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; } } # sanitize the active settings $wifi_txpower = wifi_maxpower($wifi_channel) if not defined $wifi_txpower or $wifi_txpower > wifi_maxpower($wifi_channel); $wifi_txpower = 1 if $wifi_txpower < 1; $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; # # apply the wifi settings # if(($parms{button_apply} or $parms{button_save}) and $wifi_enable ) { if($wifi_distance < 0 or $wifi_distance =~ /\D/) { push (@errors, "invalid distance value"); } else { $cmd = ""; if ( $wifi_distance eq "0" ) { $cmd .= "iw phy ${phy} set distance auto >/dev/null 2>&1;"; } else { $cmd .= "iw phy ${phy} set distance $wifi_distance >/dev/null 2>&1;"; } $cmd .= "iw dev $wifiintf set txpower fixed ${wifi_txpower}00 >/dev/null 2>&1;"; system $cmd; } } if($parms{button_updatelocation}) { # Process gridsquare ----------------------------------- if($parms{gridsquare}) { # validate values if($parms{gridsquare} =~ /^[A-Z][A-Z]\d\d[a-z][a-z]$/) { # delete/define file unlink("/etc/gridsquare") if(-f "/etc/gridsquare"); my $rcgood=open(my $gs, ">", "/etc/gridsquare"); push @errors, "Cannot open gridsquare file" unless $rcgood; print $gs "$parms{gridsquare}\n"; close($gs); push @output, "Gridsquare updated.\n"; } else { push @errors, "ERROR: Gridsquare format is: 2-uppercase letters, 2-digits, 2-lowercase letters. (AB12cd)\n"; } } else { unlink("/etc/gridsquare") if(-f "/etc/gridsquare"); push @output, "Gridsquare purged.\n"; } # Process LAT/LNG --------------------------------------------- if($parms{latitude} and $parms{longitude}) { # validate values if($parms{latitude} =~ /^([-+]?\d{1,2}([.]\d+)?)$/ and $parms{longitude} =~ /^([-+]?\d{1,3}([.]\d+)?)$/) { if($parms{latitude} >= -90 and $parms{latitude} <= 90 and $parms{longitude} >= -180 and $parms{longitude} <= 180) { # delete/define file unlink("/etc/latlon") if(-f "/etc/latlon"); $rcgood=open(my $ll, ">", "/etc/latlon"); push @errors, "Cannot open lat/lon file" unless $rcgood; print $ll "$parms{latitude}\n"; print $ll "$parms{longitude}\n"; close($ll); push @output, "Lat/lon updated.\n"; } else { push @errors, "ERROR: Lat/lon values must be between -90/90 and -180/180, respectively.\n"; } } else { push @errors, "ERROR: Lat/lon format is decimal: (ex. 30.121456 or -95.911154)\n"; } } else { unlink("/etc/latlon") if(-f "/etc/latlon"); push @output, "Lat/lon purged.\n"; } } # # retrieve location data # if(-f "/etc/latlon") { $rcgood=open(FILE, "/etc/latlon"); push @errors, "ERROR: reading lat/lon data\n" unless $rcgood; while(){ chomp; push @lines,$_; } close(FILE); $lat=$lines[0]; $lon=$lines[1]; } @lines=(); if(-f "/etc/gridsquare") { $rcgood=open(FILE, "/etc/gridsquare"); push @errors, "ERROR: reading gridsquare data\n" unless $rcgood; while(){ chomp; push @lines,$_; } close(FILE); $gridsquare=$lines[0]; } # validate and save configuration if($parms{button_save}) { # lookup the tz string for the selected time_zone $time_zone = $$tz_db_strings{$time_zone_name}; $parms{time_zone} = $time_zone; if(not validate_netmask($wifi_mask)) { push @errors, "invalid Mesh netmask"; } elsif(not validate_ip_netmask($wifi_ip, $wifi_mask)) { push @errors, "invalid Mesh IP address"; } push (@errors, "invalid Mesh RF SSID") unless length $wifi_ssid <= 32; if ( is_channel_valid($wifi_channel) != 1 ) { push (@errors, "invalid Mesh RF channel") } if ( !is_wifi_chanbw_valid($wifi_chanbw,$wifi_ssid) ) { push (@errors, "Invalid Mesh RF channel width"); $wifi_chanbw = 20; } $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; last; } } 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($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($ntp_server eq '' || validate_fqdn($ntp_server) == 0) { push(@errors, "invalid ntp server"); } if( length( $wifi2_ssid ) > 32 ) { push (@errors, "LAN Access Point SSID must be 32 or less characters "); } if( "$wifi2_enable" eq "1" and (length( $wifi2_key ) < 8 or length($wifi2_key) > 64) ) { push (@errors, "LAN Access Point Password must be at least 8 characters, up to 64"); } if( "$wifi3_enable" eq "1" and (length( $wifi3_key ) < 8 or length($wifi3_key) > 64) and ! length($wifi3_key) == 0) { push (@errors, "WAN Wifi Client Password must be between 8 and 64 characters"); } if( "$wifi2_enable" eq "1" and ( $wifi2_key =~ /\'/ or $wifi2_ssid =~ /\'/ )) { push (@errors, "The LAN Access Point password and ssid may not contain a single quote character"); } if( "$wifi3_enable" eq "1" and ( $wifi3_key =~ /\'/ or $wifi3_ssid =~ /\'/ )) { push (@errors, "The WAN Wifi Client password and ssid may not contain a single quote character"); } if ( $wifi2_channel < 30 and "$wifi2_hwmode" eq "11a" ) { push (@errors, "Changed to 5GHz Mesh LAN AP, please review channel selection"); } if ( $wifi2_channel > 30 and "$wifi2_hwmode" eq "11g" ) { push (@errors, "Changed to 2GHz Mesh LAN AP, please review channel slection"); } if ( $phycount > 1 and $wifi_enable and $wifi2_channel < 36 and $wifi2_enable ) { push (@errors, "Mesh RF and LAN Access Point can not both use the same wireless card, review LAN AP settings"); } if ( $phycount > 1 and ! $wifi_enable and $wifi2_hwmode eq $wifi3_hwmode ) { push (@errors, "Some settings auto updated to avoid conflicts, please review and save one more time"); } if ( $wifi_enable and $wifi2_enable and $wifi3_enable ) { push (@errors, "Can not enable Mesh RF, LAN AP, and WAN Wifi Client with only 2 wireless cards, WAN Wifi Client turned off"); $wifi3_enable = 0; } if ( $phycount == 1 and $wifi_enable and ($wifi2_enable or $wifi3_enable )) { push (@errors, "Can not enable Mesh RF along with LAN AP or WAN Wifi Client. Only Mesh RF enabled now, please review settings."); $wifi2_enable = 0; $wifi3_enable = 0; } 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"; $parms{wifi2_key} =~ s/(.)/sprintf("%x",ord($1))/eg; $parms{wifi2_ssid} =~ s/(.)/sprintf("%x",ord($1))/eg; $parms{wifi3_key} =~ s/(.)/sprintf("%x",ord($1))/eg; $parms{wifi3_ssid} =~ s/(.)/sprintf("%x",ord($1))/eg; $rc = save_setup("/etc/config.mesh/_setup"); $rc2 = &uci_commit("system"); 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}; # # retrieve node description # $desc = &uci_get_indexed_option("system", "system", 0, "description"); # # Retreive map url, css, and js locations # my ($rc, $maptiles, $leafletcss, $leafletjs); ($rc, $maptiles)=&uci_get_indexed_option("aredn","map",0,"maptiles"); ($rc, $leafletcss)=&uci_get_indexed_option("aredn","map",0,"leafletcss"); ($rc, $leafletjs)=&uci_get_indexed_option("aredn","map",0,"leafletjs"); # # generate the page # http_header() unless $debug == 2; html_header(nvram_get("node") . " setup", 0); if(($pingOk) || ($leafletcss =~ ".local.mesh")) { print "\n"; } if(($pingOk) || ($leafletjs =~ ".local.mesh")) { print "\n"; } print ""; print "
\n"; print " "; alert_banner(); print "
\n" unless $debug == 2; print "\n" if $debug == 2; print "\n"; print "\n"; # # control buttons # print "\n"; # messages if(@output) { # print "\n"; print "\n"; } if(@errors) { print "\n"; print "\n"; } elsif($parms{button_save}) { print "\n"; } if(not @errors and -f "/tmp/reboot-required") { print ""; } # # node name and type, password # print ""; print "
\n"; navbar("setup"); print "
Help          
 
Configuration NOT saved!
\n"; print "
    \n"; foreach(@output) { print "
  • $_
  • \n" } print "
\n"; print "
Configuration NOT saved!
\n"; print "
    \n"; foreach(@errors) { print "
  • $_
  • \n" } print "
\n"; print "
"; print "Configuration saved.

\n"; print "

Reboot is required for changes to take effect

\n"; print ""; if(0)# disable for now { print ""; print ""; print "\n"; } print " "; push @hidden, ""; print " "; print "
Node Name Password  Latitude
Node Description (optional) Verify Password

"; print "\n"; # # LAN settings # print "\n"; # # WAN settings # print "\n"; print "
\n"; # # MESH RF settings # print ""; if ( $phycount > 1 ) { print " "; } else { print " "; } push @hidden, ""; # add enable/disable # print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; # Reset wifi channel/bandwidth to default if ( -f "/etc/config/unconfigured" || $parms{button_reset} ) { my $defaultwifi = rf_default_channel(); $wifi_channel = $defaultwifi->{'channel'}; $wifi_chanbw = $defaultwifi->{'chanbw'}; } if ( ${wifi_enable} ) { print "\n"; print "\n"; push @hidden, ""; print "\n"; print "\n"; print "\n"; print "\n"; push (@hidden, ""); print "\n"; print "\n"; print "\n"; print "\n"; $wifi_distance=int($wifi_distance); # in meters $wifi_distance_disp_km=int($wifi_distance/1000); $wifi_distance_disp_miles=sprintf("%.2f",$wifi_distance_disp_km*.621371192); print "\n"; print "\n"; } else { push @hidden, ""; push @hidden, ""; push @hidden, ""; push @hidden, ""; push @hidden, ""; push @hidden, ""; push (@hidden, ""); } print "
Mesh RF (2GHz)
Mesh RF
Enable
IP Address
Netmask
SSID"; print "-$wifi_chanbw-v3
Channel
Channel Width

Active Settings
Tx Power  
Distance to
FARTHEST Neighbor

'0' is auto

 mi
"; print " km
"; print " m
"; print "
"; print ""; print "
\n\n"; push @hidden, ""; if($dmz_mode) { print ""; #print "\n"; print "\n"; push @hidden, ""; print ""; #print "\n"; print "\n"; push @hidden, ""; print ""; print "\n"; print ""; #print "\n"; print "\n"; push @hidden, ""; print ""; #print "\n"; print "\n"; push @hidden, ""; push @hidden, ""; push @hidden, ""; push @hidden, ""; push @hidden, ""; } else { print ""; print "\n"; print ""; print "\n"; if($wan_proto eq "disabled") { print ""; print "\n"; } else { push @hidden, ""; } print ""; print "\n"; print ""; print "\n"; print ""; print "\n"; push @hidden, ""; push @hidden, ""; push @hidden, ""; push @hidden, ""; } print ""; $M39model = `/usr/local/bin/get_model | grep -e "M[39]"`; if ( ($phycount > 1 and (! $wifi_enable or ! $wifi3_enable)) or ($phycount == 1 and ! $wifi_enable and ! $wifi3_enable ) and ! $M39model ) { # LAN AP shows as an option # Determine hardware options and set band and channels accordingly if ($phycount == 1) { $rc3 = system("iw phy phy0 info | grep -q '5180 MHz' > /dev/null"); if ( $rc3 ) { $wifi2_hwmode="11g"; if ( $wifi2_channel > 14 ) { $wifi2_channel = 1; } @chan=@ctwo; } else { $wifi2_hwmode="11a"; if ( $wifi2_channel < 36 ) { $wifi2_channel = 36; } @chan=@cfive; } } else { # 2 band device if ( $wifi_enable == 1 ) { $wifi2_hwmode="11a"; if ( $wifi2_channel < 36 ) { $wifi2_channel = 36; } @chan=@cfive; } else { if ( ! $wifi2_enable and $wifi3_enable and $wifi3_hwmode eq "11a" ) { $wifi2_hwmode = "11g"; } if ( ! $wifi2_enable and $wifi3_enable and $wifi3_hwmode eq "11g" ) { $wifi2_hwmode = "11a"; } if ( $wifi2_hwmode eq "11a" ) { if ( $wifi2_channel < 36 ) { $wifi2_channel = 36; } @chan=@cfive; } else { if ( $wifi2_channel > 14 ) { $wifi2_channel = 1; } @chan=@ctwo; } } } print ""; print ""; print "\n"; if ( $phycount > 1 ) { print "\n"; print "\n"; } else { push @hidden, ""; } print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } else { push @hidden, ""; push @hidden, ""; push @hidden, ""; push @hidden, ""; push @hidden, ""; push @hidden, ""; } if(0) # disable for now { print "\n"; print "\n"; print "\n"; } print "
LAN
LAN Mode
IP Address
$dmz_lan_ip
Netmask
$dmz_lan_mask
DHCP Server
DHCP Start
$dmz_dhcp_start
DHCP End
$dmz_dhcp_end
IP Address
Netmask
Gateway
DHCP Server
DHCP Start
DHCP End

LAN Access Point
Enable
AP band
SSID
Channel
Encryption
Password"; print "

Mesh Bridge
\n"; print "\n\n"; if($wan_proto eq "static") { print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } else { push @hidden, ""; push @hidden, ""; push @hidden, ""; } print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print ""; if ( $wan_proto ne "disabled" ) { print "\n"; print "\n"; } else { push @hidden, ""; } print "\n"; print "\n"; # WAN wifi Client if ( ($phycount > 1 and (! $wifi_enable or ! $wifi2_enable)) or ($phycount == 1 and ! $wifi_enable and ! $wifi2_enable ) and ! $M39model ) { # Wifi Client shows as an option # Determine hardware options and set band accordingly if ($phycount == 1) { $rc3 = system("iw phy phy0 info | grep -q '5180 MHz' > /dev/null"); if ( $rc3 ) { $wifi3_hwmode="11g"; } else { $wifi3_hwmode="11a"; } } else { # 2 band device if ( $wifi_enable ) { $wifi3_hwmode="11a"; } else { if ( $wifi2_hwmode eq "11g" and $wifi2_enable ) { $wifi3_hwmode = "11a"; } if ( $wifi2_hwmode eq "11a" and $wifi2_enable ) { $wifi3_hwmode="11g"; } } } print "\n"; print ""; print ""; print "\n"; if ( ! $wifi_enable and ! $wifi2_enable and $phycount > 1) { print "\n"; print "\n"; } else { push @hidden, ""; } # for (my $i=0; $i<5; $i++) # { # @wan_ssids=`iw dev wlan0 scan passive | egrep "SSID:\\s\\S+" | cut -f 2 -d\\ | sort -u`; # last if @wan_ssids; # sleep 1; # } print "\n"; print "\n"; print "\n"; print "\n"; } else { push @hidden, ""; push @hidden, ""; push @hidden, ""; push @hidden, ""; } # end WAN wifi Client print "
WAN
Protocol
IP Address
Netmask
Gateway
DNS 1
DNS 2

Advanced WAN Access
Allow others to
use my WAN
Prevent LAN devices
from accessing WAN

WAN Wifi Client
Enable
WAN Wifi Client band
SSID\n"; print "
Password"; print "
\n

\n"; # # Optional Settings # print "\n"; print ""; print ""; print ""; print "\n"; print ""; print "\n"; print ""; print ""; print ""; print "
Optional Settings

Latitude"; print " "; print ""; print "  "; if($pingOk) { print " "; } else { print " "; } print "
LongitudeGrid Square

Timezone NTP Server
"; print "\n"; push @hidden, ""; push @hidden, ""; foreach(@hidden) { print "$_\n" } print "
\n"; show_debug_info(); if($debug) { print "
config
\n"; foreach(sort keys %cfg) { $tmp = $cfg{$_}; $tmp =~ s/ /\(space\)/g; if($cfg{$_} eq "") { print "$_ = (null)
\n" } else { print "$_ = $tmp
\n" } } } show_parse_errors(); page_footer(); print < function doSubmit() { var desc_text = document.mainForm.description_node.value; var singleLine = desc_text.replace(new RegExp( "\\n", "g" ), " "); document.mainForm.description_node.value = singleLine; return true; } var map = L.map('map').setView([0.0, 0.0], 1); var dotIcon = L.icon({iconUrl: '/dot.png'}); EOF print "L.tileLayer('$maptiles',"; print <OpenStreetMap contributors, ' + 'CC-BY-SA, ' + 'Imagery ©Mapbox', id: 'mapbox.streets' }).addTo(map); var marker; function onMapClick(e) { marker= new L.marker(e.latlng.wrap(),{draggable: true, icon: dotIcon}); map.addLayer(marker); document.getElementsByName('latitude')[0].value=e.latlng.wrap().lat.toFixed(6).toString(); document.getElementsByName('longitude')[0].value=e.latlng.wrap().lng.toFixed(6).toString(); map.off('click', onMapClick); marker.on('drag', onMarkerDrag); } EOF if($lat and $lon) { print "marker= new L.marker([$lat,$lon],{draggable: true, icon: dotIcon});"; print "map.addLayer(marker);"; print "map.setView([$lat,$lon],13);"; print "marker.on('drag', onMarkerDrag);"; } else { print "map.on('click', onMapClick);"; } print < EOF #} print "\n"; print "\n";