mirror of
https://github.com/OpenNebula/one.git
synced 2025-03-16 22:50:10 +03:00
First version of new command exection library
git-svn-id: http://svn.opennebula.org/one/trunk@343 3034c82b-c49b-4eb3-8279-a7acafdc01c0
This commit is contained in:
parent
99d02a2689
commit
8792c16f7f
131
src/mad/ruby/CommandManager.rb
Normal file
131
src/mad/ruby/CommandManager.rb
Normal file
@ -0,0 +1,131 @@
|
||||
|
||||
require 'pp'
|
||||
require 'open3'
|
||||
|
||||
# Generic command executor that holds the code shared by all the command
|
||||
# executors. Commands can have an associated callback that will be
|
||||
# after they finish.
|
||||
class GenericCommand
|
||||
attr_accessor :value, :code, :stdout, :stderr, :command
|
||||
attr_accessor :callback
|
||||
|
||||
# Creates the new command:
|
||||
# +command+: string with the command to be executed
|
||||
def initialize(command)
|
||||
@command=command
|
||||
@callback=nil
|
||||
end
|
||||
|
||||
# Runs the command and calls the callback if it is defined
|
||||
# +data+: variable to pass to the callaback to provide data
|
||||
# or to share with other callbacks
|
||||
def run(data=nil)
|
||||
(@stdout, @stderr)=execute
|
||||
@code=get_exit_code(@stderr)
|
||||
|
||||
@callback.call(self, data) if @callback
|
||||
|
||||
return @code
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Gets exit code from STDERR
|
||||
def get_exit_code(str)
|
||||
tmp=str.scan(/^ExitCode: (\d*)$/)
|
||||
return nil if !tmp[0]
|
||||
tmp[0][0].to_i
|
||||
end
|
||||
|
||||
# Low level command execution. This method has to be redefined
|
||||
# for each kind of command execution. Returns an array with
|
||||
# +stdout+ and +stderr+ of the command execution.
|
||||
def execute
|
||||
puts "About to execute \"#{@command}\""
|
||||
["", "ExitCode: 0"]
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# Executes commands in the machine where it is called. See documentation
|
||||
# for GenericCommand
|
||||
class LocalCommand < GenericCommand
|
||||
private
|
||||
|
||||
def execute
|
||||
std=Open3.popen3(
|
||||
"#{command} ;"+
|
||||
" echo ExitCode: $? 1>&2")
|
||||
[std[1].read, std[2].read]
|
||||
end
|
||||
end
|
||||
|
||||
# Executes commands in a remote machine ussing ssh. See documentation
|
||||
# for GenericCommand
|
||||
class SSHCommand < GenericCommand
|
||||
attr_accessor :host
|
||||
|
||||
# This one takes another parameter. +host+ is the machine
|
||||
# where de command is going to be executed
|
||||
def initialize(command, host)
|
||||
@host=host
|
||||
super(command)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def execute
|
||||
std=Open3.popen3(
|
||||
"ssh -n #{host} #{command} ;"+
|
||||
" echo ExitCode: $? 1>&2")
|
||||
std[0].close
|
||||
[std[1].read, std[2].read]
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
if $0 == __FILE__
|
||||
|
||||
data={}
|
||||
|
||||
command=GenericCommand.new("uname -a")
|
||||
command.callback=lambda {|obj,data|
|
||||
puts obj.stderr
|
||||
|
||||
data[1]=[obj.command, obj.code]
|
||||
}
|
||||
|
||||
command.run(data)
|
||||
|
||||
local_command=LocalCommand.new("uname -a")
|
||||
local_command.callback=lambda {|obj,data|
|
||||
puts "STDOUT:"
|
||||
puts obj.stdout
|
||||
puts
|
||||
puts "STDERR:"
|
||||
puts obj.stderr
|
||||
|
||||
data[2]=[obj.command, obj.code]
|
||||
}
|
||||
|
||||
local_command.run(data)
|
||||
|
||||
ssh_command=SSHCommand.new("uname -a", "localhost")
|
||||
ssh_command.callback=lambda {|obj,data|
|
||||
puts "STDOUT:"
|
||||
puts obj.stdout
|
||||
puts
|
||||
puts "STDERR:"
|
||||
puts obj.stderr
|
||||
|
||||
data[3]=[obj.command, obj.host, obj.code]
|
||||
}
|
||||
|
||||
ssh_command.run(data)
|
||||
|
||||
pp data
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user