smith 0.7.7 → 0.7.9

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2cc8959d34747160c59a7a05ec820ec2e27c5682
4
- data.tar.gz: aac86c9b5eeb61288c2bc9d6233df3d48a364e5d
3
+ metadata.gz: 672819de30ca51cefb95f9b58f975574bb59b24a
4
+ data.tar.gz: bbc895d5842922f23e866086c549010bb0ec58f1
5
5
  SHA512:
6
- metadata.gz: 6a917e6fb2e800c94ddf20db84425c780beac39f1dcd9bd445ff15cbc24cff767625fbef4094154ea53fca11a0a252b2b32d8b3b2ed5be4f0eda4cece7525e1b
7
- data.tar.gz: 707db2b0981c8ce05f284c337634fb5abf5ee540352bcfc80b51ba941e3e74867c7ecfcb210f91d154531dadd645fda9604efae94617741bca80c45ae406a8d9
6
+ metadata.gz: 2c87facd4414ed52f8380f718ec7585567bb850e1f9928cdc8462ace844575eae1610eaf7164d302f22a36cce7819f0912959e505a9a09d9f3ac85a83a65a5ad
7
+ data.tar.gz: 944f322a51b2b8c90c606238565c513e64503024277a3bcf2d6513cc2869ce039ffda9a4dc65b081579858ac9e1b7cd7437eff13400edbfaac503d7dbbe85977
data/bin/agency CHANGED
@@ -24,7 +24,11 @@ module Smith
24
24
 
25
25
  @daemon = Daemon.new(add_vhost(AGENCY_NAME), opts[:daemon], opts[:pid_dir])
26
26
 
27
- raise AgencyRunning, "The agency is alredy running." if @daemon.running?
27
+ if @daemon.running?
28
+ msg = "An agency with pid: #{@daemon.pid} is already running"
29
+ logger.fatal { msg}
30
+ raise AgencyRunning, msg
31
+ end
28
32
 
29
33
  @agency = Agency.new
30
34
 
data/bin/smithctl CHANGED
@@ -20,7 +20,9 @@ module Smith
20
20
 
21
21
  def initialize(options={})
22
22
  log_level((options[:log_level_given]) ? options[:log_level].to_sym : :warn)
23
+
23
24
  @timeout = (options[:timeout_given]) ? options[:timeout] : Smith.config.smith.timeout
25
+ @node = options[:node]
24
26
  end
25
27
 
26
28
  def send_command(command, args, &blk)
@@ -38,7 +40,7 @@ module Smith
38
40
  end
39
41
 
40
42
  def agency_command(command, args, &blk)
41
- Messaging::Sender.new(QueueDefinitions::Agency_control) do |sender|
43
+ Messaging::Sender.new(QueueDefinitions::Agency_control.call(@node)) do |sender|
42
44
  sender.on_timeout(@timeout) { |message_id| blk.call("Timeout. Is the agency still running?") }
43
45
 
44
46
  sender.on_reply(:auto_ack => true) do |reply_payload, r|
@@ -70,16 +72,21 @@ Usage:
70
72
  stop_on Command.commands
71
73
  opt :log_level, "Set the log level of smithctl only.", :short => :l, :type => :string
72
74
  opt :timeout, "Specify the timeout when communicating with the agency.", :short => :t, :type => :integer, :default => 60
75
+ opt :node, "Specify the agency node to connect to.", :type => :string, :short => :none
73
76
  end
74
77
 
75
78
  opts = Trollop::with_standard_exception_handling parser do
76
79
  raise Trollop::HelpNeeded if ARGV.size < 1
77
- parser.parse(ARGV).tap do
78
- unless Command.commands.include?(ARGV.first)
79
- puts "Unknown command: #{ARGV.first}"
80
- exit 1
81
- end
80
+ parser.parse(ARGV)
81
+ end
82
+
83
+ if ARGV.size > 0
84
+ if ! Command.commands.include?(ARGV.first)
85
+ puts "Unknown command: #{ARGV.first}"
86
+ exit 1
82
87
  end
88
+ else
89
+ raise Trollop::HelpNeeded
83
90
  end
84
91
 
85
92
  command = ARGV.shift.dup
data/config/smithrc.toml CHANGED
@@ -21,6 +21,9 @@ kqueue = true
21
21
  pid_directory = "~/.smith/run"
22
22
  cache_directory = "~/.smith/cache"
23
23
 
24
+ # This is the directory that will contain the agent groups
25
+ group_directory = "groups"
26
+
24
27
  # It would be better to use inline tables here but there is a bug in
25
28
  # toml-rb: https://github.com/emancu/toml-rb/issues/57.
