puppet 4.9.4 → 4.10.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/Rakefile +6 -0
- data/ext/project_data.yaml +2 -2
- data/lib/hiera/puppet_function.rb +1 -1
- data/lib/puppet.rb +1 -0
- data/lib/puppet/application.rb +14 -0
- data/lib/puppet/application/inspect.rb +3 -0
- data/lib/puppet/defaults.rb +12 -2
- data/lib/puppet/etc.rb +125 -0
- data/lib/puppet/face/help.rb +1 -1
- data/lib/puppet/functions.rb +49 -4
- data/lib/puppet/functions/eyaml_lookup_key.rb +12 -3
- data/lib/puppet/functions/hocon_data.rb +9 -0
- data/lib/puppet/functions/json_data.rb +9 -0
- data/lib/puppet/functions/yaml_data.rb +9 -0
- data/lib/puppet/indirector/file_bucket_file/file.rb +69 -22
- data/lib/puppet/indirector/key/file.rb +2 -1
- data/lib/puppet/indirector/ssl_file.rb +24 -3
- data/lib/puppet/module.rb +28 -22
- data/lib/puppet/network/http/compression.rb +2 -1
- data/lib/puppet/parser/compiler.rb +15 -38
- data/lib/puppet/parser/functions/hiera.rb +1 -1
- data/lib/puppet/parser/functions/hiera_array.rb +1 -1
- data/lib/puppet/parser/functions/hiera_hash.rb +1 -1
- data/lib/puppet/parser/functions/hiera_include.rb +1 -1
- data/lib/puppet/parser/scope.rb +59 -17
- data/lib/puppet/pops/evaluator/callable_signature.rb +7 -0
- data/lib/puppet/pops/functions/dispatch.rb +18 -5
- data/lib/puppet/pops/functions/dispatcher.rb +7 -13
- data/lib/puppet/pops/issue_reporter.rb +1 -1
- data/lib/puppet/pops/issues.rb +84 -0
- data/lib/puppet/pops/loader/base_loader.rb +13 -5
- data/lib/puppet/pops/lookup/configured_data_provider.rb +8 -2
- data/lib/puppet/pops/lookup/data_dig_function_provider.rb +109 -19
- data/lib/puppet/pops/lookup/data_hash_function_provider.rb +19 -4
- data/lib/puppet/pops/lookup/data_provider.rb +43 -29
- data/lib/puppet/pops/lookup/environment_data_provider.rb +1 -1
- data/lib/puppet/pops/lookup/explainer.rb +1 -0
- data/lib/puppet/pops/lookup/function_provider.rb +36 -11
- data/lib/puppet/pops/lookup/global_data_provider.rb +18 -5
- data/lib/puppet/pops/lookup/hiera_config.rb +203 -84
- data/lib/puppet/pops/lookup/interpolation.rb +21 -6
- data/lib/puppet/pops/lookup/invocation.rb +14 -9
- data/lib/puppet/pops/lookup/location_resolver.rb +27 -0
- data/lib/puppet/pops/lookup/lookup_adapter.rb +59 -6
- data/lib/puppet/pops/lookup/lookup_key_function_provider.rb +9 -77
- data/lib/puppet/pops/lookup/module_data_provider.rb +27 -4
- data/lib/puppet/pops/parser/lexer2.rb +1 -1
- data/lib/puppet/pops/pcore.rb +3 -3
- data/lib/puppet/pops/types/p_object_type.rb +4 -6
- data/lib/puppet/pops/types/ruby_generator.rb +2 -2
- data/lib/puppet/pops/types/type_asserter.rb +3 -3
- data/lib/puppet/pops/types/type_mismatch_describer.rb +25 -7
- data/lib/puppet/pops/types/types.rb +20 -29
- data/lib/puppet/provider/exec.rb +4 -2
- data/lib/puppet/provider/nameservice.rb +8 -8
- data/lib/puppet/provider/selmodule/semodule.rb +20 -16
- data/lib/puppet/provider/service/src.rb +39 -39
- data/lib/puppet/provider/service/systemd.rb +1 -1
- data/lib/puppet/provider/user/aix.rb +7 -2
- data/lib/puppet/settings.rb +30 -17
- data/lib/puppet/ssl/base.rb +14 -1
- data/lib/puppet/ssl/certificate_authority.rb +4 -2
- data/lib/puppet/ssl/configuration.rb +4 -1
- data/lib/puppet/ssl/inventory.rb +10 -3
- data/lib/puppet/ssl/key.rb +7 -3
- data/lib/puppet/test/test_helper.rb +3 -0
- data/lib/puppet/type.rb +13 -1
- data/lib/puppet/type/exec.rb +16 -1
- data/lib/puppet/type/group.rb +17 -11
- data/lib/puppet/type/user.rb +3 -1
- data/lib/puppet/util.rb +1 -0
- data/lib/puppet/util/character_encoding.rb +95 -0
- data/lib/puppet/util/execution.rb +9 -6
- data/lib/puppet/util/reference.rb +4 -2
- data/lib/puppet/util/windows/file.rb +5 -1
- data/lib/puppet/version.rb +6 -2
- data/locales/config.yaml +1 -1
- data/locales/puppet.pot +18 -4
- data/spec/integration/ssl/autosign_spec.rb +18 -3
- data/spec/integration/ssl/key_spec.rb +104 -0
- data/spec/integration/type/user_spec.rb +13 -6
- data/spec/spec_helper.rb +7 -0
- data/spec/unit/application/inspect_spec.rb +9 -2
- data/spec/unit/data_providers/function_data_provider_spec.rb +2 -2
- data/spec/unit/etc_spec.rb +234 -0
- data/spec/unit/face/certificate_spec.rb +10 -2
- data/spec/unit/functions/dig_spec.rb +1 -1
- data/spec/unit/functions/hiera_spec.rb +40 -1
- data/spec/unit/functions/lookup_fixture_spec.rb +10 -10
- data/spec/unit/functions/lookup_spec.rb +1217 -357
- data/spec/unit/functions4_spec.rb +37 -1
- data/spec/unit/indirector/file_bucket_file/file_spec.rb +33 -2
- data/spec/unit/indirector/key/file_spec.rb +1 -1
- data/spec/unit/indirector/ssl_file_spec.rb +3 -3
- data/spec/unit/module_spec.rb +52 -59
- data/spec/unit/network/http/compression_spec.rb +39 -8
- data/spec/unit/parser/compiler_spec.rb +14 -0
- data/spec/unit/pops/loaders/loaders_spec.rb +21 -3
- data/spec/unit/pops/loaders/module_loaders_spec.rb +61 -0
- data/spec/unit/pops/lookup/context_spec.rb +56 -8
- data/spec/unit/pops/lookup/lookup_spec.rb +32 -1
- data/spec/unit/pops/parser/lexer2_spec.rb +8 -0
- data/spec/unit/pops/types/ruby_generator_spec.rb +48 -0
- data/spec/unit/pops/types/type_mismatch_describer_spec.rb +12 -3
- data/spec/unit/pops/types/types_spec.rb +6 -7
- data/spec/unit/provider/nameservice_spec.rb +12 -12
- data/spec/unit/provider/package/pkg_spec.rb +2 -0
- data/spec/unit/provider/service/src_spec.rb +5 -0
- data/spec/unit/ssl/base_spec.rb +9 -0
- data/spec/unit/ssl/certificate_authority_spec.rb +2 -2
- data/spec/unit/ssl/certificate_request_attributes_spec.rb +6 -0
- data/spec/unit/ssl/certificate_request_spec.rb +1 -1
- data/spec/unit/ssl/certificate_spec.rb +1 -1
- data/spec/unit/ssl/configuration_spec.rb +11 -2
- data/spec/unit/ssl/inventory_spec.rb +27 -3
- data/spec/unit/ssl/key_spec.rb +7 -7
- data/spec/unit/type/exec_spec.rb +41 -4
- data/spec/unit/type/file_spec.rb +4 -1
- data/spec/unit/util/character_encoding_spec.rb +88 -0
- data/spec/unit/util/execution_spec.rb +12 -0
- data/spec/unit/version_spec.rb +4 -0
- metadata +3803 -3808
- data/tasks/i18n.rake +0 -20
@@ -211,12 +211,10 @@ class PObjectType < PMetaType
|
|
211
211
|
# TODO: Assumes Ruby implementation for now
|
212
212
|
if(callable_type.is_a?(PVariantType))
|
213
213
|
callable_type.types.map do |ct|
|
214
|
-
Functions::Dispatch.new(ct, name, [],
|
215
|
-
ct.block_type.nil? ? nil : 'block', nil, nil, false)
|
214
|
+
Functions::Dispatch.new(ct, name, [], false, ct.block_type.nil? ? nil : 'block')
|
216
215
|
end
|
217
216
|
else
|
218
|
-
[Functions::Dispatch.new(callable_type, name, [],
|
219
|
-
callable_type.block_type.nil? ? nil : 'block', nil, nil, false)]
|
217
|
+
[Functions::Dispatch.new(callable_type, name, [], false, callable_type.block_type.nil? ? nil : 'block')]
|
220
218
|
end
|
221
219
|
end
|
222
220
|
|
@@ -436,7 +434,7 @@ class PObjectType < PMetaType
|
|
436
434
|
# This method should accept a hash and assume that type assertion has been made already (it is made
|
437
435
|
# by the dispatch added here).
|
438
436
|
if impl_class.respond_to?(:from_asserted_hash)
|
439
|
-
dispatcher.
|
437
|
+
dispatcher.add(Functions::Dispatch.new(from_hash_type, :from_hash, ['hash']))
|
440
438
|
def from_hash(hash)
|
441
439
|
self.class.impl_class.from_asserted_hash(hash)
|
442
440
|
end
|
@@ -444,7 +442,7 @@ class PObjectType < PMetaType
|
|
444
442
|
|
445
443
|
# Add the dispatch that uses the standard #from_asserted_args or #new method on the class. It's assumed that the
|
446
444
|
# method performs no assertions.
|
447
|
-
dispatcher.
|
445
|
+
dispatcher.add(Functions::Dispatch.new(create_type, :create, param_names))
|
448
446
|
if impl_class.respond_to?(:from_asserted_args)
|
449
447
|
def create(*args)
|
450
448
|
self.class.impl_class.from_asserted_args(*args)
|
@@ -263,11 +263,11 @@ class RubyGenerator < TypeFormatter
|
|
263
263
|
bld << " end\n"
|
264
264
|
|
265
265
|
bld << "\n def eql?(o)\n"
|
266
|
-
bld << " super
|
266
|
+
bld << " super &&\n" unless obj.parent.nil?
|
267
267
|
bld << " self.class.eql?(o.class) &&\n" if include_class
|
268
268
|
eq_names.each { |eqn| bld << ' @' << eqn << '.eql?(o.' << eqn << ") &&\n" }
|
269
269
|
bld.chomp!(" &&\n")
|
270
|
-
bld << "\n end\n"
|
270
|
+
bld << "\n end\n alias == eql?\n"
|
271
271
|
end
|
272
272
|
end
|
273
273
|
end
|
@@ -13,7 +13,7 @@ module TypeAsserter
|
|
13
13
|
#
|
14
14
|
# @api public
|
15
15
|
def self.assert_assignable(subject, expected_type, type_to_check, &block)
|
16
|
-
report_type_mismatch(subject, expected_type, type_to_check) unless expected_type.assignable?(type_to_check)
|
16
|
+
report_type_mismatch(subject, expected_type, type_to_check, 'is incorrect', &block) unless expected_type.assignable?(type_to_check)
|
17
17
|
type_to_check
|
18
18
|
end
|
19
19
|
|
@@ -35,11 +35,11 @@ module TypeAsserter
|
|
35
35
|
value
|
36
36
|
end
|
37
37
|
|
38
|
-
def self.report_type_mismatch(subject, expected_type, actual_type)
|
38
|
+
def self.report_type_mismatch(subject, expected_type, actual_type, what = 'has wrong type')
|
39
39
|
subject = yield(subject) if block_given?
|
40
40
|
subject = subject[0] % subject[1..-1] if subject.is_a?(Array)
|
41
41
|
raise TypeAssertionError.new(
|
42
|
-
TypeMismatchDescriber.singleton.describe_mismatch("#{subject}
|
42
|
+
TypeMismatchDescriber.singleton.describe_mismatch("#{subject} #{what},", expected_type, actual_type), expected_type, actual_type)
|
43
43
|
end
|
44
44
|
private_class_method :report_type_mismatch
|
45
45
|
end
|
@@ -293,6 +293,11 @@ module Types
|
|
293
293
|
super(path)
|
294
294
|
@expected = (expected.is_a?(Array) ? PVariantType.maybe_create(expected) : expected).normalize
|
295
295
|
@actual = actual.normalize
|
296
|
+
@optional = false
|
297
|
+
end
|
298
|
+
|
299
|
+
def set_optional
|
300
|
+
@optional = true
|
296
301
|
end
|
297
302
|
|
298
303
|
def ==(o)
|
@@ -323,8 +328,17 @@ module Types
|
|
323
328
|
e = expected
|
324
329
|
a = actual
|
325
330
|
multi = false
|
326
|
-
if
|
331
|
+
if @optional
|
332
|
+
if e.is_a?(PVariantType)
|
333
|
+
e = [PUndefType::DEFAULT] + e.types
|
334
|
+
else
|
335
|
+
e = [PUndefType::DEFAULT, e]
|
336
|
+
end
|
337
|
+
elsif e.is_a?(PVariantType)
|
327
338
|
e = e.types
|
339
|
+
end
|
340
|
+
|
341
|
+
if e.is_a?(Array)
|
328
342
|
if report_detailed?(e, a)
|
329
343
|
a = detailed_actual_to_s(e, a)
|
330
344
|
e = e.map { |t| t.to_alias_expanded_s }
|
@@ -620,7 +634,7 @@ module Types
|
|
620
634
|
if param_hash.include?(name)
|
621
635
|
result << describe(value_type, TypeCalculator.singleton.infer_set(value), [ParameterPathElement.new(name)]) unless value_type.instance?(value)
|
622
636
|
else
|
623
|
-
result << MissingParameter.new(nil, name) unless elem.key_type.
|
637
|
+
result << MissingParameter.new(nil, name) unless missing_ok || elem.key_type.is_a?(POptionalType)
|
624
638
|
end
|
625
639
|
end
|
626
640
|
result
|
@@ -764,7 +778,10 @@ module Types
|
|
764
778
|
end
|
765
779
|
|
766
780
|
def describe_POptionalType(expected, actual, path)
|
767
|
-
actual.is_a?(PUndefType)
|
781
|
+
return EMPTY_ARRAY if actual.is_a?(PUndefType)
|
782
|
+
descriptions = describe(expected.optional_type, actual, path)
|
783
|
+
descriptions.each { |description| description.set_optional }
|
784
|
+
descriptions
|
768
785
|
end
|
769
786
|
|
770
787
|
def describe_PEnumType(expected, actual, path)
|
@@ -776,7 +793,7 @@ module Types
|
|
776
793
|
end
|
777
794
|
|
778
795
|
def describe_PTypeAliasType(expected, actual, path)
|
779
|
-
resolved_type = expected.resolved_type
|
796
|
+
resolved_type = expected.resolved_type
|
780
797
|
describe(resolved_type, actual, path).map do |description|
|
781
798
|
if description.is_a?(ExpectedActualMismatch) && description.expected.equal?(resolved_type)
|
782
799
|
description.swap_expected(expected)
|
@@ -804,7 +821,7 @@ module Types
|
|
804
821
|
expected_size = expected.size_type
|
805
822
|
actual_size = actual.size_type || PCollectionType::DEFAULT_SIZE
|
806
823
|
if expected_size.nil? || expected_size.assignable?(actual_size)
|
807
|
-
descriptions << TypeMismatch.new(path, expected, actual)
|
824
|
+
descriptions << TypeMismatch.new(path, expected, PArrayType.new(actual.element_type))
|
808
825
|
else
|
809
826
|
descriptions << SizeMismatch.new(path, expected_size, actual_size)
|
810
827
|
end
|
@@ -834,7 +851,7 @@ module Types
|
|
834
851
|
expected_size = expected.size_type
|
835
852
|
actual_size = actual.size_type || PCollectionType::DEFAULT_SIZE
|
836
853
|
if expected_size.nil? || expected_size.assignable?(actual_size)
|
837
|
-
descriptions << TypeMismatch.new(path, expected, actual)
|
854
|
+
descriptions << TypeMismatch.new(path, expected, PHashType.new(actual.key_type, actual.value_type))
|
838
855
|
else
|
839
856
|
descriptions << SizeMismatch.new(path, expected_size, actual_size)
|
840
857
|
end
|
@@ -864,7 +881,7 @@ module Types
|
|
864
881
|
actual_size = actual.size_type || PCollectionType::DEFAULT_SIZE
|
865
882
|
expected_size = PIntegerType.new(elements.count { |e| !e.key_type.assignable?(PUndefType::DEFAULT) }, elements.size)
|
866
883
|
if expected_size.assignable?(actual_size)
|
867
|
-
descriptions << TypeMismatch.new(path, expected, actual)
|
884
|
+
descriptions << TypeMismatch.new(path, expected, PHashType.new(actual.key_type, actual.value_type))
|
868
885
|
else
|
869
886
|
descriptions << SizeMismatch.new(path, expected_size, actual_size)
|
870
887
|
end
|
@@ -990,6 +1007,7 @@ module Types
|
|
990
1007
|
if unresolved
|
991
1008
|
[UnresolvedTypeReference.new(path, unresolved)]
|
992
1009
|
else
|
1010
|
+
expected = expected.normalize
|
993
1011
|
case expected
|
994
1012
|
when PVariantType
|
995
1013
|
describe_PVariantType(expected, actual, path)
|
@@ -2522,7 +2522,7 @@ class PHashType < PCollectionType
|
|
2522
2522
|
key_t = key_t.normalize(guard) unless key_t.nil?
|
2523
2523
|
value_t = @value_type
|
2524
2524
|
value_t = value_t.normalize(guard) unless value_t.nil?
|
2525
|
-
@size_type.nil? && @key_type.equal?(key_t) && @value_type.equal?(value_t) ? self : PHashType.new(key_t, value_t,
|
2525
|
+
@size_type.nil? && @key_type.equal?(key_t) && @value_type.equal?(value_t) ? self : PHashType.new(key_t, value_t, @size_type)
|
2526
2526
|
end
|
2527
2527
|
end
|
2528
2528
|
|
@@ -2668,7 +2668,7 @@ class PVariantType < PAnyType
|
|
2668
2668
|
# @return [PAnyType] the resulting type
|
2669
2669
|
# @api public
|
2670
2670
|
def self.maybe_create(types)
|
2671
|
-
types = types.uniq
|
2671
|
+
types = flatten_variants(types).uniq
|
2672
2672
|
types.size == 1 ? types[0] : new(types)
|
2673
2673
|
end
|
2674
2674
|
|
@@ -2713,24 +2713,15 @@ class PVariantType < PAnyType
|
|
2713
2713
|
|
2714
2714
|
if types.size == 1
|
2715
2715
|
types[0]
|
2716
|
-
elsif types.any? { |t| t.is_a?(PUndefType) }
|
2717
|
-
# Undef entry present. Use an OptionalType with a normalized Variant
|
2718
|
-
POptionalType.new(PVariantType.maybe_create(types.reject { |
|
2716
|
+
elsif types.any? { |t| t.is_a?(PUndefType) || t.is_a?(POptionalType) }
|
2717
|
+
# Undef entry present. Use an OptionalType with a normalized Variant without Undefs and Optional wrappers
|
2718
|
+
POptionalType.new(PVariantType.maybe_create(types.reject { |t| t.is_a?(PUndefType) }.map { |t| t.is_a?(POptionalType) ? t.type : t })).normalize
|
2719
2719
|
else
|
2720
2720
|
# Merge all variants into this one
|
2721
|
-
types = types
|
2722
|
-
if t.is_a?(PVariantType)
|
2723
|
-
modified = true
|
2724
|
-
t.types
|
2725
|
-
else
|
2726
|
-
t
|
2727
|
-
end
|
2728
|
-
end
|
2729
|
-
types.flatten! if modified
|
2721
|
+
types = PVariantType.flatten_variants(types)
|
2730
2722
|
size_before_merge = types.size
|
2731
2723
|
|
2732
2724
|
types = swap_not_undefs(types)
|
2733
|
-
types = swap_optionals(types)
|
2734
2725
|
types = merge_enums(types)
|
2735
2726
|
types = merge_patterns(types)
|
2736
2727
|
types = merge_version_ranges(types)
|
@@ -2748,6 +2739,20 @@ class PVariantType < PAnyType
|
|
2748
2739
|
end
|
2749
2740
|
end
|
2750
2741
|
|
2742
|
+
def self.flatten_variants(types)
|
2743
|
+
modified = false
|
2744
|
+
types = types.map do |t|
|
2745
|
+
if t.is_a?(PVariantType)
|
2746
|
+
modified = true
|
2747
|
+
t.types
|
2748
|
+
else
|
2749
|
+
t
|
2750
|
+
end
|
2751
|
+
end
|
2752
|
+
types.flatten! if modified
|
2753
|
+
types
|
2754
|
+
end
|
2755
|
+
|
2751
2756
|
def hash
|
2752
2757
|
@types.hash
|
2753
2758
|
end
|
@@ -2806,20 +2811,6 @@ class PVariantType < PAnyType
|
|
2806
2811
|
end
|
2807
2812
|
end
|
2808
2813
|
|
2809
|
-
# @api private
|
2810
|
-
def swap_optionals(array)
|
2811
|
-
if array.size > 1
|
2812
|
-
parts = array.partition {|t| t.is_a?(POptionalType) }
|
2813
|
-
optionals = parts[0]
|
2814
|
-
if optionals.size > 1
|
2815
|
-
others = parts[1]
|
2816
|
-
others << POptionalType.new(PVariantType.maybe_create(optionals.map { |optional| optional.type }).normalize)
|
2817
|
-
array = others
|
2818
|
-
end
|
2819
|
-
end
|
2820
|
-
array
|
2821
|
-
end
|
2822
|
-
|
2823
2814
|
# @api private
|
2824
2815
|
def swap_not_undefs(array)
|
2825
2816
|
if array.size > 1
|
data/lib/puppet/provider/exec.rb
CHANGED
@@ -8,6 +8,7 @@ class Puppet::Provider::Exec < Puppet::Provider
|
|
8
8
|
output = nil
|
9
9
|
status = nil
|
10
10
|
dir = nil
|
11
|
+
sensitive = resource.parameters[:command].sensitive
|
11
12
|
|
12
13
|
checkexe(command)
|
13
14
|
|
@@ -23,7 +24,7 @@ class Puppet::Provider::Exec < Puppet::Provider
|
|
23
24
|
|
24
25
|
dir ||= Dir.pwd
|
25
26
|
|
26
|
-
debug "Executing#{check ? " check": ""} '#{command}'"
|
27
|
+
debug "Executing#{check ? " check": ""} '#{sensitive ? '[redacted]' : command}'"
|
27
28
|
begin
|
28
29
|
# Do our chdir
|
29
30
|
Dir.chdir(dir) do
|
@@ -59,7 +60,8 @@ class Puppet::Provider::Exec < Puppet::Provider
|
|
59
60
|
output = Puppet::Util::Execution.execute(command, :failonfail => false, :combine => true,
|
60
61
|
:uid => resource[:user], :gid => resource[:group],
|
61
62
|
:override_locale => false,
|
62
|
-
:custom_environment => environment
|
63
|
+
:custom_environment => environment,
|
64
|
+
:sensitive => sensitive)
|
63
65
|
end
|
64
66
|
# The shell returns 127 if the command is missing.
|
65
67
|
if output.exitstatus == 127
|
@@ -52,14 +52,14 @@ class Puppet::Provider::NameService < Puppet::Provider
|
|
52
52
|
# for both users and groups.
|
53
53
|
def listbyname
|
54
54
|
names = []
|
55
|
-
Etc.send("set#{section()}ent")
|
55
|
+
Puppet::Etc.send("set#{section()}ent")
|
56
56
|
begin
|
57
|
-
while ent = Etc.send("get#{section()}ent")
|
57
|
+
while ent = Puppet::Etc.send("get#{section()}ent")
|
58
58
|
names << ent.name
|
59
59
|
yield ent.name if block_given?
|
60
60
|
end
|
61
61
|
ensure
|
62
|
-
Etc.send("end#{section()}ent")
|
62
|
+
Puppet::Etc.send("end#{section()}ent")
|
63
63
|
end
|
64
64
|
|
65
65
|
names
|
@@ -146,7 +146,7 @@ class Puppet::Provider::NameService < Puppet::Provider
|
|
146
146
|
# other, more convenient enumerator for these, so we fake one with this
|
147
147
|
# loop. Thanks, Ruby, for your awesome abstractions. --daniel 2012-03-23
|
148
148
|
highest = []
|
149
|
-
Etc.send(database) {|entry| highest << entry.send(method) }
|
149
|
+
Puppet::Etc.send(database) {|entry| highest << entry.send(method) }
|
150
150
|
highest = highest.reject {|x| x > 65000 }.max
|
151
151
|
|
152
152
|
@prevauto = highest || 1000
|
@@ -226,7 +226,7 @@ class Puppet::Provider::NameService < Puppet::Provider
|
|
226
226
|
if @objectinfo.nil? or refresh == true
|
227
227
|
@etcmethod ||= ("get" + self.class.section.to_s + "nam").intern
|
228
228
|
begin
|
229
|
-
@objectinfo = Etc.send(@etcmethod, @resource[:name])
|
229
|
+
@objectinfo = Puppet::Etc.send(@etcmethod, @resource[:name])
|
230
230
|
rescue ArgumentError
|
231
231
|
@objectinfo = nil
|
232
232
|
end
|
@@ -242,13 +242,13 @@ class Puppet::Provider::NameService < Puppet::Provider
|
|
242
242
|
groups = []
|
243
243
|
|
244
244
|
# Reset our group list
|
245
|
-
Etc.setgrent
|
245
|
+
Puppet::Etc.setgrent
|
246
246
|
|
247
247
|
user = @resource[:name]
|
248
248
|
|
249
249
|
# Now iterate across all of the groups, adding each one our
|
250
250
|
# user is a member of
|
251
|
-
while group = Etc.getgrent
|
251
|
+
while group = Puppet::Etc.getgrent
|
252
252
|
members = group.mem
|
253
253
|
|
254
254
|
groups << group.name if members.include? user
|
@@ -256,7 +256,7 @@ class Puppet::Provider::NameService < Puppet::Provider
|
|
256
256
|
|
257
257
|
# We have to close the file, so each listing is a separate
|
258
258
|
# reading of the file.
|
259
|
-
Etc.endgrent
|
259
|
+
Puppet::Etc.endgrent
|
260
260
|
|
261
261
|
groups.join(",")
|
262
262
|
end
|
@@ -79,35 +79,39 @@ Puppet::Type.type(:selmodule).provide(:semodule) do
|
|
79
79
|
|
80
80
|
def selmodversion_file
|
81
81
|
magic = 0xF97CFF8F
|
82
|
+
v = nil
|
82
83
|
|
83
84
|
filename = selmod_name_to_filename
|
84
|
-
|
85
|
+
# Open a file handle and parse the bytes until version is found
|
86
|
+
Puppet::FileSystem.open(filename, nil, 'rb') do |mod|
|
85
87
|
|
86
|
-
|
88
|
+
(hdr, ver, numsec) = mod.read(12).unpack('VVV')
|
87
89
|
|
88
|
-
|
90
|
+
raise Puppet::Error, "Found #{hdr} instead of magic #{magic} in #{filename}" if hdr != magic
|
89
91
|
|
90
|
-
|
92
|
+
raise Puppet::Error, "Unknown policy file version #{ver} in #{filename}" if ver != 1
|
91
93
|
|
92
|
-
|
93
|
-
|
94
|
+
# Read through (and throw away) the file section offsets, and also
|
95
|
+
# the magic header for the first section.
|
94
96
|
|
95
|
-
|
97
|
+
mod.read((numsec + 1) * 4)
|
96
98
|
|
97
|
-
|
99
|
+
## Section 1 should be "SE Linux Module"
|
98
100
|
|
99
|
-
|
100
|
-
|
101
|
+
selmod_readnext(mod)
|
102
|
+
selmod_readnext(mod)
|
101
103
|
|
102
|
-
|
103
|
-
|
104
|
+
# Skip past the section headers
|
105
|
+
mod.read(14)
|
104
106
|
|
105
|
-
|
106
|
-
|
107
|
+
# Module name
|
108
|
+
selmod_readnext(mod)
|
107
109
|
|
108
|
-
|
110
|
+
# At last! the version
|
109
111
|
|
110
|
-
|
112
|
+
v = selmod_readnext(mod)
|
113
|
+
|
114
|
+
end
|
111
115
|
|
112
116
|
self.debug "file version #{v}"
|
113
117
|
v
|
@@ -91,56 +91,56 @@ Puppet::Type.type(:service).provide :src, :parent => :base do
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def restart
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
94
|
+
execute([command(:lssrc), "-Ss", @resource[:name]]).each_line do |line|
|
95
|
+
args = line.split(":")
|
96
|
+
|
97
|
+
next unless args[0] == @resource[:name]
|
98
|
+
|
99
|
+
# Subsystems with the -K flag can get refreshed (HUPed)
|
100
|
+
# While subsystems with -S (signals) must be stopped/started
|
101
|
+
method = args[11]
|
102
|
+
do_refresh = case method
|
103
|
+
when "-K" then :true
|
104
|
+
when "-S" then :false
|
105
|
+
else self.fail("Unknown service communication method #{method}")
|
106
|
+
end
|
107
107
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
end
|
115
|
-
return :true
|
116
|
-
rescue Puppet::ExecutionFailure => detail
|
117
|
-
raise Puppet::Error.new("Unable to restart service #{@resource[:name]}, error was: #{detail}", detail )
|
108
|
+
begin
|
109
|
+
if do_refresh == :true
|
110
|
+
execute([command(:refresh), "-s", @resource[:name]])
|
111
|
+
else
|
112
|
+
self.stop
|
113
|
+
self.start
|
118
114
|
end
|
115
|
+
return :true
|
116
|
+
rescue Puppet::ExecutionFailure => detail
|
117
|
+
raise Puppet::Error.new("Unable to restart service #{@resource[:name]}, error was: #{detail}", detail )
|
119
118
|
end
|
120
|
-
|
119
|
+
end
|
120
|
+
self.fail("No such service found")
|
121
121
|
rescue Puppet::ExecutionFailure => detail
|
122
|
-
|
122
|
+
raise Puppet::Error.new("Cannot get status of #{@resource[:name]}, error was: #{detail}", detail )
|
123
123
|
end
|
124
124
|
|
125
125
|
def status
|
126
|
-
|
127
|
-
|
126
|
+
execute([command(:lssrc), "-s", @resource[:name]]).each_line do |line|
|
127
|
+
args = line.split
|
128
128
|
|
129
|
-
|
130
|
-
|
129
|
+
# This is the header line
|
130
|
+
next unless args[0] == @resource[:name]
|
131
131
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
end
|
138
|
-
Puppet.debug("Service #{@resource[:name]} is #{args[-1]}")
|
139
|
-
return state
|
132
|
+
# PID is the 3rd field, but inoperative subsystems
|
133
|
+
# skip this so split doesn't work right
|
134
|
+
state = case args[-1]
|
135
|
+
when "active" then :running
|
136
|
+
when "inoperative" then :stopped
|
140
137
|
end
|
141
|
-
|
138
|
+
Puppet.debug("Service #{@resource[:name]} is #{args[-1]}")
|
139
|
+
return state
|
140
|
+
end
|
142
141
|
rescue Puppet::ExecutionFailure => detail
|
143
|
-
|
142
|
+
self.debug(detail.message)
|
143
|
+
return :stopped
|
144
144
|
end
|
145
145
|
|
146
146
|
end
|