Merge root@10.1.1.27:/shared/ctdb/ctdb-git
[metze/ctdb/wip.git] / config / interface_modify.sh
1 #!/bin/sh
2 #
3
4 OP=$1
5 IFACE=$2
6 IP=$3
7 MASKBITS=$4
8 READD_BASE=$5
9 READD_SCRIPT=$6
10
11 add_ip_to_iface()
12 {
13         local _iface=$1
14         local _ip=$2
15         local _maskbits=$3
16         local _readd_base=$4
17         local _script_dir="$_readd_base/$_ip.$_maskbits"
18
19         # we make sure the interface is up first
20         /sbin/ip link set $_iface up || {
21                 echo "Failed to bringup interface $_iface"
22                 return 1;
23         }
24         /sbin/ip addr add $_ip/$_maskbits brd + dev $_iface || {
25                 echo "Failed to add $_ip/$_maskbits on dev $_iface"
26                 return 1;
27         }
28
29         mkdir -p $_script_dir || {
30                 echo "Failed to mkdir -p $_script_dir"
31                 return 1;
32         }
33
34         rm -f $_script_dir/*
35
36         return 0;
37 }
38
39 delete_ip_from_iface()
40 {
41         local _iface=$1
42         local _ip=$2
43         local _maskbits=$3
44         local _readd_base=$4
45         local _script_dir="$_readd_base/$_ip.$_maskbits"
46
47         # the ip tool will delete all secondary IPs if this is the primary. To work around
48         # this _very_ annoying behaviour we have to keep a record of the secondaries and re-add
49         # them afterwards. yuck
50         local _secondaries=""
51         if /sbin/ip addr list dev $_iface primary | grep -q "inet $_ip/$_maskbits " ; then
52             _secondaries=`/sbin/ip addr list dev $_iface secondary | grep " inet " | awk '{print $2}'`
53         fi
54         local _failed=0
55         /sbin/ip addr del $_ip/$_maskbits dev $_iface || _failed=1
56         [ -z "$_secondaries" ] || {
57             local _i=""
58             for _i in $_secondaries; do
59                 if /sbin/ip addr list dev $_iface | grep -q "inet $_i" ; then
60                     echo "kept secondary $_i on dev $_iface"
61                 else
62                     echo "re-adding secondary address $_i to dev $_iface"
63                     /sbin/ip addr add $_i brd + dev $_iface || _failed=1
64                 fi
65                 local _s_ip=`echo "$_i" | cut -d '/' -f1`
66                 local _s_maskbits=`echo "$_i" | cut -d '/' -f2`
67                 local _s_script_dir="$_readd_base/$_s_ip.$_s_maskbits"
68
69                 local _s_script=""
70                 for _s_script in $_s_script_dir/*; do
71                         $_s_script "$_iface" "$_s_ip" "$_s_maskbits" || {
72                                 ret=$?
73                                 echo "$_s_script '$_iface' '$_s_ip' '$_s_maskbits' - failed - $ret"
74                                 _failed=1
75                         }
76                         echo "call $_s_script '$_iface' '$_s_ip' '$_s_maskbits'"
77                 done
78
79             done
80         }
81
82         test -d $_script_dir && {
83                 rm -f $_script_dir/*
84         }
85
86         [ $_failed = 0 ] || {
87                 echo "Failed to del $_ip on dev $_iface"
88                 return 1;
89         }
90         return 0;
91 }
92
93 setup_iface_ip_readd_script()
94 {
95         local _iface=$1
96         local _ip=$2
97         local _maskbits=$3
98         local _readd_base=$4
99         local _readd_script=$5
100         local _script_dir="$_readd_base/$_ip.$_maskbits"
101
102         test -x "$_readd_script" || {
103                 echo "Script '$_readd_script' isn't executable"
104                 return 1;
105         }
106
107         local _readd_basename=`basename $_readd_script`
108         local _readd_final="$_script_dir/$_readd_basename"
109
110         mkdir -p $_script_dir || {
111                 echo "Failed to mkdir -p $_script_dir"
112                 return 1;
113         }
114
115         cp -a $_readd_script $_readd_final || {
116                 echo "Failed to - cp -a $_readd_script $_readd_final"
117                 return 1;
118         }
119
120         return 0
121 }
122
123 case "$OP" in
124         add)
125                 add_ip_to_iface $IFACE $IP $MASKBITS $READD_BASE
126                 exit $?
127                 ;;
128         delete)
129                 delete_ip_from_iface $IFACE $IP $MASKBITS $READD_BASE
130                 exit $?
131                 ;;
132         readd_script)
133                 setup_iface_ip_readd_script $IFACE $IP $MASKBITS $READD_BASE $READD_SCRIPT
134                 exit $?
135                 ;;
136 esac
137
138 echo "$0: unknown operation[$OP]"
139 exit 1