tor_extend 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+