mirror of
https://github.com/freebsd/freebsd-src
synced 2024-09-06 09:10:28 +00:00
Update adduser to version by Wolfram Schneider. Sorry, Gary, but his
adduser is a Cadillac to your Volkswagen.. :-) Submitted by: wosch@cs.tu-berlin.de
This commit is contained in:
parent
c4cab716b9
commit
5cc75e1e12
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=5354
|
@ -1,30 +1,4 @@
|
|||
.\" Copyright (c) 1994 GB Data Systems
|
||||
.\" All rights reserved.
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\" 3. The name of the Author may not be used to endorse or promote products
|
||||
.\" derived from this software without specific prior written permission.
|
||||
.\" THIS SOFTWARE IS PROVIDED BY GB DATA AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL GB DATA OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
|
||||
.\" $Id: adduser.8,v 1.2 1994/12/30 12:15:39 ache Exp $
|
||||
|
||||
.Dd December 28, 1994
|
||||
.Dd January 3, 1994
|
||||
.Dt ADDUSER 8
|
||||
.Os FreeBSD
|
||||
|
||||
|
@ -35,40 +9,18 @@
|
|||
.Nm
|
||||
|
||||
.Sh DESCRIPTION
|
||||
.Nm
|
||||
is a Perl script for adding users under a BSD system. It has the ability to
|
||||
keep track of the current userid and increment this automaticly. It can
|
||||
also use a default group id.
|
||||
.Ss SETUP
|
||||
In the normal course of usage there is no setup needed. If you wish to use
|
||||
auto-increment mode, you must do two things.
|
||||
|
||||
.Bl -enum -compact
|
||||
.It
|
||||
Change the variable in
|
||||
.Pa /etc/adduser.conf
|
||||
to allow for the auto-increment
|
||||
.It
|
||||
Change the file
|
||||
.Pa /etc/userids
|
||||
to show the current id number.
|
||||
.El
|
||||
|
||||
To use the default group id, just change the variable in
|
||||
.Pa /etc/adduser.conf
|
||||
to reflect the group that you wish as a default.
|
||||
|
||||
.Nm Adduser
|
||||
is a perl script for adding users to the system. Still awaiting
|
||||
a man page entry for it but for now you can probably get away with just
|
||||
typing
|
||||
.Nm adduser
|
||||
and filling in the blanks.
|
||||
.Sh FILES
|
||||
.Pa /etc/adduser.conf
|
||||
.Pa /etc/userids
|
||||
.Pa /usr/share/skel/*
|
||||
|
||||
Beats me. Wolfram? Man page please! :-)
|
||||
.Sh SEE ALSO
|
||||
.Xr pwd_mkdb 8
|
||||
.Xr perl 1
|
||||
|
||||
.Sh HISTORY
|
||||
The adduser command appeared in FreeBSD 2.0C (12-94).
|
||||
|
||||
|
||||
|
||||
The adduser command first appeared in FreeBSD 2.0C (12-94) by Gary Clark, II.
|
||||
This newer version was submitted by Wolfram Schneider.
|
||||
|
|
|
@ -1,195 +1,576 @@
|
|||
#!/usr/bin/perl
|
||||
|
||||
|
||||
|
||||
# Copyright (c) 1994 GB Data Systems
|
||||
# All rights reserved.
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# 3. The name of the Author may not be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
# THIS SOFTWARE IS PROVIDED BY GB DATA AND CONTRIBUTORS ``AS IS'' AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL GB DATA OR CONTRIBUTORS BE LIABLE
|
||||
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
# SUCH DAMAGE.
|
||||
|
||||
#
|
||||
# $Id: adduser.sh,v 1.1 1994/12/30 12:03:48 ache Exp $
|
||||
# (c) Copyright 1995 Wolfram Schneider. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# 3. All advertising materials mentioning features or use of this software
|
||||
# must display the following acknowledgement:
|
||||
# This product includes software developed by Wolfram Schneider
|
||||
# 4. The name of the author may not be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# /usr/sbin/adduser - add new user(s)
|
||||
#
|
||||
# Bugs: sure (my english!)
|
||||
# Email: Wolfram Schneider <wosch@cs.tu-berlin.de>
|
||||
#
|
||||
# $Id: adduser,v 1.17 1995/01/02 00:08:43 w Exp w $
|
||||
#
|
||||
|
||||
$configfile = "\/etc\/adduser.conf";
|
||||
sub variables {
|
||||
$verbose = 1;
|
||||
$batch = 0; # batch mode
|
||||
$defaultpasswd = 0;
|
||||
$dotdir = "/usr/share/skel";
|
||||
|
||||
if (-f $configfile) {
|
||||
open (CONFIG, "$configfile");
|
||||
while (<CONFIG>) {
|
||||
eval "$_";
|
||||
}
|
||||
if (1) {
|
||||
$home = "/home";
|
||||
$shells = "/etc/shells";
|
||||
$passwd = "/etc/master.passwd";
|
||||
$group = "/etc/group";
|
||||
$pwd_mkdb = "pwd_mkdb -p";
|
||||
} else {
|
||||
$home = "/home/w/tmp/adduser/home";
|
||||
$shells = "./shells";
|
||||
$passwd = "./master.passwd";
|
||||
$group = "./group";
|
||||
$pwd_mkdb = "pwd_mkdb -p -d .";
|
||||
}
|
||||
|
||||
@path = ('/bin', '/usr/bin', '/usr/local/bin');
|
||||
@shellpref = ('bash', 'tcsh', 'ksh', 'csh', 'sh');
|
||||
$uid_start = 1000; # new users get this uid
|
||||
$uid_end = 32000;
|
||||
|
||||
# global variables
|
||||
$username = ''; # $username{username} = uid
|
||||
$uid = ''; # $uid{uid} = username
|
||||
$pwgid = ''; # $pwgid{pwgid} = username; gid from passwd db
|
||||
$groupname =''; # $groupname{groupname} = gid
|
||||
$gid = ''; # $gid{gid} = groupname; gid form group db
|
||||
$defaultshell = '';
|
||||
@passwd_backup = '';
|
||||
}
|
||||
|
||||
open (WHOAMI, "whoami|");
|
||||
|
||||
while (<WHOAMI>) {
|
||||
$whoami = $_;
|
||||
}
|
||||
chop $whoami;
|
||||
|
||||
if ($whoami ne "root") {
|
||||
system "clear";
|
||||
print "\n\nYou must be root to add an user\n\n";
|
||||
close WHOAMI;
|
||||
exit;
|
||||
}
|
||||
close WHOAMI;
|
||||
|
||||
# Start getting information and print a banner
|
||||
|
||||
print " Adduser\n";
|
||||
print " A system utility for adding users with defaults\n";
|
||||
print "\n\n";
|
||||
|
||||
#
|
||||
# User ID
|
||||
#
|
||||
|
||||
|
||||
print "Please enter the login name of the user: ";
|
||||
chop ($userlogin = <STDIN>);
|
||||
|
||||
|
||||
sub subuid {
|
||||
$userid = "";
|
||||
print "Please enter the user id or hit enter for the next id: ";
|
||||
chop ($userid = <STDIN>);
|
||||
# read shell database
|
||||
# See also: shells(5)
|
||||
sub shells_read {
|
||||
local($s, @dummy);
|
||||
open(S, $shells) || die "$shells:$!\n";
|
||||
while(<S>) {
|
||||
if (/^[ \t]*\//) {
|
||||
($s, @dummy) = split;
|
||||
if (-x $s) {
|
||||
$shell{&basename($s)} = $s;
|
||||
} else {
|
||||
warn "Shell: $s not executable!\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while (!$userid) {
|
||||
&subuid;
|
||||
if (!$userid) {
|
||||
if ($useautoids) {
|
||||
open (USERID, "+<$userids");
|
||||
chop ($xxuserid = <USERID>);
|
||||
$userid = $xxuserid + 1;
|
||||
close USERID;
|
||||
open (USERID, "+>$userids");
|
||||
print (USERID "$userid\n");
|
||||
close USERID;
|
||||
} else { &subuid; }
|
||||
# add new/local shells
|
||||
sub shells_add {
|
||||
local($e,$dir,@list);
|
||||
foreach $e (@shellpref) {
|
||||
if (!$shell{$e}) {
|
||||
foreach $dir (@path) {
|
||||
if (-x "$dir/$e") {
|
||||
push(@list, "$dir/$e") if
|
||||
&confirm_yn("Found shell: $dir/$e. Add to $shells?", "yes");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($#list >= 0) {
|
||||
foreach $e (@list) {
|
||||
$shell{&basename($e)} = $e;
|
||||
#print "$e\n";
|
||||
}
|
||||
&append_file($shells, @list);
|
||||
}
|
||||
}
|
||||
|
||||
# choise your favourite shell
|
||||
sub shells_pref {
|
||||
local($e,$i,$s);
|
||||
|
||||
$i = 0;
|
||||
while($i < $#shellpref) {
|
||||
last if $shell{$shellpref[$i]};
|
||||
$i++;
|
||||
}
|
||||
$s = &confirm_list("Enter Your default shell:", 0,
|
||||
$shellpref[$i], sort(keys %shell));
|
||||
print "Your default shell is: $s -> $shell{$s}\n" if $verbose;
|
||||
$defaultshell = $s;
|
||||
}
|
||||
|
||||
# return default home partition
|
||||
sub home_partition {
|
||||
local($h);
|
||||
|
||||
$h = &confirm_list("Enter Your default HOME partition:", 1, $home, "");
|
||||
if (-e "$h") {
|
||||
if (!(-d _ || -l $h)) {
|
||||
warn "$h exist, but is it not a directory or symlink!\n";
|
||||
return &home_partition;
|
||||
}
|
||||
if (! -w _) {
|
||||
warn "$h is not writable!\n";
|
||||
return &home_partition;
|
||||
}
|
||||
} else {
|
||||
return &home_partition unless &mkdirhier($h);
|
||||
}
|
||||
|
||||
$home = $h;
|
||||
return $h;
|
||||
}
|
||||
|
||||
# check for valid passwddb
|
||||
sub passwd_check {
|
||||
print "Check $passwd\n" if $verbose > 0;
|
||||
system("$pwd_mkdb $passwd");
|
||||
die "\nInvalid $passwd - cannot add any users!\n" if $?;
|
||||
}
|
||||
|
||||
# read /etc/passwd
|
||||
sub passwd_read {
|
||||
local($un, $pw, $ui, $gi);
|
||||
|
||||
open(P, "$passwd") || die "$passwd: $!\n";
|
||||
while(<P>) {
|
||||
chop;
|
||||
push(@passwd_backup, $_);
|
||||
($un, $pw, $ui, $gi) = (split(/:/, $_))[0..3];
|
||||
print "$un already exist with uid: $username{$un}!\n"
|
||||
if $username{$un};
|
||||
$username{$un} = $ui;
|
||||
print "User $un: uid $ui exist twice: $uid{$ui}\n"
|
||||
if $uid{$ui} && $verbose;
|
||||
$uid{$ui} = $un;
|
||||
$pwgid{$gi} = $un;
|
||||
}
|
||||
close P;
|
||||
}
|
||||
|
||||
# read /etc/group
|
||||
sub group_read {
|
||||
local($gn,$pw,$gi);
|
||||
|
||||
open(G, "$group") || die "$group: $!\n";
|
||||
while(<G>) {
|
||||
($gn, $pw, $gi) = (split(/:/, $_))[0..2];
|
||||
warn "Groupname exist twice: $gn:$gi -> $gn:$groupname{$gn}\n"
|
||||
if $groupname{$gn};
|
||||
$groupname{$gn} = $gi;
|
||||
warn "Groupid exist twice: $gn:$gi -> $gid{$gi}:$gi\n"
|
||||
if $gid{$gi};
|
||||
$gid{$gi} = $gn;
|
||||
}
|
||||
close G;
|
||||
}
|
||||
|
||||
# check gids /etc/passwd <-> /etc/group
|
||||
sub group_check {
|
||||
local($e, $user, @list);
|
||||
|
||||
foreach $e (keys %pwgid) {
|
||||
if (!$gid{$e}) {
|
||||
$user = $pwgid{$e};
|
||||
warn "Gid $e is defined in $passwd for user ``$user''\n";
|
||||
warn "but not in $group!\n";
|
||||
if ($groupname{$user}) {
|
||||
warn <<EOF;
|
||||
I'm confused! Maybe the gids ($e <-> $groupname{$user}) for user ``$user''
|
||||
in $passwd & $group are wrong.
|
||||
See $passwd ``$user:*:$username{$user}:$e''
|
||||
See $group ``$user:*:$groupname{$user}''
|
||||
EOF
|
||||
} else {
|
||||
push(@list, "$user:*:$e:$user")
|
||||
if (&confirm_yn("Add group``$user'' gid $e to $group?", "y"));
|
||||
}
|
||||
}
|
||||
}
|
||||
&append_file($group, @list) if $#list >= 0;
|
||||
}
|
||||
|
||||
sub new_users {
|
||||
local(@userlist) = @_;
|
||||
local($name);
|
||||
local($defaultname) = "a-z0-9";
|
||||
|
||||
print "\nOk, let's go.\n";
|
||||
print "Don't worry about mistakes. I ask You later for " .
|
||||
"correct input.\n" if $verbose;
|
||||
|
||||
while(1) {
|
||||
$name = &confirm_list("Enter username", 1, $defaultname, "");
|
||||
if ($name !~ /^[a-z0-9]+$/) {
|
||||
warn "Wrong username. " .
|
||||
"Please use only lowercase characters or digits\n";
|
||||
} elsif ($username{$name}) {
|
||||
warn "Username ``$name'' already exists!\n";
|
||||
} else {
|
||||
last;
|
||||
}
|
||||
}
|
||||
local($fullname);
|
||||
while(($fullname = &confirm_list("Enter full name", 1, "", "")) =~ /:/) {
|
||||
warn "``:'' is not allowed!\n";
|
||||
}
|
||||
$fullname = $name unless $fullname;
|
||||
local($sh) = &confirm_list("Enter shell", 0, $defaultshell, keys %shell);
|
||||
$sh = $shell{$sh};
|
||||
local($u_id, $g_id) = &next_id($name);
|
||||
print <<EOF;
|
||||
|
||||
Name: $name
|
||||
Passwd: none, is empty
|
||||
Fullname: $fullname
|
||||
Uid: $u_id
|
||||
Gid: $g_id
|
||||
HOME: $home/$name
|
||||
Shell: $sh
|
||||
EOF
|
||||
if (&confirm_yn("Ok?", "yes")) {
|
||||
local($new_entry) =
|
||||
"$name::$u_id:$g_id::0:0:$fullname:$home/$name:$sh";
|
||||
|
||||
&append_file($passwd, $new_entry);
|
||||
|
||||
system("$pwd_mkdb $passwd");
|
||||
if ($?) {
|
||||
local($crash) = "$passwd.crash$$";
|
||||
warn "$pwd_mkdb failed, try to restore ...\n";
|
||||
|
||||
open(R, "> $crash") || die "Sorry, give up\n";
|
||||
$j = join("\n", @passwd_backup);
|
||||
$j =~ s/\n//;
|
||||
print R $j . "\n";
|
||||
close R;
|
||||
|
||||
system("$pwd_mkdb $crash");
|
||||
die "Sorry, give up\n" if $?;
|
||||
die "Successfully restore $passwd. Exit.\n";
|
||||
}
|
||||
# Add new group
|
||||
&append_file($group, "$name:*:$g_id:$name")
|
||||
unless $groupname{$name};
|
||||
|
||||
# update passwd/group variables
|
||||
push(@passwd_backup, $new_entry);
|
||||
$username{$name} = $u_id;
|
||||
$uid{$u_id} = $name;
|
||||
$pwgid{$g_id} = $name;
|
||||
$groupname{$name} = $g_id;
|
||||
$gid{$g_id} = $name;
|
||||
|
||||
print "Added user ``$name''\n";
|
||||
local($a) = &confirm_yn("Change password", $defaultpasswd);
|
||||
if (($a && $defaultpasswd) || (!$a && !$defaultpasswd)) {
|
||||
while(1) {
|
||||
system("passwd $name");
|
||||
last unless $?;
|
||||
last unless
|
||||
&confirm_yn("Passwd $name failed. Try again?", "yes");
|
||||
}
|
||||
}
|
||||
&home_create($name);
|
||||
}
|
||||
if (&confirm_yn("Continue with next user?", "yes")) {
|
||||
&new_users;
|
||||
} else {
|
||||
print "Good by.\n" if $verbose;
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# Group ID
|
||||
#
|
||||
|
||||
sub groupids {
|
||||
print "Please enter the group id or hit enter for the default id: ";
|
||||
chop ($groupid = <STDIN>);
|
||||
sub password_pref {
|
||||
$defaultpasswd = !&confirm_yn("Use empty passwords", "yes");
|
||||
}
|
||||
|
||||
&groupids;
|
||||
# misc
|
||||
sub check_root {
|
||||
die "You are not root!\n" if $<;
|
||||
}
|
||||
|
||||
while (!$groupid) {
|
||||
if ($defgroupid) {
|
||||
if (!$groupid) {
|
||||
$groupid = "$defgroupid";
|
||||
} else { &groupids; }
|
||||
} else { &groupids; }
|
||||
sub usage {
|
||||
warn <<USAGE;
|
||||
|
||||
usage: adduser [options]
|
||||
|
||||
OPTIONS:
|
||||
-help this help
|
||||
-silent opposite of verbose
|
||||
-verbose verbose
|
||||
-home home default HOME partition [$home]
|
||||
-shell shell default SHELL
|
||||
-dotdir dir copy files from dir, default $dotdir
|
||||
USAGE
|
||||
exit 1;
|
||||
}
|
||||
|
||||
#
|
||||
# User name
|
||||
#
|
||||
sub parse_arguments {
|
||||
local(@argv) = @_;
|
||||
|
||||
print "Please enter the user's name: ";
|
||||
chop ($username = <STDIN>);
|
||||
while ($_ = $argv[0], /^-/) {
|
||||
shift @argv;
|
||||
last if /^--$/;
|
||||
if (/^--?(debug|verbose)$/) { $verbose = 1 }
|
||||
elsif (/^--?(silent|guru|wizard)$/) { $verbose = 0 }
|
||||
elsif (/^--?(verbose)$/) { $verbose = 1 }
|
||||
elsif (/^--?(h|help|\?)$/) { &usage }
|
||||
elsif (/^--?(home)$/) { $home = $argv[0]; shift @argv }
|
||||
elsif (/^--?(shell)$/) { $shell = $argv[0]; shift @argv }
|
||||
elsif (/^--?(dotdir)$/) { $dotdir = $argv[0]; shift @argv }
|
||||
elsif (/^--?(batch)$/) { $batch = 1; }
|
||||
else { &usage }
|
||||
}
|
||||
#&usage if $#argv < 0;
|
||||
}
|
||||
|
||||
#
|
||||
# Home directory
|
||||
#
|
||||
|
||||
print "Please enter the users home directory or hit enter for default: ";
|
||||
chop ($userdir = <STDIN>);
|
||||
|
||||
if (!$userdir) {
|
||||
$userdir = "$defusrdir\/$userlogin";
|
||||
print "$userdir\n";
|
||||
sub basename {
|
||||
local($name) = @_;
|
||||
$name =~ s|.*/||;
|
||||
return $name;
|
||||
}
|
||||
|
||||
#
|
||||
# Login Shell
|
||||
#
|
||||
sub home_create {
|
||||
local($name) = @_;
|
||||
local(@list);
|
||||
local($e,$from, $to);
|
||||
|
||||
print "Please enter the users login shell or hit enter for default: ";
|
||||
chop ($usershell = <STDIN>);
|
||||
|
||||
if (!$usershell) {
|
||||
$usershell = "$userdefshell";
|
||||
print "$usershell\n";
|
||||
print "Create HOME directory\n";
|
||||
if(!mkdir("$home/$name", 0755)) {
|
||||
warn "Cannot create HOME directory for $name: $!\n";
|
||||
return 0;
|
||||
}
|
||||
push(@list, "$home/$name");
|
||||
if ($dotdir) {
|
||||
opendir(D, "$dotdir") || warn "$dotdir: $!\n";
|
||||
foreach $from (readdir(D)) {
|
||||
if ($from !~ /^(\.|\.\.)$/) {
|
||||
$to = $from;
|
||||
$to =~ s/^dot\././;
|
||||
$to = "$home/$name/$to";
|
||||
push(@list, $to);
|
||||
&cp("$dotdir/$from", "$to", 1);
|
||||
}
|
||||
}
|
||||
closedir D;
|
||||
}
|
||||
#warn "Chown: $name, $name, @list\n";
|
||||
#chown in perl does not work
|
||||
system("chown $name:$name @list") || warn "$!\n" && return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
#
|
||||
# Create password file entry
|
||||
#
|
||||
# makes a directory hierarchy
|
||||
sub mkdirhier {
|
||||
local($dir) = @_;
|
||||
|
||||
print "Opening and locking passwd file in blocking mode.\n";
|
||||
open (PASS, '>>/etc/master.passwd');
|
||||
flock (PASS, 2) || die "Can't lock passwd file, must be in use!!\n";
|
||||
print (PASS "$userlogin::$userid:$groupid::0:0:$username,,,:$userdir:$usershell\n");
|
||||
print "Unlocking and closing password file\n";
|
||||
flock (PASS,8);
|
||||
close PASS;
|
||||
print "Re-indexing password databases\n";
|
||||
system 'pwd_mkdb -p /etc/master.passwd';
|
||||
system "passwd $userlogin";
|
||||
|
||||
#
|
||||
# Create user directory
|
||||
#
|
||||
print "Creating user directory\n";
|
||||
if (! -e $defusrdir) {
|
||||
system "mkdir -p $defusrdir\/$userdir";
|
||||
} else {
|
||||
system "mkdir $userdir";
|
||||
if ($dir =~ "^/[^/]+$") {
|
||||
print "Create /usr/$dir\n" if $verbose;
|
||||
if (!mkdir("/usr$dir", 0755)) {
|
||||
warn "/usr/$dir: $!\n"; return 0;
|
||||
}
|
||||
print "Create symlink: /usr$dir -> $dir\n" if $verbose;
|
||||
if (!symlink("/usr$dir", $dir)) {
|
||||
warn "$dir: $!\n"; return 0;
|
||||
}
|
||||
} else {
|
||||
local($d,$p);
|
||||
foreach $d (split('/', $dir)) {
|
||||
$dir = "$p/$d";
|
||||
$dir =~ s|^//|/|;
|
||||
if (! -e "$dir") {
|
||||
print "Create $dir\n" if $verbose;
|
||||
if (!mkdir("$dir", 0755)) {
|
||||
warn "$dir: $!\n"; return 0;
|
||||
}
|
||||
}
|
||||
$p .= "/$d";
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
print "Copying user shell files\n";
|
||||
system "cp $skel_location\/dot.login $userdir\/\.login";
|
||||
system "cp $skel_location\/dot.profile $userdir\/\.profile";
|
||||
# Read one of the elements from @list. $confirm is default.
|
||||
# If !$allow accept only elements from @list.
|
||||
sub confirm_list {
|
||||
local($message, $allow, $confirm, @list) = @_;
|
||||
local($read, $c);
|
||||
|
||||
if ($usershell eq "\/bin\/csh" || $usershell eq "\/usr\/local\/bin\/tcsh")
|
||||
{
|
||||
system "cp $skel_location\/dot.cshrc $userdir\/.cshrc";
|
||||
}
|
||||
system "chmod -R 664 $userdir";
|
||||
system "chown -R $userid.$groupid $userdir";
|
||||
print "$message " if $message;
|
||||
print "@list [$confirm]: ";
|
||||
chop($read = <STDIN>);
|
||||
$read =~ s/^[ \t]*//;
|
||||
$read =~ s/[ \t\n]*$//;
|
||||
return $confirm unless $read;
|
||||
return $read if $allow;
|
||||
|
||||
foreach $c (@list) {
|
||||
return $read if $c eq $read;
|
||||
}
|
||||
warn "$read: is not allowed!\n";
|
||||
return &confirm_list($message, $allow, $confirm, @list);
|
||||
}
|
||||
|
||||
# YES or NO question
|
||||
# $confirm => 'y' or 'n'. Return true if answer 'y' (or 'n')
|
||||
sub confirm_yn {
|
||||
local($message, $confirm) = @_;
|
||||
local($yes) = "^(yes|YES|y|Y)$";
|
||||
local($no) = "^(no|NO|n|N)$";
|
||||
local($read, $c);
|
||||
|
||||
if ($confirm && ($confirm =~ "$yes" || $confirm == 1)) {
|
||||
$confirm = "y";
|
||||
} else {
|
||||
$confirm = "n";
|
||||
}
|
||||
print "$message (y/n) [$confirm]: ";
|
||||
chop($read = <STDIN>);
|
||||
$read =~ s/^[ \t]*//;
|
||||
$read =~ s/[ \t\n]*$//;
|
||||
return 1 unless $read;
|
||||
|
||||
if (($confirm eq "y" && $read =~ "$yes") ||
|
||||
($confirm eq "n" && $read =~ "$no")) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ($read !~ "$yes" && $read !~ "$no") {
|
||||
warn "Wrong value. Enter again!\a\n";
|
||||
return &confirm_yn($message, $confirm);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
# test if $dotdir exist
|
||||
sub dotdir_check {
|
||||
return 1 if -e $dotdir && -r _ && (-d _ || -l $dotdir);
|
||||
warn "Directory: $dotdir does not exist or unreadable. " .
|
||||
"Cannot copy dotfiles!\n";
|
||||
$dotdir = '';
|
||||
return 0;
|
||||
}
|
||||
|
||||
# write @list to $file with file-locking
|
||||
sub append_file {
|
||||
local($file,@list) = @_;
|
||||
local($e);
|
||||
local($LOCK_EX) = 2;
|
||||
local($LOCK_UN) = 8;
|
||||
|
||||
open(F, ">> $file") || die "$file: $!\n";
|
||||
print "Lock $file.\n" if $verbose > 1;
|
||||
flock(F, $LOCK_EX);
|
||||
print F join("\n", @list) . "\n";
|
||||
close F;
|
||||
print "Unlock $file.\n" if $verbose > 1;
|
||||
flock(F, $LOCK_UN);
|
||||
}
|
||||
|
||||
# return free uid+gid
|
||||
# uid == gid if possible
|
||||
sub next_id {
|
||||
local($group) = @_;
|
||||
|
||||
# looking for next free uid
|
||||
while($uid{$uid_start}) {
|
||||
$uid_start++;
|
||||
print "$uid_start\n" if $verbose > 1;
|
||||
}
|
||||
|
||||
local($gid_start) = $uid_start;
|
||||
# group for user (username==groupname) already exist
|
||||
if ($groupname{$group}) {
|
||||
$gid_start = $groupname{$group};
|
||||
}
|
||||
# gid is in use, looking for another gid.
|
||||
# Note: uid an gid are not equal
|
||||
elsif ($gid{$uid_start}) {
|
||||
while($gid{$gid_start} || $uid{$gid_start}) {
|
||||
$gid_start--;
|
||||
$gid_start = $uid_end if $gid_start < 100;
|
||||
}
|
||||
}
|
||||
return ($uid_start, $gid_start);
|
||||
}
|
||||
|
||||
sub cp {
|
||||
local($from, $to, $tilde) = @_;
|
||||
|
||||
if (-e "$to") {
|
||||
warn "cp: ``$to'' already exist, do not overwrite\n"; return 0;
|
||||
} elsif (!(-f $from || -l $from)) {
|
||||
warn "$from is not a file or symlink!\n"; return 0;
|
||||
} elsif (!open(F, "$from")) {
|
||||
warn "$from: $!\n"; return 0;
|
||||
} elsif (!open(T, "> $to")) {
|
||||
warn "$to: $!\n"; return 0;
|
||||
}
|
||||
|
||||
if ($tilde) {
|
||||
$tilde = $to;
|
||||
$tilde =~ s|.*/([^/]+/[^/]+)$|~$1|;
|
||||
} else {
|
||||
$tilde = $to;
|
||||
}
|
||||
print "copy $from to $tilde\n" if $verbose;
|
||||
while(<F>) {
|
||||
print T $_;
|
||||
}
|
||||
|
||||
close F;
|
||||
close T;
|
||||
return 1;
|
||||
}
|
||||
|
||||
################
|
||||
# main
|
||||
#
|
||||
# Print out information used in creation of this account
|
||||
#
|
||||
print "\n\n";
|
||||
print "Information used to create this account follows.\n";
|
||||
&check_root; # You must be root to run this script!
|
||||
&variables; # initialize variables
|
||||
&parse_arguments(@ARGV); # parse arguments
|
||||
|
||||
&passwd_check; # check for valid passwdb
|
||||
&passwd_read; # read /etc/master.passwd
|
||||
&group_read; # read /etc/group
|
||||
&group_check; # check for incon*
|
||||
&dotdir_check; # check $dotdir
|
||||
print "\n";
|
||||
print "Login Name: $userlogin\n";
|
||||
print "UserId: $userid\n";
|
||||
print "GroupId: $groupid\n";
|
||||
print "UserName: $username\n";
|
||||
print "HomeDir: $userdir\n";
|
||||
print "Shell: $usershell\n";
|
||||
print "\nDONE\n\n";
|
||||
&home_partition; # find HOME partition
|
||||
&shells_read; # read /etc/shells
|
||||
&shells_add; # maybe add some new shells
|
||||
&shells_pref; # enter default shell
|
||||
&password_pref; # maybe use password
|
||||
|
||||
&new_users; # add new users
|
||||
|
||||
#end
|
||||
|
|
Loading…
Reference in a new issue