mirror of https://github.com/aredn/aredn.git
295 lines
9.0 KiB
Perl
295 lines
9.0 KiB
Perl
=for comment
|
|
|
|
Part of AREDN -- Used for creating Amateur Radio Emergency Data Networks
|
|
Copyright (c) 2015 Darryl Quinn
|
|
See Contributors file for additional contributors
|
|
|
|
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
|
|
|
|
#################################
|
|
# get base network from config
|
|
#################################
|
|
sub get_server_network_address()
|
|
{
|
|
my @list;
|
|
my $uciresult;
|
|
my ($rc,$server_net)=&uci_get_indexed_option("vtun","network","0","start");
|
|
if($rc eq 0 and $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]);
|
|
|
|
#($rc,$uciresult)=&uci_add_sectiontype("vtun","network");
|
|
($rc,$uciresult)=&uci_set_indexed_option("vtun","network","0","start",$server_net);
|
|
$rc=&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
|
|
}
|
|
|
|
##########################
|
|
# 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()
|
|
{
|
|
my ($navpage) = @_;
|
|
http_header();
|
|
html_header("$node setup", 1);
|
|
print "<body><center><table width=790>";
|
|
print "<tr><td>\n";
|
|
navbar($navpage);
|
|
print "</td></tr>";
|
|
#################
|
|
# messages
|
|
#################
|
|
if(@cli_err)
|
|
{
|
|
print "<tr><td align=center><b>ERROR:<br>";
|
|
foreach(@cli_err) { print "$_<br>" }
|
|
print "</b></td></tr>\n";
|
|
}
|
|
print "<tr><td align=center><br><b>";
|
|
print "Tunnel software needs to be installed.<br/>";
|
|
print "<form method='post' action='/cgi-bin/vpn' enctype='multipart/form-data'>\n";
|
|
print "<input type=submit name=button_install value='Click to install' class='btn_tun_install' />";
|
|
print "</form>";
|
|
print "</b></td></tr>\n";
|
|
print "</table></center></body></html>\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");
|
|
|
|
# create UCI config file
|
|
system("touch /etc/config/vtun");
|
|
# create options section
|
|
$rc=&uci_add_sectiontype("vtun","options");
|
|
$rc=&uci_commit();
|
|
|
|
http_header();
|
|
html_header("TUNNEL INSTALLATION IN PROGRESS", 0);
|
|
print "</head>\n";
|
|
print "<body><center>\n";
|
|
print "<h2>Installing tunnel software...</h2>\n";
|
|
print "<h1>DO NOT REMOVE POWER UNTIL THE INSTALLATION IS FINISHED</h1>\n";
|
|
print "</center><br>\n";
|
|
unless($debug)
|
|
{
|
|
print "
|
|
<center><h2>The node is rebooting</h2>
|
|
<h3>Wait for the Status 4 LED to start blinking, then stop blinking.<br>
|
|
When the Status 4 LED is solid on you can reconnect with<br>
|
|
<a href='http://$node.local.mesh:8080/'>http://$node.local.mesh:8080/</a><br>
|
|
</h3>
|
|
</center>
|
|
";
|
|
page_footer();
|
|
print "</body></html>";
|
|
system "/sbin/reboot" unless $debug;
|
|
exit;
|
|
}
|
|
} else {
|
|
push @cli_err,"Package installation failed!";
|
|
}
|
|
} else {
|
|
push @cli_err,"Package update failed!";
|
|
}
|
|
}
|
|
}
|
|
|
|
sub generate_ips()
|
|
{
|
|
my ($netip) = @_;
|
|
my $serverip = &addrtoint($netip);
|
|
$serverip++;
|
|
$serverip++;
|
|
$serverip=inttoaddr($serverip);
|
|
|
|
my $clientip = &addrtoint($netip);
|
|
$clientip++;
|
|
$clientip=inttoaddr($clientip);
|
|
|
|
return ($clientip, $serverip);
|
|
}
|
|
|
|
sub addrtoint { return( unpack( "N", pack( "C4", split( /[.]/,$_[0]))))};
|
|
sub inttoaddr { return( join( ".", unpack( "C4", pack( "N", $_[0]))))};
|
|
|
|
sub DEBUGEXIT()
|
|
{
|
|
my ($text) = @_;
|
|
http_header();
|
|
html_header("$node setup", 1);
|
|
print "DEBUG-";
|
|
print $text;
|
|
print "</body>";
|
|
exit;
|
|
}
|
|
|
|
#weird uhttpd/busybox error requires a 1 at the end of this file
|
|
1 |