puppet 5.5.6-x86-mingw32 → 5.5.7-x86-mingw32

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.

Files changed (152) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -1
  3. data/Gemfile.lock +12 -12
  4. data/Rakefile +9 -0
  5. data/lib/puppet/application.rb +5 -0
  6. data/lib/puppet/application/apply.rb +1 -0
  7. data/lib/puppet/application/master.rb +9 -7
  8. data/lib/puppet/application/script.rb +1 -1
  9. data/lib/puppet/defaults.rb +51 -31
  10. data/lib/puppet/etc.rb +20 -0
  11. data/lib/puppet/file_serving/fileset.rb +1 -1
  12. data/lib/puppet/functions.rb +123 -0
  13. data/lib/puppet/functions/new.rb +37 -53
  14. data/lib/puppet/functions/warning.rb +1 -1
  15. data/lib/puppet/loaders.rb +1 -0
  16. data/lib/puppet/parser/functions.rb +3 -1
  17. data/lib/puppet/parser/functions/sprintf.rb +12 -1
  18. data/lib/puppet/pops/evaluator/runtime3_converter.rb +16 -0
  19. data/lib/puppet/pops/evaluator/runtime3_support.rb +3 -4
  20. data/lib/puppet/pops/issues.rb +8 -0
  21. data/lib/puppet/pops/loader/loader.rb +2 -2
  22. data/lib/puppet/pops/loader/loader_paths.rb +3 -1
  23. data/lib/puppet/pops/loader/module_loaders.rb +1 -1
  24. data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +62 -0
  25. data/lib/puppet/pops/loaders.rb +5 -21
  26. data/lib/puppet/pops/parser/heredoc_support.rb +1 -2
  27. data/lib/puppet/pops/parser/lexer2.rb +1 -1
  28. data/lib/puppet/pops/validation/checker4_0.rb +31 -6
  29. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  30. data/lib/puppet/property/keyvalue.rb +70 -8
  31. data/lib/puppet/provider/aix_object.rb +483 -0
  32. data/lib/puppet/provider/exec.rb +54 -57
  33. data/lib/puppet/provider/group/aix.rb +40 -115
  34. data/lib/puppet/provider/group/pw.rb +4 -8
  35. data/lib/puppet/provider/group/windows_adsi.rb +7 -4
  36. data/lib/puppet/provider/nameservice.rb +1 -25
  37. data/lib/puppet/provider/nameservice/directoryservice.rb +5 -3
  38. data/lib/puppet/provider/package/portage.rb +2 -2
  39. data/lib/puppet/provider/package/windows.rb +2 -2
  40. data/lib/puppet/provider/package/windows/exe_package.rb +3 -10
  41. data/lib/puppet/provider/package/zypper.rb +1 -1
  42. data/lib/puppet/provider/service/launchd.rb +19 -3
  43. data/lib/puppet/provider/service/windows.rb +49 -40
  44. data/lib/puppet/provider/user/aix.rb +180 -246
  45. data/lib/puppet/provider/user/windows_adsi.rb +9 -1
  46. data/lib/puppet/resource/catalog.rb +1 -5
  47. data/lib/puppet/type/augeas.rb +1 -1
  48. data/lib/puppet/type/exec.rb +16 -14
  49. data/lib/puppet/type/file.rb +2 -2
  50. data/lib/puppet/type/file/source.rb +9 -5
  51. data/lib/puppet/type/group.rb +65 -23
  52. data/lib/puppet/type/k5login.rb +2 -2
  53. data/lib/puppet/type/notify.rb +1 -1
  54. data/lib/puppet/type/package.rb +3 -6
  55. data/lib/puppet/type/resources.rb +12 -2
  56. data/lib/puppet/type/schedule.rb +8 -1
  57. data/lib/puppet/type/selboolean.rb +2 -2
  58. data/lib/puppet/type/selmodule.rb +3 -4
  59. data/lib/puppet/type/service.rb +2 -5
  60. data/lib/puppet/type/tidy.rb +1 -1
  61. data/lib/puppet/type/user.rb +15 -20
  62. data/lib/puppet/type/yumrepo.rb +2 -2
  63. data/lib/puppet/type/zone.rb +2 -2
  64. data/lib/puppet/util.rb +7 -3
  65. data/lib/puppet/util/execution.rb +15 -1
  66. data/lib/puppet/util/posix.rb +15 -0
  67. data/lib/puppet/util/storage.rb +12 -0
  68. data/lib/puppet/util/windows.rb +4 -2
  69. data/lib/puppet/util/windows/adsi.rb +235 -205
  70. data/lib/puppet/util/windows/process.rb +23 -3
  71. data/lib/puppet/util/windows/security.rb +14 -0
  72. data/lib/puppet/util/windows/service.rb +977 -0
  73. data/lib/puppet/util/windows/user.rb +3 -5
  74. data/lib/puppet/version.rb +1 -1
  75. data/locales/ja/puppet.po +705 -374
  76. data/locales/puppet.pot +485 -261
  77. data/man/man5/puppet.conf.5 +36 -15
  78. data/man/man8/puppet-agent.8 +1 -1
  79. data/man/man8/puppet-apply.8 +1 -1
  80. data/man/man8/puppet-ca.8 +1 -1
  81. data/man/man8/puppet-catalog.8 +1 -1
  82. data/man/man8/puppet-cert.8 +1 -1
  83. data/man/man8/puppet-certificate.8 +1 -1
  84. data/man/man8/puppet-certificate_request.8 +1 -1
  85. data/man/man8/puppet-certificate_revocation_list.8 +1 -1
  86. data/man/man8/puppet-config.8 +1 -1
  87. data/man/man8/puppet-describe.8 +1 -1
  88. data/man/man8/puppet-device.8 +1 -1
  89. data/man/man8/puppet-doc.8 +1 -1
  90. data/man/man8/puppet-epp.8 +1 -1
  91. data/man/man8/puppet-facts.8 +1 -1
  92. data/man/man8/puppet-filebucket.8 +1 -1
  93. data/man/man8/puppet-generate.8 +1 -1
  94. data/man/man8/puppet-help.8 +1 -1
  95. data/man/man8/puppet-key.8 +1 -1
  96. data/man/man8/puppet-lookup.8 +1 -1
  97. data/man/man8/puppet-man.8 +1 -1
  98. data/man/man8/puppet-master.8 +1 -1
  99. data/man/man8/puppet-module.8 +1 -1
  100. data/man/man8/puppet-node.8 +1 -1
  101. data/man/man8/puppet-parser.8 +1 -1
  102. data/man/man8/puppet-plugin.8 +1 -1
  103. data/man/man8/puppet-report.8 +1 -1
  104. data/man/man8/puppet-resource.8 +1 -1
  105. data/man/man8/puppet-script.8 +1 -1
  106. data/man/man8/puppet-status.8 +1 -1
  107. data/man/man8/puppet.8 +2 -2
  108. data/spec/fixtures/unit/provider/aix_object/aix_colon_list_real_world_input.out +1 -0
  109. data/spec/fixtures/unit/provider/aix_object/aix_colon_list_real_world_output.out +1 -0
  110. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +32 -0
  111. data/spec/integration/parser/collection_spec.rb +4 -8
  112. data/spec/integration/provider/service/windows_spec.rb +5 -5
  113. data/spec/integration/type/file_spec.rb +6 -6
  114. data/spec/integration/util/windows/adsi_spec.rb +6 -5
  115. data/spec/integration/util/windows/security_spec.rb +10 -7
  116. data/spec/integration/util/windows/user_spec.rb +37 -17
  117. data/spec/spec_helper.rb +0 -1
  118. data/spec/unit/application/apply_spec.rb +41 -2
  119. data/spec/unit/application/master_spec.rb +7 -0
  120. data/spec/unit/application_spec.rb +21 -3
  121. data/spec/unit/defaults_spec.rb +20 -0
  122. data/spec/unit/etc_spec.rb +25 -0
  123. data/spec/unit/file_serving/fileset_spec.rb +11 -11
  124. data/spec/unit/gettext/config_spec.rb +1 -1
  125. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +6 -6
  126. data/spec/unit/pops/loaders/loaders_spec.rb +40 -7
  127. data/spec/unit/pops/parser/parse_heredoc_spec.rb +16 -0
  128. data/spec/unit/pops/validator/validator_spec.rb +129 -10
  129. data/spec/unit/property/keyvalue_spec.rb +97 -6
  130. data/spec/unit/provider/aix_object_spec.rb +805 -0
  131. data/spec/unit/provider/group/aix_spec.rb +57 -0
  132. data/spec/unit/provider/group/pw_spec.rb +0 -6
  133. data/spec/unit/provider/group/windows_adsi_spec.rb +34 -35
  134. data/spec/unit/provider/nameservice/directoryservice_spec.rb +2 -2
  135. data/spec/unit/provider/package/windows/exe_package_spec.rb +3 -3
  136. data/spec/unit/provider/package/windows_spec.rb +4 -4
  137. data/spec/unit/provider/service/launchd_spec.rb +19 -0
  138. data/spec/unit/provider/service/windows_spec.rb +71 -78
  139. data/spec/unit/provider/user/aix_spec.rb +162 -116
  140. data/spec/unit/provider/user/windows_adsi_spec.rb +4 -4
  141. data/spec/unit/resource/catalog_spec.rb +2 -2
  142. data/spec/unit/ssl/certificate_authority_spec.rb +0 -1
  143. data/spec/unit/type/group_spec.rb +111 -13
  144. data/spec/unit/type/resources_spec.rb +18 -0
  145. data/spec/unit/util/execution_spec.rb +77 -0
  146. data/spec/unit/util/posix_spec.rb +28 -0
  147. data/spec/unit/util/storage_spec.rb +107 -0
  148. data/spec/unit/util/windows/adsi_spec.rb +108 -13
  149. data/spec/unit/util/windows/service_spec.rb +669 -0
  150. metadata +17 -5
  151. data/lib/puppet/provider/aixobject.rb +0 -392
  152. data/spec/unit/provider/aixobject_spec.rb +0 -101
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppet
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.5.6
4
+ version: 5.5.7
5
5
  platform: x86-mingw32
