config/interface_modify.sh: before calling a script check if it exists and is executable
[sahlberg/ctdb.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                         test -x "$_s_script" || {
72                                 continue
73                         }
74                         $_s_script "$_iface" "$_s_ip" "$_s_maskbits" || {
75                                 ret=$?
76                                 echo "$_s_script '$_iface' '$_s_ip' '$_s_maskbits' - failed - $ret"
77                                 _failed=1
78                         }
79                         echo "call $_s_script '$_iface' '$_s_ip' '$_s_maskbits'"
80                 done
81
82             done
83         }
84
85         test -d $_script_dir && {
86                 rm -f $_script_dir/*
87         }
88
89         [ $_failed = 0 ] || {
90                 echo "Failed to del $_ip on dev $_iface"
91                 return 1;
92         }
93         return 0;
94 }
95
96 setup_iface_ip_readd_script()
97 {
98         local _iface=$1
99         local _ip=$2
100         local _maskbits=$3
101         local _readd_base=$4
102         local _readd_script=$5
103         local _script_dir="$_readd_base/$_ip.$_maskbits"
104
105         test -x "$_readd_script" || {
106                 echo "Script '$_readd_script' isn't executable"
107                 return 1;
108         }
109
110         local _readd_basename=`basename $_readd_script`
111         local _readd_final="$_script_dir/$_readd_basename"
112
113         mkdir -p $_script_dir || {
114                 echo "Failed to mkdir -p $_script_dir"
115                 return 1;
116         }
117
118         cp -a $_readd_script $_readd_final || {
119                 echo "Failed to - cp -a $_readd_script $_readd_final"
120                 return 1;
121         }
122
123         return 0
124 }
125
126 case "$OP" in
127         add)
128                 add_ip_to_iface $IFACE $IP $MASKBITS $READD_BASE
129                 exit $?
130                 ;;
131         delete)
132                 delete_ip_from_iface $IFACE $IP $MASKBITS $READD_BASE
133                 exit $?
134                 ;;
135         readd_script)
136                 setup_iface_ip_readd_script $IFACE $IP $MASKBITS $READD_BASE $READD_SCRIPT
137                 exit $?
138                 ;;
139 esac
140
141 echo "$0: unknown operation[$OP]"
142 exit 1