Отправляет email-рассылки с помощью сервиса Sendsay

KirovLUG: пользователи Linux в Вятке

Чтиво: установка сервера часть 010

Лично я замучался в прошлый раз искать пакетики по дикам. Надо это дело
хоть как-нибудь автоматизировать. Как? Есть идея купить CD-changer на 3
диска ;) - шутка. Ладно, диски мы будем вставлять как обычно руками,
зато производить поиск по этим дискам мы будем зараенее, сохранив
информацию о rpm-пакетах в локальной базе данных. Что, сложно? Нифига -
используем нектороые возможности bash и напишем скриптики. Писать их
будем в mcedit.

$ cd ~/
$ mkdir scripts
$ cd scripts/
$ mcedit rpmcrdb

Скрипт первый:
begin rpmcrdb #!/bin/bash

DBPATH=/var/cache/rpmdb
DBFILES=files.db
DBDEPS=deps.db

if [ ! -d $DBPATH ]; then
mkdir $DBPATH
fi

VOLUME_NAME=$2

create () {
# Текущая директория
curdir=`pwd`
# Список всех rpm пакетов во вложенных каталогах
echo Создание списка файлов
echo -n [
for onep in `find -name *.rpm -print`; do
# Полный путь к файлу относительно тек. директории
# без "." в начале
namefp=`echo "$onep" | awk '{print substr($0,2,length($0)-1)}'`
# Имя rpm-файла без пути
namep=`echo "$onep" | awk 'BEGIN {FS = "/"} {print $NF}'`
# Список предоставляемых файлов
rpm -qlp $onep | \
awk -v begstr=$VOLUME_NAME";"$curdir$namefp";"$namep ' \
BEGIN {FS = "/"} { \
print begstr";"$NF}' >> $DBPATH/$DBFILES
# Список зависимостей
rpm -qRp $onep | \
awk -v pack=$namep '{ \
while (gsub(/ $/,"")!=0); \
v=$0; f=v; t=0; \
if (index(v,"/")!=0) { \
f=split(v,ar,"/"); f=ar[f]} \
else if (index(v,"(")!=0) { \
f=substr(v,1,index(v,"(")-1); \
if (index(v,"=")!=0) t=1} \
else if (index(v," ")!=0) { \
f=substr(v,1,index(v," ")-1); t=1} \
else if (index(v,".")==0) t=1; \
print pack";"$0";"t";"f}' >> $DBPATH/$DBDEPS
echo -n .
done
echo ]
}

clean () {
rm -f $DBPATH/$DBFILES
rm -f $DBPATH/$DBDEPS
rmdir $DBPATH
}

case "$1" in
create)
create
;;
clean)
clean
;;
*)
echo "Usage: $0 {create NAME_DISTRIBUTION|clean}"
esac
end rpmcrdb Этот скрипт создает базу данных, пусть его имеет право запускать и
изменять только root, тогда:
$ sudo chown root:root rpmcrdb
$ sudo chmod 754 rpmcrdb
$ ls -l
Здорово.

Создаем второй скриптик:
$ mcedit rpmf

begin rpmf #!/bin/bash

DBPATH=/var/cache/rpmdb
DBFILES=files.db
DBDEPS=deps.db

FINDFLAG=""

findpack () {
listpack=`grep '^[A-Za-z0-9\_]*;[\.A-Za-z0-9/\-]*;[\.A-Za-z0-9/\-]*'$WHATFIND$DBPATH/$DBFILES
| \
awk 'BEGIN {FS = ";"} {print $1":"$3}'`
t=""
for onepack in $listpack; do
if [ "$t" != "$onepack" ]; then
forprint=`echo $onepack | \
sed 's/'$WHATFIND'/\\\\33[32;1;40m'$WHATFIND'\\\\33[0m/g' |
\
sed 's/:/\\\\33[24G/'`
echo -e $forprint
t=$onepack
fi
done
}

findfile () {
listpack=`grep '^[A-Za-z0-9\_]*;[\.A-Za-z0-9/\-]*;[\.A-Za-z0-9/\-]*;'$WHATFIND$FINDFLAG
$DBPATH/$DBFILES | \
awk 'BEGIN {FS = ";"} {print $1":"$3":"$4}'`
t=""
for onepack in $listpack; do
if [ "$t" != "$onepack" ]; then
forprint=`echo $onepack | \
sed 's/'$WHATFIND'/\\\\33[32;1;40m'$WHATFIND'\\\\33[0m/g' |
\
sed 's/:/\\\\33[21G/' | \
sed 's/:/\\\\33[60G/'`
echo -e $forprint
t=$onepack
fi
done
}

