#!/bin/bash
#========================================
#scvbackup 2018/12/26
#Copyright J's Communication Co., Ltd.
#========================================

PROGNAME="scvbackup"
PROGVER="1.2.3"
UPDATED="2018/12/26"
#実行日時を取得
NOWTIME=`date '+%Y-%m-%d-%H%M%S'`

#usage表示関数
usage() {
  echo "$PROGNAME $PROGVER $UPDATED"
  echo "usage : $PROGNAME now"
}

#.scvconfからバックアップを保存する保存先を取得
SAVEDIR=`cat /var/www/html/scv/.scvconf | grep "SCV_BACKUPSAVEDIR=" | cut -d"=" -f2`

if [ $# -ne 0 ] ; then
    #★scvbackup now
    if [ $1 = "now" ] ; then
        #SAVEDIR未設定
        if [ -z "$SAVEDIR" ] ; then
            usage
            echo "SCV_BACKUPSAVEDIR is not set."
            exit 1
        fi
        #SAVEDIR設定ディレクトリが存在しない
        if [ -e $SAVEDIR ] ; then
            :
        else
            usage
            echo "$SAVEDIR not exist."
            exit 1
        fi
    #★scvbackup scvrestore
    elif [ $1 = "scvrestore" ] ; then

        if [ -z "$SAVEDIR" ] ; then
            #scvconf未設定
            usage
            echo "SCV_BACKUPSAVEDIR is not set."
            RESTORE_FLAG=1
        elif [ -e "$SAVEDIR" ] ; then
            #それ以外。設定されている場合
            scvbackup now
            exit 0
        else
            #scvconfに設定されているが、設定先ディレクトリが存在しない場合
            usage
            echo "set dirctry is not exist."
            RESTORE_FLAG=1
        fi
    else
        #引数が不適切
        usage
        echo "usage error: unrecognized option '$1'"
        exit 1
    fi
    #--------------------------------------------
    # メイン：バックアップ処理
    #--------------------------------------------
    #nowで即時実行　　⇒sudoつけて実行
    SUDO="sudo"

    #空き容量を確認
    DVAL=`df -h "$SAVEDIR" | awk NR==2 | awk '{print$5}' | sed -e 's/[^0-9]//g'`
    DISKSPACE=$((100 - $DVAL))

    #空き容量が20%以下なら、バックアップを実行しない
    if [ $DVAL -gt 80 ]; then
        echo "WARNING: Disk space is $DISKSPACE%. Continue? [y/N]"
        read ANSER
        case $ANSER in
            "Y" | "y" | "yes" | " Yes" | "YES" )  : ;;
            * ) echo "Canseled"
            exit 1 ;;
        esac
    else
        echo "Disk space is $DISKSPACE%. Backup starting..."
    fi

    ##★scvrestoreの場合
    if [ "$RESTORE_FLUG" = "1" ]; then
        cd
        SAVEDIR=`pwd`
        echo "$SAVEDIR backuped."
    fi

    #backupファイルを一時的に保存するディレクトリ作成
    temp_dir=`mktemp -d /tmp/temp.XXXXXX`
    sudo chmod 777 $temp_dir
    cd $temp_dir

    #実行日のバックアップディレクトリを指定
    DIR=$temp_dir/$NOWTIME

    #ログ取得始めの{なので消さないこと
	{
    #実行した日時のディレクトリを作成
    mkdir -p $DIR

    #homeディレクトリに移動
    # cd $DIR

    #①homeディレクトリのtar.gzを作成(標準出力ログとエラーログも作成)
    sudo tar cvzfph $DIR/home$NOWTIME.tar.gz --exclude /home/scvadmin --exclude '/home/*/.ssh/known_hosts' /home/

    #②var/www/html/scvファイルを圧縮(標準出力ログとエラーログも作成)
    $SUDO tar cvzfph $DIR/scv$NOWTIME.tar.gz -C /var/www/html/ scv

    #③mysqlのdump実行(エラーログも作成)
    /var/www/html/scv/scvbin/scvsqle -dump $DIR/dump$NOWTIME.sql

    #※Ubuntu 14.04 | 16.04 確認してmysqlの取得先の変更をする
    if [ `cat /etc/lsb-release | grep 'trusty'` ];then
      MysqlDir="/etc/mysql/my.cnf"
    else
      MysqlDir="/etc/mysql/mysql.conf.d/mysqld.cnf"
    fi

    #④/etc配下の必要ファイルを圧縮(12ファイル)
    $SUDO tar cvzfph $DIR/etc$NOWTIME.tar.gz \
    /etc/apache2/sites-available/scv.conf \
    $MysqlDir \
    /etc/sudoers \
    /etc/rc.local \
    /etc/default/docker \
    /etc/docker/daemon.json \
    /etc/cron.d/php5 \
    /etc/cron.d/php \
    /etc/updatedb.conf \
    /etc/ssh/sshd_config \
    /etc/passwd \
    /etc/shadow \
    /etc/group \
    /etc/gshadow

    #実行日ディレクトリに移る
    #作成したファイルを一つの.tar.gzまとめる
    $SUDO tar zcvf scvbackup$NOWTIME.tar.gz $NOWTIME --remove-files
    } > scvbackup$NOWTIME.log 2>&1
    #上の}でログ取得終了

    sudo cp scvbackup$NOWTIME.tar.gz scvbackup$NOWTIME.log $SAVEDIR
    sudo cp scvbackup$NOWTIME.log $SAVEDIR

    #バックアップしたファイルのサイズを計算して表示
    SIZE=`ls -l scvbackup$NOWTIME.tar.gz | awk '{ print $5; }'`
    SIZE=$((SIZE / 1024 / 1024))
    echo "$SIZE Mbytes backuped. "

    rm -rf $temp_dir

    #正常終了
    exit 0
    #---------------------------------------------------------------------

else
    #ヘルプを表示
    usage
    exit 1
fi

