sisyphus-mirror-0.8.2/000075500000000000000000000000001130021467200147125ustar00rootroot00000000000000sisyphus-mirror-0.8.2/AUTHORS000064400000000000000000000004111130021467200157560ustar00rootroot00000000000000Programming: - Vladimir V. Kamarzin - Michael Shigorin - Alexey Avdeev Patches: - Vadym Kononenko FR's and bug reports: - Andrew Kornilov - Stanislav Ievlev sisyphus-mirror-0.8.2/README.UTF8000064400000000000000000000204541130021467200163240ustar00rootroot00000000000000Конфиги ~~~~~~~ 1. Системный конфиг: /etc/sisyphus-mirror/sisyphus-mirror.conf 2. Пользовательский конфиг: ~/.sisyphus-mirror/config 3. Конфиг, указанный с помощью ключа "-c". Наивысший приоритет имеет конфиг, указанный в командной строке. Следующий по значимости - юзерский. Общесистемный имеет низший приоритет. Внимание! Читается только первый найденный конифиг ненулевого размера. Что нужно для начала работы ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. Отредактировать конфиг. 2. Создать директорию, где будут располагаться ваши репозитории, не забыть дать права на запись туда пользователю, от которого вы будете запускать sisyphus-mirror. Режимы запуска ~~~~~~~~~~~~~~ 1. Интерактивный режим. Вся информация о том, как идёт синхронизация, будет выведена на терминал. Включается либо в конфиге (параметр INTERACTIVE), либо ключом "-i". 2. "Тихий" Режим. Предназначен для работы из cron. Информация о синхронизации будет выведена в логи, находящиеся по умолчанию в ~/.sisyphus-mirror/. Для каждого репозитория ведётся отдельный лог-файл. Синхронизация с использованием временной директории (атомарная) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Существует возможность выполнять синхронизации через промежуточный каталог. Это нужно для того, чтобы целевой репозиторий всегда находился в синхронизированном консистентном виде. Суть метода заключается в копировании (используя хардлинки) репозитория во временную директорию, синхронизации его там с внешним зеркалом и последующим перемещении на место основного. Этот метод используется по умолчанию. За его включение/отключение отвечает параметр TMPDEST в конфиге. Выбор архитектур для синхронизации ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Если вы хотите выборочно зеркалировать только некоторые архитектуры, то начиная с версии 0.8 нет нужды составлять rsync-паттерны для исключения ненужных архитектур и прописывать их в файл exclude. Достаточно определить в конфигурационном файле переменную ARCH и INCLUDE_FILE (см. sisyphus-mirror.conf.rpmnew). Переменная ARCH предназначена для указания архитектур. Переменная INCLUDE_FILE предназначена для указания файла с include-паттернами для rsync. В даный файл следует вносить файлы, которые не попадают в синхронизацию, например по дефолту туда внесён files/list. Переменная EXCLUDE_FILE предназначена для указания файла с exclude-паттернами для rsync. В даный файл следует вносить имена пакетов, которые требуется исключить из синхронизации. Сохранение состояния репозитория ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. Сохранение предыдущего состояния зеркала. Эта возможность позволяет иметь два состояния репозиториев - последний и предпоследний. Это может быть полезно в случаях, когда после dist-upgrade у вас что-то сломалось и вы хотите откатить пакет. Для включения этого режима следует прописать в конфиге BACKUP_TYPE=one и определить путь для бэкапа в переменной BACKUP_DIR 2. Сохранение архива всех состояний. Эта возможность позволяет держать у себя архив всех состояний зеркалируемых репозиториев. Для включения этого режима следует прописать в конфиге BACKUP_TYPE=snapshots и определить путь для бэкапа в переменной BACKUP_DIR Теперь перед выполнением синхронизации с удалённым зеркалом для каждого из зеркалируемых репозиториев будет создан снапшот в директории BACKUP_DIR/дата/репозиторий. Дата определяется по времени последней модификации первого найденного в репозитории файла release. Указание репозиториев для синхронизации в командной строке ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sisiphus-mirror поддерживает переопределение параметра LIST из командной строки. Например, вы хотите синхронизировать Sisyphus в интерактивном режиме: sisiphus-mirror -i -l Sisyphus Для указания нескольких репозиториев следует использовать кавычки: sisiphus-mirror -i -l "4.0/branch updates" Экономия трафика и дискового пространства ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Если вы зеркалируете несколько репозиториев, например 4.0/branch и Sisyphus, sisyphus-mirror будет экономить трафик и дисковое пространство за счёт того, что одинаковые файлы не будут переданы дважды, вместо этого будут созданы хардлинки. Учтите, что это работает только для репозиториев, структура которых аналогична структуре репозитория Sisyphus. См. https://bugzilla.altlinux.org/show_bug.cgi?id=15359 sisiphus-mirror вычисляет список '--link-dest' следующим образом: - сначала в список '--link-dest' заносятся все репозитории, перечисленные в LIST, и структура которых аналогична sisyphus - после этого в список '--link-dest' заносятся все репозитории, находящиеся в директории, используемой для сохранения состояния репозиториев (BACKUP_DIR), и структура которых аналогична sisyphus. Перед занесением в список найденные репозитории специальным образом сортируются (RTFS) - далее список '--link-dest' обрезается до 20-и аргументов (из-за ограничения в rsync) Известные ошибки ~~~~~~~~~~~~~~~~ Пожалуйста не используйте пути с пробелами для параметров EXCLUDE_FILE PARTIAL DESTROOT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Сообщайте об ошибках по адресу https://bugzilla.altlinux.org/ sisyphus-mirror-0.8.2/exclude000064400000000000000000000000621130021467200162640ustar00rootroot00000000000000SRPMS #*led-tc* #*ice-wks* #kernel-source-2.6.22* sisyphus-mirror-0.8.2/include000064400000000000000000000000231130021467200162530ustar00rootroot00000000000000list/** .timestamp sisyphus-mirror-0.8.2/sisyphus-mirror000075500000000000000000000215521130021467200200440ustar00rootroot00000000000000#!/bin/bash # Copyright (C) 2006-2008 Vladimir V. Kamarzin # Copyright (C) 2006 Michael Shigorin # Copyright (C) 2007 Aleksey Avdeev # # Mirror any ALT repository via rsync # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. # we need libshell functions . shell-error . shell-args . shell-getopt # colors . /etc/init.d/outformat show_help() { cat </dev/null && fatal "Another copy is running." fi # create pidfile echo $$ > "$pidfile" export RSYNC_PROXY ############################################################################### # rsync arguments calculation block # calculate arch-includes if [ -n "$ARCH" ]; then for a in $ARCH do ARCH_INCLUDE="$ARCH_INCLUDE --include=$a/**" done fi # calculate --link-dest # # find all sisyphus-like repos in LIST for mirror in $LIST do [ -f "$DESTROOT/$mirror/files/.timestamp" ] && LINK_DEST="$LINK_DEST --link-dest=$DESTROOT/$mirror" ||: done # find all sisyphus-like repos in BACKUP_DIR if [ -d "$BACKUP_DIR" ]; then while read line do LINK_DEST="$LINK_DEST --link-dest=${line%%/files/.timestamp}" done < <(find "$BACKUP_DIR" -type f -name .timestamp | grep '/files/.timestamp' | sort -nr) fi # leave only 20 --link-dest args LINK_DEST="$(echo $LINK_DEST | cut -d ' ' -f1-20)" RSYNCARGS="$ARGS" [ -z "$TMOUT1" ] || RSYNCARGS="$RSYNCARGS --timeout=$TMOUT1" [ -z "$EXCLUDE_FILE" ] || RSYNCARGS="$RSYNCARGS --exclude-from=$EXCLUDE_FILE" [ -z "$INCLUDE_FILE" ] || RSYNCARGS="$RSYNCARGS --include-from=$INCLUDE_FILE" [ -z "$ARCH_INCLUDE" ] || RSYNCARGS="$RSYNCARGS $ARCH_INCLUDE --include=*/ --exclude=*" [ -z "$SPEED" ] || RSYNCARGS="$RSYNCARGS --bwlimit=$SPEED" [ -z "$PARTIAL" ] || RSYNCARGS="$RSYNCARGS --partial-dir=$PARTIAL" [ -z "$LINK_DEST" ] || RSYNCARGS="$RSYNCARGS $LINK_DEST" # END rsync arguments calculation block ############################################################################### for mirror in $LIST do OK="" FLAG="$DESTROOT/$mirror/__SYNCING__" # get logfile directory and name mirror_log="$(echo "$mirror" | tr "/" "_")" [ -n "$logdir" ] && LOG="$logdir/$mirror_log.log" || LOG="$RSHOME/$mirror_log.log" [ "$INTERACTIVE" = 1 ] || date >> "$LOG" # create directory for $mirror if needed mkdir -p -- "$DESTROOT/$mirror" # create flag touch "$FLAG" # backup mirror state if BACKUP variable set and -s option is not given if [ x"$skip_backup" != "x1" -a -n "$BACKUP_TYPE" ]; then [ -n "$BACKUP_DIR" ] || fatal "Backup is enabled, but BACKUP_DIR not set" case "$BACKUP_TYPE" in one) mkdir -p "$BACKUP_DIR/$mirror" if [ "$INTERACTIVE" = 1 ]; then SETCOLOR_SUCCESS message "Backing up $mirror into $BACKUP_DIR/$mirror" SETCOLOR_NORMAL fi rsync -aPH --delete-delay --link-dest="$DESTROOT/$mirror" \ "$DESTROOT/$mirror/" "$BACKUP_DIR/$mirror" || exit 1 ;; snapshots) timestamp_file="$(find "$DESTROOT/$mirror" -type f -name release |head -1)" backup_date="$(date +%Y%m%d -r $timestamp_file)" if [ ! -z "$timestamp_file" ]; then mkdir -p "$BACKUP_DIR/$backup_date/$mirror" if [ "$INTERACTIVE" = 1 ]; then SETCOLOR_SUCCESS message \ "Backing up $mirror into $BACKUP_DIR/$backup_date/$mirror" SETCOLOR_NORMAL fi rsync -aPH --delete-delay --link-dest="$DESTROOT/$mirror" \ "$DESTROOT/$mirror/" "$BACKUP_DIR/$backup_date/$mirror" || exit 1 fi ;; *) fatal "Unrecognized backup type: $BACKUP_TYPE" esac fi # get destination dir for rsync [ -z "$TMPDEST" ] && DEST="$DESTROOT/$mirror" || DEST="$DESTROOT/$TMPDEST/$mirror" # create directories for $mirror if [ -n "$TMPDEST" ]; then mkdir -p "$DESTROOT/$TMPDEST/$mirror" cp -al "$DESTROOT/$mirror" "$DESTROOT/$TMPDEST/$mirror/../" fi # synchronization for attempt in `seq 1 "$MAXATTEMPTS"`; do if [ "$INTERACTIVE" = 1 ]; then SETCOLOR_SUCCESS message "Mirroring $mirror" SETCOLOR_NORMAL if rsync $RSYNCARGS "$SRCROOT/$mirror/" "$DEST"; then OK=1 SETCOLOR_SUCCESS message "Successfuly mirrored $mirror" SETCOLOR_NORMAL break fi else if rsync $RSYNCARGS "$SRCROOT/$mirror/" "$DEST" &> "$LOG"; then OK=1 break fi fi sleep "$TMOUT2" done # perform some actions after successful sync if [ "$OK" = 1 ]; then # move fresh mirror from temp dir to main place if [ -n "$TMPDEST" ]; then if [ "$INTERACTIVE" = 1 ]; then SETCOLOR_SUCCESS message "Moving $mirror from temp dir to main dir." SETCOLOR_NORMAL fi mv "$DESTROOT/$mirror" "$DESTROOT/$mirror.old" mv "$DEST" "$DESTROOT/$mirror" rm -rf "$DESTROOT/$mirror.old" fi else message "$mirror: synchronization failed." fi rm -f "$FLAG" [ "$INTERACTIVE" = 1 ] || date >> "$LOG" done if [ "$INTERACTIVE" = 1 ]; then SETCOLOR_SUCCESS message "All done" SETCOLOR_NORMAL fi sisyphus-mirror-0.8.2/sisyphus-mirror.conf000064400000000000000000000030161130021467200207600ustar00rootroot00000000000000# source mirror SRCROOT=rsync://rsync.altlinux.org/ALTLinux #SRCROOT=rsync://mirror.yandex.ru/altlinux #SRCROOT=rsync://ibiblio.org/Linux/distributions/altlinux #SRCROOT=rsync://ftp.linux.kiev.ua/ALTLinux # distination directory DESTROOT=/var/ftp/ALTLinux # example: we can use sisyphus-mirror for synchronize repos to removable media #DESTROOT=/media/disk/ALTLinux # repos for sync LIST="Sisyphus" #LIST="Sisyphus 4.0/branch updates backports people/shrek" # architectures for sync ARCH="noarch i586 x86_64 x86_32" # speed limit in Kb/s (--bwlimit=) #SPEED=512 #SPEED= # other argumets for rsync # recommended for non-interactive mode: ARGS="-rltmvH --delete-delay --delete-excluded --stats" # recommended for interactive mode: #ARGS="-rltvhmH --progress --delete-delay --delete-excluded --stats" # if 1, print output to stdout INTERACTIVE=0 # temp directory for synchronization TMPDEST=.new # backup type - READ README.UTF8 #BACKUP_TYPE=one #BACKUP_TYPE=snapshots # directory for backups #BACKUP_DIR=/var/ftp/ALTLinux/previous-state #BACKUP_DIR=/var/ftp/ALTLinux/archive # if you do not want to download some packages, use this file EXCLUDE_FILE=/etc/sisyphus-mirror/exclude # this file needed when ARCH variable is used INCLUDE_FILE=/etc/sisyphus-mirror/include # directory for custom configs and logs RSHOME="$HOME/.sisyphus-mirror" # number of tries #MAXATTEMPTS=10 # rsync protocol timeout (--timeout) #TMOUT1=500 # pause between attempts #TMOUT2=15 # http proxy server with HTTP CONNECT (host:port) #RSYNC_PROXY=localhost:3128