LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2186|回复: 11

发一个利用web进行镜像同步的脚本, 写的比较随意, 但思路还算清晰!!

[复制链接]
发表于 2008-1-29 11:03:00 | 显示全部楼层 |阅读模式

  1. #!/bin/bash
  2. RSYNC_HOST=rsync://mirrors.easynews.com
  3. RSYNC_ROOT=mirrors/linux/archlinux

  4. DOWN_HOST=http://mirror.pacific.net.au
  5. DOWN_ROOT=linux/archlinux

  6. RSYNC_PROXY="10.1.32.232:808"
  7. HTTP_PROXY="http://10.1.32.232:808"

  8. SECTIONS="core extra community"

  9. ARCH=i686

  10. MAX_ERRORS=20
  11. ERROR_NUM=0

  12. cd /home/cyqdev/archlinux
  13. CWD=`pwd`

  14. TMP="${CWD}/.tmp"

  15. export RSYNC_PROXY="$RSYNC_PROXY"
  16. export http_proxy="$HTTP_PROXY"

  17. mkdir -p $TMP
  18. get_pkg_list() {
  19.    for section in $SECTIONS
  20.    do
  21.       syncpkglistfile=${TMP}/${section}_sync
  22.       if [ -f "$syncpkglistfile" ]; then
  23.          rm -v $syncpkglistfile
  24.       fi
  25.       echo "Get $section sync informations..."
  26.       rsync -avzn --no-l --no-H --no-p --no-o --no-g --delete \
  27.                     ${RSYNC_HOST}/${RSYNC_ROOT}/${section}/os/${ARCH}/ ${CWD}/${section}/ > ${syncpkglistfile}
  28.       echo "Get $section sync informations done."
  29.       if [ "$?" != "0" ]; then
  30.          echo "Get package list error"
  31.          exit 1
  32.       fi
  33.    done
  34. }

  35. download_pkgs() {
  36.    for section in $SECTIONS
  37.    do
  38.       syncpkglistfile=${TMP}/${section}_sync
  39.       section_dir=${CWD}/${section}

  40.       if [ ! -d "$section_dir" ]; then
  41.          mkdir -p $section_dir
  42.       fi

  43.       # remove deleting files
  44.       for delfile in `grep '^deleting*' $syncpkglistfile`
  45.       do
  46.          rm ${section_dir}/${delfile}
  47.       done

  48.       # download packages
  49.       for pkg in `grep '\.pkg\.tar\.gz$' $syncpkglistfile`
  50.       do
  51.          pkg_url=${DOWN_HOST}/${DOWN_ROOT}/${section}/os/${ARCH}/${pkg}
  52.          wget -c -T 10 -nv -a ${CWD}/syncmirror_log $pkg_url -O ${section_dir}/${pkg}
  53.          if [ "$?" != "0" ]; then
  54.             echo "Download package $pkg_url error"
  55.             ERROR_NUM=`expr $ERROR_NUM + 1`
  56.             if [ "$ERROR_NUM" = "$MAX_ERRORS" ]; then
  57.                echo "Error number had arrived at max, exit!!!"
  58.                exit 1
  59.             fi
  60.          fi
  61.       done
  62.    done
  63. }

  64. get_pkg_list   >> ${CWD}/syncmirror_log
  65. download_pkgs  >> ${CWD}/syncmirror_log
复制代码
发表于 2008-1-29 12:56:44 | 显示全部楼层
严重支持!
另外建议加上这样的功能:
1、可以从命令行传mirror url参数,不局限于rsync://mirrors.easynews.com
2、可以命令行传如repo参数。自主决定同步哪个仓库(不带参数则同步所有)

这样的好处是,我可以同时执行三个这样的脚本,同时同步三个仓库(为提高速率可以是三个不同的镜像地址),效率更高,自由度更大。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-29 13:39:57 | 显示全部楼层

