You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vcl.apache.org by ar...@apache.org on 2014/12/19 22:45:40 UTC

svn commit: r1646885 - in /vcl/trunk/managementnode/lib/VCL: ./ Module/OS/ Module/OS/Linux/ Module/OS/Linux/firewall/ Module/OS/Linux/init/

Author: arkurth
Date: Fri Dec 19 21:45:40 2014
New Revision: 1646885

URL: http://svn.apache.org/r1646885
Log:
VCL-174
Fixed recusion problem with Linux init and firewall modules. They can't call $self->sub directly to access the OS. Instead, $self->os->sub must be called.

Added firewall.pm which iptables.pm inherits from.

Fixed recursion issue in utils.pm::get_computer_nathost_info if the computer and NAT host are the same computer.

Added:
    vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/firewall.pm   (with props)
Modified:
    vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm
    vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/firewall/iptables.pm
    vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init.pm
    vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init/SysV.pm
    vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init/Upstart.pm
    vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init/systemd.pm
    vcl/trunk/managementnode/lib/VCL/utils.pm

Modified: vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm?rev=1646885&r1=1646884&r2=1646885&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm Fri Dec 19 21:45:40 2014
@@ -164,7 +164,12 @@ sub get_init_modules {
 		# initialize will check the computer to determine if it contains the corresponding Linux init daemon installed
 		# If not installed, the constructor will return false
 		my $init;
-		eval { $init = ($init_perl_package)->new({data_structure => $self->data, os => $self, mn_os => $self->mn_os, base_package => ref($self)}) };
+		eval { $init = ($init_perl_package)->new({
+					data_structure => $self->data,
+					os => $self,
+					mn_os => $self->mn_os,
+					init_modules => $self->{init_modules},
+		}) };
 		if ($init) {
 			my @required_commands = eval "@" . $init_perl_package . "::REQUIRED_COMMANDS";
 			if ($EVAL_ERROR) {
@@ -269,7 +274,11 @@ sub firewall {
 		# Attempt to create the object
 		my $firewall_object;
 		eval {
-			$firewall_object = ($firewall_perl_package)->new({data_structure => $self->data, base_package => ref($self), os => $self->os})
+			$firewall_object = ($firewall_perl_package)->new({
+				data_structure => $self->data,
+				os => $self,
+				mn_os => $self->mn_os,
+			})
 		};
 		
 		if ($EVAL_ERROR) {
@@ -3158,11 +3167,11 @@ sub enable_service {
 	}
 	
 	my $init_module = ($self->get_init_modules())[$init_module_index];
-	if (!$init_module->can('_enable_service')) {
-		notify($ERRORS{'WARNING'}, 0, "unable to enable '$service_name' service on $computer_node_name, " . ref($init_module) . " module does not implement an '_enable_service' subroutine");
+	if (!$init_module->can('enable_service')) {
+		notify($ERRORS{'WARNING'}, 0, "unable to enable '$service_name' service on $computer_node_name, " . ref($init_module) . " module does not implement an 'enable_service' subroutine");
 		return;
 	}
-	return $init_module->_enable_service($service_name);
+	return $init_module->enable_service($service_name);
 }
 
 #/////////////////////////////////////////////////////////////////////////////
@@ -3197,11 +3206,11 @@ sub disable_service {
 	}
 	
 	my $init_module = ($self->get_init_modules())[$init_module_index];
-	if (!$init_module->can('_disable_service')) {
-		notify($ERRORS{'WARNING'}, 0, "unable to disable '$service_name' service on $computer_node_name, " . ref($init_module) . " module does not implement an '_disable_service' subroutine");
+	if (!$init_module->can('disable_service')) {
+		notify($ERRORS{'WARNING'}, 0, "unable to disable '$service_name' service on $computer_node_name, " . ref($init_module) . " module does not implement an 'disable_service' subroutine");
 		return;
 	}
-	return $init_module->_disable_service($service_name);
+	return $init_module->disable_service($service_name);
 }
 
 #/////////////////////////////////////////////////////////////////////////////

Added: vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/firewall.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/firewall.pm?rev=1646885&view=auto
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/firewall.pm (added)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/firewall.pm Fri Dec 19 21:45:40 2014
@@ -0,0 +1,69 @@
+#!/usr/bin/perl -w
+###############################################################################
+# $Id$
+###############################################################################
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+###############################################################################
+
+=head1 NAME
+
+VCL::Module::OS::Linux::firewall
+
+=head1 DESCRIPTION
+
+ This module is the parent class for the Linux firewall modules.
+
+=cut
+
+##############################################################################
+package VCL::Module::OS::Linux::firewall;
+
+# Specify the lib path using FindBin
+use FindBin;
+use lib "$FindBin::Bin/../../../..";
+
+# Configure inheritance
+# Do not inherit from OS.pm or Linux.pm - force the use of $self->os
+use base qw(VCL::Module);
+
+# Specify the version of this module
+our $VERSION = '2.3';
+
+# Specify the version of Perl to use
+use 5.008000;
+
+use strict;
+use warnings;
+use diagnostics;
+
+use VCL::utils;
+
+##############################################################################
+
+=head1 OBJECT METHODS
+
+=cut
+
+#/////////////////////////////////////////////////////////////////////////////
+
+1;
+__END__
+
+=head1 SEE ALSO
+
+L<http://cwiki.apache.org/VCL/>
+
+=cut

Propchange: vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/firewall.pm
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/firewall.pm
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Modified: vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/firewall/iptables.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/firewall/iptables.pm?rev=1646885&r1=1646884&r2=1646885&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/firewall/iptables.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/firewall/iptables.pm Fri Dec 19 21:45:40 2014
@@ -36,7 +36,7 @@ use FindBin;
 use lib "$FindBin::Bin/../../../../..";
 
 # Configure inheritance
-use base qw(VCL::Module::OS::Linux);
+use base qw(VCL::Module::OS::Linux::firewall);
 
 # Specify the version of this module
 our $VERSION = '2.3';
@@ -77,19 +77,11 @@ sub initialize {
 	
 	my $arguments = shift || {};
 	
-	# Check if base_package argument was specified
-	# This is necessary for ManagementNode OS objects to work
-	# Otherwise the base Linux.pm subroutines would be used instead of ManagementNode.pm
-	if (defined($arguments->{base_package})) {
-		notify($ERRORS{'DEBUG'}, 0, "overriding object package: " . $ISA[0] . " --> $arguments->{base_package}");
-		@ISA = ($arguments->{base_package});
-	}
-	
 	my $computer_name = $self->data->get_computer_hostname();
 	
 	notify($ERRORS{'DEBUG'}, 0, "initializing " . ref($self) . " object to control $computer_name");
 	
-	if (!$self->command_exists('iptables')) {
+	if (!$self->os->command_exists('iptables')) {
 		notify($ERRORS{'DEBUG'}, 0, ref($self) . " object not initialized to control $computer_name, iptables command does not exist");
 		return 0;
 	}
@@ -175,7 +167,7 @@ sub insert_rule {
 		}
 	}
 	
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command $computer_name: $command");
 		return;
@@ -277,7 +269,7 @@ sub delete_rule {
 		$command .= " -D $chain_name -t $table_name $specification";
 	}
 	
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command $computer_name: $command");
 		return;
@@ -323,7 +315,7 @@ sub create_chain {
 	my $computer_name = $self->data->get_computer_hostname();
 	
 	my $command = "/sbin/iptables --new-chain $chain_name --table $table_name";
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command $computer_name: $command");
 		return;
@@ -392,7 +384,7 @@ sub delete_chain {
 	}
 	
 	my $command = "/sbin/iptables --delete-chain $chain_name --table $table_name";
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command $computer_name: $command");
 		return;
@@ -495,7 +487,7 @@ sub flush_chain {
 	}
 	$command .= " --table $table_name";
 	
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command $computer_name: $command");
 		return;
@@ -543,7 +535,7 @@ sub get_table_info {
 	}
 	$command .= " --table $table_name";
 	
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command $computer_name: $command");
 		return;
@@ -611,7 +603,7 @@ sub configure_nat {
 	}
 	
 	# Enable IP port forwarding
-	if (!$self->enable_ip_forwarding()) {
+	if (!$self->os->enable_ip_forwarding()) {
 		notify($ERRORS{'WARNING'}, 0, "unable to configure NAT host $computer_name, failed to enable IP forwarding");
 		return;
 	}
@@ -644,7 +636,7 @@ sub configure_nat {
 	my $public_subnet_mask;
 	my $internal_subnet_mask;
 	
-	my $network_configuration = $self->get_network_configuration();
+	my $network_configuration = $self->os->get_network_configuration();
 	for my $interface_name (keys %$network_configuration) {
 		my @ip_addresses = keys %{$network_configuration->{$interface_name}{ip_address}};
 		
@@ -887,8 +879,8 @@ sub add_nat_port_forward {
 	
 	$protocol = lc($protocol);
 	
-	my $public_interface_name = $self->get_public_interface_name();
-	my $public_ip_address = $self->get_public_ip_address();
+	my $public_interface_name = $self->os->get_public_interface_name();
+	my $public_ip_address = $self->os->get_public_ip_address();
 	
 	if ($self->insert_rule({
 		'table' => 'nat',

Modified: vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init.pm?rev=1646885&r1=1646884&r2=1646885&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init.pm Fri Dec 19 21:45:40 2014
@@ -36,13 +36,12 @@ use FindBin;
 use lib "$FindBin::Bin/../../../..";
 
 # Configure inheritance
-use base qw(VCL::Module::OS::Linux);
+# Do not inherit from OS.pm or Linux.pm - force the use of $self->os
+use base qw(VCL::Module);
 
 # Specify the version of this module
 our $VERSION = '2.3';
 
-our @ISA;
-
 # Specify the version of Perl to use
 use 5.008000;
 
@@ -60,36 +59,6 @@ use VCL::utils;
 
 #/////////////////////////////////////////////////////////////////////////////
 
-=head2 initialize
-
- Parameters  : 
- Returns     : boolean
- Description : 
-
-=cut
-
-sub initialize {
-	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 $arguments = shift || {};
-	
-	# Check if base_package argument was specified
-	# This is necessary for ManagementNode OS objects to work
-	# Otherwise the base Linux.pm subroutines would be used instead of ManagementNode.pm
-	if (defined($arguments->{base_package})) {
-		notify($ERRORS{'DEBUG'}, 0, "overriding object package: " . $ISA[0] . " --> $arguments->{base_package}");
-		@ISA = ($arguments->{base_package});
-	}
-	
-	return 1;
-}
-
-#/////////////////////////////////////////////////////////////////////////////
-
 1;
 __END__
 

Modified: vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init/SysV.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init/SysV.pm?rev=1646885&r1=1646884&r2=1646885&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init/SysV.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init/SysV.pm Fri Dec 19 21:45:40 2014
@@ -112,7 +112,7 @@ sub get_service_names {
 	my $computer_node_name = $self->data->get_computer_node_name();
 	
 	my $command = "chkconfig --list";
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to list SysV services on $computer_node_name");
 		return;
@@ -132,7 +132,7 @@ sub get_service_names {
 
 #/////////////////////////////////////////////////////////////////////////////
 
-=head2 _enable_service
+=head2 enable_service
 
  Parameters  : $service_name
  Returns     : boolean
@@ -141,7 +141,7 @@ sub get_service_names {
 
 =cut
 
-sub _enable_service {
+sub enable_service {
 	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");
@@ -158,7 +158,7 @@ sub _enable_service {
 	
 	# Enable the service
 	my $command = "chkconfig $service_name on";
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to enable '$service_name' service on $computer_node_name: $command");
 		return;
@@ -181,7 +181,7 @@ sub _enable_service {
 
 #/////////////////////////////////////////////////////////////////////////////
 
-=head2 _disable_service
+=head2 disable_service
 
  Parameters  : $service_name
  Returns     : boolean
@@ -190,7 +190,7 @@ sub _enable_service {
 
 =cut
 
-sub _disable_service {
+sub disable_service {
 	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");
@@ -207,7 +207,7 @@ sub _disable_service {
 	
 	# Disable the service
 	my $command = "chkconfig $service_name off";
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to disable '$service_name' service on $computer_node_name: $command");
 		return;
@@ -255,7 +255,7 @@ sub service_enabled {
 	my $computer_node_name = $self->data->get_computer_node_name();
 	
 	my $command = "chkconfig --list $service_name";
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to determine if '$service_name' service is enabled on $computer_node_name: $command");
 		return;
@@ -309,7 +309,7 @@ sub service_running {
 	
 	# Enable the service
 	my $command = "service $service_name status";
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to determine if '$service_name' service is running on $computer_node_name: $command");
 		return;
@@ -364,7 +364,7 @@ sub add_service {
 	
 	# Add the service
 	my $command = "chkconfig --add $service_name";
-	my ($exit_status, $output) = $self->execute($command);
+	my ($exit_status, $output) = $self->os->execute($command);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to add '$service_name' service on $computer_node_name");
 		return;
@@ -408,7 +408,7 @@ sub delete_service {
 	
 	# Delete the service
 	my $command = "chkconfig --del $service_name";
-	my ($exit_status, $output) = $self->execute($command);
+	my ($exit_status, $output) = $self->os->execute($command);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to delete '$service_name' service on $computer_node_name");
 		return;
@@ -424,7 +424,7 @@ sub delete_service {
 	
 	# Delete the service configuration file
 	my $service_file_path = "/etc/rc.d/init.d/$service_name";
-	if (!$self->delete_file($service_file_path)) {
+	if (!$self->os->delete_file($service_file_path)) {
 		return;
 	}
 	
@@ -458,7 +458,7 @@ sub start_service {
 	my $computer_node_name = $self->data->get_computer_node_name();
 	
 	my $command = "service $service_name start";
-	my ($exit_status, $output) = $self->execute($command);
+	my ($exit_status, $output) = $self->os->execute($command);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to start '$service_name' service on $computer_node_name");
 		return;
@@ -503,7 +503,7 @@ sub stop_service {
 	my $computer_node_name = $self->data->get_computer_node_name();
 	
 	my $command = "service $service_name status ; service $service_name stop";
-	my ($exit_status, $output) = $self->execute($command);
+	my ($exit_status, $output) = $self->os->execute($command);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to stop '$service_name' service on $computer_node_name");
 		return;
@@ -553,7 +553,7 @@ sub restart_service {
 	my $computer_node_name = $self->data->get_computer_node_name();
 	
 	my $command = "service $service_name restart";
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to restart '$service_name' service on $computer_node_name");
 		return;
@@ -600,7 +600,7 @@ sub add_ext_sshd_service {
 	my $ext_sshd_config_file_path       = '/etc/ssh/external_sshd_config';
 	
 	# Get the contents of the sshd service startup file already on the computer
-	my @sshd_service_file_lines = $self->get_file_contents($sshd_service_file_path);
+	my @sshd_service_file_lines = $self->os->get_file_contents($sshd_service_file_path);
 	if (!@sshd_service_file_lines) {
 		notify($ERRORS{'WARNING'}, 0, "failed to retrieve contents of $sshd_service_file_path from $computer_node_name");
 		return;
@@ -641,11 +641,11 @@ sub add_ext_sshd_service {
 	# Check if any changes were made to the original sshd file
 	if ($sshd_service_file_contents_updated ne $sshd_service_file_contents_original) {
 		# Save a copy of the original sshd file if the backup doesn't already exist
-		if (!$self->file_exists($sshd_service_file_path_original)) {
-			$self->copy_file($sshd_service_file_path, $sshd_service_file_path_original);
+		if (!$self->os->file_exists($sshd_service_file_path_original)) {
+			$self->os->copy_file($sshd_service_file_path, $sshd_service_file_path_original);
 		}
 		
-		if (!$self->create_text_file($sshd_service_file_path, $sshd_service_file_contents_updated)) {
+		if (!$self->os->create_text_file($sshd_service_file_path, $sshd_service_file_contents_updated)) {
 			notify($ERRORS{'WARNING'}, 0, "failed to update sshd service file on $computer_node_name: $sshd_service_file_path");
 		}
 	}
@@ -653,12 +653,12 @@ sub add_ext_sshd_service {
 		notify($ERRORS{'DEBUG'}, 0, "sshd service file on $computer_node_name does not need to be updated");
 	}
 	
-	if (!$self->create_text_file($ext_sshd_service_file_path, $ext_sshd_service_file_contents)) {
+	if (!$self->os->create_text_file($ext_sshd_service_file_path, $ext_sshd_service_file_contents)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to create ext_sshd service file on $computer_node_name: $ext_sshd_service_file_path");
 		return;
 	}
 	
-	if (!$self->set_file_permissions($ext_sshd_service_file_path, '755')) {
+	if (!$self->os->set_file_permissions($ext_sshd_service_file_path, '755')) {
 		notify($ERRORS{'WARNING'}, 0, "failed to set permissions on ext_sshd service file to 755 on $computer_node_name: $ext_sshd_service_file_path");
 		return;
 	}
@@ -666,7 +666,7 @@ sub add_ext_sshd_service {
 	# Add the service
 	return unless $self->add_service('ext_sshd');
 	
-	return $self->_enable_service('ext_sshd');
+	return $self->enable_service('ext_sshd');
 }
 
 #/////////////////////////////////////////////////////////////////////////////

Modified: vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init/Upstart.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init/Upstart.pm?rev=1646885&r1=1646884&r2=1646885&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init/Upstart.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init/Upstart.pm Fri Dec 19 21:45:40 2014
@@ -123,7 +123,7 @@ sub get_service_names {
 	my $service_info = {};
 	
 	my $command = "initctl list";
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to list Upstart services on $computer_node_name");
 		return;
@@ -186,7 +186,7 @@ sub delete_service {
 		
 		# Delete the service configuration file
 		my $service_file_path = "/etc/init/$service_name.conf";
-		$self->delete_file($service_file_path) || return;
+		$self->os->delete_file($service_file_path) || return;
 		
 		notify($ERRORS{'DEBUG'}, 0, "deleted '$service_name' service on $computer_node_name");
 	}
@@ -221,7 +221,7 @@ sub start_service {
 	my $computer_node_name = $self->data->get_computer_node_name();
 	
 	my $command = "initctl start $service_name";
-	my ($exit_status, $output) = $self->execute($command);
+	my ($exit_status, $output) = $self->os->execute($command);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to start '$service_name' service on $computer_node_name");
 		return;
@@ -282,7 +282,7 @@ sub stop_service {
 	
 	for my $service_name (@service_names) {
 		my $command = "initctl stop $service_name";
-		my ($exit_status, $output) = $self->execute($command);
+		my ($exit_status, $output) = $self->os->execute($command);
 		if (!defined($output)) {
 			notify($ERRORS{'WARNING'}, 0, "failed to execute command to stop '$service_name' service on $computer_node_name");
 			return;
@@ -337,7 +337,7 @@ sub restart_service {
 	my $computer_node_name = $self->data->get_computer_node_name();
 	
 	my $command = "initctl restart $service_name";
-	my ($exit_status, $output) = $self->execute($command);
+	my ($exit_status, $output) = $self->os->execute($command);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to restart '$service_name' service on $computer_node_name");
 		return;
@@ -388,7 +388,7 @@ sub add_ext_sshd_service {
 	my $ext_sshd_config_file_path = '/etc/ssh/external_sshd_config';
 	
 	# Get the contents of the sshd service startup file already on the computer
-	my @sshd_service_file_contents = $self->get_file_contents($sshd_service_file_path);
+	my @sshd_service_file_contents = $self->os->get_file_contents($sshd_service_file_path);
 	if (!@sshd_service_file_contents) {
 		notify($ERRORS{'WARNING'}, 0, "failed to retrieve contents of $sshd_service_file_path from $computer_node_name");
 		return;
@@ -408,12 +408,12 @@ sub add_ext_sshd_service {
 	# Replace /var/run/sshd --> /var/run/ext_sshd
 	$ext_sshd_service_file_contents =~ s|(/var/run/)sshd|$1ext_sshd|g;
 	
-	if (!$self->create_text_file($ext_sshd_service_file_path, $ext_sshd_service_file_contents)) {
+	if (!$self->os->create_text_file($ext_sshd_service_file_path, $ext_sshd_service_file_contents)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to create ext_sshd service file on $computer_node_name: $ext_sshd_service_file_path");
 		return;
 	}
 	
-	if (!$self->set_file_permissions($ext_sshd_service_file_path, '644')) {
+	if (!$self->os->set_file_permissions($ext_sshd_service_file_path, '644')) {
 		notify($ERRORS{'WARNING'}, 0, "failed to set permissions on ext_sshd service file to 644 on $computer_node_name: $ext_sshd_service_file_path");
 		return;
 	}
@@ -449,7 +449,7 @@ sub service_running {
 	my $computer_node_name = $self->data->get_computer_node_name();
 	
 	my $command = "initctl status $service_name";
-	my ($exit_status, $output) = $self->execute($command);
+	my ($exit_status, $output) = $self->os->execute($command);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to determine if '$service_name' service is enabled on $computer_node_name");
 		return;
@@ -504,8 +504,8 @@ sub service_enabled {
 	
 	# Check if an override file exists and contains 'manual'
 	my $service_override_file_path = "/etc/init/$service_name.override";
-	if ($self->file_exists($service_override_file_path)) {
-		my @override_file_contents = $self->get_file_contents($service_override_file_path);
+	if ($self->os->file_exists($service_override_file_path)) {
+		my @override_file_contents = $self->os->get_file_contents($service_override_file_path);
 		if (!@override_file_contents) {
 			notify($ERRORS{'WARNING'}, 0, "failed to retrieve contents of $service_override_file_path from $computer_node_name");
 		}
@@ -518,7 +518,7 @@ sub service_enabled {
 	}
 	
 	my $command = "initctl show-config $service_name";
-	my ($exit_status, $output) = $self->execute($command);
+	my ($exit_status, $output) = $self->os->execute($command);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to determine if '$service_name' service is enabled on $computer_node_name");
 		return;
@@ -551,7 +551,7 @@ sub service_enabled {
 
 #/////////////////////////////////////////////////////////////////////////////
 
-=head2 _enable_service
+=head2 enable_service
 
  Parameters  : $service_name
  Returns     : boolean
@@ -559,7 +559,7 @@ sub service_enabled {
 
 =cut
 
-sub _enable_service {
+sub enable_service {
 	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");
@@ -577,10 +577,10 @@ sub _enable_service {
 	
 	my $service_override_file_path = "/etc/init/$service_name.override";
 	
-	if (!$self->file_exists($service_override_file_path)) {
+	if (!$self->os->file_exists($service_override_file_path)) {
 		return 1;
 	}
-	if ($self->delete_file($service_override_file_path)) {
+	if ($self->os->delete_file($service_override_file_path)) {
 		return 1;
 	}
 	else {
@@ -591,7 +591,7 @@ sub _enable_service {
 
 #/////////////////////////////////////////////////////////////////////////////
 
-=head2 _disable_service
+=head2 disable_service
 
  Parameters  : $service_name
  Returns     : boolean
@@ -599,7 +599,7 @@ sub _enable_service {
 
 =cut
 
-sub _disable_service {
+sub disable_service {
 	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");
@@ -617,7 +617,7 @@ sub _disable_service {
 	
 	my $service_override_file_path = "/etc/init/$service_name.override";
 	
-	if ($self->create_text_file($service_override_file_path, "manual\n")) {
+	if ($self->os->create_text_file($service_override_file_path, "manual\n")) {
 		return 1;
 	}
 	else {

Modified: vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init/systemd.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init/systemd.pm?rev=1646885&r1=1646884&r2=1646885&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init/systemd.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/init/systemd.pm Fri Dec 19 21:45:40 2014
@@ -106,10 +106,10 @@ sub get_service_names {
 		return;
 	}
 	
-	my $computer_node_name   = $self->data->get_computer_node_name();
+	my $computer_node_name = $self->data->get_computer_node_name();
 	
 	my $command = "systemctl --no-pager list-unit-files";
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to retrieve systemd service names on $computer_node_name");
 		return;
@@ -130,6 +130,42 @@ sub get_service_names {
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 service_exists
+
+ Parameters  : $service_name
+ Returns     : boolean
+ Description : Determines if a service controlled by systemd exists on the
+               computer.
+
+=cut
+
+sub service_exists {
+	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 ($service_name) = @_;
+	if (!defined($service_name)) {
+		notify($ERRORS{'WARNING'}, 0, "service name argument was not supplied");
+		return;
+	}
+	
+	my $computer_node_name = $self->data->get_computer_node_name();
+	
+	my @service_names = $self->get_service_names();
+	if (grep { $_ eq $service_name } @service_names) {
+		notify($ERRORS{'DEBUG'}, 0, "$service_name service exists on $computer_node_name");
+		return 1;
+	}
+	else {
+		notify($ERRORS{'DEBUG'}, 0, "$service_name service does not exist on $computer_node_name");
+		return 0;
+	}
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 =head2 service_running
 
  Parameters  : $service_name
@@ -155,7 +191,7 @@ sub service_running {
 	my $computer_node_name = $self->data->get_computer_node_name();
 	
 	my $command = "systemctl is-active $service_name.service";
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to determine if $service_name service is running on $computer_node_name");
 		return;
@@ -203,7 +239,7 @@ sub service_enabled {
 	my $computer_node_name = $self->data->get_computer_node_name();
 	
 	my $command = "systemctl is-enabled $service_name.service";
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to determine if $service_name service is running on $computer_node_name");
 		return;
@@ -226,7 +262,7 @@ sub service_enabled {
 
 #/////////////////////////////////////////////////////////////////////////////
 
-=head2 _enable_service
+=head2 enable_service
 
  Parameters  : $service_name
  Returns     : boolean
@@ -235,7 +271,7 @@ sub service_enabled {
 
 =cut
 
-sub _enable_service {
+sub enable_service {
 	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");
@@ -252,7 +288,7 @@ sub _enable_service {
 	
 	# Enable the service
 	my $command = "systemctl --no-reload enable $service_name.service";
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to enable '$service_name' service on $computer_node_name: $command");
 		return;
@@ -275,7 +311,7 @@ sub _enable_service {
 
 #/////////////////////////////////////////////////////////////////////////////
 
-=head2 _disable_service
+=head2 disable_service
 
  Parameters  : $service_name
  Returns     : boolean
@@ -284,7 +320,7 @@ sub _enable_service {
 
 =cut
 
-sub _disable_service {
+sub disable_service {
 	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");
@@ -300,7 +336,7 @@ sub _disable_service {
 	my $computer_node_name = $self->data->get_computer_node_name();
 	
 	my $command = "systemctl --no-reload disable $service_name.service";
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to disable '$service_name' service on $computer_node_name: $command");
 		return;
@@ -350,12 +386,12 @@ sub delete_service {
 	# Disable the service before deleting it
 	if ($self->service_exists($service_name)) {
 		$self->stop_service($service_name) || return;
-		$self->_disable_service($service_name) || return;
+		$self->disable_service($service_name) || return;
 	}
 	
 	# Delete the service configuration file
 	my $service_file_path = "/lib/systemd/system/$service_name.service";
-	if (!$self->delete_file($service_file_path)) {
+	if (!$self->os->delete_file($service_file_path)) {
 		return;
 	}
 	
@@ -392,7 +428,7 @@ sub start_service {
 	
 	# start the service
 	my $command = "systemctl start $service_name.service";
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to start '$service_name' service on $computer_node_name: $command");
 		return;
@@ -442,7 +478,7 @@ sub stop_service {
 	
 	# stop the service
 	my $command = "systemctl stop $service_name.service";
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to stop '$service_name' service on $computer_node_name: $command");
 		return;
@@ -492,7 +528,7 @@ sub restart_service {
 	
 	# Restart the service
 	my $command = "systemctl restart $service_name.service";
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to restart '$service_name' service on $computer_node_name: $command");
 		return;
@@ -538,7 +574,7 @@ sub add_ext_sshd_service {
 	my $ext_sshd_service_file_path = '/lib/systemd/system/ext_sshd.service';
 	
 	# Get the contents of the sshd service configuration file already on the computer
-	my @sshd_service_file_contents = $self->get_file_contents($sshd_service_file_path);
+	my @sshd_service_file_contents = $self->os->get_file_contents($sshd_service_file_path);
 	if (!@sshd_service_file_contents) {
 		notify($ERRORS{'WARNING'}, 0, "failed to retrieve contents of $sshd_service_file_path from $computer_node_name");
 		return;
@@ -562,19 +598,19 @@ sub add_ext_sshd_service {
 	
 	$ext_sshd_service_file_contents .= "\n";
 	
-	if (!$self->create_text_file($ext_sshd_service_file_path, $ext_sshd_service_file_contents)) {
+	if (!$self->os->create_text_file($ext_sshd_service_file_path, $ext_sshd_service_file_contents)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to create ext_sshd service file on $computer_node_name: $ext_sshd_service_file_path");
 		return;
 	}
 	
-	if (!$self->set_file_permissions($ext_sshd_service_file_path, '644')) {
+	if (!$self->os->set_file_permissions($ext_sshd_service_file_path, '644')) {
 		notify($ERRORS{'WARNING'}, 0, "failed to set permissions of ext_sshd service file to 644 on $computer_node_name: $ext_sshd_service_file_path");
 		return;
 	}
 	
 	$self->_daemon_reload();
 	
-	return $self->_enable_service('ext_sshd');
+	return $self->enable_service('ext_sshd');
 }
 
 #/////////////////////////////////////////////////////////////////////////////
@@ -599,7 +635,7 @@ sub _daemon_reload {
 	my $computer_node_name = $self->data->get_computer_node_name();
 	
 	my $command = "systemctl --system daemon-reload";
-	my ($exit_status, $output) = $self->execute($command, 0);
+	my ($exit_status, $output) = $self->os->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to execute command to reload systemd manager configuration on $computer_node_name: $command");
 		return;

Modified: vcl/trunk/managementnode/lib/VCL/utils.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/utils.pm?rev=1646885&r1=1646884&r2=1646885&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/utils.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/utils.pm Fri Dec 19 21:45:40 2014
@@ -484,7 +484,7 @@ INIT {
 	elsif (!defined($EXECUTE_NEW)) {
 		$EXECUTE_NEW = 0;
 	}
-	$ENV{execute_new} = $EXECUTE_NEW;
+	$ENV{execute_new} = $EXECUTE_NEW if $EXECUTE_NEW;
 	
 	# Set boolean variables to 0 or 1, they may be set to 'no' or 'yes' in the conf file
 	for ($MYSQL_SSL, $JABBER, $VERBOSE, $DAEMON_MODE, $SETUP_MODE) {
@@ -6839,7 +6839,7 @@ sub get_computer_info {
 		notify($ERRORS{'WARNING'}, 0, "computer identifier argument was not supplied");
 		return;
 	}
-
+	
 	if (!$no_cache && defined($ENV{computer_info}{$computer_identifier})) {
 		return $ENV{computer_info}{$computer_identifier};
 	}
@@ -7090,6 +7090,8 @@ sub get_computer_nathost_info {
 	
 	# Construct the select statement
 	my $select_statement = "SELECT DISTINCT\n";
+	$select_statement .= "computer.id AS 'computer-id',\n";
+	$select_statement .= "computer.hostname AS 'computer-hostname',\n";
 	
 	# Get the column names for each table and add them to the select statement
 	for my $table (@tables) {
@@ -7168,6 +7170,7 @@ EOF
 	
 	$nathost_info->{HOSTNAME} = '<unknown>';
 	
+	my $computer_id = $nathost_info->{computer}{id};
 	my $resource_id = $nathost_info->{resource}{id};
 	my $resource_type = $nathost_info->{resource}{resourcetype}{name};
 	my $resource_subid = $nathost_info->{resource}{subid};
@@ -7176,8 +7179,14 @@ EOF
 		$nathost_info->{HOSTNAME} = $management_node_info->{hostname};
 	}
 	elsif ($resource_type eq 'computer') {
-		my $computer_info = get_computer_info($resource_subid) || {};
-		$nathost_info->{HOSTNAME} = $computer_info->{hostname};
+		# Check if NAT host is the same computer as it is assigned to to avoid recursion
+		if ($computer_id eq $resource_subid) {
+			$nathost_info->{HOSTNAME} = $nathost_info->{computer}{hostname};
+		}
+		else {
+			my $computer_info = get_computer_info($resource_subid) || {};
+			$nathost_info->{HOSTNAME} = $computer_info->{hostname};
+		}
 	}
 	else {
 		notify($ERRORS{'WARNING'}, 0, "NAT host resource type is not supported: $resource_type, resource ID: $resource_id");