Class: Knifecmd

Inherits:
Object
  • Object
show all
Includes:
Dbg
Defined in:
lib/kknife/knifecmd.rb

Overview

Knifecmd

Used as the base for the knife commands.

Stores information about the current lookup and the Command tree

Constant Summary

Constants included from Dbg

Dbg::DefaultIO, Dbg::DefaultLevel

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Dbg

create, #dbg, #debug_logger, debug_logger, replace

Constructor Details

#initialize(argopts = {}) ⇒ Knifecmd

Returns a new instance of Knifecmd.

[View source]

35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/kknife/knifecmd.rb', line 35

def initialize( argopts = {} )

  # Root command is k.. or knife
  @root = 'knife'

  opts = {
    :commands     => ARGV.dup.freeze,
    :cmd_found    => [],
    :cmd_left     => ARGV.dup,
    :shortcuts    => {},
    :ambiguities  => {},
    :config_build => '~/.chef/.kknife.built.config',
    :config_user  => '~/.chef/.kknife.user.config',
  }.merge argopts

  @commands     = opts[:commands]
  @cmd_found    = opts[:cmd_found]
  @cmd_left     = opts[:cmd_left]
  @shortcuts    = opts[:shortcuts]
  @ambiguities  = opts[:ambiguities]
  @config_build = File.expand_path opts[:config_build]
  @config_user  = File.expand_path opts[:config_user]

  @cmd_root = Command.new( @root, :controller => self )
  
  # Instead of trawling for chef files each time we can load a previous config
  lookup_files unless lookup_config

  # Now process the knife commands into a tree of Command
  load_commands

  # Then setup to find commands
  reset_found
end

Instance Attribute Details

#ambiguitiesObject

Returns the value of attribute ambiguities.


33
34
35
# File 'lib/kknife/knifecmd.rb', line 33

def ambiguities
  @ambiguities
end

#cmd_foundObject

Returns the value of attribute cmd_found.


33
34
35
# File 'lib/kknife/knifecmd.rb', line 33

def cmd_found
  @cmd_found
end

#cmd_leftObject

Returns the value of attribute cmd_left.


33
34
35
# File 'lib/kknife/knifecmd.rb', line 33

def cmd_left
  @cmd_left
end

#commandsObject

Returns the value of attribute commands.


33
34
35
# File 'lib/kknife/knifecmd.rb', line 33

def commands
  @commands
end

#knife_commandsObject

Returns the value of attribute knife_commands.


33
34
35
# File 'lib/kknife/knifecmd.rb', line 33

def knife_commands
  @knife_commands
end

#shortcutsObject

Returns the value of attribute shortcuts.


33
34
35
# File 'lib/kknife/knifecmd.rb', line 33

def shortcuts
  @shortcuts
end

Instance Method Details

#clear_configObject

Remove a built config file

[View source]

96
97
98
# File 'lib/kknife/knifecmd.rb', line 96

def clear_config
  FileUtils.rm @config_build if File.exists? @config_build
end

#cmd_split(split_command_array) ⇒ Object

If the Command lookup needs to split a command remove the command from what’s left and split it into the componenets

[View source]

153
154
155
156
157
158
159
# File 'lib/kknife/knifecmd.rb', line 153

def cmd_split( split_command_array )
  # first remove the previous entry with _
  @cmd_left.shift

  # then prefix the new split entires
  @cmd_left.unshift *split_command_array
end

#found_cmd(command) ⇒ Object

if the Command lookup find a command, add it to found and take it away from whats left

[View source]

164
165
166
167
168
169
# File 'lib/kknife/knifecmd.rb', line 164

def found_cmd( command )
  dbg 'found_cmd b4 ', command, @cmd_found.join(','), '|', @cmd_left.join(',')
  @cmd_found.push command
  @cmd_left.shift
  dbg 'found_cmd aft', command, @cmd_found.join(','), '|', @cmd_left.join(',')
end

#found_shortcut(shortcut) ⇒ Object

If the Command lookup hits a shortcut, adjust local variables to match

[View source]

