lobster 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,13 +1,13 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- lobster (0.1.1.pre)
4
+ lobster (0.1.3.wip)
5
5
  daemons (>= 1.1.4)
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
- daemons (1.1.4)
10
+ daemons (1.1.8)
11
11
 
12
12
  PLATFORMS
13
13
  ruby
data/README.md CHANGED
@@ -43,9 +43,6 @@ Two environment variables are used (with defaults):
43
43
  - `LOBSTER_ENV` is a variable used to handle different environments (default:
44
44
  development)
45
45
 
46
- You need write permission to `/var/run/lobster/` for pids, this path is
47
- configurable.
48
-
49
46
  - `lobster run` will run in the console
50
47
  - or `lobster start` as a deamon
51
48
 
data/bin/lobster CHANGED
@@ -13,7 +13,9 @@ config = Lobster::Configuration.new(lobster_dir, lobster_env)
13
13
  #puts "Config: #{config}"
14
14
 
15
15
  log_dir = config[:log_dir]
16
- Dir.mkdir log_dir unless Dir.exist?(log_dir) || ARGV.first == "run"
16
+ pid_dir = config[:pid_dir]
17
+ Dir.mkdir log_dir unless Dir.exist?(log_dir) || ARGV.first == 'run'
18
+ Dir.mkdir pid_dir unless Dir.exist?(pid_dir)
17
19
 
