in managementnode/lib/VCL/Module/OS/Linux.pm [2854:2962]
sub create_user {
my $self = shift;
if (ref($self) !~ /linux/i) {
notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method");
return;
}
my $computer_node_name = $self->data->get_computer_node_name();
my $user_parameters = shift;
if (!$user_parameters) {
notify($ERRORS{'WARNING'}, 0, "unable to create user, user parameters argument was not provided");
return;
}
elsif (!ref($user_parameters) || ref($user_parameters) ne 'HASH') {
notify($ERRORS{'WARNING'}, 0, "unable to create user, argument provided is not a hash reference");
return;
}
my $username = $user_parameters->{username};
if (!defined($username)) {
notify($ERRORS{'WARNING'}, 0, "failed to create user on $computer_node_name, argument hash does not contain a 'username' key:\n" . format_data($user_parameters));
return;
}
my $root_access = $user_parameters->{root_access};
if (!defined($root_access)) {
notify($ERRORS{'WARNING'}, 0, "failed to create user on $computer_node_name, argument hash does not contain a 'root_access' key:\n" . format_data($user_parameters));
return;
}
my $password = $user_parameters->{password};
my $uid = $user_parameters->{uid};
my $ssh_public_keys = $user_parameters->{ssh_public_keys};
# If user account does not already exist - create it, then
# -- Set password if using local authentication
# -- update sudoers file if root access allowed
# -- process connect_methods_access
if (!$self->user_exists($username)) {
notify($ERRORS{'DEBUG'}, 0, "creating user on $computer_node_name:\n" .
"username: $username\n" .
"password: " . (defined($password) ? $password : '<not set>') . "\n" .
"UID: " . ($uid ? $uid : '<not set>') . "\n" .
"root access: " . ($root_access ? 'yes' : 'no') . "\n" .
"SSH public keys: " . (defined($ssh_public_keys) ? $ssh_public_keys : '<not set>')
);
my $home_directory_root = "/home";
my $home_directory_path = "$home_directory_root/$username";
my $home_directory_on_local_disk = $self->is_file_on_local_disk($home_directory_root);
if ($home_directory_on_local_disk) {
my $useradd_command = "/usr/sbin/useradd -s /bin/bash -m -d /home/$username -g vcl";
$useradd_command .= " -u $uid" if ($uid);
$useradd_command .= " $username";
my ($useradd_exit_status, $useradd_output) = $self->execute($useradd_command);
if (!defined($useradd_output)) {
notify($ERRORS{'WARNING'}, 0, "failed to execute command to add user '$username' to $computer_node_name: '$useradd_command'");
return;
}
elsif (grep(/^useradd: /, @$useradd_output)) {
notify($ERRORS{'WARNING'}, 0, "warning detected on add user '$username' to $computer_node_name\ncommand: '$useradd_command'\noutput:\n" . join("\n", @$useradd_output));
}
else {
notify($ERRORS{'OK'}, 0, "added user '$username' to $computer_node_name, output:" . (scalar(@$useradd_output) ? "\n" . join("\n", @$useradd_output) : ' <none>'));
}
}
else {
notify($ERRORS{'OK'}, 0, "$home_directory_path is NOT on local disk, skipping useradd attempt");
}
}
# Set the password
if ($password) {
# Set password
if (!$self->set_password($username, $password)) {
notify($ERRORS{'CRITICAL'}, 0, "failed to set password of user '$username' on $computer_node_name");
return;
}
}
# Process connect_methods
if ($self->can("grant_connect_method_access")) {
if (!$self->grant_connect_method_access({
username => $username,
uid => $uid,
ssh_public_keys => $ssh_public_keys,
})) {
notify($ERRORS{'WARNING'}, 0, "failed to process grant_connect_method_access for $username");
}
}
# Add user to sudoers if necessary
if ($root_access) {
if (!$self->grant_administrative_access($username)) {
notify($ERRORS{'WARNING'}, 0, "failed to process grant_administrative_access for $username");
return;
}
}
else {
# Make sure user does not have root access
$self->revoke_administrative_access($username);
}
return 1;
} ## end sub create_user