#!/bin/sh
##
## search TEXT file and change IP Addr
##
## san2(at)linuxchannel.net
## -- 2005.10.25: support only file
##    2005.08.29: support FreeBSD
##    2005.08.26: support muti directory
##    2003.03.25: new build

usage()
{
  echo 'search TEXT file and change IP Addr' >&2
  echo "usage : $0 [OPTIONS] diretory_path [...]" >&2
  echo 'OPTIONS' >&2
  echo '  -h, --help        : help, print this message and exit.' >&2
  echo "      --workdir=DIR : base work directory, default \`/home/system.ipch'" >&2
  echo "                      don't set \`/' physical path." >&2
  echo '  -s, --status      : view of status.' >&2
  echo '  -t, --pkg         : make tar.gz packaging.' >&2
  echo '  -f <file>         : only <file> change IP Addr' >&2
  exit 1
}

## only Linux
## but FreeBSD exists `realpath' command
##
_realpath()
{
  _PATH=$1
  _CWD=`pwd`

  if [ X"`echo ${_PATH} | grep ^/`" != "X" ] ;
  then
    _CWD=''
  else
    while [ X"`echo ${_PATH} | grep '^../'`" != "X" ] ;
    do
        _PATH=`echo "${_PATH}" | sed -e 's;^\.\./;;'`
        _CWD=`dirname ${_CWD}`
      done
  fi

  _PATH=`echo "${_CWD}/${_PATH}" | sed -e 's;\./;/;g' -e 's;//;/;g' -e 's;/$;;'`
  _PATH=${_PATH:-/}

  echo -n ${_PATH}
}

## required: SRC sort to DESC(big to lower)
##
## [match.list]
## 192.168.0        192.168.10
## 192.168.0.        192.168.10.
## 192.168.0.0        192.168.10.0
## 192.168.0.1        192.168.10.1
## 192.168.0.128    192.168.10.128
## 192.168.0.255    192.168.10.255
## 192.168.0.XXX    192.168.10.YYY
##
## single quota for sed.
## sort -r match.list | uniq | sed \
##    -e 's;[[:space:]]\+\([^[:space:]]\+\)$;/\1/g;g' \
##    -e 's;^61\.78\.53\.;%s/61\\.78\\.53\\.;g' \
##    -e 's;^61\.78\.53;%s/61\\.78\\.53;g' \
##    -e 's;^;\t;g'
##
changeip()
{
  FILE=$1
  $VI    -e $FILE << ____EOP
    %s/211\.78\.53\.255/222.102.137.255/g
    %s/211\.78\.53\.153/222.102.137.42/g
    %s/211\.78\.53\.152/222.102.137.41/g
    %s/211\.78\.53\.151/222.102.137.69/g
    %s/211\.78\.53\.150/222.102.137.68/g
    %s/211\.78\.53\.128/222.102.137.128/g
    %s/211\.78\.53\.1/222.102.137.1/g
    %s/211\.78\.53\.0/222.102.137.0/g
    %s/211\.78\.53\./222.102.137./g
    %s/211\.78\.53/222.102.137/g
    w! $FILE
____EOP
}

OIFS=${IFS}
IFS='
'

i=1
NUMS=0
for ARGS in $* ;
do
  case "$ARGS" in
    -h|--help)
        usage
        ;;
    --workdir=*)
        PREFIXDIR=`echo "${ARGS}" | awk -F"=" '{print $2}'`
        shift
        ;;
    -s|--status)
        STATUS=TRUE
        shift
        ;;
    -t|--pkg)
        DOPKG=TRUE
        shift
        ;;
    -f)
        NEXT=`expr $i + 1`
        eval FILE="\${$NEXT}"
        break
        ;;
    -*)
        shift
        ;;
    *)
        if [ -d ${ARGS} ] ; then
            NUMS=`expr $NUMS + 1`
            DIRS=${DIRS}${IFS}${ARGS}
        else
            echo  "not found directory($ARGS)" >&2
        fi
        ;;
  esac
  i=`expr $i + 1`
