class DRbQS::Setting::Server

Constants

NODE_INTERVAL_TIME

Public Class Methods

new() click to toggle source
Calls superclass method DRbQS::Setting::Base::new
# File lib/drbqs/setting/server.rb, line 8
def initialize
  super(:all_keys_defined => true, :log_level => true, :daemon => true) do
    [:port, :unix, :acl, :sftp_user, :sftp_host,
     :profile_printer, :test, :execute_node].each do |key|
      register_key(key, :check => 1)
    end
    register_key(:log_file, :check => 1, :default => [STDOUT])
    register_key(:profile, :bool => true)
    register_key(:load, :add => true)
    register_key(:help, :bool => true)
    set_argument_condition(:>, 0)
  end
  @server_argument = DRbQS::Setting::Source.new(nil)
  @command_type = :server_start
  @test_opts = {}
  @execute_node_number = nil
end

Public Instance Methods

command_line_argument(escape = nil) click to toggle source
Calls superclass method
# File lib/drbqs/setting/server.rb, line 80
def command_line_argument(escape = nil)
  ary = super(escape)
  server_args = @server_argument.command_line_argument(escape)
  if server_args.size > 0
    ary << '--'
    ary.concat(server_args)
  end
  ary
end
exec(io = nil) click to toggle source
# File lib/drbqs/setting/server.rb, line 213
def exec(io = nil)
  if @command_type == :help
    command_server_help(io)
  elsif !fork_daemon_process
    setup_arguments
    case @command_type
    when /^test/
      command_test(io)
    else
      if @execute_node_number
        command_server_with_nodes
      else
        command_start_server
      end
    end
  end
  true
end
parse!() click to toggle source
Calls superclass method DRbQS::Setting::Base#parse!
# File lib/drbqs/setting/server.rb, line 55
def parse!
  if get(:help)
    @command_type = :help
    return true
  end
  super
  parse_test
  parse_execute_node
  @options[:port] = get_first(:port) do |val|
    val.to_i
  end
  @options[:unix] = get_first(:unix)
  @options[:acl] = get_first(:acl)
  @options[:sftp_user] = get_first(:sftp_user)
  @options[:sftp_host] = get_first(:sftp_host)
  @options[:log_file] = get_first(:log_file)
  @options.delete_if do |key, val|
    !val
  end
end
set_server_argument(*args) click to toggle source
# File lib/drbqs/setting/server.rb, line 76
def set_server_argument(*args)
  @server_argument.set_argument(*args)
end

Private Instance Methods

command_server_help(io) click to toggle source
# File lib/drbqs/setting/server.rb, line 159
def command_server_help(io)
  if io
    begin
      get_argument.each do |path|
        if File.exist?(path)
          Kernel.load(path)
        end
      end
      if mes = DRbQS.option_help_message
        io.print "\n" << mes
      end
    rescue => err
      new_err = err.class.new("Error in loading: #{err.to_s}")
      new_err.set_backtrace(err.backtrace)
      raise new_err
    end
  end
end
command_server_with_nodes() click to toggle source
# File lib/drbqs/setting/server.rb, line 142
def command_server_with_nodes
  server_pid = fork do
    begin
      DRbQS.start_server(@options)
    rescue SystemExit
    rescue Exception => err
      $stderr.puts "*** Error occurs on server process #{Process.pid}. ***"
      output_error(err)
    end
  end
  uri = current_server_uri
  wait_server_process(uri, server_pid)
  $PROGRAM_NAME = "drbqs-node with drbqs-server (PID #{server_pid})"
  execute_node_and_wait(uri)
end
command_start_server() click to toggle source
# File lib/drbqs/setting/server.rb, line 112
def command_start_server
  DRbQS.start_server(@options)
end
command_test(io) click to toggle source
# File lib/drbqs/setting/server.rb, line 90
def command_test(io)
  args = @command_type.split('_')[1].split(',')
  type = args.shift.intern
  limit = args[0] ? args[0].to_i : nil
  server = DRbQS.create_test_server(@options)
  case type
  when :task
    server.test_task_generator(:limit => limit, :progress => true)
  when :exec
    data = server.test_exec(:limit => limit, :profile => @test_opts[:profile], :printer => @test_opts[:printer])
    if io
      s = sprintf("Results: %d tasks; total %.4fs", data[:task], data[:end] - data[:start])
      s << sprintf("; %.4fs per one task", (data[:end] - data[:start]) / data[:task]) if data[:task] > 0
      s << "\nOutput the profile data to #{data[:profile]}" if data[:profile]
      io.puts s
    end
  else
    raise DRbQS::Setting::InvalidArgument, "Not yet implemented test '#{type}'"
  end
end
current_server_uri() click to toggle source
# File lib/drbqs/setting/server.rb, line 117
def current_server_uri
  DRbQS::Misc.create_uri(@options)
end
execute_node_and_wait(uri) click to toggle source
# File lib/drbqs/setting/server.rb, line 132
def execute_node_and_wait(uri)
  node_log_file = nil
  unless IO === @options[:log_file]
    node_log_file = FileName.create(@options[:log_file], :add => :always, :position => :middle, :delimiter => '', :format => "_node_%02d")
  end
  exec_node = DRbQS::Execution::ExecuteNode.new(uri, node_log_file, @options[:log_level])
  exec_node.execute(@execute_node_number, NODE_INTERVAL_TIME)
end
fork_daemon_process() click to toggle source
# File lib/drbqs/setting/server.rb, line 194
def fork_daemon_process
  if @__daemon__
    case @command_type
    when /^test/
      raise DRbQS::Setting::InvalidArgument, "Test of server does not support daemon"
    else
      fork do
        exec_as_daemon
      end
      uri = current_server_uri
      wait_server_process(uri)
    end
    true
  else
    nil
  end
end
parse_execute_node() click to toggle source
# File lib/drbqs/setting/server.rb, line 40
def parse_execute_node
  @execute_node_number = get_first(:execute_node) do |val|
    val.to_i
  end
end
parse_test() click to toggle source
# File lib/drbqs/setting/server.rb, line 26
def parse_test
  @test_opts[:profile] = get(:profile)
  @test_opts[:printer] = get_first(:profile_printer) do |val|
    val.intern
  end
  if @test_opts[:printer] && !@test_opts[:profile]
    @test_opts[:profile] = true
  end
  if test = get_first(:test)
    @command_type = "test_#{test.to_s}"
  end
end
preprocess!() click to toggle source
# File lib/drbqs/setting/server.rb, line 47
def preprocess!
  if files = get(:load)
    value.argument.concat(files)
    clear(:load)
  end
end
setup_arguments() click to toggle source
# File lib/drbqs/setting/server.rb, line 179
def setup_arguments
  get_argument.each do |path|
    if File.exist?(path)
      Kernel.load(path)
    else
      raise DRbQS::Setting::InvalidArgument, "#{path} does not exist."
    end
  end
  unless @options[:acl]
    @options[:acl] = DRbQS::Config.new.get_acl_file
  end
  DRbQS.parse_option(@server_argument.get_argument)
end
wait_server_process(uri, server_pid = nil) click to toggle source
# File lib/drbqs/setting/server.rb, line 122
def wait_server_process(uri, server_pid = nil)
  manage = DRbQS::Manage.new(:uri => uri)
  unless manage.wait_server_process(server_pid)
    raise "The process of the server of #{uri} does not exist."
  end
rescue DRbQS::Manage::NoServerRespond => err
  raise DRbQS::Manage::NoServerRespond, "The server of #{uri} does not respond."
end