Module: Plug::Base

Included in:
ArrayFeeder, Blit, Proxy, Telson, UdpServer
Defined in:
lib/rbkb/plug/plug.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#kind ⇒ Object

Returns the value of attribute kind.



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

def kind
  @kind
end

#no_stop_on_unbind ⇒ Object

Returns the value of attribute no_stop_on_unbind.



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

def no_stop_on_unbind
  @no_stop_on_unbind
end

#peers ⇒ Object

Returns the value of attribute peers.



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

def peers
  @peers
end

#tls ⇒ Object

Returns the value of attribute tls.



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

def tls
  @tls
end

#tls_opts ⇒ Object

Returns the value of attribute tls_opts.



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

def tls_opts
  @tls_opts
end

#transport ⇒ Object

Returns the value of attribute transport.



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

def transport
  @transport
end

Instance Method Details

#connection_completed ⇒ Object



118
119
120
121
122
123
# File 'lib/rbkb/plug/plug.rb', line 118

def connection_completed
  peer = plug_peer
  UI.log "** #{name} CONNECTED TO #{peer.name}"
  start_tls(tls_opts || {}) if tls
  peer
end

#initialize(transport, opts = {}) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/rbkb/plug/plug.rb', line 53

def initialize(transport, opts = {})
  #      raise "Invalid transport #{transport.inspect}" unless (:UDP, :TCP).include?(transport)
  @transport = transport
  @peers = PeerList.new(self)

  opts.each_pair do |k, v|
    accessor = k.to_s + '='
    raise "Bad attribute: #{k}" unless respond_to?(accessor)

    send(accessor, v)
  end
end

#name ⇒ Object



66
67
68
69
70
# File 'lib/rbkb/plug/plug.rb', line 66

def name
  sn = get_sockname
  addr = sn ? Socket.unpack_sockaddr_in(sn).reverse.join(':') : 'PENDING'
  "#{kind.to_s.upcase}-#{addr}(#{@transport})"
end

#plug_peer ⇒ Object

plug_peer creates a peering association for a given peer based on get_peername. The existing or newly created peer object is returned.



74
75
76
77
# File 'lib/rbkb/plug/plug.rb', line 74

def plug_peer
  paddr = get_peername
  @peers.find_peer(paddr) || @peers.add_peer(paddr)
end

#plug_receive(_dat) ⇒ Object

plug_receive is used by receive_data to divert incoming messages. The "peer" is added if it is not already present. This instance will check whether # a peer is "muted" and will return the peer if not. This method can be overriden by child classes to implement additional checks. It receives "dat" so that such checks can optionally make forwarding decisions based on message data contents as well.

Returns:

- nil : indicates that the message should be stifled
- A peer object : indicates that the message should be processed
further


90
91
92
93
# File 'lib/rbkb/plug/plug.rb', line 90

def plug_receive(_dat)
  peer = plug_peer
  peer unless peer.mute
end

#post_init ⇒ Object



103
104
105
106
107
108
109
# File 'lib/rbkb/plug/plug.rb', line 103

def post_init
  UI.verbose "** #{name} Started"
  if @kind == :server and peer = plug_peer
    UI.log "** #{name} CONNECTED TO #{peer.name}"
    start_tls(tls_opts || {}) if tls
  end
end

#receive_data(dat) ⇒ Object



111
112
113
114
115
116
# File 'lib/rbkb/plug/plug.rb', line 111

def receive_data(dat)
  if peer = plug_receive(dat)
    say(dat, peer)
  end
  peer
end

#say(dat, sender) ⇒ Object

This instance of the say method is an abstract stub and just "dumps" the message. It should be overridden and optionally called with super() if you actually want to do anything useful when incoming messages are received.



99
100
101
# File 'lib/rbkb/plug/plug.rb', line 99

def say(dat, sender)
  UI.dump(sender.name, name, dat)
end

#unbind ⇒ Object



125
126
127
128
129
130
131
# File 'lib/rbkb/plug/plug.rb', line 125

def unbind
  UI.log '** Connection ' + (@peers.empty? ? 'refused.' : 'closed.')
  return if @no_stop_on_unbind

  UI.log 'STOPPING!!'
  EM.stop
end