Действительно ли возможно создать двоичный файл .deb
пакет с условной установкой файлов и каталогов (например, установкой init
сценарий в /etc/init.d/
будучи подтвержденным пользователем)?
Для интерактивного задавания вопросов во время установки пакета, необходимо использовать debconf. Динамично создать и управлять конфигурационными файлами (и файлы в /etc/init.d/
рассматриваются конфигурационные файлы) ucf может использоваться.
Учебное руководство, о том, как использовать debconf, может быть найдено здесь:
http://www.fifi.org/doc/debconf-doc/tutorial.html
debconf
шаблонПоместите это в файл debian/templates
. Это содержит текст, который показывают пользователю во время установки. Просто обязательно замените demo-pkg
с Вами на самом деле имя пакета!
Template: demo-pkg/install-init.d
Type: boolean
Default: false
Description: Would you like to install a service for this package?
Services are really cool! They allow stuff to be started in the
background without you having to start them manually!!!
Это - то, где Вы спрашиваете пользователя (в интерактивном режиме) о вещах, необходимо знать. Этот сценарий является особенным с тех пор, устанавливая больше чем один пакет, все эти файлы всех пакетов выполняются прежде dpkg
начинает процесс фактической установки. Это означает, что, если больше чем один пакет хочет спросить пользователя что-то, все вопросы задают в начале установки для всех пакетов, вместо позже для каждого пакета индивидуально.
Просто поместите следующий материал в названный файл debian/config
и отметьте его как исполняемый файл (не забудьте заменять demo-pkg
с корректным именем пакета):
#!/bin/sh
# Make sure this script fails if any unexpected errors happen
set -e
# Load debconf library
. /usr/share/debconf/confmodule
# Should an init job be installed?
db_input high demo-pkg/install-init.d || true
db_go
# You can also act upon the user's answers using `db_get`
#db_get demo-pkg/install-init.d
#[ "${RET}" = "false"] && echo "I don't think that was a wise decision..."
postinst
, prerm
и postrm
)Здесь мы делаем фактическое волшебство и динамично добавляем и удаляем конфигурационный файл/init сценарий. Чтобы это работало, необходимо установить init сценарий как регулярный файл наряду с пакетом (я принял /usr/share/demo-pkg/init-service
в этом примере).
debian/postinst
файл (названный после того, как все файлы были извлечены dpkg
):
#!/bin/sh
# Make sure this script fails if any unexpected errors happen
set -e
# Load debconf library
. /usr/share/debconf/confmodule
if [ "$1" = "configure" ];
then
# Check if the user decided the enable the service using `db_get`
db_get demo-pkg/install-init.d
if [ "${RET}" != "false" ];
then
# Install init script using `ucf`
ucf /usr/share/demo-pkg/init-service /etc/init.d/demo-service
# Register init script as service
update-rc.d demo-service defaults
# Start service
invoke-rc.d demo-service start
fi
fi
debian/prerm
файл (названный, прежде чем файлы удалены dpkg
или пакет обновлен до более новой версии):
#!/bin/sh
# Make sure this script fails if any unexpected errors happen
set -e
# Load debconf library
. /usr/share/debconf/confmodule
# Check if the user decided the enable the service using `db_get`
db_get demo-pkg/install-init.d
if [ "${RET}" != "false" ];
then
# Stop the service before upgrade or removal
invoke-rc.d demo-service stop
if [ "$1" = "remove" ] || [ "$1" = "deconfigure" ];
then
# Unregister service prior to removal
update-rc.d -f demo-service remove
fi
fi
debian/postrm
файл (названный после того, как все файлы были удалены dpkg
):
#!/bin/sh
# Make sure this script fails if any unexpected errors happen
set -e
if [ "$1" = "purge" ];
then
# Remove service file using `ucf` (checking whether `ucf` is still available first)
if type ucf >/dev/null 2>&1;
then
ucf --purge "/etc/init.d/demo-service"
fi
# Remove service file by hand (in case the above failed somehow)
rm -f "/etc/init.d/demo-service"
fi
Pre-Depends:
зависимость от debconf
в файле debian/control
Depends:
зависимость от ucf
в файле debian/control
/usr/share/demo-pkg/init-service
(или независимо от того, что Вы звоните, это) установлен правильно