16 echo "pipework <hostinterface> <guest> <ipaddr>/<subnet> <broadcast> <gateway> [vlan tag]"
20 # Step 1: Find the guest (for now, we only support LXC containers)
21 while read dev mnt fstype options dump fsck
23 [ "$fstype" != "cgroup" ] && continue
24 echo $options | grep -qw devices || continue
29 echo "Could not locate cgroup mount point."
33 N=$(find "$CGROUPMNT" -name "$GUEST_ID*" | wc -l)
36 echo "Could not find any container matching $GUEST_ID"
43 echo "Found more than one container matching $GUEST_ID"
48 NSPID=$(head -n 1 $(find "$CGROUPMNT" -name "$GUEST_ID*" | head -n 1)/tasks)
50 echo "Could not find a process inside container $GUEST_ID"
54 # Step 2: Prepare the working directory
55 mkdir -p /var/run/netns
56 rm -f /var/run/netns/$NSPID
57 ln -s /proc/$NSPID/ns/net /var/run/netns/$NSPID
59 # Step 3: Creating virtual interfaces
60 LOCAL_IFNAME=vethl-$GUESTNAME #$NSPID
61 GUEST_IFNAME=vethg-$GUESTNAME #$NSPID
62 ip link add name $LOCAL_IFNAME type veth peer name $GUEST_IFNAME
63 ip link set $LOCAL_IFNAME up
65 # Step 4: Adding the virtual interface to the bridge
66 ip link set $GUEST_IFNAME netns $NSPID
69 ovs-vsctl add-port $BRIDGE $LOCAL_IFNAME tag=$VLANTAG
72 ovs-vsctl add-port $BRIDGE $LOCAL_IFNAME
76 # Step 5: Configure netwroking within the container
77 ip netns exec $NSPID ip link set $GUEST_IFNAME name eth0
78 ip netns exec $NSPID ip addr add $IPADDR broadcast $BROADCAST dev eth0
79 ip netns exec $NSPID ifconfig eth0 hw ether $MAC
80 ip netns exec $NSPID ip addr add 127.0.0.1 dev lo
81 ip netns exec $NSPID ip link set eth0 up
82 ip netns exec $NSPID ip link set lo up
83 ip netns exec $NSPID ip route add default via $GWADDR