设为首页
收藏本站
用户名
Email
自动登录
找回密码
密码
登录
注册
快捷导航
平台
Portal
论坛
BBS
文库
项目
群组
Group
我的博客
Space
搜索
搜索
热搜:
shell
linux
mysql
本版
用户
LinuxSir.cn,穿越时空的Linuxsir!
»
论坛
›
Linux 发行版讨论区 —— LinuxSir.cn
›
Archlinux讨论区
›
发一个利用web进行镜像同步的脚本, 写的比较随意, 但 ...
1
2
/ 2 页
下一页
返回列表
查看:
2255
|
回复:
11
发一个利用web进行镜像同步的脚本, 写的比较随意, 但思路还算清晰!!
[复制链接]
aishen944
aishen944
当前离线
积分
232
IP卡
狗仔卡
发表于 2008-1-29 11:03:00
|
显示全部楼层
|
阅读模式
#!/bin/bash
RSYNC_HOST=rsync://mirrors.easynews.com
RSYNC_ROOT=mirrors/linux/archlinux
DOWN_HOST=http://mirror.pacific.net.au
DOWN_ROOT=linux/archlinux
RSYNC_PROXY="10.1.32.232:808"
HTTP_PROXY="http://10.1.32.232:808"
SECTIONS="core extra community"
ARCH=i686
MAX_ERRORS=20
ERROR_NUM=0
cd /home/cyqdev/archlinux
CWD=`pwd`
TMP="${CWD}/.tmp"
export RSYNC_PROXY="$RSYNC_PROXY"
export http_proxy="$HTTP_PROXY"
mkdir -p $TMP
get_pkg_list() {
for section in $SECTIONS
do
syncpkglistfile=${TMP}/${section}_sync
if [ -f "$syncpkglistfile" ]; then
rm -v $syncpkglistfile
fi
echo "Get $section sync informations..."
rsync -avzn --no-l --no-H --no-p --no-o --no-g --delete \
${RSYNC_HOST}/${RSYNC_ROOT}/${section}/os/${ARCH}/ ${CWD}/${section}/ > ${syncpkglistfile}
echo "Get $section sync informations done."
if [ "$?" != "0" ]; then
echo "Get package list error"
exit 1
fi
done
}
download_pkgs() {
for section in $SECTIONS
do
syncpkglistfile=${TMP}/${section}_sync
section_dir=${CWD}/${section}
if [ ! -d "$section_dir" ]; then
mkdir -p $section_dir
fi
# remove deleting files
for delfile in `grep '^deleting*' $syncpkglistfile`
do
rm ${section_dir}/${delfile}
done
# download packages
for pkg in `grep '\.pkg\.tar\.gz$' $syncpkglistfile`
do
pkg_url=${DOWN_HOST}/${DOWN_ROOT}/${section}/os/${ARCH}/${pkg}
wget -c -T 10 -nv -a ${CWD}/syncmirror_log $pkg_url -O ${section_dir}/${pkg}
if [ "$?" != "0" ]; then
echo "Download package $pkg_url error"
ERROR_NUM=`expr $ERROR_NUM + 1`
if [ "$ERROR_NUM" = "$MAX_ERRORS" ]; then
echo "Error number had arrived at max, exit!!!"
exit 1
fi
fi
done
done
}
get_pkg_list >> ${CWD}/syncmirror_log
download_pkgs >> ${CWD}/syncmirror_log
复制代码
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
显身卡
zlowly
zlowly
当前离线
积分
458
IP卡
狗仔卡
发表于 2008-1-29 12:56:44
|
显示全部楼层
严重支持!
另外建议加上这样的功能:
1、可以从命令行传mirror url参数,不局限于rsync://mirrors.easynews.com
2、可以命令行传如repo参数。自主决定同步哪个仓库(不带参数则同步所有)
这样的好处是,我可以同时执行三个这样的脚本,同时同步三个仓库(为提高速率可以是三个不同的镜像地址),效率更高,自由度更大。
回复
支持
反对
使用道具
举报
显身卡
aishen944
aishen944
当前离线
积分
232
IP卡
狗仔卡
楼主
|
发表于 2008-1-29 13:39:57
|
显示全部楼层
New version!!!
#!/bin/bash
#---------------------------------------------------------------------------
# - Argument list:
# - 1, RSYNC_HOST
# - 2, RSYNC_ROOT
# - 3, DOWN_HOST
# - 4, DOWN_ROOT
# - 5, ARCH
# - 6, SECTIONS
# - 7, LOG FILE PATH
# - 8, DEST DIRECTORY
#--------------------------------------------------------------------------
if [ ! -z "$1" ]; then
RSYNC_HOST=$1
else
RSYNC_HOST=rsync://mirrors.easynews.com
fi
if [ ! -z "$2" ]; then
RSYNC_ROOT=$2
else
RSYNC_ROOT=mirrors/linux/archlinux
fi
if [ ! -z "$3" ]; then
DOWN_HOST=$4
else
DOWN_HOST=http://mirror.pacific.net.au
fi
if [ ! -z "$4" ]; then
DOWN_ROOT=$4
else
DOWN_ROOT=linux/archlinux
fi
#RSYNC_PROXY="10.1.32.232:808"
#HTTP_PROXY="http://10.1.32.232:808"
if [ ! -z "$6" ]; then
SECTIONS=$6
else
SECTIONS="core extra community"
fi
if [ ! -z "$5" ]; then
ARCH=$5
else
ARCH=i686
fi
MAX_ERRORS=20
ERROR_NUM=0
if [ ! -z "$8" ]; then
DEST_DIR=$8
else
DEST_DIR=/home/cyqdev/archlinux
fi
cd $DEST_DIR
CWD=`pwd`
TMP="${CWD}/.tmp"
if [ ! -z "$7" ]; then
LOG_FILE=$7
else
LOG_FILE=${CWD}/websync_log
fi
export RSYNC_PROXY="$RSYNC_PROXY"
export http_proxy="$HTTP_PROXY"
mkdir -p $TMP
get_pkg_list() {
for section in $SECTIONS
do
syncpkglistfile=${TMP}/${section}_sync
if [ -f "$syncpkglistfile" ]; then
rm -v $syncpkglistfile
fi
echo "Get $section sync informations..."
rsync -avzn --no-l --no-H --no-p --no-o --no-g --delete \
${RSYNC_HOST}/${RSYNC_ROOT}/${section}/os/${ARCH}/ ${CWD}/${section}/ > ${syncpkglistfile}
echo "Get $section sync informations done."
if [ "$?" != "0" ]; then
echo "Get package list error"
exit 1
fi
done
}
download_pkgs() {
for section in $SECTIONS
do
syncpkglistfile=${TMP}/${section}_sync
section_dir=${CWD}/${section}
if [ ! -d "$section_dir" ]; then
mkdir -p $section_dir
fi
# remove deleting files
for delfile in `grep '^deleting*' $syncpkglistfile`
do
rm ${section_dir}/${delfile}
done
# download packages
for pkg in `grep '\.pkg\.tar\.gz$' $syncpkglistfile`
do
pkg_url=${DOWN_HOST}/${DOWN_ROOT}/${section}/os/${ARCH}/${pkg}
wget -c -T 10 -nv -a ${LOG_FILE} $pkg_url -O ${section_dir}/${pkg}
if [ "$?" != "0" ]; then
echo "Download package $pkg_url error"
ERROR_NUM=`expr $ERROR_NUM + 1`
if [ "$ERROR_NUM" = "$MAX_ERRORS" ]; then
echo "Error number had arrived at max, exit!!!"
exit 1
fi
fi
done
done
}
get_pkg_list >> ${LOG_FILE}
download_pkgs >> ${LOG_FILE}
复制代码
没时间搞了! 改进一下吧! 参数列表在注释中已经写明了, 注意必须给出所有参数,因为参数解析是按照顺利来的, 该脚步可根据自己的需要修改!!
回复
支持
反对
使用道具
举报
显身卡
cwjiof
cwjiof
当前离线
积分
624
IP卡
狗仔卡
发表于 2008-1-29 14:01:43
|
显示全部楼层
看上去挺不错的。
回复
支持
反对
使用道具
举报
显身卡
zlowly
zlowly
当前离线
积分
458
IP卡
狗仔卡
发表于 2008-1-29 15:37:42
|
显示全部楼层
core extra community,i686和x86_64一起有18G,着实不少啊。
回复
支持
反对
使用道具
举报
显身卡
aishen944
aishen944
当前离线
积分
232
IP卡
狗仔卡
楼主
|
发表于 2008-1-29 16:18:03
|
显示全部楼层
由于工作的原因在加上网络速度受限, 不得已而为之的, 其实把对应的ARCH镜像下载下来,
放到自己的硬盘上, 定时的去更新我觉得这样做比较适合我自己,i686的共计才8G多,对于debian来说算不了什么!!
实在是受不了rsync那速度, 如果网速可以的话开启多线程,我想很快就同步完了! 呵呵!!
如果下载完了, 要想保证下载中没有出现错误,推荐还是在使用一下rsync的比较好, 上面的
脚步只能起到镜像同步加速!
以下是加了rsync校验功能的脚步:
#!/bin/bash
RSYNC_HOST=rsync://mirrors.easynews.com
RSYNC_ROOT=mirrors/linux/archlinux
DOWN_HOST=http://mirror.pacific.net.au
DOWN_ROOT=linux/archlinux
#RSYNC_PROXY="10.1.32.232:808"
#HTTP_PROXY="http://10.1.32.232:808"
SECTIONS="core extra community"
ARCH=i686
MAX_ERRORS=20
ERROR_NUM=0
DEST_DIR=/home/cyqdev/archlinux
cd $DEST_DIR
CWD=`pwd`
TMP="${CWD}/.tmp"
LOG_FILE=${CWD}/websync_log
if [ ! -z "$RSYNC_PROXY" ]; then
export RSYNC_PROXY="$RSYNC_PROXY"
fi
if [ ! -z "$HTTP_PROXY" ]; then
export http_proxy="$HTTP_PROXY"
fi
mkdir -p $TMP
get_pkg_list() {
for section in $SECTIONS
do
syncpkglistfile=${TMP}/${section}_sync
if [ -f "$syncpkglistfile" ]; then
rm -v $syncpkglistfile
fi
echo "Get $section sync informations..."
rsync -avzn --no-l --no-H --no-p --no-o --no-g --delete \
${RSYNC_HOST}/${RSYNC_ROOT}/${section}/os/${ARCH}/ ${CWD}/${section}/ > ${syncpkglistfile}
echo "Get $section sync informations done."
if [ "$?" != "0" ]; then
echo "Get package list error"
exit 1
fi
done
}
do_rsync() {
rsync -avz -no-l --no-H --no-p --no-o --no-g --delete \
${RSYNC_HOST}/${RSYNC_ROOT}/${section}/os/${ARCH}/ ${CWD}/${1}/
if [ "$?" != "0" ]; then
echo "rsync section $1 error"
exit 1
fi
}
download_pkgs() {
for section in $SECTIONS
do
syncpkglistfile=${TMP}/${section}_sync
section_dir=${CWD}/${section}
if [ ! -d "$section_dir" ]; then
mkdir -p $section_dir
fi
# remove deleting files
for delfile in `grep '^deleting*' $syncpkglistfile`
do
rm ${section_dir}/${delfile}
done
# download packages
for pkg in `grep '\.pkg\.tar\.gz$' $syncpkglistfile`
do
pkg_url=${DOWN_HOST}/${DOWN_ROOT}/${section}/os/${ARCH}/${pkg}
wget -c -T 10 -nv -a ${LOG_FILE} $pkg_url -O ${section_dir}/${pkg}
if [ "$?" != "0" ]; then
echo "Download package $pkg_url error"
ERROR_NUM=`expr $ERROR_NUM + 1`
if [ "$ERROR_NUM" = "$MAX_ERRORS" ]; then
echo "Error number had arrived at max, exit!!!"
exit 1
fi
fi
done
# rsync
do_rsync $section
done
}
get_pkg_list >> ${LOG_FILE}
download_pkgs >> ${LOG_FILE}
复制代码
其他有什么需要兄弟们自己去改吧!!
回复
支持
反对
使用道具
举报
显身卡
zswlb9999
zswlb9999
当前离线
积分
878
IP卡
狗仔卡
发表于 2008-1-31 21:28:14
|
显示全部楼层
我原先已将所有的软件包下载了,如果现在使用该脚本,不用从头开始吧。对rsync不熟悉。
回复
支持
反对
使用道具
举报
显身卡
aishen944
aishen944
当前离线
积分
232
IP卡
狗仔卡
楼主
|
发表于 2008-1-31 22:12:35
|
显示全部楼层
不需要从头开始,在使用rsync之前,最好先man一下rsync使用说明,如果操作不当,可能会把你已经存在文件给删除掉!!
回复
支持
反对
使用道具
举报
显身卡
zswlb9999
zswlb9999
当前离线
积分
878
IP卡
狗仔卡
发表于 2008-1-31 23:09:07
|
显示全部楼层
读了一下脚本,有点不明白,rsync有传送文件和删除本地没有的多余的文件的功能,为什么还要用wget下载文件?既然可以用wget,为什么不用aria2c?
rsync的检验方法是什么呢?
我想将新下载的文件进行md5检验。
可以解析一下这个语句吗?
rsync -avzn --no-l --no-H --no-p --no-o --no-g --delete \
${RSYNC_HOST}/${RSYNC_ROOT}/${section}/os/${ARCH}/ ${CWD}/${section}/ > ${syncpkglistfile}
回复
支持
反对
使用道具
举报
显身卡
aishen944
aishen944
当前离线
积分
232
IP卡
狗仔卡
楼主
|
发表于 2008-2-1 08:31:59
|
显示全部楼层
这个命令只是获取要进行同步的包列表,并不进行实际的同步!
-n 显示要实际进行同步的操作
--no-l 不跟踪软连接
--no-H 不跟踪硬连接
--no-p 不进行权限同步
--no-o 不进行文件宿主同步
--no-g 不进行文件组同步
--delete 删除不在同步列表中存在的包
rsync 是使用md5进行校验的, 你可以自行参考rsync手册!!
回复
支持
反对
使用道具
举报
显身卡
下一页 »
1
2
/ 2 页
下一页
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2002-2023
LinuxSir.cn
(http://www.linuxsir.cn/) 版权所有 All Rights Reserved.
Powered by
RedflagLinux!
技术支持:
中科红旗
|
京ICP备19024520号
快速回复
返回顶部
返回列表