653a63b539557cb6ded0944db47151d5117ce929
[usertools.macosx.git] / useradd.macosx.sh
1 #!/bin/bash
2 #
3 # useradd.macosx
4 # Copyright (c)2008,2009 Barton IT-Consulting, Alexander Barton
5 #
6 # This is free software; see the source for copying conditions. There is NO
7 # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
8 #
9
10 NAME=`basename $0`
11 RELEASE="3"
12
13 Abort() {
14         [ $# -lt 1 ] \
15                 && echo "$NAME: Error detected, aborting now!" \
16                 || echo "$NAME: $*"
17         exit 9
18 }
19 Usage() {
20         echo "$NAME (useradd.macosx.sh) release $RELEASE"
21         echo "Copyright (c)2008,2009 Barton IT-Consulting, Alex Barton (alex@barton-it.de)"
22         echo
23         echo "This is free software; see the source for copying conditions. There is NO"
24         echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
25         echo
26         echo "Usage: $NAME [-X] [-A] [-v] [-c <realName>] [-d <homeDir>]"
27         echo "       [-g <groupId>] [-s <shell>] [-u <userId>] <login>"
28         echo
29         echo " -A               User should become a local administrator."
30         echo " -c <realName>    Real name of the new user (aka \"comment\" field)."
31         echo " -d <homeDir>     Home directory of the user; default: '/User/<login>'."
32         echo " -g <groupId>     Group ID of the new user; default: 20 (='staff')."
33         echo " -s <shell>       Shell of the new user; default: '/bin/bash'."
34         echo " -u <userId>      User ID of the new user; default: next free UID."
35         echo " -v               Verbose mode, show more information during runtime."
36         echo " -X               Debug mode, only show what would be done."
37         echo
38         exit 1
39 }
40
41 # Check operating system version
42 sw_vers -productName 2>/dev/null | grep "Mac OS X" >/dev/null 2>&1
43 [ $? -eq 0 ] || Abort "This script requires Mac OS X!"
44 epoch=`sw_vers -productVersion | cut -d'.' -f1`
45 major=`sw_vers -productVersion | cut -d'.' -f2`
46 if [ $epoch -ne 10 -o $major -lt 5 -o $major -gt 6 ]; then
47         Abort "This script requires Mac OS X 10.5.x or 10.6.x!"
48 fi
49
50 # Defaults
51 declare -i debug=0
52 declare -i verbose=0
53 declare -i user_id=-1
54 declare -i group_id=20
55 declare -i become_admin=0
56 user_name=""
57 real_name=""
58 home_dir=""
59 shell="/bin/bash"
60
61 # Parse command line
62 while [ $# -gt 0 ]; do
63         case "$1" in
64                 "-A")
65                         declare -i become_admin=1
66                         ;;
67                 "-c")
68                         shift
69                         [ $# -gt 0 ] || Usage
70                         real_name="$1"
71                         ;;
72                 "-d")
73                         shift
74                         [ $# -gt 0 ] || Usage
75                         home_dir="$1"
76                         ;;
77                 "-g")
78                         shift
79                         [ $# -gt 0 ] || Usage
80                         declare -i group_id="$1"
81                         ;;
82                 "-s")
83                         shift
84                         [ $# -gt 0 ] || Usage
85                         shell="$1"
86                         ;;
87                 "-u")
88                         shift
89                         [ $# -gt 0 ] || Usage
90                         declare -i user_id="$1"
91                         ;;
92                 "-v")
93                         declare -i verbose=1
94                         ;;
95                 "-X")
96                         declare -i debug=1
97                         ;;
98                 -*)
99                         Usage
100                         ;;
101                 *)
102                         [ -z "$user_name" ] || Usage
103                         user_name="$1"
104         esac
105         shift
106 done
107 [ -n "$user_name" ] || Usage
108 [ -n "$real_name" ] || real_name="$user_name"
109 [ -n "$home_dir" ] || home_dir="/Users/$user_name"
110 [ -n "$shell" ] || shell="/bin/bash"
111
112 [ "$UID" -eq 0 ] || Abort "This script must be run as root!"
113
114 # Check that directory services are running
115 launchctl list 2>/dev/null | fgrep "com.apple.DirectoryServices" >/dev/null 2>&1
116 if [ $? -ne 0 ]; then
117         echo "Starting directory services ..."
118         launchctl load /System/Library/LaunchDaemons/com.apple.DirectoryServicesLocal.plist || Abort
119         sleep 1
120         launchctl load /System/Library/LaunchDaemons/com.apple.DirectoryServices.plist || Abort
121         sleep 1
122 else
123         [ "$verbose" -ne 0 ] && echo "Directory services already loaded, ok."
124 fi
125
126 # No user ID given, generate it
127 if [ $user_id -lt 0 ]; then
128         # search next free user ID
129         user_id=`echo $[$(dscl . -list /Users uid | awk '{print $2}' \
130                 | sort -n | tail -n1)+1]`
131 fi
132
133 # Validate user name, user id and group id
134 id "$user_id" >/dev/null 2>&1
135 [ $? -ne 0 ] || Abort "User id $user_id already used!"
136 id "$user_name" >/dev/null 2>&1
137 [ $? -ne 0 ] || Abort "User name '$user_name' already used!"
138 [ -n "$user_id" -a "$user_id" -ge 1 ] || Abort "User ID must be >0!"
139 [ -n "$group_id" -a "$group_id" -ge 0 ] || Abort "Group ID must be >=0!"
140
141 if [ "$verbose" -ne 0 -o "$debug" -ne 0 ]; then
142         echo "uid=$user_id"
143         echo "gid=$group_id"
144         echo "user_name=$user_name"
145         echo "real_name=$real_name"
146         echo "home_dir=$home_dir"
147         echo "shell=$shell"
148         echo "become_admin=$become_admin"
149         echo
150 fi
151 [ "$debug" -ne 0 ] && exit 8
152
153 if [ `id -u` -ne 0 ]; then
154         Abort "This script requires root privileges!"
155 fi
156
157 # Create directory entries
158 [ "$verbose" -ne 0 ] && echo "Creating user ..."
159 dscl . -create /Users/"$user_name" || Abort
160 [ "$verbose" -ne 0 ] && echo "Populating user ..."
161 dscl . -create /Users/"$user_name" UniqueID "$user_id" || Abort
162 dscl . -create /Users/"$user_name" PrimaryGroupID "$group_id" || Abort
163 dscl . -create /Users/"$user_name" NFSHomeDirectory "$home_dir" || Abort
164 dscl . -create /Users/"$user_name" UserShell "$shell" || Abort
165 dscl . -create /Users/"$user_name" RealName "$real_name" || Abort
166 #dscl . -passwd /Users/"$user_name" "maccc" || Abort
167 if [ "$become_admin" -ne 0 ]; then
168         [ "$verbose" -ne 0 ] && echo "Adding user to 'admin' group ..."
169         dscl . -append /Groups/admin GroupMembership "$user_name" || Abort
170 fi
171
172 # Create home directory
173 [ "$verbose" -ne 0 ] && echo "Creating user home directory ..."
174 mkdir -p "$home_dir" || Abort
175 chown "$user_id:$group_id" "$home_dir" || Abort
176 chmod 755 "$home_dir" || Abort
177
178 [ "$verbose" -ne 0 ] && echo
179 echo "User '$user_name' ($user_id) has been created."
180 exit 0
181
182 # -eof-