Участник:Alexandr/repocreate
Создание локального репозитория с помощью скрипта create-repo.sh
Мне достаточно часто приодиться создавать репозитории из уже закаченных синаптиком пакетов, ими очень удобно пользоваться, если нужно поставить какой-нибудь пакет или пакеты. Просто подключил репозиторий и ставь нужные пакеты всего лишь одной командой. Плюс к этому, их(репозитории) удобно переносить и ставить пакеты уже на других компьютерах. И чтобы свести свой труд к минимуму, я написал один скрипт, которым я хочу поделиться:) Вот собственно, что он умеет:
1. Создавать репозитории из закаченных Synaptic-ом пакетов.
2. Создавать репозитории указав в качестве источника произвольную папку.
3. Прописать существующий репозиторий в Synaptic.
4. Скрипт умеет создавать в папке с репозиторями скрипт, запустив который пропишет репозитории из папки в систему.
Примесание: Пока скрипт работает только с пакетами i586 и noarch архитектуры.
Для создания репозитория, необходимо иметь установленным пакет apt-utils. Если он у вас еще не установлен, скрипт попытается установить его сам. Поискав его у прописанных в системе репозиториях и в одном произвольном репозитории, который вы можете указать в теле скрипта.
А вот и сам скрипт:
#!/bin/sh # ------------------------------------ Настройки скрипта --------------------------------------------------------------------------------------------------------------------- # Укажите репозиторий, из которого можно будет установить пакет apt-utils, если пакет не будет найден в системе и/или указанных на текущим момент репозиториях UseRepo="rpm ftp://ftp.altlinux.org/pub/distributions/ALTLinux/4.1/branch/ i586 classic" # Вы можете сменить разрешения файловой системы для новых репозиториев. Иначе доступ к файлам репозитория будет иметь только пользователь root. Укажите yes чтобы разрешить доступ всем. UseALL=yes # Скрипт может создавать для новых репозиториев скрипты, запуск которых будет автоматически прописывать репозиторий в системе. Укажите yes чтобы использовать эту возможность. UseNewScript=yes # ------------------------------------ Настройки скрипта --------------------------------------------------------------------------------------------------------------------- # Функция вывода справки function _Help () { echo "" echo "Скрипт для создания репозиториев из пакетов, взятых из кэша Synaptic-а либо из указанной папки." echo "" echo "Скрипт поддерживает пакеты арихитектуры i586 и noarch. После успешного использования скрипта," echo "в указанной папке(если такой не существует, она создается автоматически) появляются две папки." echo "Одна папка будет называться i586 - репозиторий для пакетов архитектуры i586, другая папка будет" echo "называться noarch - для пакетов noarch. Если в источнике, который вы указали, не будет пакетов" echo "какой либо архитектуры, соответствующий репозиторий не появиться. После создания репозитория(ев)" echo "их так-же можно будет прописать в систему. Если у вас уже есть репозиторий(ии), то их тоже можно" echo "прописать в систему, указав в качестве папки с репозиториями - папку в которой лежит(ат) папка(и)" echo "i586 и/или noarch." echo "" echo "" echo "Пример запуска скрипта, для создания репозитория:" echo "./имя_скрипта -c /папка/для/нового/репозитория - в качестве пакетов используется кэш Synaptic-а" echo "" echo "Пример запуска скрипта, для создания репозитория c указанием альтернативного источника пакетов:" echo "./имя_скрипта -c /папка/для/нового/репозитория /папка/в_корне/которой/лежат/пакеты - в качестве пакетов используется альтернативный источник" echo "" echo "Пример запуска скрипта, для создания репозитория с удалением пакетов из кэша Synaptic-а:" echo "./имя_скрипта -cr /папка/для/нового/репозитория - в качестве пакетов используется кэш Synaptic-а" echo "" echo "Пример запуска скрипта, для создания репозитория с удалением пакетов из кэша Synaptic-а:" echo "./имя_скрипта -cr /папка/для/нового/репозитория /папка/в_корне/которой/лежат/пакеты - в качестве пакетов используется альтернативный источник" echo "" echo "Если у вас есть репозитории и вы хотите прописать их в системе - это можно сделать так:" echo "./имя_скрипта -i /папка/где/находятся/репозитории - прописывает из этой папки репозитории в систему" echo "" echo "Чтобы удалить из системы все записи о репозиториях, прописанных данным скриптом:" echo "./имя_скрипта --clean - удалит за каталога /var/cache/apt/archives/ все файлы вида A_create_repo*.list" echo "" echo "" echo "" } # Убераем переменные function _Unset () { unset UseRepo;unset Remove;unset NewRepo;unset Sourc;unset UseALL;unset UseNewScript;unset RepoFile } # Проверяем наличие необходимого пакета и в случае неудачи пытаемся его поставить. Иначе прекращаем работу скрипта. function _Autoinstalrpm () { if rpm -qa | grep "apt-utils" >/dev/null 2>&1;then echo >/dev/null;else apt-get update && apt-get install -y apt-utils if rpm -qa | grep "apt-utils" >/dev/null 2>&1;then echo >/dev/null;else echo $UseRepo > /etc/apt/sources.list.d/A-create-repo.list apt-get update && apt-get install -y apt-utils;rm -f /etc/apt/sources.list.d/A-create-repo.list;fi if rpm -qa | grep "apt-utils" >/dev/null 2>&1;then echo >/dev/null;else echo "Пакет для создания репозиториев - apt-utils не найден, дальнейшая работа невозможна";exit;fi;fi } # Прописываем указанные репозитории в системе function _Instal () { [[ $NewRepo == "" ]] && NewRepo=`echo ~+/`;NewRepo=`echo $NewRepo | sed 's/\/$//'` echo $NewRepo;sleep 10s RepoFile=/etc/apt/sources.list.d/A_create_repo_`date +%d%m%y.%H%M%S`.list if ls ${NewRepo}/i586/RPMS.classic | grep i586 |grep rpm >/dev/null 2>&1;then echo rpm\ file\:\/\/${NewRepo}\/" i586 classic" > $RepoFile else echo " Репозиторий с архитектурой i586 не найден в указанной папке либо в папке скрипта";fi if ls ${NewRepo}/noarch/RPMS.classic | grep i586 |grep rpm >/dev/null 2>&1;then ls -f $RepoFile || echo > $RepoFile echo rpm\ file\:\/\/${NewRepo}\/" i586 classic" >> $RepoFile else echo " Репозиторий с архитектурой noarch не найден в указанной папке либо в папке скрипта";fi ls -f $RepoFile && apt-get update } # Создаем репозиторий function _Create () { # Проверяем наличие указанного каталога для репозитория и папки источника. В случае отсутствия каталога для репозитория, пытаемся его создать. Иначе прекращаем работу скрипта. NewRepo=`echo $NewRepo | sed 's/\/$//'` Sourc=`echo $Sourc | sed 's/\/$//'`;[[ $Sourc == "" ]] && Sourc=/var/cache/apt/archives;mkdir $NewRepo >/dev/null if ls -d $NewRepo >/dev/null 2>&1;then echo >/dev/null;else echo "Невозможно найти либо создать каталог под репозиторий";exit;fi # Создаем репозиторий для i586 архитектуры if find $Sourc/ -name "*i586*.rpm" | grep i586 | grep rpm >/dev/null 2>&1;then mkdir -p ${NewRepo}/i586/RPMS.classic if [[ $Remove == 1 ]];then find $Sourc/ -name "*i586*.rpm" -exec mv -f {} ${NewRepo}/i586/RPMS.classic \; find ${NewRepo}/i586/ -maxdepth 1 -name "base" -exec rm -fR {} \; genbasedir --progress --create --topdir=${NewRepo} i586 classic;fi if [[ $Remove != 1 ]];then find $Sourc/ -name "*i586*.rpm" -exec cp -fR {} ${NewRepo}/i586/RPMS.classic \; find ${NewRepo}/i586/ -maxdepth 1 -name "base" -exec rm -fR {} \; genbasedir --progress --create --topdir=${NewRepo} i586 classic;fi;else echo "Пакеты для архитектуры i586 не найдены в указанном источнике.";fi # Создаем репозиторий для noarch архитектуры if find $Sourc/ -name "*noarch*.rpm" | grep noarch | grep rpm >/dev/null 2>&1;then mkdir -p ${NewRepo}/noarch/RPMS.classic if [[ $Remove == 1 ]];then find $Sourc/ -name "*noarch*.rpm" -exec mv -f {} ${NewRepo}/noarch/RPMS.classic \; find ${NewRepo}/noarch/ -maxdepth 1 -name "base" -exec rm -fR {} \; genbasedir --progress --create --topdir=${NewRepo} noarch classic;fi if [[ $Remove != 1 ]];then find $Sourc/ -name "*noarch*.rpm" -exec cp -fR {} ${NewRepo}/noarch/RPMS.classic \; find ${NewRepo}/noarch/ -maxdepth 1 -name "base" -exec rm -fR {} \; genbasedir --progress --create --topdir=${NewRepo} noarch classic;fi;else echo "Пакеты для архитектуры noarch не найдены в указанном источнике.";fi # Проверяем факт создания репозитория(ев), в противном случае удаляем заданный каталог для новых репозиториев и завершаем работу скрипта. if find ${NewRepo} -name "*.rpm" | grep -E "i586|noarch" | grep rpm >/dev/null 2>&1;then echo /dev/null;else echo "Не удалось создать репозиторий, т.к. в указанном источнике. Скрипт завершает работу.";rm -fR ${NewRepo};exit;fi # Меняем разрешения, если задана такая опция if [[ $UseALL=yes ]];then if ls -d ${NewRepo}/i586 >/dev/null 2>&1;then chmod 0777 ${NewRepo};chmod -f 0777 ${NewRepo}/i586;chmod -f 0777 ${NewRepo}/i586/base;chmod -f 0777 ${NewRepo}/i586/RPMS.classic chmod -fR 0666 ${NewRepo}/i586/base/*;chmod -fR 0666 ${NewRepo}/i586/RPMS.classic/*;fi if ls -d ${NewRepo}/noarch >/dev/null 2>&1;then chmod -f 0777 ${NewRepo}/noarch;chmod -f 0777 ${NewRepo}/noarch/base;chmod -f 0777 ${NewRepo}/noarch/RPMS.classic chmod -fR 0666 ${NewRepo}/noarch/base/*;chmod -fR 0666 ${NewRepo}/noarch/RPMS.classic/*;fi fi # Создаем скрипт установки репозитория if [[ $UseNewScript=yes ]];then if ls -d ${NewRepo}/i586/RPMS.classic >/dev/null 2>&1;then echo \#\!\/bin\/sh > ${NewRepo}/install-repo.sh echo rep586\=\~\+ >> ${NewRepo}/install-repo.sh echo rep586\=rpm\\ file\:\/\/\$\{rep586\} >> ${NewRepo}/install-repo.sh echo rep586\=\$\{rep586\}\/\"\ i586\ classic\" >> ${NewRepo}/install-repo.sh echo "echo "\$rep586\ \>\ \/etc\/apt\/sources\.list\.d\/A\-create\-repo\.list >> ${NewRepo}/install-repo.sh;fi if ls -d ${NewRepo}/noarch/RPMS.classic >/dev/null 2>&1;then echo repNOAR\=\~\+ >> ${NewRepo}/install-repo.sh echo repNOAR\=rpm\\ file\:\/\/\$\{repNOAR\} >> ${NewRepo}/install-repo.sh echo repNOAR\=\$\{repNOAR\}\/\"\ noarch\ classic\" >> ${NewRepo}/install-repo.sh echo "echo "\$repNOAR\ \>\>\ \/etc\/apt\/sources\.list\.d\/A\-create\-repo\.list >> ${NewRepo}/install-repo.sh;fi ls -d ${NewRepo}/install-repo.sh && (echo apt\-get\ update >> ${NewRepo}/install-repo.sh;chmod 0777 ${NewRepo}/install-repo.sh) fi } if [[ $UID != "0" ]];then echo "Необходимо запускать скрипт с привелегиями пользователя root. либо установить на скрипт SUID-бит.";exit;fi case $1 in -i) NewRepo=$2;_Instal;_Unset;exit;; -c) NewRepo=$2;Sourc=$3;_Autoinstalrpm;_Create;_Unset;exit;; -cr) Remove=1;NewRepo=$2;Sourc=$3;_Create;_Unset;exit;; -rc) Remove=1;NewRepo=$2;Sourc=$3;_Create;_Unset;exit;; --clean) find /var/cache/apt/archives/ -name "A_create_repo*.list" -exec rm -f {} \; && apt-get update;exit;; "") _Help;_Unset;exit;; *) _Help;_Unset;exit;; esac exit
Чтобы вы могли им воспользоваться, сохраните его в текстовый файл и сделайте исполняемым. Запустите скрипт без параметров чтобы прочитать инструкцию по его использованию.
Если так можно сказать, он еще находиться в бэта-тестировании, поэтому если я буду находить в нем какие-либо ошибки, то буду его исправлять и выкладывать исправленный вариант здесь.