26
29
  # TODO: Change these to inline tables when this bug is fixed.
@@ -36,7 +36,7 @@ module Smith
36
36
  logger.info { "Agent is shutting down: #{agent_process.name}" }
37
37
  when 'dead'
38
38
  logger.info { "Restarting dead agent: #{agent_process.name}" }
39
- Messaging::Sender.new(QueueDefinitions::Agency_control) do |sender|
39
+ Messaging::Sender.new(QueueDefinitions::Agency_control.call) do |sender|
40
40
  sender.on_reply { |p, r| logger.debug { "Agent restart message acknowledged: #{agent_process.name}" } }
41
41
  sender.publish(ACL::AgencyCommand.new(:command => 'start', :args => [agent_process.name]))
42
42
  end
@@ -18,7 +18,7 @@ module Smith
18
18
  end
19
19
 
20
20
  def setup_queues
21
- Messaging::Receiver.new(QueueDefinitions::Agency_control, :auto_ack => false) do |receiver|
21
+ Messaging::Receiver.new(QueueDefinitions::Agency_control.call, :auto_ack => false) do |receiver|
22
22
  receiver.subscribe do |payload, responder|
23
23
 
24
24
  completion = EM::Completion.new.tap do |c|
@@ -12,7 +12,7 @@ module Smith
12
12
  include Common
13
13
 
14
14
  def execute
15
- Messaging::Sender.new(QueueDefinitions::Agency_control) do |sender|
15
+ Messaging::Sender.new(QueueDefinitions::Agency_control.call) do |sender|
16
16
  @sender = sender
17
17
 
18
18
  # agent is a method and as such I cannot pass it into the block.
@@ -5,7 +5,7 @@ module Smith
5
5
 
6
6
  # Returns the fully qualified class of all agents in a group. The group
7
7
  # //must// be a sub-directory in the agents directory. Only sym-links are
8
- # considered. The group directory is recursively searched and addeed to
8
+ # considered. The group directory is recursively searched and added to
9
9
  # the ilst of agents for that group if it passed all checks.
10
10
  #
11
11
  # @param group [String] the group name
@@ -13,19 +13,20 @@ module Smith
13
13
  # @return [Array<Class>] the class of each agent in the group
14
14
  def agent_group(group)
15
15
  agents = Smith.agent_directories.map do |agent_directory|
16
- group_directory = agent_directory.join(group)
16
+ group_directory(agent_directory, group) do |group_directory, groups_prefix|
17
17
 
18
- if group_directory.exist? && group_directory.directory?
19
- agents = Pathname.glob(group_directory.join("*.rb")).map(&:expand_path)
18
+ if group_directory.exist? && group_directory.directory?
19
+ agents = Pathname.glob(group_directory.join("*.rb")).map(&:expand_path)
20
20
 
21
- agents.inject([]) do |acc, agent|
22
- if agent.symlink?
23
- expanded_agent_path = resolve_agent_path(group_directory, agent)
24
- acc << Utils.class_name_from_path(expanded_agent_path, agent_directory)
21
+ agents.inject([]) do |acc, agent|
22
+ if agent.symlink?
23
+ expanded_agent_path = resolve_agent_path(group_directory, agent)
24
+ acc << Utils.class_name_from_path(expanded_agent_path, agent_directory, groups_prefix)
25
+ end
25
26
  end
27
+ else
28
+ nil
26
29
  end
27
- else
28
- nil
29
30
  end
30
31
  end.uniq
31
32
 
@@ -38,6 +39,23 @@ module Smith
38
39
  def resolve_agent_path(group_directory, agent)
39
40
  agent.readlink.expand_path(group_directory)
40
41
  end
42
+
43
+ # Return the group directory. This checks to see if the directory "groups"
44
+ # exists and if it does it appends the group name to that otherwise it appends
45
+ # it to the agent directory.
46
+ #
47
+ # @param path [Pathname] the agent directory
48
+ # @param group [String] the group name
49
+ #
50
+ # @return [Pathname] the group directory
51
+ def group_directory(path, group, &blk)
52
+ dir = path.join(Smith.config.agency.group_directory)
53
+ if dir.exist?
54
+ blk.call(dir.join(group), Smith.config.agency.group_directory)
55
+ else
56
+ blk.call(path.join(group), nil)
57
+ end
58
+ end
41
59
  end
42
60
  end
43
61
  end
@@ -12,7 +12,7 @@ module Smith
12
12
  end
13
13
 
14
14
  def status(&blk)
15
- Messaging::Queue.number_of_consumers(QueueDefinitions::Agency_control) do |consumers_count|
15
+ Messaging::Queue.number_of_consumers(QueueDefinitions::Agency_control.call) do |consumers_count|
16
16
  blk.call(consumers_count > 0)
