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 "To:" address to that person before sending.
