bigwig 0.2 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,5 @@
1
+ v0.3. added bigwig-push command to place arbitrary messages on the queue
2
+
1
3
  v0.2. added bigwig-ping command to place ping messages on the queue
2
4
 
3
5
  v0.1. first public release
data/Manifest CHANGED
@@ -7,10 +7,12 @@ bigwig.yml
7
7
  bigwig.yml.example
8
8
  bin/bigwig
9
9
  bin/bigwig-ping
10
+ bin/bigwig-push
10
11
  lib/bigwig.rb
11
12
  lib/bigwig/internal_plugins/ping_plugin.rb
12
13
  lib/bigwig/job.rb
13
14
  lib/bigwig/pinger.rb
14
15
  lib/bigwig/plugin.rb
15
16
  lib/bigwig/plugins.rb
17
+ lib/bigwig/push.rb
16
18
  lib/bigwig/runner.rb
@@ -1,7 +1,7 @@
1
1
  Bigwig
2
2
  ======
3
3
 
4
- Bigwig is a daemon process that listens to a RabbitMQ queue and processes messages that it receives.
4
+ Bigwig is a daemon process that listens to a RabbitMQ queue and processes messages that it receives, along with some simple command-line tools to place messages on the queue.
5
5
 
6
6
  Typical Usage
7
7
  -------------
@@ -10,7 +10,9 @@ Typical Usage
10
10
  * Start an AMQP server
11
11
  * Create a folder of plugins
12
12
  * Create a bigwig configuration file
13
- * Start bigwig - `bigwig start -c config -l logs`
13
+ * Start bigwig - `bigwig start -c config-file -l log-folder`
14
+ * Ping bigwig - `bigwig-ping -c config-file`
15
+ * Push a message with data onto the queue - `bigwig-push -m my_message -d '{:key => "value"}' -c config-file`
14
16
 
15
17
  Configuration
16
18
  -------------
@@ -30,7 +32,7 @@ A typical configuration file looks like this:
30
32
  warren_logging: false
31
33
  plugins_folder: /full/path/to/a/folder
32
34
 
33
- The first six items tell bigwig how to connect to the AMQP server. The next item specifies whether you want warren (the lower-level AMQP processor) to log its output. Lastly, you tell bigwig where to find its plugins.
35
+ The first six items tell bigwig how to connect to the AMQP server. The next item specifies whether you want warren (the lower-level AMQP processor) to log its output (normally you will want this to be false, as warren can be quite noisy). Lastly, you tell bigwig where to find its plugins.
34
36
 
35
37
  Logging
36
38
  -------
@@ -79,11 +81,30 @@ For example, a plugin, which we shall call LoggingPlugin, would look like this:
79
81
 
80
82
  When bigwig receives a message where the `:method` parameter == 'logging' it will then invoke `LoggingPlugin#call`, passing it the `:id` and `:data` from the original message as task_id and args respectively.
81
83
 
84
+ If your plugin needs to know where it is on the filesystem (for example, so that it can shell out to run a script) it can access `BigWig::Plugins.root` which returns the folder reference you specified within the configuration file.
85
+
82
86
  Pings
83
87
  -----
84
88
 
85
89
  There is a plugin built-in to bigwig called PingPlugin, that registers itself under the name "ping". If you place a message onto the queue with :method => 'ping', the PingPlugin responds by writing a message to the log file. This is useful for monitoring bigwig - another system places ping messages onto the queue at regular intervals and we watch to ensure that the log file's update time is changing.
86
90
 
91
+ Command-line Interface
92
+ ----------------------
93
+
94
+ There are two command-line scripts that push messages on to the queue.
95
+
96
+ The simplest is `bigwig-ping`.
97
+
98
+ This pushes a ping message onto the queue - ideal for calling from a cron job. This takes two parameters: `-t` (or `--timeout`) which is the connection timeout in seconds (defaulting to 5 if not supplied) and `-c` (or `--config`) which is the path to a Bigwig configuration file (defaulting to bigwig.yml in the current directory if not supplied).
99
+
100
+ bigwig-ping -c /path/to/config -t 10
101
+
102
+ There is also `bigwig-push`.
103
+
104
+ This pushes an arbitrary message onto the queue - ideal for testing, or just manually poking Bigwig to make something happen. It takes the same `--config` and `--timeout` parameters as bigwig-ping, plus a few more for specifying the message itself. These are `-m` (or `--method`) which is the method name (for selecting which plugin responds), `-i` (or `--id`) which is the optional task id (useful when linking to an external system) and `-d` (or `--data`) for a hash of values that becomes the `:data` parameter.
105
+
106
+ bigwig-push -m my_message -d '{:key => "value", :key2 => "something else"}' -i 123 -c /path/to/config -t 10
107
+
87
108
  License
