Cuma buat dokumentasi biar gak lupa, script ini untuk FTP dengan menggunakan expect.
Biasa dipake buat mining data sih jadi transfer raw log ke server data mining lalu di olah sebelum dimasukin ke database.
Dibawah ini scriptnya.
#!/bin/bash
VER="V3.0"
VER_DATE="26-04-2010"
#MapUssd
REMOTE_TRANSFER_ENABLE[0]=""                          # 0 -disable 1 -enable(default)
REMOTE_TRANSFER_MODE[0]=""                            # 0 -put files to remote 1 -get files from remote
REMOTE_USERNAME[0]=""                           # Username for sftp (Remote Destination)
REMOTE_PASSWORD[0]=""                          # password (Remote Password)
REMOTE_IP[0]=""                            # Remote destination server ip (UMBRPTCL5)
REMOTE_IP_PORT[0]="22"                                 # Remote destination server ip port
REMOTE_DEST_PATH[0]=""     # Remote destination directory
LOGFILE_PREFIX[0]=""                             # File prefix
LOGFILE_TYPE[0]=""                                 # File extention
LOGFILE_MINSIZE[0]=""                                  # File minimum size
LOCAL_DEST_PATH[0]=""  # Local destination
ZIP_AFTER_TRANSFER[0]=""                              # 0 -disable 1 -enable zip after file transferred (realtime mode only)
DELETE_AFTER_TRANSFER[0]=""                                       # 0 -disable 1 -enable delete after file transferred (realtime mode only)
# [Systerm Default value setting ]
DATETIME=`date +'%Y%m%d'`
FILE_DATE=`TZ='GMT+23.59' date +'%Y%m%d'`
#FILE_DATE=`TZ='GMT+23.59' date +'%Y%m%d' --date='1 days ago'` # Satu hari yang lalu
LAST_MODIFIED_TIME="30"                      # value in min
FILELIST_TMPFILE="/tmp/tmpfilelist"
RES_TMPFILE="/tmp/tmpRESULTOUTPUT"
SFTP_OUTPUT_TMPFILE="" #fill with your directory for output log
###################################################################
#   Do not Edit any value after this line                         #
###################################################################
# Check OS type and define command path
OSTYPE=`uname |tr [A-Z] [a-z]`
case $OSTYPE in
 sunos|SunOS) 
  FIND="/usr/local/bin/find"
  EXPECT="/usr/local/bin/expect"
  SFTP="/usr/local/bin/sftp"
  SSH="/usr/local/bin/ssh"
  if [ ! -e "$FIND" ]; then
   echo "Unable to locate $FIND"
   echo "Please install findutils-4.2.30-sol9-sparc-local or above"
   EXIT=1
  fi
  if [ ! -e "$EXPECT" ]; then
   echo "Unable to locate $EXPECT"
   echo "Please install  expect-5.43.0-sol9-sparc-local or above"
   EXIT=1
  fi
  if [ ! -e "$SFTP" ]; then
   echo "Unable to locate $SFTP"
   echo "Please install  openssh-4.7p1-sol9-sparc-local or above"
   EXIT=1
  fi
  if [ "$EXIT" == "1" ]; then
   echo "Unable to continue due to missing packages!"
   exit 1
  fi
  ;;
 linux|Linux) 
  FIND="/usr/bin/find"
  EXPECT="/usr/bin/expect"
  SFTP="/usr/bin/sftp"
  SSH="/usr/bin/ssh"
  
  if [ ! -e "$SFTP" ]; then
   echo "Unable to locate $SFTP"
   echo "Please install expect-5.42.1-1 or above"
   EXIT=1
  fi
  if [ "$EXIT" == "1" ]; then
   echo "Unable to continue due to missing packages!"
   exit 1
  fi
  ;;
 *) echo "Unsupported OS type [$OSTYPE] "
  exit 1
  ;;
 esac
