move check_yum_installed
[build.git] / lbuild-bridge.sh
1 #!/bin/bash
2
3 # taking this bridge-initialization code out of lbuild-initvm.sh 
4 # so we can use it on our libvirt/lxc local infra 
5 # there's something very similar in 
6 # tests/system/template-qemu/qemu-bridge-init
7 # that the current code was actually based on, but 
8 # nobody was ever bold enough to reconcile these two 
9
10 # hard-wired 
11 DEFAULT_PUBLIC_BRIDGE=br0
12
13 ##############################
14 # use /proc/net/dev instead of a hard-wired list
15 function gather_interfaces () {
16     python <<EOF
17 for line in file("/proc/net/dev"):
18     if ':' not in line: continue
19     ifname=line.replace(" ","").split(":")[0]
20     if ifname.find("lo")==0: continue
21     if ifname.find("br")==0: continue
22     if ifname.find("virbr")==0: continue
23     if ifname.find("veth")==0: continue
24     if ifname.find("tap")==0: continue
25     print ifname
26 EOF
27 }
28
29 function discover_interface () {
30     for ifname in $(gather_interfaces); do
31         ip link show $ifname | grep -qi 'state UP' && { echo $ifname; return; }
32     done
33     # still not found ? that's bad
34     echo unknown
35 }
36
37 ##############################
38 function check_yum_installed () {
39     package=$1; shift
40     rpm -q $package >& /dev/null || yum -y install $package
41 }
42
43 # not used apparently
44 function check_yumgroup_installed () {
45     group="$1"; shift
46     yum grouplist "$group" | grep -q Installed || { yum -y groupinstall "$group" ; }
47 }
48
49 #################### bridge initialization
50 function create_bridge_if_needed() {
51
52     # do not turn on verbosity
53     # set -x
54
55     public_bridge=$1; shift
56
57     # already created ? - we're done
58     ip addr show $public_bridge >& /dev/null && {
59         echo "Bridge already set up - skipping create_bridge_if_needed"
60         return 0
61     }
62
63     # find out the physical interface to bridge onto
64     if_lan=$(discover_interface)
65
66     ip addr show $if_lan &>/dev/null || {
67         echo "Cannot use interface $if_lan - exiting"
68         exit 1
69     }
70
71     #################### bride initialization
72     check_yum_installed bridge-utils
73
74     echo "========== $COMMAND: entering create_bridge - beg"
75     hostname
76     uname -a
77     ip addr show
78     ip route
79     echo "========== $COMMAND: entering create_bridge - end"
80
81     # disable netfilter calls for bridge interface (they cause panick on 2.6.35 anyway)
82     #
83     # another option would be to accept the all forward packages for
84     # bridged interface like: -A FORWARD -m physdev --physdev-is-bridged -j ACCEPT
85     sysctl net.bridge.bridge-nf-call-iptables=0
86     sysctl net.bridge.bridge-nf-call-ip6tables=0
87     sysctl net.bridge.bridge-nf-call-arptables=0
88
89     
90     #Getting host IP/masklen
91     address=$(ip addr show $if_lan | grep -v inet6 | grep inet | head --lines=1 | awk '{print $2;}')
92     [ -z "$address" ] && { echo "ERROR: Could not determine IP address for $if_lan" ; exit 1 ; }
93
94     broadcast=$(ip addr show $if_lan | grep -v inet6 | grep inet | head --lines=1 | awk '{print $4;}')
95     [ -z "$broadcast" ] && echo "WARNING: Could not determine broadcast address for $if_lan"
96
97     gateway=$(ip route show | grep default | awk '{print $3;}')
98     [ -z "$gateway" ] && echo "WARNING: Could not determine gateway IP"
99
100
101     # creating the bridge
102     echo "Creating public bridge interface $public_bridge"
103     brctl addbr $public_bridge
104     brctl addif $public_bridge $if_lan
105     echo "Activating promiscuous mode if_lan=$if_lan"
106     ip link set $if_lan up promisc on
107     sleep 2
108     # rely on dhcp to re assign IP.. 
109     echo "Starting dhclient on $public_bridge"
110     dhclient $public_bridge
111     sleep 1
112
113     #Reconfigure the routing table
114     echo "Configuring gateway=$gateway"
115     ip route add default via $gateway dev $public_bridge
116     ip route del default via $gateway dev $if_lan
117     # at this point we have an extra route like e.g.
118     ## ip route show
119     #default via 138.96.112.250 dev br0
120     #138.96.112.0/21 dev em1  proto kernel  scope link  src 138.96.112.57
121     #138.96.112.0/21 dev br0  proto kernel  scope link  src 138.96.112.57
122     #192.168.122.0/24 dev virbr0  proto kernel  scope link  src 192.168.122.1
123     route_dest=$(ip route show | grep -v default | grep "dev $public_bridge" | awk '{print $1;}')
124     ip route del $route_dest dev $if_lan
125
126     echo "========== $COMMAND: exiting create_bridge - beg"
127     ip addr show
128     ip route show
129     echo "========== $COMMAND: exiting create_bridge - end"
130
131     # for safety
132     sleep 3
133     return 0
134
135 }
136
137 function main () {
138     if [[ -n "$@" ]] ; then 
139         public_bridge="$1"; shift
140     else
141         public_bridge="$DEFAULT_PUBLIC_BRIDGE"
142     fi
143     create_bridge_if_needed $public_bridge
144 }
145
146 main "$@"