88
109
  -------
89
110
 
data/Rakefile CHANGED
@@ -3,6 +3,6 @@ Echoe.new 'bigwig' do | gem |
3
3
  gem.author = 'David Smalley, Caius Durling, Rahoul Baruah'
4
4
  gem.summary = 'A daemon that listens to an AMQP queue and responds to messages by invoking commands from a set of plugins'
5
5
  gem.url = 'http://www.brightbox.co.uk/'
6
- gem.runtime_dependencies = ["brightbox-warren >=0.9.0", "daemons >=1.0.10"]
6
+ gem.runtime_dependencies = ["warren >=0.9.0", "daemons >=1.0.10"]
7
7
  gem.install_message = 'Welcome to bigwig. Please set up a configuration file and a plugins folder before starting bigwig...'
8
8
  end
@@ -2,16 +2,16 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{bigwig}
5
- s.version = "0.2"
5
+ s.version = "0.3"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["David Smalley, Caius Durling, Rahoul Baruah"]
9
- s.date = %q{2009-10-06}
9
+ s.date = %q{2009-11-05}
10
10
  s.description = %q{A daemon that listens to an AMQP queue and responds to messages by invoking commands from a set of plugins}
11
11
  s.email = %q{}
12
- s.executables = ["bigwig", "bigwig-ping"]
13
- s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README.markdown", "bin/bigwig", "bin/bigwig-ping", "lib/bigwig.rb", "lib/bigwig/internal_plugins/ping_plugin.rb", "lib/bigwig/job.rb", "lib/bigwig/pinger.rb", "lib/bigwig/plugin.rb", "lib/bigwig/plugins.rb", "lib/bigwig/runner.rb"]
14
- s.files = ["CHANGELOG", "LICENSE", "Manifest", "README.markdown", "Rakefile", "bigwig.yml", "bigwig.yml.example", "bin/bigwig", "bin/bigwig-ping", "lib/bigwig.rb", "lib/bigwig/internal_plugins/ping_plugin.rb", "lib/bigwig/job.rb", "lib/bigwig/pinger.rb", "lib/bigwig/plugin.rb", "lib/bigwig/plugins.rb", "lib/bigwig/runner.rb", "bigwig.gemspec"]
12
+ s.executables = ["bigwig", "bigwig-ping", "bigwig-push"]
13
+ s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README.markdown", "bin/bigwig", "bin/bigwig-ping", "bin/bigwig-push", "lib/bigwig.rb", "lib/bigwig/internal_plugins/ping_plugin.rb", "lib/bigwig/job.rb", "lib/bigwig/pinger.rb", "lib/bigwig/plugin.rb", "lib/bigwig/plugins.rb", "lib/bigwig/push.rb", "lib/bigwig/runner.rb"]
14
+ s.files = ["CHANGELOG", "LICENSE", "Manifest", "README.markdown", "Rakefile", "bigwig.yml", "bigwig.yml.example", "bin/bigwig", "bin/bigwig-ping", "bin/bigwig-push", "lib/bigwig.rb", "lib/bigwig/internal_plugins/ping_plugin.rb", "lib/bigwig/job.rb", "lib/bigwig/pinger.rb", "lib/bigwig/plugin.rb", "lib/bigwig/plugins.rb", "lib/bigwig/push.rb", "lib/bigwig/runner.rb", "bigwig.gemspec"]
15
15
  s.homepage = %q{http://www.brightbox.co.uk/}
16
16
  s.post_install_message = %q{Welcome to bigwig. Please set up a configuration file and a plugins folder before starting bigwig...}
17
17
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Bigwig", "--main", "README.markdown"]
@@ -25,14 +25,14 @@ Gem::Specification.new do |s|
25
25
  s.specification_version = 3
26
26
 
27
27
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
28
- s.add_runtime_dependency(%q<brightbox-warren>, [">= 0.9.0"])
28
+ s.add_runtime_dependency(%q<warren>, [">= 0.9.0"])
29
29
  s.add_runtime_dependency(%q<daemons>, [">= 1.0.10"])
30
30
  else
31
- s.add_dependency(%q<brightbox-warren>, [">= 0.9.0"])
31
+ s.add_dependency(%q<warren>, [">= 0.9.0"])
32
32
  s.add_dependency(%q<daemons>, [">= 1.0.10"])
33
33
  end
34
34
  else
35
- s.add_dependency(%q<brightbox-warren>, [">= 0.9.0"])
35
+ s.add_dependency(%q<warren>, [">= 0.9.0"])
36
36
  s.add_dependency(%q<daemons>, [">= 1.0.10"])
37
37
  end
38
38
  end
data/bigwig.yml CHANGED
@@ -5,4 +5,4 @@ server: localhost
5
5
  port: 5672
6
6
  queue: myqueue
7
7
  warren_logging: false
8
- plugins_folder: /Volumes/bb/bigwig-plugins
8
+ plugins_folder: /Volumes/bb/builder/plugins
@@ -1,3 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  require File.join(File.dirname(__FILE__), "..", "lib", "bigwig")
3
- BigWig::Pinger.new(ARGV).run
3
+
4
+ options = BigWig::Push.load_options_from ARGV
5
+
6
+ BigWig::Push.new(options).message 'ping'
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+ require File.join(File.dirname(__FILE__), "..", "lib", "bigwig")
3
+ require 'optparse'
4
+
5
+ options = BigWig::Push.load_options_from ARGV do | parser, options |
6
+
7
+ parser.on '-m', '--method METHOD', 'Specify the method name' do | value |
8
+ options[:method] = value
9
+ end
10
+
11
+ parser.on '-i', '--id TASK_ID', 'Specify the task id' do | value |
12
+ options[:id] = value
13
+ end
14
+
15
+ parser.on '-d', '--data HASH', 'Specify the message data as a Hash "{:key => \'value\', :key2 => \'other_value\'}"' do | value |
16
+ options[:data] = eval(value)
17
+ end
18
+
19
+ parser.on '-q', '--queue QUEUE_NAME', 'Specify which queue to put the message onto' do | value |
20
+ options[:queue] = value
21
+ end
22
+ end
23
+
24
+ BigWig::Push.new(options).message options[:method], options[:data] || {}, options[:id], options[:queue] || :default
@@ -1,60 +1,11 @@
1
- require 'warren'
2
- require 'warren/adapters/bunny_adapter'
3
- require 'daemons'
4
- require 'optparse'
5
- require 'ostruct'
6
- require 'benchmark'
7
- require 'timeout'
8
-
9
1
  module BigWig
10
2
  class Pinger
11
- attr_reader :config
12
- attr_reader :options
13
-
14
- def initialize(command_line)
15
- load_options_from command_line
3
+ def initialize command_line
4
+ @push = Push.new command_line
16
5
  end
17
6
 
18
7
  def run
19
- BigWig::logger.info("Starting bigwig pinger...")
20
- @config = YAML.load(File.open(@options.config))
21
- BigWig::connect_using @config
22
-
23
- begin
24
- Timeout::timeout(@options.timeout) do
25
- begin
26
- Warren::Queue.publish :default, :method => 'ping'
27
- rescue Exception => ex
28
- BigWig::logger.error("...ping failed with #{ex}")
29
- exit 2
30
- end
31
- end
32
- rescue Timeout::Error => te
33
- BigWig::logger.error("...ping timed out: #{te}")
34
- exit 1
35
- end
36
-
37
- BigWig::logger.info("...bigwig pinger finished")
38
- exit 0
39
- end
40
-
41
- protected
42
- def load_options_from command_line
43
- @options = OpenStruct.new(:config => File.expand_path('./bigwig.yml'), :timeout => 5)
44
- opts = OptionParser.new do |opts|
45
- opts.banner = "Usage: #{File.basename($0)} [options]"
46
- opts.on('-h', '--help', 'Show this message') do
47
- puts opts
48
- exit 1
49
- end
50
- opts.on('-c', '--config=file', 'Path to the config file; if not supplied then bigwig looks for bigwig.yml in the current folder') do |conf|
51
- @options.config = conf
52
- end
53
- opts.on('-t', '--timeout=value', 'Timeout value in seconds') do | conf |
54
- @options.timeout = conf.to_i
55
- end
56
- end
57
- @args = opts.parse!(command_line)
8
+ @push.message 'ping'
58
9
  end
59
10
  end
60
11
  end
@@ -0,0 +1,97 @@
1
+ require 'warren'
2
+ require 'warren/adapters/bunny_adapter'
3
+ require 'daemons'
4
+ require 'optparse'
5
+ require 'benchmark'
6
+ require 'timeout'
7
+
8
+ module BigWig
9
+ # pushes a message onto the queue
10
+ # USAGE:
11
+ # push = BigWig::Push.new :config => '/path/to/config/file', :timeout => 5
12
+ # By default, it uses bigwig.yml in the current directory and a timeout of 5 seconds
13
+ # The configuration file is expected to have the same structure as the BigWig daemon's file (without the plugins folder)
14
+ class Push
15
+ attr_reader :config
16
+ attr_reader :options
17
+
18
+ # Create a new BigWig::Push
19
+ # Options:
20
+ # :config => '/path/to/config/file'
21
+ # :timeout => 5
22
+ #
23
+ def initialize(overrides = {})
24
+ @options = {
25
+ :config => File.expand_path('./bigwig.yml'),
26
+ :timeout => 5
27
+ }.merge(overrides)
28
+ end
29
+
30
+ # Push a message on to the queue, passing in a message name, plus an optional data hash, an optional task id and an optional queue name
31
+ #
32
+ def message method, data = {}, task_id = nil, queue = :default
33
+ BigWig::logger.info("Pushing #{method} on to #{queue}")
34
+ @config = YAML.load(File.open(@options[:config]))
35
+ BigWig::connect_using @config
36
+
37
+ begin
38
+ Timeout::timeout(@options[:timeout]) do
39
+ begin
40
+ Warren::Queue.publish queue, :method => method, :id => task_id, :data => data
41
+ rescue Exception => ex
42
+ BigWig::logger.error("...push failed with #{ex}")
43
+ exit 1
44
+ end
45
+ end
46
+ rescue Timeout::Error => te
47
+ BigWig::logger.error("...push timed out: #{te}")
48
+ exit 1
49
+ end
50
+
51
+ BigWig::logger.info("...bigwig push finished")
52
+ exit 0
53
+ end
54
+
55
+ # Helper method so that calling scripts don't need to parse the Push parameters themselves
56
+ #
57
+ # USAGE:
58
+ # options = BigWig::Push.load_options_from ARGV
59
+ # BigWig::Push.new(options).message 'whatever'
60
+ #
61
+ # If this is being called from a wrapper script (such as bin/bigwig-push) that needs its own parameters you can pass a block to append your own details
62
+ #
63
+ # options = BigWig::Push.load_options_from(ARGV) do | parser, options |
64
+ # parser.on('--xxx', 'Push it good') do
65
+ # options[:push_it_good] = :push_it_real_good
66
+ # end
67
+ # end
68
+ #
69
+ def self.load_options_from command_line
70
+ options = {}
71
+
72
+ parser = OptionParser.new do | parser |
73
+ parser.banner = "Usage: #{File.basename($0)} [options]"
74
+
75
+ parser.on('-h', '--help', 'Show this message') do
76
+ puts parser
77
+ exit 2
78
+ end
79
+
80
+ parser.on('-c', '--config=file', 'Path to the config file; if not supplied then bigwig looks for bigwig.yml in the current folder') do |conf|
81
+ options[:config] = conf
82
+ end
83
+
84
+ parser.on('-t', '--timeout=value', 'Timeout value in seconds') do | conf |
85
+ options[:timeout] = conf.to_i
86
+ end
87
+
88
+ yield(parser, options) if block_given?
89
+
90
+ end
91
+ parser.parse!(command_line)
92
+
93
+ return options
94
+ end
95
+
96
+ end
97
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bigwig
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.2"
4
+ version: "0.3"
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Smalley, Caius Durling, Rahoul Baruah
@@ -9,11 +9,11 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-06 00:00:00 +01:00
12
+ date: 2009-11-05 00:00:00 +00:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: brightbox-warren
16
+ name: warren
17
17
  type: :runtime
18
18
  version_requirement:
19
19
  version_requirements: !ruby/object:Gem::Requirement
@@ -37,6 +37,7 @@ email: ""
37
37
  executables:
38
38
  - bigwig
39
39
  - bigwig-ping
40
+ - bigwig-push
40
41
  extensions: []
41
42
 
42
43
  extra_rdoc_files:
@@ -45,12 +46,14 @@ extra_rdoc_files:
45
46
  - README.markdown
46
47
  - bin/bigwig
47
48
  - bin/bigwig-ping
49
+ - bin/bigwig-push
48
50
  - lib/bigwig.rb
49
51
  - lib/bigwig/internal_plugins/ping_plugin.rb
50
52
  - lib/bigwig/job.rb
51
53
  - lib/bigwig/pinger.rb
52
54
  - lib/bigwig/plugin.rb
53
55
  - lib/bigwig/plugins.rb
56
+ - lib/bigwig/push.rb
54
57
  - lib/bigwig/runner.rb
55
58
  files:
56
59
  - CHANGELOG
@@ -62,12 +65,14 @@ files:
62
65
  - bigwig.yml.example
63
66
  - bin/bigwig
64
67
  - bin/bigwig-ping
68
+ - bin/bigwig-push
65
69
  - lib/bigwig.rb
66
70
  - lib/bigwig/internal_plugins/ping_plugin.rb
67
71
  - lib/bigwig/job.rb
68
72
  - lib/bigwig/pinger.rb
69
73
  - lib/bigwig/plugin.rb
70
74
  - lib/bigwig/plugins.rb
75
+ - lib/bigwig/push.rb
71
76
  - lib/bigwig/runner.rb
72
77
  - bigwig.gemspec
73
78
  has_rdoc: true