Module: DRCtrl

Defined in:
lib/drctrl.rb,
lib/drctrl/client.rb,
lib/drctrl/version.rb

Overview

Namespace module. Contains server-side methods if you use

require 'drctrl'

and client-side methods if you use

require 'drctrl/client'

Defined Under Namespace

Classes: Server

Constant Summary collapse

VERSION =

Version of drctrl gem without build number.

[0, 1, 1]

Server-side Module Attributes collapse

Server-side Module Methods collapse

Client-side Module Methods collapse

Class Attribute Details

.serverDRb::DRbServer (readonly)

DRCtrl server.

Returns:

  • (DRb::DRbServer)


51
52
53
# File 'lib/drctrl.rb', line 51

def server
  @server
end

Class Method Details

.connect(uri: nil, path: nil, name: nil, pid: nil) ⇒ DRb::DRbObject, ...

Connect to dRuby socket(-s).

Parameters:

  • uri (String) (defaults to: nil)

    Socket’s URI.

  • path (String) (defaults to: nil)

    Path to unix-socket.

  • name (String) (defaults to: nil)

    Application name.

  • pid (Integer) (defaults to: nil)

    Process ID.

Returns:

  • (DRb::DRbObject, Array<DRbObject>, nil)

Raises:

  • (RuntimeError)

    If socket not found.

  • (ArgumentError)

    If no required arguments setted.



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/drctrl/client.rb', line 48

def connect uri: nil, path: nil, name: nil, pid: nil
  if uri
    DRbObject.new nil, uri
  elsif path
    DRbObject.new nil, "drbunix:#{path}"
  elsif name
    socket = detect name, pid
    case socket
    when String
      DRbObject.new nil, "drbunix:#{socket}"
    when Array
      socket.map { |s| DRbObject.new nil, "drbunix:#{s}" }
    else
      raise RuntimeError, "Socket for { name: #{name.inspect}," +
          " pid: #{pid.inspect} } not found!", caller
    end
  else
    raise ArgumentError,
        "One of this arguments: uri, path or name must be setted!", caller
  end
end

.detect(name, pid = nil) ⇒ String, ...

Find socket path for name and process ID.

Parameters:

  • name (String)

    Application name.

  • pid (Integer) (defaults to: nil)

    Process ID.

Returns:

  • (String, Array<String>, nil)


18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/drctrl/client.rb', line 18

def detect name, pid = nil
  if pid
    result = "/tmp/#{name}-#{pid}"
    if File.socket? result
      return result
    else
      return nil
    end
  else
    files = Dir["/tmp/#{name}*"]
    result = files.select { |f| File.socket? f }
    if result.length == 0
      return nil
    elsif result.length == 1
      return result[0]
    else
      return result
    end
  end
end

.start_service(uri: nil, **opts) { ... } ⇒ DRb::DRbServer

Start control service with provided or default URI. Create a Server instance and start it as a front object of dRuby service.

Parameters:

  • uri (String) (defaults to: nil)

    Optional. Custom URI for this control service. If not set the automated ‘drbunix:’ socket will be used.

  • opts (Hash)

    Options for DRb::start_service.

Yields:

  • Block without parameters which will be runned before stop the service.

Returns:

  • (DRb::DRbServer)


66
67
68
69
70
71
72
73
74
# File 'lib/drctrl.rb', line 66

def start_service uri: nil, **opts, &block
  if uri.nil?
    uri = "drbunix:/tmp/#{File.basename($0, '.rb')}-#{Process.pid}"
  end
  oldprim = DRb.primary_server
  @server = DRb.start_service uri, Server.new(&block), opts
  DRb.primary_server = oldprim if oldprim
  @server
end

.waitvoid Also known as: join

This method returns an undefined value.

Wait when control service will be stopped.



79
80
81
# File 'lib/drctrl.rb', line 79

def wait
  @server.thread.join if @server
end