#!/bin/bash

# 使用 ClamAV 扫描病毒脚本

# 参数配置
## 版本号
VERSION=0.2.0
## 当前的日期、日期时间
date=`date +%Y%m%d`
datetime=`date +%Y%m%d`_`date +%H%M%S`
## 需要扫描的文件夹（绝对路径）
scanDir=${1:-/}
## 病毒文件处理模式【0：不处理，1：复制到指定目录、2：移动至指定目录、3：直接删除（不推荐）】
model=${2:-2}
## 工作目录
workPath=${3:-/opt/clamav}
## 包管理器【yum：YUM，dnf：DNF，zypper：ZYPPER】
packageInstaller=${4:-yum}
## 病毒文件复制/转移文件夹（仅 model 为 1、2 时生效）
virusPath=${workPath}/scan_${datetime}/virus
## 日志文件目录
logsPath=${workPath}/scan_${datetime}/logs
## 疑似病毒文件数量
infectedFileNumber=0

# 相关方法
## 帮助信息
help () {
  echo 'Usage:  cvs 需要扫描的目录 处理方式 工作目录 包管理器'
  echo '参数说明：'
  echo '  $1： 需要扫描的目录，不配置时默认全盘扫描'
  echo '  $2： 病毒文件的处理方式，不配置时默认为 2'
  echo '       0： 不处理；'
  echo '       1： 复制到指定目录；'
  echo '       2： 移动至指定目录；'
  echo '       3： 直接删除（不推荐）'
  echo '  $3： 工作目录，用于输出日志、存放病毒文件，不配置时默认为 /opt/clamav 目录'
  echo '  $4： 包管理器，支持 yum、zypper，不配置时默认根据操作系统自动选择'
  echo '示例：'
  echo '  全盘扫描，使用默认配置： cvs'
  echo '  扫描 HOME 目录，使用默认配置： cvs /home'
  echo '  全盘扫描，不处理病毒文件： cvs / 0'
  echo '  扫描 HOME 目录，不处理病毒文件： cvs /home 0'
  echo '  全盘扫描，将日志文件保存至 /tmp/clamav 目录，同时将扫描出的病毒文件也移动至此目录： cvs / 2 /tmp/clamav'
  echo '  扫描 HOME 目录，将日志文件保存至 /tmp/clamav 目录，同时将扫描出的病毒文件也移动至此目录： cvs /home 2 /tmp/clamav'
}
## 版本号
version () {
 echo 'cvs '$VERSION
}
## 创建文件夹
createPath () {
  echo '------------------------------ 开始创建相关文件夹... ------------------------------'
  mkdir -pv ${virusPath}
  mkdir -pv ${logsPath}
  echo '------------------------------ 相关文件夹创建完成！ ------------------------------'
}
## 判断当前发行版并设置包管理器
getOSRelease () {
  echo '------------------------------ 开始检查 Linux 发行版 ... ------------------------------'
  [ -r /etc/os-release ] && . /etc/os-release
    if [ `expr "${ID_LIKE}" : ".*suse.*"` != 0 ]; then
        packageInstaller=zypper
        if [ "${ID_LIKE:-}" = suse ] && [ "${VARIANT_ID:-}" = sle-micro ]; then
            packageInstaller=zypper
        fi
    elif [ "${VERSION_ID%%.*}" = "7" ]; then
        packageInstaller=yum
    elif [ "${ID_LIKE:-}" = coreos ] || [ "${VARIANT_ID:-}" = coreos ]; then
        packageInstaller=rpm-ostree
    else
        packageInstaller=yum
    fi

    if [ "${packageInstaller}" = "rpm-ostree" ] && [ -x /bin/yum ]; then
        packageInstaller=yum
    fi

    if [ "${packageInstaller}" = "yum" ] && [ -x /usr/bin/dnf ]; then
        packageInstaller=dnf
    fi
  echo '当前发行版为：' ${ID_LIKE}
  echo '使用的包管理器为：' ${packageInstaller}
  echo '------------------------------ Linux 发行版检查完成！ ------------------------------'
}
## 安装 ClamAV
installClamAV () {
  echo '------------------------------ 开始安装 ClamAV ... ------------------------------'
  if [ "${packageInstaller}" = "yum" ]; then
    yum install -y epel-release clamav clamav-update
  elif [ "${packageInstaller}" = "zypper" ]; then
    zypper install -y clamav
  fi
  echo '------------------------------ ClamAV 安装完成！ ------------------------------'
}
## 更新 ClamAV
updateClamAV () {
  echo '------------------------------ 开始更新 ClamAV ... ------------------------------'
  if [ "${packageInstaller}" = "yum" ]; then
    yum update -y epel-release clamav clamav-update
  elif [ "${packageInstaller}" = "zypper" ]; then
    zypper update -y clamav
  fi
  echo '------------------------------ ClamAV 更新完成！ ------------------------------'
}
## 更新病毒库
updateVirusDatabase () {
  echo '------------------------------ 开始更新病毒库... ------------------------------'
  freshclam
  echo '------------------------------ 病毒库更新完成！ ------------------------------'
}
## 扫描病毒
scanVirus () {
  echo '------------------------------ 开始扫描指定目录... ------------------------------'
  case ${model} in
    0)
      clamscan --recursive=yes --infected --log=${logsPath}/clamscan.log ${scanDir}
      ;;
    1)
      clamscan --recursive=yes --infected --log=${logsPath}/clamscan.log --copy=${virusPath} ${scanDir}
      ;;
    2)
      clamscan --recursive=yes --infected --log=${logsPath}/clamscan.log --move=${virusPath} ${scanDir}
      ;;
    3)
      clamscan --recursive=yes --infected --log=${logsPath}/clamscan.log --remove=yes ${scanDir}
      ;;
    *)
      clamscan --recursive=yes --infected --log=${logsPath}/clamscan.log ${scanDir}
      ;;
  esac
  infectedFileNumber = $(cat ${logsPath}/clamscan.log | grep "Infected files")
  echo '------------------------------ 指定目录扫描完成！ ------------------------------'
  echo '****************************** 疑似病毒文件数量：' ${infectedFileNumber} ' ******************************'
  echo '****************************** 扫描日志见：'${logsPath}'/clamscan.log ******************************'
  echo '****************************** 病毒文件见：'${virusPath}'，请及时处理 ******************************'
}
## 扫描
scan () {
  echo '===================================================================================================='
  echo `date +%Y-%m-%d` `date +%H:%M:%S`
  echo '============================== 开始扫描 '${scanDir}' 目录...... =============================='
  createPath
  getOSRelease
  installClamAV
  updateClamAV
  updateVirusDatabase
  scanVirus
  echo '============================== '${scanDir}' 目录扫描完成！！！ =============================='
  echo `date +%Y-%m-%d` `date +%H:%M:%S`
  echo '===================================================================================================='
}

# 执行方法
case $1 in
  help)
    help
    ;;
  version)
    version
    ;;
  *)
    scan
    ;;
esac
