|
楼主 |
发表于 2008-5-30 00:10:09
|
显示全部楼层
function md5()
{
local downpkg md5ok
[[ ! -n "$1" ]] && echo "函数$FUNCNAME::没有路径参数" && return 1
echo "md5">$ramfs/MD5
read -r -a downpkg<<<$(ls -l $1/*.pkg.tar.gz |awk '/^-/ {print $NF}')
# 奇怪使用引号即错ls -l "$TMP/tmp$repo/*.pkg.tar.gz"
path=`pwd`
cd $1
getdbinfo downpkg
#read -r -a md5ok<<<$(md5sum $(ls -l *.pkg.tar.gz |awk '$1~/^-/ { print $5"%"$NF}'|sed -f $ramfs/sizenamedb$repo.sed) $ramfs/MD5|sed -f $ramfs/md5name4del$repo.sed)
#好像这语句不行
md5sum $(ls -l *.pkg.tar.gz |awk '$1~/^-/ { print $5"%"$NF}'|sed -f $ramfs/sizenamedb$repo.sed) $ramfs/MD5|sed 's/\s\+/%/'>$ramfs/md5$repo
read -r -a md5ok<<<$(sed -f $ramfs/md5name4del$repo.sed $ramfs/md5$repo)
:<<EOF
#ls命令得到的文件表经awk生成size%filename形式,再由sed与数据库的信息比较,删除那些size不相符的文件名单(为了减少大size文件不相符的文件的md5计算时间),由md5sum计算md5,生成md5%filename形式的文件表,与数据库的信息比较,,删除不相符的,将得到相符文件的读入数组md5ok.数据库的文件名为不带-${ARCH}.pkg.tar.gz 或.pkg.tar.gz 即在判断时文件名+版本相符即认为是同一个文件。因为在$repo.db.tar.gz由于历史或其他原因,并不存在%FILENAME%,只有%NAME%,
%VERSION%,我们以%NAME%-%VERSION%识别一个文件。
sizenamedb$repo.sed, md5namedb$repo.sed两个文件在getdbinfo函数中生成。downpkg为下载文件数组
EOF
echo "#MD5检验::$repo: 路径:$DOWN/$repo/os/$ARCH::校验结果,不相符文件${#md5ok[@]} ;请查看文件$STATU/md5info.$repo."
echo "#MD5检验::$repo: 路径:$DOWN/$repo/os/$ARCH::校验结果,不相符文件${#md5ok[@]} ;请查看文件$STATU/md5info.$repo.">$STATU/md5info.$repo
echo ${md5ok[@]}|tr ' ' '\n' >>$STATU/md5info.$repo
cd $path
}
function program_auto()
{
local downfilelist path ii DOWN_SECTION counter LEN
counter=0
echo "进入更新文件模块$FUNCNAME::"
echo "开始下载服务器上的数据库"
downhtmldb &>/dev/null
if [[ $? != 0 ]];then
echo "FORM::函数$FUNCNAME::下载文件清单没有完成"
EXIT 1
fi
if [[ "${#DB_SECTION[@]}" = 0 ]];then
echo "函数$FUNCNAME:下载文件清单为空"
#增加一个计数器,统计错误次数
EXIT 2
fi
echo "准备下载{DB_SECTION[@]}"
#建立若干数组,对应SECTION,
#len=${SECTION[@]}
DOWN_SECTION=( ${DB_SECTION[@]} )
LEN=${#DB_SECTION[@]}
#1检查是否存在db.tar.gz, 有设置 check$repo=1
#2下载db.tar.gz 成功2
#3是否在$DOWN/$repo/os/${ARCH}/$repo.db.tar.gz 存在=3
DOWN_SECTION=( ${DOWN_SECTION[@]} )
LEN=${#DOWN_SECTION[@]}
for ((ii=0;ii<${LEN};ii++))
do
rm -f $STATU/downfile$repo.log
repo=${DOWN_SECTION[$ii]}
STEP=step$repo
eval $STEP=0
counter=0
echo "开始下载:repo::"$STEP=${!STEP}
#本流程为:
#STEP-0
#检查$repo.db.tar.gz是否存在,no,下载,检查与本地源的是否一致,否,开始下载。
#===================================================================
#注:命令参数-f,与此-auto有不同,是强制下载.db.tar.gz进行比较。比较所有的文件名和文件的大小。以此判断是否需要下载新的文件
#---------------------------------------------------------------------
#STEP-1
#解压数据库取得文件的列表,包括size,md5等,由size+文件名e,md5+文件名组成新的文件
#取本地的文件表,组成size+文件名的本地文件表
#由上两者得到要下载的文件(sed生成,效率比bash排序查找高)和多余的文件
#开始下载
#STEP-2
#通过数据库比较已下载文件验证是否有下载不成功的文件,如有即继续下载,直到完成所有文件的下载。转入STEP4
#STEP-3
#正常下载失败,改用rsync下载
#STEP4
#进行下载文件的MD5校验。删除不相符的文件,相符的文件转入库目录。转到STEP5
#STEP7-9
#下载退出。。
pp=0
until [[ ${!STEP} = [6-9] ]]
do
if [[ $((pp++)) = 8 ]] ;then
echo "函数$FUNCNAME:repo download error! 运行态$STEP=${!STEP} , skip $repo">>$LOG
eval $STEP=6
fi
STEP=step$repo
echo ${!STEP}
case ${!STEP} in
0)
echo "SETP-0"
echo "解压数据库"
extrdb $STATU/$repo.db.tar.gz &>/dev/null # 解压库
echo "制作服务器上的文件列表"
dbfile2html
echo "制作本地文件列表"
localfile $DEST/$repo/os/${ARCH}/ #舍生成本地已有的pkg.tar.gz文件
if [[ $? != 0 ]];then
echo "错误提示 自函数$FUNCNAME::行号:LINENO::注意检查localfile 是否错误"
fi
echo "生成下载文件表单"
downlist
if [[ $? != 0 ]];then
echo "函数$FUNCNAME::行号:LINENO:检查错误;下载文件列表可能有问题"
fi #生成下载文件数组list4down
echo '需下载文件个数:'${#list4down[@]}
if [ "${#list4down[@]}" = 0 ]; then
echo "不需要下载文件"
cp $STATU/$repo.db.tar.gz $DOWN/$repo/os/$ARCH/
[[ $? != 0 ]] && echo "警告:拷贝文件操作失败:函数$FUNCNAME行号$LINENO:cp $STATU/$repo.db.tar.gz DOWN/$repo/os/$ARCH/ "
eval $STEP=9
continue
fi
echo "开始下载文件"
downfile # 下载文件.注掉调 downfile 将跟着的eval $STEP=4改为eval $STEP=3,即可采用rsync更新
eval $STEP=4 #进入md5校验
;;
2)
echo "STEP-1" #md5校验后进入此,
eval $STEP=2
echo "检查是否已全部下载"
localfile $DEST/$repo/os/${ARCH}/
downlist
if [ "${#list4down[@]}" = 0 ]; then #没有需要下载的文件了
echo "$repo:下载完成.正在删除多余的文件"
delold #删除旧的文件
if [[ $? = 0 ]] ;then
cp $STATU/$repo.db.tar.gz $DOWN/$repo/os/$ARCH/
else
echo "删除文件操作失败"
echo "删除文件操作失败">>$LOG
#LOCAL_SECTION=(${LOCAL_SECTION[@]})
fi
eval $STEP=9
#正常结束
DOWN_SECTION[$ii]= #从下载表中除名
continue
fi
if [[ $((++counter)) = 3 ]];then
eval $STEP=6 #原定 $STEP=3,采用rsync ,但这也不是好的方法。如果程序有问题,可以采用,否则可多次下载
echo $STEP=${!STEP}>>$LOG
echo "尚未下载的文件">>$LOG
echo ${list4down[@]}>>$LOG
# 总下载已到2次。如果是一个文件不能正常连接,也已
continue
fi
echo "继续下载"
downfile #继续下载
eval $STEP=4 #进行md5校验
;;
3)
echo "正常下载无法终止,尝试使用rsync下载" # 多次下载仍不能终止下载,可能是设计思想不完整,也可能是原有的官方数据格式发生了变化,改用rsync进行更新
do_rsync
if [ "$?" != "0" ]; then
echo "$repo:下载失败"
eval $STEP=7 #rsync非正常结束
else
eval $STEP=8 #rsync正常结束
fi
DOWN_SECTION[$ii]= #从下载表中除名
#LOCAL_SECTION=(${LOCAL_SECTION[@]})
;;
4)
echo "STEP-4 进入MD5检验.时间较长,请等候。。。"
echo "md5">$ramfs/MD5
read -r -a downpkg<<<$(ls -l $TMP/tmp$repo/*.pkg.tar.gz |awk '/^-/ {print $NF}') &>/dev/null
# 奇怪使用引号即错ls -l "$TMP/tmp$repo/*.pkg.tar.gz"
path=`pwd`
cd $TMP/tmp$repo
getdbinfo downpkg
# read -r -a md5ok<<<$(md5sum $(ls -l *.pkg.tar.gz |awk '$1~/^-/ { print $5"%"$NF}'|sed -f $ramfs/sizenamedb$repo.sed) $ramfs/MD5|sed -f $ramfs/md5namedb$repo.sed)
md5sum $(ls -l *.pkg.tar.gz |awk '$1~/^-/ { print $5"%"$NF}'|sed -f \
$ramfs/sizenamedb$repo.sed) $ramfs/MD5|sed 's/\s\+/%/'>$ramfs/smd5$repo
#>$ramfs/smd5$repo \
# &>/dev/null
read -r -a md5ok<<<$(sed -f $ramfs/md5namedb$repo.sed $ramfs/smd5$repo)
echo $repo>>$STATU/downfile$repo.log
echo "本次下载文件数">>$STATU/downfile$repo.log
echo `ls *.pkg.tar.gz `>>$STATU/downfile$repo.log
echo "md5相符::${#md5ok[@]}">>$STATU/downfile$repo.log
echo
echo ${md5ok[@]}>>$STATU/downfile$repo.log
:<<EOF
#ls命令得到的文件表经awk生成size%filename形式,再由sed与数据库的信息比较,删除那些size不相符的文件名单(为了减少大size文件不相符的文件的md5计算时间),由md5sum计算md5,生成md5%filename形式的文件表,与数据库的信息比较,,删除不相符的,将得到相符文件的读入数组md5ok.数据库的文件名为不带-${ARCH}.pkg.tar.gz 或.pkg.tar.gz 即在判断时文件名+版本相符即认为是同一个文件。因为在$repo.db.tar.gz由于历史或其他原因,并不存在%FILENAME%,只有%NAME%,
%VERSION%,我们以%NAME%-%VERSION%识别一个文件。
sizenamedb$repo.sed, md5namedb$repo.sed两个文件在getdbinfo函数中生成。downpkg为下载文件数组
EOF
mv ${md5ok[@]} $DOWN/$repo/os/$ARCH/ &>/dev/null
rm -f * &>/dev/null
cd $path
eval $STEP=2
;;
[7-9])
#脚本并不执行到这里
DOWN_SECTION=( ${DOWN_SECTION[@]} )
echo $repo>>$LOG
echo "$STEP=${!STEP}">>$LOG
echo "${LOCAL_SECTION[@]}">>$LOG
;;
*)
echo $repo>>$LOG
echo "$STEP=${!STEP}">>$LOG
echo "${DOWN_SECTION[@]}">>$LOG
break
;;
esac
done # until [ {!STEP} = [7-9] ]
done
DOWN_SECTION=( ${DOWN_SECTION[@]} )
LEN=${#DB_SECTION[@]}
for ((ii=0;ii<$LEN;ii++))
do
repo=${DB_SECTION[$ii]}
STEP=step$repo
case ${!STEP} in
7)
echo "${SECTION[$ii]}下载rsync下载:失败"
;;
8)
echo "${SECTION[$ii]}下载rsync下载完毕"
;;
9)
echo "${SECTION[$ii]}下载成功"
;;
*)
echo "${SECTION[$ii]}没有编号$STEP=${!STEP}"
;;
esac
done
EXIT 0
unset downfilelist path list loop counter loop1 ii DOWN_SECTION
}
#-------------------------------以上是功能流程函数---------------------------------
#------------------------------脚本从这里开始执行----------------
:<<BLOCK
这是注释1
设计思想:
正当性基于$repo.db.tar.gz数据库的正确性
1-采用由网页源码提取要下载文件的方法得到源文件表,与本地文件比较得到需要下载的文件。
2-解压数据库,取得源的软件的size,md5。由1,2得到3:
3-生成sieze+fiename md5+filename的文件并排序,以便利用sed与本地文件进行比较,得到需要下载的文件文件和需要删除的文件。
经过试验,使用sed的进行比较的效率比用bsah进行比较的效率要高。
4-生成本地文件,用于与3生成文件的进行比较
5-依由3,4得到的文件比较得到确定需要下载的文件表,
6-下载
实现上述功能是相对简单的,但要实现较复杂的,或说完美一点的功能就复杂很多了,如没有MD5校验,就简单得很,
BLOCK
:<<BLOCK
注释2,主要函数说明
1)初始化
init
repo=community
echo "init"
2)下载db.tar.gz
#--------------------------------------------------------
extrdb $STATU 解压数据库
解压后的文件存在在$ramfs/tmp$repo,一般为ramfs文件系统,不保存,也可以提高读写速度 name4db 是$repo的 源的文件名的数组,对应于$ramfs/tmp$repo下的目录名,用于读目录下的文件信息。
$STATU 为数据库所在目录,由下载时存档,名称约定$repo.db.tar.gz
3)localfile $DEST/$repo/os/$ARCH $TMP/tmp$repo/
参数有两个,一是用来做源的文件目录$DEST/$repo/os/$ARCH,一个是下载的临时存档目录$TMP/tmp$repo/ ,后者的文件经md5检验后转入前者
4)downlist:生成下载的文件表list4down数组
5)downfile:依据服务器url和downfile生成mirrors数组,由aria2c下载文件
6)getdbinfo 参数为要取文件信息的文件名数组。一般为要下载的文件列表数组。运行前必须先解压数据库。
7)getdb 采用rsync的方式下载$repo.db.tar.gz,现在没有使用。
#------------------------------------------------------------------------------------------
debug() 是一个简单的下载测试函数,主要验证各个函数的正确性。不带md5校验和下载完整性检验功能。
#--------------------------------------------------------------------------------------------
BLOCK
:<<BLOCK
注释3
BLOCK
function program_md5()
{
echo ""
local LOCAL_SECTION repo LEN i
LOCAL_SECTION=(${SECTION[@]})
echo "来自::函数$FUNCNAME:: MD5检验:${SECTION[@]}"
LEN=${#LOCAL_SECTION[@]}
for (( i=0;i<${LEN};i++ ))
do
echo ""
cp $DOWN/$repo/os/$ARCH/$repo.db.tar.gz $STATU/
repo=${LOCAL_SECTION[$i]}
echo "开始时间:`date`::正在校验:$repo"
extrdb $DOWN/$repo/os/$ARCH/$repo.db.tar.gz
md5 $DOWN/$repo/os/$ARCH/
done
unset repo LOCAL_SECTION LEN i
echo "结束时间:`date`"
}
function debug()
{
repo="core"
init
SECTION=( core )
downhtmldb #下载服务器上的文件名单源码及¥热破。$repo.db.tar.gz
repo=core
extrdb $STATU/$repo.db.tar.gz # 解压库$repo.db.tar.gz
dbfile2html #将服务器上得到的的文件单与$repo.db.tar.gz比较,除掉$repo.db.tar.gz中没有的
#如果需要下载全部的,取文件$repo.file,代替down$repo,删掉某些语句即可
localfile $DEST/$repo/os/${ARCH}/ $TMP/tmp$repo/ #生成本地已有的pkg.tar.gz文件
downlist #生成下载文件数组list4down
echo ${list4down[@]}
if [[ ${#list4down[@]} = 0 ]] ;then
echo "没有文件下载"
else
echo "${#list4down[@]}共有文件要下载"
echo "来自::函数$FUNCNAME::行号:LINENO::操作提示:回车继续:下一步:开始下载文件"
downfile # 下载文件没有md5检验 ,旧文件没有删除,需运行delold
echo "下载完毕"
fi
echo "来自::函数$FUNCNAME::行号:LINENO::操作提示:回车继续:下一步:检查多余的旧文件"
delold test #去掉参数test可删掉旧文件,
}
arghandl $@ #处理命令行参数
echo $act
main
`echo $act`
#$atc #执行相关函数
echo "done"
EXIT |
|