Код отслеживания Google Analytics.

Sep 30, 2007

Настройка локального зеркала репозитория Cygwin

Мир Unix очень разнообразен. Например, существуют продукты, которые позволяют вам иметь многие Unix утилиты и программы под Windows. Один из таких проектов Cygwin.



Вопрос о необходимости установки на Ваш компьютер этого пакета программ, каждый, наверное, решит для себя сам. Что касается меня, то я использую Cygwin-овские программы довольно широко - в основном это различные утилиты для работы с текстом, SSH и Xserver.
Процедура установки достаточно подробно описана на официальном сайте. Однако так случилось, что официальный прокси на нашей работе делает канал недопустимо малым и простейший update с легкостью может растянутся на сутки :) Да и не я один совершаю периодически эту операцию. Нужно было изыскать альтернативу.
Однажды я наткнулся на статью, описывающую возможность создания зеркала Cygwin. После чего написал следующий скрипт:


#!/bin/bash

myDir="/home/tech/Tmp/From/Cygwin"
logFile="${myDir}/sync.log"

exec 6>&1 # Связать дескр. #6 со stdout, cохраняя stdout.
exec 7>&2 # Связать дескр. #7 со stderr, cохраняя stderr.

exec >> ${logFile} # stdout замещается файлом "logfile.txt".
exec 2>> ${logFile} # stderr замещается файлом "logfile.txt".

sourceRSync="rsync://ftp.inf.tu-dresden.de/cygwin"
destination="./ftp.inf.tu-dresden.de/"
setupExeSource="http://cygwin.com/setup.exe"
setupExeDestination="${destination}/setup.exe"

currentDir=`pwd`
echo
date "+------------- %H:%M:%S %d/%m/%Y -------------"
cd "${myDir}"
rsync -vaz --exclude '/mail-archives/*' --exclude '/release/**/*-src.tar.bz2' --delete "${sourceRSync}" "${destination}"[ -f "${setupExeDestination}" ] && rm -v "${setupExeDestination}" #indeed it should be deleted by rsync...
wget --tries=inf --continue "${setupExeSource}"
mv -v "./setup.exe" "${setupExeDestination}"

chmod u+rwX,g-ws,g+rX,o-rwx -R "${destination}"
chmod u+rwx,g-ws,g+rx,o-rwx "${setupExeDestination}"
chown -R tech:www-data "${destination}"

cd "${currentDir}"

exec 1>&6 6>&- # Восстановить stdout и закрыть дескр. #6.
exec 2>&7 7>&- # Восстановить stderr и закрыть дескр. #7.



Этот скрипт не только забирает update c ftp.inf.tu-dresden.de/cygwin (разумеется можно использовать другой сервер - в статье описан метод выбора наибыстрейшего зеркала), но и последнюю версию setup.exe, который тоже, время от времени, меняется, но по-моему под rsync не попадает.
Для возможности комфортного запуска скрипта под crontab


5 3 * * 0 /home/tech/Tmp/From/Cygwin/sync.sh


в него добавлены инструкции по переводу потоков так, чтобы весь вывод накапливался в одном log файле. Разумеется при ручном запуске это не нужно.
Осталось добавить, что все это работает на Linux сервере у меня на работе. Настроенный apache (вернее файловая система :) ) позволяет использовать это зеркало всем кто желает быстро установить или проапдейтить Cygwin в пределах нашей локальной сетки:


$ ls -l www/emulator/cygwin

lrwxrwxrwx 1 tech www-data 48 2007-03-12 18:54 www/emulator/cygwin -> /home/tech/Tmp/From/Cygwin/ftp.inf.tu-dresden.de

3 comments:

gavenkoa said...

В принципе восстанавливать десктирторы stdout и stderr нет необходимости?

Ведь больше скрипт не делает ничего.

Нужно взять патерн "exec 1>&$logfile 2>&$logfile" на вооружение.

Beggy said...

Вы абсолютно правы - в данном случае нет никакой необходимости. Но данный скрипт может быть использован в будущем как заготовка для правильного cron скрипта и после восстановления дексрипторов могут быть другие действия.
Что касается паттерна, то да вещь удобная - я использовал двухстрочный вариант для наглядности.

gavenkoa said...

Спасибо за ответ.

Еще отмечу что setup.exe загружаю сразу в правильный каталог и как и для rsync сравнивается время удаленного файла с локальным:

cd /cygwin-mirror-root
wget -N http://www.cygwin.com/setup.exe