base-files: add support for overlaying rootfs content
[openwrt/staging/chunkeey.git] / package / base-files / files / lib / functions.sh
index 1b34b8f50dcb12782e0f63105e814f1b72d50503..b68db6b6bd7e419627b8330f5bf31a780f817561 100755 (executable)
@@ -1,5 +1,5 @@
 #!/bin/sh
-# Copyright (C) 2006-2013 OpenWrt.org
+# Copyright (C) 2006-2014 OpenWrt.org
 # Copyright (C) 2006 Fokus Fraunhofer <carsten.tittel@fokus.fraunhofer.de>
 # Copyright (C) 2010 Vertical Communications
 
@@ -102,8 +102,8 @@ config_get_bool() {
        local _tmp
        config_get _tmp "$2" "$3" "$4"
        case "$_tmp" in
-               1|on|true|enabled) _tmp=1;;
-               0|off|false|disabled) _tmp=0;;
+               1|on|true|yes|enabled) _tmp=1;;
+               0|off|false|no|disabled) _tmp=0;;
                *) _tmp="$4";;
        esac
        export ${NO_EXPORT:+-n} "$1=$_tmp"
@@ -154,10 +154,112 @@ config_list_foreach() {
 }
 
 insert_modules() {
-       [ -d /etc/modules.d ] && {
-               cd /etc/modules.d
-               sed 's/^[^#]/insmod &/' $* | ash 2>&- || :
-       }
+       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() {
@@ -168,6 +270,13 @@ include() {
        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
@@ -192,14 +301,45 @@ 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:-$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