Author: fapeeler
Date: Fri May  4 17:05:03 2012
New Revision: 1334062

URL: http://svn.apache.org/viewvc?rev=1334062&view=rev
Log:
VCL-580

Fedora 16 (systemd) support

- fixed issue with rc.local.service file
- fixed issue with shutdown -h now ssh return code 


Modified:
    incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm

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=1334062&r1=1334061&r2=1334062&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm Fri May  4 
17:05:03 2012
@@ -2087,22 +2087,11 @@ sub generate_rc_local {
        
        # If systemd managed; confirm rc-local.service is enabled
        if($self->file_exists("/bin/systemctl") ) {
-               my $systemctl_command = "systemctl enable rc-local.service";
-               my ($systemctl_exit_status, $systemctl_output) = 
$self->execute($systemctl_command, 1);
-       if (!defined($systemctl_output)) {
-                       notify($ERRORS{'WARNING'}, 0, "failed to run 
$systemctl_command on node $computer_node_name");
-       }
-                       else {
-               notify($ERRORS{'OK'}, 0, "successfully ran $systemctl_command 
on $computer_node_name \n" . join("\n", @$systemctl_output));
-                               #Start rc-local.service
-                               if($self->start_service("rc-local")) {
-                                       notify($ERRORS{'OK'}, 0, "started 
rc-local.service on $computer_node_name");
-                               }
-                               else {
-                                       notify($ERRORS{'OK'}, 0, "failed to 
start rc-local.service on $computer_node_name");
-                                       return 0
-                               }
-                       }
+               
+               if(!$self->generate_rc_local_systemd() ) {
+                       return 0;
+               }
+               
        }
        else {
                #Re-run rc.local
@@ -2416,6 +2405,85 @@ sub generate_ext_sshd_sysVinit {
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 generate_rc_local_systemd
+
+ Parameters  : none
+ Returns     : boolean
+ Description : If OS is using systemd, create and enable rc_local.service file
+
+=cut
+
+sub generate_rc_local_systemd {
+   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 0;
+   }
+   
+   my $computer_short_name      = $self->data->get_computer_short_name();
+   my $computer_node_name       = $self->data->get_computer_node_name();
+   my $request_id               = $self->data->get_request_id();
+   my $management_node_keys  = $self->data->get_management_node_keys();
+
+   my $tmpfile = "/tmp/$request_id.rc-local.service";
+   my @array2print;
+
+   push(@array2print, '[Unit]' . "\n");
+   push(@array2print, 'Description=rc.local Compatibility' . "\n");
+   push(@array2print, 'After=network.target' . "\n");
+   push(@array2print, "\n");
+   push(@array2print, '[Service]' . "\n");
+   push(@array2print, 'Type=forking' . "\n");
+   push(@array2print, 'ExecStart=/etc/rc.d/rc.local' . "\n");
+   push(@array2print, 'StandardOutput=tty' . "\n");
+   push(@array2print, 'RemainAfterExit=yes' . "\n");
+   push(@array2print, 'SysVStartPriority=99' . "\n");
+   push(@array2print, "\n");
+   push(@array2print, '[Install]' . "\n");
+   push(@array2print, 'WantedBy=multi-user.target' . "\n");
+   
+   #save to file
+   if(open(WRITEFILE,">$tmpfile")){
+      print WRITEFILE @array2print;
+      close(WRITEFILE);
+   }
+
+       #copy temp file to node
+   if (run_scp_command($tmpfile, 
"$computer_node_name:/lib/systemd/system/rc-local.service", 
$management_node_keys)) {
+      notify($ERRORS{'DEBUG'}, 0, "copied $tmpfile to 
$computer_node_name:/lib/systemd/system/rc-local.service");
+   }
+   else{
+      notify($ERRORS{'WARNING'}, 0, "failed to copied $tmpfile to 
$computer_node_name:/lib/systemd/system/rc-local.service");
+      return 0;
+   }
+   
+   #Enable ext_sshd.service
+   my $systemctl_command = "systemctl enable rc-local.service";
+   my ($systemctl_exit_status, $systemctl_output) = 
$self->execute($systemctl_command, 1);
+   if (!defined($systemctl_output)) {
+       notify($ERRORS{'WARNING'}, 0, "failed to run $systemctl_command on node 
$computer_node_name");
+   }
+  else {
+       notify($ERRORS{'OK'}, 0, "successfully ran $systemctl_command on 
$computer_node_name \n" . join("\n", @$systemctl_output));
+   }
+
+       #Start rc-local.service
+       if($self->start_service("rc-local")) {
+               notify($ERRORS{'OK'}, 0, "started rc-local.service on 
$computer_node_name");
+       }  
+       else {
+               notify($ERRORS{'OK'}, 0, "failed to start rc-local.service on 
$computer_node_name");
+       }  
+
+   #delete local tmpfile
+   unlink($tmpfile);
+
+   return 1;
+
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 =head2 activate_interfaces
 
  Parameters  : none
@@ -2717,25 +2785,23 @@ sub shutdown {
        if ($self->wait_for_ssh(0)) {
                my $command = '/sbin/shutdown -h now';
                
-               my ($exit_status, $output) = $self->execute($command);
+               my ($exit_status, $output) = $self->execute({command => 
$command, timeout => 90, ignore_error => 1});
                
-               if (defined $exit_status && $exit_status == 0) {
-                       notify($ERRORS{'DEBUG'}, 0, "executed command to shut 
down $computer_node_name");
-               }
-               else {
-                       if (!defined($output)) {
-                               notify($ERRORS{'WARNING'}, 0, "failed to 
execute command to shut down $computer_node_name, attempting power off");
-                       }
-                       else {
-                               notify($ERRORS{'WARNING'}, 0, "failed to shut 
down $computer_node_name, attempting power off, output:\n" . join("\n", 
@$output));
-                       }
-                       
+               # Wait maximum of 5 minutes for computer to power off
+       my $power_off = $self->provisioner->wait_for_power_off(300);
+       if (!defined($power_off)) {
+       # wait_for_power_off result will be undefined if the provisioning 
module doesn't implement a power_status subroutine
+       notify($ERRORS{'OK'}, 0, "unable to determine power status of 
$computer_node_name from provisioning module, sleeping 1 minute to allow 
computer time to shutdown");
+       sleep 60;
+       }
+       elsif (!$power_off) {
+       notify($ERRORS{'WARNING'}, 0, "$computer_node_name never powered off");
                        # Call provisioning module's power_off() subroutine
                        if (!$self->provisioner->power_off()) {
                                notify($ERRORS{'WARNING'}, 0, "failed to shut 
down $computer_node_name, failed to initiate power off");
                                return;
                        }
-               }
+       }
        }
        else {
                notify($ERRORS{'DEBUG'}, 0, "$computer_node_name is not 
responding to SSH, attempting power off");


Reply via email to