這幾個函數屬于環境準備類,其實在寫類似的腳本時,檢查環境比較重要,這樣可以防止有些環境不具備的情況報錯,第一個函數PRepare_dir函數,檢測目錄的,具體代碼如下:
prepare_dirs(){
#創建必要的目錄,此處會輸出到安裝過程中 ECHO_DEBUG "Creating necessary directories ..."
#PKG_DIR, PKG_MISC_DIR, 前文已經定義過了,FOR循環讀取,存在跳過,如果不存在,就直接建立。 for i in ${PKG_DIR} ${PKG_MISC_DIR} do [ -d "${i}" ] || mkdir -p "${i}" done}
執行這個函數后,即可把需要的目錄全部建立好了。接下來分析fetch_misc()函數,代碼如下:
fetch_misc(){ #進入到這個目錄,準備下載安裝文件 cd ${PKG_MISC_DIR}
#計算安裝總數 misc_total=$(( $(echo ${MISCLIST} | wc -w | awk '{print $1}') ))
#定義計數器 misc_count=1
#安裝提醒,獲取源文件中 ECHO_INFO "Fetching source tarballs ..."
#for循環讀取標記列表,獲得下載地址,并下載到本地 for i in ${MISCLIST}; do url="${IREDMAIL_MIRROR}/yum/misc/${i}" ECHO_INFO "+ ${misc_count} of ${misc_total}: ${url}" ${FETCH_CMD} "${url}" misc_count=$((misc_count + 1)) done}
其實這個腳本的含義就是從下面這個地址里下載對應版本的安裝文件
版本很多,很全,,安裝包下載后,接下里是檢查md5值的函數,具體代碼如下:
check_md5(){ cd ${_ROOTDIR}
#判斷操作系統,如果不是FREEBSD,則輸出信息
if [ X"${DISTRO}" != X"FREEBSD" ]; then ECHO_INFO -n "Validate packages ..."
#MD5值文件 md5file="/tmp/check_md5_tmp.${RANDOM}$RANDOM}" echo -e "${MD5LIST}" > ${md5file} cat ${PKGMISC} >> ${md5file} if [ X"${DISTRO}" == X'OPENBSD' ]; then
#OPENBSD下面計算MD5的值 md5 -c ${md5file} |grep 'FAILED'
#FREEBSD下面的狀態值 RETVAL="$?" else md5sum -c ${md5file} |grep 'FAILED' RETVAL="$?" fi rm -f ${md5file} 2>/dev/null
#根據執行狀態的值,返回成功和失敗的結果。 if [ X"${RETVAL}" == X"0" ]; then echo -e "/t[ FAILED ]" ECHO_ERROR "MD5 check failed. Script exit .../n" exit 255 else echo -e "/t[ OK ]" echo 'export status_fetch_misc="DONE"' >> ${STATUS_FILE} echo 'export status_check_md5="DONE"' >> ${STATUS_FILE} fi fi}
生成了MD5值文件,其實就是防偽。接著介紹YUM源生成的函數
create_repo_rhel(){
#輸出進度,到了準備YUM源的進度了。
ECHO_INFO "Preparing yum repositories ..." # 備份本地源
#LOCAL_REPO_FILE 在conf/global文件里定義的,具體代碼如下:
#export PROG_NAME='iRedMail'
#
#export YUM_REPOS_DIR='/etc/yum.repos.d'
#export LOCAL_REPO_NAME="${PROG_NAME}"
#export LOCAL_REPO_FILE="${YUM_REPOS_DIR}/${LOCAL_REPO_NAME}.repo"
backup_file ${LOCAL_REPO_FILE}
# 構建一個iredmail的本地源 cat > ${LOCAL_REPO_FILE} <<EOF[${LOCAL_REPO_NAME}]name=${LOCAL_REPO_NAME}baseurl=${IREDMAIL_MIRROR}/yum/rpms/${DISTRO_VERSION}/enabled=1gpgcheck=0EOF # For Red Hat Enterprise linux
#如果系統是rhel,就用它的fedor源 if [ X"${DISTRO_CODENAME}" == X'rhel' ]; then # repo to install epel-release without GPG check. cat > ${YUM_REPOS_DIR}/tmp_epel.repo <<EOF[tmp_epel]name=Extra Packages for Enterprise Linux ${DISTRO_VERSION} - /$basearch#baseurl=http://download.fedoraproject.org/pub/epel/${DISTRO_VERSION}//$basearchmirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-${DISTRO_VERSION}&arch=/$basearchfailovermethod=priorityenabled=1gpgcheck=0EOF fi eval ${install_pkg} epel-release if [ X"${DISTRO_CODENAME}" == X'rhel' ]; then rm -f ${YUM_REPOS_DIR}/tmp_epel.repo fi
#把執行進度添加到狀態文件中 echo 'export status_create_repo_rhel="DONE"' >> ${STATUS_FILE}}
YUM是rhel系列安裝軟件的工具,設置源后,安裝軟件的依賴關系就解決了。后面安裝軟件時會用到。接下來的函數是check_new_iredmail 從單詞的意思就可以看出,是檢查新版本的,代碼和分析如下:
check_new_iredmail(){ # Check new version and track basic information, # Used to help iRedMail team understand which Linux/BSD distribution # we should take more care of. # iRedMail version number, OS distribution, release version, code name, backend. ECHO_INFO "Checking new version of iRedMail ..."
#官方有個檢查新版本的工具,此處會根據前面檢測的環境條件,進行相應下載
${FETCH_CMD} "${IREDMAIL_MIRROR}/version/check.py/iredmail_os?iredmail_version=${PROG_VERSION}&arch=${OS_ARCH}&distro=${DISTRO}&distro_version=${DISTRO_VERSION}&distro_code_name=${DISTRO_CODENAME}" &>/dev/null UPDATE_AVAILABLE='NO'
#if判斷,iredmail_os應該是文件,里面有檢測的結果 if ls iredmail_os* &>/dev/null; then info="$(cat iredmail_os*)"
#顯然如果有info信息,則是需要更新 if [ X"${info}" == X'UPDATE_AVAILABLE' ]; then UPDATE_AVAILABLE='YES' fi fi rm -f iredmail_os* &>/dev/null
#UPDATE_AVAILABLE的值為YES時,則提示需要下在新版本 if [ X"${UPDATE_AVAILABLE}" == X'YES' ]; then echo '' ECHO_ERROR "Your iRedMail version (${PROG_VERSION}) is out of date, please" ECHO_ERROR "download the latest version and try again:" ECHO_ERROR "http://www.iredmail.org/download.html" echo '' exit 255 fi
#記錄狀態到狀態文件 echo 'export status_check_new_iredmail="DONE"' >> ${STATUS_FILE}}
結束語函數,應該是腳本結束的時候的一個提示,具體代碼如下:
echo_end_msg(){ if [ X"$(basename $0)" != X'get_all.sh' ]; then cat <<EOF********************************************************* All tasks had been finished successfully. Next step:** # cd ..* # bash ${PROG_NAME}.sh*********************************************************EOF fi}
新聞熱點
疑難解答