Скрипты Дебианщика
продолжение.
Есть такая замечательная утилита по созданию локального репозитория
reprepro, подробнее про ее использование можно посмотреть
здесь.
Однако пользоваться только возможностями, предоставленными данной утилитой, иногда бывает крайне утомительно и долго, так как возможно вы хотите добавить только пакеты, находящиеся в какой-то папке (и/или ее падпапках), либо наоборот, только исходники, либо и то и другое, находящееся в одной папке, но разбросанных по подпапкам. Тогда придется несколько раз (возможно, много) пользоваться стандартной утилитой
reprepro.
Данный скрипт поможет в таких случаях, автотматизируя процесс поиска пакетов (и/или исходников) по подпапкам:
Код:
#!/bin/bash
##############################################################################
## ##
## Скрипт пытается добавить пакеты и исходники, лежащие в указанной папке ##
## (а также ее подпапках, если выставлена опция), в локальный репозиторий, ##
## созданный программой reprepro ##
## ##
##############################################################################
## ##
## Параметры: ##
## -D PATH_TO_DIR - путь до папки, в которой нужно искать пакеты ##
## и/или исходники (если не указана, то текущая) ##
## -R REP_PATH - корневая папка репозитория ##
## * -C COMPONENT - раздел репозитория (main/contrib/non-free/...) ##
## * -N CODENAME - кодовое имя дистрибутива, (etch/lenny/...) ##
## ##
## Опции: ##
## По умолчанию скрипт ищет в указанной папке файл *.changes и пытается ##
## добавить исходники и пакеты в соответствии с данным файлом. Данные ##
## опции заставляют его работать по другому: ##
## -s - добавить исходники (.dsc, .diff.gz and .orig.tar.gz) ##
## -p - добавить пакеты (.deb and .udeb) ##
## -a - добавить пакеты и исходники ##
## -i - просматривать подпапки ##
## -maxdepth DEPTH - глубина просмотра подпапок, может быть указана ##
## только если указана опция -i (неотрицательное ##
## число, 1 соответствует поиску только в указанной ##
## папке, по аналогии с утилитой find) ##
## ##
## !!! Параметры, отмеченные "*", обязательные, остальные опционально !!! ##
## ##
##############################################################################
# default parameters
REP_PATH=/home/repository #ПАПКА РЕПОЗИТОРИЯ ПО УМОЛЧАНИЮ. ИЗМЕНИТЬ НА СВОЮ !!!
PATH_TO_DIR=./
COMPONENT=""
CODENAME=""
DEPTH=1
ignore="y" #ignore unused parameters
# default options
opt_all=""
opt_source=""
opt_pack=""
opt_change=1
opt_subdir="" # look at subdirectories
opt_depth=""
# Function parse options -s -a -p -i
# $1 - options string
function option_parse ()
{
opt=${1/"-"/""}
if [ `expr match "$opt" ".*\([i]\)"` ]; then
opt_subdir=1
fi
if [ `expr match "$opt" ".*\([a]\)"` ]; then
opt_all=1
opt_change=""
return
fi
if [ `expr match "$opt" ".*\([p]\)"` ]; then
opt_pack=1
opt_change=""
fi
if [ `expr match "$opt" ".*\([s]\)"` ]; then
opt_source=1
opt_change=""
fi
}
# Maximum parameters count
Num=0
# Filling the array of input parameters
for input_param in $*
do
let "Num++" # Increment Num
params[$Num]=$input_param
done
# Main checking cycle (check input parameters)
for ((i=1; i <= Num ; i++))
do
case ${params[$i]} in
"-D") PATH_TO_DIR=${params[$i+1]}
let "i++";;
"-R") REP_PATH=${params[$i+1]}
let "i++";;
"-C") COMPONENT=${params[$i+1]}
let "i++";;
"-N") CODENAME=${params[$i+1]}
let "i++";;
-[sapi]* ) options=`expr match "${params[$i]}" "\(-[sapi]*$\)"`
if [ "$options" = "" ]
then
params[$Num+1]="-exit"
params[$Num+2]=`expr match "${params[$i]}" "\(-[sapi]*\)"`
let "Num+=2"
else option_parse $options
fi;;
"-maxdepth" ) DEPTH=${params[$i+1]}
opt_depth=1
let "i++";;
* ) echo -n "There is unused parameter specified. Ignore? (y/N): "
read ignore;
if [ "$ignore" = "y" ] || [ "$ignore" = "Y" ]
then echo "Ignoring unused parameters ..."
else
{
echo "Operation canceled. Exiting ..."
exit
}
fi;;
esac
done
depth_param="-maxdepth $DEPTH"
if [ $opt_subdir ]
then
depth_param=""
if [ $opt_depth ]
then depth_param="-maxdepth $DEPTH"
fi
fi
# Find files with specified extension
# $1 - file extension
function find_files ()
{
list="`find $PATH_TO_DIR $depth_param -name \"*.$1\"`"
files="" #array of filenames with specified extension
f_num=0
for names in $list
do
let "f_num++"
files[$f_num]=$names
done
}
function list_files
{
for ((i=1; i <= f_num; i++))
do
echo ${files[$i]}
done
}
# Add files to repository
# $1 - file extension
# $2 - include mode (include/includedsc/includedeb/includeudeb)
# $3 - string for message
function add_files ()
{
# Find files with extension specified
find_files $1
# Check if there is no files
if [ -z "$list" ]
then
echo "There is no *.$1 file found."
fi
for ((i=1; i <= f_num; i++))
do
if [ -n "$3" ]
then echo $3 ${files[$i]}
fi
reprepro -b $REP_PATH -C $COMPONENT $2 $CODENAME ${files[$i]}
done
}
# If using .changes file
if [ $opt_change ]
then
add_files "changes" "include" "Add files specified in"
exit
fi
# if need to add packages and sources
if [ $opt_all ]
then
add_files "deb" "includedeb" "Add"
add_files "udeb" "includeudeb" "Add"
add_files "dsc" "includedsc" "Add sources for"
exit
fi
# if need to add packages
if [ $opt_pack ]
then
add_files "deb" "includedeb" "Add"
add_files "udeb" "includeudeb" "Add"
fi
# if need to add sources
if [ $opt_source ]
then
add_files "dsc" "includedsc" "Add sources for"
fi
Пример использования.
Дано:
1. Есть репозиторий, соданный при помощи утилиты
reprepro, находящийся в папке
/home/repository.
2. В домашней папке пользователя
user есть подпапка
debian, в которой несколько подпапок, в каждой из которых по несколько пакетов (могут быть *.deb и *.udeb).
Нужно: добавить все пакеты, находящиеся в подпапках папки
/home/user/debian/ в локальный репозиторий для
lenny, в раздел
main.
Очень просто (в примере скрипт называется
reprepro-add):
Код: Выделить всё
# reprepro-add -C main -D /home/user/debian/ -N lenny -pi