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 )