server::setup_from_dev will take configuration from existing device
[pxelator] / lib / PXElator / network.pm
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                 server::setup_from_dev( 'virtual' );
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;