rb-wartslib 0.9.12 → 0.9.13

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,3 +1,40 @@
1
+ version 0.9.13, 2008-02-01
2
+ * fixed Warts::File#open to handle paths with spaces and other special
3
+ characters
4
+ * implemented methods to retrieve hop TLV values; namely,
5
+ hop_reply_ipid
6
+ hop_reply_iptos
7
+ hop_next_hop_mtu
8
+ hop_inner_iplen
9
+ hop_inner_ipttl
10
+ hop_inner_iptos
11
+ * implemented Warts::Trace#hop_has_reply_ttl?; you should call this when
12
+ Warts::Trace#hop_reply_ttl returns 0, to distinguish between a true
13
+ 0 reply TTL and a missing reply TTL
14
+ * implemented Warts::Trace#hop_has_tcp_reply? and #hop_has_icmp_reply?;
15
+ use these methods to determine which type of reply data is available,
16
+ either ICMP or TCP (these are mutually exclusive); the methods
17
+ Trace#hop_icmp_type, Trace#hop_icmp_code, and Trace#hop_tcp_flags
18
+ now return nil if a reply of the given type isn't available
19
+ * implemented Warts::Trace#hop_tcp_flags_breakdown
20
+ * implemented Warts::Trace.decompose_tcp_flags and decompose_hop_flags
21
+ convenience methods
22
+ * added Warts::Trace::STOP_REASON_TEXT which is a hash from stop reason
23
+ code to human-oriented text
24
+ * added Warts::Trace#dest and #dest_cmp methods; the previous #dst and
25
+ #dst_cmp methods are still available but deprecated
26
+ * moved Warts::File::TRACE, Warts::File::LIST, Warts::File::CYCLE_START,
27
+ etc. constants to Warts::TRACE, Warts::LIST, etc.; the previous definitions
28
+ are still available, though deprecated
29
+ * added Warts::Trace::HOP_FLAG_TCP
30
+ * changed to export the internal scamper constant SCAMPER_TRACE_STOP_DEAD
31
+ as Warts::Trace::STOP_GAPLIMIT rather than Warts::Trace::STOP_DEAD; this
32
+ is in keeping with recent changes in scamper; the old STOP_DEAD constant
33
+ is still available for backwards compatibility, though deprecated
34
+ * made internal changes needed to build with scamper-cvs-20070523j
35
+ * updated sample scripts to use newest non-deprecated methods; also
36
+ improved stat-traces script to print out TCP flags stats
37
+
1
38
  version 0.9.12, 2008-01-16
2
39
  * renamed Warts::Trace#each_attempt to each_response
3
40
  * renamed Warts::Trace#each_hop_and_attempt to each_hop_and_response
data/README CHANGED
@@ -12,8 +12,9 @@ This extension will be useful to network researchers, operators, and users
12
12
  who need to analyze or process warts files.
13
13
 
14
14
  Please see the project home page at http://rb-wartslib.rubyforge.org/
15
- for further documentation and sample code. Sample code is also available
16
- in the 'bin' subdirectory.
15
+ for further documentation and sample code. A possibly older copy of the
16
+ project page and documentation is available in the 'docs' subdirectory.
17
+ Sample code is also available in the 'bin' subdirectory.
17
18
 
18
19
 
19
20
  INSTALLING
@@ -40,7 +41,7 @@ That will build libscamperfile.a, which is what rb-wartslib links against.
40
41
  Now build and install rb-wartslib:
41
42
 
42
43
  $ SCAMPER=/Users/youngh/scamper-cvs-20070523h
43
- (set the above to the directory where you built scamper)
44
+ (set the above to the *absolute* directory where you built scamper)
44
45
  $ sudo gem install rb-wartslib -- --with-scamper-include=$SCAMPER --with-scamper-lib=$SCAMPER
45
46
 
46
47
  That's it.
@@ -49,9 +50,11 @@ That's it.
49
50
  CONTACT
50
51
  -------
51
52
 
