local _line="$_ip $_netip/$_maskbits"
- local _config=`cat $CTDB_PER_IP_ROUTING_CONF 2>/dev/null`
+ local _lockfile="$CTDB_PER_IP_ROUTING_CONF.lock"
+ local _script="$CTDB_PER_IP_ROUTING_CONF.$$.sh"
+
+ echo "#!/bin/sh" > $_script
+ echo "#" >> $_script
+ echo "" >> $_script
+ echo "_config=\`cat $CTDB_PER_IP_ROUTING_CONF 2>/dev/null\`" >> $_script
+ echo "_exact=\`echo -n \"\$_config\" | grep \"^$_line\$\" | wc -l | xargs\`" >> $_script
+ echo "" >> $_script
+
+ echo "test x\"\$_exact\" = x\"1\" && {" >> $_script
+ echo " exit 0;" >> $_script
+ echo "}" >> $_script
+ echo "" >> $_script
+
+ echo "_tmp=\"$CTDB_PER_IP_ROUTING_CONF.$$.tmp\"" >> $_script
+ echo "echo -n \"\$_config\" | grep -v \"^$_ip \" | cat > \$_tmp || {" >> $_script
+ echo " echo \"echo -n \\\"\$_config\\\" | grep -v \\\"^$_ip \\\" > \$_tmp - failed\"" >> $_script
+ echo " exit 1;" >> $_script
+ echo "}" >> $_script
+ echo "echo \"$_line\" >> \$_tmp || {" >> $_script
+ echo " echo \"echo \\\"$_line\\\" >> \$_tmp - failed\"" >> $_script
+ echo " exit 1;" >> $_script
+ echo "}" >> $_script
+ echo "" >> $_script
+
+ echo "mv \$_tmp $CTDB_PER_IP_ROUTING_CONF || {" >> $_script
+ echo " echo \"mv \$_tmp $CTDB_PER_IP_ROUTING_CONF - failed\"" >> $_script
+ echo " exit 1;" >> $_script
+ echo "}" >> $_script
+ echo "" >> $_script
+
+ echo "echo \"Added '$_line' to $CTDB_PER_IP_ROUTING_CONF\"">> $_script
+ echo "exit 0" >> $_script
- local _exact=`echo -n "$_config" | grep "^$line$" | wc -l | xargs`
+ chmod +x $_script
- test x"$_exact" = x"1" && {
- return 0;
+ test -f $_lockfile || {
+ touch $_lockfile
}
- local _tmp="$CTDB_PER_IP_ROUTING_CONF.$$.tmp"
- echo -n "$_config" | grep -v "^$_ip " > $_tmp
- echo "$_line" >> $_tmp
-
- mv $_tmp $CTDB_PER_IP_ROUTING_CONF
+ flock --timeout 30 $_lockfile $_script
+ ret=$?
+ rm $_script
+ return $ret
}
generate_per_ip_routing()