[openwrt/openwrt] build: add user/group ID resolve function

LEDE Commits lede-commits at lists.infradead.org
Mon Sep 14 07:15:36 EDT 2020


dangole pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/51ec51871fd57b80096baf76d6b21a2ae46e4748

commit 51ec51871fd57b80096baf76d6b21a2ae46e4748
Author: Paul Spooren <mail at aparcar.org>
AuthorDate: Sun Sep 13 16:02:02 2020 -1000

    build: add user/group ID resolve function
    
    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 at aparcar.org>
---
 scripts/ipkg-build | 42 ++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 40 insertions(+), 2 deletions(-)

diff --git a/scripts/ipkg-build b/scripts/ipkg-build
index e3a9a882cf..c9be18ec47 100755
--- a/scripts/ipkg-build
+++ b/scripts/ipkg-build
@@ -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



More information about the lede-commits mailing list