1 |
package network; |
2 |
|
3 |
use warnings; |
4 |
use strict; |
5 |
|
6 |
use File::Slurp; |
7 |
|
8 |
use server; |
9 |
use ip; |
10 |
|
11 |
sub ifconfig { |
12 |
my $dev = shift; |
13 |
`/sbin/ifconfig $dev` |
14 |
} |
15 |
|
16 |
sub setup { |
17 |
|
18 |
if ( my $dev = $ENV{DEV} ) { |
19 |
warn "W: running under device $dev, not configuring network\n"; |
20 |
return; |
21 |
} |
22 |
|
23 |
my $ifconfig = ifconfig('virtual'); |
24 |
if ( $ifconfig !~ m{UP} ) { |
25 |
system "brctl addbr virtual"; |
26 |
system "brctl setfd virtual 0"; |
27 |
system("/sbin/ifconfig virtual $server::ip netmask $server::netmask") == 0 || warn "W: $!"; |
28 |
} else { |
29 |
warn "using existing virtual configuration\n$ifconfig\n"; |
30 |
} |
31 |
if ( my $dev = ip::default_route_dev() ) { |
32 |
system "sudo sysctl -w net.ipv4.ip_forward=1"; |
33 |
my $network = ip::from_int( ip::to_int($server::ip) & ip::to_int($server::netmask) ); |
34 |
warn "# network $network"; |
35 |
system "sudo iptables -t nat -L POSTROUTING -n | grep $network || sudo iptables -t nat -A POSTROUTING -s $server::ip/$server::netmask -o wlan0 -j MASQUERADE"; |
36 |
warn "masquarade to $dev"; |
37 |
} |
38 |
} |
39 |
|
40 |
sub tap { |
41 |
|
42 |
if ( my $dev = $ENV{DEV} ) { |
43 |
warn "W: running under device $dev, not configuring tap0\n"; |
44 |
return; |
45 |
} |
46 |
|
47 |
if ( $server::ip !~ m{^172} ) { |
48 |
warn "W: server ip mismetch, not configuring tap0\n"; |
49 |
return; |
50 |
} |
51 |
|
52 |
my $interfaces = read_file '/etc/network/interfaces'; |
53 |
|
54 |
if ( $interfaces !~ m{tap0}s ) { |
55 |
|
56 |
system "sudo apt-get install -y vde2"; |
57 |
|
58 |
write_file '/tmp/interfaces', qq{ |
59 |
|
60 |
# added by PXElator |
61 |
iface tap0 inet static |
62 |
address $server::ip |
63 |
netmask $server::netmask |
64 |
vde2-switch - |
65 |
# setup NAT for vde network |
66 |
post-up sysctl -w net.ipv4.ip_forward=1 |
67 |
post-up iptables -t nat -A POSTROUTING -s $server::ip/$server::netmask -o wlan0 -j MASQUERADE |
68 |
|
69 |
}; |
70 |
|
71 |
system q|sudo sh -c 'cat /tmp/interfaces >> /etc/network/interfaces'|; |
72 |
system q|sudo sh -c 'usermod -G vde2-net -a $SUDO_USER'|; |
73 |
|
74 |
} |
75 |
|
76 |
my $ifconfig = ifconfig('tap0'); |
77 |
if ( $ifconfig =~ m{UP} ) { |
78 |
$ifconfig =~ m{$server::ip}s && return 'up'; |
79 |
system("sudo /sbin/ifconfig tap0 $server::ip netmask $server::netmask") == 0 && return "ip changed $server::ip"; |
80 |
die "can't change IP address of tap0 to $server::ip"; |
81 |
} else { |
82 |
die "bring interface up with: sudo ifup tap0\n"; |
83 |
} |
84 |
} |
85 |
|
86 |
1; |