I attempted to use a line like this in /etc/shorewall/providers:

#NAME   NUMBER  MARK    DUPLIC. INTERFACE       GATEWAY OPTIONS
#
ISP1    1       -       -       eth0            detect  track,balance=1

but the "detect" didn't work. I forget the error message, but you don't need that because I found a fix.

I tracked it down to the detect_dynamic_gateway function in /usr/share/shorewall/lib.core, which was not handling the
${VARLIB}/dhcp/dhclient.${1}.leases file.

On my system (Debian 7.6 with isc-dhcp-client version 4.2.2.dfsg.1-5+deb70u6), the file name is dhclient.eth0.leases, not dhclient-eth0.lease ("." instead of "-", and plural "leases" instead of singular "lease"). Also, the relevant line in the file looks like

option routers 192.0.2.1;

with a trailing semicolon that needs to be removed when the
value is printed.

I attach a patch that should fix this issue.

--apb (Alan Barrett)
--- /usr/share/shorewall/lib.core.orig  2014-07-19 12:50:41.509285154 +0000
+++ /usr/share/shorewall/lib.core       2014-07-19 13:00:11.252206970 +0000
@@ -845,6 +845,7 @@
     local GATEWAYS
     GATEWAYS=
     local gateway
+    local file
 
     gateway=$(run_findgw_exit $1);
 
@@ -852,14 +853,21 @@
        gateway=$( find_peer $($IP addr list $interface ) )
     fi
 
-    if [ -z "$gateway" -a -f ${VARLIB}/dhcpcd/dhcpcd-${1}.info ]; then
-       eval $(grep ^GATEWAYS=  ${VARLIB}/dhcpcd/dhcpcd-${1}.info 2> /dev/null)
+    file="${VARLIB}/dhcpcd/dhcpcd-${1}.info"
+    if [ -z "$gateway" -a -f "${file}" ]; then
+       eval $(grep ^GATEWAYS= "${file}" 2> /dev/null)
        [ -n "$GATEWAYS" ] && GATEWAYS=${GATEWAYS%,*} && gateway=$GATEWAYS
     fi
 
-    if [ -z "$gateway" -a -f ${VARLIB}/dhcp/dhclient-${1}.lease ]; then
-       gateway=$(grep 'option routers' ${VARLIB}/dhcp/dhclient-${1}.lease | 
tail -n 1 | while read j1 j2 gateway; do echo $gateway ; return 0; done)
-    fi
+    for file in \
+       "${VARLIB}/dhcp/dhclient-${1}.lease" \
+       "${VARLIB}/dhcp/dhclient.${1}.leases"
+    do
+       [ -n "$gateway" ] && break
+       if [ -f "${file}" ]; then
+           gateway=$(grep 'option routers' "${file}" | tail -n 1 | while read 
j1 j2 gateway; do echo "${gateway%\;}" ; return 0; done)
+       fi
+    done
 
     [ -n "$gateway" ] && echo $gateway
 }
------------------------------------------------------------------------------
Want fast and easy access to all the code in your enterprise? Index and
search up to 200,000 lines of code with a free copy of Black Duck
Code Sight - the same software that powers the world's largest code
search on Ohloh, the Black Duck Open Hub! Try it now.
http://p.sf.net/sfu/bds
_______________________________________________
Shorewall-users mailing list
Shorewall-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/shorewall-users

Reply via email to