Ключевые слова:linux, suse, cdrom, apt, (найти похожие документы)
From: Алексей Барабанов <alekseybb@mail.ru.>
Newsgroups: http://www.barabanov.ru
Date: Mon, 20 Apr 2005 18:21:07 +0000 (UTC)
Subject: Модификация дистрибутивных дисков SuSE.
Оригинал: http://www.barabanov.ru/arts/how-to-modify-suse-dvd.html
Эта тема частично была затронута в размещенном здесь же "Кратком
руководстве по созданию apt репозитория"
(http://www.barabanov.ru/arts/how-to-prepare-suse-apt-cd.html).
Но поскольку этим не исчерпываются возможности утилиты
(http://www.barabanov.ru/proj/rebuildsusedvd) для модификации дисков SuSE,
то в настоящей статье этот вопрос будет описан более полно.
Примечание. В примерах используются версии SuSE и rebuildsusedvd
актуальные на дату написания.
I. Утилита rebuildsusedvd и ее возможности.
Прежде всего, rebuildsusedvd не является гарантированным
проприетарным средством решения всех проблем. Программа
rebuildsusedvd была сделана для решения собственных проблем
автора. Поэтому пользоваться ею следует осмотрительно и
непритязательно.
Для работы программы требуется установить в систему такие утилиты,
как mkisofs, autoyast2-utils, apt4rpm и все связанные с ними
зависимостями. Если чего-то недостает, то это можно поискать через
RPM Search (http://rpm.pbone.net/).
Программа rebuildsusedvd, будучи запущенной без каких-либо
аргументов, выведет подсказку о том, в каком формате она ожидает
опции и аргументы.
# ./rebuildsusedvd
Target ISO must applayed. Abort
Rebuild SuSE DVD, ver. 1.0.0
Usage: rebuildsusedvd [options] target.iso
Options:
--iso <filename>
Use filename as original iso image.
--source <dirname>
Use dirname as root of iso repository.
--tmp <dirname>
Use dirname for temporary files. Default /tmp.
--mount <dirname>
Use dirname as mount point. Default /mnt.
--dev <devname>
Use devname as cd-drive device. Default /dev/sr0
--comp <compname>
Use as component base name for repository. Default original
--updates <dirlist>
Made autoupdate from list of directories where placed lates packages.
--noclean
Dont remove temporary files
--noaptate
Dont create APT package index
--nofresh
Dont create YaST package index
--compile
Make command list insted executing
--pause
Make pause after copying before building
--debug
Make verbose output
--boot
Force make boot record in iso
Фактически требуется указание только одного обязательного
аргумента target.iso - имени файла, в котором будет собран образ
нового дистрибутивного диска. Понятно, что запуск
rebuildsusedvd без этого имени, не имеет ни малейшего смысла.
Общая последовательность действий, выполняемых rebuildsusedvd,
состоит из следующих шагов, часть из которых может быть
блокирована или изменена опциями, заданными в командной строке :
+ чтение меток исходного диска ;
+ копирование содержимого диска во временную директорию ;
+ обновление состава пакетов на более новые ;
+ возможная пауза ;
+ построение индексов YaST ;
+ построение репозитория apt ;
+ создание имиджа нового диска.
Для того, чтобы получить более полное представление о возможностях
утилиты rebuildsusedvd нужно рассмотреть подробнее опции
управления работой программы.
1. Задание источника "--iso <filename>" и "--dev <devname>".
Указанные опции позволяют задать источник оригинального диска
SuSE. Соответственно это может быть или заранее записанный
файл с образом, или устройство, в которое будет помещен диск
во время работы. Если ни одна из перечисленных опций не
указана, то по умолчанию будет принято, что программа
rebuildsusedvd будет работать с диском, размещенным в
/dev/sr0.
2. Указание рабочего пространства "--mount <dirname>" и "--tmp
<dirname>".
Эти опции указывают соответственно точку монтирования
источника оригинального диска и место размещения временной
директории для построения нового диска. Если не задана точка
монтирования, то используется /mnt, что очевидно. Но
размещение временной директории рекомендуется указывать
специально, т.к. не на всякой системе найдется 4G в /tmp,
который используется в дефолтной варианте.
3. Сборка диска из iso-репозитория "--source <dirname>".
Будет произведено построение iso-образа с использованием
указанного корня iso-репозитория. Другими словами, значение
этой опции принимается в качестве уже подготовленной
временной директории, которая после построения диска конечно
же не удаляется. Эта опция используется в процессе переноса
дистрибутива с набора CD на DVD.
4. Режим отладки "--debug" и "--noclean".
Первое, очевидно, увеличивает информативность выдаваемых
логов, после чего они свободно достигают 900К на стандартном
дистрибутивном dvd. Второе блокирует удаление временной
директории. Все вместе это позволяет найти причину, если
монолитное исполнение rebuildsusedvd прерывается по
ошибке.
5. Режим компиляции "--compile" и "--boot".
Эти опции позволяют заменить реальное выполнение генерацией
команд, которые, будучи сохраненными в файле, далее могут
использоваться для создания собственных сценариев модификации
дисков. Вторая опция необходима потому, что в режиме
компиляции rebuildsusedvd не может проверить, что
создаваемый диск будет загружаемым, и ее применение включает
принудительное построение загружаемого диска.
6. Режим паузы "--pause".
При задании опции паузы программа rebuildsusedvd после
копирования всех файлов с исходного диска в новый корень
остановит свою работу и продолжит только после получения с
клавиатуры любой последовательности символов, завершенной
Enter. Такая пауза позволяет проконтролировать работу
программы и произвести дополнительные не предусмотренные
возможностями этой несложной программы операции.
7. Задание префикса компонентов apt "--comp <compname>".
Позволяет указать базовый префикс для образования названий
компонет репозитория apt. Значение по-умолчанию original.
Соответственно, если префикс не изменять, то будут созданы
компоненты original-i586 и original-noarch. Поскольку
темплейт для генерации репозитория apt создается до
наступления паузы, то ошибочно сформированные или неправильно
заданные названия компонет репозитория можно поправить
вручную.
8. Управление автоматическим апдейтом "--updates <dirlist>".
В качестве источника апдейтов нужно указывать одну или
несколько директорий. В последнем случае нужно их перечислить
в порядке обработки, разделяя пробелами, и заключить в
двойные кавычки.
Директории по указанному пути должны содержать дерево пакетов
в формате принятом в SuSE. Фактически структура вложенных
директорий по этому пути должна повторять структуру
дистрибутивного диска, начиная с директории suse. Например,
если в директорию ~/suseftp были скопированы все необходимые
поддиректории с апдейтами для SuSE 9.1, то полностью путь до
точки, которую надо указать в рассматриваемой опции, будет
~/suseftp/suse/i386/update/9.1/rpm. Так, что внутри указанной
директории располагаются те же поддиректории i586 и noarch,
как и внутри директории suse дистрибутивного диска. Тогда
утилита rebuildsusedvd автоматически просканирует
содержимое указанной директории и сравнит найденные там
пакеты по времени создания с аналогичными в корне
создаваемого диска. При нахождении в апдейтах более свежей
версии новый пакет будет добавлен к диску взамен устаревшего.
Если в оригинале нет соответствующих пакетов, то они будут
просто добавлены. После перегенерации индексов пакетов YaST
"увидит" как обновленные, так и вновь добавленные пакеты.
9. Запрет перегенерации индексов YaST "--nofresh".
Если над содержимым скопированного корня исходного диска не
производится никаких действий по изменению состава пакетов,
например во время паузы, вручную или путем добавления
автоматических апдейтов, то запрет перегенерации индексов
YaST позволит сократить время работы. При задании режима
--updates построение индексов происходит принудительно.
10. Запрет создания репозитория apt "--noaptate".
Действие этой опции очевидно.
Если после этого остались какие-то неясности, то изучение
конкретных примеров использования, описанных далее, должно их
развеять. Хорошим ходом также будет проверка работы программы в
режиме компиляции, что даст представление о том, как
интерпретируются опции в разных случаях. Единственная опция,
которая не отрабатывается в режиме компиляции, это автоматический
апдейт пакетов диска.
II. Примеры использования rebuildsusedvd.
1. Пересборка дистрибутивного диска SuSE с автоматическим
обновлением версий пакетов и построением на нем репозитория
apt.
Можно сказать, что для решения этой задачи будут использованы
все заложенные в rebuildsusedvd возможности. Здесь будет
сделано то, что описано в размещенном здесь же "Кратком
руководстве по созданию apt репозитория", но в автоматическом
режиме и с дополнительным обновлением версий пакетов
дистрибутивного диска.
Для этого в командной строке укажем, где размещать временные
файлы, откуда считывать образ исходного диска, и где
создавать новый. Особое внимание хочется обратить на путь до
предварительно загруженных с ftp апдейтов. Для примера
приведем способ их загрузки вместе с командой построения
нового диска.
# mkdir -p /updates/suse91/rpm
# cd /updates/suse91/rpm
# wget -r -X "*src" -nH --cut-dirs=6 \
ftp://ftp.suse.com/pub/suse/i386/update/9.1/rpm/
# ~/rebuildsusedvd --pause \
--tmp /bigtmp \
--iso /iso-heap/suse91prof32.iso \
--updates /updates/suse91/rpm \
/iso-heap/s91.iso
2. Получение компилянта для создания собственного сценария.
Здесь повторим решение предыдущей задачи, но только уберем
автоапдет, так как он все равно не попадет в полученный
скрипт, и добавим принудительное построение загружаемого
диска. Результат сохраним в файле mksuseaptdvd, который
будет использован далее, как основа для постоения других
скриптов. На приведенном ниже листинге длинные командные
строки специально отредактированы для удобства чтения.
# ~/rebuildsusedvd --pause --compile --boot \
--tmp /bigtmp \
--iso /iso-heap/suse91prof32.iso \
/iso-heap/s91.iso >mksuseaptdvd
# chmod +x mksuseaptdvd
cat mksuseaptdvd
#!/bin/sh
# Rebuild SuSE DVD, ver. 0.7.1
# compiled at Sat Jun 5 22:00:35 MSD 2004
#-----------------------
WTMP="/bigtmp/rebuildsusedvd-3879"
OSRC="-o loop /iso-heap/suse91prof32.iso"
TISO="/iso-heap/s91.iso"
HOME=`pwd`
/bin/mount -t iso9660 $OSRC /mnt
/bin/mkdir -p $WTMP
cd /mnt
/bin/cp -ax . $WTMP
cd $HOME
/bin/umount /mnt
/bin/mkdir -p $WTMP/apt
cat >>$WTMP/apt/aptate.conf <<EOT
<?xml version='1.0' encoding="iso-8859-1"?>
<!DOCTYPE opt SYSTEM "/usr/share/apt4rpm/aptate.dtd">
<opt security-component="no" flat="yes" bloat="yes">
<topdir>$WTMP</topdir>
<distribution id="SUSE-original" structure="2">
<name>SUSE</name>
<version>9.1</version>
<architecture>i586</architecture>
<component active="yes">
<name>original-i586</name>
<url>suse/i586</url>
</component>
<component active="yes">
<name>original-noarch</name>
<url>suse/noarch</url>
</component>
</distribution>
</opt>
EOT
/bin/echo -e ISO Root ready for modification. Press "Enter" for continue.
read j
cd $WTMP/suse
/usr/bin/create_package_descr -l czech \
-l english \
-l french \
-l german \
-l italian \
-l spanish \
-l hungarian
cd $HOME
/usr/bin/aptate --quiet qq --config-file $WTMP/apt/aptate.conf
/usr/bin/mkisofs -A "SUSE-LINUX-DVD-i386-9.1#0" \
-V "SU910.001" \
-P "SuSE Linux AG, suse@suse.de" \
-p "CD-Team, http://www.suse.de/feedback" \
-sysid "LINUX" \
-quiet -r -J -pad -allow-lowercase \
-allow-multidot -iso-level 3 -o $TISO \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-b boot/loader/isolinux.bin -c boot/boot.catalog \
-hide boot/boot.catalog -hide-joliet boot/boot.catalog \
$WTMP
/bin/echo Cleaning up.
/bin/rm -rf $WTMP
/bin/echo Done.
Важно обратить внимание на следующее :
o в опциях create_package_descr использованы только те
языки, которые поддерживаются autoyast2-utils из SuSE 9.0 ;
o в аргументы mkisofs прописаны реальные поля из
дистрибутивного DVD.
3. Построение дистрибутивного диска SuSE на основе ftp
дистрибутива.
Для этого сначала надо позаботиться о загрузке дистрибутива с
ftp. Например так, как это показано далее :
# mkdir -p /distr/suse91
# cd /distr/suse91
# wget -r -X "*src" -nH --cut-dirs=4 \
ftp://ftp.suse.com/pub/suse/i386/9.1/
В процессе загрузки с дистрибутивного диска участвуют только
файлы, размещенные в директории boot/loader . Замена этих
файлов на дистрибутивном диске теми, что выкачаны с ftp,
ничуть не ухудшила процесса установки с полученного имиджа.
Значит, для воссоздания аналога дистрибутивного диска SuSE
достаточно из полученного ранее mksuseaptdvd
(http://www.barabanov.ru/arts/mksuseaptdvd) удалить фазу
копирования с оригинального диска во временную директорию,
примерно все то, что проделывается до паузы. Для простоты
уберем из скрипта построение apt репозитория, но оставим
обновление индексов YaST для того, чтобы иметь возможность
периодически обновлять версии пакетов на полученном корне
дистрибутивного диска. В результате получится совсем
простенькая програмка mksuseftp2dvd, листинг которой
приведен далее.
#!/bin/sh
# Rebuild SuSE DVD, ver. 0.7.1
# compiled at Sat Jun 5 22:00:35 MSD 2004
#-----------------------
WTMP="/distr/suse91"
TISO="/iso-heap/s91.iso"
HOME=`pwd`
cd $WTMP/suse
/usr/bin/create_package_descr -l czech \
-l english \
-l french \
-l german \
-l italian \
-l spanish \
-l hungarian
cd $HOME
/usr/bin/mkisofs -A "SUSE-LINUX-DVD-i386-9.1#0" \
-V "SU910.001" \
-P "SuSE Linux AG, suse@suse.de" \
-p "CD-Team, http://www.suse.de/feedback" \
-sysid "LINUX" \
-quiet -r -J -pad -allow-lowercase \
-allow-multidot -iso-level 3 -o $TISO \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-b boot/loader/isolinux.bin -c boot/boot.catalog \
-hide boot/boot.catalog -hide-joliet boot/boot.catalog \
$WTMP
/bin/echo Done.
4. Перенос дистрибутива SuSE c CD на DVD с автоматическим
обновлением версий пакетов.
Здесь не будем ничего компилировать, а всю работу проведем в
максимально деловом режиме, чтобы показать простоту этого
процесса.
Итак, создаем дистрибутивный DVD :
o Переносим все содержимое дистрибутивных CD в заранее
выделенное место, например в /heap/suse/suse92.
Требуемый объем немного превышает 3 Гбайта. Перенос
файлов следует проводить в режиме overwrite.
o Скачиваем все актуальные на настоящую дату апдейты с
официального ftp SuSE или с любого достоверного зеркала
в директорию, например, /heap/suse/updates так, что
реальные апдейты будут размещены в
/heap/suse/updates/rpm/i586... и т.д.
o Выбираем место для размещения имиджа DVD. Рекомендуется
выделить не менее 4 Гбайт. Пусть это будет /alternatives
o Производим построение диска одной командой
# ./rebuildsusedvd --noaptate --source /heap/suse/suse92 \
--updates /heap/suse/udates/rpm \
/alternatives/suse92prof-dvd.iso
Если добавить опцию --compile и перенаправить вывод в файл,
то можно получить последовательность команд, которые будут
актуально выполнятся в процессе построения DVD. Это позволить
проверить правильность задания параметров и решить возможные
проблемы.
Версия 1.1 от 2004.12.03
Исходные текст утилиты rebuildsusedvd:
#!/bin/sh
#
# Rebuild SuSE DVD, ver. 1.1.1
#
# May-Dec 2004, Aleksey Barabanov <alekseybb@mail.ru.>
# Jan 2005, fix relative path to directories
# Mar 2005, smal fix, thnx Yashar Aslanov <yashar_2003@mail.ru.>
#
# todo
# 1. ImageMagic++ problem ;)
#
# ##################################################### setup
VER="ver. 1.1.1"
PGM=`basename $0`
DEBUG=""
NOCLEAN=""
NOAPTATE=""
NOFRESH=""
DRYRUN=""
PAUSE=""
BOOTABLE=""
# updates dir
UPDATES=""
# linuxrc info file
INFOFILE=""
# working dir
TMP="/tmp"
# mount point
DMNT=/mnt
# devices
CDDEV="/dev/sr0"
NULL=/dev/null
ZERO=/dev/zero
# misc
HOME=`pwd`
# ##################################################### get options
CDAPP="SuSE-Linux-DVD-9.2#0"
CDVOL="SU920.001"
#CDPUB="SuSE DVD remake"
CDPUB="SuSE Linux AG, suse@suse.de"
#CDPRE="RebuildSuSEDVD 1.1.1"
CDPRE="CD-Team, http://www.suse.de/feedback"
CDSYS="LINUX"
CTYME=`date +"%Y%m%d%H%M%S"`
usage()
{
cat <<EOT
Rebuild SuSE DVD, $VER
Usage: $PGM [options] target.iso
Options:
--boot
Force make boot record in iso.
--cdapp <application_id>
ISO header application ID
--cdvol <volume_id>
ISO header volume ID
--cdpub <publicher_id>
ISO header publisher ID
--cdpre <preparer_id>
ISO header preparer ID
--comp <compname>
Use as component base name for repository. Default original.
--compile
Make command list insted executing.
--debug
Make verbose output.
--dev <devname>
Use devname as cd-drive device. Default /dev/sr0.
--iso <filename>
Use filename as original iso image.
--linuxrc <infofile>
Add <infofile> to loadable initrd.
--mount <dirname>
Use dirname as mount point. Default /mnt.
--noaptate
Dont create APT package index.
--noclean
Dont remove temporary files.
--nofresh
Dont recreate SuSE DVD indexes.
--pause
Make pause after copying before building.
--source <dirname>
Use dirname as root of iso repository.
--tmp <dirname>
Use dirname for temporary files. Default /tmp.
--updates <dirlist>
Made autoupdate from list of directories where placed lates packages.
EOT
}
#
OISO=""
TREP=""
TISO=""
CNAME="original"
DVER="9.2"
DNAM="SUSE"
while [ $# -gt 0 ] ; do
case $1 in
--noclean)
NOCLEAN="1"
;;
--noaptate)
NOAPTATE="1"
;;
--nofresh)
NOFRESH="1"
;;
--compile)
DRYRUN="1"
;;
--pause)
PAUSE="1"
;;
--debug)
DEBUG="1"
;;
--boot)
BOOTABLE="1"
;;
--iso)
shift
OISO=$1
;;
--source)
shift
TREP=$1
;;
--tmp)
shift
TMP=$1
;;
--mount)
shift
DMNT=$1
;;
--dev)
shift
CDDEV=$1
;;
--comp)
shift
CNAME=$1
;;
--updates)
shift
UPDATES=$1
;;
--linuxrc)
shift
INFOFILE=$1
;;
--cdapp)
shift
CDAPP=$1
;;
--cdvol)
shift
CDVOL=$1
;;
--cdpub)
shift
CDPUB=$1
;;
--cdpre)
shift
CDPRE=$1
;;
--*)
echo -e "Bad option \"$1\"."
usage
exit 1
;;
-*)
echo -e "Bad option \"$1\"."
usage
exit 1
;;
*)
TISO=$1
;;
esac
shift
done
WTMP=$TMP/$PGM-$$
OINFO=$TMP/$PGM-info-$$
ITMP=$TMP/$PGM-initrd-$$
[ -z "$TREP" ] || {
WTMP="$TREP"
[ -z "$OISO" ] || {
echo -e "You must use ISO or Repository. Abort"
usage
exit 1
}
}
[ -n "$DEBUG" ] && [ -z "$DRYRUN" ] && {
echo -en "Tmp\t\t" ; echo "==$TMP=="
echo -en "ISO\t\t" ; echo "==$OISO=="
echo -en "CDDEV\t\t" ; echo "==$CDDEV=="
echo -en "DMNT\t\t" ; echo "==$DMNT=="
echo -en "Target\t\t" ; echo "==$TISO=="
echo -en "Component name\t" ; echo "==$CNAME=="
echo -en "Updates\t\t" ; echo "==$UPDATES=="
}
[ "$TISO" == "" ] && {
echo -e "Target ISO must applayed. Abort"
usage
exit 1
}
# off nofresh if use autoupdates
[ -n "$UPDATES" ] && NOFRESH=""
# set noclean if use "source"
[ -n "$TREP" ] && NOCLEAN="1"
# ##################################################### setup environment
# utilities
CD=cd
READ=read
ERRMES=""
DD=`which dd` || ERRMES=dd
GREP=`which grep` || ERRMES=grep
CAT=`which cat` || ERRMES=cat
RM=`which rm` || ERRMES=rm
MKDIR=`which mkdir` || ERRMES=mkdir
ECHO=`which echo` || ERRMES=echo
MOUNT=`which mount` || ERRMES=mount
UMOUNT=`which umount` || ERRMES=umount
KILL=`which kill` || ERRMES=kill
CP=`which cp` || ERRMES=cp
FIND=`which find` || ERRMES=find
LN=`which ln` || ERRMES=ln
AWK=`which awk` || ERRMES=awk
SED=`which sed` || ERRMES=sed
STAT=`which stat` || ERRMES=stat
MKISO=`which mkisofs` || ERRMES=mkisofs
MD5=`which md5sum` || ERRMES=md5sum
LS=`which ls` || ERRMES=ls
GZIP=`which gzip` || ERRMES=gzip
ZCAT=`which zcat` || ERRMES=zcat
FILE=`which file` || ERRMES=file
MV=`which mv` || ERRMES=mv
CPDESCR=`which create_package_descr` || ERRMES=create_package_descr
# only for apt-disk
APTATE=`which aptate` || {
[ "$NOAPTATE" != "" ] && ERRMES=aptate
}
if [ "$ERRMES" != "" ]; then
echo -e "Not found \"$ERRMES\". Abort"
exit 1
fi
oWTMP=$WTMP
oHOME=$HOME
oUPDATES=$UPDATES
oFIND=$FIND
oCD=$CD
oCAT=$CAT
oSED=$SED
oAWK=$AWK
oECHO=$ECHO
oSTAT=$STAT
[ -z "$TREP" ] && {
# ##################################################### get vars from original iso
# choose original source
i="$CDDEV" ; [ -n "$OISO" ] && i="$OISO"
# Read the entire header - actually sector 16 of the disc (2K sectors)
# All character codes in the "control" region (0-31 decimal) are folded
# into the character '.' - these control codes seem to upset bash's
# variable sub-string functions (${var:start:length}) quite badly )-:
$DD if=$i bs=1 skip=32768 count=2048 >$OINFO 2>/dev/null
if [ $? -ne 0 ] ; then
$RM -rf $OINFO
$ECHO "Error: unable to open \"$i\". Abort"
exit 1
fi
data=`$CAT $OINFO |tr '[\\000-\\037]' '.*'`
$RM -rf $OINFO
# Define some useful functions for prettifying the output
tidy_print()
{
# Really cheap way of folding whitespace
echo $*
}
[ "${data:1:5}" == "CD001" ] && {
CDVOL=`tidy_print ${data:40:32}`
CDPUB=`tidy_print ${data:318:128}`
CDPRE=`tidy_print ${data:446:128}`
CDAPP=`tidy_print ${data:574:128}`
CDSYS=`tidy_print ${data:8:32}`
}
[ -n "$DEBUG" ] && [ -z "$DRYRUN" ] && {
echo -en "SysID\t\t" ; echo "==$CDSYS=="
echo -en "VolNAME\t\t" ; echo "==$CDVOL=="
echo -en "PublisherID\t" ; echo "==$CDPUB=="
echo -en "PreparerID\t" ; echo "==$CDPRE=="
echo -en "ApplicationID\t" ; echo "==$CDAPP=="
}
}
# ##################################################### setup compiler
do_cat()
{
T=$1
[ ! -t 0 ] && {
if [ -n "$DRYRUN" ] ; then
## compile
echo "cat >>$T <<EOT"
cat
echo EOT
else
## run
cat >>$T
fi
}
}
SCAT=do_cat
# choose original source
OSRC="$CDDEV" ; [ -n "$OISO" ] && OSRC="-o loop $OISO"
#
[ -n "$DRYRUN" ] && {
echo -e "#!/bin/sh\n# Rebuild SuSE DVD, $VER"
echo -e "# compiled at `date`\n#-----------------------"
echo -e "WTMP=\"$WTMP\""
WTMP="\$WTMP"
echo -e "ITMP=\"$ITMP\""
ITMP="\$ITMP"
echo -e "OSRC=\"$OSRC\""
OSRC="\$OSRC"
echo -e "TISO=\"$TISO\""
TISO="\$TISO"
# [ -z "$UPDATES" ] || {
# echo -e "UPDATES=\"$UPDATES\""
# UPDATES="\$UPDATES"
# }
[ -n "$INFOFILE" ] && {
echo -e "INFOFILE=\"$INFOFILE\""
INFOFILE="\$INFOFILE"
}
echo -e "HOME=\`pwd\`"
HOME="\$HOME"
DD="echo $DD"
LO="echo $LO"
MKDIR="echo $MKDIR"
MOUNT="echo $MOUNT"
CP="echo $CP"
CD="echo $CD"
ECHO="echo -e $ECHO"
CAT="echo $CAT"
UMOUNT="echo $UMOUNT"
MKISO="echo -e $MKISO"
RM="echo $RM"
AWK="echo $AWK"
LN="echo $LN"
APTATE="echo $APTATE"
READ="echo $READ"
CPDESCR="echo $CPDESCR"
FIND="echo $FIND"
LS="echo $LS"
GZIP="echo $GZIP"
MV="echo $MV"
MD5="echo $MD5"
}
# ##################################################### some magic passes
# cleaning up temporary resources
cleanup()
{
[ -n "$NOCLEAN" ] || {
$ECHO "Cleaning up."
$MOUNT | $GREP "on $DMNT" >$NULL && { $ECHO "Unmount image"; $UMOUNT $DMNT; }
[ -z "$TREP" ] && {
( [ -n "$DRYRUN" ] || [ -d $WTMP ] ) && $RM -rf $WTMP
}
( [ -n "$DRYRUN" ] || [ -d $ITMP ] ) && $RM -rf $ITMP
}
}
# make trap for clean
after_error()
{
cleanup
$ECHO "Abort."
exit 1
}
[ -n "$DRYRUN" ] || trap after_error 1 2 3 15
if [ -z "$TREP" ] ; then
# ##################################################### copy cd files
[ -n "$DEBUG" ] && [ -z "$DRYRUN" ] && $ECHO "=======copy cd files========"
#
$MOUNT -t iso9660 $OSRC $DMNT || { echo "Error: cant mount \"$i\""; $KILL -INT $$;}
[ -d $WTMP ] && $RM -rf $WTMP
$MKDIR -p $WTMP || { $ECHO -e "Error: cant make \"$WTMP\""; $KILL -INT $$;}
$CD $HOME
$CD $DMNT
i="" ; [ -n "$DEBUG" ] && i="v"
$CP -ax$i . $WTMP || { $ECHO -e "Error: cant copy files"; $KILL -INT $$;}
$CD $HOME
$UMOUNT $DMNT
else
# ##################################################### some fixes
$oCD $oHOME
for i in 2 3 4 5 ; do
[ -d $oWTMP/media.$i ] && $RM -rf $WTMP/media.$i
done
$oCD $oHOME
[ -r $oWTMP/media.1/media ] && {
L1=`$oCAT $oWTMP/media.1/media | $oSED -n '1p'`
L2=`$oCAT $oWTMP/media.1/media | $oSED -n '2p'`
if [ -z "$DRYRUN" ] ; then
$ECHO "$L1" >$WTMP/media.1/media
$ECHO "$L2" >>$WTMP/media.1/media
$ECHO "1" >>$WTMP/media.1/media
else
$ECHO "$L1" \>$WTMP/media.1/media
$ECHO "$L2" \>\>$WTMP/media.1/media
$ECHO "1" \>\>$WTMP/media.1/media
fi
}
fi
# force suse/i386
$oCD $oHOME
[ -d $oWTMP/suse/i386 ] || {
$CD $HOME
$MKDIR -p $WTMP/suse/i386 || { $ECHO -e "Error: cant make \"$WTMP/suse/i386\""; $KILL -INT $$;}
}
# force media.1
$oCD $oHOME
[ -d $oWTMP/media.1 ] || {
$CD $HOME
$MKDIR -p $WTMP/media.1 || { $ECHO -e "Error: cant make \"$WTMP/media.1\""; $KILL -INT $$;}
}
# force media.1/media
$oCD $oHOME
[ -r $oWTMP/media.1/media ] || {
$CD $HOME
if [ -z "$DRYRUN" ] ; then
$ECHO "$CDPUB" > $WTMP/media.1/media || { $ECHO -e "Error: cant write to \"$WTMP/media.1/media\""; $KILL -INT $$;}
$ECHO "$CTYME" >> $WTMP/media.1/media || { $ECHO -e "Error: cant write to \"$WTMP/media.1/media\""; $KILL -INT $$;}
$ECHO "1" >> $WTMP/media.1/media || { $ECHO -e "Error: cant write to \"$WTMP/media.1/media\""; $KILL -INT $$;}
else
$ECHO "\"$CDPUB\"" \> $WTMP/media.1/media
$ECHO "\"$CTYME\"" \>\> $WTMP/media.1/media
$ECHO "\"1\"" \>\> $WTMP/media.1/media
fi
}
# force media.1/products
$oCD $oHOME
[ -r $oWTMP/media.1/products ] || {
$CD $HOME
if [ -z "$DRYRUN" ] ; then
$ECHO "/ $CDAPP" > $WTMP/media.1/products || { $ECHO -e "Error: cant write to \"$WTMP/media.1/media\""; $KILL -INT $$;}
else
$ECHO "\"/ $CDAPP\"" \> $WTMP/media.1/products
fi
}
# ##################################################### setup repository
# suse specific tuning
[ -z "$DRYRUN" ] && [ -r $WTMP/content ] && {
DVER=`$CAT $WTMP/content | $GREP -i ^version | $AWK '{print $2}'`
DNAM=`$CAT $WTMP/content | $GREP -i ^product | $AWK '{print $2}'`
}
[ -z "$NOAPTATE" ] && {
[ -n "$DEBUG" ] && [ -z "$DRYRUN" ] && $ECHO "=======setup repository========"
# make apt configuration
$MKDIR -p $WTMP/apt || { $ECHO -e "Error: cant make \"$WTMP/apt\""; $KILL -INT $$;}
$SCAT $WTMP/apt/aptate.conf <<EOT
<?xml version='1.0' encoding="iso-8859-1"?>
<!DOCTYPE opt SYSTEM "/usr/share/apt4rpm/aptate.dtd">
<opt security-component="no" flat="yes" bloat="yes">
<topdir>$WTMP</topdir>
<distribution id="$DNAM-$CNAME" structure="2">
<name>$DNAM</name>
<version>$DVER</version>
<architecture>i586</architecture>
<component active="yes">
<name>$CNAME-i586</name>
<url>suse/i586</url>
</component>
<component active="yes">
<name>$CNAME-noarch</name>
<url>suse/noarch</url>
</component>
</distribution>
</opt>
EOT
}
# ##################################################### autoupdates
[ -z "$oUPDATES" ] || {
[ -n "$DEBUG" ] && $ECHO "=======autoupdates========"
v="" ; [ -n "$DEBUG" ] && v="-v"
for UPDATES in $oUPDATES ; do
##################################################### updatelist
ooUPDATES=$UPDATES
[ -n "$DRYRUN" ] && {
[ -z "$UPDATES" ] || {
echo -e "UPDATES=\"$UPDATES\""
UPDATES="\$UPDATES"
}
}
# updates list, full path $ooUPDATES/$i
## LUPD=`$oFIND $ooUPDATES -regex ".*\(noarch\|i586\)\.rpm$" -printf "%P\n"`
LUPD=`$oFIND $ooUPDATES -regex ".*\(noarch\|i586\|i386\)\.rpm$" -printf "%P\n"`
for i in $LUPD ; do
# get leader part of basename
bi=`basename $i | $oAWK -F. '{print $1}'`
# find package with equal leader part, full path $oWTMP/suse/$oi
## cbi="$oFIND $oWTMP/suse -regex \".*/$bi.*\(noarch\|i586\)\.rpm$\" -printf \"%P\\n\""
cbi="$oFIND $oWTMP/suse -regex \".*/$bi.[a-z0-9A-Z].*\(noarch\|i586\|i386\)\.rpm$\" -printf \"%P\\n\""
oi=`eval $cbi`
# and get first
oi1=`$oECHO "$oi" | $oAWK '{print $1}'`
if [ "$oi1" != "" ] ; then
# compare package age
if [ "`$oSTAT -c "%Y" $ooUPDATES/$i`" -gt "`$oSTAT -c "%Y" $oWTMP/suse/$oi1`" ] ; then
# copy update
if [ -z "$DRYRUN" ] ; then
$CP $v $ooUPDATES/$i $oWTMP/suse/`dirname $oi` || { $ECHO -e "Error: cant copy \"$i\""; $KILL -INT $$;}
$RM $v -f $oWTMP/suse/$oi || { $ECHO -e "Error: cant erase \"$oi\""; $KILL -INT $$;}
else
$CP $v $UPDATES/$i $WTMP/suse/`dirname $oi`
$RM $v -f $WTMP/suse/$oi
fi
fi
else
if [ -z "$DRYRUN" ] ; then
$CP $v $ooUPDATES/$i $oWTMP/suse/`dirname $i` || { $ECHO -e "Error: cant copy \"$i\""; $KILL -INT $$;}
else
$CP $v $UPDATES/$i $WTMP/suse/`dirname $i`
fi
fi
done
#####################################################
done
} # UPDATES
# ##################################################### unzip initrd, add info
FST=""
[ -n "$INFOFILE" ] && {
[ -n "$DEBUG" ] && [ -z "$DRYRUN" ] && $ECHO "=======unzip initrd, add info========"
$MKDIR -p $ITMP || { $ECHO -e "Error: cant make \"$ITMP\"" ; $KILL -INT $$; }
if [ -n "$DRYRUN" ] ; then
echo "$ZCAT $WTMP/boot/loader/initrd >$ITMP/initrd"
else
$ZCAT $WTMP/boot/loader/initrd >$ITMP/initrd || { $ECHO "Error: cant unzip initrd" ; $KILL -INT $$; }
fi
if [ -z "$DRYRUN" ] ; then
i=`$FILE $ITMP/initrd`
FST=""
[ -n "`$ECHO "$i" | $GREP Minix`" ] && FST="minix"
[ -n "`$ECHO "$i" | $GREP ext2`" ] && FST="ext2"
else
# default Minix
FST="minix"
fi
[ -n $FST ] && {
$MOUNT -o loop,rw -t $FST $ITMP/initrd $DMNT || { $ECHO "Error: cant moun initrd" ; $KILL -INT $$; }
$CP $INFOFILE $DMNT/info || { $ECHO -e "Error: cant copy \"$INFOFILE\"" ; $KILL -INT $$; }
}
}
# ##################################################### pause
[ -n "$PAUSE" ] && {
$ECHO -e "ISO Root ready for modification. Press \"Enter\" for continue."
$READ j
}
# ##################################################### zip initrd
[ -n "$INFOFILE" ] && {
[ -n "$DEBUG" ] && [ -z "$DRYRUN" ] && $ECHO "=======zip initrd========"
[ -n $FST ] && {
$UMOUNT $DMNT || { $ECHO -e "Error: cant umount \"$DMNT\"" ; $KILL -INT $$; }
}
$GZIP -9 $ITMP/initrd || { $ECHO "Error: cant zip initrd" ; $KILL -INT $$; }
$MV -f $ITMP/initrd.gz $WTMP/boot/loader/initrd || { $ECHO "Error: cant return initrd" ; $KILL -INT $$; }
$RM -rf $ITMP || { $ECHO -e "Error: cant remove \"$ITMP\"" ; $KILL -INT $$; }
}
# ##################################################### fresh SuSE DVD indexes
[ -z "$NOFRESH" ] && {
[ -n "$DEBUG" ] && [ -z "$DRYRUN" ] && $ECHO "=======fresh SuSE DVD indexes========"
# ################################################## remove old indexes
MD5DIR=`$oCD $oHOME ; $oCD $oWTMP ; $oFIND suse -name MD5SUMS`
for i in $MD5DIR ; do
if [ -z "$DRYRUN" ] ; then
$RM -f $WTMP/$i || { $ECHO "Error: cant remove MD5SUMS" ; $KILL -INT $$; }
else
$RM -f $WTMP/$i
fi
done
# ################################################## create new indexes
# create package index
$CD $HOME
$CD $WTMP/suse
if [ -r $oWTMP/suse/setup/descr/EXTRA_PROV ] ; then
i="-x $WTMP/suse/setup/descr/EXTRA_PROV"
$CPDESCR -l czech -l english -l french -l german -l italian -l spanish -l hungarian $i \
|| { $ECHO "Error: cant make package index" ; $KILL -INT $$; }
else
# if EXTRA_PROV is needed but it not found - ABORT!
$oECHO "Error: cant find EXTRA_PROV"
$KILL -INT $$;
fi
# create directory.yast
LDIR=`$oCD $oHOME ; $oCD $oWTMP ; $oFIND . -name directory.yast`
for i in $LDIR ; do
if [ -z "$DRYRUN" ] ; then
$CD $HOME
$CD $WTMP/`dirname $i` || { $ECHO "Error: cant walk to \"`dirname $i`\"" ; $KILL -INT $$; }
$RM -f directory.yast || { $ECHO "Error: cant remove directory.yast" ; $KILL -INT $$; }
$LS -A > directory.yast || { $ECHO "Error: cant make directory.yast" ; $KILL -INT $$; }
else
$CD $HOME
$CD $WTMP/`dirname $i`
$RM -f directory.yast
$LS -A \> directory.yast
fi
done
# force directory.yast
$oCD $oHOME
[ -r $oWTMP/directory.yast ] || {
$CD $WTMP
if [ -z "$DRYRUN" ] ; then
$LS -A > directory.yast || { $ECHO "Error: cant make directory.yast" ; $KILL -INT $$; }
else
$LS -A \> directory.yast
fi
}
$oCD $oHOME
[ -r $oWTMP/media.1/directory.yast ] || {
$CD $WTMP/media.1
if [ -z "$DRYRUN" ] ; then
$LS -A > directory.yast || { $ECHO "Error: cant make directory.yast" ; $KILL -INT $$; }
else
$LS -A \> directory.yast
fi
}
# create main indexes
if [ -z "$DRYRUN" ] ; then
$CD $HOME
$CD $WTMP
$RM -f INDEX.gz ls-lR.gz || { $ECHO "Error: cant remove INDEX.gz ls-lR.gz" ; $KILL -INT $$; }
#
{ unset LANG
$LS -lR >ls-lR || { $ECHO "Error: cant make ls-lR" ; $KILL -INT $$; }
}
$GZIP ls-lR || { $ECHO "Error: cant zip ls-lR" ; $KILL -INT $$; }
#
$FIND . >INDEX || { $ECHO "Error: cant make INDEX" ; $KILL -INT $$; }
$GZIP INDEX || { $ECHO "Error: cant zip INDEX" ; $KILL -INT $$; }
else
$CD $HOME
$CD $WTMP
$RM -f INDEX.gz ls-lR.gz
#
$oECHO "{ unset LANG"
$LS -lR \>ls-lR
$oECHO "}"
$GZIP ls-lR
#
$FIND \. \>INDEX
$GZIP INDEX
fi
# create md5sums
for i in $MD5DIR ; do
if [ -z "$DRYRUN" ] ; then
$CD $HOME
$CD $WTMP/`dirname $i` || { $ECHO -e "Error: cant walk to \"`dirname $i`\"" ; $KILL -INT $$; }
$MD5 * > MD5SUMS
else
$CD $HOME
$CD $WTMP/`dirname $i`
$MD5 \* \> MD5SUMS
fi
done
#=#
# force md5sums
$CD $HOME
} # !NOFRESH
# ##################################################### build apt indexes
[ -z "$NOAPTATE" ] && {
i="--quiet qq" ; [ -n "$DEBUG" ] && i="--debug"
$APTATE $i --config-file $WTMP/apt/aptate.conf || { $ECHO "Error: cant buil apt" ; $KILL -INT $$; }
}
# ##################################################### make iso image
[ -n "$DEBUG" ] && [ -z "$DRYRUN" ] && $ECHO "=======make iso image========"
ISOBOOT=""
# looking for isolinux
( [ -r $WTMP/boot/loader/isolinux.bin ] || [ -n "$BOOTABLE" ] ) && {
ISOBOOT="-no-emul-boot -boot-load-size 4 -boot-info-table -b boot/loader/isolinux.bin -c boot/boot.catalog"
ISOBOOT="$ISOBOOT -hide boot/boot.catalog -hide-joliet boot/boot.catalog"
}
# make iso
i="-quiet" ; [ -n "$DEBUG" ] && i="-v"
ISOOPT="$i -r -J -pad -allow-lowercase -allow-multidot -iso-level 3"
i="-A \"$CDAPP\" -V \"$CDVOL\" -P \"$CDPUB\" -p \"$CDPRE\" -sysid \"$CDSYS\" $ISOOPT -o $TISO $ISOBOOT $WTMP"
#=#
if [ -n "$DRYRUN" ] ; then
$MKISO $i
else
eval "$MKISO $i" || { $ECHO "Error: cant make iso" ; $KILL -INT $$; }
fi
# ##################################################### finish
[ -n "$DRYRUN" ] || trap 1 2 3 15
cleanup
$ECHO "Done."
exit
# ##################################################### done
# #####################################################