|
|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Aleksey Kotov 2:5020/1042.32 16 Dec 2004 23:54:00 To : Alexander Burylov Subject : Как генерируют список пакаджей? -------------------------------------------------------------------------------- AB> Собственно интересует как генерируют список пакаджей входящих в AB> стандартный (двухдисковый) дистрибутив? AB> Задача впринципе такая: необходимо скачать фрю со всеми необходимыми AB> мне (и не только) пакаджами, т.е сначала надо этот список пакаджей AB> сгенерировать, а потом скормить wget-у. AB> Пока поступаю так: AB> допустим мне нужны Х-ы: AB> cd /usr/ports/x11/xorg AB> make pretty-print-run-depends-list AB> ещё windowmaker: AB> cd /usr/ports/x11-wm/windowmaker AB> make pretty-print-run-depends-list AB> и тд. AB> Вывод make обрабатываю скриптом и скармливаю wget-у. AB> Может есть более рационалные (правильные) варианты? Можно почитать тут вот: http://www.freebsd.org.ua/doc/ru_RU.KOI8-R/articles/releng-packages/article.html Я использую для нарезки таких дисков собственный скрипт. ======CD_Packages.pl=============================================== # # # CD_Packages.pl (c) Jet (Aleksey Kotov) jet<shabaka>list.ru # Language this text: Russian KOI8-R # # Скрипт под Виндовс (хотя и под нативную вероятно пойдет. А фигли ему не пойти то, # все стандартное...) который создает локальную копию паккаджей для записи на CD # ( то что раньше шло на 3-4 диске Фри...) # # ENG: Make CD distributions packages for FreeBSD # # Выкачивается все wget-ом (используется пассивный режим. при желании можно добавить # опции в переменную $wget) с нативного сайта, перед этим проверяется есть ли такой # пакет на диске в каталоге $dirforlocalbasepackages, и если есть - выкачивания не # происходит. Пакет копируется из этого каталога в выходной каталог определенный # переменной $dirforcdpackages # # Если на диске отсутствуют определенные дирректории - они будут созданы автоматически. # # Переменная $list - файл, в котором одна строка - один пакет. # Если строка в этом файле начинается с решетки или с точказапятая ";" - это комменты. # Все пакеты должны начинатся с начала строки и не содержать никаких лишних символов # кроме конца строки. Конец строки должен быть. # # По этому списку и по содержимому файла INDEX скрипт строит список взаимосвязанных # пакетов для выкачивания и скачивает их, после чего создает в выходном каталоге # файл INDEX для этих пакетов. # # Подготовительная работа при использовании скрипта: # найти сервер который отдает пакеты с хорошей скоростью (по умолчанию в скрипте # используется ftp.FreeBSD.org). Прописать полный путь в переменной $url. # Вытащить с этого сайта файл INDEX, положить локально. # Еще можно вытащить из него файл с чексумами и тоже положить локально. # (Файл с чексумами потом нужно будет вручную полочить на отведенное для него место). # Определится с путями к имеющимся на диске ранее выкачанным packages и дирректорией # в которой будет сформирован набор пакетов для записи на CD. # # # !!!Предосторежения: # # Скрипт не проверяет размер того что скачивается и влезет ли оно на жесткий диск. # Предполагается что влезет... # # Скрипт не проверяет размер всего того что накачалось и влезет ли оно на CD-диск. # Предполагается что влезет... # # Скрипт не проверяет корректность того что скачивается. # Предполагается что сайт с которого скачивается - нативный, урл - корректный, и ошибки # скачивания корректируются самим wget-ом. # # Скрипт сам не собирает никаких packages из портов. Писался то исключительно что-бы # можно было записать сидюк с пакетами из под Винды.... # # Скрипт не создает файл cdrom.inf # Обычно этот файл лежит в корне CD диска с пакетами, его содержимое - # одна строка с именем версии дистрибуции. Hапример: # CD_VERSION = 5.3-RELEASE # # Скрипт не проводит разьяснительной работы среди населения. # Предполагается что Вы знаете что такое пакеты (packages), зачем они нужны, # умеете ставить их с CD и понимаете их отличие от портов (ports) # # # # Скрипт проверен на дистрибутиве FreeBSD-i386-5.3-release, Perl 5.6.1, WindowsXP-SP2 # # Если этот скрипт чем-то Вас не устроил - Вы можете прочитать руководство "Подготовка # релизов FreeBSD в части программных пакетов сторонних разработчиков" # http://www.freebsd.org.ua/doc/ru_RU.KOI8-R/articles/releng-packages/article.ht ml # и сделать все самостоятельно. # # версия 0.1 (просто работает) (c) Jet (Aleksey Kotov) 2004 8 декабря ################################################################################ # # Юсе стрикт. Hе редактируйте это строку. use strict; #ENG: DO NOT EDIT THIS STRING # Переменные в которых задются основные параметры необходимые для работы скрипта. #ENG: THIS VARIABLE EDITABLE my $url='ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-5.3-release/All/' ; # откуда льем пакеты. #ENG: full url to package directory my $dirforlocalbasepackages='./localbase/'; # тут лежат локальные копии пакетов, которые # были уже скачаны когда-то, кем-то... #ENG: local path for distrib packages my $dirforcdpackages='./local/'; # отсюда будем строить дерево портов для пакетов #ENG: path for create CD distributions packages my $list='./list.txt'; # список пакетов для скачки #ENG: list packages for download my $index='./index'; # исходный INDEX файл. Обычно лежит в /packages/ # или packages-_HОМЕРВЕРСИИ_-release/ #ENG: native INDEX file ################################################################################ # # Эти переменные редактировать в общем случае не нужно... :) #ENG: DO NOT EDIT THIS VARIABLE IF YOU LACKY DUMMIES my $localoutdir=$dirforcdpackages.'packages/'; # отсюда будем строить дерево портов для пакетов my $localoutdirall=$localoutdir.'All/'; # сюда положим все пакеты что выкачаем my $outindex=$localoutdir.'INDEX'; # новый файл INDEX с выкачаными пакетами my $wget="wget --passive-ftp -P $dirforlocalbasepackages"; # команда для скачивания my $extpackages='.tbz'; # "расширение" скачиваемых packages ################################################################################ # # С переменными разобрались. Дальше - тело скрипта только. if (!(-d $dirforlocalbasepackages)) {mkdir ($dirforlocalbasepackages) or die "not create $dirforlocalbasepackages $!"}; if (!(-d $dirforcdpackages)) {mkdir ($dirforcdpackages) or die "not create $dirforcdpackages $!"}; if (!(-d $localoutdir)) {mkdir ($localoutdir) or die "not create $localoutdir $!"}; if (!(-d $localoutdirall)) {mkdir ($localoutdirall) or die "not create $localoutdirall $!"}; use File::Copy; my %mylistpackages=(); my %listpackages=(); my @outindex=(); #читаем файл-список open (INPUTLIST,"<$list") or die "not read $list $!"; while (my $r=<INPUTLIST>){ chomp($r); $r=~s/[\s*| +]//g; $r=~s/\s*[#|;].*//; if ($r eq ''){next}; $mylistpackages{$r}=1; }; close (INPUTLIST); #читаем файл-INDEX и извлекаем из него нужные строки open (INPUTLIST,"<$index")or die "not read $index $!"; while (my $r=<INPUTLIST>){ chomp($r); $r=~s/[\s*| +]//g; $r=~s/\s*[#|;].*//; if ($r eq ''){next}; my ($package,$path,$path2,$name,$path3,$email,$kategogiya,$zavisimosti,$origurl, $hz1,$hz2 ); ($package,$path,$path2,$name,$path3,$email,$kategogiya,$zavisimosti,$origurl,$hz 1,$hz2)=s plit(/\|/,$r); $listpackages{$package}=$zavisimosti; }; l: my $countpass=0; foreach my $package (keys %mylistpackages){ if ($package=~/^HASH/){next}; foreach my $r(split (/ /,$listpackages{$package})){ if (exists($mylistpackages{$r})){next;}else{$mylistpackages{$r}=1;$countpass++;}; } } if ($countpass>0){goto l;}; # тут составление списка закончилось. в $mylistpackages содержится список # всепх пакетов для исходного списка # выкачиваем их в локальную дирректорию. foreach my $package (keys %mylistpackages){ if ($package=~/^HASH/){next}; if (!( -f $dirforlocalbasepackages.$package.$extpackages)){ #print "\nexist=$package\n"; my $r=`$wget $url$package$extpackages`; print "download=$package\n"; }; if (!( -f $localoutdirall.$package.$extpackages)){ print "copy=$package\n"; copy ($dirforlocalbasepackages.$package.$extpackages, $localoutdirall.$package.$extpackages)or die "nemogu skopirovat $package $!"; }; }; # теперь по списку сохраненных пакетов создаем индекс файл, и структуру каталогов портов # open (INPUTLIST,"<$index")or die "not read $index $!"; open (OUTLIST,">$outindex")or die "not write $outindex $!";; while (my $r=<INPUTLIST>){ chomp($r); $r=~s/[\s*| +]//g; $r=~s/\s*[#|;].*//; if ($r eq ''){next}; my ($package,$path,$path2,$name,$path3,$email,$kategogiya,$zavisimosti,$origurl, $hz1,$hz2 ); ($package,$path,$path2,$name,$path3,$email,$kategogiya,$zavisimosti,$origurl,$hz 1,$hz2)=s plit(/\|/,$r); if (exists($mylistpackages{$package})){ print OUTLIST $r; #создаем структуру портов $path=~s/\/usr\/ports\///; my $dirs=$localoutdir; #print "$dirs"; foreach my $s (split(/\//,$path)){ $dirs=$dirs.$s.'/'; if (-d $dirs) {next;}; mkdir($dirs) or die"fuck dirs!"; }; if (-f $dirs.$package.$extpackages) {next;}; open (ST,">$dirs$package$extpackages")or die"fuck2!"; close (ST); print "file done $dirs$package$extpackages\n"; }; }; ======================================================================== =============list.txt=================================================== # если строка начинается с решетки или с точказапятая - это коменты ; все пакеты должны начинатся с начала строки и не содержать никаких лишних символов # кроме конца строки. в конце списка - конец строки squid-2.5.6_12 apache-1.3.33 apache+mod_ssl-1.3.31+2.8.19 mc-4.6.0_13 bind9-9.3.0 mpd-3.18_2 racoon-20040818a rdesktop-1.3.1_1 samba-3.0.7,1 bash-3.0_5 lynx-ssl-2.8.5 putty-0.55 tinyca-0.6.6 ======================================================================== --- -=*=-_______________________________________________Aleksey Kotov * Origin: (2:5020/1042.32) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/1775541c1e833.html, оценка из 5, голосов 10
|