17
17
  end
18
18
  end
@@ -20,7 +20,7 @@ module Smith
20
20
  private
21
21
 
22
22
  def options_spec
23
- banner "Shows the status of the agency."
23
+ banner "Shows the status of the agency — ONLY WORKS LOCALLY"
24
24
  end
25
25
  end
26
26
  end
data/lib/smith/daemon.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'daemons/daemonize'
4
4
  require 'daemons/pidfile'
5
+ require 'sys/proctable'
5
6
 
6
7
  require 'smith/utils'
7
8
 
@@ -52,10 +53,16 @@ module Smith
52
53
  false
53
54
  else
54
55
  pid = File.read(pid_files.first).to_i
55
- pid > 0 && Daemons::Pid.running?(pid)
56
+ pid > 0 && Daemons::Pid.running?(pid) && process_names_match?(@name, pid)
56
57
  end
57
58
  end
58
59
 
60
+ # Return the pid of the process
61
+ # @return the pid or nil if not set.
62
+ def pid
63
+ @pid.pid
64
+ end
65
+
59
66
  def unlink_pid_file
60
67
  p = Pathname.new(@pid.filename)
61
68
  if p.exist?
@@ -66,6 +73,18 @@ module Smith
66
73
 
67
74
  private
68
75
 
76
+ # Checks to see if running process that matches the pid in the pid matches
77
+ # the name.
78
+ # @param name [String] the name of the process
79
+ #
80
+ # @param pid [Integer] the pid of the process
81
+ #
82
+ # @return true if the running process matches the name
83
+ def process_names_match?(name, pid)
84
+ proc_table = Sys::ProcTable.ps(pid)
85
+ proc_table && proc_table.cmdline == name
86
+ end
87
+
69
88
  # Get the pid directory. This checks for the command line option,
70
89
  # then the config and finally use the tmp directory.
71
90
  def pid_directory(dir)
@@ -2,7 +2,6 @@
2
2
 
3
3
  module Smith
4
4
  module QueueDefinitions
5
- Agency_control = QueueDefinition.new("#{Smith.hostname}.agency.control", :auto_ack => false, :durable => true, :persistent => false, :strict => true)
6
5
  Agent_keepalive = QueueDefinition.new("#{Smith.hostname}.agent.keepalive", :auto_delete => false, :durable => true)
7
6
  Agent_lifecycle = QueueDefinition.new("#{Smith.hostname}.agent.lifecycle", :auto_delete => false, :durable => true)
8
7
 
@@ -10,5 +9,9 @@ module Smith
10
9
 
11
10
  # Something tells me that I've crossed line with this.
12
11
  Agent_control = ->(uuid) { QueueDefinition.new("agent.control.#{uuid}", :durable => false, :auto_delete => true) }
12
+
13
+ Agency_control = ->(node=nil) {
14
+ QueueDefinition.new("#{node || Smith.hostname}.agency.control", :auto_ack => false, :durable => true, :persistent => false, :strict => true)
15
+ }
13
16
  end
14
17
  end
data/lib/smith/utils.rb CHANGED
@@ -27,9 +27,9 @@ module Smith
27
27
  module_function :path_from_class
28
28
 
29
29
  # Returns a Constant based on the pathname.
30
- def class_name_from_path(path, root=Pathname.new('.'))
30
+ def class_name_from_path(path, root=Pathname.new('.'), segment_to_remove=nil)
31
31
  relative_path = path.relative_path_from(root)
32
- parts = split_path(relative_path.sub_ext(''))
32
+ parts = split_path(relative_path.sub_ext('')).reject { |p| p == segment_to_remove }
33
33
 
34
34
  parts.map { |p| p.to_s.camel_case }.join('::')
35
35
  end
data/lib/smith/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Smith
2
- VERSION = "0.7.7"
2
+ VERSION = "0.7.9"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smith
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.7
4
+ version: 0.7.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Heycock
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-09 00:00:00.000000000 Z
11
+ date: 2015-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: amqp
@@ -198,6 +198,20 @@ dependencies:
198
198
  - - "~>"
199
199
  - !ruby/object:Gem::Version
200
200
  version: '0.3'
201
+ - !ruby/object:Gem::Dependency
202
+ name: sys-proctable
203
+ requirement: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: 0.9.0
208
+ type: :runtime
209
+ prerelease: false
210
+ version_requirements: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: 0.9.0
201
215
  - !ruby/object:Gem::Dependency
202
216
  name: oj
203
217
  requirement: !ruby/object:Gem::Requirement