summaryrefslogtreecommitdiff
path: root/mk/pkginstall/usergroupfuncs.Linux
blob: c2791ce7cd3bb7e2beea067a383577e72c3d0b7b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# $NetBSD: usergroupfuncs.Linux,v 1.6 2013/04/05 03:30:40 sbd Exp $
#
# Platform-specific adduser and addgroup functionality
# on top of shadow-utils.  (Not libuser)

# group_exists group [groupid]
#	Returns 0 if $group exists and has gid $groupid
#	Returns 1 if neither $group nor $groupid exist
#	Returns 2 if $group or $groupid exist but don't match
#	Returns 3 for all errors
#
group_exists()
{
	_group="$1"; _groupid="$2"
	${TEST} -n "$_group" || return 3

	# Check using chgrp to work properly in an NSS/NIS environment.
	_tmpdir="./.pkginstall.$$"
	${MKDIR} -p $_tmpdir 2>/dev/null || return 3
	${CHMOD} 0700 $_tmpdir
	_testpath="$_tmpdir/group_exists"
	${ECHO} > $_testpath
	if ${CHGRP} $_group $_testpath >/dev/null 2>&1; then
		# $_group exists
		_id=`${LS} -ln $_testpath 2>/dev/null | ${AWK} '{ print $4 }'`
		${TEST} -n "$_groupid" || _groupid=$_id
		if ${TEST} "$_groupid" = "$_id"; then
			${RM} -fr $_tmpdir; return 0
		fi
		${RM} -fr $_tmpdir; return 2
	elif ${TEST} -z "$_groupid"; then
		# $_group doesn't exist and $_groupid is not set
		${RM} -fr $_tmpdir; return 1
	elif ${CHGRP} $_groupid $_testpath >/dev/null 2>&1; then
		_name=`${LS} -l $_testpath 2>/dev/null | ${AWK} '{ print $4 }'`
		if ${TEST} "$_name" != "$_groupid"; then
			# $_group doesn't exist, but $_groupid exists
			${RM} -fr $_tmpdir; return 2
		fi
		# neither $_group nor $_groupid exist
		${RM} -fr $_tmpdir; return 1
	fi
	${RM} -fr $_tmpdir; return 3
}

# user_exists user [userid]
#	Returns 0 if $user exists and has uid $userid
#	Returns 1 if neither $user nor $userid exist
#	Returns 2 if $user or $userid exist but don't match
#	Returns 3 for all errors
#
user_exists()
{
	_user="$1"; _userid="$2"
	${TEST} -n "$_user" || return 3

	# Check using chown to work properly in an NSS/NIS environment.
	_tmpdir="./.pkginstall.$$"
	${MKDIR} -p $_tmpdir 2>/dev/null || return 3
	${CHMOD} 0700 $_tmpdir
	_testpath="$_tmpdir/user_exists"
	${ECHO} > $_testpath
	if ${CHOWN} $_user $_testpath >/dev/null 2>&1; then
		# $_user exists
		_id=`${LS} -ln $_testpath 2>/dev/null | ${AWK} '{ print $3 }'`
		${TEST} -n "$_userid" || _userid=$_id
		if ${TEST} "$_userid" = "$_id"; then
			${RM} -fr $_tmpdir; return 0
		fi
		${RM} -fr $_tmpdir; return 2
	elif ${TEST} -z "$_userid"; then
		# $_user doesn't exist and $_userid is not set
		${RM} -fr $_tmpdir; return 1
	elif ${CHOWN} $_userid $_testpath >/dev/null 2>&1; then
		_name=`${LS} -l $_testpath 2>/dev/null | ${AWK} '{ print $3 }'`
		if ${TEST} "$_name" != "$_userid"; then
			# $_user doesn't exist, but $_userid exists
			${RM} -fr $_tmpdir; return 2
		fi
		# neither $_user nor $_userid exist
		${RM} -fr $_tmpdir; return 1
	fi
	${RM} -fr $_tmpdir; return 3
}

# The useradd command on Linux is a complete mess.
# At least Red Hat derivatives want to create home directories
# by default. They have support for -M, but no --help.
# Other Linux distributions lack -M support, some at least have
# --help.
# LSB just wants useradd, but doesn't specify any behavior, so
# it is useless for writing portable scripts.

call_useradd()
{
	case $userid in
	"")
		${USERADD}					\
			-r -c "$descr" -d "$home" -s "$shell"	\
			-g $group $user "$@"
		;;
	*)
		${USERADD}					\
			-c "$descr" -d "$home" -s "$shell"	\
			-g $group -u $userid $user "$@"
		;;
	esac
}

# adduser user group [userid] [descr] [home] [shell]
adduser()
{
	user="$1"; group="$2"; userid="$3"
	descr="$4"; home="$5" shell="$6"
	${TEST} $# -eq 6 || return 1
	${TEST} -n "$user" || return 2
	${TEST} -n "$group" || return 2

	USERADD="@USERADD@"

	case $user in
	${PKGNAME%-[0-9]*})	descr_dflt="$user user" ;;
	*)			descr_dflt="${PKGNAME%-[0-9]*} $user user" ;;
	esac
	: ${descr:="$descr_dflt"}
	: ${home:="@PKG_USER_HOME@"}
	: ${shell:="@PKG_USER_SHELL@"}

	if ${TEST} -n "${USERADD}" -a -x "${USERADD}"; then
		${ECHO} "${PKGNAME}: Creating user \`\`$user''"
		if grep -i -- "^CREATE_HOME.*yes" /etc/login.defs > /dev/null; then
			call_useradd -M
		else
			call_useradd
		fi
	fi
	return 0
}

# adduser group [groupid]
addgroup()
{
	group="$1"; groupid="$2"
	${TEST} $# -eq 2 || return 1
	${TEST} -n "$group" || return 2

	GROUPADD="@GROUPADD@"

	if ${TEST} -n "${GROUPADD}" -a -x "${GROUPADD}"; then
		${ECHO} "${PKGNAME}: Creating group \`\`$group''"
		case $groupid in
		"")	${GROUPADD} -r $group ;;
		*)	${GROUPADD} -g $groupid $group ;;
		esac
	fi
	return 0
}