choria-mcorpc-support 2.21.1 → 2.23.1

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.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mcollective.rb +1 -2
  3. data/lib/mcollective/agent/bolt_tasks.ddl +253 -0
  4. data/lib/mcollective/agent/bolt_tasks.json +365 -0
  5. data/lib/mcollective/agent/bolt_tasks.rb +178 -0
  6. data/lib/mcollective/agent/choria_util.ddl +152 -0
  7. data/lib/mcollective/agent/choria_util.json +244 -0
  8. data/lib/mcollective/agent/rpcutil.ddl +8 -4
  9. data/lib/mcollective/agent/rpcutil.json +333 -0
  10. data/lib/mcollective/agent/scout.ddl +169 -0
  11. data/lib/mcollective/agent/scout.json +224 -0
  12. data/lib/mcollective/agents.rb +7 -6
  13. data/lib/mcollective/aggregate.rb +4 -4
  14. data/lib/mcollective/aggregate/average.rb +2 -2
  15. data/lib/mcollective/aggregate/base.rb +2 -2
  16. data/lib/mcollective/aggregate/result.rb +3 -3
  17. data/lib/mcollective/aggregate/result/collection_result.rb +2 -2
  18. data/lib/mcollective/aggregate/result/numeric_result.rb +2 -2
  19. data/lib/mcollective/aggregate/sum.rb +2 -2
  20. data/lib/mcollective/aggregate/summary.rb +3 -4
  21. data/lib/mcollective/application.rb +57 -21
  22. data/lib/mcollective/application/choria.rb +189 -0
  23. data/lib/mcollective/application/completion.rb +6 -6
  24. data/lib/mcollective/application/facts.rb +11 -11
  25. data/lib/mcollective/application/federation.rb +237 -0
  26. data/lib/mcollective/application/find.rb +4 -4
  27. data/lib/mcollective/application/help.rb +3 -3
  28. data/lib/mcollective/application/inventory.rb +3 -341
  29. data/lib/mcollective/application/ping.rb +5 -51
  30. data/lib/mcollective/application/playbook.rb +207 -0
  31. data/lib/mcollective/application/plugin.rb +106 -106
  32. data/lib/mcollective/application/rpc.rb +3 -108
  33. data/lib/mcollective/application/tasks.rb +425 -0
  34. data/lib/mcollective/applications.rb +11 -10
  35. data/lib/mcollective/audit/choria.rb +33 -0
  36. data/lib/mcollective/cache.rb +2 -4
  37. data/lib/mcollective/client.rb +11 -10
  38. data/lib/mcollective/config.rb +21 -34
  39. data/lib/mcollective/connector/base.rb +2 -1
  40. data/lib/mcollective/connector/nats.ddl +9 -0
  41. data/lib/mcollective/connector/nats.rb +450 -0
  42. data/lib/mcollective/data.rb +8 -3
  43. data/lib/mcollective/data/agent_data.rb +1 -1
  44. data/lib/mcollective/data/base.rb +6 -5
  45. data/lib/mcollective/data/bolt_task_data.ddl +90 -0
  46. data/lib/mcollective/data/bolt_task_data.rb +32 -0
  47. data/lib/mcollective/data/collective_data.rb +1 -1
  48. data/lib/mcollective/data/fact_data.rb +6 -6
  49. data/lib/mcollective/data/fstat_data.rb +2 -4
  50. data/lib/mcollective/data/result.rb +7 -2
  51. data/lib/mcollective/ddl/agentddl.rb +5 -17
  52. data/lib/mcollective/ddl/base.rb +10 -13
  53. data/lib/mcollective/discovery.rb +24 -39
  54. data/lib/mcollective/discovery/choria.ddl +11 -0
  55. data/lib/mcollective/discovery/choria.rb +223 -0
  56. data/lib/mcollective/discovery/flatfile.rb +7 -8
  57. data/lib/mcollective/discovery/mc.rb +2 -2
  58. data/lib/mcollective/discovery/stdin.rb +17 -18
  59. data/lib/mcollective/exceptions.rb +13 -0
  60. data/lib/mcollective/facts/base.rb +9 -9
  61. data/lib/mcollective/facts/yaml_facts.rb +12 -12
  62. data/lib/mcollective/generators.rb +3 -3
  63. data/lib/mcollective/generators/agent_generator.rb +3 -4
  64. data/lib/mcollective/generators/base.rb +14 -15
  65. data/lib/mcollective/generators/data_generator.rb +5 -6
  66. data/lib/mcollective/log.rb +2 -2
  67. data/lib/mcollective/logger/base.rb +3 -2
  68. data/lib/mcollective/logger/console_logger.rb +10 -10
  69. data/lib/mcollective/logger/file_logger.rb +7 -7
  70. data/lib/mcollective/logger/syslog_logger.rb +11 -15
  71. data/lib/mcollective/message.rb +8 -39
  72. data/lib/mcollective/monkey_patches.rb +2 -4
  73. data/lib/mcollective/optionparser.rb +2 -1
  74. data/lib/mcollective/pluginmanager.rb +3 -5
  75. data/lib/mcollective/pluginpackager.rb +1 -3
  76. data/lib/mcollective/pluginpackager/agent_definition.rb +3 -8
  77. data/lib/mcollective/pluginpackager/forge_packager.rb +7 -9
  78. data/lib/mcollective/pluginpackager/standard_definition.rb +1 -2
  79. data/lib/mcollective/registration/base.rb +18 -16
  80. data/lib/mcollective/rpc.rb +2 -4
  81. data/lib/mcollective/rpc/actionrunner.rb +16 -18
  82. data/lib/mcollective/rpc/agent.rb +26 -43
  83. data/lib/mcollective/rpc/audit.rb +1 -0
  84. data/lib/mcollective/rpc/client.rb +67 -85
  85. data/lib/mcollective/rpc/helpers.rb +55 -62
  86. data/lib/mcollective/rpc/progress.rb +2 -2
  87. data/lib/mcollective/rpc/reply.rb +17 -19
  88. data/lib/mcollective/rpc/request.rb +7 -5
  89. data/lib/mcollective/rpc/result.rb +6 -8
  90. data/lib/mcollective/rpc/stats.rb +49 -58
  91. data/lib/mcollective/security/base.rb +13 -56
  92. data/lib/mcollective/security/choria.rb +765 -0
  93. data/lib/mcollective/shell.rb +9 -4
  94. data/lib/mcollective/signer/base.rb +28 -0
  95. data/lib/mcollective/signer/choria.rb +185 -0
  96. data/lib/mcollective/ssl.rb +8 -6
  97. data/lib/mcollective/util.rb +58 -55
  98. data/lib/mcollective/util/bolt_support.rb +176 -0
  99. data/lib/mcollective/util/bolt_support/plan_runner.rb +167 -0
  100. data/lib/mcollective/util/bolt_support/task_result.rb +94 -0
  101. data/lib/mcollective/util/bolt_support/task_results.rb +128 -0
  102. data/lib/mcollective/util/choria.rb +946 -0
  103. data/lib/mcollective/util/indifferent_hash.rb +12 -0
  104. data/lib/mcollective/util/natswrapper.rb +242 -0
  105. data/lib/mcollective/util/playbook.rb +435 -0
  106. data/lib/mcollective/util/playbook/data_stores.rb +201 -0
  107. data/lib/mcollective/util/playbook/data_stores/base.rb +99 -0
  108. data/lib/mcollective/util/playbook/data_stores/consul_data_store.rb +88 -0
  109. data/lib/mcollective/util/playbook/data_stores/environment_data_store.rb +33 -0
  110. data/lib/mcollective/util/playbook/data_stores/etcd_data_store.rb +42 -0
  111. data/lib/mcollective/util/playbook/data_stores/file_data_store.rb +106 -0
  112. data/lib/mcollective/util/playbook/data_stores/shell_data_store.rb +103 -0
  113. data/lib/mcollective/util/playbook/inputs.rb +265 -0
  114. data/lib/mcollective/util/playbook/nodes.rb +207 -0
  115. data/lib/mcollective/util/playbook/nodes/mcollective_nodes.rb +86 -0
  116. data/lib/mcollective/util/playbook/nodes/pql_nodes.rb +40 -0
  117. data/lib/mcollective/util/playbook/nodes/shell_nodes.rb +55 -0
  118. data/lib/mcollective/util/playbook/nodes/terraform_nodes.rb +65 -0
  119. data/lib/mcollective/util/playbook/nodes/yaml_nodes.rb +47 -0
  120. data/lib/mcollective/util/playbook/playbook_logger.rb +47 -0
  121. data/lib/mcollective/util/playbook/puppet_logger.rb +51 -0
  122. data/lib/mcollective/util/playbook/report.rb +152 -0
  123. data/lib/mcollective/util/playbook/task_result.rb +55 -0
  124. data/lib/mcollective/util/playbook/tasks.rb +196 -0
  125. data/lib/mcollective/util/playbook/tasks/base.rb +45 -0
  126. data/lib/mcollective/util/playbook/tasks/graphite_event_task.rb +64 -0
  127. data/lib/mcollective/util/playbook/tasks/mcollective_task.rb +356 -0
  128. data/lib/mcollective/util/playbook/tasks/shell_task.rb +93 -0
  129. data/lib/mcollective/util/playbook/tasks/slack_task.rb +105 -0
  130. data/lib/mcollective/util/playbook/tasks/webhook_task.rb +136 -0
  131. data/lib/mcollective/util/playbook/template_util.rb +98 -0
  132. data/lib/mcollective/util/playbook/uses.rb +169 -0
  133. data/lib/mcollective/util/tasks_support.rb +751 -0
  134. data/lib/mcollective/util/tasks_support/cli.rb +260 -0
  135. data/lib/mcollective/util/tasks_support/default_formatter.rb +138 -0
  136. data/lib/mcollective/util/tasks_support/json_formatter.rb +108 -0
  137. data/lib/mcollective/validator.rb +6 -1
  138. data/lib/mcollective/validator/bolt_task_name_validator.ddl +7 -0
  139. data/lib/mcollective/validator/bolt_task_name_validator.rb +11 -0
  140. data/lib/mcollective/validator/length_validator.rb +1 -3
  141. metadata +65 -6
  142. data/lib/mcollective/application/describe_filter.rb +0 -87
  143. data/lib/mcollective/matcher.rb +0 -220
  144. data/lib/mcollective/matcher/parser.rb +0 -128
  145. data/lib/mcollective/matcher/scanner.rb +0 -241