WHATFIND=$2
case "$1" in
p)
findpack
;;
f)
findfile
;;
fn)
FINDFLAG="$"
findfile
;;
*)
echo "Usage $0 {p|f|fn} {NAME_PACKET|NAME_FILE}"
esac
end rpmf Этот скрипт осуществляет поиск по базе данных, его запускать могут все,
а изменять только root:
$ sudo chown root:root rpmcrdb
$ sudo chmod 754 rpmcrdb
$ ls -l

Скопируем эти скрипты в /usr/local/bin (этот путь прописан в переменной
PATH всех пользователей) и создадим базу данных.
$ su
$ cp rpm* /usr/local/bin/
$ ls -l /usr/local/bin/
Вставляем первый дистрибутивный диск и монтируем его:
$ mount /mnt/cdrom
$ cd /mnt/cdrom/ASPLinux/
запускаем скрипт создания базы данных
$ rpmcrdb create ASPLinux9_CD1
После того, как процесс закончился - аналогичное проделываем со вторым
и третьим дисками:
$ cd ../../
$ eject
$ mount /mnt/cdrom
$ cd ./cdrom/ASPLinux/
$ rpmcrdb create ASPLinux9_CD2
$ cd ../../ && eject
$ mount /mnt/cdrom && cd ./cdrom/ASPLinux/ && rpmcrdb create ASPLinux9_CD3
$ cd ../../ && eject
$ exit
Все. База данных создана.

Теперь попробуем воспользоваться ее содержимым. Найдем все пакеты,
каторые в своем имени содержат "bis":
$ rpmf p bis
ASPLinux9_CD1 libvorbis-1.0-7.i386.rpm
ASPLinux9_CD1 vorbis-tools-1.0-3.i386.rpm
ASPLinux9_CD3 bison-1.35-6.i386.rpm
ASPLinux9_CD3 libvorbis-devel-1.0-7.i386.rpm
ASPLinux9_CD3 bison-1.35-6.src.rpm
Здесь показано, что "libvorbis-1.0-7.i386.rpm" находится на первом CD,
a "bison-1.35-6.i386.rpm" - на третьем.

Теперь найдем все пакеты, которые предоставляют файл, в имя которого
входит "yacc":
$ rpmf f yacc
ASPLinux9_CD1 a2ps-4.13b-28.i386.rpm yacc.ssh
ASPLinux9_CD1 vim-common-6.1-29asp.i386.rpm yacc.vim
ASPLinux9_CD2 kdelibs-devel-3.1.1-1.1asp.i386.rpm yacc_8cc-source.html
ASPLinux9_CD2 kdelibs-devel-3.1.1-1.1asp.i386.rpm yacc_8cc_8h-source.html
ASPLinux9_CD2 kdelibs-devel-3.1.1-1.1asp.i386.rpm yacc_8h-source.html
ASPLinux9_CD3 automake15-1.5-6.noarch.rpm yacc.am
ASPLinux9_CD3 automake-1.6.3-5.noarch.rpm yacc.am
ASPLinux9_CD3 byacc-1.9-25.i386.rpm yacc
ASPLinux9_CD3 byacc-1.9-25.i386.rpm yacc.1.gz
ASPLinux9_CD3 fpc-1.0.6-1asp.i386.rpm yacclib.o
ASPLinux9_CD3 fpc-1.0.6-1asp.i386.rpm yacclib.ppu
ASPLinux9_CD3 ruby-docs-1.6.8-5.i386.rpm yacc.html
ASPLinux9_CD3 byacc-1.9-25.src.rpm yacc-1.9-fbsd.tar.gz
И последнее, найдем все пакеты, которые предоставляют файл, в имя
которого целиком совпадает с "curses.h":
$ rpmf fn curses.h
ASPLinux9_CD3 ncurses-devel-5.3-4.i386.rpm curses.h
Надеюсь, с выводом все на экран все понятно. Теперь, можно смело
монтировать именно те CD, на котором находится нужный пакет.

C уважением, Kolotov Alexandr (aka mr. Эбола)
отвечать: myscri***@e*****.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.kirovlug-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.linux.kirovlug&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Kolotov Alexandr (#2829)