goto :end\r
\r
#!ruby\r
-require 'yaml'\r
+require 'service'\r
require 'win32/service'\r
require 'windows/authorization'\r
require 'highline/import'\r
\r
module Command\r
def install\r
- service_names.each {|name|\r
- if (Win32::Service.status(name) rescue nil)\r
+ Service.names.each {|name|\r
+ if Service.exists?(name)\r
warn "Error: service #{name} already exists"\r
exit 1\r
end\r
\r
wrapper = File.join(PACKAGE_HOME, "script/wrapper.bat")\r
\r
- config.each {|key, conf|\r
+ Service.config.each {|key, conf|\r
name = conf["service_name"]\r
port = conf["port"]\r
\r
\r
def uninstall\r
stop(false)\r
- service_names.each {|name|\r
+ Service.names.each {|name|\r
next unless status(name)\r
\r
begin\r
end\r
\r
def start(verbose=true)\r
- service_names.each {|name|\r
- next unless s = status(name, verbose)\r
+ Service.names.each {|name|\r
+ s = Service.status(name)\r
+ unless s\r
+ warn "service #{name} is not installed" if verbose\r
+ next\r
+ end\r
+\r
if s == "running"\r
warn "service #{name} is already running" if verbose\r
next\r
\r
begin\r
Win32::Service.start(name)\r
- sleep 0.1 while status(name, false) == "start pending"\r
- raise if status(name, false) != "running"\r
+ sleep 0.1 while Service.status(name) == "start pending"\r
+ raise if Service.status(name) != "running"\r
warn "service #{name} started"\r
rescue\r
warn "Error: failed to start service #{name}"\r
end\r
\r
def stop(verbose=true)\r
- service_names.each {|name|\r
- next unless s = status(name, verbose)\r
+ Service.names.each {|name|\r
+ s = Service.status(name)\r
+ unless s\r
+ warn "service #{name} is not installed" if verbose\r
+ next\r
+ end\r
+\r
if s == "stopped"\r
warn "service #{name} has already been stopped" if verbose\r
next\r
\r
begin\r
Win32::Service.stop(name)\r
- sleep 0.1 while status(name, false) != "stopped"\r
+ sleep 0.1 while Service.status(name) != "stopped"\r
warn "service #{name} stopped"\r
rescue\r
warn "Error: failed to stop service #{name}"\r
start\r
end\r
\r
- def status(name=nil, verbose=true)\r
- if name\r
- service = Win32::Service.status(name) rescue nil\r
- warn "service #{name} is not installed" if verbose && service.nil?\r
- return service && service.current_state\r
- end\r
-\r
- service_names.each {|name|\r
- begin\r
- status = Win32::Service.status(name).current_state\r
- warn "#{name}: #{status}"\r
- rescue\r
- warn "#{name}: not installed"\r
- end\r
- }\r
- nil\r
- end\r
end\r
\r
class Service\r
extend Command\r
\r
class << self\r
- def config\r
- @config ||= YAML.load_file(File.join(PACKAGE_HOME, "config/service.yml"))\r
- end\r
-\r
- def service_names\r
- @service_names ||= config.values.map {|h| h["service_name"]}\r
- end\r
-\r
def usage\r
warn <<EOT\r
Usage: service <command>\r
\r
Commands:\r
- #{Command.instance_methods.sort.join("\n ")}\r
+ #{Command.instance_methods.push("status").sort.join("\n ")}\r
EOT\r
exit 1\r
end\r
\r
+ def display_status\r
+ names.each {|name|\r
+ if s = status(name)\r
+ warn "#{name}: #{s}"\r
+ else\r
+ warn "#{name}: not installed"\r
+ end\r
+ }\r
+ end\r
+\r
def method_missing(name, *args)\r
warn "Unknown command #{name}"\r
usage\r
\r
(command, pause) = ARGV[0..1]\r
Service.usage unless command\r
-if %w[install uninstall start stop restart].include?(command)\r
+if command == "status"\r
+ Service.display_status\r
+else\r
Windows::Authorization.runas_admin\r
+ Service.send(command)\r
end\r
-Service.send(command)\r
\r
ask("Press any key to exit ... ") {|q|\r
q.character = true\r