tor_extend 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/Change.log +12 -0
  2. data/ReadME.txt +190 -0
  3. data/doc/ReadME_txt.html +301 -0
  4. data/doc/Tor.html +140 -0
  5. data/doc/Tor/Bridge.html +145 -0
  6. data/doc/Tor/CachedDesc.html +472 -0
  7. data/doc/Tor/Constants.html +185 -0
  8. data/doc/Tor/Router.html +146 -0
  9. data/doc/Tor/StatsObj.html +1209 -0
  10. data/doc/Tor/TController.html +1111 -0
  11. data/doc/created.rid +7 -0
  12. data/doc/images/add.png +0 -0
  13. data/doc/images/brick.png +0 -0
  14. data/doc/images/brick_link.png +0 -0
  15. data/doc/images/bug.png +0 -0
  16. data/doc/images/bullet_black.png +0 -0
  17. data/doc/images/bullet_toggle_minus.png +0 -0
  18. data/doc/images/bullet_toggle_plus.png +0 -0
  19. data/doc/images/date.png +0 -0
  20. data/doc/images/delete.png +0 -0
  21. data/doc/images/find.png +0 -0
  22. data/doc/images/loadingAnimation.gif +0 -0
  23. data/doc/images/macFFBgHack.png +0 -0
  24. data/doc/images/package.png +0 -0
  25. data/doc/images/page_green.png +0 -0
  26. data/doc/images/page_white_text.png +0 -0
  27. data/doc/images/page_white_width.png +0 -0
  28. data/doc/images/plugin.png +0 -0
  29. data/doc/images/ruby.png +0 -0
  30. data/doc/images/tag_blue.png +0 -0
  31. data/doc/images/tag_green.png +0 -0
  32. data/doc/images/transparent.png +0 -0
  33. data/doc/images/wrench.png +0 -0
  34. data/doc/images/wrench_orange.png +0 -0
  35. data/doc/images/zoom.png +0 -0
  36. data/doc/index.html +90 -0
  37. data/doc/js/darkfish.js +153 -0
  38. data/doc/js/jquery.js +18 -0
  39. data/doc/js/navigation.js +142 -0
  40. data/doc/js/search.js +94 -0
  41. data/doc/js/search_index.js +1 -0
  42. data/doc/js/searcher.js +228 -0
  43. data/doc/lib/constants_rb.html +96 -0
  44. data/doc/lib/httpmod_rb.html +95 -0
  45. data/doc/lib/tcontroller_rb.html +93 -0
  46. data/doc/lib/tor_extend_rb.html +97 -0
  47. data/doc/lib/tstats_rb.html +93 -0
  48. data/doc/rdoc.css +543 -0
  49. data/doc/table_of_contents.html +159 -0
  50. data/lib/constants.rb +106 -0
  51. data/lib/httpmod.rb +89 -0
  52. data/lib/tcontroller.rb +475 -0
  53. data/lib/tor_extend.rb +189 -0
  54. data/lib/tstats.rb +514 -0
  55. data/tor_extend.gemspec +26 -0
  56. metadata +138 -0
