Class: Cute::TakTuk::TakTuk
- Inherits:
-
Object
- Object
- Cute::TakTuk::TakTuk
- Defined in:
- lib/cute/taktuk.rb
Overview
This class wraps the command TakTuk and generates automatically the long CLI options for taktuk command.
Constant Summary collapse
- VALID_STREAMS =
[:output, :error, :status, :connector, :state, :info, :message, :taktuk ]
Instance Attribute Summary collapse
-
#args ⇒ Object
readonly
Returns the value of attribute args.
-
#binary ⇒ Object
Returns the value of attribute binary.
-
#commands ⇒ Object
readonly
Returns the value of attribute commands.
-
#exec_cmd ⇒ Object
readonly
Returns the value of attribute exec_cmd.
-
#status ⇒ Object
readonly
Returns the value of attribute status.
-
#stderr ⇒ Object
readonly
Returns the value of attribute stderr.
-
#stdout ⇒ Object
readonly
Returns the value of attribute stdout.
-
#streams ⇒ Object
Returns the value of attribute streams.
Instance Method Summary collapse
- #[](command, prefix = '[', suffix = ']') ⇒ Object
-
#exec(cmd) ⇒ Object
It executes a command on multiple hosts.
-
#exec!(cmd) ⇒ Hash
It executes a command on multiple hosts capturing the output, and other information related with the execution.
- #free! ⇒ Object (also: #close)
-
#initialize(hostlist, options = {:connector => 'ssh'}) ⇒ TakTuk
constructor
A new instance of TakTuk.
-
#input(opts = {}) ⇒ Object
Manages the taktuk command input = Example.
- #kill! ⇒ Object
-
#loop ⇒ Object
It executes the commands so far stored in the @commands variable and reinitialize the variable for post utilization.
- #method_missing(meth, *args) ⇒ Object
-
#put(source, dest) ⇒ Object
It transfers a file to all the machines in parallel.
- #raw!(string) ⇒ Object
- #run!(opts = {}) ⇒ Object
Constructor Details
#initialize(hostlist, options = {:connector => 'ssh'}) ⇒ TakTuk
Returns a new instance of TakTuk.
390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 |
# File 'lib/cute/taktuk.rb', line 390 def initialize(hostlist, = {:connector => 'ssh'}) raise ArgumentError.new("options parameter has to be a hash") unless .is_a?(Hash) @binary = 'taktuk' @options = Options[.merge({ :streams => [:output, :error, :status ]})] if [:streams].nil? @options.merge!({:connector => 'ssh'}) if [:connector].nil? @streams = Stream.new(@options[:streams]) # @streams = Stream.new([:output,:error,:status, :state]) @hostlist = Hostlist.new(hostlist) @commands = Commands.new @args = nil @stdout = nil @stderr = nil @status = nil @exec_cmd = nil @curthread = nil @connector = @options[:connector] end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(meth, *args) ⇒ Object
576 577 578 579 580 581 582 |
# File 'lib/cute/taktuk.rb', line 576 def method_missing(meth,*args) @commands << (meth.to_s.gsub(/_/,' ').strip.downcase) args.each do |arg| @commands.push(arg.strip.downcase) end self end |
Instance Attribute Details
#args ⇒ Object (readonly)
Returns the value of attribute args.
386 387 388 |
# File 'lib/cute/taktuk.rb', line 386 def args @args end |
#binary ⇒ Object
Returns the value of attribute binary.
385 386 387 |
# File 'lib/cute/taktuk.rb', line 385 def binary @binary end |
#commands ⇒ Object (readonly)
Returns the value of attribute commands.
386 387 388 |
# File 'lib/cute/taktuk.rb', line 386 def commands @commands end |
#exec_cmd ⇒ Object (readonly)
Returns the value of attribute exec_cmd.
386 387 388 |
# File 'lib/cute/taktuk.rb', line 386 def exec_cmd @exec_cmd end |
#status ⇒ Object (readonly)
Returns the value of attribute status.
386 387 388 |
# File 'lib/cute/taktuk.rb', line 386 def status @status end |
#stderr ⇒ Object (readonly)
Returns the value of attribute stderr.
386 387 388 |
# File 'lib/cute/taktuk.rb', line 386 def stderr @stderr end |
#stdout ⇒ Object (readonly)
Returns the value of attribute stdout.
386 387 388 |
# File 'lib/cute/taktuk.rb', line 386 def stdout @stdout end |
#streams ⇒ Object
Returns the value of attribute streams.
385 386 387 |
# File 'lib/cute/taktuk.rb', line 385 def streams @streams end |
Instance Method Details
#[](command, prefix = '[', suffix = ']') ⇒ Object
571 572 573 574 |
# File 'lib/cute/taktuk.rb', line 571 def [](command,prefix='[',suffix=']') @commands << "#{prefix} #{command} #{suffix}" self end |
#exec(cmd) ⇒ Object
It executes a command on multiple hosts. All output is printed via stdout and stderr. Note that this method returns immediately, and requires a call to the loop method in order for the command to actually execute. The execution is done by TakTuk using broadcast exec.
Example
tak.exec("hostname")
tak.exec("mkdir ~/test")
tak.loop() # to trigger the execution of commands
509 510 511 512 513 514 |
# File 'lib/cute/taktuk.rb', line 509 def exec(cmd) mode = "broadcast" @commands << "#{mode} exec" @commands << "[ #{cmd} ]" @commands << ';' # TakTuk command separator end |
#exec!(cmd) ⇒ Hash
It executes a command on multiple hosts capturing the output, and other information related with the execution. It blocks until the command finishes.
Example
tak.exec!("uname -r") #=> {"node2"=>{:output=>"3.2.0-4-amd64", :status=>0}, "node3"=>{:output=>"3.2.0-4-amd64", :status=>0}, ...}
543 544 545 546 547 548 549 |
# File 'lib/cute/taktuk.rb', line 543 def exec!(cmd) loop() unless @commands.empty? exec(cmd) results = run!() @commands = Commands.new return results end |
#free! ⇒ Object Also known as: close
471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 |
# File 'lib/cute/taktuk.rb', line 471 def free!() @binary = nil @options = nil # if @streams # @streams.each_value do |stream| # stream.free if stream # stream = nil # end # end @hostlist.free if @hostlist @hostlist = nil @commands = nil @args = nil @stdout = nil @stderr = nil @status = nil @exec = nil @curthread = nil end |
#input(opts = {}) ⇒ Object
Manages the taktuk command input
Example
tak.exec("wc -w")
tak.input(:data => "data data data data")
tak.exec("tar xvf -")
tak.input(:file => "test_file.tar")
563 564 565 566 567 568 |
# File 'lib/cute/taktuk.rb', line 563 def input(opts = {}) mode = "broadcast" @commands << "#{mode} input #{opts.keys.first}" @commands << "[ #{opts.values.first} ]" @commands << ';' end |
#kill! ⇒ Object
463 464 465 466 467 468 469 |
# File 'lib/cute/taktuk.rb', line 463 def kill!() unless @exec.nil? @exec.kill @exec = nil end free!() end |
#loop ⇒ Object
It executes the commands so far stored in the @commands variable and reinitialize the variable for post utilization.
456 457 458 459 460 461 |
# File 'lib/cute/taktuk.rb', line 456 def loop () run!() $stdout.print(@stdout) $stderr.print(@stderr) @commands = Commands.new end |
#put(source, dest) ⇒ Object
It transfers a file to all the machines in parallel.
Example
tak.put("hosts.allow_template", "/etc/hosts.allow")
524 525 526 527 528 529 530 |
# File 'lib/cute/taktuk.rb', line 524 def put(source,dest) mode = "broadcast" @commands << "#{mode} put" @commands << "[ #{source} ]" @commands << "[ #{dest} ]" @commands << ';' # TakTuk command separator end |
#raw!(string) ⇒ Object
491 492 493 494 |
# File 'lib/cute/taktuk.rb', line 491 def raw!(string) @commands << string.strip self end |
#run!(opts = {}) ⇒ Object
412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 |
# File 'lib/cute/taktuk.rb', line 412 def run!(opts = {}) @curthread = Thread.current @args = [] @args += @options.to_cmd @streams.types.each{ |name| @args << '-o' @args << "#{name}=#{@streams.to_cmd}" } connector = build_connector @args += ["--connector", "#{connector}"] unless connector.nil? @args += @hostlist.to_cmd @args += @commands.to_cmd hosts = @hostlist.to_a outputs_size = opts[:outputs_size] || 0 @exec_cmd = Cute::Execute[@binary,*@args].run!( :stdout_size => outputs_size * hosts.size, :stderr_size => outputs_size * hosts.size, :stdin => false ) @status, @stdout, @stderr, emptypipes = @exec_cmd.wait({:checkstatus=>false}) unless @status.success? @curthread = nil return false end unless emptypipes @curthread = nil @stderr = "Too much data on the TakTuk command's stdout/stderr" return false end results = @streams.parse(@stdout) @curthread = nil results end |