Class: Rudy::Config::Commands

Inherits:
Caesars
  • Object
show all
Includes:
Gibbler::Complex
Defined in:
lib/rudy/config/objects.rb

Overview

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!

Defined Under Namespace

Classes: AlreadyDefined, BadArg, PathNotString, ReservedKeyword

Constant Summary collapse

@@processed =
false

Instance Method Summary collapse

Instance Method Details

#allowObject

Not used currently. May be revived. @@allowed = [] ## Commands which have been processed



73
# File 'lib/rudy/config/objects.rb', line 73

forced_array :allow

#initObject



77
78
79
80
81
# 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

#postprocessObject

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.



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# 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.le "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