52
- rb-wartslib is written by Young Hyun. You may contact him at
53
- youngh AT rubyforge.org, or use the tracker/forums at
54
- http://rubyforge.org/projects/rb-wartslib/ for getting help.
53
+ rb-wartslib is written and maintained by Young Hyun as a part of
54
+ CAIDA's work on the Archipelago Measurement Infrastructure
55
+ [http://www.caida.org/projects/ark/]. You may contact him at youngh
56
+ AT rubyforge.org, or use the tracker/forums at the RubyForge project
57
+ page for getting help.
55
58
 
56
59
  Please direct scamper questions, including problems building it,
57
60
  to Matthew Luckie:
@@ -21,7 +21,7 @@
21
21
  ## along with this program; if not, write to the Free Software
22
22
  ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23
23
  ##
24
- ## $Id: count-traces,v 1.1 2007/11/30 01:14:47 youngh Exp $
24
+ ## $Id: count-traces,v 1.3 2008/02/02 00:01:23 youngh Exp $
25
25
  #############################################################################
26
26
 
27
27
  require 'rubygems'
@@ -30,13 +30,13 @@ require 'wartslib'
30
30
  total = 0
31
31
  ARGV.each do |path|
32
32
  file = Warts::File::open path
33
- file.add_filters Warts::File::TRACE
33
+ file.add_filters Warts::TRACE
34
34
 
35
35
  count = 0
36
36
  file.read { count += 1 }
37
37
 
38
- puts "%8d %s" % [count, path]
38
+ printf "%8d %s\n", count, path
39
39
  total += count
40
40
  end
41
41
 
42
- puts "%8d total" % [total]
42
+ printf "%8d total\n", total
@@ -20,7 +20,7 @@
20
20
  ## along with this program; if not, write to the Free Software
21
21
  ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
22
  ##
23
- ## $Id: create-aspath,v 1.1 2007/11/30 01:14:47 youngh Exp $
23
+ ## $Id: create-aspath,v 1.3 2008/02/02 00:01:23 youngh Exp $
24
24
  #############################################################################
25
25
 
26
26
  require 'rubygems'
@@ -84,7 +84,7 @@ def extract_ippath(trace)
84
84
  end
85
85
  end
86
86
 
87
- retval << trace.dst if dest_response
87
+ retval << trace.dest if dest_response
88
88
  retval
89
89
  end
90
90
 
@@ -129,7 +129,7 @@ ARGV.each do |path|
129
129
  next
130
130
  end
131
131
 
132
- file.add_filters Warts::File::TRACE
132
+ file.add_filters Warts::TRACE
133
133
  file.read do |trace|
134
134
  if $options.verbose
135
135
  puts "-" * 78
@@ -24,7 +24,7 @@
24
24
  ## along with this program; if not, write to the Free Software
25
25
  ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26
26
  ##
27
- ## $Id: extract-trace-addrs,v 1.2 2007/12/08 00:56:04 youngh Exp $
27
+ ## $Id: extract-trace-addrs,v 1.4 2008/02/02 00:01:24 youngh Exp $
28
28
  #############################################################################
29
29
 
30
30
  require 'rubygems'
@@ -69,7 +69,7 @@ def extract_addresses(trace, addresses)
69
69
  addresses[trace.hop_addr(hop, response)] += 1
70
70
  end
71
71
 
72
- addresses[trace.dst] += 1 if dest_response
72
+ addresses[trace.dest] += 1 if dest_response
73
73
  end
74
74
 
75
75
 
@@ -82,7 +82,7 @@ addresses = Hash.new { |h,k| h[k] = 0 }
82
82
  ARGV.each do |path|
83
83
  $stderr.puts "examining #{path} ..."
84
84
  Warts::File.open(path) do |file|
85
- file.add_filters Warts::File::TRACE
85
+ file.add_filters Warts::TRACE
86
86
  file.read do |trace|
87
87
  extract_addresses trace, addresses
88
88
  end
@@ -20,7 +20,7 @@
20
20
  ## along with this program; if not, write to the Free Software
21
21
  ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
22
  ##
23
- ## $Id: modify-traces,v 1.1 2007/11/30 01:14:48 youngh Exp $
23
+ ## $Id: modify-traces,v 1.2 2008/02/02 00:01:24 youngh Exp $
24
24
  #############################################################################
25
25
 
26
26
  require 'rubygems'
@@ -98,9 +98,9 @@ ARGV.each do |path|
98
98
  puts "processing #{path} ..."
99
99
 
100
100
  file = Warts::File::open path
101
- filters = [ Warts::File::TRACE ]
102
- filters << Warts::File::CYCLE_START unless options.delete_cycle_start
103
- filters << Warts::File::CYCLE_STOP unless options.delete_cycle_stop
101
+ filters = [ Warts::TRACE ]
102
+ filters << Warts::CYCLE_START unless options.delete_cycle_start
103
+ filters << Warts::CYCLE_STOP unless options.delete_cycle_stop
104
104
  file.add_filters *filters
105
105
 
106
106
  list = nil
@@ -111,13 +111,13 @@ ARGV.each do |path|
111
111
  list = element.list.derive list_options unless list
112
112
 
113
113
  case element.element_type
114
- when Warts::File::CYCLE_START, Warts::File::CYCLE_STOP
114
+ when Warts::CYCLE_START, Warts::CYCLE_STOP
115
115
  unless cycle
116
116
  options = {:list => list}.merge(cycle_options)
117
117
  options.delete(:stop_time) # leave stop_time to 0 for START records
118
118
  cycle = element.derive options
119
119
 
120
- if element.element_type == Warts::File::CYCLE_STOP &&
120
+ if element.element_type == Warts::CYCLE_STOP &&
121
121
  cycle_options.has_key?(:stop_time)
122
122
  element = cycle.derive :stop_time => cycle_options[:stop_time]
123
123
  else
@@ -127,7 +127,7 @@ ARGV.each do |path|
127
127
  out.write element # write out a START record only once per file
128
128
  end
129
129
 
130
- when Warts::File::TRACE
130
+ when Warts::TRACE
131
131
  cycle = element.cycle.derive list, cycle_options unless cycle
132
132
  element.cycle = cycle
133
133
  out.write element
data/bin/scdump CHANGED
@@ -20,7 +20,7 @@
20
20
  ## along with this program; if not, write to the Free Software
21
21
  ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
22
  ##
23
- ## $Id: scdump,v 1.13 2007/12/08 00:43:19 youngh Exp $
23
+ ## $Id: scdump,v 1.15 2008/02/02 00:01:24 youngh Exp $
24
24
  #############################################################################
25
25
 
26
26
  require 'rubygems'
@@ -44,7 +44,7 @@ $halt_reason[Warts::Trace::STOP_DEAD] = "G"
44
44
  def show_trace(trace)
45
45
  fields = ["T"]
46
46
 
47
- fields.push trace.src, trace.dst, trace.list_id, trace.cycle_id, trace.start
47
+ fields.push trace.src, trace.dest, trace.list_id, trace.cycle_id, trace.start
48
48
 
49
49
  dest_response = trace.find_dest_response
50
50
  if dest_response
@@ -111,7 +111,7 @@ end
111
111
 
112
112
  ARGV.each do |path|
113
113
  file = Warts::File::open path
114
- file.add_filters Warts::File::TRACE
114
+ file.add_filters Warts::TRACE
115
115
  while (trace = file.read)
116
116
  show_trace trace
117
117
  end
@@ -22,7 +22,7 @@
22
22
  ## along with this program; if not, write to the Free Software
23
23
  ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24
24
  ##
25
- ## $Id: select-traces,v 1.1 2007/11/30 01:14:48 youngh Exp $
25
+ ## $Id: select-traces,v 1.3 2008/02/02 00:01:24 youngh Exp $
26
26
  #############################################################################
27
27
 
28
28
  require 'rubygems'
@@ -170,18 +170,18 @@ class Stats
170
170
  end
171
171
 
172
172
  def print
173
- puts "%8d traces" % [@traces]
174
- puts "%8d responding (%.1f%%)" % [@responding, pct(@responding, @traces)]
175
- puts "%8d complete (%.1f%%)" % [@complete, pct(@complete, @traces)]
176
- puts "%8d dead traces with zero hop count (%.1f%%)" %
177
- [ @zero_dead, pct(@zero_dead, @traces) ]
173
+ printf "%8d traces\n", @traces
174
+ printf "%8d responding (%.1f%%)\n", @responding, pct(@responding, @traces)
175
+ printf "%8d complete (%.1f%%)\n", @complete, pct(@complete, @traces)
176
+ printf "%8d dead traces with zero hop count (%.1f%%)\n",
177
+ @zero_dead, pct(@zero_dead, @traces)
178
178
  puts
179
179
  stop_reason.to_a.sort.each do |k, v|
180
- puts "%8d stop reason %d, %s" % [v, k, @stop_text[k]]
180
+ printf "%8d stop reason %d, %s\n", v, k, @stop_text[k]
181
181
  end
182
182
  puts
183
183
  @hop_histogram.to_a.sort.each do |k, v|
184
- puts "%8d %d hops" % [v, k]
184
+ printf "%8d %d hops\n", v, k
185
185
  end
186
186
  end
187
187
 
@@ -226,7 +226,7 @@ ARGV.each do |path|
226
226
  exit 1
227
227
  end
228
228
 
229
- file.add_filters Warts::File::TRACE
229
+ file.add_filters Warts::TRACE
230
230
  file.read do |trace|
231
231
  trace_index += 1
232
232
  next if trace_index <= $options.skip_traces
@@ -21,7 +21,7 @@
21
21
  ## along with this program; if not, write to the Free Software
22
22
  ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23
23
  ##
24
- ## $Id: show-cycles,v 1.1 2007/11/30 01:14:48 youngh Exp $
24
+ ## $Id: show-cycles,v 1.2 2008/02/02 00:01:24 youngh Exp $
25
25
  #############################################################################
26
26
 
27
27
  require "rubygems"
@@ -29,9 +29,9 @@ require 'wartslib'
29
29
 
30
30
  def cycle_type(element)
31
31
  case element.element_type
32
- when Warts::File::CYCLE_START: "START"
33
- when Warts::File::CYCLE_DEF: "DEF"
34
- when Warts::File::CYCLE_STOP: "STOP"
32
+ when Warts::CYCLE_START: "START"
33
+ when Warts::CYCLE_DEF: "DEF"
34
+ when Warts::CYCLE_STOP: "STOP"
35
35
  end
36
36
  end
37
37
 
@@ -42,8 +42,7 @@ end
42
42
  ARGV.each do |path|
43
43
  puts ">> #{path}"
44
44
  Warts::File::open(path) do |file|
45
- file.add_filters Warts::File::CYCLE_START, Warts::File::CYCLE_DEF,
46
- Warts::File::CYCLE_STOP
45
+ file.add_filters Warts::CYCLE_START, Warts::CYCLE_DEF, Warts::CYCLE_STOP
47
46
  file.read do |c|
48
47
  start_date = ts_date c.start_time
49
48
  stop_date = ts_date c.stop_time
@@ -21,7 +21,7 @@
21
21
  ## along with this program; if not, write to the Free Software
22
22
  ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23
23
  ##
24
- ## $Id: split-traces-by-type,v 1.1 2007/11/30 01:14:48 youngh Exp $
24
+ ## $Id: split-traces-by-type,v 1.2 2008/02/02 00:01:24 youngh Exp $
25
25
  #############################################################################
26
26
 
27
27
  require 'rubygems'
@@ -83,7 +83,7 @@ if ARGV.length > 0
83
83
  split = SplitFiles.new filename
84
84
 
85
85
  Warts::File::open(filename) do |file|
86
- file.add_filters Warts::File::TRACE
86
+ file.add_filters Warts::TRACE
87
87
  file.read do |element|
88
88
  split.sort_trace element
89
89
  end
@@ -20,7 +20,7 @@
20
20
  ## along with this program; if not, write to the Free Software
21
21
  ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
22
  ##
23
- ## $Id: stat-traces,v 1.3 2007/12/08 00:56:04 youngh Exp $
23
+ ## $Id: stat-traces,v 1.10 2008/02/02 00:01:24 youngh Exp $
24
24
  #############################################################################
25
25
 
26
26
  require 'rubygems'
@@ -29,7 +29,7 @@ require 'wartslib'
29
29
 
30
30
  class Stats
31
31
  attr_accessor :traces, :responding, :complete, :stop_reason, :icmp_reason
32
- attr_accessor :hop_histogram, :zero_dead
32
+ attr_accessor :hop_histogram
33
33
 
34
34
  # Based on http://www.iana.org/assignments/icmp-parameters
35
35
  ICMP_TYPE_NAMES = {
@@ -84,33 +84,18 @@ class Stats
84
84
  @complete = 0
85
85
  @stop_reason = Hash.new 0
86
86
  @icmp_reason = Hash.new 0 # "#{icmp_type} #{icmp_code}"
87
-
88
- # from scamper_trace.h:SCAMPER_TRACE_STOP_*
89
- @stop_text = {
90
- 0 => "none (null reason)",
91
- 1 => "completed (got an ICMP port unreach)",
92
- 2 => "unreach (got an other ICMP unreach code)",
93
- 3 => "icmp (got an ICMP msg, not unreach)",
94
- 4 => "loop (loop detected)",
95
- 5 => "dead (unresponsive target)",
96
- 6 => "error (sendto error)"
97
- }
98
- @stop_text.default = "<<UNKNOWN STOP CODE>>"
99
-
87
+ @tcp_flags = Hash.new 0
100
88
  @hop_histogram = Hash.new 0
101
- @zero_dead = 0
102
89
  end
103
90
 
104
91
  def print
105
- puts "%8d traces" % [@traces]
106
- puts "%8d responding (%.1f%%)" % [@responding, pct(@responding, @traces)]
107
- puts "%8d complete (%.1f%%)" % [@complete, pct(@complete, @traces)]
108
- puts "%8d dead traces with zero hop count (%.1f%%)" %
109
- [ @zero_dead, pct(@zero_dead, @traces) ]
92
+ printf "%8d traces\n", @traces
93
+ printf "%8d responding (%.1f%%)\n", @responding, pct(@responding, @traces)
94
+ printf "%8d complete (%.1f%%)\n", @complete, pct(@complete, @traces)
110
95
 
111
96
  puts
112
97
  @stop_reason.to_a.sort.each do |k, v|
113
- puts "%8d stop reason %d, %s" % [v, k, @stop_text[k]]
98
+ printf "%8d stop reason %d, %s\n", v, k, Warts::Trace::STOP_REASON_TEXT[k]
114
99
  end
115
100
 
116
101
  puts
@@ -127,12 +112,20 @@ class Stats
127
112
  end
128
113
  names += ")"
129
114
  end
130
- puts "%8d icmp type %d, code %d%s" % [v, t, c, names]
115
+ printf "%8d icmp type %d, code %d%s\n", v, t, c, names
116
+ end
117
+
118
+ unless @tcp_flags.empty?
119
+ puts
120
+ @tcp_flags.to_a.sort.each do |k, v|
121
+ printf "%8d tcp flags %d ", v, k
122
+ p Warts::Trace.decompose_tcp_flags(k)
123
+ end
131
124
  end
132
125
 
133
126
  puts
134
127
  @hop_histogram.to_a.sort.each do |k, v|
135
- puts "%8d %d hops" % [v, k]
128
+ printf "%8d %d hops\n", v, k
136
129
  end
137
130
  end
138
131
 
@@ -140,6 +133,10 @@ class Stats
140
133
  @icmp_reason[icmp_type << 8 | icmp_code] += 1
141
134
  end
142
135
 
136
+ def add_tcp_flags(flags)
137
+ @tcp_flags[flags] += 1
138
+ end
139
+
143
140
  def add(other)
144
141
  @traces += other.traces
145
142
  @responding += other.responding
@@ -147,7 +144,6 @@ class Stats
147
144
  other.stop_reason.each { |k,v| @stop_reason[k] += v }
148
145
  other.icmp_reason.each { |k,v| @icmp_reason[k] += v }
149
146
  other.hop_histogram.each { |k,v| @hop_histogram[k] += v }
150
- @zero_dead += other.zero_dead
151
147
  end
152
148
 
153
149
  def pct(x, y)
@@ -163,7 +159,7 @@ total = Stats.new
163
159
  ARGV.each do |path|
164
160
  stats = Stats.new
165
161
  Warts::File.open(path) do |file|
166
- file.add_filters Warts::File::TRACE
162
+ file.add_filters Warts::TRACE
167
163
  file.read do |trace|
168
164
  stats.traces += 1
169
165
  stats.responding += 1 if trace.dest_responded?
@@ -175,13 +171,16 @@ ARGV.each do |path|
175
171
  # values for the response from the destination.
176
172
  trace.each_hop_and_response do |hop, response, exists|
177
173
  next unless exists
178
- icmp_type = trace.hop_icmp_type hop, response
179
- icmp_code = trace.hop_icmp_code hop, response
180
- stats.add_icmp_reason icmp_type, icmp_code
174
+ if trace.hop_has_icmp_reply? hop, response
175
+ icmp_type = trace.hop_icmp_type hop, response
176
+ icmp_code = trace.hop_icmp_code hop, response
177
+ stats.add_icmp_reason icmp_type, icmp_code
178
+ else
179
+ stats.add_tcp_flags trace.hop_tcp_flags(hop, response)
180
+ end
181
181
  end
182
182
 
183
183
  stats.hop_histogram[trace.path_length] += 1
184
- stats.zero_dead += 1 if trace.stop_reason == 5 && trace.hop_count == 0
185
184
  end
186
185
  end
187
186