174
175
176
177
178
179
# File 'lib/kknife/knifecmd.rb', line 174

def found_shortcut( shortcut )
  dbg 'found_shortcut b4 ', shortcut.join(','), '|', @cmd_left.join(',')
  @cmd_left.shift
  @cmd_left.unshift *shortcut
  dbg 'found_shortcut aft', shortcut.join(','), '|', @cmd_left.join(',')
end

#found_stringObject

Return the found command as a space seperated string

[View source]

190
191
192
# File 'lib/kknife/knifecmd.rb', line 190

def found_string
  ([ @root ] + @cmd_found ).join(' ')
end

#load_commandsObject

Turn the knife command arrays into a Command tree

[View source]

102
103
104
105
106
107
108
109
110
111
112
# File 'lib/kknife/knifecmd.rb', line 102

def load_commands
  # loop over the commands, put them into Command
  @knife_commands.each do |category,command_arr|
    dbg 'category', category
    command_arr.each do |command|
      dbg 'command', command
      commands = command.split( /_/ )
      @cmd_root.add_command commands
    end
  end
end

#lookup(commands = @commands) ⇒ Object

Start at the root command and go down the tree looking for each command

[View source]

125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/kknife/knifecmd.rb', line 125

def lookup( commands = @commands )
  dbg 'lookup', commands
  reset_found commands 

  begin
    @cmd_root.process_lookup commands

  rescue Command::AmbiguousCommand => e
    abort "error looking up [#{commands.to_s}]. #{e}"
    
  rescue Command::NotFoundCommand => e
    abort "error looking up [#{commands.to_s}]. #{e}"

  rescue Command::NoMoreSubCommands
    dbg "end of knife lookups", @cmd_found.join(','), @cmd_left.join(',')

  rescue Command::NoMoreSuppliedCommands
    dbg "end of argv lookups", @cmd_found.join(','), @cmd_left.join(',')

  end

  @cmd_found
end

#lookup_configObject

Look up the knife commands from a prebuilt kknife config

[View source]

72
73
74
75
76
77
# File 'lib/kknife/knifecmd.rb', line 72

def lookup_config
  # pull in a config if it exists
  return false unless File.exists? @config_build

  @knife_commands = JSON.parse File.open( @config_build, 'r' ){|f| f.read }
end

#lookup_filesObject

Look up the knife commands from knife library files

[View source]

81
82
83
84
85
# File 'lib/kknife/knifecmd.rb', line 81

def lookup_files
  # pull in the standard knife files
  Chef::Knife.load_commands
  @knife_commands = Chef::Knife.subcommands_by_category
end
[View source]

119
120
121
# File 'lib/kknife/knifecmd.rb', line 119

def print
  @cmd_root.pp_single
end

Start with out root Command and print the command tree

[View source]

116
117
118
# File 'lib/kknife/knifecmd.rb', line 116

def print_tree
  @cmd_root.pp
end

#reset_found(commands = []) ⇒ Object

Reset the command found instance variables

[View source]

183
184
185
186
# File 'lib/kknife/knifecmd.rb', line 183

def reset_found( commands = [] )
  @cmd_found = []
  @cmd_left  = commands.dup
end

#resolve(commands) ⇒ Object

Resolve a list of commands into real commands

[View source]

196
197
198
199
# File 'lib/kknife/knifecmd.rb', line 196

def resolve( commands )
  lookup commands
  @cmd_found + @cmd_left
end

#run(commands = ARGV) ⇒ Object

Run the knife command

[View source]

202
203
204
205
206
207
208
209
210
# File 'lib/kknife/knifecmd.rb', line 202

def run( commands = ARGV )

  # mess with argv
  ARGV.replace resolve( commands )

  # Run knife directly 
  Chef::Application::Knife.new.run

end

#write_configObject

Write out a built config file

[View source]

89
90
91
92
# File 'lib/kknife/knifecmd.rb', line 89

def write_config
  raise "No directory [#{File.dirname( @config_build )}]" unless Dir.exists? File.dirname( @config_build )
  File.open( @config_build, 'w' ){|f| f.write @knife_commands.to_json }
end