dctl 1.0.2 → 1.0.3

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 CHANGED
@@ -1,3 +1,12 @@
1
+ *1.0.3* (20th April, 2005) Bruno Carnazzi <mailto:bcarnazzi@gmail.com>
2
+ * added a new daemon state : unhandled
3
+ * status with no arg gives all daemon states
4
+ * status is the default command when no command is given
5
+ * status can handle multiple args, each as a daemon to check
6
+ * environment variables DCTL_DIR, DCTL_IN, DCTL_OUT, DCTL_ERR now override defaults
7
+ * strongly refactored command hierarchy
8
+ * added some examples
9
+
1
10
  *1.0.2* (18th April, 2005) Bruno Carnazzi <mailto:bcarnazzi@gmail.com>
2
11
  * better gem dependency support for cmdparse (>=1.0.1 required)
3
12
  * added a check for incomplete command
data/README CHANGED
@@ -9,7 +9,7 @@ It is designed to be small and smart ("less-is-more" philosophy), generic, and w
9
9
  Major features:
10
10
  * Convert any executable file with endless lifecycle into a controllable daemon
11
11
  * Automatic handling of pidfiles
12
- * Command-oriented style (dctl requires cmdparser)
12
+ * Command-oriented style (dctl requires cmdparser >= 1.0.1)
13
13
 
14
14
 
15
15
  == Examples
@@ -17,12 +17,15 @@ Major features:
17
17
  === Start a daemon with redirection of stdout in file 'out'
18
18
  % dctl start -oout test/infinite.sh
19
19
 
20
- === Get the status of a daemon
21
- % dctl status test/infinite.sh
20
+ === Get the status of some daemons (here, infinite.sh and sleep)
21
+ % dctl status test/infinite.sh sleep
22
22
 
23
23
  === Stop a daemon
24
24
  % dctl stop test/infinite.sh
25
25
 
26
+ === Get the status of all daemons
27
+ % dctl
28
+
26
29
 
27
30
  == Download
28
31
 
data/TODO CHANGED
@@ -3,3 +3,4 @@
3
3
  - write a 'status' command -> DONE (05/04/05)
4
4
  - write a 'rakefile' -> DONE (08/04/05)
5
5
  - package as a gem -> DONE (08/04/05)
6
+ - handle of YAML configuration files per daemon
@@ -7,7 +7,7 @@ class DctlApp
7
7
  begin
8
8
  Dctl::CommandLineParser.parse!(File.basename($0, '.*'), ARGV)
9
9
  rescue
10
- puts $!
10
+ puts $!.to_s.gsub(/:\W*$/, '.')
11
11
  puts 'Use -h or --help for usage.'
12
12
  exit 1
13
13
  end
@@ -31,7 +31,7 @@ module Dctl
31
31
  cmd_parser.add_command Dctl::Command::RunCommand.new
32
32
  cmd_parser.add_command Dctl::Command::RestartCommand.new
33
33
  cmd_parser.add_command Dctl::Command::ZapCommand.new
34
- cmd_parser.add_command Dctl::Command::StatusCommand.new
34
+ cmd_parser.add_command Dctl::Command::StatusCommand.new, true
35
35
  cmd_parser.add_command CommandParser::HelpCommand.new
36
36
  cmd_parser.add_command CommandParser::VersionCommand.new
37
37
 
@@ -14,9 +14,15 @@ module Dctl
14
14
  # This module contains all possible commands allowed by Dctl
15
15
  module Command
16
16
 
17
- # This module is used by command that redirect their standard io streams.
18
- module Redirectible
19
- def std_init
17
+ class SmartCommand < CommandParser::Command
18
+ def initialize
19
+ super self.class.to_s.gsub(/\w+::/, '').gsub(/Command$/, '').downcase
20
+ end
21
+ end
22
+
23
+ class RedirectibleCommand < SmartCommand
24
+ def initialize
25
+ super
20
26
  @stdin = $IN
21
27
  @stdout = $OUT
22
28
  @stderr = $ERR
@@ -26,15 +32,15 @@ module Dctl
26
32
  options.on('-e', '--stderr FILE', "Use FILE as stderr when daemonized (default is '#{@stderr}').") { |@stderr| }
27
33
  end
28
34
  end
29
-
30
- class StartCommand < CommandParser::Command
31
- include Redirectible
32
35
 
36
+ class NonRedirectibleCommand < SmartCommand
33
37
  def initialize
34
- super 'start'
35
- std_init
38
+ super
39
+ options.separator "Options:"
36
40
  end
37
-
41
+ end
42
+
43
+ class StartCommand < RedirectibleCommand
38
44
  def description
39
45
  'Start a new daemonized instance of a specified application.'
40
46
  end
@@ -46,14 +52,7 @@ module Dctl
46
52
  end
47
53
  end
48
54
 
49
- class RestartCommand < CommandParser::Command
50
- include Redirectible
51
-
52
- def initialize
53
- super 'restart'
54
- std_init
55
- end
56
-
55
+ class RestartCommand < RedirectibleCommand
57
56
  def description
58
57
  'Restart a daemonized instance of a specified application with new arguments.'
59
58
  end
