How to run a script only during first install of a package and during upgrades?
Check out this diagram from the Debian wiki about how the maintainer scripts are called:
If you follow down the left hand side (the “everything goes ok” path) you'll see that the postinst
script is called with the most-recently configured version. This gives you a chance to distinguish between an upgrade and a fresh install - in the upgrade case, your postinst will be called like
postinst configure 1.23-0ubuntu1
where 1.23-0ubuntu1
is the previously installed version of your package, whereas for a fresh install it will be called like
postinst configure
This also allows you to handle the case when you need to perform an action when upgrading from a particular version - you can check in the postinst
for that version.
This makes it easy to check if the script is being done on an 'install' or an 'upgrade'. If $2 is null, then it's an install. so:
if [ -z "$2" ]; then
do install stuff
else
do upgrade stuff
fi
With a debian/preinst
file you can perform actions on install but not upgrade.
#!/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
Though as the name implies, this is run before your package is installed. So you might not be able to do what you need here. Most packages simply test in the configure stage of the postinst
if the user has been created already. Here's 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
You might be able to use a debian/preinst script in combination with postinst.
In the preinst script, check for a file your pkg definitely installs. If it is present, do nothing (because your package was previously installed), else, do your setup steps.
If your setup steps require that your pkg is installed (in which case the above will not work because preinst runs before the installation), then your preinst script could write a file, for example: /tmp/setupmypkg. Your postinst script could simply test whether that file is present and if so do two things:
- your initial setup steps
- delete the /tmp/setupmypkg file