OSDN Git Service

Fulcon first commit
[fulcon/Fulcon.git] / src / driver / docker / net-add
1 #!/bin/bash
2
3 # Copyright (C) 2015 NIWA Hideyuki
4
5
6 umask 022
7
8 # function usage
9 usage()
10 {
11         echo "usage: net-add [ -d NETDEV ] [ -n NUMBER ] [ -g GATEWAY ] [ -b BRIDGE ] CONTAINER_NAME IPADDR/MASK "
12 }
13
14 # check options
15 FLG_D=0 ; NETDEV=""
16 FLG_N=0 ; NUM=""
17 FLG_G=0 ; LXCGATEWAY=""
18 FLG_B=0 ; LXCBR="fulcon-br0"
19
20 while getopts d:n:g:b: OPT ; do
21   case $OPT in
22   d) FLG_D=1 ; NETDEV=$OPTARG ;;
23   n) FLG_N=1 ; NUM=$OPTARG ;;
24   g) FLG_G=1 ; LXCGATEWAY=$OPTARG ;;
25   b) FLG_B=1 ; LXCBR=$OPTARG ;;
26   esac
27 done
28 shift $((OPTIND - 1))
29
30 # check args
31 if [ $# -ne 2 ]; then
32         usage
33         exit -1
34 fi
35
36 LXCNAME=$1
37 LXCBRIP=`net-ipv4 -g $2`
38 if [ $? -ne 0 ]; then
39         echo $2 "must be IP_address/Mask format"
40         exit -1
41 fi
42
43 LXCIP=`echo $2 | awk -F / '{printf "%s",$1}'`
44 LXCMASK=`echo $2 | awk -F / '{printf "%s",$2}'`
45
46 if [ x$LXCGATEWAY == x"" ]; then
47         LXCGATEWAY=$LXCBRIP
48 fi
49
50 if [ x$NETDEV != x"" ]; then
51         LXCBRIP=`ip a show $NETDEV | awk 'NR==3{print $2}' | awk -F / '{print $1}'`
52         DEVMASK=`ip a show $NETDEV | awk 'NR==3{print $2}' | awk -F / '{print $2}'`
53         if [ x$DEVMASK != x$LXCMASK ]; then
54                 echo "error: netmask(/$DEVMASK) of NIC is not corresponding to netmask(/$LXCMASK) of IP address"
55                 exit -1 
56         fi
57 fi
58
59 LXCPROC=`find-proc ${LXCNAME}`
60 if [ $? -ne 0 ]; then
61         echo "error: can't find" ${LXCNAME}
62         exit -1
63 fi
64
65 set_ipaddr()
66 {
67         mkdir -p /var/run/netns/
68         ln -s /proc/${LXCPROC}/ns/net /var/run/netns/${LXCNAME}${NUM}
69
70         ip link delete ${LXCNAME}${NUM} type veth  >& /dev/null
71
72         ip link add name ${LXCNAME}${NUM} type veth peer name vg${LXCNAME}${NUM} >& /dev/null
73         ip link set ${LXCNAME}${NUM} up
74
75         brctl show $LXCBR |& egrep 'No such device' >& /dev/null
76         if [ $? -eq 0 ]; then
77                 brctl addbr $LXCBR
78                 ip link set $LXCBR up
79                 ip addr add ${LXCBRIP}/${LXCMASK} dev $LXCBR
80         fi
81         brctl addif $LXCBR ${LXCNAME}${NUM} >& /dev/null
82
83         # setting up of IP address
84         LXCFBROADCAST=`net-ipv4 -b "${LXCIP}/${LXCMASK}"`
85         ip link set vg${LXCNAME}${NUM} netns ${LXCNAME}${NUM} 
86
87         # Setting of network in container
88         ip netns exec ${LXCNAME}${NUM} ip link set vg${LXCNAME}${NUM} up
89         IPFLG=""
90         while [ x${IPFLG} == x"inet6" -o x${IPFLG} != x"inet" ]; 
91         do
92                 IPFLG=`ip netns exec "${LXCNAME}${NUM}" ip addr show vg${LXCNAME}${NUM} | awk 'NR==3{print $1}'`
93                 ip netns exec "${LXCNAME}${NUM}" ip addr add ${LXCIP}/${LXCMASK} dev vg${LXCNAME}${NUM} broadcast $LXCFBROADCAST >& /dev/null
94                 OLDIPADR=`ip netns exec "${LXCNAME}${NUM}" ip addr show vg${LXCNAME}${NUM} | awk 'NR==3{print $2}'`
95                 sleep 1
96         done
97         while [ x${OLDIPADR} != x${LXCIP}/${LXCMASK} ]; 
98         do 
99                 OLDIPADR=`ip netns exec "${LXCNAME}${NUM}" ip addr show vg${LXCNAME}${NUM} | awk 'NR==3{print $2}'`
100                 if [ x${OLDIPADR} != x${LXCIP}/${LXCMASK} ]; then
101                         ip netns exec ${LXCNAME}${NUM} ip addr del ${OLDIPADR} dev vg${LXCNAME}${NUM}
102                         ip netns exec ${LXCNAME}${NUM} ip addr add ${LXCIP}/${LXCMASK} dev vg${LXCNAME}${NUM} broadcast $LXCFBROADCAST >& /dev/null
103                 fi
104                 sleep 1
105         done
106
107         # setting up of gateway
108         if [ x$LXCGATEWAY != x"" ]; then
109                 ip netns exec ${LXCNAME}${NUM} ip route delete default >& /dev/null
110                 IPADDR=$LXCGATEWAY
111                 IPMASK=$LXCMASK
112                 ip netns exec ${LXCNAME}${NUM} ip route add default via ${IPADDR}
113         fi
114
115         rm -f /var/run/netns/${LXCNAME}${NUM}
116
117         if [ x$NETDEV != x"" ]; then
118                 # setting of promiscuous mode
119                 ip link set $NETDEV promisc on
120
121                 brctl show $LXCBR | egrep -w $NETDEV >& /dev/null
122                 if [ $? -ne 0 ]; then
123                         brctl addif $LXCBR $NETDEV 
124                 fi
125         fi
126 }
127
128 set_ipaddr
129
130 echo "${LXCNAME}${NUM} ${LXCIP}/${IPMASK}"
131
132 exit 0