puppet_generator 0.5.4
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.
- 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
|