# calculate number of configured destination ip
numarr=${#REMOTE_IP[*]}
numarr=`expr $numarr - 1`
# will not allow interrupt during script run
OWN_PID=`echo $$`
trap "echo -n "wait." " 1 2 3 15
# Function to Display current script usage
usage()
{
  echo "SFTP_uclog.sh $VER [ $VER_DATE ]"
  echo "Usage: $(basename $0) [-a] [-d value] " >&2
  echo "OPTIONS"
  echo "   -a   Interactive mode"
  echo "        For e.g. $(basename $0) -a"
  echo "   -d   Date of the file needed to transfer (YYYYMMDD format)"
  echo "        For e.g. $(basename $0) -d 20070831"
  echo "   -r   RealTime mode"
  echo "        For e.g. $(basename $0) -r"
  exit 2
}
# Function to display transfering progress but not for REALTIME mode
PROGRESSBAR(){
  trap "echo '.DONE'; exit" 1 2 3 15
  echo -n "Session $1 Progressing..."
  while true ;
    do
      sleep 3
      echo -n .
    done
}
# Function to convert month which in number to Alphabet
MONTH_CHECK() {
  MONTHS="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"
  echo $MONTHS |awk '{print $'"${1}"' }'
}
# Function to transfer file using SFTP protocol
# This function included to GET or PUT or Batch file features
SFTP_FUNC()
{
# start sftp session and transfer log from remote to local
# Begin file transfer using expect command
# 1 = local dest path
# 2 = remote username
# 3 = remote password
# 4 = remote ip
# 5 = remote port
# 6 = remote dest path
# 7 = filename
# 8 = GET/PUT file
# 9 = Batch file list
if [ "$9" == "" ]; then
   PROGRESSBAR $i &
   PROGRESSBAR_PID=`echo $!`
    var=`$EXPECT << EOF
            set timeout -1
            log_user 1
#            log_file -noappend $SFTP_OUTPUT_TMPFILE
log_file $SFTP_OUTPUT_TMPFILE
            spawn $SFTP -oPort=$5 $2@$4
            expect {
                       "Are you sure you want to continue connecting"
                       {
                       send "yes\r"
                       exp_continue
                       }
                       "*?assword*"
                       {
                       send "$3\r"
                       exp_continue
                       }
                       "sftp> "
                       {
                       send "lcd $1\r"
                       expect "sftp> "
                       send "cd $6\r"
                       expect "sftp> "
                       send "$8 $7\r"
                       }
                   }
            expect "sftp>"
            send "bye\r"
EOF`
kill $PROGRESSBAR_PID
return 0
else
     var=`$EXPECT << EOF
            set timeout -1
            log_user 1
#            log_file -noappend $SFTP_OUTPUT_TMPFILE
     log_file $SFTP_OUTPUT_TMPFILE
            spawn $SFTP -o "batchmode no" -b $9 -oPort=$5 $2@$4
            expect {
                       "Are you sure you want to continue connecting"
                       {
                       send "yes\r"
                       exp_continue
                       }
                       "*?assword*"
                       {
                       send "$3\r"
                       exp_continue
                       }
                   }
EOF`
return 0
fi
}
# Function to Get remote Server latest file list thru SFTP
GET_REMOTE_LATEST_FILELIST_FUNC()
{
    A=$1
    B=$2
    C=$3
    D=$4
    E=$5
    F=$6
    G=$7
    H=$8
    I=$9
    var=`$EXPECT << EOF
            set timeout -1
            log_user 1
            log_file -noappend $RES_TMPFILE
            spawn $SSH -oPort=$E $B@$D
            expect {
                       "Are you sure you want to continue connecting"
                       {
                       send "yes\r"
                       exp_continue
                       }
                       "*?assword*"
                       {
                       send "$C\r"
                       exp_continue
                       }
                       "$ "
                       {
                       send "cd .. \r"
                       expect "$ "
                       send "nice -n 19 $FIND $F  -name $G\*$I -exec basename {} '\;' \r"
                       expect "$ "
                       send "\r"
                       }
                   }
            expect "$ "
            send "bye\r"
EOF`
#fi
return 0
}
# Function to zip remote server file which being transferred completely
ZIP_REMOTE_FILE_AFTER_TRANSFER()
{
    A=$1
    B=$2
    C=$3
    D=$4
    E=$5
    F=$6
    G=$7
    H=$8
    I=$9
    var=`$EXPECT << EOF
            set timeout -1
            log_user 1
#            log_file -a $SFTP_OUTPUT_TMPFILE
            log_file $SFTP_OUTPUT_TMPFILE
            spawn $SSH -oPort=$E $B@$D
            expect {
                       "Are you sure you want to continue connecting"
                       {
                       send "yes\r"
                       exp_continue
                       }
                       "*?assword*"
                       {
                       send "$C\r"
                       exp_continue
                       }
                       "$ "
                       {
                       send "cd .. \r"
                       expect "$ "
                       send "nice -n 19 $FIND $F -name $G -exec nice -n 19 gzip -f {} '\;' \r"
                       expect "$ "
                       send "\r"
                       }
                   }
            expect "$ "
            send "bye\r"
EOF`
#fi
return 0
}
# Function to cater RealTime options
REALTIME_FUNC()
{
    echo "Session $1 REALTIME start"
    A=${LOCAL_DEST_PATH[$1]}
    B=${REMOTE_USERNAME[$1]}
    C=${REMOTE_PASSWORD[$1]}
    D=${REMOTE_IP[$1]}
    E=${REMOTE_IP_PORT[$1]}
    F=${REMOTE_DEST_PATH[$1]}
    G=${LOGFILE_PREFIX[$1]}
    H=$FILE_DATE
    I=${LOGFILE_TYPE[$1]}
    MON_DIR=`echo $FILE_DATE|cut -c 5-6`
    MON_DIR=`MONTH_CHECK $MON_DIR`
    A=`echo $A | sed 's/MONTH_DIR/'$MON_DIR'/g'`
    F=`echo $F | sed 's/MONTH_DIR/'$MON_DIR'/g'`
    echo > $FILELIST_TMPFILE
 if [ ${REMOTE_TRANSFER_MODE[$1]} == "0" ]; then
     echo "Session $1 Transfer local files to remote"
     GET_FILELIST=(`nice -n 19 $FIND $A -maxdepth 1  -name \*$I -regex .*$G.* -mmin -60  -exec basename {} \; `)
     echo "Session $1 Total Files = ${#GET_FILELIST[*]}"
     if [ "${#GET_FILELIST[*]}" -gt 0 ]; then
  FILELISTARR=${#GET_FILELIST[*]}
  FILELISTARR=`expr $FILELISTARR - 1`
  echo "lcd $A" > $FILELIST_TMPFILE
  for (( i = 0 ; i <= $FILELISTARR ; i++ ))
   do
           if [ `/sbin/fuser -uv $A${GET_FILELIST[$i]} |wc -l` == "0" ]; then
       echo "put ${GET_FILELIST[$i]} $F${GET_FILELIST[$i]}.tmp" >> $FILELIST_TMPFILE
       echo "rename $F${GET_FILELIST[$i]}.tmp $F${GET_FILELIST[$i]}" >> $FILELIST_TMPFILE
            sleep 2 
 fi
   done
  echo bye >> $FILELIST_TMPFILE
  SFTP_FUNC $A $B $C $D $E $F Null put $FILELIST_TMPFILE
  if [[ "${ZIP_AFTER_TRANSFER[$1]}" == "1" ]]; then
   for (( i = 0 ; i <= $FILELISTARR ; i++ ))
    do
     nice -n 19 $FIND $A -maxdepth 1 -name ${GET_FILELIST[$i]}  -exec nice -n 19 gzip -f {} \;
    done
              echo "Session $1 FILE Zipping was Done!"
          else
                    echo "Session $1 FILE Zipping Skipped!"
            echo "Session $1 FILE Transfer Completed"
        fi
  if [[ "${DELETE_AFTER_TRANSFER[$1]}" == "1" ]]; then
   for (( i = 0 ; i <= $FILELISTARR ; i++ ))
    do
     nice -n 19 $FIND $A -maxdepth 1 -name ${GET_FILELIST[$i]} -exec nice -n 19 rm -f {} \;
    done
     echo "Session $1 FILE Delete was Done!"
    else
     echo "Session $1 FILE Delete Skipped!"
     
   echo "Session $1 FILE Delete Completed"
  fi
  return 0
    else
  echo "Session $1 NO FILE FOUND!"
  return 1
    fi
 else
     echo "Session $1 Transfer remote files to local"
     GET_REMOTE_LATEST_FILELIST_FUNC $A $B $C $D $E $F $G $H $I
     wait
     dos2unix -a $RES_TMPFILE >/dev/null 2>&1
     GET_FILELIST=(`grep -v $FIND $RES_TMPFILE |grep  ${LOGFILE_TYPE[$1]} | grep ${LOGFILE_PREFIX[$1]} `)
     echo "Session $1 Total Files = ${#GET_FILELIST[*]}"
     if [ "${#GET_FILELIST[*]}" -gt 0 ]; then
  FILELISTARR=${#GET_FILELIST[*]}
  FILELISTARR=`expr $FILELISTARR - 1`
  echo "cd $F" > $FILELIST_TMPFILE
  for (( i = 0 ; i <= $FILELISTARR ; i++ ))
   do
    echo "get ${GET_FILELIST[$i]}" $A >> $FILELIST_TMPFILE
   done
  echo bye >> $FILELIST_TMPFILE
  SFTP_FUNC $A $B $C $D $E $F Null get $FILELIST_TMPFILE
  if [[ "${ZIP_AFTER_TRANSFER[$1]}" == "1" ]]; then
   for (( i = 0 ; i <= $FILELISTARR ; i++ ))
    do
     ZIP_REMOTE_FILE_AFTER_TRANSFER $A $B $C $D $E $F ${GET_FILELIST[$i]}
    done
              echo "Session $1 FILE Zipping was Done!"
          else
                    echo "Session $1 FILE Zipping Skipped!"
   echo "Session $1 FILE Transfer Completed"
  fi
  
  if [[ "${DELETE_AFTER_TRANSFER[$1]}" == "1" ]]; then
   for ((i = 0; i <= $FILELISTARR; i++))
    do
     DELETE_REMOTE_FILE_AFTER_TRANSFER $A $B $C $D $E $F ${GET_FILELIST[$i]}
    done
     echo "Session $1 FILE Deleting was DONE!"
    else
     echo "Session $1 FILE Deleting Skipped!"
   echo "Session $1 FILE Delete Completed"
  fi
  return 0
     else
  echo "Session $1 NO FILE FOUND!"
  return 1
     fi
 fi
}
# Funtion to cater non-realtime mode
# For eg, transfer yesterday file or user specified
SESSION_FUNC()
{
    echo "Session $1 start"
    A=${LOCAL_DEST_PATH[$1]}
    B=${REMOTE_USERNAME[$1]}
    C=${REMOTE_PASSWORD[$1]}
    D=${REMOTE_IP[$1]}
    E=${REMOTE_IP_PORT[$1]}
    F=${REMOTE_DEST_PATH[$1]}
    G=${LOGFILE_PREFIX[$1]}*$FILE_DATE*${LOGFILE_TYPE[$1]}
    MON_DIR=`echo $FILE_DATE|cut -c 5-6`
    MON_DIR=`MONTH_CHECK $MON_DIR`
    A=`echo $A | sed 's/MONTH_DIR/'$MON_DIR'/g'`
    F=`echo $F | sed 's/MONTH_DIR/'$MON_DIR'/g'`
    if [ "${REMOTE_IP[$1]}" != "" ]; then
        if [ ${REMOTE_TRANSFER_ENABLE[$1]} == "1" ]; then
            echo "Session $1 Normal Transfer enabled"
            if [ ${LOCAL_DEST_PATH[$1]} != "" ]; then
               if [ ${REMOTE_TRANSFER_MODE[$1]} == "0" ]; then
    echo "Session $i Transfer local files to remote"
                  SFTP_FUNC $A $B $C $D $E $F $G put
               else
           echo "Session $i Transfer remote files to local"
                  SFTP_FUNC $A $B $C $D $E $F $G get
               fi
        wait
            fi
        elif [ "${REMOTE_TRANSFER_ENABLE[$1]}" == "0" ]; then
            echo "Remote Transfer for $1 = Disabled"
            return 0
        else
            echo "Session $1 Invalid Option"
            return 1
        fi
    else
      echo "Session $1 Invalid Option"
      return 1
    fi
}
# Function to delete remote server file which being transferred completely
DELETE_REMOTE_FILE_AFTER_TRANSFER()
{
    A=$1
    B=$2
    C=$3
    D=$4
    E=$5
    F=$6
    G=$7
    H=$8
    I=$9
    var=`$EXPECT << EOF
            set timeout -1
            log_user 1
            log_file -a $SFTP_OUTPUT_TMPFILE
            spawn $SSH -oPort=$E $B@$D
            expect {
                       "Are you sure you want to continue connecting"
                       {
                       send "yes\r"
                       exp_continue
                       }
                       "*?assword*"
                       {
                       send "$C\r"
                       exp_continue
                       }
                       "$ "
                       {
                       send "cd .. \r"
                       expect "$ "
                       send "nice -n 19 $FIND $F -name $G -exec nice -n 19 rm -f {} '\;' \r"
                       expect "$ "
                       send "\r"
                       }
                   }
            expect "$ "
            send "bye\r"
EOF`
#fi
return 0
}
###########################################
#               MAIN
###########################################
# To collect User specify info if any
if [ $# == "0" ]; then
    echo "Transfer All Log Files with date = $FILE_DATE"
else
    echo "Options on"
while getopts 'ad:vr' OPTION
 do
 case $OPTION in
  a)   # List all current config and let accept user input
   echo "Selection:"
   for (( i = 0 ; i <= $numarr ; i++ ))
    do
     echo -e "\t $i ) ${REMOTE_IP[$i]} ${REMOTE_DEST_PATH[$i]}"
    done
    echo -n "Please choose which file needed to transfer = "
    read USR_OPT
   if [ "$USR_OPT" == "" ] ; then
    echo "No input! Bye"
    exit
   else
    echo "User Input Option = $USR_OPT"
    echo -n "Are you sure? [y|n]"
    read USR_OPT_FLAG
    case $USR_OPT_FLAG in
     y|Y) USR_OPT=$USR_OPT
      OPT_FLAG=1
      ;;
     *) echo Bye
     exit 0
      ;;
    esac
   fi
   ;;
   d)   # Date specified by user
        # count the len of the arguement given
            /usr/bin/expr $OPTARG - 0 >/dev/null 2>&1
            INTCHECK=$?
            if [ "$INTCHECK" == "0" ]; then
    DATE_LEN=${#OPTARG}
    if [ "$DATE_LEN" -ne 8 ]; then
     echo "Wrong Date Format! = $OPTARG"
     usage
     exit
    fi
    echo "Transfer Log File with date = $OPTARG"
    echo -n "Are you sure?[y/n]"
    read USER_COMFIRMATION
    case $USER_COMFIRMATION in
     y|Y)
      FILE_DATE=$OPTARG
      ;;
     *)echo bye
      exit
      ;;
    esac
            else
                usage
    exit 0
            fi
        ;;
   r)   # real time mode
        echo "Real Time mode enable"
        REALTIME_ENABLE=1
        ;;
   *)   usage
        ;;
 esac
done
fi
# Processing Part
if [ "$REALTIME_ENABLE" == 1 ]; then
 for (( y = 0 ; y <= $numarr ; y++ ))
  do
   FILE_DATE=`date '+%Y%m%d'`
   REALTIME_FUNC $y
  done
else
 if [ "$OPT_FLAG" == 1 ]; then
  for y in $USR_OPT
   do
    SESSION_FUNC $y
   done
 else
  for (( y = 0 ; y <= $numarr ; y++ ))
   do
    SESSION_FUNC $y
   done
 fi
fi
exit 0
 
No comments:
Post a Comment