class Daemons::Controller

def catch_exceptions(&block)

def catch_exceptions(&block)
  begin
    block.call
  rescue CmdException, OptionParser::ParseError => e
    puts "ERROR: #{e.to_s}"
    puts
    print_usage()
  rescue RuntimeException => e
    puts "ERROR: #{e.to_s}"
  end
end

def initialize(options = {}, argv = [])

def initialize(options = {}, argv = [])
  @options = options
  @argv = argv
  
  # Allow an app_name to be specified. If not specified use the
  # basename of the script.
  @app_name = options[:app_name]
  
  if options[:script]
    @script = File.expand_path(options[:script])

    @app_name ||= File.split(@script)[1]
  end

  @app_name ||= 'unknown_application'
  
  @command, @controller_part, @app_part = Controller.split_argv(argv)

  #@options[:dir_mode] ||= :script

  @optparse = Optparse.new(self)
end

def print_usage

def print_usage
  puts "Usage: #{@app_name} <command> <options> -- <application options>"
  puts
  puts "* where <command> is one of:"
  puts "  start         start an instance of the application"
  puts "  stop          stop all instances of the application"
  puts "  restart       stop all instances and restart them afterwards"
  puts "  reload        send a SIGHUP to all instances of the application"
  puts "  run           start the application and stay on top"
  puts "  zap           set the application to a stopped state"
  puts "  status        show status (PID) of application instances"
  puts
  puts "* and where <options> may contain several of the following:"
  
  puts @optparse.usage
end

def run

def run
  @options.update @optparse.parse(@controller_part).delete_if {|k,v| !v}
  
  setup_options()
  
  #pp @options
  @group = ApplicationGroup.new(@app_name, @options)
  @group.controller_argv = @controller_part
  @group.app_argv = @app_part
  
  @group.setup
  
  case @command
    when 'start'
      @group.new_application.start
    when 'run'
      @options[:ontop] ||= true
      @group.new_application.start
    when 'stop'
      @group.stop_all(@options[:no_wait])
    when 'restart'
      unless @group.applications.empty?
        @group.stop_all
        sleep(1)
        @group.start_all
      else
        puts "Warning: no instances running. Starting..."
        @group.new_application.start
      end
    when 'reload'
      @group.reload_all
    when 'zap'
      @group.zap_all
    when 'status'
      unless @group.applications.empty?
        @group.show_status
      else
        puts "#{@group.app_name}: no instances running"
      end
    when nil
      raise CmdException.new('no command given')
      #puts "ERROR: No command given"; puts
      
      #print_usage()
      #raise('usage function not implemented')
    else
      raise Error.new("command '#{@command}' not implemented")
  end
end

def setup_options


Note that this function should only update @options and no other variables.

before they are really used.
This function is used to do a final update of the options passed to the application
def setup_options
  #@options[:ontop] ||= true
end