Dazed_75 wrote:
> 
> 
> On Fri, Oct 2, 2009 at 10:21 AM, Eric Shubert 
> <[email protected] 
> <mailto:[email protected]>> wrote:
> 
>     Dazed_75 wrote:
>      > RESOLVED !!!
>      >
>      > Ryan had said:
>      >
>      > I found this
>     https://bugs.launchpad.net/ubuntu/+source/dhcp3/+bug/392826
>      > via a quick google search so the answer to your question about
>      > reordering the script doesn't seem like it would work.
>      >
>      > But I had been looking mostly at the discussion of ordering the
>     elements
>      > in /etc/rc?.d/ which I tried several variations for.  When I
>     re-read it
>      > and noticed the script attached, it seemed a reasonable work around.
>      >
>      > Jacob Nevins has said:
>      >
>      > I'm also running into this.
>      >
>      > I've bodged around it by putting the attached script in
>      > /etc/network/if-up.d/dhcp3-server . I don't claim it's the best
>      > solution, or that it should be included in the package, but it
>     works for
>      > my situation (where I have a single interface "eth0" explicitly
>     listed
>      > in /etc/default/dhcp3-server), so it might be a useful workaround for
>      > others.
>      >
>      > The script was:
>      >
>      > #! /bin/sh
>      > # Kick DHCP server when interface comes up (for Ubuntu, probably
>     Debian too)
>      >
>      > # Workaround for
>     <https://bugs.launchpad.net/ubuntu/+source/dhcp3/+bug/392826>
>      > # Bugs:
>      > #  - Only works when interfaces for dhcpd are explicitly listed.
>      >
>      >
>      > DHCP_IF=/etc/default/dhcp3-server
>      > DHCP_INIT=/etc/init.d/dhcp3-server
>      >
>      > [ -f "$DHCP_IF" -a -f "$DHCP_INIT" ] || exit 0
>      >
>      > . "$DHCP_IF"
>      >
>      > if [ "x$INTERFACES" = x ]; then
>      >
>      >     # Don't know which interfaces it manages, always restart
>      >     restart_dhcp=1
>      > else
>      >     restart_dhcp=0
>      >     for iface in "$INTERFACES"; do
>      >         if [ "$iface" = "$IFACE" ]; then
>      >
>      >             restart_dhcp=1
>      >         fi
>      >     done
>      > fi
>      >
>      > if [ "$restart_dhcp" = "1" ]; then
>      >     "$DHCP_INIT" restart
>      > fi
>      >
>      >
>      > It seemed reasonable to try and it worked.  Now there is no need to
>      > actually log in and run /etc/init.d/dhcp3-server start in order
>     to get
>      > the DHCO server running.  Oh, BTW, he was wrong about needing to name
>      > the interface to use in /etc/default/dhcp3-server.
>      >
>      > --
>      > Dazed_75 a.k.a. Larry
>      >
>      > The spirit of resistance to government is so valuable on certain
>      > occasions, that I wish it always to be kept alive.
>      >  - Thomas Jefferson
>      >
>      >
>     While that script appears to work, I don't believe it will work as
>     intended. Long story short, [ "" = "" ] is always true, as = is
>     assignment. The tests should be [ "" == "" ] . Substitute appropriately,
>     and the rest appears ok.
> 
>     --
>     -Eric 'shubes'
> 
> I see what you mean.  It didn't really try to read the code since it has 
> been a VERY long time since I write any shell code.  Glad I did not 
> since just trying it worked and might I not have tried it had I caught 
> the ambiguity ... err, poor code.  I wonder if you could assist me by 
> carefully reading the following where I have commented the code and 
> changed it, or not, according to my understanding?  Tell me where I am 
> wrong before I send him corrections.
> 
> #! /bin/sh
> # Kick DHCP server when interface comes up (for Ubuntu, probably Debian too)
> # Workaround for <https://bugs.launchpad.net/ubuntu/+source/dhcp3/+bug/392826>
> 
> # Bugs:
> #  - Only works when interfaces for dhcpd are explicitly listed.
> 
> # Dazed_75: If either of these two references are not present as 
> # regular files, exit with a return code of 0
> 
> DHCP_IF=/etc/default/dhcp3-server
> 
> DHCP_INIT=/etc/init.d/dhcp3-server
> 
> [ -f "$DHCP_IF" -a -f "$DHCP_INIT" ] || exit 0
> 
> # Dazed_75: Otherwise source the default configuration file to set the 
> # variable $INTERFACES (which happens to be a null string in my system
> 
> # and never changes
> 
> . "$DHCP_IF"
> 
> # Dazed_75: The following should use "==" to test if $INTERFACES is null
> # rather than assigning x to "x$INTERFACES" which I am not even sure what 
> 
> # that means though I suspect that in my system, it assigns the value x 
> # to a variable named $x since $INTERFACES is null for my system.
> # Due to the assignment, the if condition is always true so the variable
> 
> # $restart_dhcp is always set to 1 and the else condition is never used.
> 
> if [ "x$INTERFACES" = x ]; then
>     # Don't know which interfaces it manages, always restart
>     restart_dhcp=1
> else
> 
> 
>     # Dazed_75: The else condition is meant to be used if 
> /etc/default/dhcp3-server
>     # when sourced above, sets $INTERFACES to a string value containing one 
> or more
>     # interface names such as "eth0 eth2".
> 
>     # It first sets $restart_dhcp to 0 (FALSE) and then iterates for each 
> "word/name"
>     # in $INTERFACES and should be using "==" to test if the current word 
> matches a
>     # variable named $IFACE which I can find to reference to anywhere.  The 
> intent
> 
>     # would be to set $restart_dhcp to 1 (TRUE) if ANY of the words in 
> $INTERFACES 
>     # matched the value of $IFACE, but the assignment wrongly ensures the 
> value is 
>     # always set to TRUE
> 
>     restart_dhcp=0
> 
>     for iface in "$INTERFACES"; do
>         if [ "$iface" = "$IFACE" ]; then
>             restart_dhcp=1
>         fi
>     done
> fi
> 
> # Dazed_75: Hence the only condition under which the following code is not 
> reached 
> 
> # is if one or both of the listed config files is not present or not a 
> regular file. 
> # Further, under all conditions, when this code is reached, the $restart_dhcp 
> has 
> # been set to 1 (TRUE) due to the assignment operator being used.
> 
> #
> # Hence, any condition that causes this script to execute will cause 
> # /etc/init.d/dhcp3-server to be executed with an argument of "restart".  
> Further,
> # I find nothing in that script which uses a variable named $IFACE or $iface 
> which
> 
> # may just be something I do not see.
> 
> if [ "$restart_dhcp" = "1" ]; then
>     "$DHCP_INIT" restart
> fi
> 
> # Dazed_75: In closing, the assignment operators inside the conditionals could
> 
> # and should be changed to conditional "==". But, in either case, as long as 
> # /etc/default/dhcp3-server is not altered to set the contents of 
> $INTERFACES, 
> # this script will always cause "/etc/init.d/dhcp3-server restart" to be 
> executed.
> 
> 

FWIW, I prefer seeing -z to test if a variable is null ( [ -z "$VAR" ] 
rather than [ x$VAR == x ] ), but that's just my preference. Works the 
same either way.

I'm guessing that $IFACE could be set when $DHCP_IF is sourced.

I think you pretty much nailed it other than that.

-- 
-Eric 'shubes'

_______________________________________________
PLUG-applications mailing list
[email protected]
http://lists.plug.phoenix.az.us/cgi-bin/mailman/listinfo/plug-applications

Reminder: All replies will go back to this mailing list. If you wish to send a 
reply to a specific person, please use the reply function and change the 
&quot;To:&quot; address to that person before sending.

Reply via email to