smith 0.5.7 → 0.5.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,6 +10,8 @@ module Smith
10
10
 
11
11
  include Logger
12
12
 
13
+ AGENCY_TIMEOUT = 60
14
+
13
15
  def initialize
14
16
  log_level(:info)
15
17
  end
@@ -59,7 +61,7 @@ module Smith
59
61
  def agency_command(command, args, &blk)
60
62
  Messaging::Sender.new('agency.control', :auto_delete => true, :durable => false, :persistent => true, :strict => true).ready do |sender|
61
63
 
62
- sender.timeout(8) { puts "Timeout. Is the agency still running"; Smith.stop(true) }
64
+ sender.timeout(AGENCY_TIMEOUT) { puts "Timeout. Is the agency still running"; Smith.stop(true) }
63
65
 
64
66
  payload = ACL::Payload.new(:agency_command).content(:command => command, :args => args)
65
67
 
@@ -226,6 +226,7 @@ require_relative 'smith/agent_cache'
226
226
  require_relative 'smith/agent_process'
227
227
  require_relative 'smith/agent_monitoring'
228
228
  require_relative 'smith/command'
229
+ require_relative 'smith/command_base'
229
230
  require_relative 'smith/messaging/amqp_options'
230
231
  require_relative 'smith/messaging/queue_factory'
231
232
  require_relative 'smith/messaging/payload'
@@ -2,6 +2,13 @@
2
2
  require 'pp'
3
3
  require 'protobuf/compiler/compiler'
4
4
 
5
+ # There doesn't seem to be a way to turn of printing. The code is generally run
6
+ # like this: log_writing unless silent but there is no way of setting silent!
7
+ # So monkey patch it.
8
+ class Protobuf::Visitor::Base
9
+ def log_writing(filename, message="writing..."); end
10
+ end
11
+
5
12
  module Smith
6
13
  class ACLCompiler
7
14
 
@@ -15,14 +22,16 @@ module Smith
15
22
  # Compile any protocol buffer files. This checks the timestamp
16
23
  # to see if the file needs compiling.
17
24
  def compile
18
- logger.debug { "Protocol buffer cache path: #{@cache_path}" }
19
- Smith.acl_path.each do |path|
20
- results = {}
21
- path_glob(path) do |p|
22
- if should_compile?(p)
23
- logger.info { "Compiling: #{p}" }
24
- # TODO put some error handling here.
25
- Protobuf::Compiler.compile(p.basename, p.dirname, @cache_path)
25
+ fork do
26
+ logger.debug { "Protocol buffer cache path: #{@cache_path}" }
27
+ Smith.acl_path.each do |path|
28
+ results = {}
29
+ path_glob(path) do |p|
30
+ if should_compile?(p)
31
+ logger.info { "Compiling: #{p}" }
32
+ # TODO put some error handling here.
33
+ Protobuf::Compiler.compile(p.basename, p.dirname, @cache_path)
34
+ end
26
35
  end
27
36
  end
28
37
  end
@@ -99,7 +99,7 @@ module Smith
99
99
  agent_process.pid = fork do
100
100
 
101
101
  # Detach from the controlling terminal
102
- unless sess_id = Process.setsid
102
+ unless Process.setsid
103
103
  raise 'Cannot detach from controlling terminal'
104
104
  end
105
105
 
@@ -24,9 +24,10 @@ module Smith
24
24
  clazz = Commands.const_get(Extlib::Inflection.camelize(command)).new
25
25
 
26
26
  begin
27
- options, target = parse_options(clazz, args)
28
27
 
29
- vars.merge(:options => options, :target => target).each do |k,v|
28
+ clazz.parse_options(args)
29
+
30
+ vars.each do |k,v|
30
31
  clazz.instance_eval <<-EOM, __FILE__, __LINE__ + 1
31
32
  instance_variable_set(:"@#{k}", v)
32
33
  def #{k}=(z); @#{k} = z; end
@@ -37,34 +38,20 @@ module Smith
37
38
  clazz.execute
38
39
 
39
40
  rescue Trollop::CommandlineError => e
40
- vars[:responder].value(parser_help(clazz, :prefix => "Error: #{e.message}.\n"))
41
+ vars[:responder].value(clazz.format_help(:prefix => "Error: #{e.message}.\n"))
41
42
  rescue Trollop::HelpNeeded
