dctl 1.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.
- data/CHANGELOG +14 -0
- data/README +63 -0
- data/Rakefile +211 -0
- data/TODO +5 -0
- data/bin/dctl +9 -0
- data/lib/dctl.rb +19 -0
- data/lib/dctl/cmdparser.rb +42 -0
- data/lib/dctl/command.rb +135 -0
- data/lib/dctl/daemon.rb +51 -0
- data/lib/dctl/daemonize.rb +143 -0
- data/lib/dctl/defaults.rb +7 -0
- data/lib/dctl/metainf.rb +6 -0
- data/lib/dctl/pidfile.rb +53 -0
- data/setup.rb +1360 -0
- data/test/daemon_test.rb +41 -0
- data/test/daemonize_test.rb +79 -0
- data/test/dctl_test.rb +7 -0
- data/test/infinite.sh +7 -0
- data/test/pidfile_test.rb +52 -0
- data/test/redirection_test.sh +5 -0
- metadata +74 -0
data/test/daemon_test.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'dctl/daemon'
|
5
|
+
|
6
|
+
class DaemonTest < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def teardown
|
9
|
+
Dir['*.pid'].each { |f| File::delete f }
|
10
|
+
end
|
11
|
+
|
12
|
+
def setup
|
13
|
+
teardown
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_which
|
17
|
+
assert_equal '/usr/bin/env', Dctl::Daemon.which('env')
|
18
|
+
assert_nil Dctl::Daemon.which('idontexist')
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_run
|
22
|
+
assert_raise(Errno::ENOENT) { Dctl::Daemon.new('idontexist', '.').run }
|
23
|
+
assert_raise(Errno::EACCES) { Dctl::Daemon.new('/bin', '.').run }
|
24
|
+
assert_raise(Errno::EACCES) { Dctl::Daemon.new('/etc/passwd', '.').run }
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_stop
|
28
|
+
fork { Dctl::Daemon.new('test/infinite.sh', '.').start }
|
29
|
+
sleep 1
|
30
|
+
assert_nothing_thrown { Dctl::Daemon.new('test/infinite.sh', '.').stop }
|
31
|
+
assert Dir['*.pid'].empty?
|
32
|
+
assert_raise(Errno::ENOENT) { Dctl::Daemon.new('test/infinite.sh', '.').stop }
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_concurrent
|
36
|
+
puts '1' ; fork { Dctl::Daemon.new('test/infinite.sh', '.').start }
|
37
|
+
puts '2' ; assert_raise(Errno::EEXIST) { Dctl::Daemon.new('test/infinite.sh', '.').run }
|
38
|
+
puts '3' ; assert_nothing_thrown { Dctl::Daemon.new('test/infinite.sh', '.').stop }
|
39
|
+
assert Dir['*.pid'].empty?
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'dctl/daemonize'
|
5
|
+
|
6
|
+
class DaemonizeTest < Test::Unit::TestCase
|
7
|
+
include Daemonize
|
8
|
+
|
9
|
+
Input = 'in'
|
10
|
+
In_message = 'This is stdin.'
|
11
|
+
Output = 'out'
|
12
|
+
Out_message = 'This is stdout.'
|
13
|
+
Error = 'err'
|
14
|
+
Err_message = 'This is stderr.'
|
15
|
+
Pid_file = File.expand_path 'test/pidfile.pid'
|
16
|
+
|
17
|
+
def setup
|
18
|
+
File.open(Input, "w") { |f| f << In_message }
|
19
|
+
File.open(Output, "w").close
|
20
|
+
File.open(Error, "w").close
|
21
|
+
end
|
22
|
+
|
23
|
+
def teardown
|
24
|
+
File::delete Input
|
25
|
+
File::delete Output
|
26
|
+
File::delete Error
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_ruby_daemonize_redirection
|
30
|
+
fork {
|
31
|
+
daemonize(Input, Output, Error)
|
32
|
+
# stdin redirection does not work.
|
33
|
+
# print gets
|
34
|
+
print "This is stdout."
|
35
|
+
$stderr.print "This is stderr."
|
36
|
+
exit
|
37
|
+
}
|
38
|
+
sleep 1
|
39
|
+
|
40
|
+
inp = File.open(Input) { |f| f.read }
|
41
|
+
out = File.open(Output) { |f| f.read }
|
42
|
+
err = File.open(Error) { |f| f.read }
|
43
|
+
|
44
|
+
assert_equal(In_message, inp)
|
45
|
+
assert_equal(Out_message, out)
|
46
|
+
assert_equal(Err_message, err)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_executable_daemonize_redirection
|
50
|
+
fork {
|
51
|
+
executable = File.expand_path 'test/redirection_test.sh'
|
52
|
+
daemonize(Input, Output, Error)
|
53
|
+
exec executable
|
54
|
+
}
|
55
|
+
sleep 1
|
56
|
+
|
57
|
+
inp = File.open(Input) { |f| f.read }
|
58
|
+
out = File.open(Output) { |f| f.read }
|
59
|
+
err = File.open(Error) { |f| f.read.chomp }
|
60
|
+
|
61
|
+
assert_equal(In_message, inp)
|
62
|
+
assert_equal(In_message, out)
|
63
|
+
assert_equal(Err_message, err)
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_new_daemon
|
67
|
+
fork {
|
68
|
+
Daemonize
|
69
|
+
File.open(Pid_file, 'w') { |f| f << $$ }
|
70
|
+
loop {}
|
71
|
+
}
|
72
|
+
sleep 3
|
73
|
+
pid = File.open(Pid_file) { |f| Integer(f.read) }
|
74
|
+
puts(system("ps -ax | grep #{pid}"))
|
75
|
+
assert_nothing_thrown { Process.kill("SIGTERM", pid) }
|
76
|
+
File::delete Pid_file
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
data/test/dctl_test.rb
ADDED
data/test/infinite.sh
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'dctl/pidfile'
|
5
|
+
|
6
|
+
class PidFileTest < Test::Unit::TestCase
|
7
|
+
include Daemonize
|
8
|
+
Path = '.'
|
9
|
+
Name = 'testfile'
|
10
|
+
|
11
|
+
def teardown
|
12
|
+
PidFile.new(Path, Name).delete rescue nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_no_such_path1
|
16
|
+
assert_raise(Errno::ENOENT) { PidFile.new('/no/such/path', Name) }
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_no_such_path2
|
20
|
+
assert_raise(Errno::ENOTDIR) { PidFile.new('/usr/bin/env', Name) }
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_writable_path
|
24
|
+
assert_raise(Errno::EACCES) { PidFile.new('/etc', Name) }
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_no_such_file1
|
28
|
+
pf1 = PidFile.new Path, Name
|
29
|
+
assert_raise(Errno::ENOENT) { pf1.read }
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_no_such_file2
|
33
|
+
pf1 = PidFile.new Path, Name
|
34
|
+
assert_raise(Errno::ENOENT) { pf1.delete }
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_unique_instance
|
38
|
+
pf1 = PidFile.new Path, Name
|
39
|
+
pf2 = PidFile.new Path, Name
|
40
|
+
pf1.write
|
41
|
+
assert_raise(Errno::EEXIST) { pf2.write }
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_readable_file
|
45
|
+
pf1 = PidFile.new Path, Name
|
46
|
+
pf1.write
|
47
|
+
pid = nil
|
48
|
+
assert_nothing_thrown { pid = pf1.read }
|
49
|
+
assert_instance_of Fixnum, pid
|
50
|
+
assert_equal $$, pid
|
51
|
+
end
|
52
|
+
end
|
metadata
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.8.10
|
3
|
+
specification_version: 1
|
4
|
+
name: dctl
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 1.0.0
|
7
|
+
date: 2005-04-07
|
8
|
+
summary: "dctl - a daemon controller written in Ruby"
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: bcarnazzi@gmail.com
|
12
|
+
homepage: http://rubyforge.org/project/dctl/
|
13
|
+
rubyforge_project: dctl
|
14
|
+
description: "dctl is a small script for providing daemon functionnalty (start, stop, ...) to
|
15
|
+
non-daemon process or script, with automatic handling of pidfiles."
|
16
|
+
autorequire: dctl
|
17
|
+
default_executable:
|
18
|
+
bindir: bin
|
19
|
+
has_rdoc: true
|
20
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
21
|
+
requirements:
|
22
|
+
-
|
23
|
+
- ">"
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: 0.0.0
|
26
|
+
version:
|
27
|
+
platform: ruby
|
28
|
+
authors:
|
29
|
+
- Bruno Carnazzi
|
30
|
+
files:
|
31
|
+
- Rakefile
|
32
|
+
- setup.rb
|
33
|
+
- README
|
34
|
+
- TODO
|
35
|
+
- CHANGELOG
|
36
|
+
- lib/dctl
|
37
|
+
- lib/dctl.rb
|
38
|
+
- lib/dctl/cmdparser.rb
|
39
|
+
- lib/dctl/command.rb
|
40
|
+
- lib/dctl/daemon.rb
|
41
|
+
- lib/dctl/daemonize.rb
|
42
|
+
- lib/dctl/defaults.rb
|
43
|
+
- lib/dctl/metainf.rb
|
44
|
+
- lib/dctl/pidfile.rb
|
45
|
+
- bin/dctl
|
46
|
+
- test/daemon_test.rb
|
47
|
+
- test/daemonize_test.rb
|
48
|
+
- test/dctl_test.rb
|
49
|
+
- test/infinite.sh
|
50
|
+
- test/pidfile_test.rb
|
51
|
+
- test/redirection_test.sh
|
52
|
+
test_files: []
|
53
|
+
rdoc_options:
|
54
|
+
- "--main"
|
55
|
+
- README
|
56
|
+
extra_rdoc_files:
|
57
|
+
- README
|
58
|
+
- TODO
|
59
|
+
- CHANGELOG
|
60
|
+
executables:
|
61
|
+
- dctl
|
62
|
+
extensions: []
|
63
|
+
requirements: []
|
64
|
+
dependencies:
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: cmdparse
|
67
|
+
version_requirement:
|
68
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
69
|
+
requirements:
|
70
|
+
-
|
71
|
+
- "="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: 1.0.0
|
74
|
+
version:
|