mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 07:22:33 +00:00
a0ef1c478a
When we run "opkg install" on a package that installs an uci-defaults script, functions.sh will fail to evaluate that script in its default_postinst function. This happens because there is no "./" present and it searches for the file in paths specified by the PATH variable. This would work on bash, but it will not work on ash and some other shells like sh, zsh. This applys to the ". filename" directive used in this case. This patch will make the path relative to the /etc/uci-defaults directory. Fixes: FS#1021 Signed-off-by: Marko Ratkaj <marko.ratkaj@sartura.hr>
357 lines
7.9 KiB
Bash
Executable File
357 lines
7.9 KiB
Bash
Executable File
#!/bin/sh
|
|
# Copyright (C) 2006-2014 OpenWrt.org
|
|
# Copyright (C) 2006 Fokus Fraunhofer <carsten.tittel@fokus.fraunhofer.de>
|
|
# Copyright (C) 2010 Vertical Communications
|
|
|
|
|
|
debug () {
|
|
${DEBUG:-:} "$@"
|
|
}
|
|
|
|
# newline
|
|
N="
|
|
"
|
|
|
|
_C=0
|
|
NO_EXPORT=1
|
|
LOAD_STATE=1
|
|
LIST_SEP=" "
|
|
|
|
append() {
|
|
local var="$1"
|
|
local value="$2"
|
|
local sep="${3:- }"
|
|
|
|
eval "export ${NO_EXPORT:+-n} -- \"$var=\${$var:+\${$var}\${value:+\$sep}}\$value\""
|
|
}
|
|
|
|
list_contains() {
|
|
local var="$1"
|
|
local str="$2"
|
|
local val
|
|
|
|
eval "val=\" \${$var} \""
|
|
[ "${val%% $str *}" != "$val" ]
|
|
}
|
|
|
|
config_load() {
|
|
[ -n "$IPKG_INSTROOT" ] && return 0
|
|
uci_load "$@"
|
|
}
|
|
|
|
reset_cb() {
|
|
config_cb() { return 0; }
|
|
option_cb() { return 0; }
|
|
list_cb() { return 0; }
|
|
}
|
|
reset_cb
|
|
|
|
package() {
|
|
return 0
|
|
}
|
|
|
|
config () {
|
|
local cfgtype="$1"
|
|
local name="$2"
|
|
|
|
export ${NO_EXPORT:+-n} CONFIG_NUM_SECTIONS=$(($CONFIG_NUM_SECTIONS + 1))
|
|
name="${name:-cfg$CONFIG_NUM_SECTIONS}"
|
|
append CONFIG_SECTIONS "$name"
|
|
[ -n "$NO_CALLBACK" ] || config_cb "$cfgtype" "$name"
|
|
export ${NO_EXPORT:+-n} CONFIG_SECTION="$name"
|
|
export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_TYPE=$cfgtype"
|
|
}
|
|
|
|
option () {
|
|
local varname="$1"; shift
|
|
local value="$*"
|
|
|
|
export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_${varname}=$value"
|
|
[ -n "$NO_CALLBACK" ] || option_cb "$varname" "$*"
|
|
}
|
|
|
|
list() {
|
|
local varname="$1"; shift
|
|
local value="$*"
|
|
local len
|
|
|
|
config_get len "$CONFIG_SECTION" "${varname}_LENGTH" 0
|
|
[ $len = 0 ] && append CONFIG_LIST_STATE "${CONFIG_SECTION}_${varname}"
|
|
len=$(($len + 1))
|
|
config_set "$CONFIG_SECTION" "${varname}_ITEM$len" "$value"
|
|
config_set "$CONFIG_SECTION" "${varname}_LENGTH" "$len"
|
|
append "CONFIG_${CONFIG_SECTION}_${varname}" "$value" "$LIST_SEP"
|
|
list_cb "$varname" "$*"
|
|
}
|
|
|
|
config_unset() {
|
|
config_set "$1" "$2" ""
|
|
}
|
|
|
|
# config_get <variable> <section> <option> [<default>]
|
|
# config_get <section> <option>
|
|
config_get() {
|
|
case "$3" in
|
|
"") eval echo "\${CONFIG_${1}_${2}:-\${4}}";;
|
|
*) eval export ${NO_EXPORT:+-n} -- "${1}=\${CONFIG_${2}_${3}:-\${4}}";;
|
|
esac
|
|
}
|
|
|
|
# config_get_bool <variable> <section> <option> [<default>]
|
|
config_get_bool() {
|
|
local _tmp
|
|
config_get _tmp "$2" "$3" "$4"
|
|
case "$_tmp" in
|
|
1|on|true|yes|enabled) _tmp=1;;
|
|
0|off|false|no|disabled) _tmp=0;;
|
|
*) _tmp="$4";;
|
|
esac
|
|
export ${NO_EXPORT:+-n} "$1=$_tmp"
|
|
}
|
|
|
|
config_set() {
|
|
local section="$1"
|
|
local option="$2"
|
|
local value="$3"
|
|
local old_section="$CONFIG_SECTION"
|
|
|
|
CONFIG_SECTION="$section"
|
|
option "$option" "$value"
|
|
CONFIG_SECTION="$old_section"
|
|
}
|
|
|
|
config_foreach() {
|
|
local ___function="$1"
|
|
[ "$#" -ge 1 ] && shift
|
|
local ___type="$1"
|
|
[ "$#" -ge 1 ] && shift
|
|
local section cfgtype
|
|
|
|
[ -z "$CONFIG_SECTIONS" ] && return 0
|
|
for section in ${CONFIG_SECTIONS}; do
|
|
config_get cfgtype "$section" TYPE
|
|
[ -n "$___type" -a "x$cfgtype" != "x$___type" ] && continue
|
|
eval "$___function \"\$section\" \"\$@\""
|
|
done
|
|
}
|
|
|
|
config_list_foreach() {
|
|
[ "$#" -ge 3 ] || return 0
|
|
local section="$1"; shift
|
|
local option="$1"; shift
|
|
local function="$1"; shift
|
|
local val
|
|
local len
|
|
local c=1
|
|
|
|
config_get len "${section}" "${option}_LENGTH"
|
|
[ -z "$len" ] && return 0
|
|
while [ $c -le "$len" ]; do
|
|
config_get val "${section}" "${option}_ITEM$c"
|
|
eval "$function \"\$val\" \"\$@\""
|
|
c="$(($c + 1))"
|
|
done
|
|
}
|
|
|
|
insert_modules() {
|
|
for m in $*; do
|
|
if [ -f /etc/modules.d/$m ]; then
|
|
sed 's/^[^#]/insmod &/' /etc/modules.d/$m | ash 2>&- || :
|
|
else
|
|
modprobe $m
|
|
fi
|
|
done
|
|
}
|
|
|
|
default_prerm() {
|
|
local root="${IPKG_INSTROOT}"
|
|
local name
|
|
|
|
name=$(basename ${1%.*})
|
|
[ -f "$root/usr/lib/opkg/info/${name}.prerm-pkg" ] && . "$root/usr/lib/opkg/info/${name}.prerm-pkg"
|
|
|
|
local shell="$(which bash)"
|
|
for i in `cat "$root/usr/lib/opkg/info/${name}.list" | grep "^/etc/init.d/"`; do
|
|
if [ -n "$root" ]; then
|
|
${shell:-/bin/sh} "$root/etc/rc.common" "$root$i" disable
|
|
else
|
|
if [ "$PKG_UPGRADE" != "1" ]; then
|
|
"$i" disable
|
|
fi
|
|
"$i" stop || /bin/true
|
|
fi
|
|
done
|
|
}
|
|
|
|
add_group_and_user() {
|
|
local pkgname="$1"
|
|
local rusers="$(sed -ne 's/^Require-User: *//p' $root/usr/lib/opkg/info/${pkgname}.control 2>/dev/null)"
|
|
|
|
if [ -n "$rusers" ]; then
|
|
local tuple oIFS="$IFS"
|
|
for tuple in $rusers; do
|
|
local uid gid uname gname
|
|
|
|
IFS=":"
|
|
set -- $tuple; uname="$1"; gname="$2"
|
|
IFS="="
|
|
set -- $uname; uname="$1"; uid="$2"
|
|
set -- $gname; gname="$1"; gid="$2"
|
|
IFS="$oIFS"
|
|
|
|
if [ -n "$gname" ] && [ -n "$gid" ]; then
|
|
group_exists "$gname" || group_add "$gname" "$gid"
|
|
elif [ -n "$gname" ]; then
|
|
group_add_next "$gname"; gid=$?
|
|
fi
|
|
|
|
if [ -n "$uname" ]; then
|
|
user_exists "$uname" || user_add "$uname" "$uid" "$gid"
|
|
fi
|
|
|
|
if [ -n "$uname" ] && [ -n "$gname" ]; then
|
|
group_add_user "$gname" "$uname"
|
|
fi
|
|
|
|
unset uid gid uname gname
|
|
done
|
|
fi
|
|
}
|
|
|
|
default_postinst() {
|
|
local root="${IPKG_INSTROOT}"
|
|
local pkgname="$(basename ${1%.*})"
|
|
local ret=0
|
|
|
|
add_group_and_user "${pkgname}"
|
|
|
|
if [ -f "$root/usr/lib/opkg/info/${pkgname}.postinst-pkg" ]; then
|
|
( . "$root/usr/lib/opkg/info/${pkgname}.postinst-pkg" )
|
|
ret=$?
|
|
fi
|
|
|
|
if [ -d "$root/rootfs-overlay" ]; then
|
|
cp -R $root/rootfs-overlay/. $root/
|
|
rm -fR $root/rootfs-overlay/
|
|
fi
|
|
|
|
if [ -z "$root" ] && grep -q -s "^/etc/uci-defaults/" "/usr/lib/opkg/info/${pkgname}.list"; then
|
|
. /lib/functions/system.sh
|
|
[ -d /tmp/.uci ] || mkdir -p /tmp/.uci
|
|
for i in $(sed -ne 's!^/etc/uci-defaults/!!p' "/usr/lib/opkg/info/${pkgname}.list"); do (
|
|
cd /etc/uci-defaults
|
|
[ -f "$i" ] && . ./"$i" && rm -f "$i"
|
|
) done
|
|
uci commit
|
|
fi
|
|
|
|
[ -n "$root" ] || rm -f /tmp/luci-indexcache 2>/dev/null
|
|
|
|
local shell="$(which bash)"
|
|
for i in $(grep -s "^/etc/init.d/" "$root/usr/lib/opkg/info/${pkgname}.list"); do
|
|
if [ -n "$root" ]; then
|
|
${shell:-/bin/sh} "$root/etc/rc.common" "$root$i" enable
|
|
else
|
|
if [ "$PKG_UPGRADE" != "1" ]; then
|
|
"$i" enable
|
|
fi
|
|
"$i" start
|
|
fi
|
|
done
|
|
|
|
return $ret
|
|
}
|
|
|
|
include() {
|
|
local file
|
|
|
|
for file in $(ls $1/*.sh 2>/dev/null); do
|
|
. $file
|
|
done
|
|
}
|
|
|
|
find_mtd_index() {
|
|
local PART="$(grep "\"$1\"" /proc/mtd | awk -F: '{print $1}')"
|
|
local INDEX="${PART##mtd}"
|
|
|
|
echo ${INDEX}
|
|
}
|
|
|
|
find_mtd_part() {
|
|
local INDEX=$(find_mtd_index "$1")
|
|
local PREFIX=/dev/mtdblock
|
|
|
|
[ -d /dev/mtdblock ] && PREFIX=/dev/mtdblock/
|
|
echo "${INDEX:+$PREFIX$INDEX}"
|
|
}
|
|
|
|
group_add() {
|
|
local name="$1"
|
|
local gid="$2"
|
|
local rc
|
|
[ -f "${IPKG_INSTROOT}/etc/group" ] || return 1
|
|
[ -n "$IPKG_INSTROOT" ] || lock /var/lock/group
|
|
echo "${name}:x:${gid}:" >> ${IPKG_INSTROOT}/etc/group
|
|
rc=$?
|
|
[ -n "$IPKG_INSTROOT" ] || lock -u /var/lock/group
|
|
return $rc
|
|
}
|
|
|
|
group_exists() {
|
|
grep -qs "^${1}:" ${IPKG_INSTROOT}/etc/group
|
|
}
|
|
|
|
group_add_next() {
|
|
local gid gids
|
|
gid=$(grep -s "^${1}:" ${IPKG_INSTROOT}/etc/group | cut -d: -f3)
|
|
[ -n "$gid" ] && return $gid
|
|
gids=$(cat ${IPKG_INSTROOT}/etc/group | cut -d: -f3)
|
|
gid=100
|
|
while [ -n "$(echo $gids | grep $gid)" ] ; do
|
|
gid=$((gid + 1))
|
|
done
|
|
group_add $1 $gid
|
|
return $gid
|
|
}
|
|
|
|
group_add_user() {
|
|
local grp delim=","
|
|
grp=$(grep -s "^${1}:" ${IPKG_INSTROOT}/etc/group)
|
|
[ -z "$(echo $grp | cut -d: -f4 | grep $2)" ] || return
|
|
[ -n "$(echo $grp | grep ":$")" ] && delim=""
|
|
[ -n "$IPKG_INSTROOT" ] || lock /var/lock/passwd
|
|
sed -i "s/$grp/$grp$delim$2/g" ${IPKG_INSTROOT}/etc/group
|
|
[ -n "$IPKG_INSTROOT" ] || lock -u /var/lock/passwd
|
|
}
|
|
|
|
user_add() {
|
|
local name="${1}"
|
|
local uid="${2}"
|
|
local gid="${3}"
|
|
local desc="${4:-$1}"
|
|
local home="${5:-/var/run/$1}"
|
|
local shell="${6:-/bin/false}"
|
|
local rc
|
|
[ -z "$uid" ] && {
|
|
uids=$(cat ${IPKG_INSTROOT}/etc/passwd | cut -d: -f3)
|
|
uid=100
|
|
while [ -n "$(echo $uids | grep $uid)" ] ; do
|
|
uid=$((uid + 1))
|
|
done
|
|
}
|
|
[ -z "$gid" ] && gid=$uid
|
|
[ -f "${IPKG_INSTROOT}/etc/passwd" ] || return 1
|
|
[ -n "$IPKG_INSTROOT" ] || lock /var/lock/passwd
|
|
echo "${name}:x:${uid}:${gid}:${desc}:${home}:${shell}" >> ${IPKG_INSTROOT}/etc/passwd
|
|
echo "${name}:x:0:0:99999:7:::" >> ${IPKG_INSTROOT}/etc/shadow
|
|
rc=$?
|
|
[ -n "$IPKG_INSTROOT" ] || lock -u /var/lock/passwd
|
|
return $rc
|
|
}
|
|
|
|
user_exists() {
|
|
grep -qs "^${1}:" ${IPKG_INSTROOT}/etc/passwd
|
|
}
|
|
|
|
[ -z "$IPKG_INSTROOT" -a -f /lib/config/uci.sh ] && . /lib/config/uci.sh
|