New version!!!


  1. #!/bin/bash

  2. #---------------------------------------------------------------------------
  3. # - Argument list:
  4. # - 1,  RSYNC_HOST
  5. # - 2,  RSYNC_ROOT
  6. # - 3,  DOWN_HOST
  7. # - 4,  DOWN_ROOT
  8. # - 5,  ARCH
  9. # - 6,  SECTIONS
  10. # - 7,  LOG FILE PATH
  11. # - 8,  DEST DIRECTORY
  12. #--------------------------------------------------------------------------

  13. if [ ! -z "$1" ]; then
  14.    RSYNC_HOST=$1
  15. else
  16.    RSYNC_HOST=rsync://mirrors.easynews.com
  17. fi
  18. if [ ! -z "$2" ]; then
  19.    RSYNC_ROOT=$2
  20. else
  21.    RSYNC_ROOT=mirrors/linux/archlinux
  22. fi

  23. if [ ! -z "$3" ]; then
  24.    DOWN_HOST=$4
  25. else
  26.    DOWN_HOST=http://mirror.pacific.net.au
  27. fi
  28. if [ ! -z "$4" ]; then
  29.    DOWN_ROOT=$4
  30. else
  31.    DOWN_ROOT=linux/archlinux
  32. fi

  33. #RSYNC_PROXY="10.1.32.232:808"
  34. #HTTP_PROXY="http://10.1.32.232:808"

  35. if [ ! -z "$6" ]; then
  36.    SECTIONS=$6
  37. else
  38.    SECTIONS="core extra community"
  39. fi

  40. if [ ! -z "$5" ]; then
  41.    ARCH=$5
  42. else
  43.    ARCH=i686
  44. fi

  45. MAX_ERRORS=20
  46. ERROR_NUM=0

  47. if [ ! -z "$8" ]; then
  48.    DEST_DIR=$8
  49. else
  50.    DEST_DIR=/home/cyqdev/archlinux
  51. fi

  52. cd $DEST_DIR
  53. CWD=`pwd`

  54. TMP="${CWD}/.tmp"

  55. if [ ! -z "$7" ]; then
  56.    LOG_FILE=$7
  57. else
  58.    LOG_FILE=${CWD}/websync_log
  59. fi

  60. export RSYNC_PROXY="$RSYNC_PROXY"
  61. export http_proxy="$HTTP_PROXY"

  62. mkdir -p $TMP
  63. get_pkg_list() {
  64.    for section in $SECTIONS
  65.    do
  66.       syncpkglistfile=${TMP}/${section}_sync
  67.       if [ -f "$syncpkglistfile" ]; then
  68.          rm -v $syncpkglistfile
  69.       fi
  70.       echo "Get $section sync informations..."
  71.       rsync -avzn --no-l --no-H --no-p --no-o --no-g --delete \
  72.                     ${RSYNC_HOST}/${RSYNC_ROOT}/${section}/os/${ARCH}/ ${CWD}/${section}/ > ${syncpkglistfile}
  73.       echo "Get $section sync informations done."
  74.       if [ "$?" != "0" ]; then
  75.          echo "Get package list error"
  76.          exit 1
  77.       fi
  78.    done
  79. }

  80. download_pkgs() {
  81.    for section in $SECTIONS
  82.    do
  83.       syncpkglistfile=${TMP}/${section}_sync
  84.       section_dir=${CWD}/${section}

  85.       if [ ! -d "$section_dir" ]; then
  86.          mkdir -p $section_dir
  87.       fi

  88.       # remove deleting files
  89.       for delfile in `grep '^deleting*' $syncpkglistfile`
  90.       do
  91.          rm ${section_dir}/${delfile}
  92.       done

  93.       # download packages
  94.       for pkg in `grep '\.pkg\.tar\.gz$' $syncpkglistfile`
  95.       do
  96.          pkg_url=${DOWN_HOST}/${DOWN_ROOT}/${section}/os/${ARCH}/${pkg}
  97.          wget -c -T 10 -nv -a ${LOG_FILE} $pkg_url -O ${section_dir}/${pkg}
  98.          if [ "$?" != "0" ]; then
  99.             echo "Download package $pkg_url error"
  100.             ERROR_NUM=`expr $ERROR_NUM + 1`
  101.             if [ "$ERROR_NUM" = "$MAX_ERRORS" ]; then
  102.                echo "Error number had arrived at max, exit!!!"
  103.                exit 1
  104.             fi
  105.          fi
  106.       done
  107.    done
  108. }

  109. get_pkg_list   >> ${LOG_FILE}
  110. download_pkgs  >> ${LOG_FILE}

复制代码


没时间搞了!  改进一下吧!  参数列表在注释中已经写明了, 注意必须给出所有参数,因为参数解析是按照顺利来的, 该脚步可根据自己的需要修改!!
回复 支持 反对

使用道具 举报

发表于 2008-1-29 14:01:43 | 显示全部楼层
看上去挺不错的。
回复 支持 反对

使用道具 举报

发表于 2008-1-29 15:37:42 | 显示全部楼层
core extra community,i686和x86_64一起有18G,着实不少啊。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-29 16:18:03 | 显示全部楼层
由于工作的原因在加上网络速度受限, 不得已而为之的, 其实把对应的ARCH镜像下载下来,

放到自己的硬盘上, 定时的去更新我觉得这样做比较适合我自己,i686的共计才8G多,对于debian来说算不了什么!!

实在是受不了rsync那速度, 如果网速可以的话开启多线程,我想很快就同步完了! 呵呵!!

如果下载完了, 要想保证下载中没有出现错误,推荐还是在使用一下rsync的比较好, 上面的

脚步只能起到镜像同步加速!

