procemon 1.2.1 → 2.0.0
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 +4 -4
- data/.document +5 -0
- data/.gitignore +9 -0
- data/Gemfile.lock +5 -5
- data/README.md +63 -46
- data/VERSION +1 -1
- data/examples/test.rb +48 -0
- data/lib/procemon.rb +4 -38
- data/lib/procemon/eval.rb +75 -0
- data/lib/procemon/{function/meta/inject_methods.rb → hooks.rb} +2 -2
- data/procemon.gemspec +4 -8
- data/test/test.rb +28 -2
- metadata +12 -31
- data/examples/how_to_inject_with_extra_process_a_method.rb +0 -38
- data/examples/require_files.rb +0 -3
- data/files.rb +0 -24
- data/lib/procemon/extra/sender.rb +0 -30
- data/lib/procemon/extra/str2duck.rb +0 -7
- data/lib/procemon/function/application.rb +0 -27
- data/lib/procemon/function/argv.rb +0 -78
- data/lib/procemon/function/daemon.rb +0 -188
- data/lib/procemon/function/documentation.rb +0 -14
- data/lib/procemon/function/file.rb +0 -67
- data/lib/procemon/function/generate.rb +0 -202
- data/lib/procemon/function/macaddr.rb +0 -97
- data/lib/procemon/function/meta/eval.rb +0 -76
- data/lib/procemon/function/name.rb +0 -13
- data/lib/procemon/function/port.rb +0 -35
- data/lib/procemon/function/tmp_dir.rb +0 -21
- data/lib/procemon/process.rb +0 -17
@@ -1,38 +0,0 @@
|
|
1
|
-
require_relative "../lib/procemon.rb"
|
2
|
-
|
3
|
-
class TestT
|
4
|
-
|
5
|
-
def self.test
|
6
|
-
puts self
|
7
|
-
end
|
8
|
-
|
9
|
-
def test string
|
10
|
-
puts self,string
|
11
|
-
end
|
12
|
-
|
13
|
-
end
|
14
|
-
|
15
|
-
TestT.inject_instance_method :test do |str|
|
16
|
-
|
17
|
-
puts "hello world! instance "+str
|
18
|
-
|
19
|
-
end
|
20
|
-
|
21
|
-
TestT.inject_singleton_method :test, add: "after" do
|
22
|
-
puts "hello world! singleton"
|
23
|
-
end
|
24
|
-
|
25
|
-
puts "---\nafter,singleton case:"
|
26
|
-
TestT.test
|
27
|
-
|
28
|
-
puts "---\nbefore,instance case:"
|
29
|
-
TestT.new.test "boogie man"
|
30
|
-
|
31
|
-
|
32
|
-
#after,singleton case:
|
33
|
-
#TestT
|
34
|
-
#hello world! singleton
|
35
|
-
#
|
36
|
-
#before,instance case:
|
37
|
-
#hello world! instance
|
38
|
-
##<TestT:0x00000000d4a008>
|
data/examples/require_files.rb
DELETED
data/files.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
### Get Files from dir
|
2
|
-
begin
|
3
|
-
|
4
|
-
files_to_be_loaded = %w[version.rb]
|
5
|
-
|
6
|
-
SpecFiles= Array.new
|
7
|
-
|
8
|
-
Dir[File.expand_path(File.join(File.dirname(__FILE__),"**","*"))].sort.uniq.each do |one_file_name|
|
9
|
-
one_file_name = File.expand_path one_file_name
|
10
|
-
file_name = one_file_name[(File.expand_path(File.dirname(__FILE__)).to_s.length+1)..(one_file_name.length-1)]
|
11
|
-
|
12
|
-
if !one_file_name.include?("pkg")
|
13
|
-
if !File.directory? file_name
|
14
|
-
SpecFiles.push file_name
|
15
|
-
STDOUT.puts file_name if $DEBUG
|
16
|
-
if files_to_be_loaded.include? one_file_name.split(File::SEPARATOR).last
|
17
|
-
load one_file_name
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Kernel
|
2
|
-
|
3
|
-
def sender
|
4
|
-
sender_properties= Hash.new
|
5
|
-
# File system
|
6
|
-
begin
|
7
|
-
# folder create from caller
|
8
|
-
begin
|
9
|
-
folder= caller[0].split(".{rb,ru}:").first.split(File::SEPARATOR)
|
10
|
-
sender_properties[:file]= folder[(folder.count-1)].split(':')[0]
|
11
|
-
folder= folder[0..(folder.count-2)]
|
12
|
-
end
|
13
|
-
# after formatting
|
14
|
-
begin
|
15
|
-
|
16
|
-
if !File.directory?(folder.join(File::SEPARATOR))
|
17
|
-
folder.pop
|
18
|
-
end
|
19
|
-
folder= File.join(folder.join(File::SEPARATOR))
|
20
|
-
if folder != File.expand_path(folder)
|
21
|
-
folder= File.expand_path(folder)
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|
25
|
-
sender_properties[:folder]= folder
|
26
|
-
end
|
27
|
-
return sender_properties
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module Application
|
2
|
-
|
3
|
-
class << self
|
4
|
-
attr_accessor :config,
|
5
|
-
:environment,
|
6
|
-
:tmpdir,
|
7
|
-
:daemon_stderr,
|
8
|
-
:log,
|
9
|
-
:pid,
|
10
|
-
:name,
|
11
|
-
:db_init,
|
12
|
-
:db_drop,
|
13
|
-
:daemon,
|
14
|
-
:config_file,
|
15
|
-
:doc,
|
16
|
-
:client
|
17
|
-
end
|
18
|
-
|
19
|
-
self.client ||= Hash.new()
|
20
|
-
self.config ||= Hash.new()
|
21
|
-
self.environment ||= String.new()
|
22
|
-
|
23
|
-
self.doc ||= false
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
App= Application unless defined?(App)
|
@@ -1,78 +0,0 @@
|
|
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 "--config","-c"
|
26
|
-
Application.config_file= ARGV[(ARGV.index(one_param)+1)]
|
27
|
-
|
28
|
-
when "--environment","-e"
|
29
|
-
Application.environment= ARGV[(ARGV.index(one_param)+1)]
|
30
|
-
|
31
|
-
when "--documentation","--generate_documentation","-doc"
|
32
|
-
Application.doc= true
|
33
|
-
|
34
|
-
when "--db_drop","--drop_database","-dbdrop"
|
35
|
-
Application.db_drop= true
|
36
|
-
|
37
|
-
when "-log","--log"
|
38
|
-
Application.log= ARGV[(ARGV.index(one_param)+1)]
|
39
|
-
Application.daemon_stderr= ARGV[(ARGV.index(one_param)+1)]+"_stderr"
|
40
|
-
|
41
|
-
when "-pid","--pid"
|
42
|
-
Application.log= ARGV[(ARGV.index(one_param)+1)]
|
43
|
-
|
44
|
-
when "--help","-h","-help","help"
|
45
|
-
puts "",["This are trigger a documentation generation and than exit the application:",
|
46
|
-
"--documentation",
|
47
|
-
"--generate_documentation",
|
48
|
-
"-doc","",
|
49
|
-
"This is for set target ENV to the Application by name",
|
50
|
-
"--environment","-e","",
|
51
|
-
"this is for target a config file:",
|
52
|
-
"--config","-c","",
|
53
|
-
"This is for start application as a forked background process",
|
54
|
-
"--daemon","-d","",
|
55
|
-
"This is for drop database data",
|
56
|
-
"--db_drop","--drop_database","-dbdrop","",
|
57
|
-
"This is for send init command at start up for database",
|
58
|
-
"--database_init","-init","",
|
59
|
-
"This is for start in debug mode",
|
60
|
-
"--debug","-deb","",
|
61
|
-
"This is for set pid file location by path",
|
62
|
-
"-pid","--pid","",
|
63
|
-
"This is for set log file location by path",
|
64
|
-
"-log","--log","",
|
65
|
-
"This is for to stop daemonized application",
|
66
|
-
"--kill","-kill",""
|
67
|
-
|
68
|
-
].each{|element| element.include?('--') ? element.gsub!('--',"\t--") : element.gsub!('-',"\t -")}.join("\n"),""
|
69
|
-
Process.exit!
|
70
|
-
|
71
|
-
|
72
|
-
end
|
73
|
-
|
74
|
-
end
|
75
|
-
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
@@ -1,188 +0,0 @@
|
|
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
|
@@ -1,14 +0,0 @@
|
|
1
|
-
class String
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
def find_doc_part(oth_str)
|
6
|
-
self.each_line do |target_line|
|
7
|
-
puts target_line[0..(oth_str.length-1)]
|
8
|
-
if target_line[0..(oth_str.length-1)] == oth_str
|
9
|
-
return target_line[(oth_str.length)..(target_line.length)]
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|
@@ -1,67 +0,0 @@
|
|
1
|
-
class File
|
2
|
-
|
3
|
-
# create a file, if not exsist create file, and dir if needed
|
4
|
-
def self.create(route_name ,filemod="w",string_data= ::String.new )
|
5
|
-
|
6
|
-
#file_name generate
|
7
|
-
if !route_name.to_s.split(File::SEPARATOR).last.nil? || route_name.to_s.split(File::SEPARATOR).last != ''
|
8
|
-
file_name = route_name.to_s.split(File::SEPARATOR).last
|
9
|
-
else
|
10
|
-
file_name = nil?
|
11
|
-
end
|
12
|
-
|
13
|
-
#path_way
|
14
|
-
begin
|
15
|
-
raise ::ArgumentError, "missing route_name: #{route_name}" if route_name.nil?
|
16
|
-
path = File.expand_path(route_name).to_s.split(File::SEPARATOR)
|
17
|
-
path = path - [File.expand_path(route_name).to_s.split(File::SEPARATOR).last]
|
18
|
-
path.shift
|
19
|
-
end
|
20
|
-
|
21
|
-
#job
|
22
|
-
begin
|
23
|
-
if !::Dir.exists?(File::SEPARATOR+path.join(File::SEPARATOR))
|
24
|
-
|
25
|
-
at_now = File::SEPARATOR
|
26
|
-
path.each do |dir_to_be_checked|
|
27
|
-
|
28
|
-
at_now += "#{dir_to_be_checked+File::SEPARATOR}"
|
29
|
-
::Dir.mkdir(at_now) if !::Dir.exists?(at_now)
|
30
|
-
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
# write data
|
36
|
-
begin
|
37
|
-
full_path = "#{File::SEPARATOR+path.join(File::SEPARATOR)+File::SEPARATOR}#{file_name}"
|
38
|
-
if File.exist? full_path
|
39
|
-
File.open(full_path,filemod).write string_data
|
40
|
-
else
|
41
|
-
File.new(full_path,filemod).write string_data
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
# start read the file object on each line
|
48
|
-
# optionable an integer value to start read line at
|
49
|
-
# compatible with mac (i am linux user, so not tested)
|
50
|
-
def each_line_from(start_at=1,&block)
|
51
|
-
unless [::Integer,Fixnum,Bignum].include?(start_at.class)
|
52
|
-
raise ::ArgumentError, "invalid line index"
|
53
|
-
end
|
54
|
-
begin
|
55
|
-
line_num= 1
|
56
|
-
text= self.read
|
57
|
-
text.gsub!(/\r\n?/, "\n")
|
58
|
-
text.each_line do |*line|
|
59
|
-
if line_num >= start_at
|
60
|
-
block.call #*line
|
61
|
-
end
|
62
|
-
line_num += 1
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|