procemon 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/procemon.rb ADDED
@@ -0,0 +1,55 @@
1
+ #encoding: UTF-8
2
+ module Procemon
3
+
4
+ # load up helpers
5
+
6
+ Dir.glob(\
7
+ File.join(\
8
+ File.dirname(__FILE__),\
9
+ __FILE__.to_s.split(File::Separator).last.split('.')[0],
10
+ '**',"*.{rb,ru}"\
11
+ )\
12
+ ).uniq.sort.each do |one_helper_file|
13
+ load one_helper_file
14
+ end
15
+
16
+
17
+ def self.init_all
18
+
19
+ # process the ARGV parameters
20
+ process_parameters
21
+
22
+ # project name
23
+ set_app_name_by_root_folder
24
+
25
+ # init temporarily directory
26
+ tmpdir_init
27
+
28
+ # create config singleton
29
+ generate_config
30
+
31
+ # load meta-s
32
+ meta_load
33
+
34
+ # mount libs
35
+ mount_libs
36
+
37
+ # mount offline modules
38
+ mount_modules
39
+
40
+ # garbage collect
41
+ ObjectSpace.garbage_collect
42
+
43
+ # documentation generate
44
+ generate_documentation(Application.create_documentation)
45
+
46
+ # Daemonize
47
+ Daemon.init
48
+
49
+ end
50
+
51
+ ### Load the requirements in to the general Module
52
+ #load File.expand_path(File.join(File.dirname(__FILE__),'procemon'
53
+
54
+
55
+ end
@@ -0,0 +1,20 @@
1
+ module Application
2
+ class << self
3
+ attr_accessor :config,
4
+ :environment,
5
+ :tmpdir,
6
+ :daemon_stderr,
7
+ :log,
8
+ :pid,
9
+ :name,
10
+ :db_init,
11
+ :db_drop,
12
+ :daemon,
13
+ :config_file,
14
+ :create_documentation
15
+ end
16
+ self.config= Hash.new()
17
+ self.environment= String.new()
18
+ end
19
+
20
+ App= Application unless defined?(App)
@@ -0,0 +1,84 @@
1
+ module Procemon
2
+ class << self
3
+
4
+
5
+ def process_parameters
6
+ ARGV.each do |one_param|
7
+
8
+ case one_param.downcase
9
+
10
+ when "--debug","-deb"
11
+ $DEBUG= true
12
+
13
+ when "--test","-test"
14
+ $TEST= true
15
+
16
+ when "--database_init","-init"
17
+ Application.db_init= true
18
+
19
+ when "--daemon","-d"
20
+ Application.daemon= "start"
21
+
22
+ when "--kill","-kill"
23
+ Application.daemon= "stop"
24
+
25
+ when "--debuger","-bugger"
26
+ require "debugger"
27
+ debugger
28
+
29
+ when "--config","-c"
30
+ Application.config_file= ARGV[(ARGV.index(one_param)+1)]
31
+
32
+ when "--environment","-e"
33
+ Application.environment= ARGV[(ARGV.index(one_param)+1)]
34
+
35
+ when "--documentation","--generate_documentation","-doc"
36
+ Application.create_documentation= true
37
+
38
+ when "--db_drop","--drop_database","-dbdrop"
39
+ Application.db_drop= true
40
+
41
+ when "-log","--log"
42
+ Application.log= ARGV[(ARGV.index(one_param)+1)]
43
+ Application.daemon_stderr= ARGV[(ARGV.index(one_param)+1)]+"_stderr"
44
+
45
+ when "-pid","--pid"
46
+ Application.log= ARGV[(ARGV.index(one_param)+1)]
47
+
48
+ when "--help","-h","-help","help"
49
+ puts "",["This are trigger a documentation generation and than exit the application:",
50
+ "--documentation",
51
+ "--generate_documentation",
52
+ "-doc","",
53
+ "This is for set target ENV to the Application by name",
54
+ "--environment","-e","",
55
+ "this is for target a config file:",
56
+ "--config","-c","",
57
+ "This is for use debugger (development tool)",
58
+ "--debug","-bug","",
59
+ "This is for start application as a forked background process",
60
+ "--daemon","-d","",
61
+ "This is for drop database data",
62
+ "--db_drop","--drop_database","-dbdrop","",
63
+ "This is for send init command at start up for database",
64
+ "--database_init","-init","",
65
+ "This is for start in debug mode",
66
+ "--debug","-deb","",
67
+ "This is for set pid file location by path",
68
+ "-pid","--pid","",
69
+ "This is for set log file location by path",
70
+ "-log","--log","",
71
+ "This is for to stop daemonized application",
72
+ "--kill","-kill",""
73
+
74
+ ].each{|element| element.include?('--') ? element.gsub!('--',"\t--") : element.gsub!('-',"\t -")}.join("\n"),""
75
+ Process.exit!
76
+
77
+
78
+ end
79
+
80
+ end
81
+
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,188 @@
1
+ # use Daemon.daemonize or Process.daemonize
2
+ class Daemon
3
+
4
+ # Checks to see if the current process is the child process and if not
5
+ # will update the pid file with the child pid.
6
+ def self.start pid, pidfile, outfile, errfile
7
+ unless pid.nil?
8
+ raise "Fork failed" if pid == -1
9
+ write pid, pidfile #if kill pidfile
10
+ exit
11
+ else
12
+ redirect outfile, errfile
13
+ end
14
+ end
15
+
16
+ # Attempts to write the pid of the forked process to the pid file.
17
+ def self.write pid, pidfile
18
+ File.create(pidfile,"w","") if File.exists?(Application.pid)
19
+ File.open pidfile, "a+" do |new_line|
20
+ new_line.write "#{pid}\n"
21
+ end
22
+ rescue ::Exception => e
23
+ $stderr.puts "While writing the PID to file, unexpected #{e.class}: #{e}"
24
+ Process.kill "HUP", pid
25
+ end
26
+
27
+ # Try and read the existing pid from the pid file and signal the
28
+ # process. Returns true for a non blocking status.
29
+ def self.kill(pidfile)
30
+ opid = File.open(File.join".",pidfile).read.strip.to_i
31
+ Process.kill 'HUP', opid.to_i
32
+ true
33
+ rescue Errno::ENOENT
34
+ $stdout.puts "#{pidfile} did not exist: Errno::ENOENT" if $DEBUG
35
+ true
36
+ rescue Errno::ESRCH
37
+ $stdout.puts "The process #{opid} did not exist: Errno::ESRCH" if $DEBUG
38
+ true
39
+ rescue Errno::EPERM
40
+ $stderr.puts "Lack of privileges to manage the process #{opid}: Errno::EPERM" if $DEBUG
41
+ false
42
+ rescue ::Exception => e
43
+ $stderr.puts "While signaling the PID, unexpected #{e.class}: #{e}" if $DEBUG
44
+ false
45
+ end
46
+
47
+ # Send stdout and stderr to log files for the child process
48
+ def self.redirect outfile, errfile
49
+ $stdin.reopen File.join('','dev','null')
50
+ out = File.new outfile, "a"
51
+ err = File.new errfile, "a"
52
+ $stdout.reopen out
53
+ $stderr.reopen err
54
+ $stdout.sync = $stderr.sync = true
55
+ end
56
+
57
+ def self.daemonize
58
+
59
+ pid_path= nil
60
+ log_path= nil
61
+ daemon_stderr= nil
62
+
63
+ begin
64
+ File.create Application.pid,'a+'
65
+ File.create Application.log,'a+'
66
+ File.create Application.daemon_stderr,'a+'
67
+
68
+ pid_path= Application.pid
69
+ log_path= Application.log
70
+ daemon_stderr= Application.daemon_stderr
71
+ rescue Exception
72
+ File.create File.join(Dir.pwd, "pid", "pidfile" ),'a+'
73
+ File.create File.join(Dir.pwd, "log", "logfile" ),'a+'
74
+ File.create File.join(Dir.pwd, "log", "daemon_stderr" ),'a+'
75
+
76
+ pid_path= File.join(Dir.pwd, "pid", "pidfile" )
77
+ log_path= File.join(Dir.pwd, "log", "logfile" )
78
+ daemon_stderr= File.join(Dir.pwd, "log", "daemon_stderr" )
79
+ end
80
+
81
+ Daemon.start(fork,pid_path,log_path,daemon_stderr)
82
+
83
+ end
84
+
85
+ def self.kill_with_pid
86
+ begin
87
+ if File.exists?(Application.pid)
88
+ puts "PidFile found, processing..." if $DEBUG
89
+ File.open(Application.pid).each_line do |row|
90
+ begin
91
+ Process.kill 'TERM', row.chomp.to_i
92
+ puts "terminated process at: #{row.chomp}" if $DEBUG
93
+ rescue Exception => ex
94
+ puts "At process: #{row.chomp}, #{ex}" if $DEBUG
95
+ end
96
+ end
97
+ else
98
+ system "ps -ef | grep #{$0}"
99
+ #system "netstat --listen"
100
+ #puts "\nLepton is around 10300-10399"
101
+ end
102
+ rescue Exception => ex
103
+ puts "Exception has occured: #{ex}"
104
+ end
105
+ end
106
+
107
+ def self.terminate
108
+ Daemon.kill Application.pid
109
+ Daemon.kill_with_pid
110
+ end
111
+
112
+ def self.kill_by_name(*args)
113
+
114
+ target_name= nil
115
+ debug_mod = false
116
+
117
+ args.each do |one_element|
118
+ if one_element.class == String
119
+ target_name = one_element
120
+ elsif one_element.class == TrueClass || one_element.class == FalseClass
121
+ debug_mod = one_element
122
+ end
123
+ end
124
+
125
+ # name switch
126
+ begin
127
+ target_name ||= $0
128
+ $0 = "ruby_tmp_process"
129
+ end
130
+
131
+ start_time= Time.now
132
+ while `ps aux | grep #{target_name}`.split(' ')[1] != "" ||(Time.now - start_time) < 6
133
+
134
+ begin
135
+
136
+ Process.kill "TERM",`ps aux | grep #{target_name}`.split(' ')[1].to_i
137
+
138
+ rescue Errno::ESRCH
139
+ $stdout.puts "The process #{target_name} did not exist: Errno::ESRCH" if debug_mod
140
+ break
141
+ rescue Errno::EPERM
142
+ $stderr.puts "Lack of privileges to manage the process #{target_name}: Errno::EPERM" if debug_mod
143
+ break
144
+ rescue ::Exception => e
145
+ $stderr.puts "While signaling the PID, unexpected #{e.class}: #{e}" if debug_mod
146
+ break
147
+ end
148
+ end
149
+
150
+
151
+ # name switch back
152
+ begin
153
+ $0 = target_name
154
+ end
155
+
156
+ return nil
157
+ end
158
+
159
+ def self.stop
160
+
161
+ # kill methods
162
+ begin
163
+ self.kill_by_name true
164
+ self.terminate
165
+ end
166
+
167
+ pid_path= nil
168
+ begin
169
+ pid_path= Application.pid
170
+ rescue Exception
171
+ pid_path= File.join(Dir.pwd, "pid", "pidfile" )
172
+ end
173
+
174
+ File.open(pid_path, "w").write("")
175
+ Process.exit!
176
+
177
+ end
178
+
179
+ def self.init
180
+ case Application.daemon.to_s.downcase
181
+ when "true","start"
182
+ self.daemonize
183
+ when "stop"
184
+ self.stop
185
+ end
186
+ end
187
+
188
+ end
@@ -0,0 +1,10 @@
1
+ class String
2
+ def find_doc_part(oth_str)
3
+ self.each_line do |target_line|
4
+ puts target_line[0..(oth_str.length-1)]
5
+ if target_line[0..(oth_str.length-1)] == oth_str
6
+ return target_line[(oth_str.length)..(target_line.length)]
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,76 @@
1
+ module Kernel
2
+
3
+ # safe_eval(string [, binding [, filename [,lineno]]] *allowed_class/module_names ) -> obj
4
+ #
5
+ # Evaluates the Ruby expression(s) in <em>string</em>. If
6
+ # <em>binding</em> is given, which must be a <code>Binding</code>
7
+ # object, the evaluation is performed in its context. If the
8
+ # optional <em>filename</em> and <em>lineno</em> parameters are
9
+ # present, they will be used when reporting syntax errors.
10
+ #
11
+ # def get_binding(str)
12
+ # return binding
13
+ # end
14
+ # str = "hello"
15
+ # safe_eval "str + ' Fred'" ,Kernel #=> "hello Fred"
16
+ # safe_eval "str + ' Fred'", get_binding("bye") ,Kernel #=> "bye Fred"
17
+ def safe_eval(*args)
18
+
19
+ # defaults
20
+ begin
21
+ allowed= Array.new
22
+ eval_exception= String.new
23
+ tmp_array= nil
24
+ end
25
+
26
+ # separate allowed names
27
+ begin
28
+ tmp_array= Array.new
29
+ args.each do |argument|
30
+ case argument.class.to_s.downcase
31
+
32
+ when "class","module"
33
+ begin
34
+ allowed.push argument
35
+ end
36
+
37
+ else
38
+ begin
39
+ tmp_array.push argument
40
+ end
41
+
42
+ end
43
+ end
44
+ args= tmp_array
45
+ end
46
+
47
+ # build exception list to eval
48
+ begin
49
+ allowed.each do |one_name|
50
+ eval_exception += "|"+one_name.to_s
51
+ end
52
+ end
53
+
54
+ # trim un wanted elements from string
55
+ begin
56
+ args.each do |argument|
57
+ case argument.class.to_s.downcase
58
+
59
+ when "string"
60
+ begin
61
+ #TODO new regex! # /(\b|\.|\{|\>)[A-Z]\w*/
62
+ #args[args.index(argument)]= argument.gsub( /(\b|\.|\{|\>)[A-Z]\w*/ ,'')
63
+ end
64
+
65
+ end
66
+ end
67
+ end
68
+
69
+ # do save eval
70
+ begin
71
+ eval(*args)
72
+ end
73
+
74
+ end if $DEBUG == true
75
+
76
+ end
@@ -0,0 +1,74 @@
1
+ class Class
2
+
3
+ # this will inject a code block to a target instance method
4
+ # by default the before or after sym is not required
5
+ # default => before
6
+ #
7
+ # Test.inject_singleton_method :hello do |*args|
8
+ # puts "singleton extra, so #{args[0]}"
9
+ # end
10
+ #
11
+ def inject_singleton_method(method,options=:before,&block)
12
+
13
+ original_method= self.method(method).clone
14
+ #Singleton.methods[self.object_id]= self.method(method)
15
+ self.singleton_class.__send__ :undef_method, method
16
+ self.class_eval do
17
+ define_singleton_method method do |*arguments|
18
+ case true
19
+
20
+ when options == :before
21
+ begin
22
+ block.call *arguments
23
+ original_method.call *arguments
24
+ end
25
+
26
+ when options == :after
27
+ begin
28
+ original_method.call *arguments
29
+ block.call *arguments
30
+ end
31
+
32
+ end
33
+ end
34
+ end
35
+
36
+ end
37
+
38
+ # this will inject a code block to a target singleton method
39
+ # by default the before or after sym is not required
40
+ # default => before
41
+ #
42
+ # Test.inject_instance_method :hello, :before do |*args|
43
+ # puts "singleton on a instance method and "+args[0]
44
+ # end
45
+ #
46
+ def inject_instance_method(method,options=:before,&block)
47
+ self.class_eval do
48
+ alias_method :"old_#{method.to_s}", method
49
+ end
50
+ extended_process = Proc.new do |*args|
51
+
52
+ case true
53
+
54
+ when options == :before
55
+ begin
56
+ block.call *args
57
+ self.__send__ :"old_#{method.to_s}", *args
58
+ end
59
+
60
+ when options == :after
61
+ begin
62
+ self.__send__ :"old_#{method.to_s}", *args
63
+ block.call *args
64
+ end
65
+
66
+ end
67
+
68
+ end
69
+ self.class_eval do
70
+ define_method method, extended_process#Proc call
71
+ end
72
+ end
73
+
74
+ end