6
6
  authors:
7
7
  - Puppet Labs
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-21 00:00:00.000000000 Z
11
+ date: 2018-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: facter
@@ -892,6 +892,7 @@ files:
892
892
  - lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb
893
893
  - lib/puppet/pops/loader/ruby_data_type_instantiator.rb
894
894
  - lib/puppet/pops/loader/ruby_function_instantiator.rb
895
+ - lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb
895
896
  - lib/puppet/pops/loader/runtime3_type_loader.rb
896
897
  - lib/puppet/pops/loader/simple_environment_loader.rb
897
898
  - lib/puppet/pops/loader/static_loader.rb
@@ -1020,7 +1021,7 @@ files:
1020
1021
  - lib/puppet/property/list.rb
1021
1022
  - lib/puppet/property/ordered_list.rb
1022
1023
  - lib/puppet/provider.rb
1023
- - lib/puppet/provider/aixobject.rb
1024
+ - lib/puppet/provider/aix_object.rb
1024
1025
  - lib/puppet/provider/augeas/augeas.rb
1025
1026
  - lib/puppet/provider/cisco.rb
1026
1027
  - lib/puppet/provider/command.rb
@@ -1395,6 +1396,7 @@ files:
1395
1396
  - lib/puppet/util/windows/root_certs.rb
