Please find attached version 0.2 of the script, which provides
better handling in case iptables support is not enabled.

-- 
Please do not send copies of list mail to me; I read the list!
 
 .''`.     martin f. krafft <[EMAIL PROTECTED]>
: :'  :    proud Debian developer and author: http://debiansystem.info
`. `'`
  `-  Debian - when you have better things to do than fixing a system
#!/bin/bash -eu
#
# iptables-apply -- a safer way to update iptables remotely
#
# Copyright © 2006 martin f. krafft <[EMAIL PROTECTED]>
# Released under the terms of the Artistic Licence.
#

PROGNAME=${0##*/}
PROGVERSION=0.2
TIMEOUT=10

blurb()
{
  cat <<EOF
$PROGNAME version $PROGVERSION -- a safer way to update iptables remotely
EOF
}

copyright()
{
  cat <<EOF
$PROGNAME is (c) 2006 by martin f. krafft <[EMAIL PROTECTED]>.

The programme has been published under the terms of the Artistic Licence.
Please see http://www.opensource.org/licenses/artistic-license.php for
more information. On Debian systems, you may find the text of the licence in
/usr/share/common-licenses/Artistic as well.
EOF
}

about()
{
  blurb
  echo
  copyright
}

usage()
{
  cat <<EOF
Usage:
  $PROGNAME [options] ruleset

  The script will try to apply a new ruleset (as output by iptables-save/read
  by iptables-restore) to iptables, then prompt the user whether the changes
  are okay. If the new ruleset cut the existing connection, the user won't be
  able to answer affirmatively. In this case, the script rolls back to the
  previous ruleset.

  The following options may be specified, using standard conventions:

    -t | --timeout            Specify the timeout in seconds (default: $TIMEOUT)
    -V | --version            Display version information
    -h | --help               Display this help text
EOF
}

SHORTOPTS=t:Vh
LONGOPTS=timeout:,version,help

OPTS=$(getopt -s bash -o $SHORTOPTS -l $LONGOPTS -n $PROGNAME -- "$@") || exit 
$?
for opt in $OPTS; do
  case $opt in
    -*) unset OPT_STATE;;
    *)
      case ${OPT_STATE:-} in
        SET_TIMEOUT) 
          eval TIMEOUT=$opt
          case "$TIMEOUT" in
            [0-9]*) :;;
            *)
              echo "E: non-numeric timeout value." >&2
              exit 1
              ;;
          esac
          ;;
      esac
      ;;
  esac

  case $opt in
    -h|--help) usage >&2; exit 0;;
    -V|--version) about >&2; exit 0;;
    -t|--timeout) OPT_STATE=SET_TIMEOUT;;
    --) break;;
  esac
  shift
done

FILE=${1:-}

if [ -z "$FILE" ]; then
  echo E: missing file argument. >&2
  exit 1
fi

if [ ! -r "$FILE" ]; then
  echo E: cannot read $FILE >&2
  exit 2
fi

case "${0##*/}" in
  *6*)
    SAVE=ip6tables-save
    RESTORE=ip6tables-restore
    ;;
  *)
    SAVE=iptables-save
    RESTORE=iptables-restore
    ;;
esac

COMMANDS=(mktemp $SAVE $RESTORE)

for cmd in [EMAIL PROTECTED]; do
  if ! command -v $cmd >/dev/null; then
    echo E: command not found: $cmd >&2
    exit 127
  fi
done

umask 0700

TMPFILE=$(mktemp /tmp/ipt.XXXXXX)
trap "rm -f $TMPFILE" 0

if ! $SAVE > $TMPFILE; then
  if ! grep -q ipt /proc/modules 2>/dev/null; then
    echo "E: iptables support lacking from the kernel." >&2
    exit 3
  else
    echo "E: unknown error saving current iptables ruleset." >&2
    exit 4
  fi
fi

echo -n "Applying new ruleset... "
$RESTORE < $FILE
echo done.

PROMPT="Ruleset applied; are you seeing this message?"
unset ret 
read -p"$PROMPT " -n1 -t ${TIMEOUT:-15} ret 2>&1 || :
case "${ret:-}" in
  y*|Y*|j*|J*|1|t*|T*)
    echo
    echo ... then my job is done. See you next time.
    exit 0
    ;;
  *)
    :;;
esac

if [ -z "${ret:-}" ]; then
  echo "apparently not..."
else
  echo
fi
echo "Timeout. Something happened (or did not). Better play it safe..."
echo -n "Reverting to old ruleset... "
$RESTORE < $TMPFILE
echo done.

exit 0

Attachment: signature.asc
Description: Digital signature (GPG/PGP)

Reply via email to