On Tuesday 05 April 2005 18:34, Frank Küster wrote:
> David Schmitt <[EMAIL PROTECTED]> wrote:
>
> I am looking into this, trying to provide a patch - and NMU if Paul
> doesn't show up, I really think wwwoffle should go back into sarge.

Indeed. Great. Thanks!

> > The "overwwrites local config" part is way harder. Looking at the
> > postinst gives me the creeps. Just a few quotes which I think would need
> > fixing:
> >
> > Everything in debian/wwwoffle.postinst of 2.8e-1:
> >
> > Line 202:
> > | # Here the [...] link is made if it either doesn't exist or it points
> > | to a # non-existent file.
>
>  for i in gif png js; do
> - if [ ! -f /etc/wwwoffle/debian-replacement.$i ]; then
> -  rm -f /etc/wwwoffle/debian-replacement.$i
> + if [ ! -e /etc/wwwoffle/debian-replacement.$i ]; then
>    ln -s /usr/share/wwwoffle/html/en/local/dontget/standard.replacement.$i
> /etc/wwwoffle/debian-replacement.$i fi
>
> This will create a symlink when it is missing, but not remove it if it
> point to a nonexistent target - the target might be only temporarily
> missing.  I would not take "preserve user modifications" too literally
> here; in fact I doubt that these files are really configuration files -
> who would want to configure a 1x1 pixel png file?

Well, one could want to remove it altogether or add a local substitute to 
alert the user to the missing picture. Using -e is already better, but the 
code should only run on first install.

Medium term it might be better to make the path-to-replacement configurable 
instead of putting it as a symlink somewhere.

> > The following code is AFAICS not conditional upon first installation,
> > thus overriding a local admin who has intentionally removed the link.
> >
> > Line 257:
> > |    perl -i.bak -pe 's/^(\# WWWOFFLE - World Wide Web Offline Explorer -
> > | Version).*/$1'" $config_version/" $CONFIG if cmp -s $CONFIG
> > | $CONFIG.bak; then mv -f $CONFIG.bak $CONFIG; fi
> >
> > If the perl doesn't modify the config, this will kill the symlink:
> However, since there are many more places where perl's in-place-editing
> is used, and not only on $CONFIG, I have written a shell function for
> that:
>
> safe_edit_file(){
>   # this function allows perl or sed commands to change a file, even if it
>   # is a symlink
>   filename="$1"
>   shift
>   replacecommand="$@"
>   tempfile=`mktemp`
>   $replacecommand $filename > $tempfile
>   if cmp -s $filename $tempfile; then
>     # if the files are unchanged, remove tempfile;
>     rm $tempfile
>   else
>     #otherwise, cat it into $filename. (We don't move to preserve a
>     #possible symlink) 
>     cat $tempfile > $filename 
>   fi
> }

Looks good. $replacecommand has to be changed from inplace-editing to 
stdout-putting, but you have surely thought of that.

> All the backup stuff is done before, and removed if unchanged afterwards.

Now that you mention it, the "if cmp" is missing a rm $tempfile and can be 
rewritten as 

if !cmp ... ; then
 cat $tempfile > $filename
fi
rm $tempfile

> > Line 354:
> > | if [ ! -f $OPTIONS ]; then
> > |    cp -p /usr/share/wwwoffle/default/wwwoffle.options $OPTIONS
> > | fi
> >
> > This too is not special cased to the not-upgrading case.
>
> I'm currently having a blackout - how can one test for the special case
> of installing after removal, but not purge?  In this case, there's no
> "last configured version" to read from $2.

Thinking about it more, one could argue that "remove"ing a package and 
manually deleting a config file does constitute "purge"ing the package.

To you question, see:

http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html#s-unpackphase

point 3.2 answers it, I believe.

