Class: Rbkb::Cli::Telson

Inherits:
PlugCli show all
Defined in:
lib/rbkb/cli/telson.rb

Overview

Copyright 2009 emonti at matasano.com See README.rdoc for license information

This is an implementation of the original blackbag “telson” around ruby and eventmachine.

Telson can do the following things with minimum fuss:

- Run as a "stubbed" network client using UDP or TCP
- Debugging network protocols
- Observe client/server behaviors using different messages at
  various phases of a conversation.

Constant Summary

Constants inherited from PlugCli

PlugCli::RX_HOST_AND_PORT, PlugCli::RX_PORT_OPT_ADDR

Instance Attribute Summary

Attributes inherited from PlugCli

#blit_addr, #blit_port, #blit_proto, #local_addr, #local_port, #plug_opts, #target_addr, #target_port, #transport

Attributes inherited from Executable

#argv, #exit_status, #oparse, #opts, #stderr, #stdin, #stdout

Instance Method Summary collapse

Methods inherited from PlugCli

#parse_target_argument

Methods inherited from Executable

#bail, #bail_args, #exit, run

Constructor Details

#initialize(*args) ⇒ Telson

Returns a new instance of Telson.



17
18
19
20
21
22
23
24
25
# File 'lib/rbkb/cli/telson.rb', line 17

def initialize(*args)
  super(*args) do |this|
    this.local_addr = "0.0.0.0"
    this.local_port = 0
  end

  @srced = false
  @persist = false
end

Instance Method Details

#go(*args) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/rbkb/cli/telson.rb', line 55

def go(*args)
  super(*args)

  loop do
    EventMachine.run {
      if @transport == :TCP
        bail("Sorry: --source only works with UDP.") if @srced

        c=EventMachine.connect(@target_addr, @target_port, Plug::Telson, @transport, @plug_opts)

      elsif @transport == :UDP
        c=EventMachine.open_datagram_socket( @local_addr, @local_port, Plug::Telson, @transport, @plug_opts)
        c.peers.add_peer_manually(@target_addr, @target_port)

      ### someday maybe raw or others?
      else
        raise "bad transport protocol"
      end

      EventMachine.start_server(@blit_addr, @blit_port, Plug::Blit, @blit_proto, c)
      Plug::UI::verbose("** BLITSRV-#{@blit_addr}:#{@blit_port}(TCP) Started") # XXX
    }
    break unless @persist
    Plug::UI::verbose("** RECONNECTING") # XXX
  end
end

#make_parserObject



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/rbkb/cli/telson.rb', line 28

def make_parser()
  arg = super()

  arg.on("-r", "--reconnect", "Attempt to reconnect endlessly.") do
    @persist=true
  end

  arg.on("-s", "--source=(ADDR:?)PORT", "Bind on port (and addr?)") do |p|
    if m=/^(?:([\w\.]+):)?(\d+)$/.match(p)
      @local_addr = $1 if $1
      @local_port = $2.to_i
      @srced = true
    else
      bail("Invalid listen argument: #{p.inspect}")
    end
  end
end

#parse(*args) ⇒ Object



47
48
49
50
51
52
# File 'lib/rbkb/cli/telson.rb', line 47

def parse(*args)
  super(*args)

  parse_target_argument()
  parse_catchall()
end