1396
1397
  - lib/puppet/util/windows/security.rb
1397
1398
  - lib/puppet/util/windows/security_descriptor.rb
1399
+ - lib/puppet/util/windows/service.rb
1398
1400
  - lib/puppet/util/windows/sid.rb
1399
1401
  - lib/puppet/util/windows/string.rb
1400
1402
  - lib/puppet/util/windows/taskscheduler.rb
@@ -1773,6 +1775,8 @@ files:
1773
1775
  - spec/fixtures/unit/pops/parser/lexer/tag.pp
1774
1776
  - spec/fixtures/unit/pops/parser/lexer/tagged.pp
1775
1777
  - spec/fixtures/unit/pops/parser/lexer/virtualresources.pp
1778
+ - spec/fixtures/unit/provider/aix_object/aix_colon_list_real_world_input.out
1779
+ - spec/fixtures/unit/provider/aix_object/aix_colon_list_real_world_output.out
1776
1780
  - spec/fixtures/unit/provider/augeas/augeas/augeas/lenses/test.aug
1777
1781
  - spec/fixtures/unit/provider/augeas/augeas/etc/fstab
1778
1782
  - spec/fixtures/unit/provider/augeas/augeas/etc/hosts
@@ -1842,6 +1846,7 @@ files:
1842
1846
  - spec/fixtures/unit/provider/ssh_authorized_key/parsed/authorized_keys2