done

## check O/S
##
case "`uname -s 2>/dev/null`" in
  FreeBSD)
    OS=FreeBSD
    VI=/usr/local/bin/vim
    ;;
  Linux)
    OS=Linux
    VI=/usr/bin/vim
    ;;
  *)
    OS=Others
    VI=`which vim 2>/dev/null`
esac

##########################################
##
GREPNETWORK="211\.78\.53"            ## don't set end dot(.)
PREFIXDIR=${PREFIXDIR:-/home/system.ipch}    ## base directory
NEWSYSDIR="${PREFIXDIR}/sysip.new"        ## new ip changed file directory
BACKUPDIR="${PREFIXDIR}/sysip.orig.backup"    ## orignal file backup directory
##
##########################################

DATE=`date "+%Y%m%d-%H%M" 2>/dev/null`
SHSELF=`basename $0`

## check vim
##
[ ! -x "${VI}" ] &&
{
  echo "vim -- $VI not found !!!" >&2
  echo "set to VI=/path/to/vim in this shell script." >&2
  exit 1
}

## for only file
##
[ -n "${FILE}" ] &&
{
  [ ! -f "${FILE}" ] &&
  {
    echo "file not found: ${FILE}" >&2
    exit 1
  }

  [ X"${SHSELF}" = X"${FILE}" ] &&
  {
    echo "is self file: ${FILE}" >&2
    exit 1
  }

  TYPE=`file "${FILE}" 2>/dev/null | awk -F": " '{print $2}'`
  [ -n "${STATUS}" ] && echo "try to searching ... ${FILE}"

  ## it's text file
  ##
  if [ X"`echo ${TYPE} | grep -i text`" != "X" ] ;
  then
    SEARCHIP=`grep "${GREPNETWORK}" "${FILE}" 2>/dev/null`
    [ X"$SEARCHIP" != "X" ] &&
    {
        echo "Backup : ${FILE}.bak"
        cp -pf ${FILE} ${FILE}.bak

        echo "Parsing: changing to new IP ADDR ..."
        changeip ${FILE}
    }
  else
    echo "is not text file: ${FILE}" >&2
  fi

  exit 0
}

exit 0

## rewrite
##
PREFIXDIR=`_realpath ${PREFIXDIR}`

## check work directory
##
[ X"${PREFIXDIR}" = X"/" ] &&
{
  echo "Error: --workdir=${PREFIXDIR} don't set \`/' physical path." >&2
  usage
  exit 1
}

## check ARGS and is root
##
[ "$NUMS" -lt 1 ] && usage
[ `id -u` != 0 ] && { echo "requried by root privilege" >&2 ; exit 1; }

## old backup diretory
##
[ -d "${NEWSYSDIR}" ] && mv -f ${NEWSYSDIR} ${NEWSYSDIR}-old-${DATE}
[ -d "${BACKUPDIR}" ] && mv -f ${BACKUPDIR} ${BACKUPDIR}-old-${DATE}

