# WebROaR - Ruby Application Server - http://webroar.in/
# Copyright (C) 2009 Goonj LLC
#
# This file is part of WebROaR.
#
# WebROaR is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# WebROaR is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with WebROaR. If not, see .
require 'optparse'
module Webroar
module Command
HELP =%{
Usage:
webroar [-v | --version] [-h | --help] COMMAND [ARGS]
The available webroar commands are:
install Install the server
uninstall Uninstall the server
start Start the server or an application
stop Stop the server or an application
restart Restart the server or an application
add Deploy an application on the server
remove Remove an application from the server
test Run the test suite
For help on a particular command, use 'webroar help COMMAND'.
}
HELP_INSTALL =%{
Usage:
webroar install [-s] [ -L] [ -I] [-d] [ -i |
[ --no-import] [ -P] [ -u] [-p] ]
Options:
-L
Additional library paths to be used for linking of the server
-I
Additional include paths to be used for linking of the server
-s, --ssl-support
Install the server with SSL support
-d, --debug-build
Compile the server as a debug build to output extremely verbose logs
The following options would make the install non-interactive by suppressing
the questions prompted by the installer
-P, --port
Server port number
-i, --import
Import configuration, logs and admin panel data from the previous
installation
--no-import
Do not import configuration, logs and admin panel data from the previous
installation
-u, --username
Username for the administrator account of server's admin panel
-p, --password
Password for the administrator account of server\'s admin panel
Summary:
Install the server
}
HELP_UNINSTALL =%{
Usage:
webroar uninstall
Summary:
Uninstall the server
}
HELP_CLEAR =%{
Usage:
webroar clear
Summary:
Clear the log files
Description:
Clear the log files from '/var/log/webroar' directory.
}
HELP_START =%{
Usage:
webroar start []
Arguments:
Name of the application(s)
Summary:
Start the server or an application
Description:
'start' command without any arguments starts the server. One can start
multiple applications together by passing multiple names.
}
HELP_STOP =%{
Usage:
webroar stop []
Arguments:
Name of the application(s)
Summary:
Stop the server or an application
Description:
'stop' command without any arguments stops the server. One can stop
multiple applications together by passing multiple names.
}
HELP_RESTART =%{
Usage:
webroar restart []
Arguments:
Name of the application(s)
Summary:
Restart the server or an application
Description:
'restart' command without any arguments restarts the server. One can
restart multiple applications together by passing multiple names.
}
HELP_TEST =%{
Usage:
webroar test [ -r] [ -d] [ -l]
Options:
-r, --report-dir
Report directory
-d, --debug-build
Compile the server as a debug build to output extremely verbose logs
-l, --load-test
Also run the load tests
Summary:
Run the test suite
}
HELP_REMOVE = %{
Usage:
webroar remove []
Arguments:
Name of the application
Summary:
Remove the specified application from the server.
Description:
If application name is not passed, it would look for 'config/environment.rb'
or 'config.ru' file in the current directory. If any one of the files found,
it passes name of the current directory as an application name.
}
HELP_ADD = %{
Usage:
webroar add [] [ -R] [ -D] [ -U] [ -T] [ -E] [ -A] [ -N] [ -X]
Arguments:
Name of the application
Options:
The following parameters are mandatory, if the current directory would not
be the Rails or Rack root directory
-R, --resolver
Resolver to identify the application. Set it to '/' if you would like
to run the application on the root domain. e.g. http://yourserver:port/.
(default: /)
Else set the relevant base URI with which you would like to access the
application, e.g. '/app1' if you want the application to be accessible
via http://yourserver:port/app1.
If you would like to set a virtual host for your application e.g.
www.company1.com, please specify it here. You can also host this
application on a particular subdomain e.g. app1.company1.com. Wildcard
'*' can also be used in defining the virtual host name, but it should
only be used either at the start or the end. Prefix the virtual host
name with tilde(~), if a wildcard is used in defining it.
e.g. (i) ~*.server.com (ii) ~www.server.* (iii) ~*.server.*
-D, --path
Complete path for your application root directory: e.g. /home/someuser/webapps/app1
(default: current directory)
-U, --run-as-user
Name of the user with whose privileges you would like to run the
application (root can be dangerous!). This user should have all the
necessary permissions to get your web application working properly
(e.g. write access on required files and directories etc)
(default: Owner of 'config/environment.rb' or 'config.ru' file)
The following parameters are optional
-T, --type
Type of the application either rack or rails (default: rails)
-E, --environment
Environment in which you want to run the application (default: production)
-A, --analytics
Enable analytics to get detailed numbers about the run time performance
of the application. This number gathering adds a very small overhead on
your application
-N, --min-workers
Minimum number of worker processes that should run for this deployed
application. Multiple worker instances help in processing a higher number
of concurrent user requests simultaneously. The server would always
ensure at least these many worker processes run for this application
(default: 4)
-X, --max-workers
Maximum number of worker processes that should run for this deployed
application. Multiple worker instances help in processing a higher
number of concurrent user requests simultaneously. The server would
ensure that maximum only these many worker processes run for this
application (default: 8)
Summary:
Deploy (and start) a new application on the server.
Description:
If application name is not passed, it would look for 'config/environment.rb'
or 'config.ru' file in the current directory. If any one of the files found,
it passes name of the current directory as an application name.
}
class CommandRunner
def initialize
@options = {}
@options[:include_paths] = ""
@options[:library_paths] = ""
end
def run
return unless parse_args
if ARGV.length == 0
if @options[:version]
Installer.new.version
else
puts HELP
end
return
end
cmd = ARGV[0]
if @options[:help]
Help.new.run(cmd)
return
end
case cmd
when "help"; Help.new.run(ARGV[1])
when "install";
# When installation is interrupted on administrator account password input, terminal
# is set to echo the character
begin
Installer.new.install(@options)
ensure
system('stty echo')
end
when "uninstall"; Installer.new.uninstall
when "clear"; WebroarCommand.new.clear
when "start", "stop", "restart" ; WebroarCommand.new.operation(ARGV, cmd)
when "add" ; WebroarCommand.new.add(@options, ARGV)
when "remove" ; WebroarCommand.new.remove(ARGV)
when "test"; Installer.new.test(@options)
else
puts "ERROR: Invalid command: #{cmd}. See 'webroar help'."
end
end
private
def parse_args
optparse = OptionParser.new do|opts|
opts.on( '-h', '--help', 'Webroar help') { @options[:help] = true }
opts.on( '-s', '--ssl-support', 'Install with SSL support') { @options[:ssl] = true }
opts.on( '-d', '--debug-build', 'Compile with debug mode') { @options[:debug_build] = true }
opts.on( '-n', '--no-report', 'Do not generate test report') { @options[:no_report] = true }
opts.on( '-l', '--load-test', 'Run load test') { @options[:load_test] = true }
opts.on( '-A', '--analytics', 'Enable the application analytics') { @options[:analytics] = 'Enabled' }
opts.on( '-i', '--import', 'Import configuration, logs and admin panel data from the previous installation') { @options[:import] = true }
opts.on( '--no-import', 'Do not import configuration, logs and admin panel data from the previous installation') { @options[:import] = false }
opts.on( '-v', '--version', 'Version information') do
@options[:version] = true
#Installer.new.version
#return false
end
opts.on( '-u', '--username USERNAME', 'Username for the administrator account of server\'s admin panel') do |value|
@options[:username] = value.lstrip.gsub(/^=/,"")
end
opts.on( '-p', '--password PASSWORD', 'Password for the administrator account of server\'s admin panel') do |value|
@options[:password] = value.lstrip.gsub(/^=/,"")
end
opts.on( '-P', '--port PORT', 'Server port number') do |value|
@options[:port] = value.lstrip.gsub(/^=/,"")
end
opts.on( '-r', '--report-dir [DIR]', 'Report directory') do |value|
@options[:report_dir] = value.lstrip.gsub(/^=/,"")
end
opts.on( '-R', '--resolver RESOLVER', 'Resolver to identify the application') do |value|
@options[:resolver] = value.lstrip.gsub(/^=/,"")
end
opts.on( '-D', '--path DIR', 'Path for the web application root directory') do |value|
@options[:path] = value.lstrip.gsub(/^=/,"")
@options[:path] = File.expand_path(@options[:path])
end
opts.on( '-T', '--type APPTYPE', 'Type of the application either rack or rails') do |value|
@options[:type1] = value.lstrip.gsub(/^=/,"").capitalize
end
opts.on( '-E', '--environment ENV', 'Environment in which you want to run the application') do |value|
@options[:environment] = value.lstrip.gsub(/^=/,"")
end
opts.on( '-N', '--min-workers WORKER', 'Minimum number of worker processes that should run for the deployed application.') do |value|
@options[:min_worker] = value.lstrip.gsub(/^=/,"")
end
opts.on( '-X', '--max-workers WORKER', 'Maximum number of worker processes that should run for the deployed application.') do |value|
@options[:max_worker] = value.lstrip.gsub(/^=/,"")
end
opts.on( '-U', '--run-as-user USERNAME', 'Name of the user with whose privileges you would like to run the application') do |value|
@options[:run_as_user] = value.lstrip.gsub(/^=/,"")
end
opts.on( '-L PATH', 'Additional library path') do |value|
@options[:library_paths] += " -L'#{value.lstrip.gsub(/^=/,"")}'"
end
opts.on( '-I PATH', 'Additional include path') do |value|
@options[:include_paths] += " -I'#{value.lstrip.gsub(/^=/,"")}'"
end
end
begin
optparse.parse!
rescue OptionParser::ParseError => err
puts "#{err}. See 'webroar help'."
return false
end
return true
end
end # class CommandRunner
class Help
def run (cmd)
case cmd
when nil, "help"; puts HELP
when "install"; puts HELP_INSTALL
when "uninstall"; puts HELP_UNINSTALL
when "clear"; puts HELP_CLEAR
when "start"; puts HELP_START
when "stop"; puts HELP_STOP
when "restart"; puts HELP_RESTART
when "add"; puts HELP_ADD
when "remove"; puts HELP_REMOVE
when "test"; puts HELP_TEST
else puts "WARNING: Unknown command #{cmd}. See 'webroar help'."
end
end
end # class Help
end # module Command
end # module Webroar