> > The following two problems apply to all debconf -> $OPTIONS
> > transformations
> >
> > Line 365:
> > | if grep '^htdig' $OPTIONS >/dev/null 2>&1 ; then
> >
> > This is probably correct, but it highlights that other places testing
> > for options are too strict when using grep -x 'htdig'.
>
> I'll look into that later.  Since those greps are not only used in
> maintainer scripts, but also e.g. in /etc/init.d/wwwoffle, it is at
> least consistent.  Don't know whether it is documented; I'd say it isn't
> RC.

I believe to have found them not to be consistent:

$ grep -h grep * | sed -e 's/^[ \t]*//g' | sort -u

shows at least usages of -x (whole line) vs. -w (whole word) which should be 
investigated for semantic correctness. Especially this worries me:

wwwoffle.postinst:134:    if grep -qsx ppp $OPTIONS; then
wwwoffle.postinst:383:    if grep '^PPP' $OPTIONS >/dev/null 2>&1 ; then

> > Line 368 and 372:
> > |         perl -i -e 'while (<>) { next if /htdig/; print; }' $OPTIONS
> >
> > This skips _all_ lines containing 'htdig' including comments
>
> So it should be /^\s*htdig/, right?  I'd prefer to comment it out, this
> would be
>
> perl -i -e 's/^(\s*htdig)/# $1/'
>
> modulo the changes for -i.  The current code does not preserve comments
> after the htdig option.

Indeed. in the face of the grep problems it'd should perhaps be required, 
documented and checked (use -x or '^opt' everywhere) that all options start 
on the first column.

> > Line 397, 412, 423:
> > |CRONTAB=/etc/cron.d/wwwoffle
> >
> > [..]
> >
> > |        if [ -s $CRONTAB ]; then
> >
> > This too is not special cased to the not-upgrading case and fails if
> > $CRONTAB is a symlink.
> >
> > The postinst goes on to munge or recreate the crontab. Again without
> > checking for symlinks or admin-removal of the file.
>
> What do you mean with "fails if it is a symlink"?
>
> $ ln -s foo bar
> [EMAIL PROTECTED]:~/area$ ll
> total 12
> lrwxrwxrwx  1 frank frank 3 2005-04-05 17:37 bar -> foo
> [EMAIL PROTECTED]:~/area$ test -s bar; echo $?
> 0
>
> So it should not matter whether the file is a real file with nonzero
> size, or a symlink to such a file.
>
> And in this case, I think, it is *not* a problem if the file is created,
> because it is created with only comments.

Indeed.

> > Line 448:
> > | # now duplicate directory structure of /usr/share/wwwoffle/html to
> > | /etc/wwwoffle/html
> >
> > Followed by approximatly 20 lines of shell code which probably amount to
> > a 'cp -s' which I _think_ could be replaced by a 'ln -s
> > /usr/share/wwwoffle/html /etc/wwwoffle/html' iff the package is not
> > upgrading and there is no /etc/wwwoffle/html.
>
> I am not sure that I understand the purpose of the code, but it seems to
> me that
>
> - the directories in /etc/wwwoffle/html should be shipped in the deb
>
> - all those symlinks are in fact not configuration "files".  Of course
>   it alters the behaviour of the package if RefreshFormError.html points
>   to something else than the file shipped in the deb, but this is not a
>   usual configuration task - it's rather something that one would
>   normally achieve by patching the package.
>
> I do not think it is something for an NMU to clean this up, which would
> amount to a very big change.  And I think if the maintainer script do
> not respect local changes for something that shouldn't be a
> configuration file at all, it is not release-critical.

Your call. As the "replacement" thingy above, this should probably be replaced 
by a configurable path-to-shipped-files. Perhaps file a separate bug about 
this stuff that it's not forgotten?

> So, this is already long enough.  I'm sending it now, and start a new
> mail for things I discovered newly.

Thank you for your time and work.


Regards, David
-- 
- hallo... wie gehts heute?
- *hust* gut *rotz* *keuch*
- gott sei dank kommunizieren wir über ein septisches medium ;)
 -- Matthias Leeb, Uni f. angewandte Kunst, 2005-02-15

Reply via email to