@@ -0,0 +1,1111 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
6
+
7
+ <title>Class: Tor::TController</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 id="top" class="class">
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="file-metadata">
47
+ <nav id="file-list-section" class="section">
48
+ <h3 class="section-header">Defined In</h3>
49
+ <ul>
50
+ <li>lib/tcontroller.rb
51
+ </ul>
52
+ </nav>
53
+
54
+
55
+ </div>
56
+
57
+ <div id="class-metadata">
58
+
59
+ <nav id="parent-class-section" class="section">
60
+ <h3 class="section-header">Parent</h3>
61
+
62
+ <p class="link">Tor::Controller
63
+
64
+ </nav>
65
+
66
+
67
+ <!-- Method Quickref -->
68
+ <nav id="method-list-section" class="section">
69
+ <h3 class="section-header">Methods</h3>
70
+
71
+ <ul class="link-list">
72
+
73
+ <li><a href="#method-i-attach_stream">#attach_stream</a>
74
+
75
+ <li><a href="#method-i-bridges">#bridges</a>
76
+
77
+ <li><a href="#method-i-cir_status">#cir_status</a>
78
+
79
+ <li><a href="#method-i-closeallcircuits">#closeallcircuits</a>
80
+
81
+ <li><a href="#method-i-closecircuit">#closecircuit</a>
82
+
83
+ <li><a href="#method-i-ds">#ds</a>
84
+
85
+ <li><a href="#method-i-extendcir">#extendcir</a>
86
+
87
+ <li><a href="#method-i-extendcir_slowly">#extendcir_slowly</a>
88
+
89
+ <li><a href="#method-i-get_bridges">#get_bridges</a>
90
+
91
+ <li><a href="#method-i-get_entryguards">#get_entryguards</a>
92
+
93
+ <li><a href="#method-i-get_httperrors">#get_httperrors</a>
94
+
95
+ <li><a href="#method-i-get_purposeip">#get_purposeip</a>
96
+
97
+ <li><a href="#method-i-getconf">#getconf</a>
98
+
99
+ <li><a href="#method-i-getinfo">#getinfo</a>
100
+
101
+ <li><a href="#method-i-net_status">#net_status</a>
102
+
103
+ <li><a href="#method-i-newstreams">#newstreams</a>
104
+
105
+ <li><a href="#method-i-setconf">#setconf</a>
106
+
107
+ <li><a href="#method-i-signal">#signal</a>
108
+
109
+ <li><a href="#method-i-sr">#sr</a>
110
+
111
+ </ul>
112
+ </nav>
113
+
114
+ </div>
115
+
116
+ <div id="project-metadata">
117
+ <nav id="fileindex-section" class="section project-section">
118
+ <h3 class="section-header">Pages</h3>
119
+
120
+ <ul>
121
+
122
+ <li class="file"><a href="../ReadME_txt.html">ReadME</a>
123
+
124
+ </ul>
125
+ </nav>
126
+
127
+ <nav id="classindex-section" class="section project-section">
128
+ <h3 class="section-header">Class and Module Index</h3>
129
+
130
+ <ul class="link-list">
131
+
132
+ <li><a href="../Tor.html">Tor</a>
133
+
134
+ <li><a href="../Tor/Bridge.html">Tor::Bridge</a>
135
+
136
+ <li><a href="../Tor/CachedDesc.html">Tor::CachedDesc</a>
137
+
138
+ <li><a href="../Tor/Constants.html">Tor::Constants</a>
139
+
140
+ <li><a href="../Tor/Router.html">Tor::Router</a>
141
+
142
+ <li><a href="../Tor/StatsObj.html">Tor::StatsObj</a>
143
+
144
+ <li><a href="../Tor/TController.html">Tor::TController</a>
145
+
146
+ </ul>
147
+ </nav>
148
+
149
+ </div>
150
+ </nav>
151
+
152
+ <div id="documentation">
153
+ <h1 class="class">class Tor::TController</h1>
154
+
155
+ <div id="description" class="description">
156
+
157
+ <p>Tor:<a href="TController.html">TController</a> is an extension of the
158
+ Tor::Controller class, providing more methods. It inherits all methods from
159
+ Tor::Controller and can be used to interact with <a
160
+ href="../Tor.html">Tor</a>.</p>
161
+
162
+ <p><strong><a href="TController.html">TController</a> examples</strong></p>
163
+
164
+ <pre class="ruby"><span class="ruby-identifier">require</span> <span class="ruby-string">'tor_extend'</span>
165
+ <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">host=</span><span class="ruby-operator">&gt;</span><span class="ruby-ivar">@getbridge_config</span>[:<span class="ruby-identifier">torcontrolhost</span>],
166
+ :<span class="ruby-identifier">port=</span><span class="ruby-operator">&gt;</span><span class="ruby-ivar">@getbridge_config</span>[:<span class="ruby-identifier">torcontrolport</span>])
167
+ <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">host=</span><span class="ruby-operator">&gt;</span><span class="ruby-string">&quot;127.0.0.1&quot;</span>,:<span class="ruby-identifier">port=</span><span class="ruby-operator">&gt;</span><span class="ruby-value">9051</span>)
168
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">connect</span>
169
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">authenticate</span>(<span class="ruby-string">&quot;\&quot;tor_control_password\&quot;&quot;</span>)
170
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">sr</span>(:<span class="ruby-identifier">signal</span>,<span class="ruby-string">&quot;HUP&quot;</span>)
171
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">sr</span>(:<span class="ruby-identifier">signal</span>,<span class="ruby-string">&quot;newnym&quot;</span>)
172
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">getinfo</span>(<span class="ruby-string">&quot;ns/all&quot;</span>)
173
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">net_status</span>
174
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">closecircuit</span>(<span class="ruby-value">15</span>)
175
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">closeallcircuits</span>
176
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">signal</span>(<span class="ruby-string">&quot;reload&quot;</span>
177
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">extendcir</span>(<span class="ruby-value">0</span>,[<span class="ruby-string">'or1'</span>,<span class="ruby-string">'or2'</span>,<span class="ruby-string">'or3'</span>])
178
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">setconf</span>(<span class="ruby-string">&quot;__DisablePredictedCircuits&quot;</span>,<span class="ruby-value">1</span>)
179
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">setconf</span>(<span class="ruby-string">&quot;__LeaveStreamsUnattached&quot;</span>,<span class="ruby-value">1</span>)
180
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">getconf</span>(<span class="ruby-string">&quot;ORPort&quot;</span>)
181
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">getconf</span>(<span class="ruby-string">&quot;__LeaveStreamsUnattached&quot;</span>)
182
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">get_bridges</span>( {:<span class="ruby-identifier">type=</span><span class="ruby-operator">&gt;</span><span class="ruby-string">'http'</span>,:<span class="ruby-identifier">port=</span><span class="ruby-operator">&gt;</span><span class="ruby-value">9050</span>,:<span class="ruby-identifier">addr=</span><span class="ruby-operator">&gt;</span><span class="ruby-string">'127.0.0.1'</span>} )
183
+ </pre>
184
+
185
+ <p>For more details, visit [<a
186
+ href="https://github.com/bendiken/tor-ruby#readme">github.com/bendiken/tor-ruby#readme</a>],
187
+ [<a
188
+ href="https://gitweb.torproject.org/torspec.git/tree">gitweb.torproject.org/torspec.git/tree</a>]</p>
189
+
190
+ </div><!-- description -->
191
+
192
+
193
+
194
+
195
+ <section id="5Buntitled-5D" class="documentation-section">
196
+
197
+
198
+
199
+
200
+
201
+
202
+
203
+
204
+ <!-- Methods -->
205
+
206
+ <section id="public-instance-5Buntitled-5D-method-details" class="method-section section">
207
+ <h3 class="section-header">Public Instance Methods</h3>
208
+
209
+
210
+ <div id="method-i-attach_stream" class="method-detail ">
211
+
212
+ <div class="method-heading">
213
+ <span class="method-name">attach_stream</span><span
214
+ class="method-args">(stream_no, cir_num ,hop_count)</span>
215
+ <span class="method-click-advice">click to toggle source</span>
216
+ </div>
217
+
218
+
219
+ <div class="method-description">
220
+
221
+ <p>This attaches streams to circuits. No documentation yet.</p>
222
+
223
+
224
+
225
+ <div class="method-source-code" id="attach_stream-source">
226
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 246</span>
227
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">attach_stream</span>(<span class="ruby-identifier">stream_no</span>, <span class="ruby-identifier">cir_num</span> ,<span class="ruby-identifier">hop_count</span>)
228
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;attachstream&quot;</span>
229
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">hop_count</span><span class="ruby-operator">==</span><span class="ruby-value">0</span>
230
+ <span class="ruby-identifier">sr</span>(<span class="ruby-value">:attachstream</span>,<span class="ruby-node">&quot;#{stream_no} #{cir_num}&quot;</span>)
231
+ <span class="ruby-keyword">else</span>
232
+ <span class="ruby-identifier">sr</span>(<span class="ruby-value">:attachstream</span>,<span class="ruby-node">&quot;#{stream_no} #{cir_num} HOP=#{hop_count}&quot;</span>)
233
+ <span class="ruby-keyword">end</span>
234
+ <span class="ruby-keyword">end</span></pre>
235
+ </div><!-- attach_stream-source -->
236
+
237
+ </div>
238
+
239
+
240
+
241
+
242
+ </div><!-- attach_stream-method -->
243
+
244
+
245
+ <div id="method-i-bridges" class="method-detail ">
246
+
247
+ <div class="method-heading">
248
+ <span class="method-name">bridges</span><span
249
+ class="method-args">()</span>
250
+ <span class="method-click-advice">click to toggle source</span>
251
+ </div>
252
+
253
+
254
+ <div class="method-description">
255
+
256
+ <p>Returns all the brdiges in the database as an array.</p>
257
+
258
+ <p><a href="TController.html#method-i-bridges">#bridges</a> =&gt; [{:ipaddr,
259
+ :port, :lat, :lng},...]</p>
260
+
261
+
262
+
263
+ <div class="method-source-code" id="bridges-source">
264
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 228</span>
265
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">bridges</span>
266
+ <span class="ruby-constant">Bridges</span>.<span class="ruby-identifier">all</span>
267
+ <span class="ruby-keyword">end</span></pre>
268
+ </div><!-- bridges-source -->
269
+
270
+ </div>
271
+
272
+
273
+
274
+
275
+ </div><!-- bridges-method -->
276
+
277
+
278
+ <div id="method-i-cir_status" class="method-detail ">
279
+
280
+ <div class="method-heading">
281
+ <span class="method-name">cir_status</span><span
282
+ class="method-args">()</span>
283
+ <span class="method-click-advice">click to toggle source</span>
284
+ </div>
285
+
286
+
287
+ <div class="method-description">
288
+
289
+ <p>This returns the circuit-status in an array, or an empty array on failure</p>
290
+
291
+ <p><strong>Get the circuit-status from <a href="../Tor.html">Tor</a></strong>.</p>
292
+
293
+ <pre>Tor::TController.cir_status
294
+ [&quot;46 BUILT ORa,ORb,ORc PURPOSE=GENERAL&quot;]</pre>
295
+
296
+
297
+
298
+ <div class="method-source-code" id="cir_status-source">
299
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 42</span>
300
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">cir_status</span>
301
+ <span class="ruby-identifier">cirstatus</span>=<span class="ruby-identifier">getinfo</span>(<span class="ruby-string">&quot;circuit-status&quot;</span>)
302
+ <span class="ruby-keyword">end</span></pre>
303
+ </div><!-- cir_status-source -->
304
+
305
+ </div>
306
+
307
+
308
+
309
+
310
+ </div><!-- cir_status-method -->
311
+
312
+
313
+ <div id="method-i-closeallcircuits" class="method-detail ">
314
+
315
+ <div class="method-heading">
316
+ <span class="method-name">closeallcircuits</span><span
317
+ class="method-args">()</span>
318
+ <span class="method-click-advice">click to toggle source</span>
319
+ </div>
320
+
321
+
322
+ <div class="method-description">
323
+
324
+ <p>This attempts to close all open circuits.</p>
325
+
326
+ <p><strong>Closing all circuits</strong></p>
327
+
328
+ <pre>Tor::TController.closeallcircuits</pre>
329
+
330
+
331
+
332
+ <div class="method-source-code" id="closeallcircuits-source">
333
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 60</span>
334
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">closeallcircuits</span>
335
+ <span class="ruby-identifier">x</span>=<span class="ruby-identifier">cir_status</span>
336
+ <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">x</span>.<span class="ruby-identifier">empty?</span>
337
+ <span class="ruby-identifier">x</span>.<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">eachcircuit</span><span class="ruby-operator">|</span>
338
+ <span class="ruby-identifier">circnum</span> = <span class="ruby-identifier">eachcircuit</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/^\d+/</span>)
339
+ <span class="ruby-identifier">closecircuit</span>(<span class="ruby-identifier">circnum</span>)
340
+ }
341
+ <span class="ruby-keyword">end</span>
342
+ <span class="ruby-keyword">end</span></pre>
343
+ </div><!-- closeallcircuits-source -->
344
+
345
+ </div>
346
+
347
+
348
+
349
+
350
+ </div><!-- closeallcircuits-method -->
351
+
352
+
353
+ <div id="method-i-closecircuit" class="method-detail ">
354
+
355
+ <div class="method-heading">
356
+ <span class="method-name">closecircuit</span><span
357
+ class="method-args">(circnum)</span>
358
+ <span class="method-click-advice">click to toggle source</span>
359
+ </div>
360
+
361
+
362
+ <div class="method-description">
363
+
364
+ <p>This attempts to close a single circuit.</p>
365
+
366
+ <p><strong>Closing circuits</strong></p>
367
+
368
+ <pre>Tor::TController.closecircuit(15)</pre>
369
+
370
+
371
+
372
+ <div class="method-source-code" id="closecircuit-source">
373
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 51</span>
374
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">closecircuit</span> (<span class="ruby-identifier">circnum</span>)
375
+ <span class="ruby-identifier">errorstate</span>,<span class="ruby-identifier">ans</span>=<span class="ruby-identifier">sr</span>(<span class="ruby-value">:closecircuit</span>,<span class="ruby-node">&quot; #{circnum}&quot;</span>)
376
+ <span class="ruby-keyword">end</span></pre>
377
+ </div><!-- closecircuit-source -->
378
+
379
+ </div>
380
+
381
+
382
+
383
+
384
+ </div><!-- closecircuit-method -->
385
+
386
+
387
+ <div id="method-i-ds" class="method-detail ">
388
+
389
+ <div class="method-heading">
390
+ <span class="method-name">ds</span><span
391
+ class="method-args">()</span>
392
+ <span class="method-click-advice">click to toggle source</span>
393
+ </div>
394
+
395
+
396
+ <div class="method-description">
397
+
398
+ <p>Returns the an array of of directory servers from the consensus.</p>
399
+
400
+ <p><a href="TController.html#method-i-ds">#ds</a> =&gt; [w.x.y.z:port, ...]</p>
401
+
402
+
403
+
404
+ <div class="method-source-code" id="ds-source">
405
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 74</span>
406
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">ds</span>
407
+ <span class="ruby-identifier">reply</span>=[]
408
+ <span class="ruby-identifier">s</span> = <span class="ruby-identifier">getinfo</span>(<span class="ruby-string">&quot;ns/all&quot;</span>)
409
+ <span class="ruby-keyword">case</span> <span class="ruby-identifier">version</span>
410
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/0.2.[01]/</span>
411
+ <span class="ruby-identifier">z</span>=<span class="ruby-value">2</span>
412
+ <span class="ruby-keyword">when</span><span class="ruby-regexp">/0.2.2/</span>
413
+ <span class="ruby-identifier">z</span> = <span class="ruby-value">4</span> <span class="ruby-comment"># To accommodate r, s , w and p]</span>
414
+ <span class="ruby-keyword">end</span>
415
+ <span class="ruby-identifier">s</span>.<span class="ruby-identifier">collect!</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">eachs</span><span class="ruby-operator">|</span> <span class="ruby-identifier">eachs</span>.<span class="ruby-identifier">start_with?</span>(<span class="ruby-string">&quot;r &quot;</span>) <span class="ruby-operator">?</span> <span class="ruby-identifier">eachs</span> <span class="ruby-operator">:</span> <span class="ruby-keyword">nil</span> }
416
+ <span class="ruby-identifier">s</span>.<span class="ruby-identifier">delete</span> <span class="ruby-keyword">nil</span>
417
+ <span class="ruby-identifier">s</span>.<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">eachs</span><span class="ruby-operator">|</span>
418
+ <span class="ruby-identifier">dsport</span>=<span class="ruby-identifier">eachs</span>.<span class="ruby-identifier">split</span>[<span class="ruby-value">8</span>].<span class="ruby-identifier">to_i</span>
419
+ <span class="ruby-identifier">rip</span>=<span class="ruby-identifier">eachs</span>.<span class="ruby-identifier">split</span>[<span class="ruby-value">6</span>]
420
+ <span class="ruby-identifier">reply</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;#{rip}:#{dsport}&quot;</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">dsport!</span>= <span class="ruby-value">0</span>
421
+ }
422
+ <span class="ruby-identifier">reply</span>
423
+ <span class="ruby-keyword">end</span></pre>
424
+ </div><!-- ds-source -->
425
+
426
+ </div>
427
+
428
+
429
+
430
+
431
+ </div><!-- ds-method -->
432
+
433
+
434
+ <div id="method-i-extendcir" class="method-detail ">
435
+
436
+ <div class="method-heading">
437
+ <span class="method-name">extendcir</span><span
438
+ class="method-args">(circnum,or_list)</span>
439
+ <span class="method-click-advice">click to toggle source</span>
440
+ </div>
441
+
442
+
443
+ <div class="method-description">
444
+
445
+ <p>This creates/extends a circuit over multiple nodes. A new circuit is
446
+ created if cir_num == 0.</p>
447
+
448
+ <p><strong>Creating a new circuit</strong></p>
449
+
450
+ <pre>create_circ = Tor::TController.extendcir(0,['or1','or2','or3'])</pre>
451
+
452
+
453
+
454
+ <div class="method-source-code" id="extendcir-source">
455
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 99</span>
456
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">extendcir</span>(<span class="ruby-identifier">circnum</span>,<span class="ruby-identifier">or_list</span>)
457
+ <span class="ruby-identifier">argor</span>=<span class="ruby-node">&quot; #{circnum} #{or_list.join(',')}&quot;</span>
458
+ <span class="ruby-identifier">extendcir</span>=<span class="ruby-identifier">send_command</span>(<span class="ruby-value">:extendcircuit</span>,<span class="ruby-identifier">argor</span>)
459
+ <span class="ruby-identifier">circuit_id</span>=<span class="ruby-keyword">nil</span>
460
+ <span class="ruby-identifier">readterm</span>=<span class="ruby-keyword">true</span>
461
+ <span class="ruby-keyword">while</span> <span class="ruby-identifier">readterm</span> <span class="ruby-keyword">do</span>
462
+ <span class="ruby-keyword">case</span> <span class="ruby-identifier">msg</span>=<span class="ruby-identifier">read_reply</span>
463
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/^\d+ CIRC \d+ BUILT/</span>,<span class="ruby-regexp">/250 /</span> <span class="ruby-comment">#/^\d+ CIRC \d+ BUILT/</span>
464
+ <span class="ruby-identifier">circuit_id</span>=<span class="ruby-identifier">msg</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-regexp">/\d+\Z/</span>)[<span class="ruby-value">0</span>]
465
+ <span class="ruby-identifier">readterm</span>=<span class="ruby-keyword">false</span>
466
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/^5\d\d /</span>
467
+ <span class="ruby-identifier">readterm</span>=<span class="ruby-keyword">false</span>
468
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/^\d+ /</span>
469
+ <span class="ruby-identifier">puts</span> <span class="ruby-identifier">msg</span> <span class="ruby-comment">#like extended launched</span>
470
+ <span class="ruby-keyword">else</span>
471
+ <span class="ruby-identifier">puts</span> <span class="ruby-identifier">msg</span>,<span class="ruby-string">&quot;\n&quot;</span>
472
+ <span class="ruby-keyword">end</span>
473
+ <span class="ruby-keyword">end</span>
474
+ <span class="ruby-comment">#sr(:signal,&quot;newnym&quot;) </span>
475
+ <span class="ruby-identifier">circuit_id</span>
476
+ <span class="ruby-keyword">end</span></pre>
477
+ </div><!-- extendcir-source -->
478
+
479
+ </div>
480
+
481
+
482
+
483
+
484
+ </div><!-- extendcir-method -->
485
+
486
+
487
+ <div id="method-i-extendcir_slowly" class="method-detail ">
488
+
489
+ <div class="method-heading">
490
+ <span class="method-name">extendcir_slowly</span><span
491
+ class="method-args">(orarray)</span>
492
+ <span class="method-click-advice">click to toggle source</span>
493
+ </div>
494
+
495
+
496
+ <div class="method-description">
497
+
498
+ <p>This builds a circuit to each member of the array argument, skipping any
499
+ node that fails to connect. It returns the circuit number, and the longest
500
+ successful circuit that was successfully built. There is a delay of 2.0
501
+ seconds after each extension, but this can be altered by defining
502
+ Tor::EXTEND_DELAY constant.</p>
503
+
504
+ <p><strong>Create a circuit as long as possible using 10 elements in an
505
+ array</strong></p>
506
+
507
+ <pre>testarray = [A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]
508
+ Tor::TController.extendcir_slowly(testarray)</pre>
509
+
510
+
511
+
512
+ <div class="method-source-code" id="extendcir_slowly-source">
513
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 128</span>
514
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">extendcir_slowly</span>(<span class="ruby-identifier">orarray</span>)
515
+ <span class="ruby-identifier">ordelay</span> = <span class="ruby-keyword">defined?</span>(<span class="ruby-constant">EXTEND_DELAY</span>) <span class="ruby-operator">?</span> <span class="ruby-constant">EXTEND_DELAY</span> <span class="ruby-operator">:</span> <span class="ruby-constant">Constants</span><span class="ruby-operator">::</span><span class="ruby-constant">EXTEND_DELAY</span>
516
+ <span class="ruby-identifier">cirnum</span> = <span class="ruby-value">0</span>
517
+ <span class="ruby-identifier">circuit</span> = []
518
+ <span class="ruby-identifier">orarray</span>.<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">eachor</span><span class="ruby-operator">|</span>
519
+ <span class="ruby-identifier">cirnum</span>=<span class="ruby-identifier">extendcir</span>(<span class="ruby-identifier">cirnum</span>,[<span class="ruby-identifier">eachor</span>])
520
+ <span class="ruby-identifier">sleep</span>(<span class="ruby-identifier">ordelay</span>) <span class="ruby-comment"># wait for a few seconds, and check if the circuit is was successful</span>
521
+ <span class="ruby-identifier">p</span>=<span class="ruby-identifier">cir_status</span>.<span class="ruby-identifier">detect</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">i</span><span class="ruby-operator">|</span> <span class="ruby-identifier">i</span> <span class="ruby-operator">=~</span> (<span class="ruby-node">/^#{cirnum} /</span> )}
522
+ <span class="ruby-keyword">case</span> <span class="ruby-identifier">p</span>
523
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/FAILED/</span>,<span class="ruby-keyword">nil</span>
524
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&quot;cirnum=nil&quot;</span>
525
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">eachor</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">circuit</span>.<span class="ruby-identifier">last</span>
526
+ <span class="ruby-identifier">cirnum</span> = <span class="ruby-identifier">extendcir</span>(<span class="ruby-value">0</span>,<span class="ruby-identifier">circuit</span>)
527
+ <span class="ruby-identifier">sleep</span>(<span class="ruby-identifier">circuit</span>.<span class="ruby-identifier">count</span>)
528
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">circuit</span>.<span class="ruby-identifier">empty?</span>
529
+ <span class="ruby-keyword">return</span> <span class="ruby-keyword">nil</span> <span class="ruby-comment"># failed to build circuit at start, make sure orarray[0] is up</span>
530
+ <span class="ruby-keyword">end</span>
531
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/EXTENDED/</span>, <span class="ruby-regexp">/BUILT/</span>
532
+ <span class="ruby-identifier">circuit</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">eachor</span>
533
+ <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Extended! cirnum = #{cirnum}, circuit length = #{circuit.count}&quot;</span>
534
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/LAUNCHED/</span>
535
+ <span class="ruby-identifier">sleep</span>(<span class="ruby-value">1</span>)
536
+ <span class="ruby-identifier">puts</span> <span class="ruby-identifier">x</span>=<span class="ruby-identifier">cir_status</span>.<span class="ruby-identifier">detect</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">a</span><span class="ruby-operator">|</span> <span class="ruby-identifier">a</span> <span class="ruby-operator">=~</span> <span class="ruby-node">/^#{cirnum}/</span>}
537
+ <span class="ruby-identifier">circuit</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">eachor</span> <span class="ruby-keyword">if</span> (<span class="ruby-identifier">x</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp">/BUILT/</span>) <span class="ruby-keyword">or</span> (<span class="ruby-identifier">x</span> <span class="ruby-operator">=~</span><span class="ruby-regexp">/EXTENDED/</span>)
538
+ <span class="ruby-keyword">end</span>
539
+ }
540
+ [<span class="ruby-identifier">cirnum</span>,<span class="ruby-identifier">circuit</span>]
541
+ <span class="ruby-keyword">end</span></pre>
542
+ </div><!-- extendcir_slowly-source -->
543
+
544
+ </div>
545
+
546
+
547
+
548
+
549
+ </div><!-- extendcir_slowly-method -->
550
+
551
+
552
+ <div id="method-i-get_bridges" class="method-detail ">
553
+
554
+ <div class="method-heading">
555
+ <span class="method-name">get_bridges</span><span
556
+ class="method-args">(url, cacheddesc, *config)</span>
557
+ <span class="method-click-advice">click to toggle source</span>
558
+ </div>
559
+
560
+
561
+ <div class="method-description">
562
+
563
+ <p>This gets 3 bridge IP addresses from the <a href="../Tor.html">Tor</a>
564
+ bridge website. proxyconfig is optional. default proxyconfig =
565
+ {:type=&gt;‘tor’ ,:port=&gt;9050,:addr=&gt;‘127.0.0.1’} The return format
566
+ is fo the form:</p>
567
+
568
+ <p>[HTTPcode, [{:bridgeip, :bridgeport},{:bridgeip, :bridgeport},{:bridgeip,
569
+ :bridgeport}]. The types can be one of ‘tor’, ‘polipo’, ‘socks’, ‘http’,
570
+ ‘https’,nil, ‘none’.</p>
571
+
572
+ <pre class="ruby"><span class="ruby-identifier">torctrl_cirnum</span> <span class="ruby-identifier">must</span> <span class="ruby-identifier">have</span> <span class="ruby-identifier">the</span> <span class="ruby-identifier">form</span><span class="ruby-operator">:</span>
573
+ <span class="ruby-identifier">torctrl_cirnum</span> ={:<span class="ruby-identifier">torctrl=</span><span class="ruby-operator">&gt;</span><span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>, :<span class="ruby-identifier">cirnum=</span><span class="ruby-operator">&gt;</span><span class="ruby-identifier">cirnum</span>,:<span class="ruby-identifier">hop=</span><span class="ruby-operator">&gt;</span><span class="ruby-identifier">hopcount</span>}
574
+ </pre>
575
+
576
+ <p><strong>Get 3 bridges</strong></p>
577
+
578
+ <pre class="ruby"><span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">get_bridges</span>( {:<span class="ruby-identifier">proxytype=</span><span class="ruby-operator">&gt;</span><span class="ruby-string">'tor'</span>,:<span class="ruby-identifier">proxyport=</span><span class="ruby-operator">&gt;</span><span class="ruby-value">9050</span>,:<span class="ruby-identifier">proxyaddr=</span><span class="ruby-operator">&gt;</span><span class="ruby-string">'127.0.0.1'</span>} )
579
+ </pre>
580
+
581
+
582
+
583
+ <div class="method-source-code" id="get_bridges-source">
584
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 168</span>
585
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">get_bridges</span>(<span class="ruby-identifier">url</span>, <span class="ruby-identifier">cacheddesc</span>, *<span class="ruby-identifier">config</span>)
586
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">config</span>.<span class="ruby-identifier">empty?</span>
587
+ <span class="ruby-identifier">proxyconfig</span>={<span class="ruby-value">:type=</span><span class="ruby-operator">&gt;</span><span class="ruby-string">'tor'</span> ,<span class="ruby-value">:port=</span><span class="ruby-operator">&gt;</span><span class="ruby-value">9050</span>,<span class="ruby-value">:addr=</span><span class="ruby-operator">&gt;</span><span class="ruby-string">'127.0.0.1'</span>}
588
+ <span class="ruby-keyword">else</span>
589
+ <span class="ruby-identifier">proxyconfig</span> = <span class="ruby-identifier">config</span>[<span class="ruby-value">0</span>]
590
+ <span class="ruby-keyword">end</span>
591
+ <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span> <span class="ruby-keyword">defined?</span>(<span class="ruby-ivar">@myhttperrors</span>)
592
+ <span class="ruby-ivar">@myhttperrors</span>=<span class="ruby-value">0</span>
593
+ <span class="ruby-keyword">end</span>
594
+ <span class="ruby-keyword">case</span> <span class="ruby-identifier">proxyconfig</span>[<span class="ruby-value">:type</span>]
595
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/none/</span>,<span class="ruby-keyword">nil</span>
596
+ <span class="ruby-identifier">http_session</span>=<span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">HTTP</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">url</span>.<span class="ruby-identifier">host</span>,<span class="ruby-identifier">url</span>.<span class="ruby-identifier">port</span>)
597
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/socks/</span>,<span class="ruby-regexp">/tor/</span>
598
+ <span class="ruby-identifier">http_session</span>=<span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">HTTP</span>.<span class="ruby-constant">SOCKSProxy</span>(<span class="ruby-identifier">proxyconfig</span>[<span class="ruby-value">:addr</span>], <span class="ruby-identifier">proxyconfig</span>[<span class="ruby-value">:port</span>]).<span class="ruby-identifier">new</span>(<span class="ruby-identifier">url</span>.<span class="ruby-identifier">host</span>,<span class="ruby-identifier">url</span>.<span class="ruby-identifier">port</span>)
599
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/http/</span>,<span class="ruby-regexp">/https/</span>,<span class="ruby-regexp">/polipo/</span>
600
+ <span class="ruby-identifier">http_session</span>=<span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">HTTP</span><span class="ruby-operator">::</span><span class="ruby-constant">Proxy</span>(<span class="ruby-identifier">proxyconfig</span>[<span class="ruby-value">:addr</span>], <span class="ruby-identifier">proxyconfig</span>[<span class="ruby-value">:port</span>]).<span class="ruby-identifier">new</span>(<span class="ruby-identifier">url</span>.<span class="ruby-identifier">host</span>,<span class="ruby-identifier">url</span>.<span class="ruby-identifier">port</span>)
601
+ <span class="ruby-keyword">end</span>
602
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">url</span>.<span class="ruby-identifier">scheme</span><span class="ruby-operator">==</span><span class="ruby-string">&quot;https&quot;</span>
603
+ <span class="ruby-identifier">http_session</span>.<span class="ruby-identifier">use_ssl</span> = <span class="ruby-keyword">true</span>
604
+ <span class="ruby-identifier">http_session</span>.<span class="ruby-identifier">verify_mode</span> = <span class="ruby-constant">OpenSSL</span><span class="ruby-operator">::</span><span class="ruby-constant">SSL</span><span class="ruby-operator">::</span><span class="ruby-constant">VERIFY_NONE</span>
605
+ <span class="ruby-keyword">else</span>
606
+ <span class="ruby-identifier">http_session</span>.<span class="ruby-identifier">use_ssl</span>=<span class="ruby-keyword">false</span>
607
+ <span class="ruby-keyword">end</span>
608
+ <span class="ruby-identifier">bridges</span>=[]
609
+ <span class="ruby-comment"># Rescue from http error</span>
610
+ <span class="ruby-keyword">begin</span>
611
+ <span class="ruby-identifier">resp</span> = <span class="ruby-identifier">http_session</span>.<span class="ruby-identifier">get2</span> <span class="ruby-identifier">url</span>.<span class="ruby-identifier">path</span> <span class="ruby-comment"># Let Tor choose circuit itself</span>
612
+ <span class="ruby-comment"># Additional code will be added shortly to attach the stream to the circuit directly</span>
613
+ <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;#{resp.code} HTTP response&quot;</span>
614
+ <span class="ruby-comment">#puts resp.body</span>
615
+ <span class="ruby-identifier">respcode</span>= <span class="ruby-identifier">resp</span>.<span class="ruby-identifier">code</span><span class="ruby-operator">==</span><span class="ruby-string">&quot;200&quot;</span> <span class="ruby-operator">?</span> <span class="ruby-value">200</span><span class="ruby-operator">:</span><span class="ruby-keyword">nil</span>
616
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">resp</span>.<span class="ruby-identifier">code</span> <span class="ruby-operator">==</span> <span class="ruby-string">&quot;200&quot;</span>
617
+ <span class="ruby-identifier">torbridgeip</span>=<span class="ruby-identifier">resp</span>.<span class="ruby-identifier">body</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-regexp">/\d+\.\d+\.\d+\.\d+\:\d+/</span>)
618
+ <span class="ruby-identifier">torbridgeip</span>.<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">eachbridge</span><span class="ruby-operator">|</span>
619
+ <span class="ruby-identifier">bridgeip</span>,<span class="ruby-identifier">bridgeport</span>= <span class="ruby-identifier">eachbridge</span>.<span class="ruby-identifier">split</span>(<span class="ruby-string">':'</span>)
620
+ <span class="ruby-identifier">x</span>=<span class="ruby-constant">Bridge</span>.<span class="ruby-identifier">where</span>(<span class="ruby-value">:ipaddr=</span><span class="ruby-operator">&gt;</span><span class="ruby-identifier">bridgeip</span>, <span class="ruby-value">:port</span> =<span class="ruby-operator">&gt;</span><span class="ruby-identifier">bridgeport</span>)
621
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">empty?</span>
622
+ <span class="ruby-keyword">if</span> (<span class="ruby-identifier">bridge_geoip</span>=<span class="ruby-identifier">cacheddesc</span>.<span class="ruby-identifier">get_geoiprecord</span>(<span class="ruby-identifier">bridgeip</span>)).<span class="ruby-identifier">nil?</span>
623
+ <span class="ruby-constant">Bridge</span>.<span class="ruby-identifier">create</span>(<span class="ruby-value">:ipaddr=</span><span class="ruby-operator">&gt;</span><span class="ruby-identifier">bridgeip</span>, <span class="ruby-value">:port</span> =<span class="ruby-operator">&gt;</span><span class="ruby-identifier">bridgeport</span>,
624
+ <span class="ruby-value">:lat=</span><span class="ruby-operator">&gt;</span><span class="ruby-value">0</span>, <span class="ruby-value">:lng=</span><span class="ruby-operator">&gt;</span><span class="ruby-value">0</span>)
625
+ <span class="ruby-keyword">else</span>
626
+ <span class="ruby-constant">Bridge</span>.<span class="ruby-identifier">create</span>(<span class="ruby-value">:ipaddr=</span><span class="ruby-operator">&gt;</span><span class="ruby-identifier">bridgeip</span>, <span class="ruby-value">:port</span> =<span class="ruby-operator">&gt;</span><span class="ruby-identifier">bridgeport</span>,
627
+ <span class="ruby-value">:lat=</span><span class="ruby-operator">&gt;</span><span class="ruby-identifier">bridge_geoip</span>.<span class="ruby-identifier">latitude</span>.<span class="ruby-identifier">to_f</span>,
628
+ <span class="ruby-value">:lng=</span><span class="ruby-operator">&gt;</span><span class="ruby-identifier">bridge_geoip</span>.<span class="ruby-identifier">longitude</span>.<span class="ruby-identifier">to_f</span> )
629
+ <span class="ruby-keyword">end</span>
630
+ <span class="ruby-keyword">end</span>
631
+ }
632
+ <span class="ruby-keyword">end</span>
633
+ <span class="ruby-identifier">bridges</span> = <span class="ruby-identifier">torbridgeip</span>
634
+ <span class="ruby-keyword">rescue</span>
635
+ <span class="ruby-ivar">@myhttperrors</span> <span class="ruby-operator">+=</span><span class="ruby-value">1</span>
636
+ <span class="ruby-identifier">respcode</span>=<span class="ruby-keyword">nil</span>
637
+ <span class="ruby-identifier">bridges</span>=[]
638
+ <span class="ruby-keyword">end</span>
639
+ <span class="ruby-identifier">bridges</span> <span class="ruby-comment">#Return array of all bridges</span>
640
+ <span class="ruby-keyword">end</span></pre>
641
+ </div><!-- get_bridges-source -->
642
+
643
+ </div>
644
+
645
+
646
+
647
+
648
+ </div><!-- get_bridges-method -->
649
+
650
+
651
+ <div id="method-i-get_entryguards" class="method-detail ">
652
+
653
+ <div class="method-heading">
654
+ <span class="method-name">get_entryguards</span><span
655
+ class="method-args">()</span>
656
+ <span class="method-click-advice">click to toggle source</span>
657
+ </div>
658
+
659
+
660
+ <div class="method-description">
661
+
662
+ <p>This gets enty guards from the control port of tor using the getinfo
663
+ “entry-guards” command and returns just the fingerprints in an array.</p>
664
+
665
+ <p><strong>Get entry-guards</strong></p>
666
+
667
+ <pre class="ruby"><span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">get_entryguards</span> <span class="ruby-comment">#=&gt; [&quot;$abc123&quot;,&quot;$def456&quot;...]</span>
668
+ </pre>
669
+
670
+
671
+
672
+ <div class="method-source-code" id="get_entryguards-source">
673
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 262</span>
674
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">get_entryguards</span>
675
+ <span class="ruby-identifier">rslt</span> = <span class="ruby-identifier">getinfo</span> <span class="ruby-string">&quot;entry-guards&quot;</span>
676
+ <span class="ruby-identifier">reply</span> = <span class="ruby-identifier">rslt</span>.<span class="ruby-identifier">collect</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">eachguard</span><span class="ruby-operator">|</span>
677
+ <span class="ruby-keyword">case</span> <span class="ruby-identifier">eachguard</span>
678
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/ unusable/</span>
679
+ <span class="ruby-keyword">nil</span>
680
+ <span class="ruby-keyword">else</span>
681
+ <span class="ruby-string">&quot;$&quot;</span><span class="ruby-operator">+</span> <span class="ruby-identifier">eachguard</span>.<span class="ruby-identifier">split</span>(<span class="ruby-regexp">/[~ =]/</span>)[<span class="ruby-value">0</span>]
682
+ <span class="ruby-keyword">end</span>
683
+ }
684
+ <span class="ruby-identifier">reply</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-keyword">nil</span>)
685
+ <span class="ruby-identifier">reply</span>
686
+ <span class="ruby-keyword">end</span></pre>
687
+ </div><!-- get_entryguards-source -->
688
+
689
+ </div>
690
+
691
+
692
+
693
+
694
+ </div><!-- get_entryguards-method -->
695
+
696
+
697
+ <div id="method-i-get_httperrors" class="method-detail ">
698
+
699
+ <div class="method-heading">
700
+ <span class="method-name">get_httperrors</span><span
701
+ class="method-args">()</span>
702
+ <span class="method-click-advice">click to toggle source</span>
703
+ </div>
704
+
705
+
706
+ <div class="method-description">
707
+
708
+ <p>This returns the number of HTTP errors from the <a
709
+ href="TController.html#method-i-get_bridges">#get_bridges</a> command</p>
710
+
711
+
712
+
713
+ <div class="method-source-code" id="get_httperrors-source">
714
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 278</span>
715
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">get_httperrors</span>
716
+ <span class="ruby-ivar">@myhttperrors</span>
717
+ <span class="ruby-keyword">end</span></pre>
718
+ </div><!-- get_httperrors-source -->
719
+
720
+ </div>
721
+
722
+
723
+
724
+
725
+ </div><!-- get_httperrors-method -->
726
+
727
+
728
+ <div id="method-i-get_purposeip" class="method-detail ">
729
+
730
+ <div class="method-heading">
731
+ <span class="method-name">get_purposeip</span><span
732
+ class="method-args">(nodetype)</span>
733
+ <span class="method-click-advice">click to toggle source</span>
734
+ </div>
735
+
736
+
737
+ <div class="method-description">
738
+
739
+ <p>This gets the IP addresses for ORs based on the characteristics of the OR.
740
+ Example of the properties include: <em>Fast</em>, <em>Guard</em>,
741
+ <em>HSDir</em>, <em>Named</em>, <em>Running</em>, <em>Stable</em>,
742
+ <em>V2Dir</em>, <em>Valid</em>, <em>Exit</em>.</p>
743
+
744
+ <p><strong>Get all Exit, Fast and entry Guard ORs</strong></p>
745
+
746
+ <pre class="ruby"><span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">get_purposeip</span>(<span class="ruby-string">&quot;Exit&quot;</span>) <span class="ruby-comment">#=&gt; [&quot;a.b.c.d&quot;,&quot;e.f.g.h&quot;...]</span>
747
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">get_purposeip</span>(<span class="ruby-string">&quot;fast exit&quot;</span>)
748
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">get_purposeip</span>(<span class="ruby-string">&quot;Guard&quot;</span>)
749
+ </pre>
750
+
751
+
752
+
753
+ <div class="method-source-code" id="get_purposeip-source">
754
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 290</span>
755
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">get_purposeip</span>(<span class="ruby-identifier">nodetype</span>)
756
+ <span class="ruby-identifier">reply</span>=[]
757
+ <span class="ruby-identifier">s</span> = <span class="ruby-identifier">getinfo</span>(<span class="ruby-string">&quot;ns/all&quot;</span>)
758
+ <span class="ruby-identifier">ctr_i</span>= <span class="ruby-identifier">s</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">/</span> <span class="ruby-value">2</span>
759
+ <span class="ruby-identifier">ctr_i</span>.<span class="ruby-identifier">times</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">j</span><span class="ruby-operator">|</span>
760
+ <span class="ruby-identifier">rip</span>=<span class="ruby-identifier">s</span>[<span class="ruby-identifier">j</span>*<span class="ruby-value">2</span>].<span class="ruby-identifier">split</span>[<span class="ruby-value">6</span>]
761
+ <span class="ruby-identifier">x</span>=<span class="ruby-constant">Router</span>.<span class="ruby-identifier">where</span>(<span class="ruby-value">:ipaddr=</span><span class="ruby-operator">&gt;</span><span class="ruby-identifier">rip</span>)
762
+ <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">x</span>.<span class="ruby-identifier">empty?</span>
763
+ <span class="ruby-identifier">finprint</span> = <span class="ruby-string">&quot;$&quot;</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">x</span>[<span class="ruby-value">0</span>].<span class="ruby-identifier">fingerprint</span>
764
+ <span class="ruby-identifier">matcharray</span>=<span class="ruby-identifier">nodetype</span>.<span class="ruby-identifier">split</span>.<span class="ruby-identifier">collect</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">eachtype</span><span class="ruby-operator">|</span>
765
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">eachtype</span>.<span class="ruby-identifier">start_with?</span> <span class="ruby-string">'!'</span>
766
+ <span class="ruby-identifier">matchme</span> = <span class="ruby-identifier">eachtype</span>[<span class="ruby-value">1</span><span class="ruby-operator">..</span>(<span class="ruby-identifier">eachtype</span>.<span class="ruby-identifier">length</span><span class="ruby-operator">-</span><span class="ruby-value">1</span>)]
767
+ <span class="ruby-identifier">rslt</span> = <span class="ruby-operator">!</span>(<span class="ruby-identifier">s</span>[<span class="ruby-identifier">j</span>*<span class="ruby-value">2</span><span class="ruby-operator">+</span><span class="ruby-value">1</span>] <span class="ruby-operator">=~</span> (<span class="ruby-node">/#{matchme}/</span>))
768
+ <span class="ruby-identifier">rslt</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">rslt</span> <span class="ruby-operator">:</span> <span class="ruby-keyword">nil</span> <span class="ruby-comment">#return nil if false, or return the number</span>
769
+ <span class="ruby-keyword">else</span>
770
+ <span class="ruby-identifier">s</span>[<span class="ruby-identifier">j</span>*<span class="ruby-value">2</span><span class="ruby-operator">+</span><span class="ruby-value">1</span>] <span class="ruby-operator">=~</span> (<span class="ruby-node">/#{eachtype}/</span>)
771
+ <span class="ruby-keyword">end</span>
772
+ }
773
+ <span class="ruby-identifier">reply</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">finprint</span> <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">matcharray</span>.<span class="ruby-identifier">include?</span> <span class="ruby-keyword">nil</span>
774
+ <span class="ruby-keyword">end</span>
775
+ }
776
+ <span class="ruby-identifier">reply</span>
777
+ <span class="ruby-keyword">end</span></pre>
778
+ </div><!-- get_purposeip-source -->
779
+
780
+ </div>
781
+
782
+
783
+
784
+
785
+ </div><!-- get_purposeip-method -->
786
+
787
+
788
+ <div id="method-i-getconf" class="method-detail ">
789
+
790
+ <div class="method-heading">
791
+ <span class="method-name">getconf</span><span
792
+ class="method-args">(confname)</span>
793
+ <span class="method-click-advice">click to toggle source</span>
794
+ </div>
795
+
796
+
797
+ <div class="method-description">
798
+
799
+ <p>This gets a configuration from <a href="../Tor.html">Tor</a>. The arguments
800
+ of this command might be case sensitive. It returns the protocol error
801
+ message if it fails.</p>
802
+
803
+ <p><strong>Get the present ORport <a href="../Tor.html">Tor</a> is
804
+ using</strong></p>
805
+
806
+ <pre class="ruby"> <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">getconf</span>(<span class="ruby-string">&quot;ORPort&quot;</span>) <span class="ruby-comment">#=&gt;&quot;9001&quot;</span>
807
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">getconf</span>(<span class="ruby-string">&quot;__LeaveStreamsUnattached&quot;</span>) <span class="ruby-comment">#=&gt;&quot;1&quot;</span>
808
+
809
+ <span class="ruby-constant">For</span> <span class="ruby-identifier">more</span> <span class="ruby-identifier">details</span>, <span class="ruby-identifier">see</span> [<span class="ruby-identifier">https</span>:<span class="ruby-operator">/</span><span class="ruby-regexp">/gitweb.torproject.org/</span><span class="ruby-identifier">torspec</span>.<span class="ruby-identifier">git</span><span class="ruby-operator">/</span><span class="ruby-identifier">blob</span><span class="ruby-operator">/</span><span class="ruby-constant">HEAD</span>:<span class="ruby-operator">/</span><span class="ruby-identifier">control</span><span class="ruby-operator">-</span><span class="ruby-identifier">spec</span>.<span class="ruby-identifier">txt</span>]
810
+ </pre>
811
+
812
+
813
+
814
+ <div class="method-source-code" id="getconf-source">
815
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 322</span>
816
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">getconf</span>(<span class="ruby-identifier">confname</span>)
817
+ <span class="ruby-identifier">send_command</span>(<span class="ruby-value">:getconf</span>, <span class="ruby-identifier">confname</span>)
818
+ <span class="ruby-identifier">reply</span>=[]
819
+ <span class="ruby-keyword">case</span> <span class="ruby-identifier">msg</span>=<span class="ruby-identifier">read_reply</span>
820
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/250 /</span>
821
+ <span class="ruby-identifier">msg</span>.<span class="ruby-identifier">split</span>(<span class="ruby-regexp">/250 \S*=/</span>).<span class="ruby-identifier">last</span>
822
+ <span class="ruby-keyword">else</span>
823
+ <span class="ruby-identifier">msg</span>
824
+ <span class="ruby-keyword">end</span>
825
+ <span class="ruby-keyword">end</span></pre>
826
+ </div><!-- getconf-source -->
827
+
828
+ </div>
829
+
830
+
831
+
832
+
833
+ </div><!-- getconf-method -->
834
+
835
+
836
+ <div id="method-i-getinfo" class="method-detail ">
837
+
838
+ <div class="method-heading">
839
+ <span class="method-name">getinfo</span><span
840
+ class="method-args">(*args)</span>
841
+ <span class="method-click-advice">click to toggle source</span>
842
+ </div>
843
+
844
+
845
+ <div class="method-description">
846
+
847
+ <p>This method sends the “GETINFO” protocol message with the arguments.</p>
848
+
849
+ <p><strong>Getting more information from <a
850
+ href="../Tor.html">Tor</a></strong></p>
851
+
852
+ <pre>Tor::TController.getinfo(&quot;ns/all&quot;)</pre>
853
+
854
+
855
+
856
+ <div class="method-source-code" id="getinfo-source">
857
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 339</span>
858
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">getinfo</span>(*<span class="ruby-identifier">args</span>)
859
+ <span class="ruby-identifier">errorcode</span>,<span class="ruby-identifier">ans</span> = <span class="ruby-identifier">sr</span>(<span class="ruby-value">:getinfo</span>,*<span class="ruby-identifier">args</span>)
860
+ <span class="ruby-identifier">ans</span>
861
+ <span class="ruby-keyword">end</span></pre>
862
+ </div><!-- getinfo-source -->
863
+
864
+ </div>
865
+
866
+
867
+
868
+
869
+ </div><!-- getinfo-method -->
870
+
871
+
872
+ <div id="method-i-net_status" class="method-detail ">
873
+
874
+ <div class="method-heading">
875
+ <span class="method-name">net_status</span><span
876
+ class="method-args">()</span>
877
+ <span class="method-click-advice">click to toggle source</span>
878
+ </div>
879
+
880
+
881
+ <div class="method-description">
882
+
883
+ <p>This returns an array of hash tables with the fingerprints of all onion
884
+ routers that have not been marked as down.</p>
885
+
886
+ <p><strong>Get the network status from <a href="../Tor.html">Tor</a></strong></p>
887
+
888
+ <pre class="ruby"><span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">net_status</span> =<span class="ruby-operator">&gt;</span> [ {:<span class="ruby-identifier">fingerprint=</span><span class="ruby-operator">&gt;</span><span class="ruby-string">&quot;$ABCD&quot;</span>},{:<span class="ruby-identifier">fingerprint=</span><span class="ruby-operator">&gt;</span><span class="ruby-string">&quot;$EFGH&quot;</span>}<span class="ruby-operator">...</span>]
889
+ </pre>
890
+
891
+
892
+
893
+ <div class="method-source-code" id="net_status-source">
894
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 349</span>
895
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">net_status</span>
896
+ <span class="ruby-keyword">case</span> <span class="ruby-identifier">version</span>
897
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/0.2.[01]/</span>
898
+ <span class="ruby-identifier">net_status1</span>
899
+ <span class="ruby-keyword">when</span><span class="ruby-regexp">/0.2.2/</span>
900
+ <span class="ruby-identifier">net_status2</span>
901
+ <span class="ruby-keyword">end</span>
902
+ <span class="ruby-keyword">end</span></pre>
903
+ </div><!-- net_status-source -->
904
+
905
+ </div>
906
+
907
+
908
+
909
+
910
+ </div><!-- net_status-method -->
911
+
912
+
913
+ <div id="method-i-newstreams" class="method-detail ">
914
+
915
+ <div class="method-heading">
916
+ <span class="method-name">newstreams</span><span
917
+ class="method-args">()</span>
918
+ <span class="method-click-advice">click to toggle source</span>
919
+ </div>
920
+
921
+
922
+ <div class="method-description">
923
+
924
+ <p>This returns all the new streams that have not been assigned to a circuit</p>
925
+
926
+
927
+
928
+ <div class="method-source-code" id="newstreams-source">
929
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 233</span>
930
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">newstreams</span>
931
+ <span class="ruby-identifier">reply</span>=[]
932
+ <span class="ruby-identifier">getinfo</span>(<span class="ruby-string">&quot;stream-status&quot;</span>).<span class="ruby-identifier">each</span>{<span class="ruby-operator">|</span><span class="ruby-identifier">eachstream</span><span class="ruby-operator">|</span>
933
+ <span class="ruby-keyword">case</span> <span class="ruby-identifier">eachstream</span>
934
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/\d+ NEW 0/</span>
935
+ <span class="ruby-comment"># It might be simpler to use this /\d+ NEW/</span>
936
+ <span class="ruby-identifier">reply</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">eachstream</span>.<span class="ruby-identifier">scan</span>(<span class="ruby-regexp">/\d+/</span>)[<span class="ruby-value">0</span>]
937
+ <span class="ruby-keyword">end</span>
938
+ }
939
+ <span class="ruby-identifier">reply</span>
940
+ <span class="ruby-keyword">end</span></pre>
941
+ </div><!-- newstreams-source -->
942
+
943
+ </div>
944
+
945
+
946
+
947
+
948
+ </div><!-- newstreams-method -->
949
+
950
+
951
+ <div id="method-i-setconf" class="method-detail ">
952
+
953
+ <div class="method-heading">
954
+ <span class="method-name">setconf</span><span
955
+ class="method-args">(confname,value)</span>
956
+ <span class="method-click-advice">click to toggle source</span>
957
+ </div>
958
+
959
+
960
+ <div class="method-description">
961
+
962
+ <p>This sets a configuration in <a href="../Tor.html">Tor</a> to a value.</p>
963
+
964
+ <p><strong>Setting <a href="../Tor.html">Tor</a> config</strong></p>
965
+
966
+ <pre class="ruby"><span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">setconf</span>(<span class="ruby-string">&quot;__DisablePredictedCircuits&quot;</span>,<span class="ruby-value">1</span>) =<span class="ruby-operator">&gt;</span>[<span class="ruby-string">&quot;OK&quot;</span>, []]
967
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">setconf</span>(<span class="ruby-string">&quot;__LeaveStreamsUnattached&quot;</span>,<span class="ruby-value">1</span>) =<span class="ruby-operator">&gt;</span>[<span class="ruby-string">&quot;OK&quot;</span>, []]
968
+ <span class="ruby-constant">Tor</span><span class="ruby-operator">::</span><span class="ruby-constant">TController</span>.<span class="ruby-identifier">setconf</span>(<span class="ruby-string">&quot;ORPort&quot;</span>,<span class="ruby-value">9001</span>) =<span class="ruby-operator">&gt;</span>[<span class="ruby-string">&quot;OK&quot;</span>, []]
969
+ </pre>
970
+
971
+
972
+
973
+ <div class="method-source-code" id="setconf-source">
974
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 409</span>
975
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">setconf</span>(<span class="ruby-identifier">confname</span>,<span class="ruby-identifier">value</span>)
976
+ <span class="ruby-identifier">sr</span>(<span class="ruby-value">:setconf</span>,<span class="ruby-node">&quot;#{confname}=#{value}&quot;</span>)
977
+ <span class="ruby-keyword">end</span></pre>
978
+ </div><!-- setconf-source -->
979
+
980
+ </div>
981
+
982
+
983
+
984
+
985
+ </div><!-- setconf-method -->
986
+
987
+
988
+ <div id="method-i-signal" class="method-detail ">
989
+
990
+ <div class="method-heading">
991
+ <span class="method-name">signal</span><span
992
+ class="method-args">(args)</span>
993
+ <span class="method-click-advice">click to toggle source</span>
994
+ </div>
995
+
996
+
997
+ <div class="method-description">
998
+
999
+ <p>This method sends “signals” protocol message with the arguments.</p>
1000
+
1001
+ <p><strong>Reload <a href="../Tor.html">Tor</a> config from file</strong></p>
1002
+
1003
+ <pre>Tor::TController.signal(&quot;RELOAD&quot;)
1004
+ Tor::TController.signal(&quot;HUP&quot;)</pre>
1005
+
1006
+
1007
+
1008
+ <div class="method-source-code" id="signal-source">
1009
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 419</span>
1010
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">signal</span>(<span class="ruby-identifier">args</span>)
1011
+ <span class="ruby-identifier">reply</span>=[]
1012
+ <span class="ruby-keyword">case</span> (<span class="ruby-identifier">args</span>)
1013
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/NEWNYM/</span>,<span class="ruby-regexp">/CLEARDNSCACHE/</span>,<span class="ruby-regexp">/RELOAD/</span>,<span class="ruby-regexp">/HUP/</span>,<span class="ruby-regexp">/DUMP/</span>,<span class="ruby-regexp">/USR1/</span>,<span class="ruby-regexp">/DEBUG/</span>,<span class="ruby-regexp">/USR2/</span>,<span class="ruby-regexp">/shutdown/</span>,<span class="ruby-regexp">/INT/</span>
1014
+ <span class="ruby-identifier">errorcode</span>,<span class="ruby-identifier">reply</span>=<span class="ruby-identifier">sr</span>(<span class="ruby-value">:signal</span>, <span class="ruby-identifier">args</span>)
1015
+ <span class="ruby-identifier">close</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">args</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp">/shutdown/</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">args</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp">/INT/</span>
1016
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/HALT/</span>,<span class="ruby-regexp">/TERM/</span>
1017
+ <span class="ruby-identifier">send_command</span>(<span class="ruby-value">:signal</span>, <span class="ruby-string">&quot;HALT&quot;</span>)
1018
+ <span class="ruby-identifier">close</span>
1019
+ <span class="ruby-keyword">else</span>
1020
+ <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;#{args} not recognised by the at library development. Sending the signal nonetheless&quot;</span>
1021
+ <span class="ruby-identifier">reply</span>=<span class="ruby-identifier">sr</span>(<span class="ruby-value">:signal</span>,<span class="ruby-identifier">args</span>)
1022
+ <span class="ruby-keyword">end</span>
1023
+ <span class="ruby-identifier">reply</span>
1024
+ <span class="ruby-keyword">end</span></pre>
1025
+ </div><!-- signal-source -->
1026
+
1027
+ </div>
1028
+
1029
+
1030
+
1031
+
1032
+ </div><!-- signal-method -->
1033
+
1034
+
1035
+ <div id="method-i-sr" class="method-detail ">
1036
+
1037
+ <div class="method-heading">
1038
+ <span class="method-name">sr</span><span
1039
+ class="method-args">(command, *args)</span>
1040
+ <span class="method-click-advice">click to toggle source</span>
1041
+ </div>
1042
+
1043
+
1044
+ <div class="method-description">
1045
+
1046
+ <p>This sends commands and returns the protocol response code along with an
1047
+ array containing the results with the following format
1048
+ [errorcode,[array_of_results]].</p>
1049
+
1050
+ <p><strong>Send and receive commands</strong>.</p>
1051
+
1052
+ <pre>Tor::TController.sr(:signal,&quot;reload&quot;)
1053
+ Tor::TController.sr(:signal,&quot;newnym&quot;)</pre>
1054
+
1055
+
1056
+
1057
+ <div class="method-source-code" id="sr-source">
1058
+ <pre><span class="ruby-comment"># File lib/tcontroller.rb, line 442</span>
1059
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">sr</span>(<span class="ruby-identifier">command</span>, *<span class="ruby-identifier">args</span>)
1060
+ <span class="ruby-identifier">send_command</span>(<span class="ruby-identifier">command</span>, *<span class="ruby-identifier">args</span>)
1061
+ <span class="ruby-identifier">reply</span>=[]
1062
+ <span class="ruby-identifier">readterm</span>=<span class="ruby-keyword">true</span>
1063
+ <span class="ruby-keyword">while</span> <span class="ruby-identifier">readterm</span> <span class="ruby-keyword">do</span>
1064
+ <span class="ruby-comment"># Read as much as possible until '250 OK' or error 5YZ</span>
1065
+ <span class="ruby-keyword">case</span> <span class="ruby-identifier">msg</span>=<span class="ruby-identifier">read_reply</span>
1066
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/^250 OK/</span>
1067
+ <span class="ruby-identifier">readterm</span>=<span class="ruby-keyword">false</span>
1068
+ <span class="ruby-identifier">puts</span> <span class="ruby-identifier">errorstate</span>=<span class="ruby-string">&quot;OK&quot;</span>
1069
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/^250[\+,\-,\s]/</span>
1070
+ <span class="ruby-identifier">reply</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">msg</span>.<span class="ruby-identifier">split</span>(<span class="ruby-regexp">/^\d+[\+,\-,\s]\S*=/</span>).<span class="ruby-identifier">last</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">msg</span><span class="ruby-operator">=~</span><span class="ruby-regexp">/250\+/</span>
1071
+ <span class="ruby-identifier">errorstate</span> = <span class="ruby-string">&quot;OK&quot;</span>
1072
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/^\./</span>
1073
+ <span class="ruby-keyword">when</span> <span class="ruby-regexp">/^5\d\d /</span>
1074
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">errorstate</span> <span class="ruby-operator">==</span> <span class="ruby-string">&quot;OK&quot;</span> <span class="ruby-comment"># if a &quot;2yz &quot; code came before this then msg is part of response</span>
1075
+ <span class="ruby-identifier">reply</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">msg</span>
1076
+ <span class="ruby-keyword">else</span>
1077
+ <span class="ruby-identifier">puts</span> <span class="ruby-identifier">msg</span>
1078
+ <span class="ruby-identifier">errorstate</span> = <span class="ruby-identifier">msg</span>.<span class="ruby-identifier">match</span>(<span class="ruby-regexp">/^5\d\d/</span>)
1079
+ <span class="ruby-identifier">readterm</span>=<span class="ruby-keyword">false</span>
1080
+ <span class="ruby-keyword">end</span>
1081
+ <span class="ruby-keyword">else</span>
1082
+ <span class="ruby-identifier">reply</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">msg</span>
1083
+ <span class="ruby-keyword">end</span>
1084
+ <span class="ruby-keyword">end</span>
1085
+ <span class="ruby-identifier">reply</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-keyword">nil</span>)
1086
+ <span class="ruby-identifier">reply</span> = <span class="ruby-identifier">errorstate</span><span class="ruby-operator">==</span><span class="ruby-string">&quot;OK&quot;</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">reply</span> <span class="ruby-operator">:</span> []
1087
+ [<span class="ruby-identifier">errorstate</span>,<span class="ruby-identifier">reply</span>]
1088
+ <span class="ruby-keyword">end</span></pre>
1089
+ </div><!-- sr-source -->
1090
+
1091
+ </div>
1092
+
1093
+
1094
+
1095
+
1096
+ </div><!-- sr-method -->
1097
+
1098
+
1099
+ </section><!-- public-instance-method-details -->
1100
+
1101
+ </section><!-- 5Buntitled-5D -->
1102
+
1103
+ </div><!-- documentation -->
1104
+
1105
+
1106
+ <footer id="validator-badges">
1107
+ <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
1108
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.11.
1109
+ <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
1110
+ </footer>
1111
+