1843
1847
  - spec/fixtures/unit/provider/sshkey/parsed/sample
1844
1848
  - spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines
1849
+ - spec/fixtures/unit/provider/user/aix/aix_passwd_file.out
1845
1850
  - spec/fixtures/unit/provider/zfs/zfs/zfs-list.out
1846
1851
  - spec/fixtures/unit/provider/zpool/zpool/zpool-list.out
1847
1852
  - spec/fixtures/unit/reports/tagmail/tagmail_email.conf
@@ -2446,7 +2451,7 @@ files:
2446
2451
  - spec/unit/property/ordered_list_spec.rb
2447
2452
  - spec/unit/property_spec.rb
2448
2453
  - spec/unit/provider/README.markdown
2449
- - spec/unit/provider/aixobject_spec.rb
2454
+ - spec/unit/provider/aix_object_spec.rb
2450
2455
  - spec/unit/provider/augeas/augeas_spec.rb
2451
2456
  - spec/unit/provider/cisco_spec.rb
2452
2457
  - spec/unit/provider/command_spec.rb
@@ -2458,6 +2463,7 @@ files:
2458
2463
  - spec/unit/provider/exec_spec.rb
2459
2464
  - spec/unit/provider/file/posix_spec.rb
2460
2465
  - spec/unit/provider/file/windows_spec.rb
2466
+ - spec/unit/provider/group/aix_spec.rb
2461
2467
  - spec/unit/provider/group/directoryservice_spec.rb
2462
2468
  - spec/unit/provider/group/groupadd_spec.rb
2463
2469
  - spec/unit/provider/group/ldap_spec.rb
@@ -2736,6 +2742,7 @@ files:
2736
2742
  - spec/unit/util/windows/file_spec.rb
2737
2743
  - spec/unit/util/windows/root_certs_spec.rb
2738
2744
  - spec/unit/util/windows/security_descriptor_spec.rb
2745
+ - spec/unit/util/windows/service_spec.rb
2739
2746
  - spec/unit/util/windows/sid_spec.rb
2740
2747
  - spec/unit/util/windows/string_spec.rb
2741
2748
  - spec/unit/util/yaml_spec.rb
@@ -3077,6 +3084,8 @@ test_files:
3077
3084
  - spec/fixtures/unit/pops/parser/lexer/tag.pp
3078
3085
  - spec/fixtures/unit/pops/parser/lexer/tagged.pp
3079
3086
  - spec/fixtures/unit/pops/parser/lexer/virtualresources.pp
3087
+ - spec/fixtures/unit/provider/aix_object/aix_colon_list_real_world_input.out
3088
+ - spec/fixtures/unit/provider/aix_object/aix_colon_list_real_world_output.out
3080
3089
  - spec/fixtures/unit/provider/augeas/augeas/augeas/lenses/test.aug
3081
3090
  - spec/fixtures/unit/provider/augeas/augeas/etc/fstab
3082
3091
  - spec/fixtures/unit/provider/augeas/augeas/etc/hosts
@@ -3146,6 +3155,7 @@ test_files:
3146
3155
  - spec/fixtures/unit/provider/ssh_authorized_key/parsed/authorized_keys2
3147
3156
  - spec/fixtures/unit/provider/sshkey/parsed/sample
3148
3157
  - spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines
3158
+ - spec/fixtures/unit/provider/user/aix/aix_passwd_file.out
3149
3159
  - spec/fixtures/unit/provider/zfs/zfs/zfs-list.out