@@ -65,12 +64,7 @@ module Dctl
65
64
  end
66
65
  end
67
66
 
68
- class StopCommand < CommandParser::Command
69
- def initialize
70
- super 'stop'
71
- options.separator "Options:"
72
- end
73
-
67
+ class StopCommand < NonRedirectibleCommand
74
68
  def description
75
69
  'Stop a daemonized instance of a specified application.'
76
70
  end
@@ -81,12 +75,7 @@ module Dctl
81
75
  end
82
76
  end
83
77
 
84
- class ZapCommand < CommandParser::Command
85
- def initialize
86
- super 'zap'
87
- options.separator "Options:"
88
- end
89
-
78
+ class ZapCommand < NonRedirectibleCommand
90
79
  def description
91
80
  "Manually set a daemonized instance of a specified application to 'stopped' state."
92
81
  end
@@ -97,12 +86,7 @@ module Dctl
97
86
  end
98
87
  end
99
88
 
100
- class RunCommand < CommandParser::Command
101
- def initialize
102
- super 'run'
103
- options.separator "Options:"
104
- end
105
-
89
+ class RunCommand < NonRedirectibleCommand
106
90
  def description
107
91
  'Run a new un-daemonized instance of a specified application.'
108
92
  end
@@ -114,19 +98,21 @@ module Dctl
114
98
  end
115
99
  end
116
100
 
117
- class StatusCommand < CommandParser::Command
118
- def initialize
119
- super 'status'
120
- options.separator "Options:"
121
- end
122
-
101
+ class StatusCommand < NonRedirectibleCommand
123
102
  def description
124
- "Get the state of a specified application."
103
+ "Get the state of specified applications (one or more)."
125
104
  end
126
105
 
127
106
  def execute(cmd_parser, args)
128
- cmd = args[0] || raise(OptionParser::MissingArgument)
129
- puts "#{File.basename cmd}: #{Dctl::Daemon.new(cmd, $DIR).status}"
107
+ if args.length > 0
108
+ args.each { |cmd| puts status(cmd) rescue puts $! }
109
+ else
110
+ Dir[File.join($DIR, '*.pid')].collect { |p| File.basename(p, '.*')}.each { |cmd| puts status(cmd) } # BUG ! if cmd not in PATH !
111
+ end
112
+ end
113
+
114
+ def status(cmd)
115
+ "#{cmd}: #{File.basename(Dctl::Daemon.new(cmd, $DIR, false).status.id2name)}"
130
116
  end
131
117
  end
132
118
 
@@ -7,11 +7,13 @@ module Dctl
7
7
  class Daemon
8
8
  include Daemonize
9
9
 
10
- def initialize(cmd, pidpath)
11
- @app_path = Daemon::which(cmd) || File.expand_path(cmd)
12
- raise Errno::EISDIR, @app_path if File.directory? @app_path
13
- raise Errno::ENOENT, @app_path until File.file? @app_path
14
- raise Errno::EACCES, @app_path until File.executable? @app_path
10
+ def initialize(cmd, pidpath, check=true)
11
+ @app_path = File.expand_path(Daemon::which(cmd) || cmd)
12
+ if check
13
+ raise Errno::EISDIR, @app_path if File.directory? @app_path
14
+ raise Errno::ENOENT, @app_path until File.file? @app_path
15
+ raise Errno::EACCES, @app_path until File.executable? @app_path
16
+ end
15
17
  @pidfile = PidFile.new pidpath, File.basename(cmd)
16
18
  end
17
19
 
@@ -45,8 +47,9 @@ module Dctl
45
47
  end
46
48
 
47
49
  def status
48
- Process.kill 0, @pidfile.read rescue return "not running"
49
- "running"
50
+ (pid = @pidfile.read) rescue return :unhandled
51
+ Process.kill 0, pid rescue return :not_running
52
+ :running
50
53
  end
51
54
  end
52
55
 
@@ -1,7 +1,7 @@
1
1
  # This file contains Dctl default values.
2
2
 
3
- $DIR = Process.uid == 0 ? '/var/run' : '.'
3
+ $DIR = ENV['DCTL_DIR'] || (Process.uid == 0 ? '/var/run' : '.')
4
4
 
5
- $IN = '/dev/null'
6
- $OUT = '/dev/null'
7
- $ERR = '/dev/null'
5
+ $IN = ENV['DCTL_IN'] || '/dev/null'
6
+ $OUT = ENV['DCTL_OUT'] || '/dev/null'
7
+ $ERR = ENV['DCTL_ERR'] || '/dev/null'
@@ -1,6 +1,6 @@
1
1
  # This file contains informations about Dctl current release.
2
2
 
3
3
  module Dctl
4
- VERSION = [1, 0, 2]
4
+ VERSION = [1, 0, 3]
5
5
  RELEASE = 'Leonard release'
6
6
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.10
3
3
  specification_version: 1
4
4
  name: dctl
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.0.2
7
- date: 2005-04-18
6
+ version: 1.0.3
7
+ date: 2005-04-20
8
8
  summary: "dctl - a daemon controller written in Ruby"
9
9
  require_paths:
10
10
  - lib