minus5_daemon 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ require "rake/testtask"
2
+ require 'rubygems/package_task'
3
+ load 'minus5_daemon.gemspec'
4
+
5
+ task :default => [:test]
6
+
7
+ Rake::TestTask.new do |test|
8
+ test.libs << "test"
9
+ test.test_files = Dir[ "test/test_*.rb" ]
10
+ test.verbose = true
11
+ end
12
+
13
+ Gem::PackageTask.new(GEMSPEC) do |pkg|
14
+ end
@@ -0,0 +1,58 @@
1
+ module Minus5
2
+ module Daemon
3
+
4
+ class Base
5
+
6
+ def initialize(options, logger)
7
+ @options = options
8
+ @logger = logger
9
+ @active = true
10
+ @sleep_interval = 1
11
+ end
12
+
13
+ attr_reader :logger
14
+
15
+ def run
16
+ on_start
17
+ Signal.trap("TERM") do
18
+ logger.debug "TERM signal received"
19
+ @active = false
20
+ on_stop
21
+ end
22
+ while @active
23
+ run_loop
24
+ sleep_with_check
25
+ end
26
+ end
27
+
28
+ protected
29
+
30
+ # sleep for delay, but check at least every second if TERM signal is received
31
+ def sleep_with_check
32
+ if @sleep_interval < 1
33
+ Kernel::sleep @sleep_interval
34
+ return
35
+ end
36
+ elapsed = 0
37
+ while @active && elapsed < @sleep_interval
38
+ Kernel::sleep((@sleep_interval - elapsed < 1) ? (@sleep_interval - elapsed) : 1)
39
+ elapsed = elapsed + 1
40
+ end
41
+ end
42
+
43
+ def on_start
44
+ logger.debug "on_start"
45
+ end
46
+
47
+ def run_loop
48
+ logger.debug "run_loop"
49
+ end
50
+
51
+ def on_stop
52
+ logger.debug "on_stop"
53
+ end
54
+
55
+ end
56
+
57
+ end
58
+ end
@@ -0,0 +1 @@
1
+ require "#{File.dirname(__FILE__)}/../../tasks/capistrano_deploy.rb"
@@ -0,0 +1,36 @@
1
+ require 'rubygems'
2
+ require 'eventmachine'
3
+
4
+ module Minus5
5
+ module Daemon
6
+
7
+ class EmBase
8
+
9
+ def initialize(options, logger)
10
+ @options = options
11
+ @logger = logger
12
+ end
13
+
14
+ def run
15
+ EventMachine.run do
16
+ self.em_run
17
+ logger.debug "em - server started"
18
+ Signal.trap("TERM") do
19
+ logger.debug "em - TERM signal received"
20
+ EventMachine::stop_event_loop
21
+ EventMachine::stop
22
+ end
23
+ end
24
+ end
25
+
26
+ protected
27
+
28
+ def em_run
29
+ end
30
+
31
+ attr_reader :logger
32
+
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,125 @@
1
+ module Minus5
2
+ module Daemon
3
+
4
+ def self.run(klass)
5
+ Runner.new(klass).run
6
+ rescue => e
7
+ print "#{e}\n"
8
+ end
9
+
10
+
11
+ class Runner
12
+
13
+ def initialize(klass = nil)
14
+ @klass = klass
15
+ # asserts
16
+ init_logger
17
+ @options = OpenStruct.new(
18
+ :daemonize => true,
19
+ :config_file => 'config.yml',
20
+ :config_file_set => false,
21
+ :environment => 'production',
22
+ :app_name => start_script_name,
23
+ :app_root => app_root)
24
+ parse_arg_options
25
+ load_config
26
+ end
27
+
28
+ attr_reader :logger
29
+
30
+ def run
31
+ mkdirs
32
+ Daemons.run_proc(@options.app_name, daemon_options) do
33
+ logger.info "starting daemon pid: #{Process.pid}"
34
+ logger.debug "options: #{@options}"
35
+ service = @klass.new(@options, @logger)
36
+ service.run
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def load_config
43
+ config_file = "#{@options.app_root}/config/#{@options.config_file}"
44
+ if File.exists?(config_file)
45
+ @options.config = YAML.load_file config_file
46
+ else
47
+ if @options.config_file_set
48
+ msg = "config file #{config_file} not found"
49
+ @logger.error msg
50
+ raise msg
51
+ end
52
+ end
53
+ end
54
+
55
+ def init_logger
56
+ @logger = Logger.new(STDOUT)
57
+ @logger.level = Logger::DEBUG
58
+ @logger.datetime_format = "%H:%M:%S"
59
+ @logger.formatter = proc { |severity, datetime, progname, msg|
60
+ "#{datetime.strftime("%Y-%m-%d %H:%M:%S")} #{severity}: #{msg}\n"
61
+ }
62
+ end
63
+
64
+ def parse_arg_options
65
+ opts = OptionParser.new do |opts|
66
+ opts.banner = "Usage: #{start_script_name} [options]"
67
+ opts.separator ''
68
+ opts.on('-n','--no-daemonize',"Don't run as a daemon") do
69
+ @options.daemonize = false
70
+ end
71
+ opts.on('-e','--environment=name',"Specifies the environment to run this server under. Default: production") do |name|
72
+ @options.environment = name
73
+ end
74
+ opts.on('-c','--config=file',"Use specified config file. This is yaml config file name from app_root/config dir.") do |file|
75
+ file = "#{file}.yml" unless file.include?(".")
76
+ @options.config_file = file
77
+ @options.config_file_set = true
78
+ end
79
+ opts.on('-a','--app-name=file',"Use specified application name for daemon process.") do |name|
80
+ @options.app_name = name
81
+ end
82
+ end
83
+ @args = opts.parse!(ARGV)
84
+ end
85
+
86
+ def daemon_options
87
+ {
88
+ :backtrace => true,
89
+ :dir_mode => :normal,
90
+ :log_output => true,
91
+ :dir => pid_dir,
92
+ :log_dir => log_dir,
93
+ :ARGV => @args,
94
+ :ontop => !@options.daemonize
95
+ }
96
+ end
97
+
98
+ def mkdirs
99
+ FileUtils.mkdir_p pid_dir
100
+ FileUtils.mkdir_p log_dir
101
+ end
102
+
103
+ def log_dir
104
+ "#{app_root}/log"
105
+ end
106
+
107
+ def pid_dir
108
+ "#{app_root}/tmp/pids"
109
+ end
110
+
111
+ def start_script_name
112
+ File.basename($0)
113
+ end
114
+
115
+ def app_root
116
+ start_dir = File.expand_path(File.dirname($0))
117
+ root_rel = ""
118
+ root_rel = ".." if start_dir.end_with?("/lib") || start_dir.end_with?("/bin")
119
+ File.expand_path(File.join(File.dirname($0), root_rel))
120
+ end
121
+
122
+ end
123
+
124
+ end
125
+ end
@@ -0,0 +1,16 @@
1
+ #core lib
2
+ require 'fileutils'
3
+ require 'optparse'
4
+ require 'logger'
5
+ require 'ostruct'
6
+ require 'yaml'
7
+ #gems
8
+ require 'rubygems'
9
+
10
+ gem 'daemons', '= 1.1.3'
11
+ require 'daemons'
12
+
13
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/minus5_daemon/"
14
+ require 'runner.rb'
15
+ require 'base.rb'
16
+ require 'em_base.rb'
@@ -0,0 +1,54 @@
1
+ Capistrano::Configuration.instance(:must_exist).load do
2
+
3
+ #start stop deamon
4
+ namespace :deploy do
5
+ desc "Restarting daemon"
6
+ task :restart do
7
+ run "#{current_path}/lib/#{application}.rb restart"
8
+ end
9
+
10
+ desc "Stopping daemon"
11
+ task :stop do
12
+ run "#{current_path}/lib/#{application}.rb stop"
13
+ end
14
+ end
15
+
16
+ after "deploy:setup", "fix_dir_permissions"
17
+ desc "change group to deploy_group on dirs created during deploy:setup"
18
+ task :fix_dir_permissions do
19
+ dirs = [deploy_to, releases_path, shared_path]
20
+ dirs += shared_children.map { |d| File.join(shared_path, d) }
21
+ group = deploy_group || "admin"
22
+ run "#{try_sudo} chgrp #{group} #{dirs.join(' ')}"
23
+ end
24
+
25
+ #shared files handling (next three tasks)
26
+ #shared files are symlinked from shared to the same location in release_path for each deploy
27
+ #initiali empty files are created during deploy:setup
28
+ #if file exists in relase_path it is deleted and then replaced with symlink to shared
29
+ before "deploy:setup", "add_shard_files_to_shared_children"
30
+ task :add_shard_files_to_shared_children do
31
+ next unless exists?(:shared_files)
32
+ shared_files.each do |file|
33
+ shared_children << File.dirname(file)
34
+ end
35
+ end
36
+
37
+ after "deploy:setup", "create_shared_files"
38
+ task :create_shared_files do
39
+ next unless exists?(:shared_files)
40
+ shared_files.each do |file|
41
+ run "touch #{shared_path}/#{file}"
42
+ end
43
+ end
44
+
45
+ after "deploy:update_code", "symlink_shared_files"
46
+ task :symlink_shared_files do
47
+ next unless exists?(:shared_files)
48
+ shared_files.each do |file|
49
+ run "rm -f #{release_path}/#{file}"
50
+ run "ln -nfs #{shared_path}/#{file} #{release_path}/#{file}"
51
+ end
52
+ end
53
+
54
+ end
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: minus5_daemon
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 2
9
+ - 0
10
+ version: 0.2.0
11
+ platform: ruby
12
+ authors:
13
+ - Igor Anic
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-05-31 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: daemons
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ hash: 21
30
+ segments:
31
+ - 1
32
+ - 1
33
+ - 3
34
+ version: 1.1.3
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ description: " minus5_daemon is a simple lib for crating Ruby daemons\n it is built on top daemons.rb (http://daemons.rubyforge.org/)\n"
38
+ email: ianic@minus5.hr
39
+ executables: []
40
+
41
+ extensions: []
42
+
43
+ extra_rdoc_files: []
44
+
45
+ files:
46
+ - lib/minus5_daemon.rb
47
+ - lib/minus5_daemon/base.rb
48
+ - lib/minus5_daemon/capistrano_deploy.rb
49
+ - lib/minus5_daemon/em_base.rb
50
+ - lib/minus5_daemon/runner.rb
51
+ - tasks/capistrano_deploy.rb
52
+ - Rakefile
53
+ has_rdoc: true
54
+ homepage: http://www.minus5.hr
55
+ licenses: []
56
+
57
+ post_install_message:
58
+ rdoc_options: []
59
+
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ hash: 3
68
+ segments:
69
+ - 0
70
+ version: "0"
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ hash: 3
77
+ segments:
78
+ - 0
79
+ version: "0"
80
+ requirements: []
81
+
82
+ rubyforge_project:
83
+ rubygems_version: 1.5.3
84
+ signing_key:
85
+ specification_version: 3
86
+ summary: minus5 daemon library
87
+ test_files: []
88
+