Class: Puppet::Application::Apply

Inherits:
Puppet::Application show all
Defined in:
lib/puppet/application/apply.rb

Constant Summary

Constants inherited from Puppet::Application

DOCPATTERN

Instance Attribute Summary

Attributes inherited from Puppet::Application

#command_line, #options

Instance Method Summary collapse

Methods inherited from Puppet::Application

[], banner, clear!, clear?, controlled_run, exit, find, #handlearg, #help, #initialize, interrupted?, #name, option, option_parser_commands, #parse_options, #preinit, restart!, restart_requested?, #run, run_mode, #set_run_mode, should_not_parse_config, should_parse_config, #should_parse_config?, should_parse_config?, stop!, stop_requested?

Methods included from Util

activerecord_version, benchmark, chuser, classproxy, #execfail, #execpipe, execute, logmethods, memory, proxy, recmkdir, secure_open, symbolize, symbolizehash, symbolizehash!, synchronize_on, thinmark, #threadlock, which, withumask

Methods included from Util::POSIX

#get_posix_field, #gid, #idfield, #methodbyid, #methodbyname, #search_posix_field, #uid

Constructor Details

This class inherits a constructor from Puppet::Application

Instance Method Details

#applyObject



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/puppet/application/apply.rb', line 39

def apply
  if options[:catalog] == "-"
    text = $stdin.read
  else
    text = File.read(options[:catalog])
  end

  begin
    catalog = Puppet::Resource::Catalog.convert_from(Puppet::Resource::Catalog.default_format,text)
    catalog = Puppet::Resource::Catalog.pson_create(catalog) unless catalog.is_a?(Puppet::Resource::Catalog)
  rescue => detail
    raise Puppet::Error, "Could not deserialize catalog from pson: #{detail}"
  end

  catalog = catalog.to_ral

  require 'puppet/configurer'
  configurer = Puppet::Configurer.new
  configurer.run :catalog => catalog
end

#mainObject



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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
# File 'lib/puppet/application/apply.rb', line 76

def main
  # Set our code or file to use.
  if options[:code] or command_line.args.length == 0
    Puppet[:code] = options[:code] || STDIN.read
  else
    manifest = command_line.args.shift
    raise "Could not find file #{manifest}" unless File.exist?(manifest)
    Puppet.warning("Only one file can be applied per run.  Skipping #{command_line.args.join(', ')}") if command_line.args.size > 0
    Puppet[:manifest] = manifest
  end

  # Collect our facts.
  unless facts = Puppet::Node::Facts.find(Puppet[:node_name_value])
    raise "Could not find facts for #{Puppet[:node_name_value]}"
  end

  unless Puppet[:node_name_fact].empty?
    Puppet[:node_name_value] = facts.values[Puppet[:node_name_fact]]
    facts.name = Puppet[:node_name_value]
  end

  # Find our Node
  unless node = Puppet::Node.find(Puppet[:node_name_value])
    raise "Could not find node #{Puppet[:node_name_value]}"
  end

  # Merge in the facts.
  node.merge(facts.values)

  # Allow users to load the classes that puppet agent creates.
  if options[:loadclasses]
    file = Puppet[:classfile]
    if FileTest.exists?(file)
      unless FileTest.readable?(file)
        $stderr.puts "#{file} is not readable"
        exit(63)
      end
      node.classes = File.read(file).split(/[\s\n]+/)
    end
  end

  begin
    # Compile our catalog
    starttime = Time.now
    catalog = Puppet::Resource::Catalog.find(node.name, :use_node => node)

    # Translate it to a RAL catalog
    catalog = catalog.to_ral

    catalog.finalize

    catalog.retrieval_duration = Time.now - starttime

    require 'puppet/configurer'
    configurer = Puppet::Configurer.new
    report = configurer.run(:skip_plugin_download => true, :catalog => catalog)

    if not report
      exit(1)
    elsif options[:detailed_exitcodes] then
      exit(report.exit_status)
    else
      exit(0)
    end
  rescue => detail
    puts detail.backtrace if Puppet[:trace]
    $stderr.puts detail.message
    exit(1)
  end
end

#parseonlyObject



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/puppet/application/apply.rb', line 60

def parseonly
  # Set our code or file to use.
  if options[:code] or command_line.args.length == 0
    Puppet[:code] = options[:code] || STDIN.read
  else
    Puppet[:manifest] = command_line.args.shift
  end
  begin
    Puppet::Node::Environment.new(Puppet[:environment]).known_resource_types
  rescue => detail
    Puppet.err detail
    exit 1
  end
  exit 0
end

#run_commandObject



29
30
31
32
33
34
35
36
37
# File 'lib/puppet/application/apply.rb', line 29

def run_command
  if options[:catalog]
    apply
  elsif Puppet[:parseonly]
    parseonly
  else
    main
  end
end

#setupObject



147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/puppet/application/apply.rb', line 147

def setup
  exit(Puppet.settings.print_configs ? 0 : 1) if Puppet.settings.print_configs?

  # If noop is set, then also enable diffs
  Puppet[:show_diff] = true if Puppet[:noop]

  Puppet::Util::Log.newdestination(:console) unless options[:logset]
  client = nil
  server = nil

  Signal.trap(:INT) do
    $stderr.puts "Exiting"
    exit(1)
  end

  # we want the last report to be persisted locally
  Puppet::Transaction::Report.cache_class = :yaml

  if options[:debug]
    Puppet::Util::Log.level = :debug
  elsif options[:verbose]
    Puppet::Util::Log.level = :info
  end
end