Index: bin/SymlinkProgram
===================================================================
RCS file: /sources/goboscripts/tools/Scripts/bin/SymlinkProgram,v
retrieving revision 1.50
diff -u -r1.50 SymlinkProgram
--- bin/SymlinkProgram	25 Nov 2007 02:08:56 -0000	1.50
+++ bin/SymlinkProgram	7 Jan 2008 05:19:30 -0000
@@ -22,6 +22,7 @@
 Add_Option_Entry "t" "tasks" "Link tasks into ${goboExecutables}: 'yes', 'no' or 'safe'." "yes"
 Add_Option_Entry "u" "unmanaged" "Defines what to do with unmanaged files in package: 'ask', 'install' or 'skip'." "ask"
 Add_Option_Boolean "E" "no-environment" "Do not link entries from ${goboEnvironment}."
+Add_Option_Boolean "R" "no-requirements" "Do not process Resources/Requirements."
 Add_Option_Boolean "A" "no-variable" "Do not move variable files into ${goboVariable}."
 Add_Option_Boolean "M" "no-doc" "Do not link manuals and info files."
 Add_Option_Boolean "C" "cleanup" "Clean up after installation."
@@ -369,6 +370,78 @@
 
 ################################################################################
 
+if ! Boolean "no-requirements"
+then
+   function check_id_range() {
+      id="$1"
+      idtype="$2"
+      name="$3"
+      [ "$idtype" = "uid" ] && idtarget="user account" || idtarget="group"
+      if [ $id -lt 1 -o $id -gt 99 ]
+      then
+         Log_Error "$idtype $id is out of range [1..99], will not create $idtarget \"$name\""
+         return 1
+      fi
+      return 0
+   }
+   function get_next_system_id() {
+      next=99
+      for num in `cat "$1" | cut -d: -f3 | sort -n`
+      do
+         if [ $num -ge 100 ]
+         then next=$num
+         fi
+      done
+      let next=next+1
+      echo $next
+   }
+   if [ -f $current/Resources/Requirements ]
+   then
+      Log_Normal "Asserting that requirements are met..."
+      source $current/Resources/Requirements
+      for entry in "${required_groups[@]}"
+      do
+         unset gid
+         group=`echo "$entry" | cut -d" " -f1`
+         grep -q "^$group:" $goboSettings/group && continue
+         
+         if echo "$entry" | grep -q "gid="
+         then 
+            gidnumber="`echo $entry | sed 's,.*gid=\([^ ]*\).*,\1,g'`"
+            check_id_range $gidnumber "gid" "$group" || continue
+            gid="--gid $gidnumber"
+         else
+            gid="--gid `get_next_system_id $goboSettings/group`"
+         fi
+         Log_Normal "Adding group $group..."
+         groupadd $group $gid
+      done
+
+      for entry in "${required_users[@]}"
+      do
+         unset uid
+         unset groups
+         user=`echo "$entry" | cut -d" " -f1`
+         grep -q "^$user:" $goboSettings/passwd && continue
+         
+         echo "$entry" | grep -q "groups=" && groups="`echo $entry | sed 's,.*groups=\([^ ]*\).*,\1,g'`"
+         if echo "$entry" | grep -q "uid="
+         then 
+            uidnumber="`echo $entry | sed 's,.*uid=\([^ ]*\).*,\1,g'`"
+            check_id_range $uidnumber "uid" "$user" || continue
+            uid="--uid $uidnumber"
+         else
+            uid="--uid `get_next_system_id $goboSettings/passwd`"
+         fi
+         Log_Normal "Adding user $user..."
+         useradd $user $uid -c "Added by Compile/InstallPackage" -d "$goboVariable/empty" -s "$goboExecutables/nologin"
+         [ "$groups" ] && usermod -a -G "$groups" "$user"
+      done
+   fi
+fi
+
+################################################################################
+
 Log_Normal "Removing unused directories..."
 PrepareProgram --tree-cleanup "$package" "$version"
 
