build: add user/group ID resolve function
authorPaul Spooren <mail@aparcar.org>
Mon, 14 Sep 2020 02:02:02 +0000 (16:02 -1000)
committerDaniel Golle <daniel@makrotopia.org>
Mon, 14 Sep 2020 09:54:52 +0000 (10:54 +0100)
With the introduction of `./tmp/userids` the `ipkg-build` script can now
resolve values of "PKG_FILE_MODES", allowing users to set names rather
than numeric values.

Signed-off-by: Paul Spooren <mail@aparcar.org>
scripts/ipkg-build

index e3a9a882cf29d980eed3120fd2240720b04705fe..c9be18ec47f4f28d60cbf48f7319feaaec3e64f0 100755 (executable)
@@ -68,6 +68,40 @@ pkg_appears_sane() {
        return $PKG_ERROR
 }
 
+resolve_file_mode_id() {
+       type="$1"
+       name="$2"
+       position=1
+       if [ "$type" = "group" ]; then
+               position=2
+       fi
+
+       # root is always 0
+       if [ "$name" = "root" ]; then
+               echo 0
+               exit 0
+       fi
+
+       # return numeric names
+       if [ "$name" -eq "$name" 2>/dev/null ]; then
+               echo "$name"
+               exit 0
+       fi
+
+       ids=$(grep "$name" "$TOPDIR/tmp/userids")
+       for id in $ids; do
+               resolved_name=$(echo "$id" | cut -d ":" -f "$position" | cut -d "=" -f 1)
+               resolved_id=$(echo "$id" | cut -d ":" -f "$position" | cut -d "=" -f 2)
+               if [ "$resolved_name" = "$name" ]; then
+                       echo "$resolved_id"
+                       exit 0
+               fi
+       done
+
+       >&2 echo "No $type ID found for $name"
+       exit 1
+}
+
 ###
 # ipkg-build "main"
 ###
@@ -142,10 +176,14 @@ for file_mode in $file_modes; do
            ;;
        esac
        path=$(echo "$file_mode" | cut -d ':' -f 1)
-       user_group=$(echo "$file_mode" | cut -d ':' -f 2-3)
+       user=$(echo "$file_mode" | cut -d ':' -f 2)
+       group=$(echo "$file_mode" | cut -d ':' -f 3)
        mode=$(echo "$file_mode" | cut -d ':' -f 4)
 
-       chown "$user_group" "$pkg_dir/$path"
+       uid=$(resolve_file_mode_id user "$user")
+       gid=$(resolve_file_mode_id group "$group")
+
+       chown "$uid:$gid" "$pkg_dir/$path"
        chmod  "$mode" "$pkg_dir/$path"
 done
 $TAR -X $tmp_dir/tarX --format=gnu --sort=name -cpf - --mtime="$TIMESTAMP" . | $GZIP -n - > $tmp_dir/data.tar.gz