1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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
69
70
71
72
73
74
75
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
146
147
148
149
150
151
152
153
154
155
156
157
|
require 'puppet/application'
class Puppet::Application::Apply < Puppet::Application
should_parse_config
option("--debug","-d")
option("--execute EXECUTE","-e") do |arg|
options[:code] = arg
end
option("--loadclasses","-L")
option("--verbose","-v")
option("--use-nodes")
option("--detailed-exitcodes")
option("--apply catalog", "-a catalog") do |arg|
options[:catalog] = arg
end
option("--logdest LOGDEST", "-l") do |arg|
begin
Puppet::Util::Log.newdestination(arg)
options[:logset] = true
rescue => detail
$stderr.puts detail.to_s
end
end
def run_command
if options[:catalog]
apply
elsif Puppet[:parseonly]
parseonly
else
main
end
end
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
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
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[:certname])
raise "Could not find facts for #{Puppet[:certname]}"
end
# Find our Node
unless node = Puppet::Node.find(Puppet[:certname])
raise "Could not find node #{Puppet[:certname]}"
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)
exit( Puppet[:noop] ? 0 : options[:detailed_exitcodes] ? report.exit_status : 0 )
rescue => detail
puts detail.backtrace if Puppet[:trace]
$stderr.puts detail.message
exit(1)
end
end
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
trap(:INT) do
$stderr.puts "Exiting"
exit(1)
end
if options[:debug]
Puppet::Util::Log.level = :debug
elsif options[:verbose]
Puppet::Util::Log.level = :info
end
end
end
|