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 158 159 160 161 162
|
#!/usr/bin/env ruby
#
# = Synopsis
#
# Generate a reference for all Puppet types. Largely meant for internal Reductive
# Labs use.
#
# = Usage
#
# puppetdoc [-a|--all] [-h|--help] [-m|--mode <text|pdf|trac> [-r|--reference <[type]|configuration|..>]
#
# = Description
#
# This command generates a restructured-text document describing all installed
# Puppet types or all allowable arguments to puppet executables. It is largely
# meant for internal use and is used to generate the reference document
# available on the Reductive Labs web site.
#
# = Options
#
# all::
# Output the docs for all of the reference types.
#
# help::
# Print this help message
#
# mode::
# Determine the output mode. Valid modes are 'text', 'trac', and 'pdf'. Note that 'trac' mode only works on Reductive Labs servers. The default mode is 'text'.
#
# reference::
# Build a particular reference. Get a list of references by running +puppetdoc --list+.
#
# = Example
#
# $ puppetdoc -r type > /tmp/type_reference.rst
#
# = Author
#
# Luke Kanies
#
# = Copyright
#
# Copyright (c) 2005-2007 Reductive Labs, LLC
# Licensed under the GNU Public License
require 'puppet'
require 'puppet/util/reference'
require 'puppet/network/handler'
require 'getoptlong'
result = GetoptLong.new(
[ "--all", "-a", GetoptLong::NO_ARGUMENT ],
[ "--list", "-l", GetoptLong::NO_ARGUMENT ],
[ "--format", "-f", GetoptLong::REQUIRED_ARGUMENT ],
[ "--mode", "-m", GetoptLong::REQUIRED_ARGUMENT ],
[ "--reference", "-r", GetoptLong::REQUIRED_ARGUMENT ],
[ "--help", "-h", GetoptLong::NO_ARGUMENT ]
)
debug = false
$tab = " "
options = {:references => [], :mode => :text, :format => :to_rest}
Reference = Puppet::Util::Reference
begin
result.each { |opt,arg|
case opt
when "--all"
options[:all] = true
when "--format"
method = "to_%s" % arg
if Reference.method_defined?(method)
options[:format] = method
else
raise "Invalid output format %s" % arg
end
when "--mode"
if Reference.modes.include?(arg)
options[:mode] = arg.intern
else
raise "Invalid output mode %s" % arg
end
when "--list"
puts Reference.references.collect { |r| Reference.reference(r).doc }.join("\n")
exit(0)
when "--reference"
options[:references] << arg.intern
when "--help"
if Puppet.features.usage?
RDoc::usage && exit
else
puts "No help available unless you have RDoc::usage installed"
exit
end
end
}
rescue GetoptLong::InvalidOption => detail
$stderr.puts "Try '#{$0} --help'"
exit(1)
end
if options[:all]
# Don't add dynamic references to the "all" list.
options[:references] = Reference.references.reject do |ref|
Reference.reference(ref).dynamic?
end
end
if options[:references].empty?
options[:references] << :type
end
case options[:mode]
when :trac
options[:references].each do |name|
section = Puppet::Util::Reference.reference(name) or raise "Could not find section %s" % name
unless options[:mode] == :pdf
section.trac
end
end
else
text = ""
if options[:references].length > 1
with_contents = false
else
with_contents = true
end
exit_code = 0
options[:references].sort { |a,b| a.to_s <=> b.to_s }.each do |name|
raise "Could not find reference %s" % name unless section = Puppet::Util::Reference.reference(name)
begin
# Add the per-section text, but with no ToC
text += section.send(options[:format], with_contents)
rescue => detail
puts detail.backtrace
$stderr.puts "Could not generate reference %s: %s" % [name, detail]
exit_code = 1
next
end
end
unless with_contents # We've only got one reference
text += Puppet::Util::Reference.footer
end
# Replace the trac links, since they're invalid everywhere else
text.gsub!(/`\w+\s+([^`]+)`:trac:/) { |m| $1 }
if options[:mode] == :pdf
Puppet::Util::Reference.pdf(text)
else
puts text
end
exit exit_code
end
|