################################# # get base network from config - CHANGE FOR UCI ################################# sub get_server_network_address() { my @list =(); my $server_net=`uci get vtun.@network[0].start`; if($server_net ne "") { # to facilitate overrides (ie. moving the server to a new node) # read the file into $mac @list = split('\.', $server_net); } else { # or, calc based on eth0 mac address, then store it. $mac=get_mac("eth0"); @MACS=split(/:/, $mac); push @list, "172"; push @list, "31"; push @list, hex @MACS[5]; # strip off the high bits push @list, ((hex @MACS[4]) << 2) & 255; $server_net=sprintf("%d.%d.%d.%d",@list[0],@list[1],@list[2],@list[3]); system "uci add vtun network"; system "uci set vtun.@network[0].start='${server_net}'"; system "uci commit vtun"; } return @list; } sub get_active_tun() { my @active_tun; foreach(`ps -w|grep vtun|grep ' tun '`) { @parts = $_ =~ /.*\:.*-(172-31-.*)\stun\stun.*/g;1; @parts[0] =~ s/\-/\./g; push(@active_tun,@parts[0]); } return @active_tun; } # INPUT arg: Array of active tunnel IP's, IP of the tunnel network you are checking sub is_tunnel_active() { my ($n, @active_tun) = @_; my $match=0; foreach(@active_tun){ #print "a=$_, n=$n\n"; if($n eq $_) { $match = 1; last; } } return $match; # the return value of the do block } # Get hardware model/type #sub get_model() #{ # $model_full=`/usr/local/bin/get_model`; # if($model_full=~ m/ubiquiti.*/i) { # $model="UBNT"; # } else { # $model="LS"; # } #} ########################## # Add OLSRD interfaces - called when adding a new client connection ########################## sub add_olsrd_interface() { my ($tunnum) = @_; # uci add_list olsrd.interface=vpn${tunnumber} # uci commit vtundsrv #config Interface # list interface 'vpn50 vpn51 vpn52 vpn53 vpn54 vpn55 vpn56 vpn57 vpn58 vpn59' # option Ip4Broadcast 255.255.255.255 } ########################## # Delete OLSRD interfaces - called when deleting a new client connection ########################## sub del_olsrd_interface() { my ($tunnum) = @_; # uci delete_list olsrd.interface.vpn${tunnumber} # uci commit vtundsrv #config Interface # list interface 'vpn50 vpn51 vpn52 vpn53 vpn54 vpn55 vpn56 vpn57 vpn58 vpn59' # option Ip4Broadcast 255.255.255.255 } ########################## # Add network interfaces tun50 thru tun69 - called on install ########################## sub add_network_interfaces() { for ($tunnum = 50; $tunnum <= 69; $tunnum++) { system "uci set network.vpn${tunnum}=interface"; system "uci set network.vpn${tunnum}.ifname='tun${tunnum}"; system "uci set network.vpn${tunnum}.proto='none'"; } system "uci commit network"; } ########################## # Delete OLSRD interfaces - called when deleting a new client connection ########################## sub del_olsrd_interface() { my ($tunnum) = @_; # uci delete_list olsrd.interface.vpn${tunnumber} # uci commit vtundsrv # } ################################# # Check Freespace on / filesystem ################################# sub check_freespace() { my $fs = `df / | grep -v '^Filesystem' | awk 'NF=6{print \$4}NF==5{print \$3}{}'`; chomp $fs; return $fs; } ########################## # Config firewall to allow port 5525 on WAN interface ########################## sub open_5525_on_wan() { system "uci add firewall rule >/dev/null 2>&1"; system "uci set firewall.\@rule[-1].src='wan' >/dev/null 2>&1"; system "uci set firewall.\@rule[-1].dest_port='5525' >/dev/null 2>&1"; system "uci set firewall.\@rule[-1].proto='tcp' >/dev/null 2>&1"; system "uci set firewall.\@rule[-1].target='ACCEPT' >/dev/null 2>&1"; system "uci commit firewall >/dev/null 2>&1"; } sub vpn_setup_required() { http_header(); html_header("$node setup", 1); print "
"; print ""; ################# # messages ################# if(@cli_err) { print "\n"; } print "\n"; print "
\n"; navbar("vpn"); print "
ERROR:
"; foreach(@cli_err) { print "$_
" } print "

"; print "Tunnel software needs to be installed.
"; print "
\n"; print ""; print "
"; print "
\n"; exit; } ################################# # Install VTUN Components/config ################################# sub install_vtun { # check free disk space - get real values $freespace=&check_freespace(); if($freespace < 600) { push @cli_err, "Insuffient free disk space!"; # redirect back to admin page } else { # Update/Install VTUN system "opkg update >/dev/null 2>&1"; if ($? eq 0) { system "opkg install kmod-tun zlib libopenssl liblzo vtun >/dev/null 2>&1"; if ($? eq 0) { # add network interfaces add_network_interfaces(); # allow port 5525 for server connections open_5525_on_wan(); # enable init.d scripts system("chmod +x /etc/init.d/vtundsrv"); system("chmod +x /etc/init.d/vtund"); http_header(); html_header("TUNNEL INSTALLATION IN PROGRESS", 0); print "\n"; print "
\n"; print "

Installing tunnel software...

\n"; print "

DO NOT REMOVE POWER UNTIL THE INSTALLATION IS FINISHED

\n"; print "

\n"; unless($debug) { print "

The node is rebooting

Wait for the Status 4 LED to start blinking, then stop blinking.
When the Status 4 LED is solid on you can reconnect with
http://$node.local.mesh:8080/

"; page_footer(); print ""; system "/sbin/reboot" unless $debug; exit; } } else { push @cli_err,"Package installation failed!"; } } else { push @cli_err,"Package update failed!"; } } } sub DEBUGEXIT() { my ($text) = @_; http_header(); html_header("$node setup", 1); print "DEBUG-"; print $text; print ""; exit; } #weird uhttpd/busybox error requires a 1 at the end of this file 1