Tony Nguyen wrote:
> 
> Roland Mainz wrote:
> > Casper.Dik at Sun.COM wrote:
> >>> Tony Nguyen wrote:
> >>>> The updated and incremental webrevs are at:
> >>>>
> >>>> http://cr.opensolaris.org/~tonyn/firewall29Oct2008/
> >>>>
> >>>> http://cr.opensolaris.org/~tonyn/firewall-inc/
> >>>>
> >>>> The original webrev is still available at:
> >>>>
> >>>> http://cr.opensolaris.org/~tonyn/firewall/
> >>> Before starting to comment on the scripts: Is it mandatory for the
> >>> firewall SMF scripts to use /sbin/sh or is /usr/bin/ksh acceptable, too
> >>> ?
> >> Possibly if you make sure that /usr is mounted first.
> >
> > The scripts already use stuff like "sed" ([1]) and AFAIK that means they
> > depend on /usr being mounted.
> >
> > [1]=my main concern is that this script could be slighty reworked to
> > avoid depending on "sed"&co. just to dismantle one single string -
> > builtin shell operators can do the same in a much faster manner (and if
> > we're allowed to use ksh93 we may be able to fold various calls to
> > "svcprop" to just one in a similar manner how
> > http://svn.genunix.org/repos/on/branches/ksh93/gisburn/scripts/svcproptree1.sh
> > works).
> >
> 
> It's a good point. network/ipfilter has a dependency on filesystem/usr
> so that isn't an issue. If we use ksh, it'd have to be ksh93 since
> that's the only version shipped with OpenSolaris. However, making this
> script ksh93 requires method scripts delivered by other teams and
> consolidations to be ksh93 which I'm not ready to mandate and perhaps
> requiring ARC commitment. I'd like to defer the suggested change until
> the follow up IPv6 support work at which I can make that proposal.

AFAIK we do not need ARC since we only affect the base scripts and
"ipf_include.sh" which is consumed by those scripts.

BTW: Some comments about "ipf_include.sh":