42
- vars[:responder].value(parser_help(clazz))
43
+ vars[:responder].value(clazz.format_help)
43
44
  end
44
45
  end
45
46
 
46
- # Banner callback. This is called when the parser is called.
47
- # I'm sure there is a better way of doing this.
48
- def self.banner(command)
49
- "smithctl #{command} OPTIONS [Agents]"
50
- end
51
-
52
- private
53
-
54
47
  # Determine whether the command is an agency or smithctl command and load
55
48
  # accordingly.
56
- def self.load_command(cmd)
57
- require command_path(cmd)
58
- end
59
-
60
- # Check to see if the command is an agency or smithctl command.
61
- def self.agency?
62
- Smith.constants.include?(:Agency)
49
+ def self.load_command(command)
50
+ require command_path(command)
63
51
  end
64
52
 
65
- # Return the full path of the ruby class.
66
- def self.command_path(command)
67
- send("#{command_type(command)}_path").join(command)
53
+ def self.instantiate(command)
54
+ Commands.const_get(Extlib::Inflection.camelize(command)).new
68
55
  end
69
56
 
70
57
  # What type of command is it?
@@ -79,6 +66,18 @@ module Smith
79
66
  end
80
67
  end
81
68
 
69
+ private
70
+
71
+ # Check to see if the command is an agency or smithctl command.
72
+ def self.agency?
73
+ Smith.constants.include?(:Agency)
74
+ end
75
+
76
+ # Return the full path of the ruby class.
77
+ def self.command_path(command)
78
+ send("#{command_type(command)}_path").join(command)
79
+ end
80
+
82
81
  # Is the command an agency command?
83
82
  def self.agency_command?(cmd)
84
83
  agency_path.join(cmd).sub_ext('.rb').exist?
@@ -103,26 +102,5 @@ module Smith
103
102
  def self.base_path
104
103
  @c64a6f4f ||= Smith.root_path.join('lib').join("smith").join('commands')
105
104
  end
106
-
107
- # Uses the options_parser method in the specific command class to procees
108
- # any options associated with that command. If no options_parser method
109
- # exits then an empty Array is returned. Any members of the args array
110
- # that are not parsed by the options parser are return as the target, i.e.
111
- # the agent(s) that the command is to operate on.
112
- def self.parse_options(clazz, args)
113
- if clazz.respond_to?(:options_parser)
114
- [clazz.options_parser.parse(args), args]
115
- else
116
- [{}, args]
117
- end
118
- end
119
-
120
- def self.parser_help(clazz, opts={})
121
- StringIO.new.tap do |help|
122
- help.puts opts[:prefix] if opts[:prefix]
123
- clazz.options_parser.educate(help)
124
- help.rewind
125
- end.read
126
- end
127
105
  end
128
106
  end
@@ -0,0 +1,64 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'trollop'
4
+
5
+ module Smith
6
+ class CommandBase
7
+ class UnkownCommandError < RuntimeError; end
8
+
9
+ attr_reader :options, :target
10
+
11
+ include Logger
12
+
13
+ def initialize
14
+ @parser = Trollop::Parser.new
15
+ options_spec
16
+ end
17
+
18
+ def parse_options(args)
19
+ @options = @parser.parse(args)
20
+ @target = args
21
+ end
22
+
23
+ def format_help(opts={})
24
+ StringIO.new.tap do |help|
25
+ help.puts opts[:prefix] if opts[:prefix]
26
+ @parser.educate(help)
27
+ help.rewind
28
+ end.read
29
+ end
30
+
31
+ def banner(banner=nil, opts={})
32
+ if banner.nil?
33
+ @banner
34
+ else
35
+ @banner = banner
36
+ @parser.banner((opts[:no_template]) ? banner : banner_template(banner))
37
+ end
38
+ end
39
+
40
+ protected
41
+
42
+ def opt(*opt_spec)
43
+ @parser.opt(*opt_spec)
44
+ end
45
+
46
+ def options_spec
47
+ banner "You should really set a proper banner notice for this command."
48
+ end
49
+
50
+ private
51
+
52
+ def banner_template(text)
53
+ return <<-EOS
54
+
55
+ #{text}
56
+
57
+ Usage:
58
+ smithctl #{self.class.to_s.split('::').last.downcase} OPTIONS
59
+
60
+ OPTIONS are:
61
+ EOS
62
+ end
63
+ end
64
+ end
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  module Smith
3
3
  module Commands
