class Rudy::Config::Commands

Modify the SSH command available in routines. The default set of commands is defined by Rye::Cmd (Rudy executes all SSH commands via Rye).

NOTE: We allow people to define their own keywords. It is important that new keywords do not conflict with existing Rudy keywords. Strange things may happen!

Public Instance Methods

init() click to toggle source
# File lib/rudy/config/objects.rb, line 77
def init
  # We can't process the Rye::Cmd commands here because the
  # DSL hasn't been parsed yet so Rudy::Config.postprocess
  # called the following postprocess method after parsing.
end
postprocess() click to toggle source

Process the directives specified in the commands config. NOTE: This affects the processing of the routines config which only works if commands is parsed first. This works naturally if each config has its own file b/c Rudy loads files via a glob (globs are alphabetized and “commands” comes before “routines”).

That's obviously not good enough but for now commands configuration MUST be put before routines.

# File lib/rudy/config/objects.rb, line 92
def postprocess
  return false if @@processed
  @@processed = true  # Make sure this runs only once

  # Parses:
  # commands do
  #   allow :kill 
  #   allow :custom_script, '/full/path/2/custom_script'
  #   allow :git_clone, '/usr/bin/git', 'clone'
  # end
  # 
  # * Tells Routines to force_array on the command name.
  # This is important b/c of the way we parse commands 
  self.allow.each do |cmd|
    cmd, *args = *cmd
    
    ## Currently disabled
    ##raise AlreadyDefined.new(:commands, cmd) if @@allowed.member?(cmd)
    ##@@allowed << cmd
    
    # We can allow existing commands to be overridden but we
    # print a message to STDERR so the user knows what's up.
    if Rye::Cmd.can?(cmd)
      Rudy::Huxtable.ld "Redefining #{cmd}" if Rudy::Huxtable.global.verbose > 2
    end
    
    if args.last.is_a?(Proc)
      block = args.pop
      Rye::Cmd.add_command(cmd, nil, *args, &block)
    else
      # If no path was specified, we can assume cmd is in the remote path so
      # when we add the method to Rye::Cmd, we'll it the path is "cmd".
      path = args.shift || cmd.to_s
      
      raise PathNotString.new(:commands, cmd) if path && !path.is_a?(String)
      
      Rye::Cmd.add_command cmd, path, *args
      
    end
    
    
    ## We cannot allow new commands to be defined that conflict use known
    ## routines keywords. This is based on keywords in the current config.
    ## NOTE: We can't check for this right now b/c the routines config
    ## won't necessarily have been parsed yet. TODO: Figure it out!
    ##if Caesars.known_symbol_by_glass?(:routines, cmd)
    ##  raise ReservedKeyword.new(:commands, cmd)
    ##end
    
  end
  
  ## NOTE: We now process command blocks as Procs rather than individual commands.
  ## There's currently no need to ForceRefresh here
  ##raise Caesars::Config::ForceRefresh.new(:routines)
end