puppet-repl 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/Gemfile.lock +4 -4
- data/README.md +38 -15
- data/VERSION +1 -1
- data/lib/puppet-repl/cli.rb +73 -18
- data/lib/puppet-repl/support/compiler.rb +11 -0
- data/lib/puppet-repl/support/environment.rb +30 -0
- data/lib/puppet-repl/support/facts.rb +19 -0
- data/lib/puppet-repl/support/functions.rb +41 -0
- data/lib/puppet-repl/support/node.rb +15 -0
- data/lib/puppet-repl/support/scope.rb +23 -0
- data/lib/puppet-repl/support.rb +33 -97
- data/lib/puppet-repl.rb +16 -0
- data/lib/version.rb +1 -1
- data/puppet-repl.gemspec +9 -2
- data/spec/fixtures/environments/production/manifests/site.pp +1 -0
- data/spec/puppet-repl_spec.rb +69 -10
- data/spec/spec_helper.rb +8 -1
- data/spec/support_spec.rb +22 -3
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b8b2d91eeef5f922cd54569176f6085199647745
|
4
|
+
data.tar.gz: 54320984760c3e54982a9bafda14b5c7742049c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f289d12177afa7d7888699f6b1e8afa65b0ada85bc1969019365af520289404969e64f8654e7ed019a7161c8d1b7278b2ef9f863740862f548e226cd2a9e267
|
7
|
+
data.tar.gz: 1e7434a150bb7543d64f19d26c538d67527e47856a505e43dd3795812627732e6f2a9da9b30cf6948a4f1ac7500ebf12228bca6c5cab2aa2e7fb2b104cc65f8f
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -27,7 +27,7 @@ GEM
|
|
27
27
|
multi_json (>= 1.7.5, < 2.0)
|
28
28
|
oauth2
|
29
29
|
hashie (3.4.3)
|
30
|
-
hiera (3.
|
30
|
+
hiera (1.3.4)
|
31
31
|
json_pure
|
32
32
|
highline (1.7.8)
|
33
33
|
jeweler (2.0.1)
|
@@ -61,9 +61,9 @@ GEM
|
|
61
61
|
coderay (~> 1.1.0)
|
62
62
|
method_source (~> 0.8.1)
|
63
63
|
slop (~> 3.4)
|
64
|
-
puppet (
|
65
|
-
facter (>
|
66
|
-
hiera (
|
64
|
+
puppet (3.8.5)
|
65
|
+
facter (> 1.6, < 3)
|
66
|
+
hiera (~> 1.0)
|
67
67
|
json_pure
|
68
68
|
rack (1.6.4)
|
69
69
|
rake (10.5.0)
|
data/README.md
CHANGED
@@ -8,6 +8,7 @@
|
|
8
8
|
- [Load path](#load-path)
|
9
9
|
- [Usage](#usage)
|
10
10
|
- [Using Variables](#using-variables)
|
11
|
+
- [Listing variables](#listing-variables)
|
11
12
|
- [Using functions](#using-functions)
|
12
13
|
- [Duplicate resource error](#duplicate-resource-error)
|
13
14
|
- [Setting the puppet log level](#setting-the-puppet-log-level)
|
@@ -46,17 +47,18 @@ and try to enforce the catalog. This has a few side affects.
|
|
46
47
|
Example Usage
|
47
48
|
```
|
48
49
|
MacBook-Pro-2/tmp % prepl
|
49
|
-
|
50
|
-
Puppet
|
50
|
+
Ruby Version: 2.0.0
|
51
|
+
Puppet Version: 3.8.5
|
52
|
+
Puppet Repl Version: 0.0.7
|
51
53
|
Created by: NWOps <corey@nwops.io>
|
52
|
-
Type "exit", "functions", "
|
54
|
+
Type "exit", "functions", "vars", "krt", "facts", "reset", "help" for more information.
|
53
55
|
|
54
|
-
>> file{'/tmp/test2': ensure => present}
|
55
|
-
=> File['/tmp/test2']
|
56
56
|
>> ['/tmp/test3', '/tmp/test4'].each |String $path| { file{$path: ensure => present} }
|
57
|
-
|
58
|
-
/tmp/test3
|
59
|
-
/tmp/test4
|
57
|
+
=> [
|
58
|
+
[0] "/tmp/test3",
|
59
|
+
[1] "/tmp/test4"
|
60
|
+
]
|
61
|
+
>>
|
60
62
|
|
61
63
|
```
|
62
64
|
|
@@ -64,16 +66,37 @@ Type "exit", "functions", "types", "reset", "help" for more information.
|
|
64
66
|
|
65
67
|
```
|
66
68
|
MacBook-Pro-2/tmp % prepl
|
67
|
-
|
68
|
-
Puppet
|
69
|
+
Ruby Version: 2.0.0
|
70
|
+
Puppet Version: 3.8.5
|
71
|
+
Puppet Repl Version: 0.0.7
|
69
72
|
Created by: NWOps <corey@nwops.io>
|
70
|
-
Type "exit", "functions", "
|
73
|
+
Type "exit", "functions", "vars", "krt", "facts", "reset", "help" for more information.
|
71
74
|
|
72
|
-
>> $config_file = '/etc/httpd/httpd.conf'
|
73
|
-
=> /etc/httpd/httpd.conf
|
74
|
-
>> file{$config_file: ensure => present, content => 'hello'}
|
75
|
-
=> File['/etc/httpd/httpd.conf']
|
76
75
|
>>
|
76
|
+
|
77
|
+
>> $config_file = '/etc/httpd/httpd.conf'
|
78
|
+
=> "/etc/httpd/httpd.conf"
|
79
|
+
>> file{$config_file: ensure => present, content => 'hello'}
|
80
|
+
=> Puppet::Type::File {
|
81
|
+
path => "/etc/httpd/httpd.conf",
|
82
|
+
provider => posix,
|
83
|
+
ensure => present,
|
84
|
+
content => "{md5}5d41402abc4b2a76b9719d911017c592",
|
85
|
+
checksum => nil,
|
86
|
+
backup => "puppet",
|
87
|
+
replace => true,
|
88
|
+
links => manage,
|
89
|
+
purge => false,
|
90
|
+
sourceselect => first,
|
91
|
+
show_diff => true,
|
92
|
+
validate_replacement => "%",
|
93
|
+
source_permissions => use,
|
94
|
+
selinux_ignore_defaults => false,
|
95
|
+
loglevel => notice,
|
96
|
+
name => "/etc/httpd/httpd.conf",
|
97
|
+
title => "/etc/httpd/httpd.conf"
|
98
|
+
}
|
99
|
+
>>
|
77
100
|
```
|
78
101
|
### Listing variables
|
79
102
|
To see the current variables in the scope use the `vars` keyword.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.8
|
data/lib/puppet-repl/cli.rb
CHANGED
@@ -2,39 +2,70 @@ require 'puppet'
|
|
2
2
|
require 'readline'
|
3
3
|
require 'json'
|
4
4
|
require_relative 'support'
|
5
|
+
|
5
6
|
module PuppetRepl
|
6
7
|
class Cli
|
7
8
|
include PuppetRepl::Support
|
8
9
|
|
10
|
+
attr_accessor :settings, :log_level
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@log_level = 'notice'
|
14
|
+
end
|
15
|
+
|
16
|
+
def ap_formatter
|
17
|
+
unless @ap_formatter
|
18
|
+
inspector = AwesomePrint::Inspector.new({:sort_keys => true, :indent => 2})
|
19
|
+
@ap_formatter = AwesomePrint::Formatter.new(inspector)
|
20
|
+
end
|
21
|
+
@ap_formatter
|
22
|
+
end
|
23
|
+
|
9
24
|
def puppet_eval(input)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
25
|
+
parser.evaluate_string(scope, input)
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_resource_declaration(type)
|
29
|
+
res = scope.catalog.resource(type.type_name, type.title)
|
30
|
+
res.to_ral
|
31
|
+
end
|
32
|
+
|
33
|
+
# ruturns a formatted array
|
34
|
+
def expand_resource_type(types)
|
35
|
+
output = [types].flatten.map do |t|
|
36
|
+
if t.class.to_s == 'Puppet::Pops::Types::PResourceType'
|
37
|
+
to_resource_declaration(t)
|
38
|
+
else
|
39
|
+
t
|
40
|
+
end
|
18
41
|
end
|
42
|
+
output
|
19
43
|
end
|
20
44
|
|
21
45
|
def normalize_output(result)
|
22
46
|
if result.instance_of?(Array)
|
23
|
-
|
24
|
-
|
47
|
+
output = expand_resource_type(result)
|
48
|
+
if output.count == 1
|
49
|
+
return output.first
|
25
50
|
end
|
51
|
+
return output
|
26
52
|
end
|
27
53
|
result
|
28
54
|
end
|
29
55
|
|
56
|
+
def set_log_level(level)
|
57
|
+
Puppet::Util::Log.level = level.to_sym
|
58
|
+
Puppet::Util::Log.newdestination(:console)
|
59
|
+
end
|
60
|
+
|
30
61
|
def handle_set(input)
|
31
62
|
args = input.split(' ')
|
32
63
|
args.shift # throw away the set
|
33
64
|
case args.shift
|
34
65
|
when /loglevel/
|
35
66
|
if level = args.shift
|
36
|
-
|
37
|
-
|
67
|
+
@log_level = level
|
68
|
+
set_log_level(level)
|
38
69
|
puts "loglevel #{Puppet::Util::Log.level} is set"
|
39
70
|
end
|
40
71
|
end
|
@@ -60,16 +91,40 @@ module PuppetRepl
|
|
60
91
|
ap(vars, {:sort_keys => true, :indent => -1})
|
61
92
|
when 'environment'
|
62
93
|
puts "Puppet Environment: #{puppet_env_name}"
|
94
|
+
when 'vars'
|
95
|
+
ap(scope.to_hash, {:sort_keys => true, :indent => 0})
|
63
96
|
when 'exit'
|
64
97
|
exit 0
|
65
98
|
when 'reset'
|
66
99
|
@scope = nil
|
67
|
-
|
68
|
-
|
100
|
+
# initilize scope again
|
101
|
+
scope
|
102
|
+
set_log_level(log_level)
|
103
|
+
when 'krt'
|
104
|
+
ap(known_resource_types, {:sort_keys => true, :indent => -1})
|
69
105
|
else
|
70
|
-
|
71
|
-
|
72
|
-
|
106
|
+
begin
|
107
|
+
result = puppet_eval(input)
|
108
|
+
@last_item = result
|
109
|
+
print " => "
|
110
|
+
output = normalize_output(result)
|
111
|
+
if output.nil?
|
112
|
+
puts ""
|
113
|
+
else
|
114
|
+
ap(output)
|
115
|
+
end
|
116
|
+
rescue ArgumentError => e
|
117
|
+
print " => "
|
118
|
+
puts e.message.fatal
|
119
|
+
rescue Puppet::ResourceError => e
|
120
|
+
print " => "
|
121
|
+
puts e.message.fatal
|
122
|
+
rescue Puppet::ParseErrorWithIssue => e
|
123
|
+
print " => "
|
124
|
+
puts e.message.fatal
|
125
|
+
rescue Exception => e
|
126
|
+
puts e.message.fatal
|
127
|
+
end
|
73
128
|
end
|
74
129
|
end
|
75
130
|
|
@@ -79,7 +134,7 @@ Ruby Version: #{RUBY_VERSION}
|
|
79
134
|
Puppet Version: #{Puppet.version}
|
80
135
|
Puppet Repl Version: #{PuppetRepl::VERSION}
|
81
136
|
Created by: NWOps <corey@nwops.io>
|
82
|
-
Type "exit", "functions", "vars", "facts", "reset", "help" for more information.
|
137
|
+
Type "exit", "functions", "vars", "krt", "facts", "reset", "help" for more information.
|
83
138
|
|
84
139
|
EOT
|
85
140
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module PuppetRepl
|
2
|
+
module Support
|
3
|
+
module Environment
|
4
|
+
# creates a puppet environment given a module path and environment name
|
5
|
+
# this is cached
|
6
|
+
def puppet_environment
|
7
|
+
unless @puppet_environment
|
8
|
+
do_initialize
|
9
|
+
@puppet_environment = Puppet::Node::Environment.create(
|
10
|
+
puppet_env_name,
|
11
|
+
module_dirs,
|
12
|
+
manifests_dir
|
13
|
+
)
|
14
|
+
end
|
15
|
+
@puppet_environment
|
16
|
+
end
|
17
|
+
|
18
|
+
# the cached name of the environment
|
19
|
+
def puppet_env_name
|
20
|
+
@penv ||= ENV['PUPPET_ENV'] || Puppet[:environment]
|
21
|
+
end
|
22
|
+
|
23
|
+
# currently this is not being used
|
24
|
+
def environment_loaders
|
25
|
+
name = compiler.loaders.public_environment_loader.loader_name
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module PuppetRepl
|
2
|
+
module Support
|
3
|
+
module Facts
|
4
|
+
# in the future we will want to grab real facts from real systems via puppetdb
|
5
|
+
# or enc data
|
6
|
+
def facterdb_filter
|
7
|
+
'operatingsystem=RedHat and operatingsystemrelease=/^7/ and architecture=x86_64 and facterversion=/^2.4\./'
|
8
|
+
end
|
9
|
+
|
10
|
+
# uses facterdb (cached facts) and retrives the facts given a filter
|
11
|
+
def facts
|
12
|
+
unless @facts
|
13
|
+
@facts ||= FacterDB.get_facts(facterdb_filter).first
|
14
|
+
end
|
15
|
+
@facts
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module PuppetRepl
|
2
|
+
module Support
|
3
|
+
module Functions
|
4
|
+
# returns a array of function files
|
5
|
+
def function_files
|
6
|
+
search_dirs = lib_dirs.map do |lib_dir|
|
7
|
+
[File.join(lib_dir, 'puppet', 'functions', '**', '*.rb'),
|
8
|
+
File.join(lib_dir, 'functions', '**', '*.rb'),
|
9
|
+
File.join(lib_dir, 'puppet', 'parser', 'functions', '*.rb')
|
10
|
+
]
|
11
|
+
end
|
12
|
+
# add puppet lib directories
|
13
|
+
search_dirs << [File.join(puppet_lib_dir, 'puppet', 'functions', '**', '*.rb'),
|
14
|
+
File.join(puppet_lib_dir, 'puppet', 'parser', 'functions', '*.rb')
|
15
|
+
]
|
16
|
+
Dir.glob(search_dirs.flatten)
|
17
|
+
end
|
18
|
+
|
19
|
+
# returns a map of functions
|
20
|
+
def function_map
|
21
|
+
unless @functions
|
22
|
+
do_initialize
|
23
|
+
@functions = {}
|
24
|
+
function_files.each do |file|
|
25
|
+
obj = {}
|
26
|
+
name = File.basename(file, '.rb')
|
27
|
+
obj[:name] = name
|
28
|
+
obj[:parent] = mod_finder.match(file)[1]
|
29
|
+
@functions["#{obj[:parent]}::#{name}"] = obj
|
30
|
+
end
|
31
|
+
end
|
32
|
+
@functions
|
33
|
+
end
|
34
|
+
|
35
|
+
# def functions
|
36
|
+
# @functions = []
|
37
|
+
# @functions << compiler.loaders.static_loader.loaded.keys.find_all {|l| l.type == :function}
|
38
|
+
# end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module PuppetRepl
|
2
|
+
module Support
|
3
|
+
module Node
|
4
|
+
# creates a node object
|
5
|
+
def create_node
|
6
|
+
options = {}
|
7
|
+
options[:parameters] = facts
|
8
|
+
options[:facts] = facts
|
9
|
+
options[:classes] = []
|
10
|
+
options[:environment] = puppet_environment
|
11
|
+
Puppet::Node.new(facts[:fqdn], options)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module PuppetRepl
|
2
|
+
module Support
|
3
|
+
module Scope
|
4
|
+
def create_scope(node)
|
5
|
+
@compiler = create_compiler(node) # creates a new compiler for each scope
|
6
|
+
scope = Puppet::Parser::Scope.new(@compiler)
|
7
|
+
scope.source = Puppet::Resource::Type.new(:node, node.name)
|
8
|
+
scope.parent = @compiler.topscope
|
9
|
+
load_lib_dirs
|
10
|
+
# compiling will load all the facts into the scope
|
11
|
+
# without this step facts will not get resolved
|
12
|
+
scope.compiler.compile # this will load everything into the scope
|
13
|
+
scope
|
14
|
+
end
|
15
|
+
|
16
|
+
# returns a hash of varaibles that are currently in scope
|
17
|
+
def scope_vars
|
18
|
+
vars = scope.to_hash.delete_if {| key, value | node.facts.key?(key.to_sym) }
|
19
|
+
vars['facts'] = 'removed by the puppet-repl'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/puppet-repl/support.rb
CHANGED
@@ -1,17 +1,47 @@
|
|
1
1
|
require 'puppet/pops'
|
2
2
|
require 'facterdb'
|
3
|
+
# load all the generators found in the generators directory
|
4
|
+
Dir.glob(File.join(File.dirname(__FILE__),'support', '*.rb')).each do |file|
|
5
|
+
require_relative File.join('support', File.basename(file, '.rb'))
|
6
|
+
end
|
3
7
|
|
4
8
|
module PuppetRepl
|
5
9
|
module Support
|
10
|
+
include PuppetRepl::Support::Compilier
|
11
|
+
include PuppetRepl::Support::Environment
|
12
|
+
include PuppetRepl::Support::Facts
|
13
|
+
include PuppetRepl::Support::Scope
|
14
|
+
include PuppetRepl::Support::Functions
|
15
|
+
include PuppetRepl::Support::Node
|
6
16
|
|
7
17
|
# returns an array of module directories
|
8
18
|
def module_dirs
|
9
19
|
dirs = []
|
20
|
+
do_initialize if Puppet[:codedir].nil?
|
10
21
|
dirs << File.join(Puppet[:environmentpath],puppet_env_name,'modules') unless Puppet[:environmentpath].empty?
|
11
22
|
dirs << Puppet.settings[:basemodulepath].split(':')
|
12
23
|
dirs.flatten
|
13
24
|
end
|
14
25
|
|
26
|
+
def known_resource_types
|
27
|
+
res = {
|
28
|
+
:hostclasses => scope.known_resource_types.hostclasses.keys,
|
29
|
+
:definitions => scope.known_resource_types.definitions.keys,
|
30
|
+
:nodes => scope.known_resource_types.nodes.keys,
|
31
|
+
}
|
32
|
+
if sites = scope.known_resource_types.instance_variable_get(:@sites)
|
33
|
+
res.merge!(:sites => scope.known_resource_types.instance_variable_get(:@sites).first)
|
34
|
+
end
|
35
|
+
if scope.known_resource_types.respond_to?(:applications)
|
36
|
+
res.merge!(:applications => scope.known_resource_types.applications.keys)
|
37
|
+
end
|
38
|
+
# some versions of puppet do not support capabilities
|
39
|
+
if scope.known_resource_types.respond_to?(:capability_mappings)
|
40
|
+
res.merge!(:capability_mappings => scope.known_resource_types.capability_mappings.keys)
|
41
|
+
end
|
42
|
+
res
|
43
|
+
end
|
44
|
+
|
15
45
|
# this is required in order to load things only when we need them
|
16
46
|
def do_initialize
|
17
47
|
begin
|
@@ -26,42 +56,11 @@ module PuppetRepl
|
|
26
56
|
@puppet_lib_dir ||= File.dirname(Puppet.method(:[]).source_location.first)
|
27
57
|
end
|
28
58
|
|
29
|
-
# returns a array of function files
|
30
|
-
def function_files
|
31
|
-
search_dirs = lib_dirs.map do |lib_dir|
|
32
|
-
[File.join(lib_dir, 'puppet', 'functions', '**', '*.rb'),
|
33
|
-
File.join(lib_dir, 'functions', '**', '*.rb'),
|
34
|
-
File.join(lib_dir, 'puppet', 'parser', 'functions', '*.rb')
|
35
|
-
]
|
36
|
-
end
|
37
|
-
# add puppet lib directories
|
38
|
-
search_dirs << [File.join(puppet_lib_dir, 'puppet', 'functions', '**', '*.rb'),
|
39
|
-
File.join(puppet_lib_dir, 'puppet', 'parser', 'functions', '*.rb')
|
40
|
-
]
|
41
|
-
Dir.glob(search_dirs.flatten)
|
42
|
-
end
|
43
|
-
|
44
59
|
# returns either the module name or puppet version
|
45
60
|
def mod_finder
|
46
61
|
@mod_finder ||= Regexp.new('\/([\w\-\.]+)\/lib')
|
47
62
|
end
|
48
63
|
|
49
|
-
# returns a map of functions
|
50
|
-
def function_map
|
51
|
-
unless @functions
|
52
|
-
do_initialize
|
53
|
-
@functions = {}
|
54
|
-
function_files.each do |file|
|
55
|
-
obj = {}
|
56
|
-
name = File.basename(file, '.rb')
|
57
|
-
obj[:name] = name
|
58
|
-
obj[:parent] = mod_finder.match(file)[1]
|
59
|
-
@functions["#{obj[:parent]}::#{name}"] = obj
|
60
|
-
end
|
61
|
-
end
|
62
|
-
@functions
|
63
|
-
end
|
64
|
-
|
65
64
|
def lib_dirs
|
66
65
|
module_dirs.map do |mod_dir|
|
67
66
|
Dir["#{mod_dir}/*/lib"].entries
|
@@ -79,82 +78,20 @@ module PuppetRepl
|
|
79
78
|
@parser || ::Puppet::Pops::Parser::EvaluatingParser.new
|
80
79
|
end
|
81
80
|
|
82
|
-
# the cached name of the environment
|
83
|
-
def puppet_env_name
|
84
|
-
@penv ||= ENV['PUPPET_ENV'] || Puppet[:environment]
|
85
|
-
end
|
86
|
-
|
87
|
-
# creates a puppet environment given a module path and environment name
|
88
|
-
# this is cached
|
89
|
-
def puppet_environment
|
90
|
-
unless @puppet_environment
|
91
|
-
do_initialize
|
92
|
-
@puppet_environment = Puppet::Node::Environment.create(
|
93
|
-
puppet_env_name,
|
94
|
-
module_dirs,
|
95
|
-
manifests_dir
|
96
|
-
)
|
97
|
-
end
|
98
|
-
@puppet_environment
|
99
|
-
end
|
100
|
-
|
101
|
-
# def functions
|
102
|
-
# @functions = []
|
103
|
-
# @functions << compiler.loaders.static_loader.loaded.keys.find_all {|l| l.type == :function}
|
104
|
-
# end
|
105
|
-
|
106
|
-
def environment_loaders
|
107
|
-
name = compiler.loaders.public_environment_loader.loader_name
|
108
|
-
end
|
109
|
-
|
110
81
|
def compiler
|
111
82
|
@compiler
|
112
83
|
end
|
113
84
|
|
85
|
+
# @return [node] puppet node object
|
114
86
|
def node
|
115
87
|
@node ||= create_node
|
116
88
|
end
|
117
89
|
|
118
|
-
|
119
|
-
@compiler = create_compiler(node) # creates a new compiler for each scope
|
120
|
-
scope = Puppet::Parser::Scope.new(compiler)
|
121
|
-
scope.source = Puppet::Resource::Type.new(:node, node.name)
|
122
|
-
scope.parent = compiler.topscope
|
123
|
-
load_lib_dirs
|
124
|
-
compiler.compile # this will load everything into the scope
|
125
|
-
scope
|
126
|
-
end
|
127
|
-
|
128
|
-
def create_compiler(node)
|
129
|
-
Puppet::Parser::Compiler.new(node)
|
130
|
-
end
|
131
|
-
|
132
|
-
def facterdb_filter
|
133
|
-
'operatingsystem=RedHat and operatingsystemrelease=/^7/ and architecture=x86_64 and facterversion=/^2.4\./'
|
134
|
-
end
|
135
|
-
|
136
|
-
# uses facterdb (cached facts) and retrives the facts given a filter
|
137
|
-
def facts
|
138
|
-
unless @facts
|
139
|
-
@facts ||= FacterDB.get_facts(facterdb_filter).first
|
140
|
-
end
|
141
|
-
@facts
|
142
|
-
end
|
143
|
-
|
144
|
-
# creates a node object
|
145
|
-
def create_node
|
146
|
-
options = {}
|
147
|
-
options[:parameters] = facts
|
148
|
-
options[:facts] = facts
|
149
|
-
options[:classes] = []
|
150
|
-
options[:environment] = puppet_environment
|
151
|
-
Puppet::Node.new(facts[:fqdn], options)
|
152
|
-
end
|
153
|
-
|
90
|
+
# @return [Scope] puppet scope object
|
154
91
|
def scope
|
155
92
|
unless @scope
|
156
93
|
do_initialize
|
157
|
-
@scope ||= create_scope
|
94
|
+
@scope ||= create_scope(node)
|
158
95
|
end
|
159
96
|
@scope
|
160
97
|
end
|
@@ -165,4 +102,3 @@ module PuppetRepl
|
|
165
102
|
|
166
103
|
end
|
167
104
|
end
|
168
|
-
#scope.environment.known_resource_types
|
data/lib/puppet-repl.rb
CHANGED
@@ -2,3 +2,19 @@ require_relative 'puppet-repl/cli'
|
|
2
2
|
require_relative 'version'
|
3
3
|
require 'awesome_print'
|
4
4
|
require_relative 'awesome_print/ext/awesome_puppet'
|
5
|
+
|
6
|
+
# monkey patch in some color effects string methods
|
7
|
+
class String
|
8
|
+
def red; "\033[31m#{self}\033[0m" end
|
9
|
+
def green; "\033[32m#{self}\033[0m" end
|
10
|
+
def cyan; "\033[36m#{self}\033[0m" end
|
11
|
+
def yellow; "\033[33m#{self}\033[0m" end
|
12
|
+
def warning; yellow end
|
13
|
+
def fatal; red end
|
14
|
+
def info; green end
|
15
|
+
|
16
|
+
def camel_case
|
17
|
+
return self if self !~ /_/ && self =~ /[A-Z]+.*/
|
18
|
+
split('_').map(&:capitalize).join
|
19
|
+
end
|
20
|
+
end
|
data/lib/version.rb
CHANGED
data/puppet-repl.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "puppet-repl"
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.8"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Corey Osman"]
|
12
|
-
s.date = "2016-04-
|
12
|
+
s.date = "2016-04-03"
|
13
13
|
s.description = "A interactive command line tool for evaluating the puppet language"
|
14
14
|
s.email = "corey@nwops.io"
|
15
15
|
s.executables = ["prepl"]
|
@@ -33,8 +33,15 @@ Gem::Specification.new do |s|
|
|
33
33
|
"lib/puppet-repl.rb",
|
34
34
|
"lib/puppet-repl/cli.rb",
|
35
35
|
"lib/puppet-repl/support.rb",
|
36
|
+
"lib/puppet-repl/support/compiler.rb",
|
37
|
+
"lib/puppet-repl/support/environment.rb",
|
38
|
+
"lib/puppet-repl/support/facts.rb",
|
39
|
+
"lib/puppet-repl/support/functions.rb",
|
40
|
+
"lib/puppet-repl/support/node.rb",
|
41
|
+
"lib/puppet-repl/support/scope.rb",
|
36
42
|
"lib/version.rb",
|
37
43
|
"puppet-repl.gemspec",
|
44
|
+
"spec/fixtures/environments/production/manifests/site.pp",
|
38
45
|
"spec/puppet-repl_spec.rb",
|
39
46
|
"spec/spec_helper.rb",
|
40
47
|
"spec/support_spec.rb"
|
@@ -0,0 +1 @@
|
|
1
|
+
fail('test_error')
|
data/spec/puppet-repl_spec.rb
CHANGED
@@ -6,16 +6,44 @@ describe "PuppetRepl" do
|
|
6
6
|
"service{'httpd': ensure => running}"
|
7
7
|
end
|
8
8
|
|
9
|
+
before(:each) do
|
10
|
+
repl.handle_input('reset')
|
11
|
+
end
|
12
|
+
|
9
13
|
let(:repl) do
|
10
14
|
PuppetRepl::Cli.new
|
11
15
|
end
|
12
16
|
|
17
|
+
let(:input) do
|
18
|
+
"file{'/tmp/test2.txt': ensure => present, mode => '0755'}"
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:resource_types) do
|
22
|
+
repl.parser.evaluate_string(repl.scope, input)
|
23
|
+
end
|
24
|
+
|
25
|
+
describe 'returns a array of resource_types' do
|
26
|
+
it 'returns resource type' do
|
27
|
+
expect(resource_types.first.class.to_s).to eq('Puppet::Pops::Types::PResourceType')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
13
31
|
describe 'help' do
|
14
32
|
let(:input) do
|
15
33
|
'help'
|
16
34
|
end
|
17
35
|
it 'can show the help screen' do
|
18
|
-
repl_output = /Ruby Version: #{RUBY_VERSION}\nPuppet Version: \d.\d.\d\nPuppet Repl Version: \d.\d.\d\nCreated by: NWOps <corey@nwops.io>\nType \"exit\", \"functions\", \"vars\", \"facts\", \"reset\", \"help\" for more information.\n\n/
|
36
|
+
repl_output = /Ruby Version: #{RUBY_VERSION}\nPuppet Version: \d.\d.\d\nPuppet Repl Version: \d.\d.\d\nCreated by: NWOps <corey@nwops.io>\nType \"exit\", \"functions\", \"vars\", \"krt\", \"facts\", \"reset\", \"help\" for more information.\n\n/
|
37
|
+
expect{repl.handle_input(input)}.to output(repl_output).to_stdout
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe 'krt' do
|
42
|
+
let(:input) do
|
43
|
+
"krt"
|
44
|
+
end
|
45
|
+
it 'can run' do
|
46
|
+
repl_output = /hostclasses/
|
19
47
|
expect{repl.handle_input(input)}.to output(repl_output).to_stdout
|
20
48
|
end
|
21
49
|
end
|
@@ -25,7 +53,7 @@ describe "PuppetRepl" do
|
|
25
53
|
"$file_path = '/tmp/test2.txt'"
|
26
54
|
end
|
27
55
|
it 'can process a variable' do
|
28
|
-
repl_output = " => /tmp/test2.txt\n"
|
56
|
+
repl_output = " => \e[0;33m\"/tmp/test2.txt\"\e[0m\n"
|
29
57
|
expect{repl.handle_input(input)}.to output(repl_output).to_stdout
|
30
58
|
end
|
31
59
|
end
|
@@ -35,7 +63,7 @@ describe "PuppetRepl" do
|
|
35
63
|
"file{'/tmp/test2.txt': ensure => present, mode => '0755'}"
|
36
64
|
end
|
37
65
|
it 'can process a resource' do
|
38
|
-
repl_output =
|
66
|
+
repl_output = /Puppet::Type::File/
|
39
67
|
expect{repl.handle_input(input)}.to output(repl_output).to_stdout
|
40
68
|
end
|
41
69
|
end
|
@@ -45,7 +73,17 @@ describe "PuppetRepl" do
|
|
45
73
|
"Service{"
|
46
74
|
end
|
47
75
|
it 'can process' do
|
48
|
-
repl_output = " =>
|
76
|
+
repl_output = " => \e[31mSyntax error at end of file\e[0m\n"
|
77
|
+
expect{repl.handle_input(input)}.to output(repl_output).to_stdout
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe 'bad resources' do
|
82
|
+
let(:input) do
|
83
|
+
"file{'/tmp/test': ensure => present, mode => 755}"
|
84
|
+
end
|
85
|
+
xit 'can process' do #this fails with puppet 3.8 and passes with others
|
86
|
+
repl_output = /must be a string/
|
49
87
|
expect{repl.handle_input(input)}.to output(repl_output).to_stdout
|
50
88
|
end
|
51
89
|
end
|
@@ -60,7 +98,27 @@ describe "PuppetRepl" do
|
|
60
98
|
|
61
99
|
it 'can process a each block' do
|
62
100
|
repl.handle_input('reset')
|
63
|
-
repl_output =
|
101
|
+
repl_output = /Puppet::Type::File/
|
102
|
+
expect{repl.handle_input(input)}.to output(repl_output).to_stdout
|
103
|
+
end
|
104
|
+
describe 'loglevel' do
|
105
|
+
it 'has not changed' do
|
106
|
+
repl.handle_input(":set loglevel debug")
|
107
|
+
expect(Puppet::Util::Log.level).to eq(:debug)
|
108
|
+
expect(Puppet::Util::Log.destinations[:console].name).to eq(:console)
|
109
|
+
repl.handle_input('reset')
|
110
|
+
expect(Puppet::Util::Log.level).to eq(:debug)
|
111
|
+
expect(Puppet::Util::Log.destinations[:console].name).to eq(:console)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe 'map block' do
|
117
|
+
let(:input) do
|
118
|
+
"['/tmp/test3', '/tmp/test4'].map |String $path| { file{$path: ensure => present} }"
|
119
|
+
end
|
120
|
+
it 'can process a each block' do
|
121
|
+
repl_output = /Puppet::Type::File/
|
64
122
|
expect{repl.handle_input(input)}.to output(repl_output).to_stdout
|
65
123
|
end
|
66
124
|
end
|
@@ -69,8 +127,10 @@ describe "PuppetRepl" do
|
|
69
127
|
let(:input) do
|
70
128
|
"['/tmp/test3', '/tmp/test4'].each |String $path| { file{$path: ensure => present} }"
|
71
129
|
end
|
130
|
+
let(:repl_output) do
|
131
|
+
" => [\n \e[1;37m[0] \e[0m\e[0;33m\"/tmp/test3\"\e[0m,\n \e[1;37m[1] \e[0m\e[0;33m\"/tmp/test4\"\e[0m\n]\n"
|
132
|
+
end
|
72
133
|
it 'can process a each block' do
|
73
|
-
repl_output = " => [\"/tmp/test3\", \"/tmp/test4\"]\n"
|
74
134
|
expect{repl.handle_input(input)}.to output(repl_output).to_stdout
|
75
135
|
end
|
76
136
|
end
|
@@ -80,7 +140,7 @@ describe "PuppetRepl" do
|
|
80
140
|
"$::fqdn"
|
81
141
|
end
|
82
142
|
it 'should be able to resolve fqdn' do
|
83
|
-
repl_output = " => foo.example.com\n"
|
143
|
+
repl_output = " => \e[0;33m\"foo.example.com\"\e[0m\n"
|
84
144
|
expect{repl.handle_input(input)}.to output(repl_output).to_stdout
|
85
145
|
end
|
86
146
|
end
|
@@ -125,14 +185,13 @@ describe "PuppetRepl" do
|
|
125
185
|
"md5('hello')"
|
126
186
|
end
|
127
187
|
it 'execute md5' do
|
128
|
-
sum = " => 5d41402abc4b2a76b9719d911017c592\n"
|
188
|
+
sum = " => \e[0;33m\"5d41402abc4b2a76b9719d911017c592\"\e[0m\n"
|
129
189
|
expect{repl.handle_input(input)}.to output(sum).to_stdout
|
130
190
|
end
|
131
191
|
it 'execute swapcase' do
|
132
|
-
output =
|
192
|
+
output = /HELLO/
|
133
193
|
expect{repl.handle_input("swapcase('hello')")}.to output(output).to_stdout
|
134
194
|
end
|
135
195
|
|
136
196
|
end
|
137
|
-
|
138
197
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -35,6 +35,13 @@ end
|
|
35
35
|
#
|
36
36
|
# install_stdlib
|
37
37
|
|
38
|
-
|
38
|
+
def fixtures_dir
|
39
|
+
File.join(File.dirname(__FILE__), 'fixtures')
|
40
|
+
end
|
39
41
|
|
42
|
+
def environments_dir
|
43
|
+
File.join(fixtures_dir, 'environments')
|
44
|
+
end
|
45
|
+
|
46
|
+
RSpec.configure do |config|
|
40
47
|
end
|
data/spec/support_spec.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
|
2
|
+
require 'tempfile'
|
3
3
|
|
4
4
|
describe 'support' do
|
5
5
|
|
@@ -15,6 +15,27 @@ describe 'support' do
|
|
15
15
|
repl.mod_finder.match(repl.puppet_lib_dir)[1]
|
16
16
|
end
|
17
17
|
|
18
|
+
let(:manifest_file) do
|
19
|
+
file = File.open('/tmp/repl_puppet_manifest.pp', 'w') do |f|
|
20
|
+
f.write(manifest_code)
|
21
|
+
end
|
22
|
+
'/tmp/repl_puppet_manifest.pp'
|
23
|
+
end
|
24
|
+
|
25
|
+
let(:manifest_code) do
|
26
|
+
<<-EOF
|
27
|
+
file{'/tmp/test.txt': ensure => absent } \n
|
28
|
+
notify{'hello_there':} \n
|
29
|
+
service{'httpd': ensure => running}\n
|
30
|
+
|
31
|
+
EOF
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
after(:each) do
|
36
|
+
#manifest_file.close
|
37
|
+
end
|
38
|
+
|
18
39
|
context '#function_map' do
|
19
40
|
|
20
41
|
it 'should list functions' do
|
@@ -42,6 +63,4 @@ describe 'support' do
|
|
42
63
|
expect(repl.facts[:fqdn]).to eq('foo.example.com')
|
43
64
|
end
|
44
65
|
|
45
|
-
|
46
|
-
|
47
66
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppet-repl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Corey Osman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: puppet
|
@@ -104,8 +104,15 @@ files:
|
|
104
104
|
- lib/puppet-repl.rb
|
105
105
|
- lib/puppet-repl/cli.rb
|
106
106
|
- lib/puppet-repl/support.rb
|
107
|
+
- lib/puppet-repl/support/compiler.rb
|
108
|
+
- lib/puppet-repl/support/environment.rb
|
109
|
+
- lib/puppet-repl/support/facts.rb
|
110
|
+
- lib/puppet-repl/support/functions.rb
|
111
|
+
- lib/puppet-repl/support/node.rb
|
112
|
+
- lib/puppet-repl/support/scope.rb
|
107
113
|
- lib/version.rb
|
108
114
|
- puppet-repl.gemspec
|
115
|
+
- spec/fixtures/environments/production/manifests/site.pp
|
109
116
|
- spec/puppet-repl_spec.rb
|
110
117
|
- spec/spec_helper.rb
|
111
118
|
- spec/support_spec.rb
|