4
- class Version < Command
4
+ class AgencyVersion < CommandBase
5
5
  def execute
6
6
  version_file = Smith.root_path.join('VERSION')
7
7
 
@@ -12,11 +12,12 @@ module Smith
12
12
  end
13
13
  end
14
14
 
15
- def options_parser
16
- Trollop::Parser.new do
17
- banner Command.banner('version')
18
- opt :git, "run git describe, assuming git is installed", :short => :g
19
- end
15
+ private
16
+
17
+ def options_spec
18
+ banner "Display the agency version."
19
+
20
+ opt :git, "run git describe, assuming git is installed", :short => :g
20
21
  end
21
22
  end
22
23
  end
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  module Smith
3
3
  module Commands
4
- class Agents < Command
4
+ class Agents < CommandBase
5
5
  def execute
6
6
  responder.value do
7
7
  # FIXME make sure that if the path doesn't exist don't blow up.
@@ -23,6 +23,12 @@ module Smith
23
23
  (agent_paths.empty?) ? "" : agent_paths.sort.join(" ")
24
24
  end
25
25
  end
26
+
27
+ private
28
+
29
+ def options_spec
30
+ banner "List all available agents."
31
+ end
26
32
  end
27
33
  end
28
34
  end
@@ -1,13 +1,19 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  module Smith
3
3
  module Commands
4
- class Kill < Command
4
+ class Kill < CommandBase
5
5
  def execute
6
6
  target.each do |agent_name|
7
7
  agents[agent_name].kill
8
8
  end
9
9
  responder.value
10
10
  end
11
+
12
+ private
13
+
14
+ def options_spec
15
+ banner "Kill an agent/agents."
16
+ end
11
17
  end
12
18
  end
13
19
  end
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  module Smith
3
3
  module Commands
4
- class List < Command
4
+ class List < CommandBase
5
5
  def execute
6
6
  responder.value do
7
7
  if options[:all]
@@ -29,14 +29,6 @@ module Smith
29
29
  end
30
30
  end
31
31
 
32
- def options_parser
33
- Trollop::Parser.new do
34
- banner Command.banner('list')
35
- opt :long, "the number of times to send the message", :short => :l
36
- opt :all, "show all agents in all states", :short => :a
37
- end
38
- end
39
-
40
32
  private
41
33
 
42
34
  def long_format(agents)
