puppet_generator 0.5.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.rdebugrc +7 -0
- data/.rspec +2 -0
- data/.simplecov +8 -0
- data/.travis.yml +6 -0
- data/.yardopts +5 -0
- data/CONTRIBUTING.md +8 -0
- data/Gemfile +34 -0
- data/LICENSE.md +22 -0
- data/README.DEVELOPER.md +11 -0
- data/README.md +477 -0
- data/Rakefile +3 -0
- data/TODO.md +2 -0
- data/bin/ppgen +16 -0
- data/cucumber.yml +2 -0
- data/features/generate_file_definition.feature +357 -0
- data/features/generate_module_directories.feature +36 -0
- data/features/generate_package_definition.feature +206 -0
- data/features/generate_role_definitions.feature +64 -0
- data/features/generate_user_definition.feature +193 -0
- data/features/list.feature +22 -0
- data/features/log_actions.feature +93 -0
- data/features/step_definitions.rb +3 -0
- data/features/support/env.rb +7 -0
- data/features/tasks.feature +25 -0
- data/gemfiles/Gemfile.default +34 -0
- data/gemfiles/Gemfile.travis +17 -0
- data/lib/puppet_generator/actions/copy_files_to_module_directory.rb +23 -0
- data/lib/puppet_generator/actions/null.rb +9 -0
- data/lib/puppet_generator/api.rb +108 -0
- data/lib/puppet_generator/definition.rb +10 -0
- data/lib/puppet_generator/entry_converters/file.rb +9 -0
- data/lib/puppet_generator/entry_converters/package.rb +9 -0
- data/lib/puppet_generator/entry_converters/role.rb +9 -0
- data/lib/puppet_generator/entry_converters/user.rb +9 -0
- data/lib/puppet_generator/exceptions.rb +104 -0
- data/lib/puppet_generator/export_filters/build_role_includes_for_directory.rb +35 -0
- data/lib/puppet_generator/export_filters/filesystem_attributes.rb +57 -0
- data/lib/puppet_generator/export_filters/null.rb +9 -0
- data/lib/puppet_generator/exporters/directory.rb +23 -0
- data/lib/puppet_generator/exporters/file.rb +17 -0
- data/lib/puppet_generator/exporters/stdout.rb +16 -0
- data/lib/puppet_generator/import_filters/null.rb +9 -0
- data/lib/puppet_generator/import_filters/passwd.rb +22 -0
- data/lib/puppet_generator/import_filters/yaml.rb +20 -0
- data/lib/puppet_generator/importers/directory.rb +21 -0
- data/lib/puppet_generator/importers/file.rb +17 -0
- data/lib/puppet_generator/importers/stdin.rb +16 -0
- data/lib/puppet_generator/logger.rb +62 -0
- data/lib/puppet_generator/main.rb +36 -0
- data/lib/puppet_generator/middleware/apply_export_filters.rb +33 -0
- data/lib/puppet_generator/middleware/check_for_empty_source.rb +16 -0
- data/lib/puppet_generator/middleware/configure_logging.rb +30 -0
- data/lib/puppet_generator/middleware/create_module_directories.rb +42 -0
- data/lib/puppet_generator/middleware/create_output.rb +46 -0
- data/lib/puppet_generator/middleware/create_puppet_object_from_entry.rb +24 -0
- data/lib/puppet_generator/middleware/enable_debugging_libraries.rb +15 -0
- data/lib/puppet_generator/middleware/execute_actions.rb +34 -0
- data/lib/puppet_generator/middleware/filter_imported_data.rb +22 -0
- data/lib/puppet_generator/middleware/handle_errors.rb +62 -0
- data/lib/puppet_generator/middleware/output_debug_information_for_models.rb +21 -0
- data/lib/puppet_generator/middleware/read_input.rb +27 -0
- data/lib/puppet_generator/models/action.rb +36 -0
- data/lib/puppet_generator/models/base.rb +115 -0
- data/lib/puppet_generator/models/class_based_model.rb +56 -0
- data/lib/puppet_generator/models/entry_converter.rb +39 -0
- data/lib/puppet_generator/models/error_message.rb +60 -0
- data/lib/puppet_generator/models/export_filter.rb +44 -0
- data/lib/puppet_generator/models/exporter.rb +51 -0
- data/lib/puppet_generator/models/filesystem_based_model.rb +63 -0
- data/lib/puppet_generator/models/import_filter.rb +44 -0
- data/lib/puppet_generator/models/importer.rb +52 -0
- data/lib/puppet_generator/models/logger.rb +11 -0
- data/lib/puppet_generator/models/template.rb +120 -0
- data/lib/puppet_generator/puppet_helper.rb +19 -0
- data/lib/puppet_generator/puppet_objects/file.rb +29 -0
- data/lib/puppet_generator/puppet_objects/package.rb +24 -0
- data/lib/puppet_generator/puppet_objects/role.rb +27 -0
- data/lib/puppet_generator/puppet_objects/user.rb +27 -0
- data/lib/puppet_generator/setup/bare.rb +25 -0
- data/lib/puppet_generator/setup/default_actions.rb +9 -0
- data/lib/puppet_generator/setup/default_entry_converter.rb +8 -0
- data/lib/puppet_generator/setup/default_error_messages.rb +10 -0
- data/lib/puppet_generator/setup/default_export_filter.rb +9 -0
- data/lib/puppet_generator/setup/default_exporter.rb +11 -0
- data/lib/puppet_generator/setup/default_import_filter.rb +10 -0
- data/lib/puppet_generator/setup/default_importer.rb +10 -0
- data/lib/puppet_generator/setup/file.rb +29 -0
- data/lib/puppet_generator/setup/module.rb +22 -0
- data/lib/puppet_generator/setup/package.rb +27 -0
- data/lib/puppet_generator/setup/role.rb +28 -0
- data/lib/puppet_generator/setup/user.rb +27 -0
- data/lib/puppet_generator/task.rb +39 -0
- data/lib/puppet_generator/ui/commandline_parser_helper.rb +31 -0
- data/lib/puppet_generator/ui/create.rb +59 -0
- data/lib/puppet_generator/ui/runner.rb +23 -0
- data/lib/puppet_generator/ui/tasks.rb +16 -0
- data/lib/puppet_generator/version.rb +4 -0
- data/lib/puppet_generator.rb +79 -0
- data/puppet_generator.gemspec +35 -0
- data/rakefiles/default.rake +3 -0
- data/rakefiles/travis.rake +3 -0
- data/script/console +8 -0
- data/script/terminal +16 -0
- data/spec/examples/actions/missing_method.rb +7 -0
- data/spec/examples/apply_export_filters/file.txt +0 -0
- data/spec/examples/entry_converters/missing_method.rb +7 -0
- data/spec/examples/execute_actions/file.txt +0 -0
- data/spec/examples/export_filter/invalid_filter_1.rb +8 -0
- data/spec/examples/export_filter/invalid_filter_2.rb +7 -0
- data/spec/examples/export_filter/missing_method.rb +7 -0
- data/spec/examples/exporter/missing_method.rb +7 -0
- data/spec/examples/exporter/test.d/.gitkeep +0 -0
- data/spec/examples/exporter/test_file.txt +1 -0
- data/spec/examples/import_filter/forbidden_keyword.rb +0 -0
- data/spec/examples/import_filter/invalid_filter_1.rb +8 -0
- data/spec/examples/import_filter/invalid_filter_2.rb +7 -0
- data/spec/examples/import_filter/missing_method.rb +7 -0
- data/spec/examples/importer/missing_method.rb +7 -0
- data/spec/examples/importer/test.d/.gitkeep +0 -0
- data/spec/examples/importer/test_file.txt +1 -0
- data/spec/examples/templates/invalid_template.pp.erb +1 -0
- data/spec/examples/templates/missing_method.rb +7 -0
- data/spec/export_filters/build_role_includes_for_directory_spec.rb +39 -0
- data/spec/middleware/apply_export_filters_spec.rb +45 -0
- data/spec/middleware/execute_actions_spec.rb +44 -0
- data/spec/middleware/handle_errors_spec.rb +12 -0
- data/spec/models/action_spec.rb +37 -0
- data/spec/models/entry_converter_spec.rb +59 -0
- data/spec/models/error_message_spec.rb +78 -0
- data/spec/models/export_filter_spec.rb +36 -0
- data/spec/models/exporter_spec.rb +71 -0
- data/spec/models/import_filter_spec.rb +33 -0
- data/spec/models/importer_spec.rb +66 -0
- data/spec/models/template_spec.rb +47 -0
- data/spec/puppet_generator_spec.rb +7 -0
- data/spec/setup/role_spec.rb +22 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/support/filesystem_helper.rb +12 -0
- data/spec/support/libraries.rb +10 -0
- data/spec/support/rspec_configuration.rb +5 -0
- data/templates/puppet/many_per_file/file.pp.erb +16 -0
- data/templates/puppet/many_per_file/package.pp.erb +10 -0
- data/templates/puppet/many_per_file/role.pp.erb +7 -0
- data/templates/puppet/many_per_file/user.pp.erb +23 -0
- data/templates/puppet/one_per_file/file.pp.erb +14 -0
- data/templates/puppet/one_per_file/package.pp.erb +8 -0
- data/templates/puppet/one_per_file/role.pp.erb +5 -0
- data/templates/puppet/one_per_file/user.pp.erb +21 -0
- metadata +374 -0
@@ -0,0 +1,104 @@
|
|
1
|
+
module PuppetGenerator
|
2
|
+
module Exceptions
|
3
|
+
# exceptions raise because of a wrong usage by the user
|
4
|
+
class UserError < Exception; end
|
5
|
+
|
6
|
+
#raise if a file does not exist in filesystem
|
7
|
+
class WrongTemplateChosen < UserError; end
|
8
|
+
|
9
|
+
#raised if source is not a directory, file etc.
|
10
|
+
class InvalidSource < UserError; end
|
11
|
+
|
12
|
+
#raised if output channel is not directory, file etc.
|
13
|
+
class InvalidOutputChannel < UserError; end
|
14
|
+
|
15
|
+
#raised if template can not be found
|
16
|
+
class TemplateNotFound < UserError; end
|
17
|
+
|
18
|
+
#raised if something goes wrong internally
|
19
|
+
#should never happend
|
20
|
+
class InternalError < Exception; end
|
21
|
+
|
22
|
+
#raised if source is empty
|
23
|
+
class EmptySource < UserError; end
|
24
|
+
|
25
|
+
#raised if an unknown input filter was
|
26
|
+
#requested by the user
|
27
|
+
class UnknownImportFilter < UserError; end
|
28
|
+
|
29
|
+
#raised if an unknown export filter was
|
30
|
+
#requested by the user
|
31
|
+
class UnknownExportFilter < UserError; end
|
32
|
+
|
33
|
+
#raised if an unknown action was
|
34
|
+
#requested by the user
|
35
|
+
class UnknownAction < UserError; end
|
36
|
+
|
37
|
+
#raised if an error happened during decoding of yaml
|
38
|
+
class InvalidYamlInput < UserError; end
|
39
|
+
|
40
|
+
#raised if an error happened during decoding of passwd
|
41
|
+
class InvalidPasswdInput < UserError; end
|
42
|
+
|
43
|
+
#raised if an error happened during copying files
|
44
|
+
class ErrorDuringCopyFiles < UserError; end
|
45
|
+
|
46
|
+
#raised if one tries to delete an instance which
|
47
|
+
#does not exist
|
48
|
+
class InstanceNotFound < InternalError; end
|
49
|
+
|
50
|
+
#raised if one tries to use an unknown error
|
51
|
+
#message
|
52
|
+
class UnknownErrorMessage < InternalError; end
|
53
|
+
|
54
|
+
#raised if one tries to use a keyword whose use
|
55
|
+
#is restricted
|
56
|
+
class UnauthorizedUseOfKeyword < InternalError; end
|
57
|
+
|
58
|
+
#raised if one uses invalid search criteria
|
59
|
+
class InvalidSearchCriteria < InternalError; end
|
60
|
+
|
61
|
+
#raised if one uses an invalid template
|
62
|
+
class InvalidTemplate < InternalError; end
|
63
|
+
|
64
|
+
#raised if one uses an invalid action
|
65
|
+
class InvalidAction < InternalError; end
|
66
|
+
|
67
|
+
#raised if the code which defines an import filter
|
68
|
+
#which is malformed
|
69
|
+
class InvalidImportFilter < InternalError; end
|
70
|
+
|
71
|
+
#raised if the code which defines an import filter
|
72
|
+
#which is malformed
|
73
|
+
class InvalidExportFilter < InternalError; end
|
74
|
+
|
75
|
+
#raised if the code which defines an importer
|
76
|
+
#which is malformed
|
77
|
+
class InvalidImporter < InternalError; end
|
78
|
+
|
79
|
+
#raised if the code which defines an exporter
|
80
|
+
#which is malformed
|
81
|
+
class InvalidExporter < InternalError; end
|
82
|
+
|
83
|
+
#raised if the code which defines an entry converter
|
84
|
+
#which is malformed
|
85
|
+
class InvalidEntryConverter < InternalError; end
|
86
|
+
|
87
|
+
#raised if the code which defines an import filter
|
88
|
+
#is malformed
|
89
|
+
class MethodNeedsToBeImplemented < InternalError; end
|
90
|
+
|
91
|
+
#raised if one tries to use an unimplemented exception
|
92
|
+
class ExceptionNeedsToBeImplemented < InternalError; end
|
93
|
+
|
94
|
+
#raised if an file system error occured
|
95
|
+
class FilesystemError < Exception ; end
|
96
|
+
|
97
|
+
#raise if a directory does not exist in filesystem
|
98
|
+
class DirectoryDoesNotExist < FilesystemError; end
|
99
|
+
|
100
|
+
#raise if a file does not exist in filesystem
|
101
|
+
class FileDoesNotExist < FilesystemError; end
|
102
|
+
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module PuppetGenerator
|
2
|
+
module ExportFilters
|
3
|
+
class BuildRoleIncludesForDirectory
|
4
|
+
|
5
|
+
include PuppetHelper
|
6
|
+
|
7
|
+
def convert(objects)
|
8
|
+
|
9
|
+
objects.collect do |o|
|
10
|
+
path = o[:name]
|
11
|
+
|
12
|
+
next unless directory? path
|
13
|
+
|
14
|
+
result = {
|
15
|
+
name: path,
|
16
|
+
includes: includes(path),
|
17
|
+
}
|
18
|
+
end.compact
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def includes(path)
|
25
|
+
Dir.glob( File.join( path, '*.pp' ) ).collect { |f| File.basename( f, '.pp') }.sort
|
26
|
+
rescue
|
27
|
+
PuppetGenerator.logger.warn(self.class.name) { "Directory \"#{o[:name]}\" does not exist. There's no chance to get subentries for it. Therefor I use the name only and do not generate \"include\"-instructions." }
|
28
|
+
end
|
29
|
+
|
30
|
+
def directory?(path)
|
31
|
+
FileTest.directory? path
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module PuppetGenerator
|
2
|
+
module ExportFilters
|
3
|
+
class FilesystemAttributes
|
4
|
+
def convert(objects)
|
5
|
+
|
6
|
+
objects.collect do |o|
|
7
|
+
path = o[:name]
|
8
|
+
|
9
|
+
if File.exists? path
|
10
|
+
fs_object_info = stats(path)
|
11
|
+
|
12
|
+
o.merge!( {
|
13
|
+
type: type(path),
|
14
|
+
owner: owner(fs_object_info),
|
15
|
+
mode: mode(fs_object_info),
|
16
|
+
} )
|
17
|
+
end
|
18
|
+
|
19
|
+
o
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def stats(path)
|
27
|
+
File::Stat.new(path)
|
28
|
+
end
|
29
|
+
|
30
|
+
def mode(fs_object_info)
|
31
|
+
"%o" % fs_object_info.mode
|
32
|
+
end
|
33
|
+
|
34
|
+
def owner(fs_object_info)
|
35
|
+
Etc.getpwuid(fs_object_info.uid).name
|
36
|
+
end
|
37
|
+
|
38
|
+
def type(path)
|
39
|
+
if file?(path)
|
40
|
+
return 'file'
|
41
|
+
elsif directory?(path)
|
42
|
+
return 'directory'
|
43
|
+
else
|
44
|
+
return 'file'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def file?(path)
|
49
|
+
FileTest.file? path
|
50
|
+
end
|
51
|
+
|
52
|
+
def directory?(path)
|
53
|
+
FileTest.directory? path
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module PuppetGenerator
|
2
|
+
module Exporters
|
3
|
+
class Directory
|
4
|
+
|
5
|
+
def write(directory, definitions=[])
|
6
|
+
::Dir.mkdir directory unless ::Dir.exists? directory
|
7
|
+
|
8
|
+
definitions.each do |d|
|
9
|
+
filename = ::File.join( directory, "#{d.file_name}" )
|
10
|
+
|
11
|
+
::File.open(filename, "w") do |f|
|
12
|
+
f.puts d.text
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def writes_to?(destination)
|
18
|
+
/^(?:dir|directory):/ === destination
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module PuppetGenerator
|
2
|
+
module Exporters
|
3
|
+
class File
|
4
|
+
|
5
|
+
def write(filename, definitions)
|
6
|
+
::File.open(filename, "w") do |f|
|
7
|
+
definitions.each { |d| f.puts d.text }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def writes_to?(destination)
|
12
|
+
/^file:/ === destination
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module PuppetGenerator
|
2
|
+
module Exporters
|
3
|
+
class Stdout
|
4
|
+
|
5
|
+
def write( output=$stdout , definitions=[] )
|
6
|
+
output = definitions.inject( [] ) { |strings, definition| strings << definition.text }
|
7
|
+
printf "%s", output.join("\n")
|
8
|
+
end
|
9
|
+
|
10
|
+
def writes_to?(destination)
|
11
|
+
/^stdout/ === destination
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module PuppetGenerator
|
2
|
+
module ImportFilters
|
3
|
+
class Passwd
|
4
|
+
def convert(lines)
|
5
|
+
lines.collect do |line|
|
6
|
+
passwd = line.split(/:/)
|
7
|
+
raise Exceptions::InvalidPasswdInput if passwd.size < 7
|
8
|
+
|
9
|
+
(username,_,uid,gid,_,homedir,shell) = passwd
|
10
|
+
|
11
|
+
{
|
12
|
+
name: username,
|
13
|
+
userid: uid,
|
14
|
+
groupid: gid,
|
15
|
+
homedir: homedir,
|
16
|
+
shell: shell,
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module PuppetGenerator
|
2
|
+
module ImportFilters
|
3
|
+
class Yaml
|
4
|
+
def convert(lines)
|
5
|
+
hash_keys_from_str_to_sym(Psych.load(lines.join("\n")))
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def hash_keys_from_str_to_sym(hash)
|
11
|
+
hash.inject([]) do |result,(name,attributes)|
|
12
|
+
result << attributes.inject( { name: name} ) { |result, (k,v)| result[k.to_sym] = v; result }
|
13
|
+
end
|
14
|
+
rescue Exception => e
|
15
|
+
raise Exceptions::InvalidYamlInput, e.message
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module PuppetGenerator
|
2
|
+
module Importers
|
3
|
+
class Directory
|
4
|
+
attr_reader :lines
|
5
|
+
|
6
|
+
def read( directory )
|
7
|
+
lines = []
|
8
|
+
::Find.find( directory ) { |path| lines << path }
|
9
|
+
|
10
|
+
lines
|
11
|
+
rescue Exception => e
|
12
|
+
raise Exceptions::DirectoryDoesNotExist, e.message
|
13
|
+
end
|
14
|
+
|
15
|
+
def reads_from?(source)
|
16
|
+
FileTest.directory? source
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module PuppetGenerator
|
2
|
+
module Importers
|
3
|
+
class File
|
4
|
+
|
5
|
+
def read(filename)
|
6
|
+
::File.open(filename).readlines.collect { |l| l.chomp }
|
7
|
+
rescue Exception => e
|
8
|
+
raise Exceptions::FileDoesNotExist, e.message
|
9
|
+
end
|
10
|
+
|
11
|
+
def reads_from?(source)
|
12
|
+
FileTest.file? source
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
class ::Logger
|
2
|
+
SILENT = 9999 unless defined? SILENT
|
3
|
+
end
|
4
|
+
|
5
|
+
module PuppetGenerator
|
6
|
+
class Logger
|
7
|
+
|
8
|
+
extend ::Forwardable
|
9
|
+
def_delegators :@logger, :fatal, :warn, :debug, :info, :error, :unknown
|
10
|
+
|
11
|
+
attr_reader :mode
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@logger = ::Logger.new($stderr)
|
15
|
+
self.mode = :info
|
16
|
+
end
|
17
|
+
|
18
|
+
def mode=(m)
|
19
|
+
@mode = m
|
20
|
+
|
21
|
+
case m
|
22
|
+
when :debug
|
23
|
+
@logger.level = ::Logger::DEBUG
|
24
|
+
format_debug
|
25
|
+
when :silent
|
26
|
+
@logger.level = ::Logger::SILENT
|
27
|
+
when :info
|
28
|
+
@logger.level = ::Logger::INFO
|
29
|
+
format_standard
|
30
|
+
else
|
31
|
+
@logger.level = ::Logger::INFO
|
32
|
+
format_standard
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def format_debug
|
39
|
+
@logger.formatter = proc { |severity, datetime, progname , msg|
|
40
|
+
debug_msg("%s %s %s: %s\n" % [ datetime, severity, progname, msg ])
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
def format_standard
|
45
|
+
@logger.formatter = proc { |severity, datetime, _, msg|
|
46
|
+
info_msg( "%s %s: %s\n" % [ datetime, severity, msg ] )
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
def error_msg(msg)
|
51
|
+
ANSI.red(msg)
|
52
|
+
end
|
53
|
+
|
54
|
+
def info_msg(msg)
|
55
|
+
msg
|
56
|
+
end
|
57
|
+
|
58
|
+
def debug_msg(msg)
|
59
|
+
msg
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module PuppetGenerator
|
2
|
+
class << self
|
3
|
+
def logger
|
4
|
+
@logger ||= Logger.new
|
5
|
+
end
|
6
|
+
|
7
|
+
def library_name
|
8
|
+
self.to_s
|
9
|
+
end
|
10
|
+
|
11
|
+
def gem_load_path
|
12
|
+
library_name.underscore
|
13
|
+
end
|
14
|
+
|
15
|
+
def root_directory
|
16
|
+
File.expand_path('../../../', __FILE__)
|
17
|
+
end
|
18
|
+
|
19
|
+
def enable_coverage_report
|
20
|
+
require 'simplecov'
|
21
|
+
|
22
|
+
SimpleCov.start
|
23
|
+
SimpleCov.command_name 'cucumber'
|
24
|
+
SimpleCov.root PuppetGenerator.root_directory
|
25
|
+
rescue
|
26
|
+
self.logger.warn(self) { "Please note, this code is just for coverage testing. You need to install the \"simplecov\"-gem to make it work" }
|
27
|
+
end
|
28
|
+
|
29
|
+
def enable_debugging_libraries
|
30
|
+
require 'pry'
|
31
|
+
require 'debugger'
|
32
|
+
rescue
|
33
|
+
self.logger.warn(self) { "Please note, this code is just for debugging the library. You need to install the \"ruby-debug19\"- and \"pry\"-gem to make it work" }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module PuppetGenerator
|
2
|
+
module Middleware
|
3
|
+
class ApplyExportFilters
|
4
|
+
|
5
|
+
def initialize(app)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(task)
|
10
|
+
PuppetGenerator.logger.debug(self.class.name){ "Filter the output with filter \"#{task.meta[:requested_export_filter].join(", ")}\"" }
|
11
|
+
|
12
|
+
task.body = apply_filters(task.meta[:requested_export_filter], task.body)
|
13
|
+
|
14
|
+
PuppetGenerator.logger.debug(self.class.name) { "Count output lines: #{task.body.size}" }
|
15
|
+
|
16
|
+
@app.call(task)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def apply_filters(filters, data, &block)
|
22
|
+
|
23
|
+
filters.inject(data) do |data,filter|
|
24
|
+
active_filter = Models::ExportFilter.find filter
|
25
|
+
raise Exceptions::UnknownExportFilter unless active_filter
|
26
|
+
|
27
|
+
data = active_filter.convert(data)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module PuppetGenerator
|
2
|
+
module Middleware
|
3
|
+
class CheckForEmptySource
|
4
|
+
def initialize(app)
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(task)
|
9
|
+
PuppetGenerator.logger.debug(self.class.name){ "Checking if given source \"#{task.meta[:source]}\" is empty." }
|
10
|
+
raise PuppetGenerator::Exceptions::EmptySource if task.body.empty?
|
11
|
+
|
12
|
+
@app.call(task)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module PuppetGenerator
|
2
|
+
module Middleware
|
3
|
+
class ConfigureLogging
|
4
|
+
def initialize(app)
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(task)
|
9
|
+
case task.meta[:logging_mode]
|
10
|
+
when :debug
|
11
|
+
PuppetGenerator.logger.mode = :debug
|
12
|
+
when :silent
|
13
|
+
PuppetGenerator.logger.mode = :silent
|
14
|
+
else
|
15
|
+
PuppetGenerator.logger.mode = :info
|
16
|
+
end
|
17
|
+
|
18
|
+
PuppetGenerator.logger.debug(self.class.name){ "Logging is configured with mode \"#{PuppetGenerator.logger.mode}\"." }
|
19
|
+
|
20
|
+
@app.call(task)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def bold_red(msg)
|
26
|
+
ANSI.bold(ANSI.red(msg))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module PuppetGenerator
|
2
|
+
module Middleware
|
3
|
+
class CreateModuleDirectories
|
4
|
+
def initialize(app)
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(task)
|
9
|
+
module_name = task.meta[:module]
|
10
|
+
module_dirs = %w[ manifests files ].collect { |d| File.join(module_name, d) }
|
11
|
+
module_file = File.join(module_name, 'manifests', 'init.pp')
|
12
|
+
|
13
|
+
PuppetGenerator.logger.info(self.class.name) { "Create the module directory for module \"#{module_name}\" at \"#{Dir.pwd}\"." }
|
14
|
+
|
15
|
+
mkdir module_name
|
16
|
+
mkdir module_dirs
|
17
|
+
mkfile module_file, <<-EOF
|
18
|
+
class #{module_name} {
|
19
|
+
|
20
|
+
}
|
21
|
+
EOF
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def mkdir(*dirs)
|
28
|
+
FileUtils.mkdir_p( dirs.flatten.collect { |d| File.join(root_path, d ) } )
|
29
|
+
end
|
30
|
+
|
31
|
+
def mkfile(file, content)
|
32
|
+
File.open(file, "w") do |f|
|
33
|
+
f.write content
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def root_path
|
38
|
+
Dir.pwd
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module PuppetGenerator
|
2
|
+
module Middleware
|
3
|
+
class CreateOutput
|
4
|
+
def initialize(app)
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(task)
|
9
|
+
destination = task.meta[:destination].split(/:/)
|
10
|
+
channel = destination[0]
|
11
|
+
sink = destination[1]
|
12
|
+
|
13
|
+
PuppetGenerator.logger.info(self.class.name){ "Puppet definitions will be output to \"#{task.meta[:destination]}\"." }
|
14
|
+
PuppetGenerator.logger.debug(self.class.name){ "Render template for channel \"#{channel}\" and sink \"#{sink}\"." }
|
15
|
+
|
16
|
+
unless task.meta[:template_tagged_with]
|
17
|
+
task.meta[:template_tagged_with] = case channel
|
18
|
+
when /file/
|
19
|
+
[ :many_per_file ]
|
20
|
+
when /^(?:dir|directory)/
|
21
|
+
[ :one_per_file ]
|
22
|
+
when /stdout/
|
23
|
+
[ :many_per_file ]
|
24
|
+
else
|
25
|
+
[ :many_per_file ]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
template = Models::Template.find(name: task.meta[:command], is_suitable_for: channel.to_sym, is_tagged_with: task.meta[:template_tagged_with] )
|
30
|
+
raise Exceptions::WrongTemplateChosen unless template
|
31
|
+
PuppetGenerator.logger.debug(self.class.name){ "Chosen template: #{template.name} (#{template.path})." }
|
32
|
+
|
33
|
+
definitions = template.render(task.body)
|
34
|
+
|
35
|
+
exporter = Models::Exporter.find(writes_to: task.meta[:destination])
|
36
|
+
raise Exceptions::InvalidExporter unless exporter
|
37
|
+
PuppetGenerator.logger.debug(self.class.name){ "Chosen exporter: #{exporter.name}." }
|
38
|
+
|
39
|
+
exporter.write(sink, definitions)
|
40
|
+
|
41
|
+
@app.call(task)
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module PuppetGenerator
|
2
|
+
module Middleware
|
3
|
+
class CreatePuppetObjectFromEntry
|
4
|
+
|
5
|
+
def initialize(app)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(task)
|
10
|
+
converter = Models::EntryConverter.find( task.meta[ :command ] )
|
11
|
+
|
12
|
+
raise Exceptions::InvalidEntryConverter, "I was not able to find an entry converter for command \"#{ task.meta[ :command ] }\". Available converters are: #{ Models::EntryConverter.all_names_as_string }" unless converter
|
13
|
+
|
14
|
+
PuppetGenerator.logger.debug(self.class.name){ "Convert entries for command \"#{ task.meta[:command] }\"" }
|
15
|
+
PuppetGenerator.logger.debug(self.class.name){ "Convert entries to puppet objects using converter \"#{ converter.name }.\"" }
|
16
|
+
|
17
|
+
|
18
|
+
task.body = converter.convert( task.body, task.meta[:module] , task.meta[:class] )
|
19
|
+
|
20
|
+
@app.call(task)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module PuppetGenerator
|
2
|
+
module Middleware
|
3
|
+
class EnableDebuggingLibraries
|
4
|
+
def initialize(app)
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(task)
|
9
|
+
PuppetGenerator.enable_debugging_libraries if task.meta[:debug] and not ENV['TRAVIS_CI'] == 'true'
|
10
|
+
|
11
|
+
@app.call(task)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|