#!/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 : only 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