pkgtasks is a shell script library to ease writing POSIX-compliant shell scripts to handle common tasks during installation or removal of a package, e.g., * creating groups and users needed by the package * creating and removing directories with special permissions and ownership, * copying example config files to their final locations during package installation, and removing them during package removal if they don't differ from the example ones, * reminding the user of files that may be customized after package installation.
114 lines
3.3 KiB
Text
114 lines
3.3 KiB
Text
# Copyright (c) 2017 The NetBSD Foundation, Inc.
|
|
# All rights reserved.
|
|
#
|
|
# This code is derived from software contributed to The NetBSD Foundation
|
|
# by Johnny C. Lam.
|
|
#
|
|
# 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 NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
|
# ``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 FOUNDATION OR CONTRIBUTORS
|
|
# 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.
|
|
#
|
|
# NAME
|
|
# load.subr -- load task modules
|
|
#
|
|
# SYNOPSIS
|
|
# task_load [-s <suffix>] <module> ...
|
|
#
|
|
# DESCRIPTION
|
|
# The task_load function sources the module file for each specified
|
|
# module.
|
|
#
|
|
# The module file is searched under ${TASK_MODULE_DIR} with a basename
|
|
# of <module><suffix>, where the default suffix is ".subr".
|
|
#
|
|
# The module file should define and set a global guard variable
|
|
# __task_<module>__ to "yes". This guard variable is checked by the
|
|
# task_load function to determine whether the module has been
|
|
# previously loaded.
|
|
#
|
|
# RETURN VALUES
|
|
# Returns 0 on success, and >0 if an error occurs.
|
|
#
|
|
# ENVIRONMENT
|
|
# The following variables are used if they are set:
|
|
#
|
|
# TASK_MODULE_DIR
|
|
# The path to the directory containing the task modules.
|
|
#
|
|
|
|
if [ -z "$__task_load__" ]; then
|
|
|
|
__task_load__="yes"
|
|
|
|
task_load()
|
|
{
|
|
: ${TASK_MODULE_DIR:=.}
|
|
|
|
local suffix=".subr"
|
|
local arg
|
|
local OPTIND=1
|
|
while getopts ":s:" arg "$@"; do
|
|
case $arg in
|
|
s) suffix=${OPTARG} ;;
|
|
*) return 127 ;;
|
|
esac
|
|
done
|
|
shift $(( ${OPTIND} - 1 ))
|
|
[ $# -gt 0 ] || return 127
|
|
|
|
local save_IFS
|
|
local guard path init_fn
|
|
local module
|
|
for module; do
|
|
save_IFS=$IFS; IFS=/
|
|
set -o noglob; set -- $1; set +o noglob
|
|
IFS=$save_IFS
|
|
guard="__task"
|
|
path=${TASK_MODULE_DIR}
|
|
for component; do
|
|
case $component in
|
|
"") : "skip empty path components" ;;
|
|
*) guard="${guard}_$component"
|
|
path="$path/$component" ;;
|
|
esac
|
|
done
|
|
init_fn="${guard}_init__"
|
|
guard="${guard}__"
|
|
path="$path$suffix"
|
|
if eval test -z "\$$guard"; then
|
|
if [ -f "$path" ]; then
|
|
. "$path"
|
|
if eval test -n "\$$init_fn"; then
|
|
if eval "\$$init_fn"; then
|
|
: "successful initialization"
|
|
else
|
|
echo 1>&2 "Error: initializing $module failed"
|
|
fi
|
|
fi
|
|
else
|
|
echo 1>&2 "Error: Loading $module failed: $path"
|
|
return 1
|
|
fi
|
|
fi
|
|
done
|
|
return 0
|
|
}
|
|
|
|
fi # __task_load__
|