- AFAIK it may be better to change "ipf_get_lock" to an implementation
which uses "mkdir" for locks (e.g. basically ([1]) $ mkdir "mylock" &&
printf "lock obtained\n" || printf "could not obtain lock\n" # to obtain
the lock and $ rmdir "mylock" # to release it) since this is the only
operation which is guranteed to be atomic and avoids the creation of
duplicates (if you need an implementation for a lock scheme with
multiple concurrent readers see
http://svn.genunix.org/repos/on/branches/ksh93/gisburn/scripts/filemutexdemo1.sh
(it uses ksh93 classes but I can provide a plain Bourne version on
demand)).

[1]=Untested implementation:
-- snip --
try_lock
{
    lockname="$1"
    mkdir "/tmp/myapplocks.${lockname}" 2>/dev/null && return 0
    return 1
}

obtain_lock()
{
    lockname="$1"
    wait_interval=1 # we should really start with 0.1 but
                    # "expr" does not support floating-point values
    while true ; do
        if try_lock "${lockname}" ; then
            return 0
        fi

        sleep ${wait_interval}
        # double sleep interval to avoid hogging too much
        # resources when busy-waiting
        wait_interval=`expr ${wait_interval} \* 2`
    done

    # not reached
}

release_lock()
{
    lockname="$1"
    rmdir "/tmp/myapplocks.${lockname}"
    return 0
}
-- snip --

- AFAIK these (and likely some other variables) should be lowercase
since they are _not_ exported into the environment unless they are
_readonly_ constants (see
http://www.opensolaris.org/os/project/shell/shellstyle/#names_should_be_lowercase):
-- snip --
  27 ETC_IPF_DIR=/etc/ipf
  28 VAR_IPF_DIR=/var/tmp/ipf
  29 IPFILCONF=$ETC_IPF_DIR/ipf.conf
  30 IPFILOVRCONF=$ETC_IPF_DIR/ipf_ovr.conf
  31 IP6FILCONF=$ETC_IPF_DIR/ipf6.conf
  32 IPFILSVCSCONF=$ETC_IPF_DIR/ipf_services.conf
  33 IPNATCONF=$ETC_IPF_DIR/ipnat.conf
  34 IPPOOLCONF=$ETC_IPF_DIR/ippool.conf
  35 IPF_LOCK=/var/run/ipfilter.pid
  36 CONF_FILES=""
  37 NAT_FILES=""
-- snip --

- Please avoid using "echo", if possible use "printf" (see
http://www.opensolaris.org/os/project/shell/shellstyle/#avoid_echo)
For example:
-- snip --
 696  if [ $? -eq 0 -a -n "$addr" ]; then
 697    echo "pass in log quick proto ${proto} from ${addr}" \
 698    "to ${ip} port = ${port} ${tcp_opts}" >>${out}
 699  fi
-- snip --
... could be changed to...
-- snip --
 696  if [ $? -eq 0 -a -n "$addr" ]; then
 697    printf \
    "pass in log quick proto %s from %s to %s port = %s %s\n" \
    "${proto}" "${addr}" "${ip}" "${port}" "${tcp_opts}" >>${out}
 699  fi
-- snip --

- It may be nice to put the script through the "ksh93 -n" wringer
(ignore the '`...` obsolete, use $(...)' warning since the Bourne shell
does not implement $(..)-style command substitutions). For example for 
"ipf_include.sh" I am getting:
-- snip --
$ ksh93 -n ipf_include.sh 2>&1 | fgrep -v '`...` obsolete, use $(...)' 
ipf_include.sh: warning: line 167: Invariant test
ipf_include.sh: warning: line 193: Invariant test
ipf_include.sh: warning: line 443: Invariant test
-- snip --

- "true" / "false" don't need extra calls of the test operator, e.g. ...
-- snip --
 593         if [ "$isrpc" = "true" ]; then
-- snip --
... can be changed to ...
-- snip --
 593         if "$isrpc" ; then
-- snip --
(assuming "isrpc" only contains the values "true" and "false". POSIX
shell (unfortunately not the original Bourne shell) allows the use of
'!' to negate the return code, e.g. $ /usr/xpg4/bin/sh  -c '( ! false )
&& echo "hello"' # will return "hello").

- Function "generate_rules": You're several times redirecting to file
"out" (e.g. >>${out}) - it may be better to open it only once using $
exec 8>"${out}" # and then use $ printf "foo\n" >&8 # to write such a
file (this will avoid a |open()|/|write()|/|close()| sequence for each
">>"/">"-style redirection).
For ksh93 see
http://www.opensolaris.org/os/project/shell/shellstyle/#use_redirect_not_exec_to_open_files
and
http://www.opensolaris.org/os/project/shell/shellstyle/#use_dynamic_file_descriptors

- The following "mktemp" call should use the PID as part of the pattern,
e.g. change:
-- snip --
 868         TEMP=`mktemp /var/run/ipf.conf.XXXXXX`
 869         process_nonsvc_progs $TEMP
-- snip --
... to ...
-- snip --
 868         TEMP=`mktemp /var/run/ipf.conf.pid$$.XXXXXX`
 869         process_nonsvc_progs $TEMP
-- snip --
This helps to track-down files without owners.

- Function "create_global_rules", lines
-- snip --
 873         if [ "$policy" != "none" ]; then
 877         if [ "$policy" = "deny" ]; then
 899         if [ "$policy" = "allow" ]; then
-- snip --
AFAIK either "case" or nested "if" may be better (or POSIX shell "elif"
for ksh88/ksh93/bash)

- Please make sure all functions have explicit "return" statements at
the end

- You're using tools from /usr/xpg4/bin/ - does this require any updates
of the package dependicies, e.g. make your package depend on "SUNWxcu4"
?
 
----

Bye,
Roland

-- 
  __ .  . __
 (o.\ \/ /.o) roland.mainz at nrubsig.org
  \__\/\/__/  MPEG specialist, C&&JAVA&&Sun&&Unix programmer
  /O /==\ O\  TEL +49 641 3992797
 (;O/ \/ \O;)

Reply via email to