rbkb 0.6.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +74 -0
- data/README.rdoc +149 -0
- data/Rakefile +47 -0
- data/bin/b64 +5 -0
- data/bin/bgrep +5 -0
- data/bin/blit +5 -0
- data/bin/c +5 -0
- data/bin/crc32 +5 -0
- data/bin/d64 +5 -0
- data/bin/dedump +5 -0
- data/bin/feed +5 -0
- data/bin/hexify +5 -0
- data/bin/len +5 -0
- data/bin/plugsrv +271 -0
- data/bin/rex +10 -0
- data/bin/rstrings +5 -0
- data/bin/slice +5 -0
- data/bin/telson +5 -0
- data/bin/unhexify +5 -0
- data/bin/urldec +5 -0
- data/bin/urlenc +5 -0
- data/bin/xor +5 -0
- data/cli_usage.rdoc +285 -0
- data/doctor-bag.jpg +0 -0
- data/lib/rbkb.rb +51 -0
- data/lib/rbkb/cli.rb +219 -0
- data/lib/rbkb/cli/b64.rb +35 -0
- data/lib/rbkb/cli/bgrep.rb +86 -0
- data/lib/rbkb/cli/blit.rb +89 -0
- data/lib/rbkb/cli/chars.rb +24 -0
- data/lib/rbkb/cli/crc32.rb +35 -0
- data/lib/rbkb/cli/d64.rb +28 -0
- data/lib/rbkb/cli/dedump.rb +52 -0
- data/lib/rbkb/cli/feed.rb +229 -0
- data/lib/rbkb/cli/hexify.rb +65 -0
- data/lib/rbkb/cli/len.rb +76 -0
- data/lib/rbkb/cli/rstrings.rb +108 -0
- data/lib/rbkb/cli/slice.rb +47 -0
- data/lib/rbkb/cli/telson.rb +87 -0
- data/lib/rbkb/cli/unhexify.rb +50 -0
- data/lib/rbkb/cli/urldec.rb +35 -0
- data/lib/rbkb/cli/urlenc.rb +35 -0
- data/lib/rbkb/cli/xor.rb +43 -0
- data/lib/rbkb/extends.rb +725 -0
- data/lib/rbkb/http.rb +21 -0
- data/lib/rbkb/http/base.rb +172 -0
- data/lib/rbkb/http/body.rb +214 -0
- data/lib/rbkb/http/common.rb +74 -0
- data/lib/rbkb/http/headers.rb +370 -0
- data/lib/rbkb/http/parameters.rb +104 -0
- data/lib/rbkb/http/request.rb +58 -0
- data/lib/rbkb/http/response.rb +86 -0
- data/lib/rbkb/plug.rb +9 -0
- data/lib/rbkb/plug/blit.rb +222 -0
- data/lib/rbkb/plug/cli.rb +83 -0
- data/lib/rbkb/plug/feed_import.rb +74 -0
- data/lib/rbkb/plug/peer.rb +67 -0
- data/lib/rbkb/plug/plug.rb +215 -0
- data/lib/rbkb/plug/proxy.rb +26 -0
- data/lib/rbkb/plug/unix_domain.rb +75 -0
- data/lib_usage.rdoc +176 -0
- data/rbkb.gemspec +38 -0
- data/spec/rbkb_spec.rb +7 -0
- data/spec/spec_helper.rb +16 -0
- data/tasks/ann.rake +80 -0
- data/tasks/bones.rake +20 -0
- data/tasks/gem.rake +201 -0
- data/tasks/git.rake +40 -0
- data/tasks/notes.rake +27 -0
- data/tasks/post_load.rake +34 -0
- data/tasks/rdoc.rake +51 -0
- data/tasks/rubyforge.rake +55 -0
- data/tasks/setup.rb +292 -0
- data/tasks/spec.rake +54 -0
- data/tasks/svn.rake +47 -0
- data/tasks/test.rake +40 -0
- data/test/test_cli_b64.rb +35 -0
- data/test/test_cli_bgrep.rb +137 -0
- data/test/test_cli_blit.rb +11 -0
- data/test/test_cli_chars.rb +21 -0
- data/test/test_cli_crc32.rb +108 -0
- data/test/test_cli_d64.rb +22 -0
- data/test/test_cli_dedump.rb +118 -0
- data/test/test_cli_feed.rb +11 -0
- data/test/test_cli_helper.rb +96 -0
- data/test/test_cli_hexify.rb +63 -0
- data/test/test_cli_len.rb +96 -0
- data/test/test_cli_rstrings.rb +15 -0
- data/test/test_cli_slice.rb +73 -0
- data/test/test_cli_telson.rb +11 -0
- data/test/test_cli_unhexify.rb +43 -0
- data/test/test_cli_urldec.rb +50 -0
- data/test/test_cli_urlenc.rb +44 -0
- data/test/test_cli_xor.rb +71 -0
- data/test/test_helper.rb +5 -0
- data/test/test_http.rb +27 -0
- data/test/test_http_helper.rb +60 -0
- data/test/test_http_request.rb +136 -0
- data/test/test_http_response.rb +222 -0
- data/test/test_rbkb.rb +19 -0
- metadata +238 -0
data/bin/rex
ADDED
data/bin/rstrings
ADDED
data/bin/slice
ADDED
data/bin/telson
ADDED
data/bin/unhexify
ADDED
data/bin/urldec
ADDED
data/bin/urlenc
ADDED
data/bin/xor
ADDED
data/cli_usage.rdoc
ADDED
@@ -0,0 +1,285 @@
|
|
1
|
+
== Command Line Tools
|
2
|
+
|
3
|
+
Below is a list of the command line utilities with short descriptions and
|
4
|
+
usage information. Examples to come.
|
5
|
+
|
6
|
+
=== b64
|
7
|
+
|
8
|
+
Base64 encode data supplied via an argument, file, or standard input.
|
9
|
+
|
10
|
+
Usage: b64 [options] <data | blank for stdin>
|
11
|
+
-h, --help Show this message
|
12
|
+
-v, --version Show version and exit
|
13
|
+
-f, --file FILENAME Input from FILENAME
|
14
|
+
-l, --length LEN Output LEN chars per line
|
15
|
+
|
16
|
+
|
17
|
+
=== bgrep
|
18
|
+
|
19
|
+
Binary grep. Prints 'inspected' matches and offset information.
|
20
|
+
|
21
|
+
Usage: bgrep [options] <subject> <file | blank for stdin>
|
22
|
+
-h, --help Show this message
|
23
|
+
-v, --version Show version and exit
|
24
|
+
-x, --[no-]hex Specify subject as hex (default: false)
|
25
|
+
-r, --[no-]regex Specify subject as regex (default: false)
|
26
|
+
-a, --align=BYTES Only match on alignment boundary
|
27
|
+
-n, --[no-]filename Suppress prefixing of filenames.
|
28
|
+
|
29
|
+
|
30
|
+
=== blit
|
31
|
+
|
32
|
+
Sends data through any plugboard that implements a Plug::Blit listener for
|
33
|
+
out-of band input.
|
34
|
+
|
35
|
+
See also: telson
|
36
|
+
|
37
|
+
Usage: blit [options] <data | blank for stdin>
|
38
|
+
-h, --help Show this message
|
39
|
+
-v, --version Show version and exit
|
40
|
+
-f, --file FILENAME Input from FILENAME
|
41
|
+
-t, --trans-protocol=PROTO Blit transport protocol TCP/UDP
|
42
|
+
-b, --blitsrv=ADDR:PORT Where to send blit messages
|
43
|
+
-i, --peer-index=IDX Index for remote peer to receive
|
44
|
+
-l, --list-peers Lists the peer array for the target
|
45
|
+
-k, --kill Stops the remote event loop.
|
46
|
+
|
47
|
+
|
48
|
+
=== c
|
49
|
+
|
50
|
+
Prints a character n-times.
|
51
|
+
|
52
|
+
Usage: c 100 A; # print 100 A's'
|
53
|
+
|
54
|
+
|
55
|
+
=== crc32
|
56
|
+
|
57
|
+
Generates a crc32 checksum for data provided via stdin or file
|
58
|
+
|
59
|
+
Usage: crc32 [options]
|
60
|
+
-h, --help Show this message
|
61
|
+
-v, --version Show version and exit
|
62
|
+
-f, --file FILENAME Input from FILENAME
|
63
|
+
-r, --range=START[:END] Start and optional end range
|
64
|
+
-x, --hexrange=START[:END] same, but in hex
|
65
|
+
|
66
|
+
|
67
|
+
=== d64
|
68
|
+
|
69
|
+
Base64 decode an encoded chunk supplied via argument, file, or standard input.
|
70
|
+
|
71
|
+
Usage: d64 [options] <data | blank for stdin>
|
72
|
+
-h, --help Show this message
|
73
|
+
-v, --version Show version and exit
|
74
|
+
-f, --file FILENAME Input from FILENAME
|
75
|
+
|
76
|
+
|
77
|
+
=== dedump
|
78
|
+
|
79
|
+
Reverses a hexdump back to raw data. Designed to work with hexdumps created
|
80
|
+
by Unix utilities like 'xxd' as well as 'hexdump -C'.
|
81
|
+
|
82
|
+
Usage: dedump [options] <input-file | blank for stdin>
|
83
|
+
-h, --help Show this message
|
84
|
+
-v, --version Show version and exit
|
85
|
+
-l, --length LEN Bytes per line in hexdump (default: 16)
|
86
|
+
|
87
|
+
|
88
|
+
=== feed
|
89
|
+
|
90
|
+
This is a plug-board message feeder from static data sources.
|
91
|
+
The "feed" handles messages opaquely and just plays them as a server or
|
92
|
+
client in the given sequence.
|
93
|
+
|
94
|
+
Feed can do the following things with minimum fuss:
|
95
|
+
* Import messages from files, yaml, or pcap
|
96
|
+
* Inject custom/modified messages with "blit"
|
97
|
+
* Run as a server or client using UDP or TCP
|
98
|
+
* Bootstrap protocols without a lot of work up front
|
99
|
+
* Skip uninteresting messages and focus attention on the fun ones.
|
100
|
+
* Replay conversations for relatively unfamiliar protocols.
|
101
|
+
* Observe client/server behaviors using different messages at
|
102
|
+
various phases of a conversation.
|
103
|
+
|
104
|
+
Usage: feed [options] host:port
|
105
|
+
-h, --help Show this message
|
106
|
+
-v, --version Show version and exit
|
107
|
+
-o, --output=FILE Output to file
|
108
|
+
-l, --listen=(ADDR:?)PORT Server - on port (and addr?)
|
109
|
+
-s, --source=(ADDR:?)PORT Bind client on port and addr
|
110
|
+
-b, --blit=(ADDR:)?PORT Where to listen for blit
|
111
|
+
-i, --[no-]initiate Send the first message on connect
|
112
|
+
-e, --[no-]end End connection when feed is exhausted
|
113
|
+
--[no-]step 'Continue' prompt between messages
|
114
|
+
-u, --udp Use UDP instead of TCP
|
115
|
+
-r, --reconnect Attempt to reconnect endlessly.
|
116
|
+
-q, --quiet Suppress verbose messages/dumps
|
117
|
+
-Q, --squelch-exhausted Squelch 'FEED EXHAUSTED' messages
|
118
|
+
Sources: (can be combined)
|
119
|
+
-f, --from-files=GLOB Import messages from raw files
|
120
|
+
-x, --from-hex=FILE Import messages from hexdumps
|
121
|
+
-y, --from-yaml=FILE Import messages from yaml
|
122
|
+
-p, --from-pcap=FILE[:FILTER] Import messages from pcap
|
123
|
+
|
124
|
+
|
125
|
+
|
126
|
+
=== hexify
|
127
|
+
|
128
|
+
Converts a string or raw data to hex characters. Input can be supplied via
|
129
|
+
stdin, a string argument, or a file (with -f).
|
130
|
+
|
131
|
+
Usage: hexify [options] <data | blank for stdin>
|
132
|
+
-h, --help Show this message
|
133
|
+
-v, --version Show version and exit
|
134
|
+
-f, --file FILENAME Input from FILENAME
|
135
|
+
-l, --length LEN Hexify in lines of LEN bytes
|
136
|
+
-d, --delim=DELIMITER DELIMITER between each byte
|
137
|
+
-p, --prefix=PREFIX PREFIX before each byte
|
138
|
+
-s, --suffix=SUFFIX SUFFIX after each byte
|
139
|
+
|
140
|
+
|
141
|
+
=== len
|
142
|
+
|
143
|
+
Takes input from a blob of data and output it with its binary length prepended.
|
144
|
+
|
145
|
+
Usage: len [options] <data | blank for stdin>
|
146
|
+
-h, --help Show this message
|
147
|
+
-v, --version Show version and exit
|
148
|
+
-f, --file FILENAME Input from FILENAME
|
149
|
+
-n, --nudge INT Add integer to length
|
150
|
+
-s, --size=SIZE Size of length field in bytes
|
151
|
+
-x, --[no-]swap Swap endianness. Default=big
|
152
|
+
-t, --[no-]total Include size word in size
|
153
|
+
-l, --length=LEN Ignore all else and use LEN
|
154
|
+
|
155
|
+
|
156
|
+
=== plugsrv
|
157
|
+
|
158
|
+
A blit-able reverse TCP proxy. Displays traffic hexdumps.
|
159
|
+
|
160
|
+
Usage: plugsrv [options] target:tport[@[laddr:]lport]
|
161
|
+
<target:tport> = the address of the target service
|
162
|
+
<@laddr:lport> = optional address and port to listen on
|
163
|
+
|
164
|
+
Options:
|
165
|
+
-o, --output FILE send output to a file
|
166
|
+
-l, --listen ADDR:PORT optional listener address:port
|
167
|
+
(default: 0.0.0.0:<tport>)
|
168
|
+
-q, --[no-]quiet Suppress/Enable conversation dumps.
|
169
|
+
-b, --blit ADDR:PORT specify blit listener [address:]port
|
170
|
+
(default: 127.0.0.1:25195)
|
171
|
+
--[no-]target-tls enable/disable TLS to target
|
172
|
+
--[no-]server-tls enable/disable TLS to clients
|
173
|
+
-h, --help Show this message
|
174
|
+
|
175
|
+
|
176
|
+
=== rex
|
177
|
+
|
178
|
+
Lazy shortcut for ruby -e "..."
|
179
|
+
|
180
|
+
All commandline arguments get smeared into a ruby statement via 'eval()'.
|
181
|
+
|
182
|
+
|
183
|
+
=== rstrings
|
184
|
+
|
185
|
+
A utility much like Unix 'strings' -- implemented in ruby.
|
186
|
+
|
187
|
+
Usage: rstrings [options] <file | blank for stdin>
|
188
|
+
-h, --help Show this message
|
189
|
+
-v, --version Show version and exit
|
190
|
+
-s, --start=OFFSET Start at offset
|
191
|
+
-e, --end=OFFSET End at offset
|
192
|
+
-t, --encoding-type=TYPE Encoding: ascii/unicode/both (default=both)
|
193
|
+
-l, --min-length=NUM Minimum length of strings (default=6)
|
194
|
+
-a, --align=ALIGNMENT Match only on alignment (default=none)
|
195
|
+
|
196
|
+
|
197
|
+
=== slice
|
198
|
+
|
199
|
+
Returns a slice from input. Just a shell interface to a string slice operation.
|
200
|
+
|
201
|
+
Usage: slice [options] start (no args when using -r|-x)
|
202
|
+
-h, --help Show this message
|
203
|
+
-v, --version Show version and exit
|
204
|
+
-f, --file FILENAME Input from FILENAME
|
205
|
+
-r, --range=START[:END] Start and optional end range
|
206
|
+
-x, --hexrange=START[:END] same, but in hex
|
207
|
+
|
208
|
+
|
209
|
+
=== telson
|
210
|
+
|
211
|
+
This is an implementation of the original blackbag "telson" using ruby and
|
212
|
+
eventmachine.
|
213
|
+
|
214
|
+
Telson is for doing the following things with minimum fuss:
|
215
|
+
|
216
|
+
* Run as a stubbed network client using UDP or TCP
|
217
|
+
* Use blit to communicate with the other side.
|
218
|
+
* Debug network protocols
|
219
|
+
* Observe client/server behaviors using different messages at various phases
|
220
|
+
of a conversation.
|
221
|
+
|
222
|
+
Usage: telson [options] host:port
|
223
|
+
-h, --help Show this message
|
224
|
+
-v, --version Show version and exit
|
225
|
+
-o, --output=FILE Output to file
|
226
|
+
-q, --quiet Turn off verbose logging
|
227
|
+
-d, --dump-format=hex/raw Output conversations in hexdump or raw
|
228
|
+
-b, --blit=ADDR:PORT Where to listen for blit
|
229
|
+
-u, --udp UDP mode
|
230
|
+
-S, --start-tls Initiate TLS
|
231
|
+
-r, --reconnect Attempt to reconnect endlessly.
|
232
|
+
-s, --source=(ADDR:?)PORT Bind client on port and addr
|
233
|
+
|
234
|
+
|
235
|
+
=== unhexify
|
236
|
+
|
237
|
+
unhexify converts a string of hex bytes back to raw data. Input can be
|
238
|
+
supplied via stdin, a hex-string argument, or a file containing hex (use -f).
|
239
|
+
|
240
|
+
Usage: unhexify [options] <data | blank for stdin>
|
241
|
+
-h, --help Show this message
|
242
|
+
-v, --version Show version and exit
|
243
|
+
-f, --file FILENAME Input from FILENAME
|
244
|
+
-d, --delim DELIMITER DELIMITER regex between hex chunks
|
245
|
+
|
246
|
+
|
247
|
+
=== urldec
|
248
|
+
|
249
|
+
Decodes a url percent-encoded string.
|
250
|
+
Input from stdin, file, or command-line argument.
|
251
|
+
|
252
|
+
Usage: urldec [options] <data | blank for stdin>
|
253
|
+
-h, --help Show this message
|
254
|
+
-v, --version Show version and exit
|
255
|
+
-f, --file FILENAME Input from FILENAME
|
256
|
+
-p, --[no-]plus Convert '+' to space (default is true)
|
257
|
+
|
258
|
+
|
259
|
+
=== urlenc
|
260
|
+
|
261
|
+
Encodes data as a url percent-encoded string.
|
262
|
+
Input from stdin, file, or command-line argument.
|
263
|
+
|
264
|
+
Usage: urlenc [options] <data | blank for stdin>
|
265
|
+
-h, --help Show this message
|
266
|
+
-v, --version Show version and exit
|
267
|
+
-f, --file FILENAME Input from FILENAME
|
268
|
+
-p, --[no-]plus Convert spaces to '+' (default is false)
|
269
|
+
|
270
|
+
|
271
|
+
=== xor
|
272
|
+
|
273
|
+
Repeating string xor. Takes input and XOR's it against a string.
|
274
|
+
String can be provided in hex.
|
275
|
+
|
276
|
+
Usage: xor [options] -k|-s <key> <data | stdin>
|
277
|
+
-h, --help Show this message
|
278
|
+
-v, --version Show version and exit
|
279
|
+
-f, --file FILENAME Input from FILENAME
|
280
|
+
|
281
|
+
Key options (one of the following is required):
|
282
|
+
-s, --strkey STRING xor against bare STRING
|
283
|
+
-x, --hexkey HEXSTR xor against decoded HEXSTR
|
284
|
+
|
285
|
+
|
data/doctor-bag.jpg
ADDED
Binary file
|
data/lib/rbkb.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
|
2
|
+
module Rbkb
|
3
|
+
|
4
|
+
# :stopdoc:
|
5
|
+
VERSION = '0.6.10'
|
6
|
+
LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
|
7
|
+
PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
|
8
|
+
# :startdoc:
|
9
|
+
|
10
|
+
# Returns the version string for the library.
|
11
|
+
#
|
12
|
+
def self.version
|
13
|
+
VERSION
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns the library path for the module. If any arguments are given,
|
17
|
+
# they will be joined to the end of the libray path using
|
18
|
+
# <tt>File.join</tt>.
|
19
|
+
#
|
20
|
+
def self.libpath( *args )
|
21
|
+
args.empty? ? LIBPATH : ::File.join(LIBPATH, args.flatten)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Returns the lpath for the module. If any arguments are given,
|
25
|
+
# they will be joined to the end of the path using
|
26
|
+
# <tt>File.join</tt>.
|
27
|
+
#
|
28
|
+
def self.path( *args )
|
29
|
+
args.empty? ? PATH : ::File.join(PATH, args.flatten)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Utility method used to require all files ending in .rb that lie in the
|
33
|
+
# directory below this file that has the same name as the filename passed
|
34
|
+
# in. Optionally, a specific _directory_ name can be passed in such that
|
35
|
+
# the _filename_ does not have to be equivalent to the directory.
|
36
|
+
#
|
37
|
+
def self.require_all_libs_relative_to( fname, dir = nil )
|
38
|
+
dir ||= ::File.basename(fname, '.*')
|
39
|
+
search_me = ::File.expand_path(
|
40
|
+
::File.join(::File.dirname(fname), dir, '**', '*.rb'))
|
41
|
+
|
42
|
+
Dir.glob(search_me).sort.each {|rb| require rb}
|
43
|
+
end
|
44
|
+
|
45
|
+
end # module Rbkb
|
46
|
+
|
47
|
+
#Rbkb.require_all_libs_relative_to(__FILE__)
|
48
|
+
|
49
|
+
require 'rbkb/extends'
|
50
|
+
|
51
|
+
# EOF
|
data/lib/rbkb/cli.rb
ADDED
@@ -0,0 +1,219 @@
|
|
1
|
+
require 'rbkb'
|
2
|
+
require 'optparse'
|
3
|
+
|
4
|
+
# Copyright 2009 emonti at matasano.com
|
5
|
+
# See README.rdoc for license information
|
6
|
+
#
|
7
|
+
module Rbkb::Cli
|
8
|
+
|
9
|
+
# Rbkb::Cli::Executable is an abstract class for creating command line
|
10
|
+
# executables using the Ruby Black Bag framework.
|
11
|
+
class Executable
|
12
|
+
|
13
|
+
def self.run(param={})
|
14
|
+
new(param).go
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_accessor :stdout, :stderr, :stdin, :argv, :opts, :oparse
|
18
|
+
attr_reader :exit_status
|
19
|
+
|
20
|
+
# Instantiates a new Executable object.
|
21
|
+
#
|
22
|
+
# The 'param' argument is a named value hash. The following keys are
|
23
|
+
# significant:
|
24
|
+
#
|
25
|
+
# :argv - An array of cli arguments (default ARGV)
|
26
|
+
# :opts - executable/function options for use when running 'go'
|
27
|
+
# :stdout, - IO redirection (mostly for unit tests)
|
28
|
+
# :stderr,
|
29
|
+
# :stdin
|
30
|
+
#
|
31
|
+
#
|
32
|
+
# The above keys are deleted from the 'param' hash and stored as instance
|
33
|
+
# variables with attr_accessors. All other parameters are ignored.
|
34
|
+
def initialize(param={})
|
35
|
+
@argv ||= param.delete(:argv) || ARGV
|
36
|
+
@stdout ||= param.delete(:stdout) || STDOUT
|
37
|
+
@stderr ||= param.delete(:stderr) || STDERR
|
38
|
+
@stdin ||= param.delete(:stdin) || STDIN
|
39
|
+
@opts ||= param.delete(:opts) || {}
|
40
|
+
@parser_got_range=nil
|
41
|
+
yield self if block_given?
|
42
|
+
make_parser()
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
# Wrapper for Kernel.exit() so we can unit test cli tools
|
47
|
+
def exit(ret)
|
48
|
+
@exit_status = ret
|
49
|
+
if defined? Rbkb::Cli::TESTING
|
50
|
+
throw(((ret==0)? :exit_zero : :exit_err), ret)
|
51
|
+
else
|
52
|
+
Kernel.exit(ret)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
# This method exits with a message on stderr
|
58
|
+
def bail(msg)
|
59
|
+
@stderr.puts msg if msg
|
60
|
+
self.exit(1)
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
# This method wraps a 'bail' with a basic argument error mesage and hint
|
65
|
+
# for the '-h or --help' flag
|
66
|
+
# The 'arg_err' parameter is a string with the erroneous arguments
|
67
|
+
def bail_args(arg_err)
|
68
|
+
bail "Error: bad arguments - #{arg_err}\n Hint: Use -h or --help"
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
# Prepares an OptionsParser object with blackbag standard options
|
73
|
+
# This is called from within initialize() and should be overridden in
|
74
|
+
# inherited classes to add additional OptionParser-based parsers.
|
75
|
+
#
|
76
|
+
# See parse for actual parsing.
|
77
|
+
def make_parser
|
78
|
+
@oparse ||= OptionParser.new
|
79
|
+
@oparse.banner = "Usage: #{File.basename $0} [options]"
|
80
|
+
|
81
|
+
@oparse.on("-h", "--help", "Show this message") do
|
82
|
+
bail(@oparse)
|
83
|
+
end
|
84
|
+
|
85
|
+
@oparse.on("-v", "--version", "Show version and exit") do
|
86
|
+
@stdout.puts("Ruby BlackBag version #{Rbkb::VERSION}")
|
87
|
+
self.exit(0)
|
88
|
+
end
|
89
|
+
|
90
|
+
return @oparse
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
# Abstract argument parser. Override this method with super() from
|
95
|
+
# inherited executables. The base method just calls OptionParser.parse!
|
96
|
+
# on the internal @oparse object.
|
97
|
+
def parse
|
98
|
+
# parse flag arguments
|
99
|
+
@oparse.parse!(@argv) rescue(bail_args($!))
|
100
|
+
@parsed=true
|
101
|
+
|
102
|
+
# the overriding class may implement additional arguments from here
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
# Abstract 'runner'. Override this method with super() from inherited
|
107
|
+
# executables. The base method just slurps in an optional argv and
|
108
|
+
# runs 'parse' if it hasn't already
|
109
|
+
def go(argv=nil)
|
110
|
+
@exit_status = nil
|
111
|
+
@argv = argv if argv
|
112
|
+
|
113
|
+
parse
|
114
|
+
|
115
|
+
# the overriding class implements actual functionality beyond here
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
private
|
120
|
+
|
121
|
+
# Wraps a file read with a standard bail error message
|
122
|
+
def do_file_read(f)
|
123
|
+
File.read(f) rescue(bail "File Read Error: #{$!}")
|
124
|
+
end
|
125
|
+
|
126
|
+
|
127
|
+
# Implements a basic input file argument. File reading is handled
|
128
|
+
# by do_file_read().
|
129
|
+
#
|
130
|
+
# Takes one argument, which is the @opts hash keyname to store
|
131
|
+
# the file data into.
|
132
|
+
# (Used commonly throughout several executables)
|
133
|
+
def add_std_file_opt(inkey)
|
134
|
+
@oparse.on("-f", "--file FILENAME", "Input from FILENAME") do |f|
|
135
|
+
@opts[inkey] = do_file_read(f)
|
136
|
+
end
|
137
|
+
return @oparse
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
# Implements numeric and hex range options via '-r' and '-x'
|
142
|
+
#
|
143
|
+
# Takes two arguments which are the @opts hash key names for
|
144
|
+
# first and last parameters.
|
145
|
+
#
|
146
|
+
# (Used commonly throughout several executables)
|
147
|
+
def add_range_opts(fkey, lkey)
|
148
|
+
@oparse.on("-r", "--range=START[:END]",
|
149
|
+
"Start and optional end range") do |r|
|
150
|
+
|
151
|
+
raise "-x and -r are mutually exclusive" if @parser_got_range
|
152
|
+
@parser_got_range=true
|
153
|
+
|
154
|
+
unless m=/^(-?[0-9]+)(?::(-?[0-9]+))?$/.match(r)
|
155
|
+
raise "invalid range #{r.inspect}"
|
156
|
+
end
|
157
|
+
|
158
|
+
@opts[fkey] = $1.to_i
|
159
|
+
@opts[lkey] = $2.to_i if $2
|
160
|
+
end
|
161
|
+
|
162
|
+
@oparse.on("-x", "--hexrange=START[:END]",
|
163
|
+
"Start and optional end range in hex") do |r|
|
164
|
+
|
165
|
+
raise "-x and -r are mutually exclusive" if @parser_got_range
|
166
|
+
@parser_got_range=true
|
167
|
+
|
168
|
+
unless m=/^(-?[0-9a-f]+)(?::(-?[0-9a-f]+))?$/i.match(r)
|
169
|
+
raise "invalid range #{r.inspect}"
|
170
|
+
end
|
171
|
+
|
172
|
+
@opts[fkey] =
|
173
|
+
if ($1[0,1] == '-')
|
174
|
+
($1[1..-1]).hex_to_num * -1
|
175
|
+
else
|
176
|
+
$1.hex_to_num
|
177
|
+
end
|
178
|
+
|
179
|
+
if $2
|
180
|
+
@opts[lkey] =
|
181
|
+
if($2[0,1] == '-')
|
182
|
+
$2[1..-1].hex_to_num * -1
|
183
|
+
else
|
184
|
+
$2.hex_to_num
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
|
191
|
+
# Conditionally parses a string argument. Uses 'key' to first check for
|
192
|
+
# then store it in @opts hash if it is not yet there.
|
193
|
+
# (Used commonly throughout several executables)
|
194
|
+
def parse_string_argument(key)
|
195
|
+
if @opts[key].nil? and s=@argv.shift
|
196
|
+
@opts[key] = s.dup
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
|
201
|
+
# Conditionally parses a file argument. Uses 'key' to first check for
|
202
|
+
# then store it in @opts hash if it is not yet there.
|
203
|
+
# (Used commonly throughout several executables)
|
204
|
+
def parse_file_argument(key)
|
205
|
+
if @opts[key].nil? and f=@argv.shift
|
206
|
+
@opts[key] = do_file_read(f)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
# For use at the end of a parser - calls bail_args with remaining
|
211
|
+
# arguments if there are extra arguments.
|
212
|
+
# (Used commonly throughout several executables)
|
213
|
+
def parse_catchall
|
214
|
+
bail_args(@argv.join(' ')) if(@argv.length != 0)
|
215
|
+
end
|
216
|
+
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|