tor_extend 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Change.log +12 -0
- data/ReadME.txt +190 -0
- data/doc/ReadME_txt.html +301 -0
- data/doc/Tor.html +140 -0
- data/doc/Tor/Bridge.html +145 -0
- data/doc/Tor/CachedDesc.html +472 -0
- data/doc/Tor/Constants.html +185 -0
- data/doc/Tor/Router.html +146 -0
- data/doc/Tor/StatsObj.html +1209 -0
- data/doc/Tor/TController.html +1111 -0
- data/doc/created.rid +7 -0
- data/doc/images/add.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +90 -0
- data/doc/js/darkfish.js +153 -0
- data/doc/js/jquery.js +18 -0
- data/doc/js/navigation.js +142 -0
- data/doc/js/search.js +94 -0
- data/doc/js/search_index.js +1 -0
- data/doc/js/searcher.js +228 -0
- data/doc/lib/constants_rb.html +96 -0
- data/doc/lib/httpmod_rb.html +95 -0
- data/doc/lib/tcontroller_rb.html +93 -0
- data/doc/lib/tor_extend_rb.html +97 -0
- data/doc/lib/tstats_rb.html +93 -0
- data/doc/rdoc.css +543 -0
- data/doc/table_of_contents.html +159 -0
- data/lib/constants.rb +106 -0
- data/lib/httpmod.rb +89 -0
- data/lib/tcontroller.rb +475 -0
- data/lib/tor_extend.rb +189 -0
- data/lib/tstats.rb +514 -0
- data/tor_extend.gemspec +26 -0
- metadata +138 -0
data/Change.log
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
Changes since version 1.0.1 -> 1.0.2
|
2
|
+
~~~~~~~~~~~~~~~~~~~~~~~
|
3
|
+
|
4
|
+
1. Added Tor::TController.ds : returns ["w.x.y.z:port", ...]
|
5
|
+
2. Removed the Tor::Cacheddesc.ds
|
6
|
+
3. Removed the database column for dssource
|
7
|
+
4. Added a few more documentation to the source
|
8
|
+
|
9
|
+
# version 1.0.3
|
10
|
+
Added circuit.rb
|
11
|
+
added class Circuit, and methods including Circuit.built?
|
12
|
+
-extending.... almost done
|
data/ReadME.txt
ADDED
@@ -0,0 +1,190 @@
|
|
1
|
+
Please see the Unlicence disclaimer in Bendiken's tor-ruby gem.
|
2
|
+
|
3
|
+
<b>Installation instruction </b>
|
4
|
+
|
5
|
+
Run "gem install tor_extend"
|
6
|
+
|
7
|
+
If internet connection is available, it will install the Bendiken's Tor gem as well if it is not already installed. As well as socksify
|
8
|
+
For offline users, obtain a local copy of the Tor gem and install before proceeding.
|
9
|
+
Visit Bendiken's page[http://cypherpunk.rubyforge.org/tor/] for details on .
|
10
|
+
|
11
|
+
ri documentation included with examples.
|
12
|
+
Run "ri Tor::TController" after install to see examples.
|
13
|
+
|
14
|
+
<b>Examples</b>.
|
15
|
+
|
16
|
+
- How to use Tor control
|
17
|
+
|
18
|
+
require 'tor_extend'
|
19
|
+
proxy_config={:type=>'tor' ,:port=>9050,:addr=>'127.0.0.1'},
|
20
|
+
tor_config={:host=>'127.0.0.1',:port => 9051}
|
21
|
+
x=Tor::TController.new(tor_config)
|
22
|
+
x.connect
|
23
|
+
x.authenticate("\"test1234\"")
|
24
|
+
x.authenticate("\"TorCtrlPasswd\"")
|
25
|
+
x.setconf("__DisablePredictedCircuits",1)
|
26
|
+
x.setconf('orport',9001)
|
27
|
+
x.signal("HUP")
|
28
|
+
x.cir_status
|
29
|
+
x.net_status
|
30
|
+
x.getinfo("stream-status")
|
31
|
+
x.getconf('orport')
|
32
|
+
x.sr(:resetconf,'orport')
|
33
|
+
x.extendcir(0, [A,B,C,D,E,F,G] )
|
34
|
+
x.extendcir_slowly([A,B,C,D,E,F,G] )
|
35
|
+
x.ds => ["a.b.c.d:z", "e.f.g.h:y",...]
|
36
|
+
|
37
|
+
*Note*: The sr() function sends protocol messages and retrieves the response up to the next "250 OK" or error "5YZ".
|
38
|
+
It can send the setevents protocol command, but more work has to be done to receive and filter the events.
|
39
|
+
The delay used by between extendcir_slowly() can be altered by setting Tor::EXTEND_DELAY. The default is 2 seconds.
|
40
|
+
|
41
|
+
|
42
|
+
- Reading cached descriptor.
|
43
|
+
|
44
|
+
require "tor_extend"
|
45
|
+
geoipdb=["/home/seun/dat/GeoLiteCityAug.dat","/home/seun/dat/GeoLiteCityJuly.dat"]
|
46
|
+
cacheddf = Tor::CachedDesc.new geoipdb
|
47
|
+
Tor::CachedDesc.dbconnect
|
48
|
+
dbconfig={:adapter => "sqlite3",:database => "db.sqlite3"}
|
49
|
+
Tor::CachedDesc.dbconnect(dbconfig)
|
50
|
+
Tor::CachedDesc.readall("cached_descriptor_filename")
|
51
|
+
Tor::CachedDesc.stat.get_latlng "countrycode" = [latitude, longitude]
|
52
|
+
Tor::CachedDesc.stat.continent_list
|
53
|
+
Tor::CachedDesc.stat.continent_stat(Tor::CachedDesc.stat.continent_list)
|
54
|
+
Tor::CachedDesc.stat.continent_stat(["EU","NA","AS"])
|
55
|
+
Tor::CachedDesc.stat.continent_stat_uniq(["EU","NA","AS"])
|
56
|
+
Tor::CachedDesc.stat.continent_stat_uniq("EU", "UNIX")
|
57
|
+
Tor::CachedDesc.stat.continent_count "EU"
|
58
|
+
Tor::CachedDesc.stat.continent_count_uniq "EU"
|
59
|
+
Tor::CachedDesc.stat.continent_getfingerprint "EU"
|
60
|
+
Tor::CachedDesc.country_count("FR")
|
61
|
+
Tor::CachedDesc.country_count("FR","UNIX")
|
62
|
+
Tor::CachedDesc.country_count( ["FR","DE"] ,[ "UNIX", "LINUX" ] )
|
63
|
+
Tor::CachedDesc.stat.country_stat(Tor::CachedDesc.stat.country_list)
|
64
|
+
Tor::CachedDesc.stat.country_stat(Tor::CachedDesc.stat.country_list, "UNIX")
|
65
|
+
Tor::CachedDesc.stat.country_stat_uniq(["FR","UK"])
|
66
|
+
Tor::CachedDesc.stat.country_stat(["FR","UK"], "WINDOWS")
|
67
|
+
Tor::CachedDesc.stat.country_stat_uniq(["FR","UK"], ["WINDOWS","UNIX"])
|
68
|
+
Tor::CachedDesc.stat.country_stat(["FR","UK"], "OTHERS")
|
69
|
+
Tor::CachedDesc.stat.topcountries(10)
|
70
|
+
Tor::CachedDesc.stat.topcountries_uniq(10)
|
71
|
+
Tor::CachedDesc.stat.topcountries_uniq(10,"UNIX")
|
72
|
+
Tor::CachedDesc.stat.topcountries_uniq(10,["UNIX","LINUX"])
|
73
|
+
Tor::CachedDesc.stat.country_getip("FR")
|
74
|
+
xml = Tor::CachedDesc.stat.genkml("Onion Routers")
|
75
|
+
xml = Tor::CachedDesc.stat.genkml("Windows Onion Routers","WINDOWS")
|
76
|
+
Tor::CachedDesc.each{ } => each Router table entry
|
77
|
+
Tor::CachedDesc.ors => active record table if you know what you're doing
|
78
|
+
Tor::CachedDesc.ors =>
|
79
|
+
proxy_config={:type=>'polipo' ,:port=>8118,:addr=>'127.0.0.1'},
|
80
|
+
url = URI.parse "https://bridges.torproject.org/
|
81
|
+
x.getbridges(url, cachedf, proxy_config)
|
82
|
+
|
83
|
+
Tor::Router(id: integer, ipaddr: string, platform: text, fingerprint: string, city: string, country: string,
|
84
|
+
country_code: string, continent: string, dssource: string, lat: decimal, lng: decimal,
|
85
|
+
published_at: datetime, created_at: datetime, updated_at: datetime)
|
86
|
+
|
87
|
+
|
88
|
+
- <b>KML</b>
|
89
|
+
|
90
|
+
Only uniq ORs are placed in the KML string returned. Two tours are also generated; the first going around the world, using
|
91
|
+
different countries as the center, with ballons popping up at some locations if available.
|
92
|
+
|
93
|
+
The locations in each country are numbered from 1 to country_count_uniq(), which is the order they appear in Google Earth
|
94
|
+
under each folder. The keys represent the view centres that are used when opening ballon descriptions of the values.
|
95
|
+
The default tour is shown below
|
96
|
+
|
97
|
+
WORLDTOUR={"ZA" => ["ZA1","NA1","KE1"],
|
98
|
+
"BJ" => ["BJ1","A11","NG1","CI1","SN1","DZ1","MA1","EG1","TN1"],
|
99
|
+
"CH" => ["FR1","ES1","LU1","GB1","BE1","NL1","DE1","IT1","IE1","AT1","SE1","DK1","UA1"],
|
100
|
+
"UA" => ["SA1","TR1","SY1","RU1","IR1"],
|
101
|
+
"IN" => ["IN1","KZ1","CN1","TH1","PK1"],
|
102
|
+
"AU" => ["AU1","NC1"],
|
103
|
+
"PY" => ["PY1","BR1","AR1","CL1"],
|
104
|
+
"US" => ["US1","US2","US3","US4","CA1","MX1"],
|
105
|
+
"FR" => ["FR1"] }
|
106
|
+
|
107
|
+
A different tour can be set by defining WORLDTOUR constant in the Tor moodule
|
108
|
+
|
109
|
+
Tor::WORLDTOUR = {"AU"=>["GB1","FR1","US1","DE1"]}
|
110
|
+
|
111
|
+
|
112
|
+
The second tour uses a coordinate(:lat,:lng) as centre, and 2 arrays of 'red' ORs and 'black'. All locations remain green, The 'red' points are set black, and all 'black' location goes from green to black one at a time every 2 seconds.
|
113
|
+
Tor::Constants::ATTACK_TOUR is used by default. This can also be changed by defining Tor::ATTACK_TOUR constant.
|
114
|
+
The default attack tour is shown below
|
115
|
+
|
116
|
+
ATTACK_TOUR = {:lat => 46.0,
|
117
|
+
:lng => 2.0,
|
118
|
+
"red" => (1..90).collect{|eachnum| "FR" + eachnum.to_s},
|
119
|
+
"black"=> (91..200).collect{|eachnum| "FR" + eachnum.to_s} }
|
120
|
+
|
121
|
+
- <b>Customizing the Tour</b>.
|
122
|
+
|
123
|
+
Tor::ATTACK_TOUR = { :lat =>cachedf.stat.get_latlng("US")[0],
|
124
|
+
:lng =>cachedf.stat.get_latlng("US")[1],
|
125
|
+
'red' =>['US1','US2','US3','US10'],
|
126
|
+
'black' =>['US4','US5','US6','US12']}
|
127
|
+
|
128
|
+
*OR*
|
129
|
+
|
130
|
+
Tor::ATTACK_TOUR = { :lat =>Tor::Constants::COUNLATLNG["US"][:lat],
|
131
|
+
:lng =>Tor::Constants::COUNLATLNG["US"][:lng],
|
132
|
+
'red' =>['US1','US2','US3','US10'],
|
133
|
+
'black' =>['US4','US5','US6','US12']}
|
134
|
+
|
135
|
+
- <b>Reset using this</b>:
|
136
|
+
Tor::ATTACK_TOUR=Tor::Constants::ATTACK_TOUR
|
137
|
+
if the country is not defined, define a constant Tor::COUNLATLNG, get_latlng() will check it automatically.
|
138
|
+
|
139
|
+
cachedf.stat.get_latlng("AV")
|
140
|
+
AV, - not in the country-latitude file, using cordinates(0,0)
|
141
|
+
=> [0.0, 0.0]
|
142
|
+
|
143
|
+
Tor::COUNLATLNG = {"AV"=>{:lat=>1, :lng=>1}}
|
144
|
+
cachedf.stat.get_latlng("AV")
|
145
|
+
=> [1, 1]
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
<b> Obtain bridges</b>.
|
150
|
+
|
151
|
+
Some of these fingerprints might have changed, but you can obtain fast relays for the test below
|
152
|
+
|
153
|
+
require 'tor_extend'
|
154
|
+
geoipdb=["/home/seun/dat/GeoLiteCityOct.dat","/home/seun/dat/GeoLiteCityJuly.dat"]
|
155
|
+
cachedf = Tor::CachedDesc.new geoipdb
|
156
|
+
cachedf.dbconnect
|
157
|
+
cachedf.readall("/home/seun/.tor/cached-descriptors")
|
158
|
+
cachedf.readall("/home/seun/.tor/cached-descriptors.new")
|
159
|
+
tctrl={:host=>'127.0.0.1',:port => 9051}
|
160
|
+
ctrlpasswd="mycontrolpassword"
|
161
|
+
proxyconfig={:type=>'polipo' ,:port=>8118, :addr=>'127.0.0.1'}
|
162
|
+
mytor=Tor::TController.new(tctrl)
|
163
|
+
# mytor.connect
|
164
|
+
mytor.authenticate "\"#{ctrlpasswd}\""
|
165
|
+
mytor.closeallcircuits
|
166
|
+
puts mytor.cir_status
|
167
|
+
A= [ "FateTestarrosa", "mindfields", "BeMyGuest" , "$AE55AECC4C68573F32F0ECFF6303A3FAEFFCD70E" ] + mytor.get_entryguards
|
168
|
+
# A can be mytor.get_purposeip("fast guard")
|
169
|
+
B= ["GreenLantern", "atlgonyovLi", "bauruine1" ]
|
170
|
+
# or use B = mytor.get_purposeip("fast !exit !guard")
|
171
|
+
# But B can also be an guard or exit relay, no restrictions
|
172
|
+
C = mytor.get_purposeip("exit fast")
|
173
|
+
url = URI.parse "https://bridges.torproject.org/"
|
174
|
+
C.count.times{|z|
|
175
|
+
entryg = A[rand(A.count)]
|
176
|
+
relayg = B[rand(B.count)]
|
177
|
+
exitn = C[z]
|
178
|
+
circuit1 = [entryg,relayg, exitn]
|
179
|
+
cir_num = mytor.extendcir(0, circuit1)
|
180
|
+
if mytor.cir_status.detect{|p| p =~ /#{cir_num} BUILT/}
|
181
|
+
mytor.get_bridges(url,cachedf)
|
182
|
+
else
|
183
|
+
sleep(2)
|
184
|
+
puts mytor.get_bridges( url, cachedf ) #bridges are added to the database automatically
|
185
|
+
end
|
186
|
+
}
|
187
|
+
|
188
|
+
|
189
|
+
more results can be obtained using all exits, instead of just fast exits.
|
190
|
+
Or other distributed networks.
|
data/doc/ReadME_txt.html
ADDED
@@ -0,0 +1,301 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
|
3
|
+
<html>
|
4
|
+
<head>
|
5
|
+
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
|
6
|
+
|
7
|
+
<title>ReadME</title>
|
8
|
+
|
9
|
+
<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet">
|
10
|
+
|
11
|
+
<script type="text/javascript">
|
12
|
+
var rdoc_rel_prefix = "./";
|
13
|
+
</script>
|
14
|
+
|
15
|
+
<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script>
|
16
|
+
<script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script>
|
17
|
+
<script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script>
|
18
|
+
<script type="text/javascript" charset="utf-8" src="./js/search.js"></script>
|
19
|
+
<script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script>
|
20
|
+
<script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script>
|
21
|
+
|
22
|
+
|
23
|
+
<body class="file">
|
24
|
+
<nav id="metadata">
|
25
|
+
<nav id="home-section" class="section">
|
26
|
+
<h3 class="section-header">
|
27
|
+
<a href="./index.html">Home</a>
|
28
|
+
<a href="./table_of_contents.html#classes">Classes</a>
|
29
|
+
<a href="./table_of_contents.html#methods">Methods</a>
|
30
|
+
</h3>
|
31
|
+
</nav>
|
32
|
+
|
33
|
+
|
34
|
+
<nav id="search-section" class="section project-section" class="initially-hidden">
|
35
|
+
<form action="#" method="get" accept-charset="utf-8">
|
36
|
+
<h3 class="section-header">
|
37
|
+
<input type="text" name="search" placeholder="Search" id="search-field"
|
38
|
+
title="Type to search, Up and Down to navigate, Enter to load">
|
39
|
+
</h3>
|
40
|
+
</form>
|
41
|
+
|
42
|
+
<ul id="search-results" class="initially-hidden"></ul>
|
43
|
+
</nav>
|
44
|
+
|
45
|
+
|
46
|
+
<div id="project-metadata">
|
47
|
+
<nav id="fileindex-section" class="section project-section">
|
48
|
+
<h3 class="section-header">Pages</h3>
|
49
|
+
|
50
|
+
<ul>
|
51
|
+
|
52
|
+
<li class="file"><a href="./ReadME_txt.html">ReadME</a>
|
53
|
+
|
54
|
+
</ul>
|
55
|
+
</nav>
|
56
|
+
|
57
|
+
<nav id="classindex-section" class="section project-section">
|
58
|
+
<h3 class="section-header">Class and Module Index</h3>
|
59
|
+
|
60
|
+
<ul class="link-list">
|
61
|
+
|
62
|
+
<li><a href="./Tor.html">Tor</a>
|
63
|
+
|
64
|
+
<li><a href="./Tor/Bridge.html">Tor::Bridge</a>
|
65
|
+
|
66
|
+
<li><a href="./Tor/CachedDesc.html">Tor::CachedDesc</a>
|
67
|
+
|
68
|
+
<li><a href="./Tor/Constants.html">Tor::Constants</a>
|
69
|
+
|
70
|
+
<li><a href="./Tor/Router.html">Tor::Router</a>
|
71
|
+
|
72
|
+
<li><a href="./Tor/StatsObj.html">Tor::StatsObj</a>
|
73
|
+
|
74
|
+
<li><a href="./Tor/TController.html">Tor::TController</a>
|
75
|
+
|
76
|
+
</ul>
|
77
|
+
</nav>
|
78
|
+
|
79
|
+
</div>
|
80
|
+
</nav>
|
81
|
+
|
82
|
+
<div id="documentation" class="description">
|
83
|
+
|
84
|
+
<p>Please see the Unlicence disclaimer in Bendiken’s tor-ruby gem.</p>
|
85
|
+
|
86
|
+
<p><strong>Installation instruction </strong></p>
|
87
|
+
|
88
|
+
<p>Run “gem install tor_extend”</p>
|
89
|
+
|
90
|
+
<p>If internet connection is available, it will install the Bendiken’s <a
|
91
|
+
href="Tor.html">Tor</a> gem as well if it is not already installed. As well
|
92
|
+
as socksify For offline users, obtain a local copy of the <a
|
93
|
+
href="Tor.html">Tor</a> gem and install before proceeding. Visit
|
94
|
+
Bendiken’s <a href="http://cypherpunk.rubyforge.org/tor/">page</a> for
|
95
|
+
details on .</p>
|
96
|
+
|
97
|
+
<p>ri documentation included with examples. Run “ri Tor::TController” after
|
98
|
+
install to see examples.</p>
|
99
|
+
|
100
|
+
<p><strong>Examples</strong>.</p>
|
101
|
+
<ul><li>
|
102
|
+
<p>How to use <a href="Tor.html">Tor</a> control</p>
|
103
|
+
|
104
|
+
<pre class="ruby"><span class="ruby-identifier">require</span> <span class="ruby-string">'tor_extend'</span>
|
105
|
+
<span class="ruby-identifier">proxy_config</span>={:<span class="ruby-identifier">type=</span><span class="ruby-operator">></span><span class="ruby-string">'tor'</span> ,:<span class="ruby-identifier">port=</span><span class="ruby-operator">></span><span class="ruby-value">9050</span>,:<span class="ruby-identifier">addr=</span><span class="ruby-operator">></span><span class="ruby-string">'127.0.0.1'</span>},
|
106
|
+
<span class="ruby-identifier">tor_config</span>={:<span class="ruby-identifier">host=</span><span class="ruby-operator">></span><span class="ruby-string">'127.0.0.1'</span>,:<span class="ruby-identifier">port</span> =<span class="ruby-operator">></span> <span class="ruby-value">9051</span>}
|
107
|
+
<span class="ruby-identifier">x</span>=<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">tor_config</span>)
|
108
|
+
<span class="ruby-identifier">x</span>.<span class="ruby-identifier">connect</span>
|
109
|
+
<span class="ruby-identifier">x</span>.<span class="ruby-identifier">authenticate</span>(<span class="ruby-string">"\"test1234\""</span>)
|
110
|
+
<span class="ruby-identifier">x</span>.<span class="ruby-identifier">authenticate</span>(<span class="ruby-string">"\"TorCtrlPasswd\""</span>)
|
111
|
+
<span class="ruby-identifier">x</span>.<span class="ruby-identifier">setconf</span>(<span class="ruby-string">"__DisablePredictedCircuits"</span>,<span class="ruby-value">1</span>)
|
112
|
+
<span class="ruby-identifier">x</span>.<span class="ruby-identifier">setconf</span>(<span class="ruby-string">'orport'</span>,<span class="ruby-value">9001</span>)
|
113
|
+
<span class="ruby-identifier">x</span>.<span class="ruby-identifier">signal</span>(<span class="ruby-string">"HUP"</span>)
|
114
|
+
<span class="ruby-identifier">x</span>.<span class="ruby-identifier">cir_status</span>
|
115
|
+
<span class="ruby-identifier">x</span>.<span class="ruby-identifier">net_status</span>
|
116
|
+
<span class="ruby-identifier">x</span>.<span class="ruby-identifier">getinfo</span>(<span class="ruby-string">"stream-status"</span>)
|
117
|
+
<span class="ruby-identifier">x</span>.<span class="ruby-identifier">getconf</span>(<span class="ruby-string">'orport'</span>)
|
118
|
+
<span class="ruby-identifier">x</span>.<span class="ruby-identifier">sr</span>(:<span class="ruby-identifier">resetconf</span>,<span class="ruby-string">'orport'</span>)
|
119
|
+
<span class="ruby-identifier">x</span>.<span class="ruby-identifier">extendcir</span>(<span class="ruby-value">0</span>, [<span class="ruby-constant">A</span>,<span class="ruby-constant">B</span>,<span class="ruby-constant">C</span>,<span class="ruby-constant">D</span>,<span class="ruby-constant">E</span>,<span class="ruby-constant">F</span>,<span class="ruby-constant">G</span>] )
|
120
|
+
<span class="ruby-identifier">x</span>.<span class="ruby-identifier">extendcir_slowly</span>([<span class="ruby-constant">A</span>,<span class="ruby-constant">B</span>,<span class="ruby-constant">C</span>,<span class="ruby-constant">D</span>,<span class="ruby-constant">E</span>,<span class="ruby-constant">F</span>,<span class="ruby-constant">G</span>] )
|
121
|
+
<span class="ruby-identifier">x</span>.<span class="ruby-identifier">ds</span> =<span class="ruby-operator">></span> [<span class="ruby-string">"a.b.c.d:z"</span>, <span class="ruby-string">"e.f.g.h:y"</span>,<span class="ruby-operator">...</span>]
|
122
|
+
</pre>
|
123
|
+
</li></ul>
|
124
|
+
|
125
|
+
<p><strong>Note</strong>: The sr() function sends protocol messages and
|
126
|
+
retrieves the response up to the next "250 OK" or error "5YZ". It can send
|
127
|
+
the setevents protocol command, but more work has to be done to receive and
|
128
|
+
filter the events. The delay used by between extendcir_slowly() can be
|
129
|
+
altered by setting Tor::EXTEND_DELAY. The default is 2 seconds.</p>
|
130
|
+
<ul><li>
|
131
|
+
<p>Reading cached descriptor.</p>
|
132
|
+
|
133
|
+
<pre class="ruby"><span class="ruby-identifier">require</span> <span class="ruby-string">"tor_extend"</span>
|
134
|
+
<span class="ruby-identifier">geoipdb</span>=[<span class="ruby-string">"/home/seun/dat/GeoLiteCityAug.dat"</span>,<span class="ruby-string">"/home/seun/dat/GeoLiteCityJuly.dat"</span>]
|
135
|
+
<span class="ruby-identifier">cacheddf</span> = <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">new</span> <span class="ruby-identifier">geoipdb</span>
|
136
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">dbconnect</span>
|
137
|
+
<span class="ruby-identifier">dbconfig</span>={:<span class="ruby-identifier">adapter</span> =<span class="ruby-operator">></span> <span class="ruby-string">"sqlite3"</span>,:<span class="ruby-identifier">database</span> =<span class="ruby-operator">></span> <span class="ruby-string">"db.sqlite3"</span>}
|
138
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">dbconnect</span>(<span class="ruby-identifier">dbconfig</span>)
|
139
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">readall</span>(<span class="ruby-string">"cached_descriptor_filename"</span>)
|
140
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">get_latlng</span> <span class="ruby-string">"countrycode"</span> = [<span class="ruby-identifier">latitude</span>, <span class="ruby-identifier">longitude</span>]
|
141
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">continent_list</span>
|
142
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">continent_stat</span>(<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">continent_list</span>)
|
143
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">continent_stat</span>([<span class="ruby-string">"EU"</span>,<span class="ruby-string">"NA"</span>,<span class="ruby-string">"AS"</span>])
|
144
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">continent_stat_uniq</span>([<span class="ruby-string">"EU"</span>,<span class="ruby-string">"NA"</span>,<span class="ruby-string">"AS"</span>])
|
145
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">continent_stat_uniq</span>(<span class="ruby-string">"EU"</span>, <span class="ruby-string">"UNIX"</span>)
|
146
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">continent_count</span> <span class="ruby-string">"EU"</span>
|
147
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">continent_count_uniq</span> <span class="ruby-string">"EU"</span>
|
148
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">continent_getfingerprint</span> <span class="ruby-string">"EU"</span>
|
149
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">country_count</span>(<span class="ruby-string">"FR"</span>)
|
150
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">country_count</span>(<span class="ruby-string">"FR"</span>,<span class="ruby-string">"UNIX"</span>)
|
151
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">country_count</span>( [<span class="ruby-string">"FR"</span>,<span class="ruby-string">"DE"</span>] ,[ <span class="ruby-string">"UNIX"</span>, <span class="ruby-string">"LINUX"</span> ] )
|
152
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">country_stat</span>(<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">country_list</span>)
|
153
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">country_stat</span>(<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">country_list</span>, <span class="ruby-string">"UNIX"</span>)
|
154
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">country_stat_uniq</span>([<span class="ruby-string">"FR"</span>,<span class="ruby-string">"UK"</span>])
|
155
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">country_stat</span>([<span class="ruby-string">"FR"</span>,<span class="ruby-string">"UK"</span>], <span class="ruby-string">"WINDOWS"</span>)
|
156
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">country_stat_uniq</span>([<span class="ruby-string">"FR"</span>,<span class="ruby-string">"UK"</span>], [<span class="ruby-string">"WINDOWS"</span>,<span class="ruby-string">"UNIX"</span>])
|
157
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">country_stat</span>([<span class="ruby-string">"FR"</span>,<span class="ruby-string">"UK"</span>], <span class="ruby-string">"OTHERS"</span>)
|
158
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">topcountries</span>(<span class="ruby-value">10</span>)
|
159
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">topcountries_uniq</span>(<span class="ruby-value">10</span>)
|
160
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">topcountries_uniq</span>(<span class="ruby-value">10</span>,<span class="ruby-string">"UNIX"</span>)
|
161
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">topcountries_uniq</span>(<span class="ruby-value">10</span>,[<span class="ruby-string">"UNIX"</span>,<span class="ruby-string">"LINUX"</span>])
|
162
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">country_getip</span>(<span class="ruby-string">"FR"</span>)
|
163
|
+
<span class="ruby-identifier">xml</span> = <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">genkml</span>(<span class="ruby-string">"Onion Routers"</span>)
|
164
|
+
<span class="ruby-identifier">xml</span> = <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">genkml</span>(<span class="ruby-string">"Windows Onion Routers"</span>,<span class="ruby-string">"WINDOWS"</span>)
|
165
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">each</span>{ } =<span class="ruby-operator">></span> <span class="ruby-identifier">each</span> <span class="ruby-constant">Router</span> <span class="ruby-identifier">table</span> <span class="ruby-identifier">entry</span>
|
166
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">ors</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">active</span> <span class="ruby-identifier">record</span> <span class="ruby-identifier">table</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">you</span> <span class="ruby-identifier">know</span> <span class="ruby-identifier">what</span> <span class="ruby-identifier">you</span><span class="ruby-string">'re doing
|
167
|
+
Tor::CachedDesc.ors =>
|
168
|
+
proxy_config={:type=>'</span><span class="ruby-identifier">polipo</span><span class="ruby-string">' ,:port=>8118,:addr=>'</span><span class="ruby-value">127.0</span><span class="ruby-value">.0</span><span class="ruby-value">.1</span><span class="ruby-string">'},
|
169
|
+
url = URI.parse "https://bridges.torproject.org/
|
170
|
+
x.getbridges(url, cachedf, proxy_config)
|
171
|
+
Tor::Router(id: integer, ipaddr: string, platform: text, fingerprint: string, city: string, country: string,
|
172
|
+
country_code: string, continent: string, dssource: string, lat: decimal, lng: decimal,
|
173
|
+
published_at: datetime, created_at: datetime, updated_at: datetime)
|
174
|
+
</span></pre>
|
175
|
+
</li><li>
|
176
|
+
<p><strong>KML</strong></p>
|
177
|
+
</li></ul>
|
178
|
+
|
179
|
+
<p>Only uniq ORs are placed in the KML string returned. Two tours are also
|
180
|
+
generated; the first going around the world, using different countries as
|
181
|
+
the center, with ballons popping up at some locations if available.</p>
|
182
|
+
|
183
|
+
<p>The locations in each country are numbered from 1 to country_count_uniq(),
|
184
|
+
which is the order they appear in Google Earth under each folder. The keys
|
185
|
+
represent the view centres that are used when opening ballon descriptions
|
186
|
+
of the values. The default tour is shown below</p>
|
187
|
+
|
188
|
+
<pre class="ruby"><span class="ruby-constant">WORLDTOUR</span>={<span class="ruby-string">"ZA"</span> =<span class="ruby-operator">></span> [<span class="ruby-string">"ZA1"</span>,<span class="ruby-string">"NA1"</span>,<span class="ruby-string">"KE1"</span>],
|
189
|
+
<span class="ruby-string">"BJ"</span> =<span class="ruby-operator">></span> [<span class="ruby-string">"BJ1"</span>,<span class="ruby-string">"A11"</span>,<span class="ruby-string">"NG1"</span>,<span class="ruby-string">"CI1"</span>,<span class="ruby-string">"SN1"</span>,<span class="ruby-string">"DZ1"</span>,<span class="ruby-string">"MA1"</span>,<span class="ruby-string">"EG1"</span>,<span class="ruby-string">"TN1"</span>],
|
190
|
+
<span class="ruby-string">"CH"</span> =<span class="ruby-operator">></span> [<span class="ruby-string">"FR1"</span>,<span class="ruby-string">"ES1"</span>,<span class="ruby-string">"LU1"</span>,<span class="ruby-string">"GB1"</span>,<span class="ruby-string">"BE1"</span>,<span class="ruby-string">"NL1"</span>,<span class="ruby-string">"DE1"</span>,<span class="ruby-string">"IT1"</span>,<span class="ruby-string">"IE1"</span>,<span class="ruby-string">"AT1"</span>,<span class="ruby-string">"SE1"</span>,<span class="ruby-string">"DK1"</span>,<span class="ruby-string">"UA1"</span>],
|
191
|
+
<span class="ruby-string">"UA"</span> =<span class="ruby-operator">></span> [<span class="ruby-string">"SA1"</span>,<span class="ruby-string">"TR1"</span>,<span class="ruby-string">"SY1"</span>,<span class="ruby-string">"RU1"</span>,<span class="ruby-string">"IR1"</span>],
|
192
|
+
<span class="ruby-string">"IN"</span> =<span class="ruby-operator">></span> [<span class="ruby-string">"IN1"</span>,<span class="ruby-string">"KZ1"</span>,<span class="ruby-string">"CN1"</span>,<span class="ruby-string">"TH1"</span>,<span class="ruby-string">"PK1"</span>],
|
193
|
+
<span class="ruby-string">"AU"</span> =<span class="ruby-operator">></span> [<span class="ruby-string">"AU1"</span>,<span class="ruby-string">"NC1"</span>],
|
194
|
+
<span class="ruby-string">"PY"</span> =<span class="ruby-operator">></span> [<span class="ruby-string">"PY1"</span>,<span class="ruby-string">"BR1"</span>,<span class="ruby-string">"AR1"</span>,<span class="ruby-string">"CL1"</span>],
|
195
|
+
<span class="ruby-string">"US"</span> =<span class="ruby-operator">></span> [<span class="ruby-string">"US1"</span>,<span class="ruby-string">"US2"</span>,<span class="ruby-string">"US3"</span>,<span class="ruby-string">"US4"</span>,<span class="ruby-string">"CA1"</span>,<span class="ruby-string">"MX1"</span>],
|
196
|
+
<span class="ruby-string">"FR"</span> =<span class="ruby-operator">></span> [<span class="ruby-string">"FR1"</span>] }
|
197
|
+
</pre>
|
198
|
+
|
199
|
+
<p>A different tour can be set by defining WORLDTOUR constant in the <a
|
200
|
+
href="Tor.html">Tor</a> moodule</p>
|
201
|
+
|
202
|
+
<pre class="ruby"><span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">WORLDTOUR</span> = {<span class="ruby-string">"AU"</span>=<span class="ruby-operator">></span>[<span class="ruby-string">"GB1"</span>,<span class="ruby-string">"FR1"</span>,<span class="ruby-string">"US1"</span>,<span class="ruby-string">"DE1"</span>]}
|
203
|
+
</pre>
|
204
|
+
|
205
|
+
<p>The second tour uses a coordinate(:lat,:lng) as centre, and 2 arrays of
|
206
|
+
‘red’ ORs and ‘black’. All locations remain green, The ‘red’ points are set
|
207
|
+
black, and all ‘black’ location goes from green to black one at a time
|
208
|
+
every 2 seconds. Tor::Constants::ATTACK_TOUR is used by default. This can
|
209
|
+
also be changed by defining Tor::ATTACK_TOUR constant. The default attack
|
210
|
+
tour is shown below</p>
|
211
|
+
|
212
|
+
<pre class="ruby"><span class="ruby-constant">ATTACK_TOUR</span> = {:<span class="ruby-identifier">lat</span> =<span class="ruby-operator">></span> <span class="ruby-value">46.0</span>,
|
213
|
+
:<span class="ruby-identifier">lng</span> =<span class="ruby-operator">></span> <span class="ruby-value">2.0</span>,
|
214
|
+
<span class="ruby-string">"red"</span> =<span class="ruby-operator">></span> (<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">90</span>).<span class="ruby-identifier">collect</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">eachnum</span><span class="ruby-operator">|</span> <span class="ruby-string">"FR"</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">eachnum</span>.<span class="ruby-identifier">to_s</span>},
|
215
|
+
<span class="ruby-string">"black"</span>=<span class="ruby-operator">></span> (<span class="ruby-value">91</span><span class="ruby-operator">..</span><span class="ruby-value">200</span>).<span class="ruby-identifier">collect</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">eachnum</span><span class="ruby-operator">|</span> <span class="ruby-string">"FR"</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">eachnum</span>.<span class="ruby-identifier">to_s</span>} }
|
216
|
+
</pre>
|
217
|
+
<ul><li>
|
218
|
+
<p><strong>Customizing the Tour</strong>.</p>
|
219
|
+
</li></ul>
|
220
|
+
|
221
|
+
<pre class="ruby"><span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">ATTACK_TOUR</span> = { :<span class="ruby-identifier">lat</span> =<span class="ruby-operator">></span><span class="ruby-identifier">cachedf</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">get_latlng</span>(<span class="ruby-string">"US"</span>)[<span class="ruby-value">0</span>],
|
222
|
+
:<span class="ruby-identifier">lng</span> =<span class="ruby-operator">></span><span class="ruby-identifier">cachedf</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">get_latlng</span>(<span class="ruby-string">"US"</span>)[<span class="ruby-value">1</span>],
|
223
|
+
<span class="ruby-string">'red'</span> =<span class="ruby-operator">></span>[<span class="ruby-string">'US1'</span>,<span class="ruby-string">'US2'</span>,<span class="ruby-string">'US3'</span>,<span class="ruby-string">'US10'</span>],
|
224
|
+
<span class="ruby-string">'black'</span> =<span class="ruby-operator">></span>[<span class="ruby-string">'US4'</span>,<span class="ruby-string">'US5'</span>,<span class="ruby-string">'US6'</span>,<span class="ruby-string">'US12'</span>]}
|
225
|
+
</pre>
|
226
|
+
|
227
|
+
<p><strong>OR</strong></p>
|
228
|
+
|
229
|
+
<pre class="ruby"><span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">ATTACK_TOUR</span> = { :<span class="ruby-identifier">lat</span> =<span class="ruby-operator">></span><span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">Constants</span><span class="ruby-operator">::</span><span class="ruby-constant">COUNLATLNG</span>[<span class="ruby-string">"US"</span>][:<span class="ruby-identifier">lat</span>],
|
230
|
+
:<span class="ruby-identifier">lng</span> =<span class="ruby-operator">></span><span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">Constants</span><span class="ruby-operator">::</span><span class="ruby-constant">COUNLATLNG</span>[<span class="ruby-string">"US"</span>][:<span class="ruby-identifier">lng</span>],
|
231
|
+
<span class="ruby-string">'red'</span> =<span class="ruby-operator">></span>[<span class="ruby-string">'US1'</span>,<span class="ruby-string">'US2'</span>,<span class="ruby-string">'US3'</span>,<span class="ruby-string">'US10'</span>],
|
232
|
+
<span class="ruby-string">'black'</span> =<span class="ruby-operator">></span>[<span class="ruby-string">'US4'</span>,<span class="ruby-string">'US5'</span>,<span class="ruby-string">'US6'</span>,<span class="ruby-string">'US12'</span>]}
|
233
|
+
</pre>
|
234
|
+
<ul><li>
|
235
|
+
<p><strong>Reset using this</strong>:</p>
|
236
|
+
</li></ul>
|
237
|
+
|
238
|
+
<pre class="ruby"><span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">ATTACK_TOUR</span>=<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">Constants</span><span class="ruby-operator">::</span><span class="ruby-constant">ATTACK_TOUR</span>
|
239
|
+
<span class="ruby-keyword">if</span> <span class="ruby-identifier">the</span> <span class="ruby-identifier">country</span> <span class="ruby-identifier">is</span> <span class="ruby-keyword">not</span> <span class="ruby-identifier">defined</span>, <span class="ruby-identifier">define</span> <span class="ruby-identifier">a</span> <span class="ruby-identifier">constant</span> <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">COUNLATLNG</span>, <span class="ruby-identifier">get_latlng</span>() <span class="ruby-identifier">will</span> <span class="ruby-identifier">check</span> <span class="ruby-identifier">it</span> <span class="ruby-identifier">automatically</span>.
|
240
|
+
<span class="ruby-identifier">cachedf</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">get_latlng</span>(<span class="ruby-string">"AV"</span>)
|
241
|
+
<span class="ruby-constant">AV</span>, <span class="ruby-operator">-</span> <span class="ruby-keyword">not</span> <span class="ruby-keyword">in</span> <span class="ruby-identifier">the</span> <span class="ruby-identifier">country</span><span class="ruby-operator">-</span><span class="ruby-identifier">latitude</span> <span class="ruby-identifier">file</span>, <span class="ruby-identifier">using</span> <span class="ruby-identifier">cordinates</span>(<span class="ruby-value">0</span>,<span class="ruby-value">0</span>)
|
242
|
+
=<span class="ruby-operator">></span> [<span class="ruby-value">0.0</span>, <span class="ruby-value">0.0</span>]
|
243
|
+
<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">COUNLATLNG</span> = {<span class="ruby-string">"AV"</span>=<span class="ruby-operator">></span>{:<span class="ruby-identifier">lat=</span><span class="ruby-operator">></span><span class="ruby-value">1</span>, :<span class="ruby-identifier">lng=</span><span class="ruby-operator">></span><span class="ruby-value">1</span>}}
|
244
|
+
<span class="ruby-identifier">cachedf</span>.<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">get_latlng</span>(<span class="ruby-string">"AV"</span>)
|
245
|
+
=<span class="ruby-operator">></span> [<span class="ruby-value">1</span>, <span class="ruby-value">1</span>]
|
246
|
+
</pre>
|
247
|
+
|
248
|
+
<p><strong> Obtain bridges</strong>.</p>
|
249
|
+
|
250
|
+
<p>Some of these fingerprints might have changed, but you can obtain fast
|
251
|
+
relays for the test below</p>
|
252
|
+
|
253
|
+
<pre class="ruby"><span class="ruby-identifier">require</span> <span class="ruby-string">'tor_extend'</span>
|
254
|
+
<span class="ruby-identifier">geoipdb</span>=[<span class="ruby-string">"/home/seun/dat/GeoLiteCityOct.dat"</span>,<span class="ruby-string">"/home/seun/dat/GeoLiteCityJuly.dat"</span>]
|
255
|
+
<span class="ruby-identifier">cachedf</span> = <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">CachedDesc</span>.<span class="ruby-identifier">new</span> <span class="ruby-identifier">geoipdb</span>
|
256
|
+
<span class="ruby-identifier">cachedf</span>.<span class="ruby-identifier">dbconnect</span>
|
257
|
+
<span class="ruby-identifier">cachedf</span>.<span class="ruby-identifier">readall</span>(<span class="ruby-string">"/home/seun/.tor/cached-descriptors"</span>)
|
258
|
+
<span class="ruby-identifier">cachedf</span>.<span class="ruby-identifier">readall</span>(<span class="ruby-string">"/home/seun/.tor/cached-descriptors.new"</span>)
|
259
|
+
<span class="ruby-identifier">tctrl</span>={:<span class="ruby-identifier">host=</span><span class="ruby-operator">></span><span class="ruby-string">'127.0.0.1'</span>,:<span class="ruby-identifier">port</span> =<span class="ruby-operator">></span> <span class="ruby-value">9051</span>}
|
260
|
+
<span class="ruby-identifier">ctrlpasswd</span>=<span class="ruby-string">"mycontrolpassword"</span>
|
261
|
+
<span class="ruby-identifier">proxyconfig</span>={:<span class="ruby-identifier">type=</span><span class="ruby-operator">></span><span class="ruby-string">'polipo'</span> ,:<span class="ruby-identifier">port=</span><span class="ruby-operator">></span><span class="ruby-value">8118</span>, :<span class="ruby-identifier">addr=</span><span class="ruby-operator">></span><span class="ruby-string">'127.0.0.1'</span>}
|
262
|
+
<span class="ruby-identifier">mytor</span>=<span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">tctrl</span>)
|
263
|
+
<span class="ruby-comment"># mytor.connect</span>
|
264
|
+
<span class="ruby-identifier">mytor</span>.<span class="ruby-identifier">authenticate</span> <span class="ruby-node">"\"#{ctrlpasswd}\""</span>
|
265
|
+
<span class="ruby-identifier">mytor</span>.<span class="ruby-identifier">closeallcircuits</span>
|
266
|
+
<span class="ruby-identifier">puts</span> <span class="ruby-identifier">mytor</span>.<span class="ruby-identifier">cir_status</span>
|
267
|
+
<span class="ruby-constant">A</span>= [ <span class="ruby-string">"FateTestarrosa"</span>, <span class="ruby-string">"mindfields"</span>, <span class="ruby-string">"BeMyGuest"</span> , <span class="ruby-string">"$AE55AECC4C68573F32F0ECFF6303A3FAEFFCD70E"</span> ] <span class="ruby-operator">+</span> <span class="ruby-identifier">mytor</span>.<span class="ruby-identifier">get_entryguards</span>
|
268
|
+
<span class="ruby-comment"># A can be mytor.get_purposeip("fast guard")</span>
|
269
|
+
<span class="ruby-constant">B</span>= [<span class="ruby-string">"GreenLantern"</span>, <span class="ruby-string">"atlgonyovLi"</span>, <span class="ruby-string">"bauruine1"</span> ]
|
270
|
+
<span class="ruby-comment"># or use B = mytor.get_purposeip("fast !exit !guard")</span>
|
271
|
+
<span class="ruby-comment"># But B can also be an guard or exit relay, no restrictions</span>
|
272
|
+
<span class="ruby-constant">C</span> = <span class="ruby-identifier">mytor</span>.<span class="ruby-identifier">get_purposeip</span>(<span class="ruby-string">"exit fast"</span>)
|
273
|
+
<span class="ruby-identifier">url</span> = <span class="ruby-constant">URI</span>.<span class="ruby-identifier">parse</span> <span class="ruby-string">"https://bridges.torproject.org/"</span>
|
274
|
+
<span class="ruby-constant">C</span>.<span class="ruby-identifier">count</span>.<span class="ruby-identifier">times</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">z</span><span class="ruby-operator">|</span>
|
275
|
+
<span class="ruby-identifier">entryg</span> = <span class="ruby-constant">A</span>[<span class="ruby-identifier">rand</span>(<span class="ruby-constant">A</span>.<span class="ruby-identifier">count</span>)]
|
276
|
+
<span class="ruby-identifier">relayg</span> = <span class="ruby-constant">B</span>[<span class="ruby-identifier">rand</span>(<span class="ruby-constant">B</span>.<span class="ruby-identifier">count</span>)]
|
277
|
+
<span class="ruby-identifier">exitn</span> = <span class="ruby-constant">C</span>[<span class="ruby-identifier">z</span>]
|
278
|
+
<span class="ruby-identifier">circuit1</span> = [<span class="ruby-identifier">entryg</span>,<span class="ruby-identifier">relayg</span>, <span class="ruby-identifier">exitn</span>]
|
279
|
+
<span class="ruby-identifier">cir_num</span> = <span class="ruby-identifier">mytor</span>.<span class="ruby-identifier">extendcir</span>(<span class="ruby-value">0</span>, <span class="ruby-identifier">circuit1</span>)
|
280
|
+
<span class="ruby-keyword">if</span> <span class="ruby-identifier">mytor</span>.<span class="ruby-identifier">cir_status</span>.<span class="ruby-identifier">detect</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">p</span><span class="ruby-operator">|</span> <span class="ruby-identifier">p</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/#{cir_num} BUILT/</span>}
|
281
|
+
<span class="ruby-identifier">mytor</span>.<span class="ruby-identifier">get_bridges</span>(<span class="ruby-identifier">url</span>,<span class="ruby-identifier">cachedf</span>)
|
282
|
+
<span class="ruby-keyword">else</span>
|
283
|
+
<span class="ruby-identifier">sleep</span>(<span class="ruby-value">2</span>)
|
284
|
+
<span class="ruby-identifier">puts</span> <span class="ruby-identifier">mytor</span>.<span class="ruby-identifier">get_bridges</span>( <span class="ruby-identifier">url</span>, <span class="ruby-identifier">cachedf</span> ) <span class="ruby-comment">#bridges are added to the database automatically</span>
|
285
|
+
<span class="ruby-keyword">end</span>
|
286
|
+
}
|
287
|
+
</pre>
|
288
|
+
|
289
|
+
<p>more results can be obtained using all exits, instead of just fast exits.
|
290
|
+
Or other distributed networks.</p>
|
291
|
+
|
292
|
+
</div>
|
293
|
+
|
294
|
+
|
295
|
+
|
296
|
+
<footer id="validator-badges">
|
297
|
+
<p><a href="http://validator.w3.org/check/referer">[Validate]</a>
|
298
|
+
<p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.11.
|
299
|
+
<p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
|
300
|
+
</footer>
|
301
|
+
|