generate-puppetfile 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/README.md +22 -0
- data/bin/generate-puppetfile +7 -0
- data/lib/generate_puppetfile.rb +5 -0
- data/lib/generate_puppetfile/bin.rb +153 -0
- data/lib/generate_puppetfile/optparser.rb +33 -0
- data/lib/generate_puppetfile/version.rb +3 -0
- metadata +51 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZmU2ODhjY2FlMTczMTAxMzIzY2ZmOWVlZmRkYzBjMTBjNGFiN2JmMA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZjhmMzUwOTM4Yzc1YTFmZjUxMjA2Njg2NGVkZWIwZDRiMjFjNGNlNA==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZDE0Njg0ZmNhY2Q1MzU4MTI1MjUzZTgwM2NiYmQ1MDJiMjQ3YzUwZmJkNWIy
|
10
|
+
NGMxODA0M2Y3ZDJiNjllNDYxY2VkMzE2ZjQxZDFjZDVlYThjMDc0NmRlZTFi
|
11
|
+
YTY4ZWM3Y2IyNjkwYmVlZGIyYjM2NmU4YjcwMWJkZjU1NGIwMmQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YzM5MTUyZDNiOWQ4MDE3YzcyMjNhNWE0MTA3MmVkYmI4YmQ2NzExYjM2NzIx
|
14
|
+
NzdlMTU3M2MwOThlZmNiYzFkZmM0ZDAyY2IwNDE2ZDZkOWQzZDliNzM5NDE3
|
15
|
+
N2ZjOGE3MmE5NGJiYWFjZjBiZjk1NDgwNjdmZmRlOTUwZTUxMzk=
|
data/README.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Tired of searching for dependencies on the forge and hoping you got everything? Use generate-puppetfile to generate a list of modules and their dependencies in a Puppetfile format for use with r10k or librarian-puppet.
|
2
|
+
|
3
|
+
To use this, simply clone the repository and run the generate-puppetfile script with a list of valid module names:
|
4
|
+
|
5
|
+
```
|
6
|
+
$ ./generate-puppetfile echocat/nfs rnelson0/certs
|
7
|
+
Download echocat/nfs and its dependencies...
|
8
|
+
Download rnelson0/certs and its dependencies...
|
9
|
+
Module download complete. Generating Puppetfile.
|
10
|
+
|
11
|
+
Here is your suggested Puppetfile:
|
12
|
+
----------------------------------
|
13
|
+
|
14
|
+
forge 'http://forge.puppetlabs.com'
|
15
|
+
|
16
|
+
mod 'echocat/nfs', '1.7.1'
|
17
|
+
mod 'herculesteam/augeasproviders_core', '2.1.2'
|
18
|
+
mod 'herculesteam/augeasproviders_shellvar', '2.2.0'
|
19
|
+
mod 'puppetlabs/concat', '1.2.4'
|
20
|
+
mod 'puppetlabs/stdlib', '4.9.0'
|
21
|
+
mod 'rnelson0/certs', '0.6.2'
|
22
|
+
```
|
@@ -0,0 +1,153 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'generate_puppetfile'
|
3
|
+
require 'generate_puppetfile/optparser'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
module GeneratePuppetfile
|
7
|
+
class Bin
|
8
|
+
Module_regex = Regexp.new("mod ['\"]([a-z0-9_]+\/[a-z0-9_]+)['\"](, ['\"](\\d\.\\d\.\\d)['\"])?", Regexp::IGNORECASE)
|
9
|
+
@options = {}
|
10
|
+
|
11
|
+
def initialize(args)
|
12
|
+
@args = args
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
@options = GeneratePuppetfile::OptParser.parse(@args)
|
17
|
+
|
18
|
+
helpmsg = "generate-puppetfile: try 'generate-puppetfile --help' for more information."
|
19
|
+
|
20
|
+
if @args[0].nil? && (! @options[:puppetfile])
|
21
|
+
puts "generate-puppetfile: No modules or existing Puppetfile specified."
|
22
|
+
puts helpmsg
|
23
|
+
return 1
|
24
|
+
end
|
25
|
+
|
26
|
+
forge_module_list = Array.new
|
27
|
+
|
28
|
+
if @args
|
29
|
+
puts "\nProcessing modules from the command line...\n\n" if @options[:debug]
|
30
|
+
cli_modules = Array.new
|
31
|
+
@args.each do |modulename|
|
32
|
+
validate(modulename) && (cli_modules.push(modulename))
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
puppetfile_contents = Hash.new
|
37
|
+
extras = Array.new
|
38
|
+
if @options[:puppetfile]
|
39
|
+
puts "\nProcessing the puppetfile '#{@options[:puppetfile]}'...\n\n" if @options[:debug]
|
40
|
+
puppetfile_contents = read_puppetfile(@options[:puppetfile])
|
41
|
+
extras = puppetfile_contents[:extras]
|
42
|
+
end
|
43
|
+
|
44
|
+
forge_module_list.push(*cli_modules) if @args
|
45
|
+
forge_module_list.push(*puppetfile_contents[:modules]) if puppetfile_contents[:modules]
|
46
|
+
|
47
|
+
list_modules(forge_module_list) if puppetfile_contents && @options[:debug]
|
48
|
+
list_extras(puppetfile_contents[:extras]) if puppetfile_contents[:extras] && @options[:debug]
|
49
|
+
|
50
|
+
generate_puppetfile_contents(forge_module_list, puppetfile_contents[:extras])
|
51
|
+
end
|
52
|
+
|
53
|
+
def validate (modulename)
|
54
|
+
success = (modulename =~ /[a-z0-9_]\/[a-z0-9_]/i)
|
55
|
+
puts " '#{modulename}' is not a valid module name. Skipping." unless success
|
56
|
+
success
|
57
|
+
end
|
58
|
+
|
59
|
+
def list_modules (module_list)
|
60
|
+
puts "\nListing discovered modules from CLI and/or Puppetfile:\n\n"
|
61
|
+
module_list.each do |name|
|
62
|
+
puts " #{name}"
|
63
|
+
end
|
64
|
+
puts ""
|
65
|
+
end
|
66
|
+
|
67
|
+
def list_extras (extras)
|
68
|
+
puts "\nExtras found in the existing Puppetfile:\n\n"
|
69
|
+
extras.each do |line|
|
70
|
+
puts " #{line}"
|
71
|
+
end
|
72
|
+
puts ""
|
73
|
+
end
|
74
|
+
|
75
|
+
def read_puppetfile (puppetfile)
|
76
|
+
puppetfile_contents = {
|
77
|
+
:modules => Array.new,
|
78
|
+
:extras => Array.new,
|
79
|
+
}
|
80
|
+
|
81
|
+
File.foreach(puppetfile) do |line|
|
82
|
+
if Module_regex.match(line)
|
83
|
+
name = $1
|
84
|
+
print " #{name} looks like a forge module.\n" if @options[:debug]
|
85
|
+
puppetfile_contents[:modules].push(name)
|
86
|
+
else
|
87
|
+
next if line =~ /^forge/
|
88
|
+
next if line =~ /^\s+$/
|
89
|
+
next if line =~ /# Discovered elements from existing Puppetfile/
|
90
|
+
|
91
|
+
puppetfile_contents[:extras].push(line)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
puppetfile_contents
|
96
|
+
end
|
97
|
+
|
98
|
+
def generate_puppetfile_contents (module_list, extras = [])
|
99
|
+
# cli_modules is a hash of module name => version
|
100
|
+
# puppetfile_contents is a hash with two keys:
|
101
|
+
# module_list is an array of forge module names to be downloaded
|
102
|
+
# extras is an array of strings
|
103
|
+
workspace = `mktemp -d`
|
104
|
+
|
105
|
+
modulepath = "--modulepath #{workspace.chomp} "
|
106
|
+
silence = '>/dev/null 2>&1 '
|
107
|
+
strip_colors = 'sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"'
|
108
|
+
|
109
|
+
puts "\nInstalling modules. This may take a few minutes.\n\n"
|
110
|
+
module_list.each do |name|
|
111
|
+
command = "puppet module install #{name} "
|
112
|
+
command += modulepath + silence
|
113
|
+
|
114
|
+
system(command)
|
115
|
+
end
|
116
|
+
|
117
|
+
puppetfile_header = <<-EOF
|
118
|
+
forge 'http://forge.puppetlabs.com'
|
119
|
+
|
120
|
+
# Modules discovered by generate-puppetfile
|
121
|
+
EOF
|
122
|
+
|
123
|
+
puppetfile_body = `puppet module list #{modulepath} 2>/dev/null | #{strip_colors}`
|
124
|
+
|
125
|
+
puppetfile_body.gsub!(/^\/.*$/, '')
|
126
|
+
puppetfile_body.gsub!(/-/, '/')
|
127
|
+
puppetfile_body.gsub!(/├── /, "mod '")
|
128
|
+
puppetfile_body.gsub!(/└── /, "mod '")
|
129
|
+
puppetfile_body.gsub!(/ \(v/, "', '")
|
130
|
+
puppetfile_body.gsub!(/\)$/, "'")
|
131
|
+
puppetfile_body.gsub!(/^$\n/, '')
|
132
|
+
|
133
|
+
puppetfile_footer = "# Discovered elements from existing Puppetfile\n"
|
134
|
+
extras.each do |line|
|
135
|
+
puppetfile_footer += "#{line}"
|
136
|
+
end
|
137
|
+
|
138
|
+
puts <<-EOF
|
139
|
+
|
140
|
+
|
141
|
+
Your Puppetfile has been generated. Copy and paste between the markers:
|
142
|
+
|
143
|
+
=======================================================================
|
144
|
+
#{puppetfile_header}
|
145
|
+
#{puppetfile_body}
|
146
|
+
#{puppetfile_footer}
|
147
|
+
=======================================================================
|
148
|
+
EOF
|
149
|
+
|
150
|
+
FileUtils.rm_rf(workspace)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'generate_puppetfile'
|
2
|
+
require 'optparse'
|
3
|
+
|
4
|
+
module GeneratePuppetfile
|
5
|
+
class OptParser
|
6
|
+
def self.parse(args)
|
7
|
+
options = {}
|
8
|
+
opts = OptionParser.new do |opts|
|
9
|
+
opts.banner = "generate-puppetfile [OPTIONS] [<MODULE> ... <MODULE>]"
|
10
|
+
|
11
|
+
opts.on('-p', '--puppetfile FILE', 'Name of existing Puppetfile to verify and update') do |file|
|
12
|
+
unless File.readable?(file)
|
13
|
+
puts "\nPuppetfile '#{file}' cannot be read. Are you sure you passed in the correct filename?\n\n"
|
14
|
+
exit 1
|
15
|
+
end
|
16
|
+
|
17
|
+
options[:puppetfile] = file
|
18
|
+
end
|
19
|
+
|
20
|
+
opts.on('-d', '--debug', 'Enable debug logging') do
|
21
|
+
options[:debug] = true
|
22
|
+
end
|
23
|
+
|
24
|
+
opts.on_tail('-v', '--version', 'Show version') do
|
25
|
+
puts "generate-puppetfile v#{GeneratePuppetfile::VERSION}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
opts.parse!(args)
|
30
|
+
options
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
metadata
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: generate-puppetfile
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.9.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Rob Nelson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-10-26 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Generate a Puppetfile for use with r10k based on an existing file or
|
14
|
+
a list of modules.
|
15
|
+
email: rnelson0@gmail.com
|
16
|
+
executables:
|
17
|
+
- generate-puppetfile
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- README.md
|
22
|
+
- bin/generate-puppetfile
|
23
|
+
- lib/generate_puppetfile.rb
|
24
|
+
- lib/generate_puppetfile/bin.rb
|
25
|
+
- lib/generate_puppetfile/optparser.rb
|
26
|
+
- lib/generate_puppetfile/version.rb
|
27
|
+
homepage: https://github.com/rnelson0/puppet-generate-puppetfile
|
28
|
+
licenses:
|
29
|
+
- MIT
|
30
|
+
metadata: {}
|
31
|
+
post_install_message:
|
32
|
+
rdoc_options: []
|
33
|
+
require_paths:
|
34
|
+
- lib
|
35
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ! '>='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
requirements: []
|
46
|
+
rubyforge_project:
|
47
|
+
rubygems_version: 2.4.3
|
48
|
+
signing_key:
|
49
|
+
specification_version: 4
|
50
|
+
summary: Generate a Puppetfile
|
51
|
+
test_files: []
|