Условный файл и установка каталога в '.deb' Пакеты

Действительно ли возможно создать двоичный файл .deb пакет с условной установкой файлов и каталогов (например, установкой init сценарий в /etc/init.d/ будучи подтвержденным пользователем)?

3
задан 1 July 2015 в 16:34

1 ответ

Для интерактивного задавания вопросов во время установки пакета, необходимо использовать 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

Заключительные шаги

  1. Добавьте a Pre-Depends: зависимость от debconf в файле debian/control
  2. Добавьте нормальное Depends: зависимость от ucf в файле debian/control
  3. Удостоверьтесь файл /usr/share/demo-pkg/init-service (или независимо от того, что Вы звоните, это) установлен правильно
3
ответ дан 1 December 2019 в 16:27

Другие вопросы по тегам:

Похожие вопросы: