Как запустить скрипт только при первой установке пакета и при обновлении?

Недавно я начал собирать часть своего программного обеспечения и публиковать его на Launchpad. Установка и удаление работают нормально, но обновление пакета с одной версии до следующей версии проблематично.

Проблема в том, что есть некоторые сценарии, которые нужно запускать только во время первой установки пакета. Эти сценарии заполняют БД, создают пользователя и т. Д. В настоящее время они называются в разделе package.postinst configure). Однако это приводит к тому, что их вызывают во время обновления, а также показано в на диаграмме .

Есть ли способ включить сценарий сопровождающего в пакет .deb, который выполняется только во время первой установки пакета, а не во время обновления? Или как можно было бы элегантно включить некоторые сценарии начальной установки в пакет .deb?

14
задан 12 May 2018 в 10:01

5 ответов

С файлом debian/preinst вы можете выполнять действия при установке, но не обновлять.

#!/bin/sh
set -e

case "$1" in
    install)
        # do some magic
        ;;

    upgrade|abort-upgrade)
        ;;

    *)
        echo "postinst called with unknown argument \`$1'" >&2
        exit 0
        ;;
esac

#DEBHELPER#

exit 0

Хотя, как следует из названия, он запускается до установки вашего пакета. Таким образом, вы не сможете делать то, что вам нужно здесь. Большинство пакетов просто проверяют на этапе настройки postinst, был ли пользователь уже создан. Вот colord

$ cat  /var/lib/dpkg/info/colord.postinst
#!/bin/sh

set -e

case "$1" in
    configure)

# create colord group if it isn't already there
    if ! getent group colord >/dev/null; then
            addgroup --quiet --system colord
    fi

# create the scanner group if it isn't already there
    if ! getent group scanner >/dev/null; then
        addgroup --quiet --system scanner
    fi

# create colord user if it isn't already there
    if ! getent passwd colord >/dev/null; then
            adduser --system --ingroup colord --home /var/lib/colord colord \
        --gecos "colord colour management daemon"
        # Add colord user to scanner group
        adduser --quiet colord scanner
    fi

# ensure /var/lib/colord has appropriate permissions
    chown -R colord:colord /var/lib/colord

    ;;
esac    



exit 0
0
ответ дан 12 May 2018 в 10:01

Я обнаружил, что тестирование на $ 2 в вашем скрипте «postinst configure» не работает должным образом, если вы уже установили пакет один раз, затем удалили его (но без очистки), а затем попробуйте переустановить снова. В этом случае сценарий postinst по-прежнему получает аргумент версии для шага «postinst configure».

Однако, если вы установили пакет ранее, затем удалите И очистите его, а затем переустановите заново, сценарий «postinst configure» НЕ получит аргумент версии в $ 2

0
ответ дан 12 May 2018 в 10:01

Вы можете использовать скрипт debian / preinst в сочетании с postinst.

В скрипте preinst проверьте наличие файла, который определенно установит ваш pkg. Если он присутствует, ничего не делайте (поскольку ваш пакет был ранее установлен), в противном случае выполните шаги по настройке.

Если ваши шаги по установке требуют, чтобы ваш pkg был установлен (в этом случае вышеописанное не будет работать, поскольку preinst запускается перед установкой), тогда ваш скрипт preinst может записать файл, например: / tmp / setupmypkg. Ваш скрипт postinst может просто проверить, присутствует ли этот файл, и если это так, сделать две вещи:

  • ваши начальные шаги установки
  • удалить файл / tmp / setupmypkg
0
ответ дан 12 May 2018 в 10:01

Я так не думаю, но вы можете легко изменить сценарии preinst / postinst, чтобы проверить, устанавливается ли пакет впервые, и предпринять стандартные действия.

Может быть что-то вроде этого,

в preinst.

if not is_package_istalled():
    export MY_PACKAGE_FIRST_INSTALL

в postinst,

if MY_PACKAGE_FIRST_INSTALL:
    Do First Install Setup 

Редактировать

Хм, может быть, вы можете просто проверить все это непосредственно в postinst, потому что я думаю, что dpkg не будет установить статус пакета как установленный перед запуском postinst, но я не уверен. Таким образом, вышесказанное может прийти,

в postinst,

if not is_package_istalled():
    Do First Install Setup 

Где is_package_installed может быть вашей функцией для определения состояния установки. Может быть что-то вроде 'dpkg --status packagename'

ИЛИ

Почему бы просто не проверить, внесены ли изменения, которые вы хотите внести, и продолжить, только если их нет.

0
ответ дан 12 May 2018 в 10:01

Посмотрите на эту диаграмму из вики Debian о том, как называются сценарии сопровождающего: Debian maintainer script flowchart

Если следовать левой стороне ( ok ”) вы увидите, что скрипт postinst вызывается с последней настроенной версией. Это дает вам возможность отличить обновление от новой установки - в случае обновления ваш postinst будет называться как

postinst configure 1.23-0ubuntu1

где 1.23-0ubuntu1 - ранее установленная версия вашего пакета, тогда как для новая установка будет называться как

postinst configure

Это также позволяет вам обрабатывать случай, когда вам нужно выполнить действие при обновлении с определенной версии - вы можете проверить в postinst для этой версии .

Это позволяет легко проверить, выполняется ли сценарий при «установке» или «обновлении». Если $ 2 ноль, то это установка. итак:

if [ -z "$2" ]; then
  do install stuff
else
  do upgrade stuff
fi
0
ответ дан 12 May 2018 в 10:01

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

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