vp-build/xbps-src/shutils/metadata_scripts.sh
Juan RP 38a0a4eb53 xbps-src: add openrc_services trigger before system_users.
Packages that use both will try to remove the system user when the openrc services
are launched, so they report "user still logged in" errors.

While being here remove unnecessary empty lines in the generated scripts.
2010-12-07 17:51:17 +01:00

289 lines
7.5 KiB
Bash

#-
# Copyright (c) 2009-2010 Juan Romero Pardines.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#-
_add_trigger()
{
local f found name="$1"
for f in ${triggers}; do
[ "$f" = "$name" ] && found=1
done
[ -z "$found" ] && triggers="$triggers $name"
}
xbps_write_metadata_scripts_pkg()
{
local action="$1"
local tmpf=$(mktemp -t xbps-install.XXXXXXXXXX) || exit 1
local fpattern="s|${DESTDIR}||g;s|^\./$||g;/^$/d"
local targets f info_files home shell descr groups
local found triggers_found
case "$action" in
install) ;;
remove) ;;
*) return 1;;
esac
cd ${DESTDIR}
cat >> $tmpf <<_EOF
#!/bin/sh -e
#
# Generic INSTALL/REMOVE script. Arguments passed to this script:
#
# \$1 = ACTION [pre/post]
# \$2 = PKGNAME
# \$3 = VERSION
# \$4 = UPDATE [yes/no]
#
# Note that paths must be relative to CWD, to avoid calling
# host commands if /bin/sh (dash) is not installed and it's
# not possible to chroot(3).
#
export PATH="./bin:./sbin:./usr/bin:./usr/sbin"
TRIGGERSDIR="./var/db/xbps/triggers"
ACTION="\$1"
PKGNAME="\$2"
VERSION="\$3"
UPDATE="\$4"
#
# The following code will run the triggers.
#
_EOF
#
# Handle GNU Info files.
#
if [ -d "${DESTDIR}/usr/share/info" ]; then
unset info_files
for f in $(find ${DESTDIR}/usr/share/info -type f); do
j=$(echo $f|sed -e "$fpattern")
[ "$j" = "" ] && continue
[ "$j" = "/usr/share/info/dir" ] && continue
if [ -z "$info_files" ]; then
info_files="$j"
else
info_files="$info_files $j"
fi
done
if [ -n "${info_files}" ]; then
_add_trigger info-files
echo "export info_files=\"${info_files}\"" >> $tmpf
fi
fi
#
# Handle OpenRC services.
#
if [ -n "${openrc_services}" ]; then
_add_trigger openrc-service
echo "export openrc_services=\"${openrc_services}\"" >> $tmpf
fi
#
# Handle system accounts.
#
if [ -n "${system_accounts}" ]; then
_add_trigger system-accounts
echo "export system_accounts=\"${system_accounts}\"" >> $tmpf
for f in ${system_accounts}; do
eval homedir="\$${f}_homedir"
eval shell="\$${f}_shell"
eval descr="\$${f}_descr"
eval groups="\$${f}_groups"
if [ -n "$homedir" ]; then
echo "export ${f}_homedir=\"$homedir\"" >> $tmpf
fi
if [ -n "$shell" ]; then
echo "export ${f}_shell=\"$shell\"" >> $tmpf
fi
if [ -n "$descr" ]; then
echo "export ${f}_descr=\"$descr\"" >> $tmpf
fi
if [ -n "$groups" ]; then
echo "export ${f}_groups=\"${groups}\"" >> $tmpf
fi
unset homedir shell descr groups
done
fi
#
# (Un)Register a shell in /etc/shells.
#
if [ -n "${register_shell}" ]; then
_add_trigger register-shell
echo "export register_shell=\"${register_shell}\"" >> $tmpf
fi
#
# Handle SGML/XML catalog entries via xmlcatmgr.
#
if [ -n "${sgml_catalogs}" ]; then
for catalog in ${sgml_catalogs}; do
sgml_entries="${sgml_entries} CATALOG ${catalog} --"
done
fi
if [ -n "${sgml_entries}" ]; then
echo "export sgml_entries=\"${sgml_entries}\"" >> $tmpf
fi
if [ -n "${xml_catalogs}" ]; then
for catalog in ${xml_catalogs}; do
xml_entries="${xml_entries} nextCatalog ${catalog} --"
done
fi
if [ -n "${xml_entries}" ]; then
echo "export xml_entries=\"${xml_entries}\"" >> $tmpf
fi
if [ -n "${sgml_entries}" -o -n "${xml_entries}" ]; then
_add_trigger xml-catalog
fi
#
# Handle X11 font updates via mkfontdir/mkfontscale.
#
if [ -n "${font_dirs}" ]; then
_add_trigger x11-fonts
echo "export font_dirs=\"${font_dirs}\"" >> $tmpf
fi
#
# Handle GTK+ Icon cache directories.
#
if [ -n "${gtk_iconcache_dirs}" ]; then
_add_trigger gtk-icon-cache
echo "export gtk_iconcache_dirs=\"${gtk_iconcache_dirs}\"" \
>> $tmpf
fi
#
# Handle .desktop files in /usr/share/applications with
# desktop-file-utils.
#
if [ -d ${DESTDIR}/usr/share/applications ]; then
if find . -type f -name \*.desktop 2>&1 >/dev/null; then
_add_trigger update-desktopdb
fi
fi
#
# Handle GConf schemas/entries files with gconf-schemas.
#
if [ -n "${gconf_entries}" -o -n "${gconf_schemas}" ]; then
if find . -type f -name \*.schemas \
-o -name \*.entries 2>&1 >/dev/null; then
_add_trigger gconf-schemas
fi
if [ -n "${gconf_entries}" ]; then
echo "export gconf_entries=\"${gconf_entries}\"" \
>> $tmpf
fi
if [ -n "${gconf_schemas}" ]; then
echo "export gconf_schemas=\"${gconf_schemas}\"" \
>> $tmpf
fi
fi
#
# Write the INSTALL/REMOVE package scripts.
#
if [ -n "$triggers" ]; then
triggers_found=1
echo "case \"\${ACTION}\" in" >> $tmpf
echo "pre)" >> $tmpf
for f in ${triggers}; do
if [ ! -f $XBPS_TRIGGERSDIR/$f ]; then
rm -f $tmpf
msg_error "$pkgname: unknown trigger $f, aborting!"
fi
done
for f in ${triggers}; do
targets=$($XBPS_TRIGGERSDIR/$f targets)
for j in ${targets}; do
if ! $(echo $j|grep -q pre-${action}); then
continue
fi
printf "\t\${TRIGGERSDIR}/$f run $j \${PKGNAME} \${VERSION} \${UPDATE}\n" >> $tmpf
printf "\t[ \$? -ne 0 ] && exit \$?\n" >> $tmpf
done
done
printf "\t;;\n" >> $tmpf
echo "post)" >> $tmpf
for f in ${triggers}; do
targets=$($XBPS_TRIGGERSDIR/$f targets)
for j in ${targets}; do
if ! $(echo $j|grep -q post-${action}); then
continue
fi
printf "\t\${TRIGGERSDIR}/$f run $j \${PKGNAME} \${VERSION} \${UPDATE}\n" >> $tmpf
printf "\t[ \$? -ne 0 ] && exit \$?\n" >> $tmpf
done
done
printf "\t;;\n" >> $tmpf
echo "esac" >> $tmpf
echo >> $tmpf
fi
case "$action" in
install)
if [ -n "${sourcepkg}" -a "${sourcepkg}" != "${pkgname}" ]; then
install_file=$XBPS_SRCPKGDIR/$pkgname/$pkgname.INSTALL
else
install_file=$XBPS_SRCPKGDIR/$pkgname/INSTALL
fi
if [ -f ${install_file} ]; then
found=1
cat ${install_file} >> $tmpf
fi
echo "exit 0" >> $tmpf
if [ -z "$triggers_found" -a -z "$found" ]; then
rm -f $tmpf
return 0
fi
mv $tmpf ${DESTDIR}/INSTALL && chmod 755 ${DESTDIR}/INSTALL
;;
remove)
unset found
if [ -n "${sourcepkg}" -a "${sourcepkg}" != "${pkgname}" ]; then
remove_file=$XBPS_SRCPKGDIR/$pkgname/$pkgname.REMOVE
else
remove_file=$XBPS_SRCPKGDIR/$pkgname/REMOVE
fi
if [ -f ${remove_file} ]; then
found=1
cat ${remove_file} >> $tmpf
fi
echo "exit 0" >> $tmpf
if [ -z "$triggers_found" -a -z "$found" ]; then
rm -f $tmpf
return 0
fi
mv $tmpf ${DESTDIR}/REMOVE && chmod 755 ${DESTDIR}/REMOVE
;;
esac
}