base-files: refactor default_postinst()
authorJo-Philipp Wich <jow@openwrt.org>
Wed, 16 Sep 2015 08:43:58 +0000 (08:43 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Wed, 16 Sep 2015 08:43:58 +0000 (08:43 +0000)
 - Simplify user spec parsing code
 - Alias IPKG_INSTROOT to shorten code
 - Quote variables where appropriate
 - Remove a useless-use-of-cat instance
 - Suppress errors in case control or list files are missing

Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
SVN-Revision: 46975

package/base-files/files/lib/functions.sh

index 2f78d67025d0f52968fb47d6ee60a8b1163b5e6a..dde1ac4f4707b66d6f096320cc8b587471a1f257 100755 (executable)
@@ -174,61 +174,60 @@ default_prerm() {
 }
 
 default_postinst() {
-       local pkgname rusers ret
-       ret=0
-       pkgname=$(basename ${1%.*})
-       rusers=$(grep "Require-User:" ${IPKG_INSTROOT}/usr/lib/opkg/info/${pkgname}.control)
-       [ -n "$rusers" ] && {
-               local user group uid gid
-               for a in $(echo $rusers | sed "s/Require-User://g"); do
-                       user=""
-                       group=""
-                       for b in $(echo $a | sed "s/:/ /g"); do
-                               local ugname ugid
-
-                               ugname=$(echo $b | cut -d= -f1)
-                               ugid=$(echo $b | cut -d= -f2)
-
-                               [ -z "$user" ] && {
-                                       user=$ugname
-                                       uid=$ugid
-                                       continue
-                               }
-
-                               gid=$ugid
-                               [ -n "$gid" ] && {
-                                       group_exists $ugname || group_add $ugname $gid
-                               }
-
-                               [ -z "$gid" ] && {
-                                       group_add_next $ugname
-                                       gid=$?
-                               }
-
-                               [ -z "$group" ] && {
-                                       user_exists $user || user_add $user "$uid" $gid
-                                       group=$ugname
-                                       continue
-                               }
-
-                               group_add_user $ugname $user
-                       done
+       local root="${IPKG_INSTROOT}"
+       local pkgname="$(basename ${1%.*})"
+       local rusers="$(sed -ne 's/^Require-User: *//p' $root/usr/lib/opkg/info/${pkgname}.control 2>/dev/null)"
+       local ret=0
+
+       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
 
-       if [ -f ${IPKG_INSTROOT}/usr/lib/opkg/info/${pkgname}.postinst-pkg ]; then
-               ( . ${IPKG_INSTROOT}/usr/lib/opkg/info/${pkgname}.postinst-pkg )
+       if [ -f "$root/usr/lib/opkg/info/${pkgname}.postinst-pkg" ]; then
+               ( . "$root/usr/lib/opkg/info/${pkgname}.postinst-pkg" )
                ret=$?
        fi
-       [ -n "${IPKG_INSTROOT}" ] || rm -f /tmp/luci-indexcache 2>/dev/null
-
-       [ "$PKG_UPGRADE" = "1" ] || for i in `cat ${IPKG_INSTROOT}/usr/lib/opkg/info/${pkgname}.list | grep "^/etc/init.d/"`; do
-               [ -n "${IPKG_INSTROOT}" ] && $(which bash) ${IPKG_INSTROOT}/etc/rc.common ${IPKG_INSTROOT}$i enable; \
-               [ -n "${IPKG_INSTROOT}" ] || {
-                       $i enable
-                       $i start
-               }
-       done
+
+       [ -n "$root" ] || rm -f /tmp/luci-indexcache 2>/dev/null
+
+       if [ "$PKG_UPGRADE" != "1" ]; then
+               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
+                               "$i" enable
+                               "$i" start
+                       fi
+               done
+       fi
+
        return $ret
 }