jackal-commander 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e1efecf35ee306e288645dd49c8a37275fb57327
4
+ data.tar.gz: 6be1982db812ed0ea02f96d7f76c98b51cbb5652
5
+ SHA512:
6
+ metadata.gz: c6e383a25524b9b2c6d908f959c9b07de814b9e5b4f7ea06dda59cab1d34eaf78d9d329fdb2a7e5311d8678e6bab7a7dfa63b27ce23eea3184e55eae1bc67be4
7
+ data.tar.gz: 555dfde9a2c74d55c2fa264d63649f49ebfb81baaf2037a22b6930ee23b10c2d0b8de4cfd9b9dec65afad9b25aca08c076fc46fb5952b5b83e0a76af9894a0f8
data/CHANGELOG.md ADDED
@@ -0,0 +1,2 @@
1
+ # v0.1.0
2
+ * Initial commit
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,25 @@
1
+ # Contributing
2
+
3
+ ## Branches
4
+
5
+ ### `master` branch
6
+
7
+ The master branch is the current stable released version.
8
+
9
+ ### `develop` branch
10
+
11
+ The develop branch is the current edge of development.
12
+
13
+ ## Pull requests
14
+
15
+ * https://github.com/carnivore-rb/jackal-commander/pulls
16
+
17
+ Please base all pull requests of the `develop` branch. Merges to
18
+ `master` only occur through the `develop` branch. Pull requests
19
+ based on `master` will likely be cherry picked.
20
+
21
+ ## Issues
22
+
23
+ Need to report an issue? Use the github issues:
24
+
25
+ * https://github.com/carnivore-rb/jackal-commander/issues
data/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2014 Chris Roberts
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
data/README.md ADDED
@@ -0,0 +1,92 @@
1
+ # Jackal Commander
2
+
3
+ Execute actions via jackal
4
+
5
+ ## Usage
6
+
7
+ Set action to execute within payload:
8
+
9
+
10
+ ### Single action
11
+
12
+ ```json
13
+ {
14
+ ...
15
+ "data": {
16
+ "commander": {
17
+ "action": "toucher"
18
+ }
19
+ }
20
+ }
21
+ ```
22
+
23
+ ### Multiple actions
24
+
25
+
26
+ ```json
27
+ {
28
+ ...
29
+ "data": {
30
+ "commander": {
31
+ "actions": [
32
+ "toucher",
33
+ "remover"
34
+ ]
35
+ }
36
+ }
37
+ }
38
+ ```
39
+
40
+ ### Mixed actions
41
+
42
+ ```json
43
+ {
44
+ ...
45
+ "data": {
46
+ "commander": {
47
+ "action": "toucher",
48
+ "actions": [
49
+ "remover"
50
+ ]
51
+ }
52
+ }
53
+ }
54
+ ```
55
+
56
+ ### With extra arguments
57
+
58
+ ```json
59
+ {
60
+ ...
61
+ "data": {
62
+ "commander": {
63
+ "action": {
64
+ "name": "custom_touch",
65
+ "arguments": "/tmp/my-custom-file"
66
+ }
67
+ }
68
+ }
69
+ }
70
+ ```
71
+
72
+ ## Configuration
73
+
74
+ Define the action within the configuration:
75
+
76
+ ```json
77
+ {
78
+ ...
79
+ "config": {
80
+ "actions": {
81
+ "toucher": "touch /tmp/test-file",
82
+ "remover": "rm -f /tmp/test-file",
83
+ "custom_touch": "touch"
84
+ }
85
+ }
86
+ }
87
+ ```
88
+
89
+ ## Info
90
+
91
+ * Repository: https://github.com/carnviore-rb/jackal-cfn
92
+ * IRC: Freenode @ #carnivore
@@ -0,0 +1,16 @@
1
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__)) + '/lib/'
2
+ require 'jackal-commander/version'
3
+ Gem::Specification.new do |s|
4
+ s.name = 'jackal-commander'
5
+ s.version = Jackal::Commander::VERSION.version
6
+ s.summary = 'Message processing helper'
7
+ s.author = 'Chris Roberts'
8
+ s.email = 'code@chrisroberts.org'
9
+ s.homepage = 'https://github.com/carnivore-rb/jackal-commander'
10
+ s.description = 'Command helpers'
11
+ s.require_path = 'lib'
12
+ s.license = 'Apache 2.0'
13
+ s.add_dependency 'jackal'
14
+ s.add_dependency 'childprocess'
15
+ s.files = Dir['lib/**/*'] + %w(jackal-commander.gemspec README.md CHANGELOG.md CONTRIBUTING.md LICENSE)
16
+ end
@@ -0,0 +1,96 @@
1
+ require 'jackal-commander'
2
+
3
+ module Jackal
4
+ module Commander
5
+ # Run executions
6
+ class Executor < Jackal::Callback
7
+
8
+ # @return [String] root path for process output files
9
+ attr_reader :process_output_root
10
+
11
+ # default temp storage directory for process outputs
12
+ DEFAULT_PROCESS_OUTPUT_ROOT = '/tmp/jackal-executor'
13
+
14
+ # Setup the callback
15
+ def setup(*_)
16
+ require 'shellwords'
17
+ require 'tempfile'
18
+ require 'childprocess'
19
+ require 'fileutils'
20
+ @process_output_root = config.fetch(:process_output_root, DEFAULT_PROCESS_OUTPUT_ROOT)
21
+ FileUtils.mkdir_p(process_output_root)
22
+ end
23
+
24
+ # Determine validity of message
25
+ #
26
+ # @param message [Carnivore::Message]
27
+ # @return [Truthy, Falsey]
28
+ def valid?(message)
29
+ super do |payload|
30
+ payload.get(:data, :commander, :action) ||
31
+ payload.get(:data, :commander, :actions)
32
+ end
33
+ end
34
+
35
+ # Execute requested action
36
+ #
37
+ # @param message [Carnivore::Message]
38
+ def execute(message)
39
+ failure_wrap(message) do |payload|
40
+ actions = [
41
+ payload.get(:data, :commander, :action),
42
+ payload.get(:data, :commander, :actions)
43
+ ].flatten.compact.uniq
44
+ cmds = actions.map do |action|
45
+ if(action.is_a?(Hash))
46
+ extra_args = action[:arguments]
47
+ action = action[:name]
48
+ else
49
+ extra_args = ''
50
+ end
51
+ if(cmd = config.get(:actions, action))
52
+ debug "Action maps to command: #{cmd.inspect}"
53
+ [action, cmd, extra_args]
54
+ else
55
+ error "No command mapping configured for requested action: #{action}"
56
+ raise KeyError.new("Invalid command mapping. Key not found: `#{action}`")
57
+ end
58
+ end
59
+ results = cmds.map do |action, command, extra_args|
60
+ if(extra_args.is_a?(String))
61
+ command = "#{command} #{extra_args}"
62
+ end
63
+ cmd_input = Shellwords.shellsplit(command)
64
+ if(extra_args.is_a?(Array))
65
+ cmd_input += extra_args
66
+ end
67
+ process = ChildProcess.build(*cmd_input)
68
+ stdout = File.open(File.join(process_output_root, [payload[:id], 'stdout'].join('-')), 'w+')
69
+ stderr = File.open(File.join(process_output_root, [payload[:id], 'stderr'].join('-')), 'w+')
70
+ process.io.stdout = stdout
71
+ process.io.stderr = stderr
72
+ debug "Running requested action: #{action} (#{command})"
73
+ process.start
74
+ debug "Process started. Waiting for process completion (#{action})"
75
+ status = process.wait
76
+ stdout.rewind
77
+ stderr.rewind
78
+ if(status == 0)
79
+ info "Successfully executed action: #{action}"
80
+ info "STDOUT (#{action}): #{stdout.read.gsub("\n", '')}"
81
+ else
82
+ error "Failed to successfully execute action: #{action}"
83
+ error "Failed action exit code (#{action}): #{process.exit_code}"
84
+ error "STDOUT (#{action}): #{stdout.read.gsub("\n", '')}"
85
+ error "STDERR (#{action}): #{stderr.read.gsub("\n", '')}"
86
+ end
87
+ [action, {:exit_code => process.exit_code}]
88
+ end
89
+ payload.set(:data, :commander, :results, results)
90
+ job_completed(:commander, payload, message)
91
+ end
92
+ end
93
+
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,6 @@
1
+ module Jackal
2
+ module Commander
3
+ # Current library version
4
+ VERSION = Gem::Version.new('0.1.0')
5
+ end
6
+ end
@@ -0,0 +1,8 @@
1
+ require 'jackal'
2
+ require 'jackal-commander/version'
3
+
4
+ module Jackal
5
+ module Commander
6
+ autoload :Executor, 'jackal-commander/executor'
7
+ end
8
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jackal-commander
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Chris Roberts
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jackal
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: childprocess
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Command helpers
42
+ email: code@chrisroberts.org
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - CHANGELOG.md
48
+ - CONTRIBUTING.md
49
+ - LICENSE
50
+ - README.md
51
+ - jackal-commander.gemspec
52
+ - lib/jackal-commander.rb
53
+ - lib/jackal-commander/executor.rb
54
+ - lib/jackal-commander/version.rb
55
+ homepage: https://github.com/carnivore-rb/jackal-commander
56
+ licenses:
57
+ - Apache 2.0
58
+ metadata: {}
59
+ post_install_message:
60
+ rdoc_options: []
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ requirements: []
74
+ rubyforge_project:
75
+ rubygems_version: 2.2.2
76
+ signing_key:
77
+ specification_version: 4
78
+ summary: Message processing helper
79
+ test_files: []
80
+ has_rdoc: