summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortv <tv@pkgsrc.org>2004-04-27 01:45:22 +0000
committertv <tv@pkgsrc.org>2004-04-27 01:45:22 +0000
commitc0441055dd5635c70201a0b2027553bda34a4a3d (patch)
tree713f038869f0b17ebd2e8485d0898a8edb743961
parent5d97fca345178429a5899aca20dbc41e67bde647 (diff)
downloadpkgsrc-c0441055dd5635c70201a0b2027553bda34a4a3d.tar.gz
user(8) emulation scripts for Interix.
-rw-r--r--sysutils/user_interix/DESCR2
-rw-r--r--sysutils/user_interix/Makefile27
-rw-r--r--sysutils/user_interix/PLIST5
-rwxr-xr-xsysutils/user_interix/files/groupadd.sh30
-rwxr-xr-xsysutils/user_interix/files/groupdel.sh28
-rwxr-xr-xsysutils/user_interix/files/useradd.sh131
-rwxr-xr-xsysutils/user_interix/files/userdel.sh46
7 files changed, 269 insertions, 0 deletions
diff --git a/sysutils/user_interix/DESCR b/sysutils/user_interix/DESCR
new file mode 100644
index 00000000000..3b93d23b7e6
--- /dev/null
+++ b/sysutils/user_interix/DESCR
@@ -0,0 +1,2 @@
+This implements a subset of useradd(8)/groupadd(8) functionality on
+Interix that is sufficient for pkgsrc use.
diff --git a/sysutils/user_interix/Makefile b/sysutils/user_interix/Makefile
new file mode 100644
index 00000000000..05ddab13a29
--- /dev/null
+++ b/sysutils/user_interix/Makefile
@@ -0,0 +1,27 @@
+# $NetBSD: Makefile,v 1.1.1.1 2004/04/27 01:45:22 tv Exp $
+#
+
+DISTNAME= user-20040426
+CATEGORIES= sysutils
+MASTER_SITES= # empty
+DISTFILES= # empty
+
+MAINTAINER= tv@duh.org
+COMMENT= Limited NetBSD-compatible useradd/groupadd commands
+
+ONLY_FOR_PLATFORM= Interix-*-*
+
+PKG_INSTALLATION_TYPES= overwrite pkgviews
+
+NO_CHECKSUM= yes
+NO_BUILDLINK= yes
+NO_CONFIGURE= yes
+NO_TOOLS= yes
+NO_BUILD= yes
+
+do-install:
+.for f in useradd userdel groupadd groupdel
+ ${INSTALL_SCRIPT} ${FILESDIR}/$f.sh ${PREFIX}/sbin/$f
+.endfor
+
+.include "../../mk/bsd.pkg.mk"
diff --git a/sysutils/user_interix/PLIST b/sysutils/user_interix/PLIST
new file mode 100644
index 00000000000..f1fe45920c1
--- /dev/null
+++ b/sysutils/user_interix/PLIST
@@ -0,0 +1,5 @@
+@comment $NetBSD: PLIST,v 1.1.1.1 2004/04/27 01:45:22 tv Exp $
+sbin/groupadd
+sbin/groupdel
+sbin/useradd
+sbin/userdel
diff --git a/sysutils/user_interix/files/groupadd.sh b/sysutils/user_interix/files/groupadd.sh
new file mode 100755
index 00000000000..e50c9a58c47
--- /dev/null
+++ b/sysutils/user_interix/files/groupadd.sh
@@ -0,0 +1,30 @@
+#!/bin/ksh
+# $NetBSD: groupadd.sh,v 1.1.1.1 2004/04/27 01:45:22 tv Exp $
+
+export PATH=/bin:/usr/contrib/win32/bin
+
+show_usage () {
+ echo "usage: $0 [-v] group" >&2
+ exit 1
+}
+
+verbose=false
+run_cmd () {
+ if $verbose; then printf '%s\n' "+ $*"; fi
+ "$@"
+}
+
+while getopts 'g:ov' f; do
+ case $f in
+ g) echo "$0: numeric gid cannot be set manually; ignoring" >&2;;
+ o) echo "$0: cannot reuse numeric gid of another group; aborting" >&2; exit 2;;
+ v) verbose=true;;
+ \?) show_usage;;
+ esac
+done
+shift $(($OPTIND - 1))
+
+if [ $# -ne 1 ]; then show_usage; fi
+$verbose || exec >/dev/null
+
+run_cmd net localgroup $1 /add /comment:"Group added by Interix groupadd command"
diff --git a/sysutils/user_interix/files/groupdel.sh b/sysutils/user_interix/files/groupdel.sh
new file mode 100755
index 00000000000..2a5c2b34fc9
--- /dev/null
+++ b/sysutils/user_interix/files/groupdel.sh
@@ -0,0 +1,28 @@
+#!/bin/ksh
+# $NetBSD: groupdel.sh,v 1.1.1.1 2004/04/27 01:45:22 tv Exp $
+
+export PATH=/bin:/usr/contrib/win32/bin
+
+show_usage () {
+ echo "usage: $0 [-v] group" >&2
+ exit 1
+}
+
+verbose=false
+run_cmd () {
+ if $verbose; then printf '%s\n' "+ $*"; fi
+ "$@"
+}
+
+while getopts 'v' f; do
+ case $f in
+ v) verbose=true;;
+ \?) show_usage;;
+ esac
+done
+shift $(($OPTIND - 1))
+
+if [ $# -ne 1 ]; then show_usage; fi
+$verbose || exec >/dev/null
+
+run_cmd net localgroup $1 /delete
diff --git a/sysutils/user_interix/files/useradd.sh b/sysutils/user_interix/files/useradd.sh
new file mode 100755
index 00000000000..6e16fffeffc
--- /dev/null
+++ b/sysutils/user_interix/files/useradd.sh
@@ -0,0 +1,131 @@
+#!/bin/ksh
+# $NetBSD: useradd.sh,v 1.1.1.1 2004/04/27 01:45:22 tv Exp $
+
+export PATH=/bin:/usr/contrib/win32/bin
+
+show_usage () {
+ echo "usage: $0 [-mv] [-G secondary-group] [-b base-dir] [-c comment] [-d home-dir] [-g group|=uid] user" >&2
+ echo " $0 -D" >&2
+ exit 1
+}
+
+verbose=false
+run_cmd () {
+ if $verbose; then printf '%s\n' "+ $*"; fi
+ "$@"
+}
+
+if [ "$USERPROFILE" != "" ]; then
+ base_dir="$(dirname "$(ntpath2posix -c "$USERPROFILE")")"
+else
+ base_dir="/home"
+fi
+
+set -A extra_groups
+create_homedir=false
+gecos=
+group=+Users
+home_dir=
+
+show_defaults () {
+ printf 'base_dir\t%s\n' "$base_dir"
+ printf 'comment\t\t%s\n' "$gecos"
+ printf 'group\t\t%s\n' "$group"
+ exit 0
+}
+
+while getopts 'DG:L:b:c:d:e:f:g:k:mp:or:s:u:v' f; do
+ case $f in
+ D) show_defaults;;
+ G) extra_groups[${#extra_groups}]="$OPTARG";;
+ L) echo "$0: login classes not supported; ignoring" >&2;;
+ b) base_dir="$OPTARG";;
+ c) gecos="$OPTARG";;
+ d) home_dir="$OPTARG";;
+ e) echo "$0: expiry time not yet supported; ignoring" >&2;;
+ f) echo "$0: inactive time not yet supported; ignoring" >&2;;
+ g) group="$OPTARG";;
+ k) echo "$0: skeleton files not yet supported; ignoring" >&22;;
+ m) create_homedir=true;;
+ p) echo "$0: cannot set password from command line; aborting" >&2; exit 1;;
+ o) echo "$0: cannot reuse numeric uid of another user; aborting" >&2; exit 1;;
+ r) echo "$0: numeric ID range cannot be set manually; ignoring" >&2;;
+ s) echo "$0: setting login shell not yet supported; ignoring" >&2;;
+ u) echo "$0: numeric uid cannot be set manually; ignoring" >&2;;
+ v) verbose=true;;
+ \?) show_usage;;
+ esac
+done
+shift $(($OPTIND - 1))
+
+if [ $# -ne 1 ]; then show_usage; fi
+$verbose || exec >/dev/null
+
+### check for existence of desired groups
+
+if [ "$group" != "=uid" ]; then
+ if ! net localgroup "${group#+}" >/dev/null 2>&1; then
+ echo "$0: group '$group' does not exist" >&2; exit 1
+ fi
+fi
+
+for g in "${extra_groups[@]}"; do
+ if ! net localgroup "${g#+}" >/dev/null 2>&1; then
+ echo "$0: group '$g' does not exist" >&2; exit 1
+ fi
+done
+
+### check for ability to create homedir
+
+if $create_homedir && [ "$home_dir" = "" ]; then
+ if [ ! -d "$base_dir" ]; then
+ echo "$0: base dir '$base_dir' does not exist" >&2; exit 1
+ fi
+
+ home_dir="$base_dir/$1"
+fi
+
+if $create_homedir && [ -d "$home_dir" ]; then
+ echo "$0: home dir '$home_dir' already exists; not clobbering" >&2
+ create_homedir=false
+fi
+
+### add the user
+
+run_cmd net user $1 /add /fullname:"$gecos" /comment:"User added by Interix useradd command" || exit 1
+
+### put user in groups
+
+if [ "${group#+}" != "Users" ]; then
+ # "Users" added by default; remove and add the real one here:
+ run_cmd net localgroup "Users" $1 /delete || exit 1
+
+ # Under Interix, a user *is* a group. Do nothing if =uid is given.
+ if [ "$group" != "=uid" ]; then
+ run_cmd net localgroup "${group#+}" $1 /add || exit 1
+ fi
+fi
+
+for g in "${extra_groups[@]}"; do
+ # Don't add a "primary" group as a "secondary" group too.
+ if [ "${g#+}" != "${group#+}" ]; then
+ run_cmd net localgroup "${g#+}" $1 /add || exit 1
+ fi
+done
+
+### set, and optionally create and cacls the homedir
+
+if [ "$home_dir" != "" ]; then
+ home_dir_nt="$(posixpath2nt "$home_dir")"
+
+ if $create_homedir; then
+ # To get "vanilla" ACLs, we use Win32 "mkdir".
+ run_cmd wmkdir "$home_dir_nt" || exit 1
+
+ echo y | run_cmd cacls "$home_dir_nt" /T /G Administrators:F || exit 1
+ run_cmd cacls "$home_dir_nt" /T /E /G SYSTEM:F || exit 1
+ run_cmd cacls "$home_dir_nt" /T /E /G "$1":F || exit 1
+ fi
+
+ run_cmd net user "$1" /homedir:"$home_dir_nt" || exit 1
+fi
diff --git a/sysutils/user_interix/files/userdel.sh b/sysutils/user_interix/files/userdel.sh
new file mode 100755
index 00000000000..b8cb15c713f
--- /dev/null
+++ b/sysutils/user_interix/files/userdel.sh
@@ -0,0 +1,46 @@
+#!/bin/ksh
+# $NetBSD: userdel.sh,v 1.1.1.1 2004/04/27 01:45:22 tv Exp $
+
+export PATH=/bin:/usr/contrib/win32/bin
+
+show_usage () {
+ echo "usage: $0 [-rv] user" >&2
+ exit 1
+}
+
+verbose=false
+run_cmd () {
+ if $verbose; then printf '%s\n' "+ $*"; fi
+ "$@"
+}
+
+remove_home_dir=false
+
+while getopts 'prv' f; do
+ case $f in
+ p) echo "$0: cannot yet lock out user with -p; aborting" >&2; exit 1;;
+ r) remove_home_dir=true;;
+ v) verbose=true;;
+ \?) show_usage;;
+ esac
+done
+shift $(($OPTIND - 1))
+
+if [ $# -ne 1 ]; then show_usage; fi
+$verbose || exec >/dev/null
+
+if ! net user $1 >/dev/null 2>&1; then
+ echo "$0: user $1 does not exist" >&2; exit 1
+fi
+
+if $remove_home_dir; then
+ home_dir="$(eval "echo ~$1")"
+
+ case "$home_dir" in
+ /) echo "$0: user $1 has no home directory; ignoring remove request" >&2;;
+ /*/*) rm -rf "$home_dir";;
+ *) echo "$0: could not delete home directory '$home_dir'; aborting" >&2; exit 1;;
+ esac
+fi
+
+run_cmd net user $1 /delete