5c426e384889caaad7f6a327e931a565c6620c0b
[kai/samba.git] / source / setup / newuser
1 #!/bin/sh
2 exec smbscript "$0" ${1+"$@"}
3 /*
4         add a new user to a Samba4 server
5         Copyright Andrew Tridgell 2005
6         Released under the GNU GPL v2 or later
7 */
8
9 options = new Object();
10 ok = GetOptions(ARGV, options, 
11                 "POPT_AUTOHELP",
12                 "POPT_COMMON_SAMBA",
13                 "POPT_COMMON_VERSION",
14                 'username=s',
15                 'unixname=s',
16                 'password=s',
17                 'quiet');
18 if (ok == false) {
19    println("Failed to parse options: " + options.ERROR);
20    return -1;
21 }
22
23 libinclude("base.js");
24
25 var samdb = lpGet("sam database");
26
27 /*
28   print a message if quiet is not set
29 */
30 function message() 
31 {
32         if (options["quiet"] == undefined) {
33                 print(vsprintf(arguments));
34         }
35 }
36
37 /*
38   search for one attribute as a string
39  */
40 function search(db, expression, attribute)
41 {
42         var attrs = new Array(attribute);
43         res = ldbSearch(db, expression, attrs);
44         if (res.length != 1 ||
45             res[0][attribute] == undefined) {
46                 return undefined;
47         }
48         return res[0][attribute];
49 }
50
51 /*
52  show some help
53 */
54 function ShowHelp()
55 {
56         print("
57 Samba4 newuser
58
59 newuser [options]
60   --username  USERNAME     choose new username
61   --unixname  USERNAME     choose unix name of new user
62   --password  PASSWORD     set password
63
64 You must provide at least a username
65 ");
66         exit(1);
67 }
68
69 if (options['username'] == undefined) {
70         ShowHelp();
71 }
72 if (options['password'] == undefined) {
73         options.password = randpass(12);
74         printf("chose random password %s\n", options.password);
75 }
76 if (options['unixname'] == undefined) {
77         options.unixname = options.username;
78 }
79
80 if (getpwnam(options.unixname) == undefined) {
81         printf("ERROR: Unix user '%s' does not exist\n", options.unixname);
82         exit(1);
83 }
84
85 if (search(samdb, "name=" + options.username, "dn") != undefined) {
86         printf("ERROR: User '%s' already exists\n", options.username);
87         exit(1);
88 }
89
90 var domain_dn = search(samdb, "objectClass=domainDNS", "dn");
91 assert(domain_dn != undefined);
92 var dom_users = search(samdb, "name=Domain Users", "dn");
93 assert(dom_users != undefined);
94
95 var user_dn = sprintf("CN=%s,CN=Users,%s", options.username, domain_dn);
96
97 /*
98   the new user record. note the reliance on the samdb module to fill
99   in a sid, guid etc
100  */
101 var ldif = sprintf("
102 dn: %s
103 sAMAccountName: %s
104 name: %s
105 memberOf: %s
106 unixName: %s
107 objectGUID: %s
108 unicodePwd: %s
109 objectClass: user
110 ",
111                    user_dn, options.username, options.username, dom_users,
112                    options.unixname, randguid(), options.password);
113
114 /*
115   add the user to the users group as well
116 */
117 var modgroup = sprintf("
118 dn: %s
119 changetype: modify
120 add: member
121 member: %s
122 ", dom_users, user_dn);
123
124 /*
125   now the real work
126  */
127 message("Adding user %s\n", user_dn);
128 ok = ldbAdd(samdb, ldif);
129 if (ok != true) {
130         message("Failed to add %s\n", user_dn);
131         exit(1);
132 }
133
134 message("Modifying group %s\n", dom_users);
135 ok = ldbModify(samdb, modgroup);
136 if (ok != true) {
137         message("Failed to modify %s\n", dom_users);
138         exit(1);
139 }
140
141 message("All OK\n");
142 return 0;