#!/bin/bash # # # Скрипт для создания локального зеркала дистрибутива # Mandriva GNU\Linux # BDag 2008 г. [email protected] # VERSION: 0.5 # tput sgr0 TBold=("" ""); #Выделение жирным цветом TGreen=("" ""); #Выделение Зеленым цветом TRed=("" ""); #Выделение Красным цветом TBlue=("" ""); #Выделение Голубым цветом TUnd=("" ""); #Выделение Подчеркнутый цветом err=0 RSYNC_OPT='-lhptgoDP --no-motd --force --delete --delete-before --cvs-exclude --no-p --no-g --chmod=ugo=rwX ' RPMSlist='' function get_config() { [ -d $HOME/.config ] || mkdir -p $HOME/.config [ -e $HOME/.config/$(basename $0).conf ] && . $HOME/.config/$(basename $0).conf DefaultSource=${CFGSource:-"false"} DefaultSourceOnly=${CFGSourceOnly:-"false"} DefaultPLF=${CFGPLF:-"false"} DefaultPLFOnly=${CFGPLFOnly:-"false"} DefaultGetDebug=${CFGGetDebug:-"false"} DefaultGetUpdate=${CFGGetUpdate:-"true"} DefaultGetUpdateOnly=${CFGGetUpdateOnly:-"false"} DefaultGetTesting=${CFGGetTesting:-"false"} DefaultGetTestingOnly=${CFGGetTestingOnly:-"false"} DefaultGetBackports=${CFGGetBackports:-"false"} DefaultGetBackportsOnly=${CFGGetBackportsOnly:-"false"} DefaultRoot=${CFGRoot:-"$HOME/mirror"} DefaultHost=${CFGHost:-"ftp.mandriva.ru"} DefaultModule=${CFGModule:-"mandriva/mandriva"} DefaultRelease=${CFGRelease:-"current"} DefaultVersion=${CFGVersion:-"official"} DefaultArch=${CFGArch:-"i586"} } function save_config() { [ -d $HOME/.config ] || mkdir -p $HOME/.config echo -e "CFGSource=\"$Sources\"" > $HOME/.config/$(basename $0).conf echo -e "CFGSourceOnly=\"$SourcesOnly\"" >> $HOME/.config/$(basename $0).conf echo -e "CFGPLF=\"$PLF\"" >> $HOME/.config/$(basename $0).conf echo -e "CFGPLFOnly=\"$PLFOnly\"" >> $HOME/.config/$(basename $0).conf echo -e "CFGGetDebug=\"$GetDebug\"" >> $HOME/.config/$(basename $0).conf echo -e "CFGGetUpdate=\"$GetUpdate\"" >> $HOME/.config/$(basename $0).conf echo -e "CFGGetUpdateOnly=\"$GetUpdateOnly\"" >> $HOME/.config/$(basename $0).conf echo -e "CFGGetTesting=\"$GetTesting\"" >> $HOME/.config/$(basename $0).conf echo -e "CFGGetBackports=\"$GetBackports\"" >> $HOME/.config/$(basename $0).conf echo -e "CFGGetTestingOnly=\"$GetTestingOnly\"" >> $HOME/.config/$(basename $0).conf echo -e "CFGGetBackportsOnly=\"$GetBackportsOnly\"" >> $HOME/.config/$(basename $0).conf echo -e "CFGRoot=\"$Root_Local_Mirror\"" >> $HOME/.config/$(basename $0).conf echo -e "CFGHost=\"$RSYNC_HOST\"" >> $HOME/.config/$(basename $0).conf echo -e "CFGModule=\"$RPM_Ferm_Module\"" >> $HOME/.config/$(basename $0).conf echo -e "CFGRelease=\"$RPM_Ferm_Release\"" >> $HOME/.config/$(basename $0).conf echo -e "CFGVersion=\"$RPM_Ferm_Version\"" >> $HOME/.config/$(basename $0).conf echo -e "CFGArch=\"$RPM_Ferm_Arch\"" >> $HOME/.config/$(basename $0).conf exit 0 } function help () { cat << MANEOF > $TMP/$(basename $0).1 .\" Документация по использованию скрипта mandriva_mirror.sh .\" создана Sergey V. Sizov aka BDag [email protected] .TH "$(basename $0)" 1 2009-12-30 "Mandriva/GNU Linux" "Команды, доступные пользователю" .SH ИМЯ .B "$(basename $0)" -- скрипт для создания зеркала дистрибутива Mandriva/GNU Linux, а также отдельных его компонентов .SH ОПИСАНИЕ скрипт .BI "$(basename $0)" предназначен для создания локального зеркала дистрибутива Mandriva/GNU Linux, а так же отдельных его компонентов. Для реализации функционала используются следующие компоненты: .IR rsync ", " urpmi ", " urpmi.addmedia ", " chroot Данный скрипт позволит произвести загрузку, как всего дистрибутива разных редакций с .IR "rsync://" ресурсов, так и отдельных его компонентов: .IR release ", " updates ", " backports ", " testing ", " debug ", " sources ", .IR plf ". " .PP Помимо этого, данный скрипт позволяет произвести выборучную загрузку требуемых пакетов с учетом абсолютно всех зависимостей, т.е. загруженные пакеты являются самодостоточными. Так, например, при загрузки пакета .B task-kde4 , скрипт произведет загрузку более 1000 пакетов, необходимых для полноценной установки данного мета-пакета. .SH ПАРАМЕТРЫ При запуске скрипта без параметров, скрипт приступает к работе с параметрами по-умолчанию. Ниже приведены используемые параметры и их значения по-умолчанию. .TP .B -e Редакция дистрибутива: .IR devel ", " official " (По-умолчанию: " official " )" .TP .B -r Версия дистрибутива: .IR current ", " 2009.0 ", " 2008.1 ", " 2008.0 " и т.д. (По-умолчанию: " current " для редакции official и " cooker " для редакции devel)" .TP .B -a Архитектура дистрибутива: .IR i586 ", " x86_64 " (По-умолчанию: " i586 " )" .TP .B -H Сервер зеркала (По-умолчанию: .IR ftp.mandriva.ru " )" .TP .B -M Rsync-модуль сервера (По-умолчанию: для ftp.mandriva.ru -- .IR mandriva/mandriva " )" .TP .B --root Корень локального дистрибутива (По-умолчанию: .IR $HOME/mirror " )" .TP .B --no-debug Исключить из списка зеркалирования debug-пакеты (По-умолчанию: .IR не\ скачиваются " )" .TP .B --sources Создать зеркало пакетов с исходными кодами (По-умолчанию: .IR не\ скачиваются " )" .TP .B --sources-only Создать только зеркало пакетов с исходными кодами (По-умолчанию: .IR не\ скачиваются " )" .TP .B --update Создать зеркало пакетов обновлений (По-умолчанию: .IR скачиваются " )" .TP .B --update-only Создать только зеркало пакетов обновлений (По-умолчанию: .IR не\ скачиваются " )" .TP .B --testing Создать зеркало пакетов для тестирования (По-умолчанию: .IR не\ скачиваются " )" .TP .B --testing-only Создать только зеркало пакетов для тестирования (По-умолчанию: .IR не\ скачиваются " )" .TP .B --backports Создать зеркало пакетов обратного портирования (По-умолчанию: .IR не\ скачиваются " )" .TP .B --backports-only Создать только зеркало пакетов обратного портирования (По-умолчанию: .IR не\ скачиваются " )" .TP .B --plf Создать зеркало пакетов защищенных патентами (По-умолчанию: .IR не\ скачиваются " )" .TP .B --plf-only Создать только зеркало пакетов защищенных патентами(По-умолчанию: .IR не\ скачиваются " )" .TP .B --save Сохранить параметры запуска приложения, параметры сохраняются для текущего имени приложения (По-умолчанию: .IR не\ выполняется " )" .TP .B --show-config Показать параметры запуска приложения (По-умолчанию: .IR не\ выполняется " )" .TP .B --rpms Скачать только затребованные пакеты со всеми зависимостям (По-умолчанию: .IR не\ выполняется " )" .TP .B --auto-rpms Скачать только затребованные пакеты со всеми зависимостям в автоматическом режиме (По-умолчанию: .IR не\ выполняется " )" .TP .B --srpms Скачать только затребованные пакеты с исходным кодом со всеми зависимостям (По-умолчанию: .IR не\ выполняется " )" .TP .B --auto-srpms Скачать только затребованные пакеты с исходным кодом со всеми зависимостям в автоматическом режиме (По-умолчанию: .IR не\ выполняется " )" .TP .B -h (--help) Показать эту справку и выйти .P При добавлении в конец параметра знак "-" (минус) - это приведет к инверсии параметра, т.е. сменит значание параметра на противоположное. Данному свойству подвержены следующие параметры: .I "--no-debug" "--sources" "--sources-only" "--update" "--update-only" "--testing" "--testing-only" "--plf" "--plf-only" "--backports" "--backports-only" .SH ДОСТУПНОСТЬ Функционал данного скрипта будет полностью доступен в Mandriva/GNU Linux 2010.0. На более ранних версиях корректная работа скрипта не гарантируется. Так же, при использовании данного скрипта на других дистрибутивах, функционирование скрипта не гарантируется. .SH ОКРУЖЕНИЕ Скрипт в своей работе может использовать переменные окружения, относящиеся к программам rsync, urpmi, urpmi.addmedia, chroot .TP .B RSYNC_PROXY Значение этой переменной имеет вид " .IR имя_хоста:порт ", где имя хоста - это хост прокси сервера, а порт соответственно порт прокси сервера. \ Т.к. rsync не поддерживает авторизацию на прокси сервере, то для нормальной работы rsync через прокси сервер, последний должен пропускать трафик, проходящий через порт 873 без авторизации. .TP .B HOME Определяет домашню директорию пользователя, от имени которого запускается скрипт .SH ФАЙЛЫ При работе скрипта используются следующие файлы: .TP .IR "$HOME/.config/$(basename $0).conf" Файл с настройками скрипта .SH ЗАМЕЧАНИЯ Для использования различных кофигураций, создайте симолическую ссылку на данный скрипт и сохраните параметры. При использовании параметров .I "--auto-rpms" "--rpms" пакеты сохраняются в директорию RPMS корня зеркала пакетов. Не используйте .I current для ftp.mandriva.ru, в противном случае скрипт закончит свое выполнение с ошибкой. На сайте ftp.mandriva.ru отсутствует симоличнская ссылка .I current \. .SH ПРИМЕРЫ .B Создание зеркала с сайта ftp.mandriva.ru релиз 2010.0 архитектуры x86_64 в директорию mandriva пользователя $USER $(basename $0) -H ftp.mandriva.ru -M mandriva/mandriva -r 2010.0 -a x86_64 --root $HOME/mandriva .P .B Сохранение параметров для создание зеркала с сайта ftp.mandriva.ru релиз 2010.0 архитектуры x86_64 в директорию mandriva пользователя $USER $(basename $0) -H ftp.mandriva.ru -M mandriva/mandriva -r 2010.0 -a x86_64 --root $HOME/mandriva --save .P .B Посмотреть сохраненные параметры $(basename $0) --show-config .P .B Создание зеркала с сайта ftp.mandriva.ru релиз 2010.0 архитектуры i586 в директорию mandriva пользователя $USER. .B Все параметры за исключенеим архитектуры берутся из ранее сохраненных параметров $(basename $0) -a i586 .P .B Создание зеркала с сайта ftp.mandriva.ru релиз 2010.0 архитектуры x86_64 в директорию mandriva пользователя $USER. .B В данном запуске скрипта дополнительно скачиваем пакеты отладки. Все параметры за исключенеим пакетов отладки берутся из ранее сохраненных параметров $(basename $0) --no-debug- .P .B Загрузить пакет task-kde4 со всеми зависимостями, необходимыми для установки требуемого пакета. $(basename $0) --rpms-auto task-kde4 .SH "СМОТРИ ТАКЖЕ" .BR rsync (1), .BR urpmi (8), .BR chroot (1), .BR urpmi.addmedia (8) MANEOF man $TMP/$(basename $0).1 rm -f $TMP/$(basename $0).1 } function rsync_err() # Вывод сообщения об ошибке RSYNC и установки метки ошибки ERR { echo -en ' \E[31;3m (' case $@ in 0) echo -n "Success";; 1) echo -n "Syntax or usage error";; 2) echo -n "Protocol incompatibility";; 3) echo -n "Errors selecting input/output files, dirs";; 4) echo -n "Requested action not supported: an attempt was made to manipulate 64-bit files on a platform that cannot support them; or an option was specified that is supported by the client and not by the server.";; 5) echo -n "Error starting client-server protocol";; 6) echo -n "Daemon unable to append to log-file";; 10) echo -n "Error in socket I/O";; 11) echo -n "Error in file I/O";; 12) echo -n "Error in rsync protocol data stream";; 13) echo -n "Errors with program diagnostics";; 14) echo -n "Error in IPC code";; 20) echo -n "Received SIGUSR1 or SIGINT";; 21) echo -n "Some error returned by waitpid()";; 22) echo -n "Error allocating core memory buffers";; 23) echo -n "Partial transfer due to error";; 24) echo -n 'Partial transfer due to vanished source files';; 25) echo -n 'The --max-delete limit stopped deletions';; 30) echo -n 'Timeout in data send/receive';; 35) echo -n 'Timeout waiting for daemon connection';; esac echo " )" tput sgr0 return 1 } function get_args() { get_config echo -e "${TBold[1]}Проверка параметров программы...${TBold[0]}" ShowCFG=${PShowCFG:-"false"} Sources=${PSources:-$DefaultSource} SourcesOnly=${PSourcesOnly:-$DefaultSourceOnly} PLF=${PPLF:-$DefaultPLF} PLFOnly=${PPLFOnly:-$DefaultPLFOnly} GetDebug=${PGetDebug:-$DefaultGetDebug} GetUpdate=${PGetUpdate:-$DefaultGetUpdate} GetUpdateOnly=${PGetUpdateOnly:-$DefaultGetUpdateOnly} GetTesting=${PGetTesting:-$DefaultGetTesting} GetTestingOnly=${PGetTestingOnly:-$DefaultGetTestingOnly} GetBackports=${PGetBackports:-$DefaultGetBackports} GetBackportsOnly=${PGetBackportsOnly:-$DefaultGetBackportsOnly} Root_Local_Mirror=${Root:-$DefaultRoot} RSYNC_HOST=${Host:-$DefaultHost} RPM_Ferm_Module=${Module:-$DefaultModule} RPM_Ferm_Release=${Release:-$DefaultRelease} [[ "$RPM_Ferm_Release" == 'cooker' ]] && RPM_Ferm_Version=${Version:-"devel"} [[ "$RPM_Ferm_Release" != 'cooker' ]] && RPM_Ferm_Version=${Version:-"official"} [[ $Version == "devel" ]] && RPM_Ferm_Version=${Version:-"devel"} RPM_Ferm_Arch=${Arch:-$DefaultArch} RSYNC_DIRECTORY="$RPM_Ferm_Module/$RPM_Ferm_Version/$RPM_Ferm_Release/$RPM_Ferm_Arch" SRPMS="${RSYNC_DIRECTORY%$RPM_Ferm_Arch}SRPMS" case $ShowCFG in "true") echo -e "Используемые параметры:" echo -en "Получение исходных кодов: "; [[ "$Sources" == 'true' ]] && echo -e "${TBold[1]}Включено${TBold[0]}" || echo -e "${TBold[1]}Отключено${TBold[0]}" echo -en "Получить только исходные коды: "; [[ "$SourcesOnly" == 'true' ]] && echo -e "${TBold[1]}Включено${TBold[0]}" || echo -e "${TBold[1]}Отключено${TBold[0]}" echo -en "Получить пакеты, защищенные патентами: "; [[ "$PLF" == 'true' ]] && echo -e "${TBold[1]}Включено${TBold[0]}" || echo -e "${TBold[1]}Отключено${TBold[0]}" echo -en "Получить только пакеты, защищенные патентами: "; [[ "$PLFOnly" == 'true' ]] && echo -e "${TBold[1]}Включено${TBold[0]}" || echo -e "${TBold[1]}Отключено${TBold[0]}" echo -en "Получение пакетов для отладки: " ; [[ "$GetDebug" == 'true' ]] && echo -e "${TBold[1]}Включено${TBold[0]}" || echo -e "${TBold[1]}Отключено${TBold[0]}" echo -en "Получение пакетов обнолений: " ; [[ "$GetUpdate" == 'true' ]] && echo -e "${TBold[1]}Включено${TBold[0]}" || echo -e "${TBold[1]}Отключено${TBold[0]}" echo -en "Получение только пакетов обнолений: " ; [[ "$GetUpdateOnly" == 'true' ]] && echo -e "${TBold[1]}Включено${TBold[0]}" || echo -e "${TBold[1]}Отключено${TBold[0]}" echo -en "Получение пакетов для тестирования: " ; [[ "$GetTesting" == 'true' ]] && echo -e "${TBold[1]}Включено${TBold[0]}" || echo -e "${TBold[1]}Отключено${TBold[0]}" echo -en "Получение только пакетов для тестирования: " ; [[ "$GetTestingOnly" == 'true' ]] && echo -e "${TBold[1]}Включено${TBold[0]}" || echo -e "${TBold[1]}Отключено${TBold[0]}" echo -en "Получение пакетов обратного портирования: " ; [[ "$GetBackports" == 'true' ]] && echo -e "${TBold[1]}Включено${TBold[0]}" || echo -e "${TBold[1]}Отключено${TBold[0]}" echo -en "Получение только пакетов обратного портирования: " ; [[ "$GetBackportsOnly" == 'true' ]] && echo -e "${TBold[1]}Включено${TBold[0]}" || echo -e "${TBold[1]}Отключено${TBold[0]}" echo -e "Корень локального дистрибутива: ${TBold[1]} $Root_Local_Mirror ${TBold[0]}"; echo -e "Сервер зеркала: ${TBold[1]}$RSYNC_HOST${TBold[0]}" echo -e "Rsync-модуль сервера: ${TBold[1]}$RPM_Ferm_Module${TBold[0]}" echo -e "Версия дистрибутива: ${TBold[1]}$RPM_Ferm_Release${TBold[0]}" echo -e "Редакция дистрибутива: ${TBold[1]}$RPM_Ferm_Version${TBold[0]}" echo -e "Архитектура дистрибутива: ${TBold[1]}$RPM_Ferm_Arch${TBold[0]}" exit 0 ;; "false") RSYNC_CMD=$(which rsync 2> /dev/null ) if [ -e "$RSYNC_CMD" ]; then : else echo -e "${TRed[1]}Программа загрузки дистрибутива RSYNC не найдена.${TRed[0]}" echo -e "Требуется установить программу РСУНС.\нВыполните от имени суперпользователя следующую команду: urpmi rsync" exit 1 fi if [ -d $Root_Local_Mirror ]; then : else echo -e "${TRed[1]}Отсутствует каталог корня локального зеркала: $Root_Local_Mirror.${TRed[0]}" answer=; read -p "Создать каталог?(Y\\N):" answer; [[ $answer == [Yy] ]] && mkdir -m 777 -pv "$Root_Local_Mirror" || { echo -e "Для корректной работы программы требуется наличие каталога локального зеркала." exit 1 } fi echo -en "Проверка соединения с сервером " rsync -nq rsync://$RSYNC_HOST 2> /dev/null if [ "$?" != "0" ] ; then echo echo -e "${TRed[1]}Сервер ${TBold[1]}$RSYNC_HOST${TBold[0]} ${TRed[1]}не доступен, попробуйте позже, либо укажите в параметрах другой сервер${TRed[0]}" exit 1 else echo -e "[Ok]" fi echo -en "Проверка существования модуля подключения " rsync -nq rsync://$RSYNC_HOST/$RPM_Ferm_Module 2> /dev/null if [ "$?" != "0" ] ; then echo echo -e "${TRed[1]}Используемый модуль \"${TBold[1]}$RPM_Ferm_Module${TBold[0]}${TRed[1]}\" не доступен, попробуйте позже, либо укажите в параметрах другой модуль${TRed[0]}" echo -e "На текущий момент на сервере доступны следующие модули:" rsync -n rsync://$RSYNC_HOST/ | awk '{print $1}' echo exit 1 else echo -e "[Ok]" fi if [ "$SourcesOnly" == "true" -o "$Sources" = "true" ]; then : echo -en "Проверка существования требуемого зеркала пакетов с исходными кодами " rsync -nq rsync://$RSYNC_HOST/$SRPMS 2> /dev/null if [ "$?" != "0" ] ; then echo echo -e "${TRed[1]}Используемое зеркало \"${TBold[1]}$SRPMS${TBold[0]}${TRed[1]}\" не доступно.\нПопробуйте позже, либо укажите другие параметры.${TRed[0]}" echo exit 1 else echo -e "[Ok]" fi fi echo -en "Проверка существования требуемого зеркала с пакетами программ " rsync -nq rsync://$RSYNC_HOST/$RSYNC_DIRECTORY 2> /dev/null if [ "$?" != "0" ] ; then echo echo -e "${TRed[1]}Используемое зеркало \"${TBold[1]}$RSYNC_DIRECTORY${TBold[0]}${TRed[1]}\" не доступно.\нПопробуйте позже, либо укажите другие параметры.${TRed[0]}" echo exit 1 else echo -e "[Ok]" fi ;; esac return 0 } function put_err() { ret=$1 if [ $ret == "0" ]; then echo -en "\E[32;3m Готово \E[0m\n"; else echo -en "\E[31;3m Ошибка \E[0m" rsync_err $ret fi } function make_repository_source_mirror() { printf "\033[1мСоздаем корневую структуру Зеркала пакетов с исходным кодом\033[0m - " mkdir -p $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/SRPMS $RSYNC_CMD -d $RSYNC_OPT rsync://$RSYNC_HOST/$SRPMS/ $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/SRPMS/ 2> /dev/null err=$?; put_err $err for i in `ls -1 $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/SRPMS/* -Ad`; do item=`basename "$i"` $RSYNC_CMD -d $RSYNC_OPT rsync://$RSYNC_HOST/$SRPMS/$item/ $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/SRPMS/$item/ 2> /dev/null err=$?; put_err $err for x in `ls -1 $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/SRPMS/$item/* -Ad`; do item2=`basename "$x"` [[ -d $x ]] && case $item2 in updates) [[ ("$GetUpdate" == "true" || "$GetUpdateOnly" == "true") && "$GetTestingOnly" != "true" && "$GetBackportsOnly" != "true" ]] && ( echo -en "Загрузка директории \033[1m<$item/"; echo -en "$item2>\033[0m - " $RSYNC_CMD -r $RSYNC_OPT rsync://$RSYNC_HOST/$SRPMS/$item/$item2/ $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/SRPMS/$item/$item2/ 2> /dev/null err=$?; put_err $err ) [[ "$GetUpdateOnly" == "true" ]] && break ;; testing) [[ ("$GetTesting" == "true" || "$GetTestingOnly" == "true") && "$GetUpdateOnly" != "true" && "$GetBackportsOnly" != "true" ]] && ( echo -en "Загрузка директории \033[1m<$item/"; echo -en "$item2>\033[0m - " $RSYNC_CMD -r $RSYNC_OPT rsync://$RSYNC_HOST/$SRPMS/$item/$item2/ $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/SRPMS/$item/$item2/ 2> /dev/null err=$?; put_err $err ) [[ "$GetTestingOnly" == "true" ]] && break ;; backports) [[ ("$GetBackports" == "true" || "$GetBackportsOnly" == "true") && "$GetUpdateOnly" != "true" && "$GetTestingOnly" != "true" ]] && ( echo -en "Загрузка директории \033[1m<$item/"; echo -en "$item2>\033[0m - " $RSYNC_CMD -r $RSYNC_OPT rsync://$RSYNC_HOST/$SRPMS/$item/$item2/ $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/SRPMS/$item/$item2/ 2> /dev/null err=$?; put_err $err ) [[ "$GetBackportsOnly" == "true" ]] && break ;; *) [[ "$GetUpdateOnly" != "true" && "$GetTestingOnly" != "true" && "$GetBackportsOnly" != "true" ]] && ( echo -en "Загрузка директории \033[1m<$item/"; echo -en "$item2>\033[0m - " $RSYNC_CMD -r $RSYNC_OPT rsync://$RSYNC_HOST/$SRPMS/$item/$item2/ $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/SRPMS/$item/$item2/ 2> /dev/null err=$?; put_err $err ) ;; esac done done } function make_repository_mirror() { printf "\033[1мСоздаем корневую структуру Зеркала пакетов программ\033[0m - " mkdir -p $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/$RPM_Ferm_Arch $RSYNC_CMD -d $RSYNC_OPT rsync://$RSYNC_HOST/$RSYNC_DIRECTORY/ $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/$RPM_Ferm_Arch/ 2> /dev/null err=$?; put_err $err for i in `ls -1 $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/$RPM_Ferm_Arch/* -Ad`; do item=`basename "$i"` if [ "$item" != "media" -a -d "$i" ]; then printf "Загрузка директории \033[1m<$item>\033[0m - " $RSYNC_CMD -r $RSYNC_OPT rsync://$RSYNC_HOST/$RSYNC_DIRECTORY/$item/ $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/$RPM_Ferm_Arch/$item/ 2> /dev/null err=$?; put_err $err fi done printf "Обновление структуры \033[1mMEDIA\033[0m - " item='media' $RSYNC_CMD -d $RSYNC_OPT rsync://$RSYNC_HOST/$RSYNC_DIRECTORY/$item/ $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/$RPM_Ferm_Arch/$item/ 2> /dev/null err=$?; put_err $err printf "\033[1мОбновление основного репозитория\033[0m:\n" [[ $GetDebug == 'true' ]] && media="media/main media/contrib media/non-free media/debug_contrib media/debug_main media/debug_non-free" || media="media/main media/contrib media/non-free" for i in $media; do $RSYNC_CMD -d $RSYNC_OPT rsync://$RSYNC_HOST/$RSYNC_DIRECTORY/$i/ $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/$RPM_Ferm_Arch/$i/ 2> /dev/null err=$?; put_err $err for x in `ls -1 $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/$RPM_Ferm_Arch/$i/* -Ad`; do item2=`basename "$x"` [[ -d $x ]] && case $item2 in updates) [[ ("$GetUpdate" == "true" || "$GetUpdateOnly" == "true") && "$GetTestingOnly" != "true" && "$GetBackportsOnly" != "true" ]] && ( echo -en "Загрузка директории \033[1m<$i/"; echo -en "$item2>\033[0m - " $RSYNC_CMD -r $RSYNC_OPT rsync://$RSYNC_HOST/$RSYNC_DIRECTORY/$i/$item2/ $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/$RPM_Ferm_Arch/$i/$item2/ 2> /dev/null err=$?; put_err $err ) [[ "$GetUpdateOnly" == "true" ]] && break ;; testing) [[ ("$GetTesting" == "true" || "$GetTestingOnly" == "true") && "$GetUpdateOnly" != "true" && "$GetBackportsOnly" != "true" ]] && ( echo -en "Загрузка директории \033[1m<$i/"; echo -en "$item2>\033[0m - " $RSYNC_CMD -r $RSYNC_OPT rsync://$RSYNC_HOST/$RSYNC_DIRECTORY/$i/$item2/ $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/$RPM_Ferm_Arch/$i/$item2/ 2> /dev/null err=$?; put_err $err ) [[ "$GetTestingOnly" == "true" ]] && break ;; backports) [[ ("$GetBackports" == "true" || "$GetBackportsOnly" == "true") && "$GetUpdateOnly" != "true" && "$GetTestingOnly" != "true" ]] && ( echo -en "Загрузка директории \033[1m<$i/"; echo -en "$item2>\033[0m - " $RSYNC_CMD -r $RSYNC_OPT rsync://$RSYNC_HOST/$RSYNC_DIRECTORY/$i//$item2/ $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/$RPM_Ferm_Arch/$i/$item2/ 2> /dev/null err=$?; put_err $err ) [[ "$GetBackportsOnly" == "true" ]] && break ;; *) [[ "$GetUpdateOnly" != "true" && "$GetTestingOnly" != "true" && "$GetBackportsOnly" != "true" ]] && ( echo -en "Загрузка директории \033[1m<$i/"; echo -en "$item2>\033[0m - " $RSYNC_CMD -r $RSYNC_OPT rsync://$RSYNC_HOST/$RSYNC_DIRECTORY/$i/$item2/ $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/$RPM_Ferm_Arch/$i/$item2/ 2> /dev/null err=$?; put_err $err ) ;; esac done done printf "Синхронизация \033[1m\033[0m\n" item='media/media_info' $RSYNC_CMD -r $RSYNC_OPT rsync://$RSYNC_HOST/$RSYNC_DIRECTORY/$item/ $Root_Local_Mirror/$RPM_Ferm_Version/$RPM_Ferm_Release/$RPM_Ferm_Arch/$item/ 2> /dev/null err=$?; put_err $err if [ $err != "0" ]; then printf "\033[1m\E[31;3mСинхронизация завершена с ошибками.\033[0m\n"; else printf "\033[1m\E[32;3mСинхронизация завершена.\033[0m\n"; fi } function make_plf_repository_mirror() { printf "\033[1mСоздаем корневую структуру Зеркала пакетов защищеных патентами\033[0m\n" if [ "$RSYNC_HOST" == "distrib-coffee.ipsl.jussieu.fr" ]; then PLFCFG="plf/mandriva/cfg/$RPM_Ferm_Release" PLF="plf/mandriva/$RPM_Ferm_Release" else PLFCFG="mandriva/plf/cfg/$RPM_Ferm_Release" PLF="mandriva/plf/$RPM_Ferm_Release" fi items="binary/$RPM_Ferm_Arch" [[ $GetDebug == 'true' ]] && items="$items debug/$RPM_Ferm_Arch" [[ "$Sources" == "true" ]] && items="$items source" [[ "$SourcesOnly" == "true" ]] && items="source" if [ "$RPM_Ferm_Release" == "cooker" ]; then mkdir -p $Root_Local_Mirror/plf/{$RPM_Ferm_Release/{free,non-free}/{{binary,debug}/$RPM_Ferm_Arch,source},cfg/$RPM_Ferm_Release/$RPM_Ferm_Arch} echo -e "Синхронизация конфигурации пакетов, защищеных патентами" $RSYNC_CMD -rq $RSYNC_OPT rsync://$RSYNC_HOST/$PLFCFG/$RPM_Ferm_Arch/ $Root_Local_Mirror/plf/cfg/$RPM_Ferm_Release/$RPM_Ferm_Arch/ 2>/dev/null err=$?; put_err $err echo -e "Синхронизация пакетов, защищеных патентами" for y in "free" "non-free"; do for i in $items; do $RSYNC_CMD -r $RSYNC_OPT rsync://$RSYNC_HOST/$PLF/$y/$i/ $Root_Local_Mirror/plf/$RPM_Ferm_Release/$y/$i/ 2>/dev/null err=$?; put_err $err done; done; else mkdir -p $Root_Local_Mirror/plf/{$RPM_Ferm_Release/{free,non-free}/{backports,release}/{{binary,debug}/$RPM_Ferm_Arch,source},cfg/$RPM_Ferm_Release/$RPM_Ferm_Arch} echo -e "Синхронизация конфигурации пакетов, защищеных патентами" $RSYNC_CMD -rq $RSYNC_OPT rsync://$RSYNC_HOST/$PLFCFG/$RPM_Ferm_Arch/ $Root_Local_Mirror/plf/cfg/$RPM_Ferm_Release/$RPM_Ferm_Arch/ 2>/dev/null err=$?; put_err $err echo -e "Синхронизация пакетов, защищеных патентами" [[ "$GetBackports" == "true" ]] && x="backports release" || x="release" [[ "$GetBackportsOnly" == "true" ]] && x="backports" for y in "free" "non-free"; do for z in $x; do for i in $items; do $RSYNC_CMD -r $RSYNC_OPT rsync://$RSYNC_HOST/$PLF/$y/$z/$i/ $Root_Local_Mirror/plf/$RPM_Ferm_Release/$y/$z/$i/ 2>/dev/null err=$?; put_err $err done done done fi } function get_singl_rpms() { TEMPROOT=$TMP/rpmgetroot localFerm=$Root_Local_Mirror/RPMS echo Создаем временную директорию для скичивания файлов [ -d $TEMPROOT ] || mkdir -p $TEMPROOT/{files/rpms,root} [ -d $localFerm ] || mkdir -p $localFerm cat << OEF > $TEMPROOT/rpmscript.sh #!/bin/bash trap 'umount $localFerm rm -rf $TEMPROOT ' EXIT i=0 urpmiaddmedia () { if [ "\$1" == true ]; then REPOSITORY="rsync://$RSYNC_HOST/\$PLFCFG/$RPM_Ferm_Arch/media/" else REPOSITORY="rsync://$RSYNC_HOST/$RSYNC_DIRECTORY/media/" fi shift for x in \$*; do if [[ "$GetDebug" == 'true' ]] ; then echo \${x:1:\${#x}-2} | grep -q debug && urpmi.addmedia --urpmi-root $TEMPROOT/root virtualmedia\$((i++)) \$REPOSITORY\${x:1:\${#x}-2} fi if [[ "$Sources" == 'true' || "$SourcesOnly" == 'true' ]]; then echo \${x:1:\${#x}-2} | grep -q SRPMS && urpmi.addmedia --urpmi-root $TEMPROOT/root virtualmedia\$((i++)) \$REPOSITORY\${x:1:\${#x}-2} echo \${x:1:\${#x}-2} | grep -q source && urpmi.addmedia --urpmi-root $TEMPROOT/root virtualmedia\$((i++)) \$REPOSITORY\${x:1:\${#x}-2} [[ "$SourcesOnly" == 'true' ]] && continue fi # if [[ ("$GetUpdate" == "true" || "$GetUpdateOnly" == "true") && "$Sources" != 'true' && "$GetDebug" != 'true' && "$GetTestingOnly" != "true" && "$GetBackportsOnly" != "true" && "$SourcesOnly" != 'true' ]] ; then if [[ ("$GetUpdate" == "true" || "$GetUpdateOnly" == "true") && "$GetDebug" != 'true' && "$GetTestingOnly" != "true" && "$GetBackportsOnly" != "true" ]] ; then echo \${x:1:\${#x}-2} | grep -v source | grep -v SRPMS | grep -v debug| grep -q update && urpmi.addmedia --urpmi-root $TEMPROOT/root virtualmedia\$((i++)) \$REPOSITORY\${x:1:\${#x}-2} [[ "$GetUpdateOnly" == 'true' ]] && continue fi # if [[ ("$GetTesting" == "true" || "$GetTestingOnly" == "true") && "$Sources" != 'true' && "$GetDebug" != 'true' && "$GetUpdateOnly" != "true" && "$GetBackportsOnly" != "true" && "$SourcesOnly" != 'true' ]] ; then if [[ ("$GetTesting" == "true" || "$GetTestingOnly" == "true") && "$GetDebug" != 'true' && "$GetUpdateOnly" != "true" && "$GetBackportsOnly" != "true" ]] ; then echo \${x:1:\${#x}-2} | grep -v source | grep -v SRPMS | grep -v debug| grep -q testing && urpmi.addmedia --urpmi-root $TEMPROOT/root virtualmedia\$((i++)) \$REPOSITORY\${x:1:\${#x}-2} [[ "$GetTestingOnly" == 'true' ]] && continue fi # if [[ ("$GetBackports" == "true" || "$GetBackportsOnly" == "true") && "$Sources" != 'true' && "$GetDebug" != 'true' && "$GetUpdateOnly" != "true" && "$GetTestingOnly" != "true" && "$SourcesOnly" != 'true' ]] ; then if [[ ("$GetBackports" == "true" || "$GetBackportsOnly" == "true") && "$GetDebug" != 'true' && "$GetUpdateOnly" != "true" && "$GetTestingOnly" != "true" ]] ; then echo \${x:1:\${#x}-2} | grep -v source| grep -v SRPMS | grep -v debug| grep -q backports && urpmi.addmedia --urpmi-root $TEMPROOT/root virtualmedia\$((i++)) \$REPOSITORY\${x:1:\${#x}-2} fi # if [[ "$Sources" != 'true' && "$SourcesOnly" != 'true' && "$GetDebug" != 'true' ]] ; then if [[ "$GetDebug" != 'true' ]] ; then echo \${x:1:\${#x}-2} | grep -v source | grep -v SRPMS | grep -v debug| grep -q release && urpmi.addmedia --urpmi-root $TEMPROOT/root virtualmedia\$((i++)) \$REPOSITORY\${x:1:\${#x}-2} fi done } mount $localFerm $TEMPROOT/files/rpms -o bind genhdlist2 --allow-empty-media --clean --xml-info --quiet $TEMPROOT/files/rpms urpmi.addmedia --urpmi-root $TEMPROOT/root localferm $localFerm echo Добавление источников в виртуальную директорию if [ "$RSYNC_HOST" == "distrib-coffee.ipsl.jussieu.fr" ]; then PLFCFG="plf/mandriva/cfg/$RPM_Ferm_Release" RPLF="plf/mandriva/$RPM_Ferm_Release" else PLFCFG="mandriva/plf/cfg/$RPM_Ferm_Release" RPLF="mandriva/plf/$RPM_Ferm_Release" fi rsync -q rsync://$RSYNC_HOST/\$PLFCFG/$RPM_Ferm_Arch/media/media_info/media.cfg $TEMPROOT/ PLFfile=\`cat $TEMPROOT/media.cfg | grep "^\[" | grep -v media_info\` rsync -q rsync://$RSYNC_HOST/$RSYNC_DIRECTORY/media/media_info/media.cfg $TEMPROOT/ Fermfile=\`cat $TEMPROOT/media.cfg | grep "^\[" | grep -v media_info\` [[ "$PLFOnly" != "true" ]] && urpmiaddmedia false \$Fermfile [[ "$PLFOnly" == "true" || "$PLF" == "true" ]] && urpmiaddmedia true \$PLFfile echo Скачивание затребованного пакета со всеми его зависимостями chown -R root.root $TEMPROOT/files chmod -R ugo+rwX $TEMPROOT/files if [ ${GSRPMS:-false} == true ]; then if [ "$autoRPMS" == true ]; then urpmi --noclean --buildrequires --resume --urpmi-root $TEMPROOT/root --no-install --no-verify-rpm --download-all $TEMPROOT/files --auto $@ else urpmi --noclean --buildrequires --resume --urpmi-root $TEMPROOT/root --no-install --no-verify-rpm --download-all $TEMPROOT/files $@ fi else if [ "$autoRPMS" == true ]; then urpmi --noclean --resume --urpmi-root $TEMPROOT/root --no-install --no-verify-rpm --download-all $TEMPROOT/files --auto $@ else urpmi --noclean --resume --urpmi-root $TEMPROOT/root --no-install --no-verify-rpm --download-all $TEMPROOT/files $@ fi fi [[ $? != 0 ]] && (echo Скичивание пакетов прошло не удачно, повторите попытку позднее...) echo Формирование hdlist списка genhdlist2 --allow-empty-media --clean --xml-info $TEMPROOT/files/rpms chmod -R ugo+rwX $TEMPROOT/files OEF chmod +x $TEMPROOT/rpmscript.sh echo Введите пароль пользователя root if [[ "$UID" != "0" ]]; then su root -lc $TEMPROOT/rpmscript.sh $@ else $TEMPROOT/rpmscript.sh $@ fi } if [ "$#" == "0" ]; then get_args [[ $? != "0" ]] && exit else if [ "$1" == "${*##*-}" ]; then help exit 1 else while [ "$1" != "${*##*-}" ]; do case $1 in -e) if [ "$2" == "devel" -o "$2" == "official" ]; then Version=$2 shift 2 else echo -e "${TRed[1]}Не верно указана редация дистрибутива - значение параметра${TRed[0]} \"${TBold[1]}-e${TBold[0]}\".\nЗа помощью по работе с данной программой обратитесь к справке ${TBold[1]}$(basename $0) --help ${TBold[0]}."; exit fi ;; -r) if [ "$2" == "current" -o "$2" == "cooker" -o "${2##20[0-9][0-9].[01]}" == "" ]; then Release=$2 shift 2 else echo -e "${TRed[1]}Не верно указана версия дистрибутива - значение параметра${TRed[0]} \"${TBold[1]}-r${TBold[0]}\".\nЗа помощью по работе с данной программой обратитесь к справке ${TBold[1]}$(basename $0) --help ${TBold[0]}."; exit fi ;; -a) if [ "$2" == "i586" -o "$2" == "x86_64" ]; then Arch=$2 shift 2 else echo -e "${TRed[1]}Не верно указана архитектура дистрибутива - значение параметра${TRed[0]} \"${TBold[1]}-a${TBold[0]}\".\nЗа помощью по работе с данной программой обратитесь к справке ${TBold[1]}$(basename $0) --help ${TBold[0]}."; exit fi ;; --root)if [ "$2" != "" ]; then Root=$2 shift 2 else echo -e "${TRed[1]}Не верно указан корень дистрибутива - значение параметра${TRed[0]} \"${TBold[1]}--root${TBold[0]}\".\nЗа помощью по работе с данной программой обратитесь к справке ${TBold[1]}$(basename $0) --help ${TBold[0]}."; exit fi ;; -H)if [ "$2" != "" ]; then Host=$2 shift 2 else echo -e "${TRed[1]}Не верно указан хост сервера - значение параметра${TRed[0]} \"${TBold[1]}-H${TBold[0]}\".\nЗа помощью по работе с данной программой обратитесь к справке ${TBold[1]}$(basename $0) --help ${TBold[0]}."; exit fi ;; "--plf"|"--plf-") [[ "${1: -1}" == "-" ]] && PPLF=false || PPLF=true shift ;; "--plf-only"|"--plf-only-") [[ "${1: -1}" == "-" ]] && PPLFOnly=false || PPLFOnly=true shift ;; "--sources"|"--sources-") [[ "${1: -1}" == "-" ]] && PSources=false || PSources=true shift ;; "--sources-only"|"--sources-only-") [[ "${1: -1}" == "-" ]] && PSourcesOnly=false || PSourcesOnly=true shift ;; "--update"|"--update-") [[ "${1: -1}" == "-" ]] && PGetUpdate=false || PGetUpdate=true shift ;; "--update-only"|"--update-only-") [[ "${1: -1}" == "-" ]] && PGetUpdateOnly=false || PGetUpdateOnly=true shift ;; "--testing"|"--testing-") [[ "${1: -1}" == "-" ]] && PGetTesting=false || PGetTesting=true shift ;; "--testing-only"|"--testing-only-") [[ "${1: -1}" == "-" ]] && PGetTestOnly=false || PGetTestOnly=true shift ;; "--backports"|"--backports-") [[ "${1: -1}" == "-" ]] && PGetBackports=false || PGetBackports=true shift ;; "--backports-only"|"--backports-only-") [[ "${1: -1}" == "-" ]] && PGetBackportsOnly=false || PGetBackportsOnly=true shift ;; "--no-debug"|"--no-debug-") [[ "${1: -1}" == "-" ]] && PGetDebug=true || PGetDebug=false shift ;; --save) PSave=true shift ;; --show-config) PShowCFG=true shift ;; -M)if [ "$2" != "" ]; then Module=$2 shift 2 else echo -e "${TRed[1]}Не верн rsync-модуль сервера - значение параметра${TRed[0]} \"${TBold[1]}-M${TBold[0]}\".\nЗа помощью по работе с данной программой обратитесь к справке ${TBold[1]}$(basename $0) --help ${TBold[0]}."; exit fi ;; --rpms)if [ "$2" != "" ]; then while [ "$2" != '' -a "${2:0:1}" != "-" ]; do shift RPMSlist="$RPMSlist $1" done shift else echo -e "${TRed[1]}Не указаны пакеты для загрузки в значении параметра${TRed[0]} \"${TBold[1]}--rpms${TBold[0]}\".\nЗа помощью по работе с данной программой обратитесь к справке ${TBold[1]}$(basename $0) --help ${TBold[0]}."; exit fi ;; --auto-rpms)if [ "$2" != "" ]; then while [ "$2" != '' -a "${2:0:1}" != "-" ]; do shift RPMSlist="$RPMSlist $1" done shift autoRPMS=true else echo -e "${TRed[1]}Не указаны пакеты для загрузки в значении параметра${TRed[0]} \"${TBold[1]}--rpms${TBold[0]}\".\nЗа помощью по работе с данной программой обратитесь к справке ${TBold[1]}$(basename $0) --help ${TBold[0]}."; exit fi ;; --srpms)if [ "$2" != "" ]; then while [ "$2" != '' -a "${2:0:1}" != "-" ]; do shift RPMSlist="$RPMSlist $1" done GSRPMS=true PSources=true shift else echo -e "${TRed[1]}Не указаны пакеты для загрузки в значении параметра${TRed[0]} \"${TBold[1]}--rpms${TBold[0]}\".\nЗа помощью по работе с данной программой обратитесь к справке ${TBold[1]}$(basename $0) --help ${TBold[0]}."; exit fi ;; --auto-srpms)if [ "$2" != "" ]; then while [ "$2" != '' -a "${2:0:1}" != "-" ]; do shift RPMSlist="$RPMSlist $1" done shift GSRPMS=true autoRPMS=true PSources=true else echo -e "${TRed[1]}Не указаны пакеты для загрузки в значении параметра${TRed[0]} \"${TBold[1]}--rpms${TBold[0]}\".\nЗа помощью по работе с данной программой обратитесь к справке ${TBold[1]}$(basename $0) --help ${TBold[0]}."; exit fi ;; -h|--help) help exit ;; *) help exit 1;; esac done get_args [[ $? != "0" ]] && exit fi fi if [ "$PSave" = "true" ]; then echo -e "Сохраняем параметры в файл конфигурации" save_config fi if [ "$RPMSlist" != "" ]; then get_singl_rpms $RPMSlist exit 0 fi if [ "$SourcesOnly" == "true" -a "$PLF" == "true" ]; then echo -e "Будет произведена синхронизация репозиториев с исходными текстами пакетов программ,\nвключая пакеты с исходными кодами программ, защищенных патентами." make_repository_source_mirror make_plf_repository_mirror exit fi if [ "$SourcesOnly" == "true" ]; then echo -e "Будет произведена синхронизация репозиториев с исходными текстами пакетов программ" make_repository_source_mirror exit fi if [ "$PLFOnly" == "true" ]; then echo -e "Будет произведена синхронизация репозитория пакетов программ, защищенных патентами" make_plf_repository_mirror exit fi echo -e "Будет произведена синхронизация репозитория пакетов программ" make_repository_mirror if [ "$Sources" == "true" ]; then echo -e "Будет произведена синхронизация репозиториев с исходными текстами пакетов программ" make_repository_source_mirror fi if [ "$PLF" == "true" ]; then echo -e "Будет произведена синхронизация репозитория пакетов программ, защищенных патентами" make_plf_repository_mirror fi