require 'open3'
require_relative('./array.rb')
require_relative('./hash.rb')
require_relative('./timer.rb')
class Command < Hash
def initialize command
self[:input] = ''
self[:timeout] = 0
self[:directory] = ''
self[:exit_code] = 0
self[:output] = ''
self[:error] = ''
self[:machine] = ''
self[:user] = ''
self[:start_time] = nil
self[:end_time] = nil
if(command.kind_of?(String))
self[:input] = command
end
if(command.kind_of?(Hash))
command.each{|k,v|
self[k.to_sym]=v
}
end
end
def execute
puts "#{self[:input]}"
pwd=Dir.pwd
Dir.chdir(self[:directory]) if(self.has_key?(:directory) && File.exists?(self[:directory]))
self[:directory] = pwd if(self[:directory].length==0)
self[:machine] = Command.machine
self[:user] = Command.user
self[:start_time]=Time.now
timer=Timer.new
if self[:input].include?('<%') && self[:input].include?('%>')
ruby = self[:input].gsub("<%","").gsub("%>","")
begin
self[:output]=eval(ruby)
rescue
self[:exit_code]=1
self[:error]="unable to eval(#{ruby})"
end
self[:elapsed] = timer.elapsed_str
self[:end_time] = Time.now
else
begin
self[:output],self[:error],status= Open3.capture3(self[:input])
self[:exit_code]=status.to_i
self[:elapsed] = timer.elapsed_str
self[:end_time] = Time.now
rescue Exception => e
self[:elapsed] = timer.elapsed_str
self[:end_time] = Time.now
self[:error] = "Exception: " + e.to_s
self[:exit_code]=1
end
end
Dir.chdir(pwd) if pwd != Dir.pwd
if(self[:exit_code] != 0)
puts ' '
puts "exit_code=#{self[:exit_code]}"
puts ' '
puts self[:output]
puts self[:error]
puts ' '
if(!self.has_key?(:ignore_failure) || !self[:ignore_failure])
raise "#{self[:input]} failed"
end #unless (self.has_key?(:ignore_failure) && self[:ignore_failure]==true)
end
end
def self.machine
if !ENV['COMPUTERNAME'].nil?
return ENV['COMPUTERNAME']
end
machine = `hostname`
machine = machine.split('.')[0] if machine.include?('.')
return machine.strip
end
def self.user
ENV['USER'].nil? ? ENV['USERNAME'] : ENV['USER']
end
def self.exit_code command
cmd = Command.new(command)
cmd[:ignore_failure]=true
cmd.execute
cmd[:exit_code]
end
def self.output command
cmd = Command.new(command)
cmd[:ignore_failure]=true
cmd.execute
cmd[:output]
end
def to_html
if self[:exit_code] == 0
[
'
'
].join
else
[
' | ',
self[:input],
' | ',
map { |k, v| ["#{k} | ", v.respond_to?(:to_html) ? v.to_html : "#{v} | "] },
' ',
' |
|
'
].join
end
end
end