18
20
  daemon_options = {
19
21
  :multiple => false,
data/bin/lobsterize CHANGED
@@ -60,8 +60,8 @@ unless File.exist?(schedule)
60
60
  ## Job named my_job
61
61
  #job 'my_job' do
62
62
  #
63
- ## will just sleep for 5 seconds, this command is run from the
64
- ## LOBSTER_DIR directory, so you can use relative paths from here.
63
+ ## will just sleep for 5 seconds, you can use relative paths
64
+ ## from the directory defined with the "directory" command
65
65
  # command 'sleep 5'
66
66
  #
67
67
  ## the user my_user will be use to run the command, Lobster needs
@@ -71,6 +71,9 @@ unless File.exist?(schedule)
71
71
  ## Lobster will wait 2 minutes between 2 runs
72
72
  # delay 2
73
73
  #
74
+ ## will run the command from this directory. Defaults to LOBSTER_DIR
75
+ # directory '/my_directory/here/'
76
+ #
74
77
  ## end of job definition
75
78
  #end
76
79
  EOF
@@ -3,10 +3,14 @@ require 'yaml'
3
3
  module Lobster
4
4
  class Configuration
5
5
  def initialize(dir, env)
6
+ reload(dir,env)
7
+ end
8
+
9
+ def reload(dir, env)
6
10
  @config = {
7
11
  :monitor => true,
8
12
  :log_dir => 'log',
9
- :pid_dir => File.join('/', 'var', 'run', 'lobster'),
13
+ :pid_dir => 'pids',
10
14
  :schedule_file => File.join('config', 'schedule.rb')
11
15
  }
12
16
 
@@ -14,7 +18,8 @@ module Lobster
14
18
  if File.exist? config_file_path
15
19
  config_file = YAML.load_file(config_file_path)
16
20
  @config.keys.each do |key|
17
- val = config_file[env][key.to_s] # environment-specific override
21
+ # environment-specific override
22
+ val = config_file[env][key.to_s] if config_file[env]
18
23
  val = config_file[key.to_s] if val.nil?
19
24
  @config[key] = val unless val.nil? # keep default if no config
20
25
  end
data/lib/lobster/job.rb CHANGED
@@ -8,10 +8,11 @@ module Lobster
8
8
  @pid = nil
9
9
  end
10
10
 
11
- def reload(options)
11
+ def reload(options, lobster_dir)
12
12
  options[:delay] ||= 10
13
+ options[:directory] ||= lobster_dir
13
14
 
14
- [:command, :delay, :user].each do |opt|
15
+ [:command, :delay, :user, :directory].each do |opt|
15
16
  val = instance_variable_get "@#{opt}"
16
17
  if options[opt] != val
17
18
  Lobster.logger.info "Job #{opt} updated for #{@name}, was \"#{val}\", now \"#{options[opt]}\"" if val
@@ -21,7 +22,7 @@ module Lobster
21
22
  end
22
23
  end
23
24
 
24
- @name ||= "<unnamed_job_#{command.hash.abs}>"
25
+ @name ||= "<unnamed_job_#{@command.hash.abs}>"
25
26
  @next_run ||= Time.now + rand(@delay*60)
26
27
  end
27
28
 
@@ -37,12 +38,12 @@ module Lobster
37
38
  end
38
39
  end
39
40
 
40
- def run(out,err,dir)
41
+ def run(out,err)
41
42
  Lobster.logger.info "Starting job #{@name}"
42
- command_line = @user ? "sudo -inu #{@user} \"cd $PWD ; #{@command}\"" : @command
43
+ command_line = @user ? "sudo -snu #{@user} '#{@command}'" : @command
43
44
 
44
45
  begin
45
- @pid = spawn(command_line, :out=>out, :err=>err, :chdir=>dir)
46
+ @pid = spawn(command_line, :out=>out, :err=>err, :chdir=> @directory)
46
47
  rescue Exception => e
47
48
  Lobster.logger.error "#{e}: error when starting job #{@name}"
48
49
  @next_run = Time.now + 10
@@ -2,8 +2,8 @@ module Lobster
2
2
  class JobList
3
3
  attr_accessor :jobs
4
4
 
5
- def initialize(file)
6
- @file = file
5
+ def initialize(config)
6
+ @config = config
7
7
  @current_options = nil
8
8
  @jobs = {}
9
9
  end
@@ -11,7 +11,8 @@ module Lobster
11
11
  def reload
12
12
  @new_jobs = {}
13
13
 
14
- instance_eval(File.read(@file),@file)
14
+ file = @config[:schedule_file]
15
+ instance_eval(File.read(file),file)
15
16
 
16
17
  # purely for logging
17
18
  @jobs.each do |name, job|
@@ -25,11 +26,11 @@ module Lobster
25
26
  @current_options = {}
26
27
  yield
27
28
  @new_jobs[name] ||= @jobs[name] || Job.new(name)
28
- @new_jobs[name].reload(@current_options)
29
+ @new_jobs[name].reload(@current_options, @config[:lobster_dir])
29
30
  @current_options = nil
30
31
  end
31
32
 
32
- [:command, :delay, :user].each do |opt|
33
+ [:command, :delay, :user, :directory].each do |opt|
33
34
  define_method opt do |value|
34
35
  @current_options[opt] = value
35
36
  end
@@ -39,5 +40,10 @@ module Lobster
39
40
  def cmd(command)
40
41
  @current_options[:command] = command
41
42
  end
43
+
44
+ # config data
45
+ def environment
46
+ @config[:environment]
47
+ end
42
48
  end
43
49
  end
@@ -31,7 +31,7 @@ module Lobster
31
31
 
32
32
  trap 'HUP' do
33
33
  begin
34
- @config = Configuration.new(@config[:lobster_dir], @config[:environment])
34
+ @config.reload(@config[:lobster_dir], @config[:environment])
35
35
  rescue Exception => e
36
36
  Lobster.logger.error "Cannot reload conf, Exception: #{e}"
37
37
  break
@@ -64,16 +64,21 @@ module Lobster
64
64
 
65
65
  @job_list.jobs.each_value do |job|
66
66
  if not job.running? and now >= job.next_run
67
- job.run(@wout, @werr, @config[:lobster_dir])
67
+ job.run(@wout, @werr)
68
68
  end
69
69
  end
70
70
  @sleeping = true
71
- sleep @poll_delay
71
+ begin
72
+ sleep @poll_delay
73
+ rescue Exception => e
74
+ Lobster.logger.info "Sleep caught exception: #{e}"
75
+ break
76
+ end
72
77
  end
73
78
  end
74
79
 
75
80
  def reload_schedule
76
- @job_list ||= JobList.new(@config[:schedule_file])
81
+ @job_list ||= JobList.new(@config)
77
82
  begin
78
83
  @job_list.reload
79
84
  rescue Exception => e
@@ -1,3 +1,3 @@
1
1
  module Lobster
2
- VERSION = '0.1.2'
2
+ VERSION = '0.2.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lobster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-19 00:00:00.000000000 Z
12
+ date: 2012-03-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: daemons
16
- requirement: &75477200 !ruby/object:Gem::Requirement
16
+ requirement: &78818160 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: 1.1.4
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *75477200
24
+ version_requirements: *78818160
25
25
  description: ''
26
26
  email:
27
27
  - m.brugidou@criteo.com