Author: fapeeler
Date: Wed Jun 22 19:07:53 2011
New Revision: 1138586
URL: http://svn.apache.org/viewvc?rev=1138586&view=rev
Log:
VCL-463
Ongoing work on server request. This portion is code related to
adding a group of users.
Modified:
incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm
incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm
incubator/vcl/trunk/managementnode/lib/VCL/healthcheck.pm
incubator/vcl/trunk/managementnode/lib/VCL/reserved.pm
incubator/vcl/trunk/managementnode/lib/VCL/utils.pm
Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm
URL:
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm?rev=1138586&r1=1138585&r2=1138586&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS.pm Wed Jun 22 19:07:53
2011
@@ -1661,6 +1661,113 @@ sub get_os_type {
#/////////////////////////////////////////////////////////////////////////////
+sub manage_server_access {
+
+ my $self = shift;
+ if (ref($self) !~ /VCL::Module/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() ||
return;
+ my $reservation_id = $self->data->get_reservation_id();
+ my $server_request_id = $self->data->get_server_request_id();
+ my $server_request_admingroupid =
$self->data->get_server_request_admingroupid();
+ my $server_request_logingroupid =
$self->data->get_server_request_logingroupid();
+
+ #Build list of users.
+ #If in admin group set admin flag
+ #If in both login and admin group, only use admin setting
+ #Check if user is in reserverationaccounts table, add user if needed
+ #Check if user exists on server, add if needed
+
+ my @userlist_admin;
+ my @userlist_login;
+ my %user_hash;
+
+ if ( $server_request_admingroupid ) {
+ @userlist_admin =
getusergroupmembers($server_request_admingroupid);
+ }
+ if ( $server_request_logingroupid ) {
+ @userlist_login =
getusergroupmembers($server_request_logingroupid);
+ }
+
+ if ( scalar @userlist_admin > 0 ) {
+ foreach my $str (@userlist_admin) {
+ my ($username,$uid,$vcl_user_id) = split(/:/, $str);
+ $user_hash{$uid}{"username"} = $username;
+ $user_hash{$uid}{"uid"} = $uid;
+ $user_hash{$uid}{"vcl_user_id"} = $vcl_user_id;
+ $user_hash{$uid}{"rootaccess"} = 1;
+ }
+ }
+ if ( scalar @userlist_login > 0 ) {
+ foreach my $str (@userlist_admin) {
+ my ($username, $uid,$vcl_user_id) = split(/:/, $str);
+ if (!exists($user_hash{$uid})) {
+ $user_hash{$uid}{"username"} = $username;
+ $user_hash{$uid}{"uid"} = $uid;
+ $user_hash{$uid}{"vcl_user_id"} = $vcl_user_id;
+ $user_hash{$uid}{"rootaccess"} = 0;
+ }
+ else {
+ notify($ERRORS{'OK'}, 0, "$uid for $username
exists in user_hash, skipping");
+ }
+ }
+ }
+
+ #Collect users in reservationaccounts table
+ my %res_accounts = get_reservation_accounts($reservation_id);
+ my $not_standalone_list = "";
+ my $standalone = 0;
+ if(defined($ENV{management_node_info}{NOT_STANDALONE}) &&
$ENV{management_node_info}{NOT_STANDALONE}){
+ $not_standalone_list =
$ENV{management_node_info}{NOT_STANDALONE};
+ }
+
+ foreach my $userid (sort keys %user_hash) {
+ next if (!($userid));
+ if(!exists($res_accounts{$userid})){
+ #check affiliation
+ my $affiliation_name = get_user_affiliation($userid);
+ if(!(grep(/$affiliation_name/, split(/,/,
$not_standalone_list) ))) {
+ $standalone = 1;
+ }
+
+ #IF standalone - generate password
+ if($standalone) {
+ $user_hash{$userid}{"passwd"} = getpw();
+ }
+ else {
+ $user_hash{$userid}{"passwd"} = 0;
+ }
+
+ if
(!(update_reservation_accounts($reservation_id,$user_hash{$userid}{vcl_user_id},$user_hash{$userid}{passwd})))
{
+ notify($ERRORS{'WARNING'}, 0, "Failed to insert
$reservation_id,$user_hash{$userid}{vcl_user_id},$user_hash{$userid}{passwd}
into reservationsaccounts table");
+
+ }
+
+ # Create user on the OS
+
if($self->OS->create_user($user_hash{$userid}{username},$user_hash{passwd},$user_hash{$userid}{uid},$user_hash{$userid}{rootaccess},$standalone))
{
+ notify($ERRORS{'OK'}, 0, "Successfully created
user $user_hash{$userid}{username} on $computer_node_name");
+ }
+ else {
+ notify($ERRORS{'WARNING'}, 0, "Failed to create
user on $computer_node_name ");
+ }
+
+
+ }
+ else {
+ notify($ERRORS{'WARNING'}, 0, "$userid exists in
reservationaccounts table, assuming it exists on OS");
+ }
+
+ }
+
+ return 1;
+
+}
+
+#///////////////////////////////////////////////////////////////////////////
+
1;
__END__
Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm
URL:
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm?rev=1138586&r1=1138585&r2=1138586&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm Wed Jun 22
19:07:53 2011
@@ -823,70 +823,17 @@ sub reserve {
my $computer_node_name = $self->data->get_computer_node_name();
my $image_identity = $self->data->get_image_identity;
my $imagemeta_rootaccess = $self->data->get_imagemeta_rootaccess();
- my $user_standalone = $self->data->get_user_standalone();
- my $user_uid = $self->data->get_user_uid();
+ my $user_uid = $self->data->get_user_uid();
if($self->add_vcl_usergroup()){
}
-
- my $useradd_string;
- if(defined($user_uid) && $user_uid != 0){
- $useradd_string = "/usr/sbin/useradd -u $user_uid -d
/home/$user_name -m $user_name -g vcl";
- }
- else{
- $useradd_string = "/usr/sbin/useradd -d /home/$user_name -m
$user_name -g vcl";
- }
-
-
- my @sshcmd = run_ssh_command($computer_node_name, $image_identity,
$useradd_string, "root");
- foreach my $l (@{$sshcmd[1]}) {
- if ($l =~ /$user_name exists/) {
- notify($ERRORS{'OK'}, 0, "detected user already has
account");
- if ($self->delete_user()) {
- notify($ERRORS{'OK'}, 0, "user has been deleted
from $computer_node_name");
- @sshcmd = run_ssh_command($computer_node_name,
$image_identity, $useradd_string, "root");
- }
- }
+
+ if (!$self->create_user()) {
+ notify($ERRORS{'CRITICAL'}, 0, "Failed to add user $user_name
to $computer_node_name");
+ return 0;
}
-
- if ($user_standalone) {
- notify($ERRORS{'DEBUG'}, 0, "Standalone user setting single-use
password");
- my $reservation_password =
$self->data->get_reservation_password();
-
- #Set password
- if ($self->changepasswd($computer_node_name, $user_name,
$reservation_password)) {
- notify($ERRORS{'OK'}, 0, "Successfully set password on
useracct: $user_name on $computer_node_name");
- }
- else {
- notify($ERRORS{'CRITICAL'}, 0, "Failed to set password
on useracct: $user_name on $computer_node_name");
- return 0;
- }
- } ## end if ($user_standalone)
-
-
- #Check image profile for allowed root access
- if ($imagemeta_rootaccess) {
- # Add to sudoers file
- #clear user from sudoers file to prevent dups
- my $clear_cmd = "sed -i -e \"/^$user_name .*/d\" /etc/sudoers";
- if (run_ssh_command($computer_node_name, $image_identity,
$clear_cmd, "root")) {
- notify($ERRORS{'DEBUG'}, 0, "cleared $user_name from
/etc/sudoers");
- }
- else {
- notify($ERRORS{'CRITICAL'}, 0, "failed to clear
$user_name from /etc/sudoers");
- }
- my $sudoers_cmd = "echo \"$user_name ALL= NOPASSWD: ALL\" >>
/etc/sudoers";
- if (run_ssh_command($computer_node_name, $image_identity,
$sudoers_cmd, "root")) {
- notify($ERRORS{'DEBUG'}, 0, "added $user_name to
/etc/sudoers");
- }
- else {
- notify($ERRORS{'CRITICAL'}, 0, "failed to add
$user_name to /etc/sudoers");
- }
- } ## end if ($imagemeta_rootaccess)
-
-
return 1;
} ## end sub reserve
@@ -2758,6 +2705,134 @@ sub reboot {
#/////////////////////////////////////////////////////////////////////////////
+=head2 create_user
+
+ Parameters : username,password,adminoverride(0,1,2),user_uid
+ Returns : 1
+ Description :
+
+=cut
+
+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 $management_node_keys = $self->data->get_management_node_keys();
+ my $computer_node_name = $self->data->get_computer_node_name();
+ my $user_standalone = $self->data->get_user_standalone();
+ my $imagemeta_rootaccess = $self->data->get_imagemeta_rootaccess();
+
+ # Attempt to get the username from the arguments
+ # If no argument was supplied, use the user specified in the
DataStructure
+ my $user_name = shift;
+ my $password = shift;
+ my $adminoverride = shift;
+ my $user_uid = shift;
+
+ if (!$user_name) {
+ $user_name = $self->data->get_user_login_id();
+ }
+ if (!$password) {
+ $password = $self->data->get_reservation_password();
+ }
+ if (!$adminoverride) {
+ $adminoverride = 0;
+ }
+ if (!$user_uid) {
+ $user_uid = $self->data->get_user_uid();
+ }
+
+ #adminoverride, if 0 use value from database for $imagemeta_rootaccess
+ # if 1 or 2 override database
+ # 1 - allow admin access, set $imagemeta_rootaccess=1
+ # 2 - disallow admin access, set $imagemeta_rootaccess=0
+ if ($adminoverride eq '1') {
+ $imagemeta_rootaccess = 1;
+ }
+ elsif ($adminoverride eq '2') {
+ $imagemeta_rootaccess = 0;
+ }
+ else {
+ #no override detected, do not change database value
+ }
+
+ my $useradd_string;
+ if(defined($user_uid) && $user_uid != 0){
+ $useradd_string = "/usr/sbin/useradd -u $user_uid -d
/home/$user_name -m $user_name -g vcl";
+ }
+ else{
+ $useradd_string = "/usr/sbin/useradd -d /home/$user_name -m
$user_name -g vcl";
+ }
+
+
+ my @sshcmd = run_ssh_command($computer_node_name,
$management_node_keys, $useradd_string, "root");
+ foreach my $l (@{$sshcmd[1]}) {
+ if ($l =~ /$user_name exists/) {
+ notify($ERRORS{'OK'}, 0, "detected user already has
account");
+ if ($self->delete_user()) {
+ notify($ERRORS{'OK'}, 0, "user has been
deleted from $computer_node_name");
+ @sshcmd = run_ssh_command($computer_node_name,
$management_node_keys, $useradd_string, "root");
+ }
+ }
+ }
+
+ if ($user_standalone) {
+ notify($ERRORS{'DEBUG'}, 0, "Standalone user setting
single-use password");
+
+ #Set password
+ if ($self->changepasswd($computer_node_name, $user_name,
$password)) {
+ notify($ERRORS{'OK'}, 0, "Successfully set password on
useracct: $user_name on $computer_node_name");
+ }
+ else {
+ notify($ERRORS{'CRITICAL'}, 0, "Failed to set password
on useracct: $user_name on $computer_node_name");
+ return 0;
+ }
+ } ## end if ($user_standalone)
+
+
+ #Check image profile for allowed root access
+ if ($imagemeta_rootaccess) {
+ # Add to sudoers file
+ #clear user from sudoers file to prevent dups
+ my $clear_cmd = "sed -i -e \"/^$user_name .*/d\" /etc/sudoers";
+ if (run_ssh_command($computer_node_name,
$management_node_keys, $clear_cmd, "root")) {
+ notify($ERRORS{'DEBUG'}, 0, "cleared $user_name from
/etc/sudoers");
+ }
+ else {
+ notify($ERRORS{'CRITICAL'}, 0, "failed to clear
$user_name from /etc/sudoers");
+ }
+ my $sudoers_cmd = "echo \"$user_name ALL= NOPASSWD: ALL\" >>
/etc/sudoers";
+ if (run_ssh_command($computer_node_name,
$management_node_keys, $sudoers_cmd, "root")) {
+ notify($ERRORS{'DEBUG'}, 0, "added $user_name to
/etc/sudoers");
+ }
+ else {
+ notify($ERRORS{'CRITICAL'}, 0, "failed to add
$user_name to /etc/sudoers");
+ }
+ } ## end if ($imagemeta_rootaccess)
+
+ return 1;
+} ## end sub create_user
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 update_server_access
+
+ Parameters :
+ Returns :
+ Description :
+
+=cut
+
+sub update_server_access {
+
+
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
1;
__END__
Modified: incubator/vcl/trunk/managementnode/lib/VCL/healthcheck.pm
URL:
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/healthcheck.pm?rev=1138586&r1=1138585&r2=1138586&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/healthcheck.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/healthcheck.pm Wed Jun 22
19:07:53 2011
@@ -67,6 +67,7 @@ use DBI;
#----------GLOBALS--------------
our $LOG = "/var/log/healthcheckvcl.log";
our $MYDBH;
+set_logfile_path($LOG);
#////////////////////////////////////////////////////////////////////////////////
Modified: incubator/vcl/trunk/managementnode/lib/VCL/reserved.pm
URL:
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/reserved.pm?rev=1138586&r1=1138585&r2=1138586&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/reserved.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/reserved.pm Wed Jun 22 19:07:53
2011
@@ -111,6 +111,9 @@ sub process {
my $imagemeta_checkuser = $self->data->get_imagemeta_checkuser();
my $reservation_count = $self->data->get_reservation_count();
my $imagemeta_usergroupid = $self->data->get_imagemeta_usergroupid();
+ my $server_request_id = $self->data->get_server_request_id();
+ my $server_request_admingroupid =
$self->data->get_server_request_admingroupid();
+ my $server_request_logingroupid =
$self->data->get_server_request_logingroupid();
# Update the log table, set the loaded time to now for this request
if (update_log_loaded_time($request_logid)) {
@@ -228,6 +231,20 @@ sub process {
notify($ERRORS{'DEBUG'}, 0, ref($self->os) .
"->post_reserve() not implemented by " . ref($self->os));
}
+ notify($ERRORS{'OK'}, 0, "server_request_id =
$server_request_id");
+
+ #IF server_request_id
+ if ($server_request_id) {
+ if($server_request_admingroupid ||
$server_request_logingroupid ) {
+ notify($ERRORS{'OK'}, 0, "calling " .
ref($self->os) . "::manage_server_access() subroutine");
+ if ($self->os->manage_server_access()) {
+ notify($ERRORS{'DEBUG'}, 0, "Added
users to server reservation");
+
+ }
+ }
+ }
+
+
} # close if defined remoteIP
elsif ($acknowledge_attempts < 180) {
Modified: incubator/vcl/trunk/managementnode/lib/VCL/utils.pm
URL:
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/utils.pm?rev=1138586&r1=1138585&r2=1138586&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/utils.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/utils.pm Wed Jun 22 19:07:53 2011
@@ -136,8 +136,10 @@ our @EXPORT = qw(
get_request_by_computerid
get_request_end
get_request_info
+ get_reservation_accounts
get_resource_groups
get_managable_resource_groups
+ get_user_affiliation
get_user_info
get_vmhost_info
getimagesize
@@ -212,6 +214,7 @@ our @EXPORT = qw(
update_preload_flag
update_request_password
update_request_state
+ update_reservation_accounts
update_reservation_lastcheck
update_sublog_ipaddress
write_currentimage_txt
@@ -2276,6 +2279,113 @@ sub is_request_imaging {
=head2 get_next_image_default
+ Parameters : $reservationid
+ Returns : userid,password,affiliation
+ Description : Used for server loads, provides list of users for group access
+
+=cut
+
+sub get_reservation_accounts {
+ my ($reservationid) = @_;
+ my ($calling_package, $calling_filename, $calling_line, $calling_sub)
= caller(0);
+
+ if (!defined($reservationid)) {
+ notify($ERRORS{'WARNING'}, 0, "$calling_sub $calling_package
missing mandatory variable: reservationid ");
+ return 0;
+ }
+
+ my $select_statement = "
+ SELECT DISTINCT
+ reservationaccounts.userid AS reservationaccounts_userid,
+ reservationaccounts.password AS reservationaccounts_password,
+ affiliation.name AS affiliation_name
+ FROM
+ reservationaccounts,
+ affiliation,
+ user
+ WHERE
+ user.id = reservationaccounts.userid AND
+ affiliation.id = user.affiliationid AND
+ reservationaccounts.reservationid = $reservationid
+ ";
+
+ # Call the database select subroutine
+ # This will return an array of one or more rows based on the select
statement
+ my @selected_rows = database_select($select_statement);
+
+ my @ret_array;
+ my %user_info;
+
+ # Check to make sure 1 or more rows were returned
+ if (scalar @selected_rows > 0) {
+ # It contains a hash
+ for (@selected_rows) {
+ my %reservation_acct= %{$_};
+ my $userid =
$reservation_acct{reservationaccounts_userid};
+ $user_info{$userid}{"userid"} = $userid;
+ $user_info{$userid}{"password"} =
$reservation_acct{reservationaccounts_password};
+ $user_info{$userid}{"affiliation"} =
$reservation_acct{affiliation_name};
+ }
+
+ return %user_info;
+
+ }
+
+ return ();
+
+}
+
+sub update_reservation_accounts {
+ my $resid = shift;
+ my $userid = shift;
+ my $password = shift;
+
+ if ( !$resid ) {
+ notify($ERRORS{'WARNING'}, 0, "resid argument was not
specified");
+ return;
+ }
+
+ if ( !$userid ) {
+ notify($ERRORS{'WARNING'}, 0, "userid argument was not
specified");
+ return;
+ }
+
+ if ( !$password ) {
+ $password = '';
+ }
+
+ my $insert_statement = "
+ INSERT INTO
+ reservationaccounts
+ (
+ reservationid,
+ userid,
+ password
+ )
+ VALUES
+ (
+ '$resid',
+ '$userid',
+ '$password'
+ )
+ ";
+
+ notify($ERRORS{'OK'}, 0, "$insert_statement");
+
+ if( database_execute($insert_statement) ) {
+ notify($ERRORS{'OK'}, 0, "inserted new reservationaccount info
$resid $userid");
+ return 1;
+ }
+ else {
+ return 0;
+ notify($ERRORS{'OK'}, 0, "failed to insert new
reservationaccount info $resid $userid");
+ }
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 get_next_image_default
+
Parameters : $computerid
Returns : imageid,imagerevisionid,imagename
Description : Looks for any upcoming reservations
@@ -4427,12 +4537,12 @@ sub get_request_info {
elsif ($key =~ /computerprovisioningmodule_/) {
$request_info{reservation}{$reservation_id}{computer}{provisioning}{module}{$original_key}
= $value;
}
- elsif ($key =~ /serverrequest_/) {
-
$request_info{reservation}{$reservation_id}{$original_key} = $value;
- }
else {
notify($ERRORS{'WARNING'}, 0, "unknown key
found in SQL data: $key");
}
+ if ($key =~ /serverrequest_/) {
+
$request_info{reservation}{$reservation_id}{serverrequest}{$original_key} =
$value;
+ }
} # Close foreach key in reservation row
} # Close loop through selected rows
@@ -4523,7 +4633,7 @@ sub get_request_info {
# Loop through all the reservations
foreach my $reservation_id (keys %{$request_info{reservation}}) {
-
+
# Set server request NULL values to 0
if
(defined($request_info{reservation}{$reservation_id}{serverrequest}{id})) {
@@ -7961,6 +8071,63 @@ EOF
#/////////////////////////////////////////////////////////////////////////////
+=head2 get_user_affiliation
+
+ Parameters : $user_id
+ Returns : scalar - affiliation name
+ Description :
+
+=cut
+
+sub get_user_affiliation {
+ my ($user_id) = shift;
+
+ if(!defined($user_id)){
+ notify($ERRORS{'WARNING'}, $LOGFILE, "user_id was not
supplied");
+ return 0;
+ }
+
+ my $select_statement = <<EOF;
+SELECT DISTINCT
+affiliation.name
+FROM
+user,
+affiliation
+WHERE
+affiliation.id = user.affiliationid AND
+user.id = $user_id
+EOF
+
+# Call the database select subroutine
+ # This will return an array of one or more rows based on the select
statement
+ my @selected_rows = database_select($select_statement);
+
+ # Check to make sure 1 row was returned
+ if (scalar @selected_rows == 0) {
+ notify($ERRORS{'WARNING'}, 0, "zero rows were returned from
database select");
+ return ();
+ }
+ elsif (scalar @selected_rows > 1) {
+ notify($ERRORS{'WARNING'}, 0, "" . scalar @selected_rows . "
rows were returned from database select");
+ return ();
+ }
+
+ # Get the single returned row
+ # It contains a hash
+
+ # Make sure we return undef if the column wasn't found
+ if (defined $selected_rows[0]{name}) {
+ my $name = $selected_rows[0]{name};
+ return $name;
+ }
+ else {
+ return undef;
+ }
+
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
=head2 get_group_name
Parameters : $group_id