以下是加了rsync校验功能的脚步:
  1. #!/bin/bash
  2. RSYNC_HOST=rsync://mirrors.easynews.com
  3. RSYNC_ROOT=mirrors/linux/archlinux
  4. DOWN_HOST=http://mirror.pacific.net.au
  5. DOWN_ROOT=linux/archlinux
  6. #RSYNC_PROXY="10.1.32.232:808"
  7. #HTTP_PROXY="http://10.1.32.232:808"
  8. SECTIONS="core extra community"
  9. ARCH=i686
  10. MAX_ERRORS=20
  11. ERROR_NUM=0
  12. DEST_DIR=/home/cyqdev/archlinux
  13. cd $DEST_DIR
  14. CWD=`pwd`
  15. TMP="${CWD}/.tmp"
  16. LOG_FILE=${CWD}/websync_log
  17. if [ ! -z "$RSYNC_PROXY" ]; then
  18.    export RSYNC_PROXY="$RSYNC_PROXY"
  19. fi
  20. if [ ! -z "$HTTP_PROXY" ]; then
  21.    export http_proxy="$HTTP_PROXY"
  22. fi
  23. mkdir -p $TMP
  24. get_pkg_list() {
  25.    for section in $SECTIONS
  26.    do
  27.       syncpkglistfile=${TMP}/${section}_sync
  28.       if [ -f "$syncpkglistfile" ]; then
  29.          rm -v $syncpkglistfile
  30.       fi
  31.       echo "Get $section sync informations..."
  32.       rsync -avzn --no-l --no-H --no-p --no-o --no-g --delete \
  33.                     ${RSYNC_HOST}/${RSYNC_ROOT}/${section}/os/${ARCH}/ ${CWD}/${section}/ > ${syncpkglistfile}
  34.       echo "Get $section sync informations done."
  35.       if [ "$?" != "0" ]; then
  36.          echo "Get package list error"
  37.          exit 1
  38.       fi
  39.    done
  40. }
  41. do_rsync() {
  42.   rsync -avz -no-l --no-H --no-p --no-o --no-g --delete \
  43.      ${RSYNC_HOST}/${RSYNC_ROOT}/${section}/os/${ARCH}/ ${CWD}/${1}/
  44.   if [ "$?" != "0" ]; then
  45.      echo "rsync section $1 error"
  46.      exit 1
  47.   fi
  48. }
  49. download_pkgs() {
  50.    for section in $SECTIONS
  51.    do
  52.       syncpkglistfile=${TMP}/${section}_sync
  53.       section_dir=${CWD}/${section}
  54.       if [ ! -d "$section_dir" ]; then
  55.          mkdir -p $section_dir
  56.       fi
  57.       # remove deleting files
  58.       for delfile in `grep '^deleting*' $syncpkglistfile`
  59.       do
  60.          rm ${section_dir}/${delfile}
  61.       done
  62.       # download packages
  63.       for pkg in `grep '\.pkg\.tar\.gz$' $syncpkglistfile`
  64.       do
  65.          pkg_url=${DOWN_HOST}/${DOWN_ROOT}/${section}/os/${ARCH}/${pkg}
  66.          wget -c -T 10 -nv -a ${LOG_FILE} $pkg_url -O ${section_dir}/${pkg}
  67.          if [ "$?" != "0" ]; then
  68.             echo "Download package $pkg_url error"
  69.             ERROR_NUM=`expr $ERROR_NUM + 1`
  70.             if [ "$ERROR_NUM" = "$MAX_ERRORS" ]; then
  71.                echo "Error number had arrived at max, exit!!!"
  72.                exit 1
  73.             fi
  74.          fi
  75.       done
  76.       # rsync
  77.       do_rsync $section
  78.    done
  79. }
  80. get_pkg_list   >> ${LOG_FILE}
  81. download_pkgs  >> ${LOG_FILE}
复制代码

其他有什么需要兄弟们自己去改吧!!
回复 支持 反对

使用道具 举报

发表于 2008-1-31 21:28:14 | 显示全部楼层
我原先已将所有的软件包下载了,如果现在使用该脚本,不用从头开始吧。对rsync不熟悉。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-31 22:12:35 | 显示全部楼层
不需要从头开始,在使用rsync之前,最好先man一下rsync使用说明,如果操作不当,可能会把你已经存在文件给删除掉!!
回复 支持 反对

使用道具 举报

发表于 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}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-1 08:31:59 | 显示全部楼层
这个命令只是获取要进行同步的包列表,并不进行实际的同步!

-n         显示要实际进行同步的操作
--no-l    不跟踪软连接
--no-H  不跟踪硬连接
--no-p   不进行权限同步
--no-o   不进行文件宿主同步
--no-g   不进行文件组同步
--delete 删除不在同步列表中存在的包

rsync 是使用md5进行校验的, 你可以自行参考rsync手册!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表