rb-wartslib 0.9.10 → 0.9.11

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/CHANGES CHANGED
@@ -1,3 +1,7 @@
1
+ version 0.9.11, 2007-11-29:
2
+ * added more sample code to the 'bin' subdirectory
3
+ * added GPLv2+ license header to sample code
4
+
1
5
  version 0.9.10, 2007-11-28:
2
6
  * added GPLv2+ license header to source files
3
7
  * changed to use __HAVE_STDINT_H__ instead of __APPLE__ when including
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #############################################################################
4
+ ## Prints out the count of traces in each input warts file, as well as
5
+ ## the total across all files.
6
+ ##
7
+ ## --------------------------------------------------------------------------
8
+ ## Copyright (C) 2007 The Regents of the University of California.
9
+ ##
10
+ ## This program is free software; you can redistribute it and/or modify
11
+ ## it under the terms of the GNU General Public License as published by
12
+ ## the Free Software Foundation; either version 2 of the License, or
13
+ ## (at your option) any later version.
14
+ ##
15
+ ## This program is distributed in the hope that it will be useful,
16
+ ## but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ ## GNU General Public License for more details.
19
+ ##
20
+ ## You should have received a copy of the GNU General Public License
21
+ ## along with this program; if not, write to the Free Software
22
+ ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23
+ ##
24
+ ## $Id: count-traces,v 1.1 2007/11/30 01:14:47 youngh Exp $
25
+ #############################################################################
26
+
27
+ require 'rubygems'
28
+ require 'wartslib'
29
+
30
+ total = 0
31
+ ARGV.each do |path|
32
+ file = Warts::File::open path
33
+ file.add_filters Warts::File::TRACE
34
+
35
+ count = 0
36
+ file.read { count += 1 }
37
+
38
+ puts "%8d %s" % [count, path]
39
+ total += count
40
+ end
41
+
42
+ puts "%8d total" % [total]
@@ -0,0 +1,169 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #############################################################################
4
+ ## Converts warts traces to AS paths.
5
+ ##
6
+ ## --------------------------------------------------------------------------
7
+ ## Copyright (C) 2007 The Regents of the University of California.
8
+ ##
9
+ ## This program is free software; you can redistribute it and/or modify
10
+ ## it under the terms of the GNU General Public License as published by
11
+ ## the Free Software Foundation; either version 2 of the License, or
12
+ ## (at your option) any later version.
13
+ ##
14
+ ## This program is distributed in the hope that it will be useful,
15
+ ## but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ ## GNU General Public License for more details.
18
+ ##
19
+ ## You should have received a copy of the GNU General Public License
20
+ ## along with this program; if not, write to the Free Software
21
+ ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
+ ##
23
+ ## $Id: create-aspath,v 1.1 2007/11/30 01:14:47 youngh Exp $
24
+ #############################################################################
25
+
26
+ require 'rubygems'
27
+ require 'ostruct'
28
+ require 'optparse'
29
+ require 'enumerator'
30
+ require 'tempfile'
31
+
32
+ require 'wartslib'
33
+ require 'asfinder'
34
+
35
+ $options = OpenStruct.new
36
+
37
+ opts = OptionParser.new
38
+ opts.banner = "Usage: create-aspath [options] <warts-file-1> <warts-file-2> ..."
39
+
40
+ opts.on("-A", "--asfinder", "=FILE",
41
+ "IP to prefix/AS mapping file in ASFinder format") do |v|
42
+ $options.asfinder = v
43
+ end
44
+
45
+ opts.on("-l", "--links", TrueClass,
46
+ "prints AS links rather than AS paths") do |v|
47
+ $options.links = v
48
+ end
49
+
50
+ opts.on("-v", "--[no-]verbose", TrueClass, "show detailed progress") do |v|
51
+ $options.verbose = v
52
+ end
53
+
54
+ begin
55
+ ARGV.replace opts.parse(*ARGV)
56
+ rescue OptionParser::ParseError
57
+ $stderr.puts "ERROR: " + $!
58
+ $stderr.puts opts
59
+ exit 1
60
+ end
61
+
62
+ unless $options.asfinder
63
+ $stderr.puts "ERROR: missing --asfinder argument"
64
+ $stderr.puts opts
65
+ exit 1
66
+ end
67
+
68
+
69
+ #===========================================================================
70
+
71
+ # XXX only uses the first response at each hop
72
+ def extract_ippath(trace)
73
+ retval = []
74
+ retval << trace.src
75
+
76
+ dest_response = trace.find_dest_response
77
+
78
+ trace.each_hop do |hop, exists|
79
+ if exists
80
+ break if dest_response && hop == dest_response[0]
81
+ retval << trace.hop_addr(hop, 0)
82
+ else
83
+ retval << "q"
84
+ end
85
+ end
86
+
87
+ retval << trace.dst if dest_response
88
+ retval
89
+ end
90
+
91
+
92
+ def create_aspath(asfinder, ippath)
93
+ retval = []
94
+ ippath.each do |addr|
95
+ if addr == "q"
96
+ retval << "q" unless retval[-1] == "q"
97
+ else
98
+ as, prefix, len = asfinder.get_as addr
99
+ if as
100
+ if $options.verbose
101
+ retval << ("%s:%s/%d" % [as, prefix, len])
102
+ else
103
+ retval << as
104
+ end
105
+ else
106
+ retval << "?" unless retval[-1] == "?"
107
+ end
108
+ end
109
+ end
110
+ retval
111
+ end
112
+
113
+
114
+ #############################################################################
115
+ # Main
116
+ #############################################################################
117
+
118
+ asfinder = CAIDA::ASFinder.new $options.asfinder
119
+
120
+ if $options.links
121
+ as_links = Hash.new { |h2,k2| h2[k2] = 0 } # "AS1 AS2" => count
122
+ end
123
+
124
+ temp_file = nil
125
+ ARGV.each do |path|
126
+ file = Warts::File.open path
127
+ unless file
128
+ $stderr.puts "ERROR: couldn't open '#{path}'; skipping"
129
+ next
130
+ end
131
+
132
+ file.add_filters Warts::File::TRACE
133
+ file.read do |trace|
134
+ if $options.verbose
135
+ puts "-" * 78
136
+ puts trace.dump
137
+ end
138
+
139
+ ippath = extract_ippath trace
140
+ puts "\n" + ippath.join(" ") + "\n" if $options.verbose
141
+
142
+ aspath = create_aspath asfinder, ippath
143
+ if $options.verbose
144
+ puts aspath.join(" ")
145
+ aspath.map! { |x| x.split(":")[0] }
146
+ puts "\n" + aspath.join(" ")
147
+ end
148
+
149
+ uniq = [ aspath[0] ]
150
+ aspath.each do |as|
151
+ uniq << as unless uniq[-1] == as
152
+ end
153
+ puts if $options.verbose
154
+ puts "P " + uniq.join(" ") if $options.verbose || !$options.links
155
+
156
+ if $options.links
157
+ uniq.each_cons(2) do |x, y|
158
+ next if x == "q" || x == "?" || y == "q" || y == "?"
159
+ as_links["#{x} #{y}"] += 1
160
+ end
161
+ end
162
+ end
163
+ end
164
+
165
+ if $options.links
166
+ as_links.each do |link, count|
167
+ puts "L #{link} #{count}"
168
+ end
169
+ end
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #############################################################################
4
+ ## Extracts and prints out the unique IP addresses seen in the input warts
5
+ ## traces.
6
+ ##
7
+ ## This doesn't print out the monitor IP address (source address) or
8
+ ## nonresponding destinations.
9
+ ##
10
+ ## --------------------------------------------------------------------------
11
+ ## Copyright (C) 2007 The Regents of the University of California.
12
+ ##
13
+ ## This program is free software; you can redistribute it and/or modify
14
+ ## it under the terms of the GNU General Public License as published by
15
+ ## the Free Software Foundation; either version 2 of the License, or
16
+ ## (at your option) any later version.
17
+ ##
18
+ ## This program is distributed in the hope that it will be useful,
19
+ ## but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
+ ## GNU General Public License for more details.
22
+ ##
23
+ ## You should have received a copy of the GNU General Public License
24
+ ## along with this program; if not, write to the Free Software
25
+ ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26
+ ##
27
+ ## $Id: extract-trace-addrs,v 1.1 2007/11/30 01:14:48 youngh Exp $
28
+ #############################################################################
29
+
30
+ require 'rubygems'
31
+ require 'ostruct'
32
+ require 'optparse'
33
+ require 'enumerator'
34
+ require 'tempfile'
35
+
36
+ require 'wartslib'
37
+
38
+ $options = OpenStruct.new
39
+ $options.print_count = true
40
+
41
+ opts = OptionParser.new
42
+ opts.banner = "Usage: extract-trace-addrs [options] <warts-file-1> <warts-file-2> ..."
43
+
44
+ opts.on("-c", "--[no-]count", TrueClass, "print address frequency count") do |v|
45
+ $options.print_count = v
46
+ end
47
+
48
+ opts.on("-v", "--[no-]verbose", TrueClass, "show detailed progress") do |v|
49
+ $options.verbose = v
50
+ end
51
+
52
+ begin
53
+ ARGV.replace opts.parse(*ARGV)
54
+ rescue OptionParser::ParseError
55
+ $stderr.puts "ERROR: " + $!
56
+ $stderr.puts opts
57
+ exit 1
58
+ end
59
+
60
+
61
+ #===========================================================================
62
+
63
+ def extract_addresses(trace, addresses)
64
+ dest_response = trace.find_dest_response
65
+
66
+ trace.each_hop_and_attempt do |hop, attempt, exists|
67
+ next unless exists
68
+ break if dest_response && hop == dest_response[0]
69
+ addresses[trace.hop_addr(hop, attempt)] += 1
70
+ end
71
+
72
+ addresses[trace.dst] += 1 if dest_response
73
+ end
74
+
75
+
76
+ #############################################################################
77
+ # Main
78
+ #############################################################################
79
+
80
+ addresses = Hash.new { |h,k| h[k] = 0 }
81
+
82
+ ARGV.each do |path|
83
+ $stderr.puts "examining #{path} ..."
84
+ Warts::File.open(path) do |file|
85
+ file.add_filters Warts::File::TRACE
86
+ file.read do |trace|
87
+ extract_addresses trace, addresses
88
+ end
89
+ end
90
+ end
91
+
92
+ addresses.each do |addr, count|
93
+ if $options.print_count
94
+ puts addr + "\t" + count.to_s
95
+ else
96
+ puts addr
97
+ end
98
+ end
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #############################################################################
4
+ ## A script for modifying the cycle and list information in a trace file.
5
+ ##
6
+ ## --------------------------------------------------------------------------
7
+ ## Copyright (C) 2007 The Regents of the University of California.
8
+ ##
9
+ ## This program is free software; you can redistribute it and/or modify
10
+ ## it under the terms of the GNU General Public License as published by
11
+ ## the Free Software Foundation; either version 2 of the License, or
12
+ ## (at your option) any later version.
13
+ ##
14
+ ## This program is distributed in the hope that it will be useful,
15
+ ## but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ ## GNU General Public License for more details.
18
+ ##
19
+ ## You should have received a copy of the GNU General Public License
20
+ ## along with this program; if not, write to the Free Software
21
+ ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
+ ##
23
+ ## $Id: modify-traces,v 1.1 2007/11/30 01:14:48 youngh Exp $
24
+ #############################################################################
25
+
26
+ require 'rubygems'
27
+ require 'ostruct'
28
+ require 'optparse'
29
+
30
+ require 'wartslib'
31
+
32
+ list_options = {}
33
+ cycle_options = {}
34
+
35
+ options = OpenStruct.new
36
+ opts = OptionParser.new
37
+ opts.banner = "Usage: modify-traces [options] <warts-file-1> ..."
38
+
39
+ opts.on("--list", "=NUM", "list ID") do |v|
40
+ list_options[:id] = v.to_i
41
+ end
42
+
43
+ opts.on("--name", "=STR", "list name") do |v|
44
+ list_options[:name] = v
45
+ end
46
+
47
+ opts.on("--descr", "=STR", "list descr") do |v|
48
+ list_options[:descr] = v
49
+ end
50
+
51
+ opts.on("--monitor", "=STR", "canonical monitor name") do |v|
52
+ list_options[:monitor] = v
53
+ end
54
+
55
+ opts.on("--cycle", "=NUM", "cycle ID") do |v|
56
+ cycle_options[:id] = v.to_i
57
+ end
58
+
59
+ opts.on("--start-time", "=NUM", "cycle start time") do |v|
60
+ cycle_options[:start_time] = v.to_i
61
+ end
62
+
63
+ opts.on("--stop-time", "=NUM", "cycle stop time") do |v|
64
+ cycle_options[:stop_time] = v.to_i
65
+ end
66
+
67
+ opts.on("--hostname", "=STR", "hostname name") do |v|
68
+ cycle_options[:hostname] = v
69
+ end
70
+
71
+ opts.on("--[no-]delete-cycle-start", TrueClass,
72
+ "delete cycle start records") do |v|
73
+ options.delete_cycle_start = v
74
+ end
75
+
76
+ opts.on("--[no-]delete-cycle-stop", TrueClass,
77
+ "delete cycle stop records") do |v|
78
+ options.delete_cycle_stop = v
79
+ end
80
+
81
+ opts.on("-v", "--[no-]verbose", TrueClass, "show detailed progress") do |v|
82
+ options.verbose = v
83
+ end
84
+
85
+ begin
86
+ ARGV.replace opts.parse(*ARGV)
87
+ rescue OptionParser::ParseError
88
+ $stderr.puts "ERROR: " + $!
89
+ $stderr.puts opts
90
+ exit 1
91
+ end
92
+
93
+ Thread.abort_on_exception = true
94
+
95
+ #========================================================================
96
+
97
+ ARGV.each do |path|
98
+ puts "processing #{path} ..."
99
+
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
104
+ file.add_filters *filters
105
+
106
+ list = nil
107
+ cycle = nil
108
+
109
+ Warts::File::open(path + ".modified", "w") do |out|
110
+ file.read do |element|
111
+ list = element.list.derive list_options unless list
112
+
113
+ case element.element_type
114
+ when Warts::File::CYCLE_START, Warts::File::CYCLE_STOP
115
+ unless cycle
116
+ options = {:list => list}.merge(cycle_options)
117
+ options.delete(:stop_time) # leave stop_time to 0 for START records
118
+ cycle = element.derive options
119
+
120
+ if element.element_type == Warts::File::CYCLE_STOP &&
121
+ cycle_options.has_key?(:stop_time)
122
+ element = cycle.derive :stop_time => cycle_options[:stop_time]
123
+ else
124
+ element = cycle
125
+ end
126
+
127
+ out.write element # write out a START record only once per file
128
+ end
129
+
130
+ when Warts::File::TRACE
131
+ cycle = element.cycle.derive list, cycle_options unless cycle
132
+ element.cycle = cycle
133
+ out.write element
134
+ end
135
+ end
136
+ end
137
+ end