@@ -0,0 +1,201 @@
1
+ require_relative "data_stores/base"
2
+ require_relative "data_stores/consul_data_store"
3
+ require_relative "data_stores/environment_data_store"
4
+ require_relative "data_stores/etcd_data_store"
5
+ require_relative "data_stores/file_data_store"
6
+ require_relative "data_stores/shell_data_store"
7
+
8
+ module MCollective
9
+ module Util
10
+ class Playbook
11
+ class DataStores
12
+ def initialize(playbook)
13
+ @playbook = playbook
14
+ @stores = {}
15
+ end
16
+
17
+ # Determines if a path is in the valid form and a known store
18
+ #
19
+ # @param path [String] example data_store/key_name
20
+ # @return [Boolean]
21
+ def valid_path?(path)
22
+ store, _ = parse_path(path)
23
+ include?(store)
24
+ rescue
25
+ false
26
+ end
27
+
28
+ # Parse a normal format data path
29
+ #
30
+ # @param path [String] example data_store/key_name
31
+ # @return [String, String] store name and key name
32
+ # @raise [StandardError] for incorrectly formatted paths
33
+ def parse_path(path)
34
+ if path =~ /^([a-zA-Z0-9\-_]+)\/(.+)$/
35
+ [$1, $2]
36
+ else
37
+ raise("Invalid data store path %s" % [path])
38
+ end
39
+ end
40
+
41
+ # Reads from a path
42
+ #
43
+ # @param path [String] example data_store/key_name
44
+ # @return [Object] data from the data store
45
+ # @raise [StandardError] when reading from the key fails
46
+ # @raise [StandardError] for unknown stores
47
+ def read(path)
48
+ store, key = parse_path(path)
49
+
50
+ Log.debug("Reading key %s from data store %s" % [key, store])
51
+
52
+ self[store].read(key)
53
+ rescue
54
+ raise("Could not read key %s: %s: %s" % [path, $!.class, $!.to_s])
55
+ end
56
+
57
+ # Writes to a path
58
+ #
59
+ # @param path [String] example data_store/key_name
60
+ # @param value [Object] data to write to the path
61
+ # @raise [StandardError] when reading from the key fails
62
+ # @raise [StandardError] for unknown stores
63
+ def write(path, value)
64
+ store, key = parse_path(path)
65
+
66
+ Log.debug("Storing data in key %s within data store %s" % [key, store])
67
+ self[store].write(key, value)
68
+ end
69
+
70
+ # Deletes a path
71
+ #
72
+ # @param path [String] example data_store/key_name
73
+ # @raise [StandardError] when reading from the key fails
74
+ # @raise [StandardError] for unknown stores
75
+ def delete(path)
76
+ store, key = parse_path(path)
77
+
78
+ Log.debug("Deleting key %s from data store %s" % [key, store])
79
+ self[store].delete(key)
80
+ end
81
+
82
+ # Members registered in a service
83
+ #
84
+ # @param path [String] example data_store/key_name
85
+ # @return [Array<String>]
86
+ # @raise [StandardError] when reading from the key fails
87
+ # @raise [StandardError] for unknown stores
88
+ def members(path)
89
+ store, service = parse_path(path)
90
+
91
+ Log.debug("Retrieving service members for service %s from data store %s" % [service, store])
92
+ self[store].members(service)
93
+ end
94
+
95
+ # Attempts to lock a named semaphore, waits until it succeeds
96
+ #
97
+ # @param path [String] example data_store/key_name
98
+ # @raise [StandardError] when obtaining a lock fails
99
+ # @raise [StandardError] when obtaining a lock timesout
100
+ # @raise [StandardError] for unknown stores
101
+ def lock(path)
102
+ store, key = parse_path(path)
103
+ timeout = lock_timeout(store)
104
+
105
+ Log.debug("Obtaining lock %s on data store %s with timeout %d" % [key, store, timeout])
106
+
107
+ self[store].lock(key, timeout)
108
+ end
109
+
110
+ # Attempts to unlock a named semaphore
111
+ #
112
+ # @param path [String] example data_store/key_name
113
+ # @raise [StandardError] when reading from the key fails
114
+ # @raise [StandardError] for unknown stores
115
+ def release(path)
116
+ store, key = parse_path(path)
117
+
118
+ Log.debug("Releasing lock %s on data store %s" % [key, store])
119
+
120
+ self[store].release(key)
121
+ end
122
+
123
+ # Retrieves the configured lock timeout for a store
124
+ #
125
+ # @param store [String]
126
+ # @return [Integer]
127
+ def lock_timeout(store)
128
+ raise("Unknown data store %s" % store) unless include?(store)
129
+
130
+ @stores[store][:lock_timeout]
131
+ end
132
+
133
+ # Finds a named store instance
134
+ #
135
+ # @param store [String] a store name
136
+ # @raise [StandardError] for unknown stores
137
+ def [](store)
138
+ raise("Unknown data store %s" % store) unless include?(store)
139
+
140
+ @stores[store][:store]
141
+ end
142
+
143
+ # List of known store names
144
+ #
145
+ # @return [Array<String>]
146
+ def keys
147
+ @stores.keys
148
+ end
149
+
150
+ # Determines if a store is known
151
+ #
152
+ # @return [Boolean]
153
+ def include?(store)
154
+ @stores.include?(store)
155
+ end
156
+
157
+ # Prepares all the stores
158
+ def prepare
159
+ @stores.each_value do |properties|
160
+ properties[:store].from_hash(properties[:properties]).prepare
161
+ end
162
+ end
163
+
164
+ # Creates a store instance for a given type
165
+ #
166
+ # @param name [String] the store instance name
167
+ # @param type [String] store type
168
+ # @return [DataStores::Base] data store instance
169
+ # @raise [NameError] for unknown types
170
+ def store_for(name, type)
171
+ klass_name = "%sDataStore" % type.capitalize
172
+
173
+ DataStores.const_get(klass_name).new(name, @playbook)
174
+ rescue NameError
175
+ raise("Cannot find a handler for Data Store type %s" % type)
176
+ end
177
+
178
+ # Initialize the data stores from playbook data
179
+ #
180
+ # @param data [Hash] playbook format data
181
+ # @return [DataStores]
182
+ def from_hash(data)
183
+ @stores.clear
184
+
185
+ data.each do |store, props|
186
+ Log.debug("Loading data store %s" % [store])
187
+
188
+ @stores[store] = {
189
+ :properties => props,
190
+ :type => props["type"],
191
+ :lock_timeout => Integer(props.fetch("timeout", 120)),
192
+ :store => store_for(store, props["type"])
193
+ }
194
+ end
195
+
196
+ self
197
+ end
198
+ end
199
+ end
200
+ end
201
+ end
@@ -0,0 +1,99 @@
1
+ module MCollective
2
+ module Util
3
+ class Playbook
4
+ class DataStores
5
+ class Base
6
+ def initialize(name, playbook)
7
+ @playbook = playbook
8
+ @name = name
9
+
10
+ startup_hook
11
+ end
12
+
13
+ # Start up processing
14
+ #
15
+ # Implementations should not create a {initialize} instead they should
16
+ # have this hook which will be called once initialization is done
17
+ def startup_hook; end
18
+
19
+ # Prepares the store for use
20
+ #
21
+ # Here you can do things like connect to data bases, set up pools etc
22
+ def prepare; end
23
+
24
+ # Validate store properties created using from_hash
25
+ #
26
+ # @raise [StandardError] when configuration is invalid
27
+ def validate_configuration!; end
28
+
29
+ # Parse the data store properties as supplied by the playbook
30
+ #
31
+ # @param properties [Hash] lock properties
32
+ # @return [Base]
33
+ def from_hash(properties)
34
+ @properties = properties
35
+
36
+ validate_configuration!
37
+
38
+ self
39
+ end
40
+
41
+ # Release a lock found in the store
42
+ #
43
+ # @note when the lock does not exist it should not raise an error
44
+ # @param key [String] the lock name
45
+ # @raise [StandardError] when releaging fails
46
+ def release(key)
47
+ raise(StandardError, "release not implemented in %s" % [self.class], caller)
48
+ end
49
+
50
+ # Locks a specific lock in the store
51
+ #
52
+ # @note when the lock does not exist it should be created
53
+ # @param key [String] the lock name
54
+ # @param timeout [Integer,Float] how long to attempt to get the lock for
55
+ # @raise [StandardError] when locking fails
56
+ def lock(key, timeout)
57
+ raise(StandardError, "lock not implemented in %s" % [self.class], caller)
58
+ end
59
+
60
+ # Finds the members in a service
61
+ #
62
+ # @param key [String] the service name
63
+ # @return [Array<String>] list of service members
64
+ # @raise [StandardError] when the service is unknown or general error happened
65
+ def members(key)
66
+ raise(StandardError, "members not implemented in %s" % [self.class], caller)
67
+ end
68
+
69
+ # Deletes a key from a data store
70
+ #
71
+ # @note deleting non existing data should not raise an error
72
+ # @param key [String] the key to delete
73
+ # @raise [StandardError] when deleting fails
74
+ def delete(key)
75
+ raise(StandardError, "delete not implemented in %s" % [self.class], caller)
76
+ end
77
+
78
+ # Writes a value to the key in a data store
79
+ #
80
+ # @param key [String] the key to write
81
+ # @param value [String] the value to write
82
+ # @raise [StandardError] when writing fails
83
+ def write(key, value)
84
+ raise(StandardError, "write not implemented in %s" % [self.class], caller)
85
+ end
86
+
87
+ # Reads a key from a data store
88
+ #
89
+ # @param key [String] the key to read
90
+ # @return [String] string found in the data store
91
+ # @raise [StandardError] when the key does not exist
92
+ def read(key)
93
+ raise(StandardError, "read not implemented in %s" % [self.class], caller)
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,88 @@
1
+ module MCollective
2
+ module Util
3
+ class Playbook
4
+ class DataStores
5
+ class ConsulDataStore < Base
6
+ def startup_hook
7
+ require "diplomat"
8
+
9
+ @session_mutex = Mutex.new
10
+ @session_manager = nil
11
+ @session_id = nil
12
+ rescue LoadError
13
+ raise("Consul Data Store is not functional. Please install the diplomat Gem.")
14
+ end
15
+
16
+ def lock(key, timeout)
17
+ Timeout.timeout(timeout) do
18
+ Diplomat::Lock.wait_to_acquire(key, session, nil, 2)
19
+ end
20
+ rescue Timeout::Error
21
+ raise("Failed to obtain lock %s after %d seconds" % [key, timeout])
22
+ end
23
+
24
+ def release(key)
25
+ Diplomat::Lock.release(key, session)
26
+ end
27
+
28
+ def read(key)
29
+ Diplomat::Kv.get(key)
30
+ end
31
+
32
+ def write(key, value)
33
+ Diplomat::Kv.put(key, value)
34
+ end
35
+
36
+ def delete(key)
37
+ Diplomat::Kv.delete(key)
38
+ end
39
+
40
+ def ttl
41
+ supplied = Integer(@properties.fetch("ttl", 10)).abs
42
+
43
+ supplied < 10 ? 10 : supplied
44
+ end
45
+
46
+ def renew_session
47
+ if @session_id
48
+ Log.debug("Renewing Consul session %s" % [@session_id])
49
+ Diplomat::Session.renew(@session_id)
50
+ end
51
+ end
52
+
53
+ def start_session_manager
54
+ @session_manager = Thread.new do
55
+ begin
56
+ loop do
57
+ renew_session
58
+
59
+ sleep(ttl - 5)
60
+ end
61
+ rescue
62
+ Log.warn("Session manager for Consul data store %s failed: %s: %s" % [@name, $!.class, $!.to_s])
63
+
64
+ sleep(1)
65
+
66
+ retry
67
+ end
68
+ end
69
+ end
70
+
71
+ def session
72
+ @session_mutex.synchronize do
73
+ return @session_id if @session_id
74
+
75
+ ttl_spec = "%ss" % ttl
76
+
77
+ @session_id ||= Diplomat::Session.create("TTL" => ttl_spec, "Behavior" => "delete")
78
+
79
+ start_session_manager
80
+
81
+ @session_id
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,33 @@
1
+ require_relative "base"
2
+
3
+ module MCollective
4
+ module Util
5
+ class Playbook
6
+ class DataStores
7
+ class EnvironmentDataStore < Base
8
+ def read(key)
9
+ raise("No such environment variable %s" % [key_for(key)]) unless include?(key)
10
+
11
+ ENV[key_for(key)]
12
+ end
13
+
14
+ def write(key, value)
15
+ ENV[key_for(key)] = value
16
+ end
17
+
18
+ def delete(key)
19
+ ENV.delete(key_for(key))
20
+ end
21
+
22
+ def key_for(key)
23
+ "%s%s" % [@properties["prefix"], key]
24
+ end
25
+
26
+ def include?(key)
27
+ ENV.include?(key_for(key))
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,42 @@
1
+ module MCollective
2
+ module Util
3
+ class Playbook
4
+ class DataStores
5
+ class EtcdDataStore < Base
6
+ def startup_hook
7
+ require "etcdv3"
8
+ rescue LoadError
9
+ raise("Etcd Data Store is not functional. Please install the etcdv3 Gem.")
10
+ end
11
+
12
+ def conn
13
+ return @_conn if @_conn
14
+
15
+ opts = {}
16
+ opts[:url] = @properties.fetch("url", "http://127.0.0.1:2379")
17
+ opts[:user] = @properties["user"] if @properties["user"]
18
+ opts[:password] = @properties["password"] if @properties["password"]
19
+
20
+ @_conn = Etcdv3.new(opts)
21
+ end
22
+
23
+ def read(key)
24
+ result = conn.get(key)
25
+
26
+ raise("Could not find key %s" % key) if !result || result.kvs.empty?
27
+
28
+ result.kvs[0].value
29
+ end
30
+
31
+ def write(key, value)
32
+ conn.put(key, value)
33
+ end
34
+
35
+ def delete(key)
36
+ conn.del(key)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end