3150
3160
  - spec/fixtures/unit/provider/zpool/zpool/zpool-list.out
3151
3161
  - spec/fixtures/unit/reports/tagmail/tagmail_email.conf
@@ -3750,7 +3760,7 @@ test_files:
3750
3760
  - spec/unit/property/ordered_list_spec.rb
3751
3761
  - spec/unit/property_spec.rb
3752
3762
  - spec/unit/provider/README.markdown
3753
- - spec/unit/provider/aixobject_spec.rb
3763
+ - spec/unit/provider/aix_object_spec.rb
3754
3764
  - spec/unit/provider/augeas/augeas_spec.rb
3755
3765
  - spec/unit/provider/cisco_spec.rb
3756
3766
  - spec/unit/provider/command_spec.rb
@@ -3762,6 +3772,7 @@ test_files:
3762
3772
  - spec/unit/provider/exec_spec.rb
3763
3773
  - spec/unit/provider/file/posix_spec.rb
3764
3774
  - spec/unit/provider/file/windows_spec.rb
3775
+ - spec/unit/provider/group/aix_spec.rb
3765
3776
  - spec/unit/provider/group/directoryservice_spec.rb
3766
3777
  - spec/unit/provider/group/groupadd_spec.rb
3767
3778
  - spec/unit/provider/group/ldap_spec.rb
@@ -4040,6 +4051,7 @@ test_files:
4040
4051
  - spec/unit/util/windows/file_spec.rb
4041
4052
  - spec/unit/util/windows/root_certs_spec.rb
4042
4053
  - spec/unit/util/windows/security_descriptor_spec.rb
4054
+ - spec/unit/util/windows/service_spec.rb
4043
4055
  - spec/unit/util/windows/sid_spec.rb
4044
4056
  - spec/unit/util/windows/string_spec.rb
4045
4057
  - spec/unit/util/yaml_spec.rb
