Doit
view release on metacpan or search on metacpan
lib/Doit/User.pm view on Meta::CPAN
# push @args, '--gid', $uid; # XXX what if uid should be != gid?
#}
if (defined $home &&
(
(defined $got_home && $got_home ne $home)
|| (!defined $got_home)
)
) {
push @args, ($^O eq 'linux' ? ('--home', $home, ($cmd eq 'usermod' ? '--move-home' : '--create-home')) :
$^O eq 'freebsd' ? ('-d', $home, '-m') :
error "NYI");
} elsif ($cmd eq 'useradd') {
push @args, ($^O eq 'linux' ? ($cmd eq 'usermod' ? '--move-home' : '--create-home') :
$^O eq 'freebsd' ? ('-m') :
error "NYI");
}
if (defined $shell &&
(
(defined $got_shell && $got_shell ne $shell)
|| (!defined $got_shell)
)
) {
push @args, ($^O eq 'linux' ? '--shell' :
$^O eq 'freebsd' ? '-s' :
error "NYI"), $shell;
}
if (@groups) {
my @got_groups = sort _get_user_groups($username);
my @want_groups = sort @groups;
if ("@want_groups" ne "@got_groups") {
push @args, ($^O eq 'linux' ? '--groups' :
$^O eq 'freebsd' ? '-G' :
error "NYI"), join(",", @groups);
}
}
if ($cmd eq 'useradd' || @args) {
local $ENV{PATH} = "/usr/sbin:$ENV{PATH}";
if ($^O eq 'linux') {
$self->system($cmd, @args, $username);
} elsif ($^O eq 'freebsd') {
$self->system('pw', $cmd, @args, '-n', $username);
}
}
if (!$self->is_dry_run) {
($got_username, $got_passwd, $got_uid, $got_gid, $got_quota,
$got_comment, $got_gcos, $got_home, $got_shell, $got_expire) = getpwnam($username);
if (!defined $got_username) {
error "Something went wrong: $cmd did not fail, but user '$username' does not exist";
}
} else {
if (defined $home) {
$got_home = $home;
} else {
$got_home = "/home/$username";
}
}
if (@ssh_keys) {
$self->mkdir("$got_home/.ssh");
$self->chmod(0700, "$got_home/.ssh");
$self->chown($username, $username, "$got_home/.ssh");
$self->create_file_if_nonexisting("$got_home/.ssh/authorized_keys");
$self->chmod(0600, "$got_home/.ssh/authorized_keys");
$self->chown($username, $username, "$got_home/.ssh/authorized_keys");
$self->change_file("$got_home/.ssh/authorized_keys",
(map { +{ add_if_missing => $_ } } @ssh_keys),
);
}
}
}
sub user_add_user_to_group {
my($self, %opts) = @_;
my $username = delete $opts{username};
if (!defined $username) { error "username is mandatory" }
my $group = delete $opts{group};
if (!defined $group) { error "group is mandatory" }
my %user_groups = map{($_,1)} _get_user_groups($username);
my $changes = 0;
if (!$user_groups{$group}) {
if ($^O eq 'linux') {
$self->system('usermod', '--append', '--groups', $group, $username);
$changes = 1;
} elsif ($^O eq 'freebsd') {
$self->system('pw', 'groupmod', '-m', $username, '-n', $group);
$changes = 1;
} else {
error "user_add_user_to_group NYI for $^O";
}
}
$changes;
}
sub _get_user_groups {
my $username = shift;
my @groups;
require POSIX;
require List::Util;
while (my($gname,undef,undef,$members) = getgrent) {
next if $gname eq $username; # don't deal with primary groups
if (List::Util::first(sub { $_ eq $username }, split /\s+/, $members)) {
push @groups, $gname;
}
}
endgrent;
@groups;
}
1;
__END__
( run in 0.879 second using v1.01-cache-2.11-cpan-39bf76dae61 )