Скрипты в deb-файле

В deb-файлы можно включать исполняемые файлы, которые будут автоматически выполняться системой на различных этапах установки и удаления пакета. Чаще всего эти файлы оформлены в виде скриптов командной оболочки, поэтому в дальнейшем я буду называть их скриптами. Более подробно о добавлении скриптов в deb-файлы можно прочитать на посвященной этому странице официального сайта дистрибутива Debian: http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html.

Вообще говоря, скрипты не обязательно должны быть именно скриптами. В виде скриптов они делаются в подавляющем большинстве случаев. Также, официальное руководство Debian по созданию deb-файлов рекомендует делать их именно в виде скриптов. Но, тем не менее, это могут быть любые исполняемые файлы. В случае, если это всё-таки скрипты, они должны начинаться со строки-ссылки на интерпретатор скриптов (строка, начинающаяся с "#!"). В любом случае, права на файл должны быть такими, чтобы файлы могли быть прочитаны и запущены любым пользователем, но не могли бы быть изменены любым пользователем.

Всего может быть до четырёх скриптов. Это должны быть файлы, размещаемые в той же директории, где находится control-файл (директория "DEBIAN" в той директории, на основе которой собирается deb-файл). Называться эти файлы должны preinst, postinst, prerm, postrm. Скрипт с именем файла preinst будет выполнен до установки пакета. Скрипт postinst будет выполнен после установки. Точнее говоря, скрипт preinst будет выполнен до того, как пакетный менеджер начнёт извлекать первый файл с данными из архива пакета, а скрипт postinst - после того, как пакетный менеджер закончит извлекать последний файл. Аналогичным образом скрипт prerm выполняется перед удалением пакета, а скрипт postrm - после удаления.

Пакетный менеджер при установке/удалении пакета отслеживает статус, с которым завершается выполнение скриптов. Поэтому, очень важно, чтобы при ошибке скрипты возвращали ненулевое значение, и пакетный менеджер мог прервать операцию и сообщить об ошибке. При использовании скриптов командной оболочки это почти всегда означает, что в них надо использовать инструкцию "set -e". Не менее важно, чтобы в случае отсутствия ошибок скрипт возвращал ноль.

Ещё одно требование к содержащимся в deb-файле скриптам - они должны быть идемпотентными. Это заключается в том, что, если скрипт выполняется повторно, это не должно приводить к ошибке. В случае, если скрипт был успешно выполнен, а затем запущен повторно - он должен просто проверить, что всё, что он должен был сделать, уже выполнено, и завершиться, вернув 0. В случае, если при выполнении скрипт выполнил часть нужных действий, а потом завершился с ошибкой - при следующем запуске он должен доделать только ту часть своих действий, которые не смог выполнить при предыдущем запуске.

В скрипте, выполняемом после установки пакета, можно обращаться к пользователю и запрашивать у него какую-нибудь информацию. Однако, этого следует избегать, поскольку возможность взаимодействия с пользователем не гарантируется. Также, взаимодействующие с пользователем скрипты препятствуют автоматической установке пакетов. Более подробно об этом рассказывается в официальном руководстве на странице дистрибутива Debian: http://www.debian.org/doc/debian-policy/ch-binary.html#s-maintscriptprompt.