Sisyphus
: 1 2023 | : 18631 | : 37756185
en ru br
ALT
S:0.8.5-alt1
5.1: 0.8.1-alt1
4.1: 0.8.1-alt0.M41.1
4.0: 0.8.2-alt0.M40.1
3.0: 0.2-alt1
www.altlinux.org/Changes

::
: sisyphus-mirror

                   Gear   Bugs and FR  Repocop 

sisyphus-mirror-0.8.2/000075500000000000000000000000001130021467200147125ustar00rootroot00000000000000sisyphus-mirror-0.8.2/AUTHORS000064400000000000000000000004111130021467200157560ustar00rootroot00000000000000Programming: 
- Vladimir V. Kamarzin <vvk@altlinux.org>
- Michael Shigorin <mike@altlinux.org>
- Alexey Avdeev <solo@altlinux.org>

Patches:
- Vadym Kononenko

FR's and bug reports:
- Andrew Kornilov <hiddenman@altlinux.org>
- Stanislav Ievlev <inger@altlinux.org>
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 <vvk@altlinux.org>
# Copyright (C) 2006 Michael Shigorin <mike@altlinux.org>
# Copyright (C) 2007 Aleksey Avdeev <solo@altlinux.org>
#
# 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 <<EOF
Usage: $PROG [options]
Valid options are:
-i, --interactive force output to console
-L, --logdir use specified directory for store logfiles
-u, --url use specified source mirror
-c, --config use specified config file as addition
-l, --list synchronize only given repositories
-a, --arch synchronize only given architectures
-s, --skip-backup skip backup procedure
-h, --help show this text and exit
EOF
exit 1
}

pidfile=
cleanup_handler()
{
trap - EXIT
[ -z "$pidfile" ] || rm -f "$pidfile"
[ "$PARTIAL" = "$RSHOME" ] || rm -rf "$PARTIAL"
exit "$@"
}

exit_handler()
{
cleanup_handler $?
}

signal_handler()
{
cleanup_handler 143
}

#parse command line options
TEMP=`getopt -n $PROG -o i,L:,u:,c:,l:,a:,s,h -l interactive,logdir:,url:,config:,list:,arch:,skip-backup,help -- "$@"` || show_help
eval set -- "$TEMP"

while :; do
case "$1" in
--) shift; break
;;
-i|--interactive) cl_interactive=1
[ -z "$logdir" ] ||
show_usage "Options --interactive and --logdir are mutually exclusive."
;;
-L|--logdir) shift ; logdir="$1"
[ -z "$cl_interactive" ] ||
show_usage "Options --interactive and --logdir are mutually exclusive."
[ -d "$logdir" ] || fatal "$logdir: not a directory."
;;
-u|--url) shift ; cl_SRCROOT="$1"
;;
-c|--config) shift ; cl_config="$1"
;;
-l|--list) shift ; cl_LIST="$1"
;;
-a|--arch) shift ; cl_ARCH="$1"
;;
-s|--skip-backup) skip_backup=1
;;
-h|--help) show_help
;;
esac
shift
done

# check for command-line defined config
[ -n "$cl_config" ] && {
[ -s "$cl_config" ] && config="$cl_config" || fatal "Empty config file specified."
}

# check for user-wide config
[ -s "$HOME"/.sisyphus-mirror/config -a -z "$config" ] && config="$HOME/.sisyphus-mirror/config" ||:

# check for system-wide config
[ -s /etc/sisyphus-mirror/sisyphus-mirror.conf -a -z "$config" ] &&
config="/etc/sisyphus-mirror/sisyphus-mirror.conf" ||:

# source config
[ -n "$config" ] && . "$config" || fatal "No config files found or specified."

# override INTERACTIVE if "-i" option passed
[ x"$cl_interactive" = x1 ] && INTERACTIVE=1

# override LIST if defined with "-i" option
[ -z "$cl_LIST" ] || LIST="$cl_LIST"

# override SRCROOT if defined with "-u" option
[ -z "$cl_SRCROOT" ] || SRCROOT="$cl_SRCROOT"

# override ARCH if defined with "-a" option
[ -z "$cl_ARCH" ] || ARCH="$cl_ARCH"

# if some vars absent in config, define it here
RSHOME="${RSHOME:-$HOME/.sisyphus-mirror}"
PARTIAL="${PARTIAL:-$RSHOME/partial}"
MAXATTEMPTS="${MAXATTEMPTS:-10}"
TMOUT2="${TMOUT2:-15}"
INTERACTIVE="${INTERACTIVE:-0}"
ARGS="${ARGS:- -rltmvH --delete-delay --delete-excluded --stats}"
SRCROOT="${SRCROOT:-rsync://rsync.altlinux.org/ALTLinux}"

# without this vars refuse to continue
[ -n "$LIST" ] || fatal "Config file doesn't contain LIST variable."
[ -n "$DESTROOT" ] || fatal "Config file doesn't contain DESTROOT variable."

# we need homedir
if [ ! -d "$RSHOME" ]; then
message "Directory $RSHOME does not exists, creating..."
mkdir -p "$RSHOME" || fatal "Cannot create RSHOME: $RSHOME"
fi

# create --partial-dir
[ -d "$PARTIAL" ] || mkdir -p "$PARTIAL"

# check for $DESTROOT
[ -d "$DESTROOT" ] || fatal "\$DESTROOT doesn't exist, refuse to continue!"

# signal handler
trap exit_handler EXIT
trap signal_handler HUP PIPE INT QUIT TERM

# check that we are not running already
pidfile="$TMPDIR/sisyphus-mirror.pid"
if [ -f "$pidfile" ]; then
kill -0 "$(cat $pidfile)" 2>/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
 
: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
: Michael Shigorin