@@ -60,6 +52,13 @@ module Smith
60
52
  acc << sprintf("#{col_widths.inject("") { |spec,w| spec << "%-#{w + 2}s"}}\n", *e)
61
53
  end
62
54
  end
55
+
56
+ def options_spec
57
+ banner "List the running agents."
58
+
59
+ opt :long, "the number of times to send the message", :short => :l
60
+ opt :all, "show all agents in all states", :short => :a
61
+ end
63
62
  end
64
63
  end
65
64
  end
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  module Smith
3
3
  module Commands
4
- class Logger < Command
4
+ class Logger < CommandBase
5
5
  def execute
6
6
  responder.value do
7
7
  if options[:level].nil?
@@ -36,14 +36,6 @@ module Smith
36
36
  end
37
37
  end
38
38
 
39
- def options_parser
40
- Trollop::Parser.new do
41
- banner Command.banner('logger')
42
- opt :level, "the log level you want to set", :type => :string, :short => :l
43
- opt :trace, "turn trace on or off", :type => :boolean, :short => :t
44
- end
45
- end
46
-
47
39
  private
48
40
 
49
41
  def send_agent_control_message(agent, message)
@@ -51,6 +43,13 @@ module Smith
51
43
  sender.publish(ACL::Payload.new(:agent_command).content(message))
52
44
  end
53
45
  end
46
+
47
+ def options_spec
48
+ banner "Change the log and trace level of the agents or the agency."
49
+
50
+ opt :level, "the log level you want to set", :type => :string, :short => :l
51
+ opt :trace, "turn trace on or off", :type => :boolean, :short => :t
52
+ end
54
53
  end
55
54
  end
56
55
  end
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  module Smith
3
3
  module Commands
4
- class Metadata < Command
4
+ class Metadata < CommandBase
5
5
  def execute
6
6
  responder.value do
7
7
  target.inject([]) do |acc,agent_name|
@@ -9,6 +9,12 @@ module Smith
9
9
  end.join("\n")
10
10
  end
11
11
  end
12
+
13
+ private
14
+
15
+ def options_spec
16
+ banner "Display an agent/agents metadata."
17
+ end
12
18
  end
13
19
  end
14
20
  end
@@ -1,13 +1,13 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
- require_relative 'common'
3
+ require_relative '../common'
4
4
 
5
5
  # This is a meta-command. It doesn't implement anything it simply sends
6
6
  # messages to one or many existing commands to do the work.
7
7
 
8
8
  module Smith
9
9
  module Commands
10
- class Restart < Command
10
+ class Restart < CommandBase
11
11
 
12
12
  include Common
13
13
 
@@ -26,13 +26,12 @@ module Smith
26
26
  end
27
27
  end
28
28
 
29
+ private
29
30
 
30
- def options_parser
31
- command = self.class.to_s.split(/::/).last.downcase
32
- Trollop::Parser.new do
33
- banner Command.banner(command)
34
- opt :group, "Start everything in the specified group", :type => :string, :short => :g
35
- end
31
+ def options_spec
32
+ banner "Restart an agent/agents."
33
+
34
+ opt :group, "Start everything in the specified group", :type => :string, :short => :g
36
35
  end
37
36
  end
38
37
  end
@@ -1,10 +1,10 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
- require_relative 'common'
3
+ require_relative '../common'
4
4
 
5
5
  module Smith
6
6
  module Commands
7
- class Start < Command
7
+ class Start < CommandBase
8
8
 
9
9
  include Common
10
10
 
@@ -49,13 +49,13 @@ module Smith
49
49
  end
50
50
  end
51
51
 
52
- def options_parser
53
- command = self.class.to_s.split(/::/).last.downcase
54
- Trollop::Parser.new do
55
- banner Command.banner(command)
56
- opt :kill, "Reset the state of the agent before starting", :short => :k
57
- opt :group, "Start everything in the specified group", :type => :string, :short => :g
58
- end
52
+ private
53
+
54
+ def options_spec
55
+ banner "Start an agent/agents or group of agents."
56
+
57
+ opt :kill, "Reset the state of the agent before starting", :short => :k
58
+ opt :group, "Start everything in the specified group", :type => :string, :short => :g
59
59
  end
60
60
  end
61
61
  end
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  module Smith
3
3
  module Commands
4
- class State < Command
4
+ class State < CommandBase
5
5
  def execute
6
6
  responder.value do
7
7
  target.inject([]) do |acc,agent_name|
@@ -9,6 +9,12 @@ module Smith
9
9
  end.join("\n")
10
10
  end
11
11
  end
12
+
13
+ private
14
+
15
+ def options_spec
16
+ banner "Show the state of an agent/agents - deprecated."
17
+ end
12
18
  end
13
19
  end
14
20
  end
@@ -1,10 +1,10 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
- require_relative 'common'
3
+ require_relative '../common'
4
4
 
5
5
  module Smith
6
6
  module Commands
7
- class Stop < Command
7
+ class Stop < CommandBase
8
8
 
9
9
  include Common
10
10
 
@@ -58,12 +58,12 @@ module Smith
58
58
  end
59
59
  end
60
60
 
61
- def options_parser
62
- command = self.class.to_s.split(/::/).last.downcase
63
- Trollop::Parser.new do
64
- banner Command.banner(command)
65
- opt :group, "Stop everything in the specified group", :type => :string, :short => :g
66
- end
61
+ private
62
+
63
+ def options_spec
64
+ banner "Stop an agent/agents."
65
+
66
+ opt :group, "Stop everything in the specified group", :type => :string, :short => :g
67
67
  end
68
68
  end
69
69
  end
@@ -0,0 +1,61 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'extlib/string'
4
+
5
+ module Smith
6
+ module Commands
7
+ class Acls < CommandBase
8
+ def execute
9
+ responder.value do
10
+ if options[:show]
11
+ if target.empty?
12
+ "You must supply an ACL file name."
13
+ else
14
+ target.map do |acl|
15
+ acls = Smith.acl_path.inject([]) do |a,path|
16
+ a.tap do |acc|
17
+ acl_file = path.join("#{acl.snake_case}.proto")
18
+ if acl_file.exist?
19
+ acc << acl_file
20
+ end
21
+ end
22
+ end
23
+
24
+ case acls.length
25
+ when 0
26
+ "ACL file does not exist."
27
+ when 1
28
+ if target.length == 1
29
+ "\n#{indent_acl(acls.first.read)}\n"
30
+ else
31
+ "\n#{acl} ->\n#{indent_acl(acls.first.read)}"
32
+ end
33
+ else
34
+ "There are multiple ACLs with the name: #{target}"
35
+ end
36
+ end.join("\n")
37
+ end
38
+ else
39
+ join_string = (options[:long]) ? "\n" : " "
40
+ Pathname.glob(Smith.acl_path.map {|p| "#{p}#{File::SEPARATOR}*"}).map do |p|
41
+ p.basename(".proto")
42
+ end.sort.join(join_string)
43
+ end
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def indent_acl(acl)
50
+ acl.split("\n").map { |l| l.sub(/^/, " ") }.join("\n")
51
+ end
52
+
53
+ def options_spec
54
+ banner "List and display acl files."
55
+
56
+ opt :long, "format the listing", :short => :l
57
+ opt :show, "show the contents of the acl file", :short => :s
58
+ end
59
+ end
60
+ end
61
+ end
@@ -4,7 +4,7 @@ require 'multi_json'
4
4
 
5
5
  module Smith
6
6
  module Commands
7
- class Cat < Command
7
+ class Cat < CommandBase
8
8
  def execute
9
9
  if target.size == 0
10
10
  responder.value("No queue specified. Please specify a queue.")
@@ -45,26 +45,25 @@ module Smith
45
45
  end
46
46
  end
47
47
 
48
- def options_parser
49
- Trollop::Parser.new do
50
- banner Command.banner('cat')
51
- opt :type, "message type", :type => :string, :default => 'default', :short => :t
52
- opt :json, "supply the json representation with this flag", :type => :string, :conflicts => :file, :short => :j
53
- opt :file, "read the data from the named file", :type => :string, :conflicts => :json, :short => :f
54
- opt :number, "the number of times to send the message", :type => :integer, :default => 1, :short => :n
55
- opt :dynamic, "send message to a dynamic queue", :type => :boolean, :default => false, :short => :d
56
- end
57
- end
58
-
59
48
  private
60
49
 
61
50
  def json_to_payload(data, type)
62
51
  Smith::ACL::Payload.new(type.to_sym).content do |m|
63
- MultiJson.decode(data, :symbolize_keys => true).each do |k,v|
52
+ MultiJson.load(data, :symbolize_keys => true).each do |k,v|
64
53
  m.send("#{k}=".to_sym, v)
65
54
  end
66
55
  end
67
56
  end
57
+
58
+ def options_spec
59
+ banner "Send a message to a queue. The ACL can also be specified."
60
+
61
+ opt :type, "message type", :type => :string, :default => 'default', :short => :t
62
+ opt :json, "supply the json representation with this flag", :type => :string, :conflicts => :file, :short => :j
63
+ opt :file, "read the data from the named file", :type => :string, :conflicts => :json, :short => :f
64
+ opt :number, "the number of times to send the message", :type => :integer, :default => 1, :short => :n
65
+ opt :dynamic, "send message to a dynamic queue", :type => :boolean, :default => false, :short => :d
66
+ end
68
67
  end
69
68
  end
70
69
  end
@@ -0,0 +1,67 @@
1
+ # -*- encoding: utf-8 -*-
2
+ module Smith
3
+ module Commands
4
+ class Commands < CommandBase
5
+ def execute
6
+ commands = (target.empty?) ? list_commands('agency') + list_commands('smithctl') : target
7
+ responder.value(format(commands))
8
+ end
9
+
10
+ def list_commands(type)
11
+ list_command_files(type).map {|command| to_command_name(command) }
12
+ end
13
+
14
+ def format(commands)
15
+ if options[:long]
16
+ c = instantiate_commands(commands)
17
+ if options[:type]
18
+ c.map { |k,v| sprintf("%1$*4$s - %2$s [%3$s]", k, remove_new_lines(v), Command.command_type(k), -(max_length(c) + 1)) }.join("\n")
19
+ else
20
+ c.map { |k,v| sprintf("%1$*3$s - %2$s", k, remove_new_lines(v), -(max_length(c) + 1)) }.join("\n")
21
+ end
22
+ else
23
+ if options[:type]
24
+ instantiate_commands(commands).map { |k,v| sprintf("%s - %s", k, Command.command_type(k)) }
25
+ else
26
+ commands.sort.join("\n")
27
+ end
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def list_command_files(type)
34
+ Pathname.glob(Command.base_path.join(type).join("**/*.rb"))
35
+ end
36
+
37
+ def to_command_name(path)
38
+ path.basename(".rb").to_s
39
+ end
40
+
41
+ def instantiate_commands(commands)
42
+ commands.sort.inject({}) do |a, command|
43
+ a.tap do |acc|
44
+ Command.load_command(command)
45
+ clazz = Command.instantiate(command)
46
+ acc[command] = clazz.banner
47
+ end
48
+ end
49
+ end
50
+
51
+ def remove_new_lines(s)
52
+ s.split("\n").map(&:strip).select {|a| !a.empty? }.join(" ")
53
+ end
54
+
55
+ def options_spec
56
+ banner "List available commands.\n\n If a command/commands is given only that command will be shown."
57
+
58
+ opt :long, "include the short usage message", :short => :l
59
+ opt :type, "show whether the command is a smithctl command or an agency command ", :short => :t
60
+ end
61
+
62
+ def max_length(banners_hash)
63
+ banners_hash.keys.map(&:length).max
64
+ end
65
+ end
66
+ end
67
+ end
@@ -3,7 +3,7 @@ require 'yajl'
3
3
 
4
4
  module Smith
5
5
  module Commands
6
- class Pop < Command
6
+ class Pop < CommandBase
7
7
  def execute
8
8
  case target.size
9
9
  when 0
@@ -50,16 +50,6 @@ module Smith
50
50
  end
51
51
  end
52
52
 
53
- def options_parser
54
- Trollop::Parser.new do
55
- banner Command.banner('pop-queue')
56
- opt :print, "print the message", :short => :p
57
- opt :json , "return the JSON representation of the message", :short => :j
58
- opt :remove, "remove the message from the queue", :short => :r
59
- opt :number, "the number of messages to remove", :default =>1, :short => :n
60
- end
61
- end
62
-
63
53
  private
64
54
 
65
55
  def print_message(message)
@@ -71,6 +61,15 @@ module Smith
71
61
  end
72
62
  end
73
63
  end
64
+
65
+ def options_spec
66
+ banner "Pop messages off the named queue."
67
+
68
+ opt :print, "print the message", :short => :p
69
+ opt :json , "return the JSON representation of the message", :short => :j
70
+ opt :remove, "remove the message from the queue", :short => :r
71
+ opt :number, "the number of messages to remove", :default =>1, :short => :n
72
+ end
74
73
  end
75
74
  end
76
75
  end
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  module Smith
3
3
  module Commands
4
- class Rm < Command
4
+ class Rm < CommandBase
5
5
  def execute
6
6
  case target.size
7
7
  when 0
@@ -18,18 +18,13 @@ module Smith
18
18
  end
19
19
  end
20
20
 
21
- def options_parser
22
- Trollop::Parser.new do
23
- banner Command.banner('remove-queue')
24
- opt :force, "force the removal even if there are messages on the queue", :short => :f
25
- opt :verbose, "print the number of messages deleted", :short => :v
26
- end
27
- end
21
+ private
28
22
 
29
- def format_output(message_count)
30
- if options[:verbose]
31
- responder.value("Queue deleted. #{message_count}s messages deleted.")
32
- end
23
+ def options_spec
24
+ banner "Display or remove a message from the named queue."
25
+
26
+ opt :force, "force the removal even if there are messages on the queue", :short => :f
27
+ opt :verbose, "print the number of messages deleted", :short => :v
33
28
  end
34
29
  end
35
30
  end
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  module Smith
3
3
  module Commands
4
- class SmithctlVersion < Command
4
+ class SmithctlVersion < CommandBase
5
5
  def execute
6
6
  version_file = Smith.root_path.join('VERSION')
7
7
 
@@ -12,11 +12,10 @@ module Smith
12
12
  end
13
13
  end
14
14
 
15
- def options_parser
16
- Trollop::Parser.new do
17
- banner Command.banner('smithctl_version')
18
- opt :git, "run git describe, assuming git is installed", :short => :g
19
- end
15
+ def options_spec
16
+ banner "Displays the smithctl version."
17
+
18
+ opt :git, "run git describe, assuming git is installed", :short => :g
20
19
  end
21
20
  end
22
21
  end
@@ -4,7 +4,7 @@ require 'curses'
4
4
 
5
5
  module Smith
6
6
  module Commands
7
- class Top < Command
7
+ class Top < CommandBase
8
8
  def execute
9
9
  Curses.init_screen()
10
10
  win = Curses::Window.new(Curses.lines, Curses.cols, 0, 0)
@@ -30,6 +30,7 @@ module Smith
30
30
  end
31
31
 
32
32
  private
33
+
33
34
  def format_queues(queue_stats)
34
35
  queue_stats.inject([]) do |a,queue_stat|
35
36
  a.tap do |acc|
@@ -37,6 +38,10 @@ module Smith
37
38
  end
38
39
  end.join(";")
39
40
  end
41
+
42
+ def options_spec
43
+ banner "Show information about running agents."
44
+ end
40
45
  end
41
46
  end
42
47
  end
@@ -17,13 +17,14 @@ module Smith
17
17
  module Methods
18
18
  protected
19
19
 
20
+ @@__name = 'smith'
20
21
  @@__pattern = Smith::Config.get.logging.default_pattern
21
22
  @@__date_pattern = Smith::Config.get.logging.default_date_pattern
22
23
  @@__level = Smith::Config.get.logging.level
23
24
  @@__trace = Smith::Config.get.logging.trace
24
- @@__appender_type = Logging::Appenders.const_get(Smith::Config.get.logging.appender.to_s.to_sym)
25
- @@__appender_filename = Smith::Config.get.logging.filename
26
- @@__name = 'smith'
25
+ @@__appender = Smith::Config.get.logging.appender._data.tap do |appender|
26
+ appender[:type] = Logging::Appenders.const_get(Extlib::Inflection.camelize(appender.delete(:type)))
27
+ end
27
28
 
28
29
  def log_level(level=nil)
29
30
  if level
@@ -40,8 +41,7 @@ module Smith
40
41
  def log_appender(opts={})
41
42
  if @appender.nil? || !opts.empty?
42
43
  @@__name = opts[:name] if opts[:name]
43
- @@__appender_type = opts[:class] if opts[:class]
44
- @appender = @@__appender_type.send(:new, @@__name, :filename => @@__appender_filename, :layout => log_pattern)
44
+ @appender = @@__appender[:type].send(:new, @@__name, @@__appender.merge(:layout => log_pattern))
45
45
  @reload = true
46
46
  end
47
47
  Logging.logger.root.appenders = @appender
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smith
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.7
4
+ version: 0.5.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-02-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: amqp
16
- requirement: &19248700 !ruby/object:Gem::Requirement
16
+ requirement: &14081940 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.9.5.pre
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *19248700
24
+ version_requirements: *14081940
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: dm-core
27
- requirement: &19248220 !ruby/object:Gem::Requirement
27
+ requirement: &14081460 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - =
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.0.1
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *19248220
35
+ version_requirements: *14081460
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: dm-observer
38
- requirement: &19247760 !ruby/object:Gem::Requirement
38
+ requirement: &14081000 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - =
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.0.1
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *19247760
46
+ version_requirements: *14081000
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: dm-yaml-adapter
49
- requirement: &19247300 !ruby/object:Gem::Requirement
49
+ requirement: &14080540 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - =
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.0.1
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *19247300
57
+ version_requirements: *14080540
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: daemons
60
- requirement: &19246840 !ruby/object:Gem::Requirement
60
+ requirement: &13201300 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.1.4
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *19246840
68
+ version_requirements: *13201300
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: eventmachine
71
- requirement: &19742440 !ruby/object:Gem::Requirement
71
+ requirement: &13848600 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 1.0.0.beta.4
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *19742440
79
+ version_requirements: *13848600
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: extlib
82
- requirement: &19741980 !ruby/object:Gem::Requirement
82
+ requirement: &13848140 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 0.9.15
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *19741980
90
+ version_requirements: *13848140
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: logging
93
- requirement: &19741520 !ruby/object:Gem::Requirement
93
+ requirement: &13847680 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 1.6.1
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *19741520
101
+ version_requirements: *13847680
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: optimism
104
- requirement: &19741060 !ruby/object:Gem::Requirement
104
+ requirement: &13847220 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: 3.0.3
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *19741060
112
+ version_requirements: *13847220
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: ruby_protobuf
115
- requirement: &19740600 !ruby/object:Gem::Requirement
115
+ requirement: &13846760 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - =
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: 0.4.11
121
121
  type: :runtime
122
122
  prerelease: false
123
- version_requirements: *19740600
123
+ version_requirements: *13846760
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: state_machine
126
- requirement: &19740140 !ruby/object:Gem::Requirement
126
+ requirement: &13846300 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - =
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: 1.1.2
132
132
  type: :runtime
133
133
  prerelease: false
134
- version_requirements: *19740140
134
+ version_requirements: *13846300
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: trollop
137
- requirement: &19739680 !ruby/object:Gem::Requirement
137
+ requirement: &13845840 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ! '>='
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: 1.16.2
143
143
  type: :runtime
144
144
  prerelease: false
145
- version_requirements: *19739680
145
+ version_requirements: *13845840
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: yajl-ruby
148
- requirement: &19739220 !ruby/object:Gem::Requirement
148
+ requirement: &13845380 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ! '>='
@@ -153,7 +153,7 @@ dependencies:
153
153
  version: 1.1.0
154
154
  type: :runtime
155
155
  prerelease: false
156
- version_requirements: *19739220
156
+ version_requirements: *13845380
157
157
  description: Simple multi-agent framework. It uses AMQP for it's messaging layer.
158
158
  email: rgh@filterfish.org
159
159
  executables:
@@ -164,35 +164,33 @@ extra_rdoc_files: []
164
164
  files:
165
165
  - bin/agency
166
166
  - bin/smithctl
167
- - lib/smith/acl_compiler.rb
168
167
  - lib/smith/agent.rb
169
168
  - lib/smith/agent_cache.rb
170
169
  - lib/smith/agent_config.rb
171
170
  - lib/smith/agent_monitoring.rb
172
- - lib/smith/agent_process.rb
173
171
  - lib/smith/application/agency.rb
174
172
  - lib/smith/bootstrap.rb
175
173
  - lib/smith/cache.rb
176
- - lib/smith/command.rb
174
+ - lib/smith/commands/agency/agency_version.rb
177
175
  - lib/smith/commands/agency/agents.rb
178
- - lib/smith/commands/agency/common.rb
179
176
  - lib/smith/commands/agency/kill.rb
180
177
  - lib/smith/commands/agency/list.rb
178
+ - lib/smith/commands/agency/logger.rb
181
179
  - lib/smith/commands/agency/metadata.rb
182
180
  - lib/smith/commands/agency/restart.rb
183
181
  - lib/smith/commands/agency/start.rb
184
182
  - lib/smith/commands/agency/state.rb
185
183
  - lib/smith/commands/agency/stop.rb
186
- - lib/smith/commands/agency/version.rb
187
- - lib/smith/commands/agency/logger.rb
184
+ - lib/smith/commands/smithctl/acls.rb
188
185
  - lib/smith/commands/smithctl/cat.rb
186
+ - lib/smith/commands/smithctl/commands.rb
189
187
  - lib/smith/commands/smithctl/pop.rb
190
188
  - lib/smith/commands/smithctl/rm.rb
191
189
  - lib/smith/commands/smithctl/smithctl_version.rb
192
190
  - lib/smith/commands/smithctl/top.rb
193
191
  - lib/smith/commands/template.rb
192
+ - lib/smith/commands/common.rb
194
193
  - lib/smith/config.rb
195
- - lib/smith/logger.rb
196
194
  - lib/smith/messaging/acl/agency_command.proto
197
195
  - lib/smith/messaging/acl/agent_command.proto
198
196
  - lib/smith/messaging/acl/agent_config_request.proto
@@ -210,6 +208,11 @@ files:
210
208
  - lib/smith/messaging/responder.rb
211
209
  - lib/smith/messaging/sender.rb
212
210
  - lib/smith/messaging/receiver.rb
211
+ - lib/smith/acl_compiler.rb
212
+ - lib/smith/agent_process.rb
213
+ - lib/smith/command.rb
214
+ - lib/smith/command_base.rb
215
+ - lib/smith/logger.rb
213
216
  - lib/smith.rb
214
217
  homepage: http://github.com/filterfish/smith2/
215
218
  licenses: []