#!/bin/bash
# $Id: ipt-filter-sunrpc,v 1.2 2007/01/25 19:08:47 friedman Exp $

# Assuming that packet filtering is enabled, this script allows or
# disallows sunrpc packets to pass through.

portinfo()
{
  rpcinfo -p "$@" | perl -ane '
    if ($F[2] =~ /^(tcp|udp)$/) { $p{$F[2]}{$F[3]} = 1 }
    END { map { @p = sort { $a <=> $b } keys %{$p{$_}};
                print $_, " ", join (",", @p), "\n" }
              sort { $a cmp $b } keys %p
        }'
}

currentfilter()
{
  iptables -L INPUT -n | awk '/ipt-filter-sunrpc/ {print $2, $8}'
}

ipt()
{
  local op=$1
  local proto=$2
  local ports=$3
  shift 3

  set fnord \
      ${IPTABLES-iptables} \
      $op INPUT \
      -p $proto \
      -m multiport \
      --dports $ports \
      -m comment \
      --comment "ipt-filter-sunrpc" \
      "$@" \
      -j ACCEPT
  shift

  echo + "$@"
  "$@"
}

main()
{
  case ${EUID-${UID-`id -u`}} in
    0 ) : ;;
    * ) exec sudo "$0" "$@" ;;
  esac

  case $1 in
    on  | allow | enable  ) op=-I cmd=portinfo ;;
    off | deny  | disable ) op=-D cmd=currentfilter ;;
    * ) echo "Usage: ${0##*/} [allow|deny]" 1>&2 ; exit 1 ;;
  esac

  shift

  $cmd | while read proto ports ;
  do
    ipt $op $proto $ports "$@"
  done
}

main "$@"

# eof