## -size b(block,default), c(bytes), k(Kbytes,only Linux), w(2-bytes word,only Linux)
##
for DIR in $DIRS ;
do
  echo "finding .... $DIR"
  for F in `find ${DIR} -type f -a -size -1048576c -a ! -ipath "${PREFIXDIR}*"  -a ! -iname "$SHSELF" \
    -a ! -iname "*.log" -a ! -iname "*log*"   \
    -a ! -iname "*.jpg" -a ! -iname "*.jpeg" -a ! -iname "*.gif" -a ! -iname "*.bmp" \
    -a ! -iname "*.png" -a ! -iname "*.psd"  -a ! -iname "*.swf" -a ! -iname "*.pdf" \
    -a ! -iname "*.ps"  -a ! -iname "*.rtf"   \
    -a ! -iname "*.bin" -a ! -iname "*.exe"  -a ! -iname "*.rpm" \
    -a ! -iname "*.xls" -a ! -iname "*.ppt"  -a ! -iname "*.zip" \
    -a ! -iname "*.bz"  -a ! -iname "*.gz"   -a ! -iname "*.tar" -a ! -iname "*.tgz" \
    -a ! -iname "*.ogg" -a ! -iname "*.mp3"  -a ! -iname "*.ra"  -a ! -iname "*.rm"  \
    -a ! -iname "*.wav" -a ! -iname "*.mov"  -a ! -iname "*.avi" -a ! -iname "*.mpg" \
    -a ! -iname "*.db"  -a ! -iname "*.frm"  -a ! -iname "*.MYD" -a ! -iname "*.MYI" \
    -a ! -iname "*.h"   -a ! -iname "*.c"    -a ! -iname "*.o"   -a ! -iname "*.so"  \
    -a ! -iname "*.a"   -a ! -iname "*.la"   -a ! -iname "*.dso" -a ! -iname "*.dll" \
    -a ! -iname ".*history" -a ! -iname "trace*" -a ! -iname "known_hosts"           \
    -a ! -iname ".viminfo"` ;
  do
    TYPE=`file "$F" 2>/dev/null | awk -F": " '{print $2}'`
    [ -n "${STATUS}" ] && echo "try to searching ... ${F}"

    ## it's text file
    ##
    if [ X"`echo ${TYPE} | grep -i text`" != "X" ] ;
    then
        SEARCHIP=`grep "${GREPNETWORK}" "${F}" 2>/dev/null`
        [ X"$SEARCHIP" != "X" ] &&
        {
            #DDIR=`echo "${F}" | sed -e "s;^/\(.\+\)/[^/]\+$;\1;g"`
            DDIR=`dirname "${F}" | sed -e 's;^/;;'`
            FFILE=${F##*/}

            [ ! -d "${NEWSYSDIR}/${DDIR}" ] && mkdir -p "${NEWSYSDIR}/${DDIR}"
            [ ! -d "${BACKUPDIR}/${DDIR}" ] && mkdir -p "${BACKUPDIR}/${DDIR}" ## backup directory

            cp -pf "$F" "${NEWSYSDIR}/${DDIR}/"
            cp -pf "$F" "${BACKUPDIR}/${DDIR}/"

            echo "Backup : ${BACKUPDIR}/${DDIR}/${FFILE}"
            echo "Parsing: changing to new IP ADDR ..."
            changeip "${NEWSYSDIR}/${DDIR}/${FFILE}"
            MAKEPKG=TRUE
        }
    fi
  done
done

[ -n "${MAKEPKG}" ] &&
{
  echo ''
  echo 'Backup and Parsing done !!!'
  echo "see new system ipset files: ${NEWSYSDIR} drectory"
}

## make package
##
[ -n "${MAKEPKG}" -a -n "${DOPKG}" ] &&
{
  echo ''
  echo 'making packaging ...'
  sleep 1
  cd ${NEWSYSDIR} || exit 1
  tar zcvfp "${PREFIXDIR}/new.system.ipset-${DATE}.tar.gz" * || exit 1

  cat << __END > ${PREFIXDIR}/new.system.ipset.sh
#!/bin/sh
##
## auto packaging, san2@2005.08.27
## make: ${DATE}
##
[ \`id -u\` != 0 ] && { echo 'requried by root privilege' >&2 ; exit 1; }
[ ! -s ${PREFIXDIR}/new.system.ipset-${DATE}.tar.gz ] &&
{
  echo "file not found, ${PREFIXDIR}/new.system.ipset-${DATE}.tar.gz" >&2
  exit 1
}
tar zxvfp ${PREFIXDIR}/new.system.ipset-${DATE}.tar.gz -C /
exit 0
__END

  echo ''
  echo 'making packaging done !!!'
  echo "see ${PREFIXDIR}/new.system.ipset.sh"
}

exit 0