@@ -1,392 +0,0 @@
1
- #
2
- # Common code for AIX providers. This class implements basic structure for
3
- # AIX resources.
4
- # Author:: Hector Rivas Gandara <keymon@gmail.com>
5
- #
6
- class Puppet::Provider::AixObject < Puppet::Provider
7
- desc "Generic AIX resource provider"
8
-
9
- # The real provider must implement these functions.
10
- def lscmd( _value = @resource[:name] )
11
- raise Puppet::Error, "Method not defined #{@resource.class.name} #{@resource.name}: Base AixObject provider doesn't implement lscmd"
12
- end
13
-
14
- def addcmd( _extra_attrs = [] )
15
- raise Puppet::Error, "Method not defined #{@resource.class.name} #{@resource.name}: Base AixObject provider doesn't implement addcmd"
16
- end
17
-
18
- def modifycmd( _attributes_hash = {} )
19
- raise Puppet::Error, "Method not defined #{@resource.class.name} #{@resource.name}: Base AixObject provider doesn't implement modifycmd"
20
- end
21
-
22
- def deletecmd
23
- raise Puppet::Error, "Method not defined #{@resource.class.name} #{@resource.name}: Base AixObject provider doesn't implement deletecmd"
24
- end
25
-
26
- # Valid attributes to be managed by this provider.
27
- # It is a list of hashes
28
- # :aix_attr AIX command attribute name
29
- # :puppet_prop Puppet property name
30
- # :to Optional. Method name that adapts puppet property to aix command value.
31
- # :from Optional. Method to adapt aix command line value to puppet property. Optional
32
- class << self
33
- attr_accessor :attribute_mapping
34
- end
35
-
36
- # Mapping from Puppet property to AIX attribute.
37
- def self.attribute_mapping_to
38
- if ! @attribute_mapping_to
39
- @attribute_mapping_to = {}
40
- attribute_mapping.each { |elem|
41
- attribute_mapping_to[elem[:puppet_prop]] = {
42
- :key => elem[:aix_attr],
43
- :method => elem[:to]
44
- }
45
- }
46
- end
47
- @attribute_mapping_to
48
- end
49
-
50
- # Mapping from AIX attribute to Puppet property.
51
- def self.attribute_mapping_from
52
- if ! @attribute_mapping_from
53
- @attribute_mapping_from = {}
54
- attribute_mapping.each { |elem|
55
- attribute_mapping_from[elem[:aix_attr]] = {
56
- :key => elem[:puppet_prop],
57
- :method => elem[:from]
58
- }
59
- }
60
- end
61
- @attribute_mapping_from
62
- end
63
-
64
- # This functions translates a key and value using the given mapping.
65
- # Mapping can be nil (no translation) or a hash with this format
66
- # {:key => new_key, :method => translate_method}
67
- # It returns a list with the pair [key, value]
68
- def translate_attr(key, value, mapping)
69
- return [key, value] unless mapping
70
- return nil unless mapping[key]
71
-
72
- if mapping[key][:method]
73
- new_value = method(mapping[key][:method]).call(value)
74
- else
75
- new_value = value
76
- end
77
- [mapping[key][:key], new_value]
78
- end
79
-
80
- # Loads an AIX attribute (key=value) and stores it in the given hash with
81
- # puppet semantics. It translates the pair using the given mapping.
82
- #
83
- # This operation works with each property one by one,
84
- # subclasses must reimplement this if more complex operations are needed
85
- def load_attribute(key, value, mapping, objectinfo)
86
- if mapping.nil?
87
- objectinfo[key] = value
88
- elsif mapping[key].nil?
89
- # is not present in mapping, ignore it.
90
- true
91
- elsif mapping[key][:method].nil?
92
- objectinfo[mapping[key][:key]] = value
93
- else
94
- objectinfo[mapping[key][:key]] = method(mapping[key][:method]).call(value)
95
- end
96
-
97
- return objectinfo
98
- end
99
-
100
- # Gets the given command line argument for the given key and value,
101
- # using the given mapping to translate key and value.
102
- # All the objectinfo hash (@resource or @property_hash) is passed.
103
- #
104
- # This operation works with each property one by one,
105
- # and default behaviour is return the arguments as key=value pairs.
106
- # Subclasses must reimplement this if more complex operations/arguments
107
- # are needed
108
- #
109
- def get_arguments(key, value, mapping, objectinfo)
110
- if mapping.nil?
111
- new_key = key
112
- new_value = value
113
- elsif mapping[key].nil?
114
- # is not present in mapping, ignore it.
115
- new_key = nil
116
- new_value = nil
117
- elsif mapping[key][:method].nil?
118
- new_key = mapping[key][:key]
119
- new_value = value
120
- else
121
- new_key = mapping[key][:key]
122
- new_value = method(mapping[key][:method]).call(value)
123
- end
124
-
125
- # convert it to string
126
- new_value = Array(new_value).join(',')
127
-
128
- if new_key
129
- return [ "#{new_key}=#{new_value}" ]
130
- else
131
- return []
132
- end
133
- end
134
-
135
- # Convert the provider properties (hash) to AIX command arguments
136
- # (list of strings)
137
- # This function will translate each value/key and generate the argument using
138
- # the get_arguments function.
139
- def hash2args(hash, mapping=self.class.attribute_mapping_to)
140
- return "" unless hash
141
- arg_list = []
142
- hash.each {|key, val|
143
- arg_list += self.get_arguments(key, val, mapping, hash)
144
- }
145
- arg_list
146
- end
147
-
148
- # Parse AIX command attributes from the output of an AIX command, that
149
- # which format is a list of space separated of key=value pairs:
150
- # "uid=100 groups=a,b,c".
151
- # It returns a hash.
152
- #
153
- # If a mapping is provided, the keys are translated as defined in the
154
- # mapping hash. And only values included in mapping will be added
155
- #
156
- # NOTE: it will ignore the items not including '='
157
- def parse_attr_list(str, mapping=self.class.attribute_mapping_from)
158
- properties = {}
159
- attrs = []
160
- if str.nil? or (attrs = str.split()).empty?
161
- return nil
162
- end
163
-
164
- attrs.each { |i|
165
- if i.include? "=" # Ignore if it does not include '='
166
- (key_str, val) = i.split('=')
167
- # Check the key
168
- if key_str.nil? or key_str.empty?
169
- info _("Empty key in string 'i'?")
170
- continue
171
- end
172
- key_str.strip!
173
- key = key_str.to_sym
174
- val.strip! if val
175
-
176
- properties = self.load_attribute(key, val, mapping, properties)
177
- end
178
- }
179
- properties.empty? ? nil : properties
180
- end
181
-
182
- # Parse AIX command output in a colon separated list of attributes,
183
- # This function is useful to parse the output of commands like lsfs -c:
184
- # #MountPoint:Device:Vfs:Nodename:Type:Size:Options:AutoMount:Acct
185
- # /:/dev/hd4:jfs2::bootfs:557056:rw:yes:no
186
- # /home:/dev/hd1:jfs2:::2129920:rw:yes:no
187
- # /usr:/dev/hd2:jfs2::bootfs:9797632:rw:yes:no
188
- #
189
- # If a mapping is provided, the keys are translated as defined in the
190
- # mapping hash. And only values included in mapping will be added
191
- def parse_colon_list(str, key_list, mapping=self.class.attribute_mapping_from)
192
- properties = {}
193
- attrs = []
194
- if str.nil? or (attrs = str.split(':')).empty?
195
- return nil
196
- end
197
-
198
- attrs.each { |val|
199
- key = key_list.shift.to_sym
200
- properties = self.load_attribute(key, val, mapping, properties)
201
- }
202
- properties.empty? ? nil : properties
203
- end
204
-
205
- # Default parsing function for AIX commands.
206
- # It will choose the method depending of the first line.
207
- # For the colon separated list it will:
208
- # 1. Get keys from first line.
209
- # 2. Parse next line.
210
- def parse_command_output(output, mapping=self.class.attribute_mapping_from)
211
- lines = output.split("\n")
212
- # if it begins with #something:... is a colon separated list.
213
- if lines[0] =~ /^#.*:/
214
- self.parse_colon_list(lines[1], lines[0][1..-1].split(':'), mapping)
215
- else
216
- self.parse_attr_list(lines[0], mapping)
217
- end
218
- end
219
-
220
- # Retrieve all the information of an existing resource.
221
- # It will execute 'lscmd' command and parse the output, using the mapping
222
- # 'attribute_mapping_from' to translate the keys and values.
223
- def getinfo(refresh = false)
224
- if @objectinfo.nil? or refresh == true
225
- # Execute lsuser, split all attributes and add them to a dict.
226
- begin
227
- output = execute(self.lscmd)
228
- @objectinfo = self.parse_command_output(output)
229
- # All attributes without translation
230
- @objectosinfo = self.parse_command_output(output, nil)
231
- rescue Puppet::ExecutionFailure => detail
232
- # Print error if needed. FIXME: Do not check the user here.
233
- Puppet.debug "aix.getinfo(): Could not find #{@resource.class.name} #{@resource.name}: #{detail}"
234
- end
235
- end
236
- @objectinfo
237
- end
238
-
239
- # Like getinfo, but it will not use the mapping to translate the keys and values.
240
- # It might be useful to retrieve some raw information.
241
- def getosinfo(refresh = false)
242
- if @objectosinfo.nil? or refresh == true
243
- getinfo(refresh)
244
- end
245
- @objectosinfo || Hash.new
246
- end
247
-
248
-
249
- # List all elements of given type. It works for colon separated commands and
250
- # list commands.
251
- # It returns a list of names.
252
- def self.list_all
253
- names = []
254
- begin
255
- output = execute([self.command(:list), 'ALL'])
256
-
257
- output = output.split("\n").select{ |line| line != /^#/ }
258
-
259
- output.each do |line|
260
- name = line.split(/[ :]/)[0]
261
- names << name if not name.empty?
262
- end
263
- rescue Puppet::ExecutionFailure => detail
264
- # Print error if needed
265
- Puppet.debug "aix.list_all(): Could not get all resources of type #{@resource.class.name}: #{detail}"
266
- end
267
- names
268
- end
269
-
270
-
271
- #-------------
272
- # Provider API
273
- # ------------
274
-
275
- # Clear out the cached values.
276
- def flush
277
- @property_hash.clear if @property_hash
278
- @objectinfo.clear if @objectinfo
279
- end
280
-
281
- # Check that the user exists
282
- def exists?
283
- !!getinfo(true) # !! => converts to bool
284
- end
285
-
286
- # Return all existing instances
287
- # The method for returning a list of provider instances. Note that it returns
288
- # providers, preferably with values already filled in, not resources.
289
- def self.instances
290
- objects=[]
291
- list_all.each { |entry|
292
- objects << new(:name => entry, :ensure => :present)
293
- }
294
- objects
295
- end
296
-
297
- #- **ensure**
298
- # The basic state that the object should be in. Valid values are
299
- # `present`, `absent`, `role`.
300
- # From ensurable: exists?, create, delete
301
- def ensure
302
- if exists?
303
- :present
304
- else
305
- :absent
306
- end
307
- end
308
-
309
- # Create a new instance of the resource
310
- def create
311
- if exists?
312
- info _("already exists")
313
- # The object already exists
314
- return nil
315
- end
316
-
317
- begin
318
- execute(self.addcmd)
319
- rescue Puppet::ExecutionFailure => detail
320
- raise Puppet::Error, _("Could not create %{resource} %{name}: %{detail}") % { resource: @resource.class.name, name: @resource.name, detail: detail }, detail.backtrace
321
- end
322
- end
323
-
324
- # Delete this instance of the resource
325
- def delete
326
- unless exists?
327
- info _("already absent")
328
- # the object already doesn't exist
329
- return nil
330
- end
331
-
332
- begin
333
- execute(self.deletecmd)
334
- rescue Puppet::ExecutionFailure => detail
335
- raise Puppet::Error, _("Could not delete %{resource} %{name}: %{detail}") % { resource: @resource.class.name, name: @resource.name, detail: detail }, detail.backtrace
336
- end
337
- end
338
-
339
- #--------------------------------
340
- # Call this method when the object is initialized.
341
- # It creates getter/setter methods for each property our resource type supports.
342
- # If setter or getter already defined it will not be overwritten
343
- def self.mk_resource_methods
344
- [resource_type.validproperties, resource_type.parameters].flatten.each do |prop|
345
- next if prop == :ensure
346
- define_method(prop) { get(prop) || :absent} unless public_method_defined?(prop)
347
- define_method(prop.to_s + "=") { |*vals| set(prop, *vals) } unless public_method_defined?(prop.to_s + "=")
348
- end
349
- end
350
-
351
- # Define the needed getters and setters as soon as we know the resource type
352
- def self.resource_type=(resource_type)
353
- super
354
- mk_resource_methods
355
- end
356
-
357
- # Retrieve a specific value by name.
358
- def get(param)
359
- (hash = getinfo(false)) ? hash[param] : nil
360
- end
361
-
362
- # Set a property.
363
- def set(param, value)
364
- @property_hash[param.intern] = value
365
-
366
- if getinfo().nil?
367
- # This is weird...
368
- raise Puppet::Error, _("Trying to update parameter '%{param}' to '%{value}' for a resource that does not exists %{resource} %{name}: %{detail}") % { param: param, value: value, resource: @resource.class.name, name: @resource.name, detail: detail }
369
- end
370
- if value == getinfo()[param.to_sym]
371
- return
372
- end
373
-
374
- #self.class.validate(param, value)
375
- if cmd = modifycmd({param =>value})
376
- begin
377
- execute(cmd)
378
- rescue Puppet::ExecutionFailure => detail
379
- raise Puppet::Error, _("Could not set %{param} on %{resource}[%{name}]: %{detail}") % { param: param, resource: @resource.class.name, name: @resource.name, detail: detail }, detail.backtrace
380
- end
381
- end
382
-
383
- # Refresh de info.
384
- getinfo(true)
385
- end
386
-
387
- def initialize(resource)
388
- super
389
- @objectinfo = nil
390
- @objectosinfo = nil
391
- end
392
- end