arachni-reactor 0.1.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +15 -0
  2. data/CHANGELOG.md +5 -0
  3. data/LICENSE.md +29 -0
  4. data/README.md +79 -0
  5. data/Rakefile +53 -0
  6. data/lib/arachni/reactor.rb +679 -0
  7. data/lib/arachni/reactor/connection.rb +302 -0
  8. data/lib/arachni/reactor/connection/callbacks.rb +73 -0
  9. data/lib/arachni/reactor/connection/error.rb +114 -0
  10. data/lib/arachni/reactor/connection/peer_info.rb +92 -0
  11. data/lib/arachni/reactor/connection/tls.rb +107 -0
  12. data/lib/arachni/reactor/global.rb +26 -0
  13. data/lib/arachni/reactor/iterator.rb +251 -0
  14. data/lib/arachni/reactor/queue.rb +91 -0
  15. data/lib/arachni/reactor/tasks.rb +107 -0
  16. data/lib/arachni/reactor/tasks/base.rb +59 -0
  17. data/lib/arachni/reactor/tasks/delayed.rb +35 -0
  18. data/lib/arachni/reactor/tasks/one_off.rb +30 -0
  19. data/lib/arachni/reactor/tasks/periodic.rb +60 -0
  20. data/lib/arachni/reactor/tasks/persistent.rb +31 -0
  21. data/lib/arachni/reactor/version.rb +15 -0
  22. data/spec/arachni/reactor/connection/tls_spec.rb +332 -0
  23. data/spec/arachni/reactor/connection_spec.rb +58 -0
  24. data/spec/arachni/reactor/iterator_spec.rb +203 -0
  25. data/spec/arachni/reactor/queue_spec.rb +91 -0
  26. data/spec/arachni/reactor/tasks/base.rb +8 -0
  27. data/spec/arachni/reactor/tasks/delayed_spec.rb +54 -0
  28. data/spec/arachni/reactor/tasks/one_off_spec.rb +51 -0
  29. data/spec/arachni/reactor/tasks/periodic_spec.rb +40 -0
  30. data/spec/arachni/reactor/tasks/persistent_spec.rb +39 -0
  31. data/spec/arachni/reactor/tasks_spec.rb +136 -0
  32. data/spec/arachni/reactor_spec.rb +20 -0
  33. data/spec/arachni/reactor_tls_spec.rb +20 -0
  34. data/spec/spec_helper.rb +16 -0
  35. data/spec/support/fixtures/handlers/echo_client.rb +34 -0
  36. data/spec/support/fixtures/handlers/echo_client_tls.rb +10 -0
  37. data/spec/support/fixtures/handlers/echo_server.rb +12 -0
  38. data/spec/support/fixtures/handlers/echo_server_tls.rb +8 -0
  39. data/spec/support/fixtures/pems/cacert.pem +37 -0
  40. data/spec/support/fixtures/pems/client/cert.pem +37 -0
  41. data/spec/support/fixtures/pems/client/foo-cert.pem +39 -0
  42. data/spec/support/fixtures/pems/client/foo-key.pem +51 -0
  43. data/spec/support/fixtures/pems/client/key.pem +51 -0
  44. data/spec/support/fixtures/pems/server/cert.pem +37 -0
  45. data/spec/support/fixtures/pems/server/key.pem +51 -0
  46. data/spec/support/helpers/paths.rb +23 -0
  47. data/spec/support/helpers/utilities.rb +117 -0
  48. data/spec/support/lib/server_option_parser.rb +29 -0
  49. data/spec/support/lib/servers.rb +133 -0
  50. data/spec/support/lib/servers/runner.rb +13 -0
  51. data/spec/support/servers/echo.rb +14 -0
  52. data/spec/support/servers/echo_tls.rb +22 -0
  53. data/spec/support/servers/echo_unix.rb +14 -0
  54. data/spec/support/servers/echo_unix_tls.rb +22 -0
  55. data/spec/support/shared/connection.rb +778 -0
  56. data/spec/support/shared/reactor.rb +785 -0
  57. data/spec/support/shared/task.rb +21 -0
  58. metadata +141 -0
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ 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
51
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ 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
51
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,37 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIGYTCCBEmgAwIBAgIBBTANBgkqhkiG9w0BAQUFADBTMQswCQYDVQQGEwJHUjEY
3
+ MBYGA1UEAxMPQXJhY2huaS10ZXN0LUNBMSowKAYJKoZIhvcNAQkBFhthcmFjaG5p
4
+ QGFyYWNobmktc2Nhbm5lci5jb20wHhcNMTIxMTAyMTAzMzQxWhcNMjIxMDMwMTAz
5
+ MzQxWjBNMQswCQYDVQQGEwJHUjESMBAGA1UEAxMJbG9jYWxob3N0MSowKAYJKoZI
6
+ hvcNAQkBFhthcmFjaG5pQGFyYWNobmktc2Nhbm5lci5jb20wggIiMA0GCSqGSIb3
7
+ DQEBAQUAA4ICDwAwggIKAoICAQCz+OAzIMwVNujjweU3Zhvk0ZGYqTdJ73Jz5v7F
8
+ O5JE35hTzy1kf6EgMEqmZqKeBe95fviv+7UXcqtYoyxFPB/ssSLeUMyO0fUZZMMi
9
+ 8EfqtZZveB1j7f0EfzSEG7eL5tCjb/Q8tXQvM33+0QfjnwcrSOr2fPPwbEiWU1d1
10
+ cP1ZdRtgvAuo3a4Sga9xtJSFRe3iSpynJsQo482rSPpIcVfm5tArq8RVlztJPvXY
11
+ A76iIgNddhdOM/3fBg+a6iXqkC7X0WPRoNt7XiVniwBIP1t5/2S7JyhRsN50Crfu
12
+ 9N6lZd/fij0xwr5hLzl5lXKdUI5iYZZfTpNiIXnUICswFOUHwV/2W8XADu1HHLeX
13
+ a4knqnmX0h7c+bJm3UrXMiwU61tVENogjNc/vJP9fjy/Klfvgn5BXmpyTze7Xzlj
14
+ JcTt0VNNKUdieLjJsVKVF42j6RH9farshcHcCzd4701WkMEsbHZYncMUYNCBqUg7
15
+ 5SuIFHIZfZ4wq06i8BLRXJRHK+P+kDp/cyJyr/UqtlJwFJIgtWYOO0SMhynBK8gC
16
+ w/SE8Tlx0r/yIAyutyU6F4nE4wYfR3d8SyObzf5HD0rAtHBYUdPR5qFNePpEQlHR
17
+ Kepgl/pMpPZ2X6e4HYqIBrrahMI0mAns285Z/iBKpv6MyJR1npEMNa8I0eugeAGO
18
+ y0IcFQIDAQABo4IBRDCCAUAwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBkAw
19
+ KwYJYIZIAYb4QgENBB4WHFRpbnlDQSBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYD
20
+ VR0OBBYEFFQOlI4fxXxPl9UYd9MdoBsXt9ZWMIGDBgNVHSMEfDB6gBTxU601Rtmu
21
+ dtfSBFYh2znJpP64LKFXpFUwUzELMAkGA1UEBhMCR1IxGDAWBgNVBAMTD0FyYWNo
22
+ bmktdGVzdC1DQTEqMCgGCSqGSIb3DQEJARYbYXJhY2huaUBhcmFjaG5pLXNjYW5u
23
+ ZXIuY29tggkA8FjCoCiD1/UwJgYDVR0SBB8wHYEbYXJhY2huaUBhcmFjaG5pLXNj
24
+ YW5uZXIuY29tMCYGA1UdEQQfMB2BG2FyYWNobmlAYXJhY2huaS1zY2FubmVyLmNv
25
+ bTANBgkqhkiG9w0BAQUFAAOCAgEAeKLkpVjOdO9r5FcZPhemKsL9AFmnbqWmSeFA
26
+ Cmu7wyHwbDbgCS0tWnrq45qDbnAJxAqXQKzKS7QINxR80XMpgoaglx7qd1V5MEXK
27
+ LXn4G6BJ5tAgEbLY7HnsUHQnLMK/KWCzMODweM2gtPTauChF9kIKWrBJuizfldAo
28
+ ww8YOeZfPc77pEhC/vjttQOzfqcLjGvzpJJQVmd+i6JtH635hou9i0QXR//Nrf+l
29
+ ymrCuh7sil/Z1bJdmrQ1yPb2fNgqwHnWHqwPSFb8heEGExKC6vNCS2A+e08HGQTR
30
+ wNAQQYQRihtDC4lqNFcVdgZExXRypzbPE2l49RnDXCL/JOCisAErGd0kzBBj6SGD
31
+ Z7AKH87esH1mNThWFCZJTYXFTthVpNbOpPQ78UbXz9tFbfVdbWAcOn9enNbVeZa5
32
+ vbqIHQs7azy4I5NwQ2zK/+MO1egUbbCEhcUzoUgEx8NB3JeW2ziZDEzzyKqTcv0V
33
+ EH+suZefvhHxI3tGg2UmFD1+SBEVNw/1jv1HsduTclI7ckGHLcFjt7hG1CFLfLZ3
34
+ wEhN91GCsOrbckp8wBMsT1yiimasrVL2PKfa0ywUW0D6zRvBs5bgtGaWUPy1VX5W
35
+ 3LLbhwMZyaHnjT9GGw2cW1hea8TRWapj+/On4w2tRy6KtnkLBHgM3E+0E9DFwwVZ
36
+ jppXDh8=
37
+ -----END CERTIFICATE-----
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIJKgIBAAKCAgEAs/jgMyDMFTbo48HlN2Yb5NGRmKk3Se9yc+b+xTuSRN+YU88t
3
+ ZH+hIDBKpmaingXveX74r/u1F3KrWKMsRTwf7LEi3lDMjtH1GWTDIvBH6rWWb3gd
4
+ Y+39BH80hBu3i+bQo2/0PLV0LzN9/tEH458HK0jq9nzz8GxIllNXdXD9WXUbYLwL
5
+ qN2uEoGvcbSUhUXt4kqcpybEKOPNq0j6SHFX5ubQK6vEVZc7ST712AO+oiIDXXYX
6
+ TjP93wYPmuol6pAu19Fj0aDbe14lZ4sASD9bef9kuycoUbDedAq37vTepWXf34o9
7
+ McK+YS85eZVynVCOYmGWX06TYiF51CArMBTlB8Ff9lvFwA7tRxy3l2uJJ6p5l9Ie
8
+ 3PmyZt1K1zIsFOtbVRDaIIzXP7yT/X48vypX74J+QV5qck83u185YyXE7dFTTSlH
9
+ Yni4ybFSlReNo+kR/X2q7IXB3As3eO9NVpDBLGx2WJ3DFGDQgalIO+UriBRyGX2e
10
+ MKtOovAS0VyURyvj/pA6f3Micq/1KrZScBSSILVmDjtEjIcpwSvIAsP0hPE5cdK/
11
+ 8iAMrrclOheJxOMGH0d3fEsjm83+Rw9KwLRwWFHT0eahTXj6REJR0SnqYJf6TKT2
12
+ dl+nuB2KiAa62oTCNJgJ7NvOWf4gSqb+jMiUdZ6RDDWvCNHroHgBjstCHBUCAwEA
13
+ AQKCAgEAomQ78QZz/+R3CiQH7w/8tWCALq7pi5Y6wOg7FL7nAax754u2mssrGT9Z
14
+ 7IIJ0+rpJcjzHuBRjCHVCHrb1HEnIUzIeK+RlIFQ1qP8C8eiLN/DKTvJ0USKHIen
15
+ XFkiKmOP+Rlo2Wqltn2Q/9+fbb0uG9mE4frnphYe/T2gWgElKZYoqQWkw6+bhWlt
16
+ ZH0b0pHBz4GhjpXFRFwhVZ/Y7osPVPMJ/Y3U76IxRatA67SdS/DC9o87Aj6Zoab3
17
+ Z8JFijyld+mhVyL9SHkv6RkcnRRGN3PCcbkogWXFpBGT3FMpnzaoZi13gDIH1Otm
18
+ whWewOJSR+VkaQUeqdoo8sZAEfeYm/14AgwJ0H7fX9iKNHfmbtji3iOcTMeeCas6
19
+ Z0ODTzmIQcqA5MgHBjRhs0EacWSEdeEC9iEzpN8dyjm6J2MSqJk12vIlRPKNl5Lx
20
+ 4bLFYZBGjSb2Q5SegnS2ktPKz9dsxb3zbaJ5PnrtMQ2TQNCK06F9NDFjeJuRpt2e
21
+ PlnLB5vA/CEQ866zdVpwfWmaP/lbvYQKfiP0qDrUL6ws+cRWvWVj4MTiU4+Mzqdb
22
+ 0hGTKMiAe2FIr7u73URabtMKlbPaiWuSQblikigRUDyEYwg7H/K+m8wsFm4Mc9AJ
23
+ sT2GJW9cJ2QXAzkdGrVXsbIDWcijdN8ziLpIyP8043sHWWCRMHUCggEBAObMIc+Y
24
+ MMurC7UFRNcn+hmJTRvhFsgYzds5jLhHHwNdFjvELbJYhOrRxOjzoKh65RDZ0U0T
25
+ G5TgTFlGQE6q3Pca8dqFG2zncFownkkDm+AwdmdPZ/047kc4OgTYXTdaopJCWJqD
26
+ sCYhnhVqE1+jpFyn+5KneBwJoCbSMDvdZAnXOVUY+aTkzmyd6IwWUPvlTtdwcNql
27
+ XUQQudP6PEgDCquvAhlzhdIUaVGr9y2jdB0c055z6hsaCZJNqsUQpVm/QZAavety
28
+ 2aDaU3/kuazFBtN6IviiSE1CSGDbVv7DuaBDeW32llwkGdD8WoNLLtwZXeYsWuz5
29
+ Vo4ZAKaXoIr8gaMCggEBAMef8NebwQSm9B5XEwGzxOwdVNpTm75ApH8NUavjbvyk
30
+ COOGSpLtdTkuRaUTOFJdjVTfOdzWzuMF+e2Y2BJe+1m32gYp5d4oGmf/LVrL75F3
31
+ mhpNxl26g4Hnp38Bpz9LJc7+kWsM/za7bRMPIab5eIUa+yg3oq4pJsFZ9pry1sHS
32
+ EZL0YDWHE1fiDKB7EW5iJeiKJz1CKjiQNdlEMo7nBigUiIaw8leNg+CSwf8RYBPt
33
+ xbcZuQ1ihm1EjTfnkMCruVbPI0Ot4p5E2U9ByjmiHSgfj7gYg5Z+hQ498iwGXxCI
34
+ PkCJkWZKeHp28ZCjKf3/46SZWgp5A7MBxygeBvY4ducCggEBAMaOi/ALIL+3kcTU
35
+ mZr426OoidwYU/8lx8R4yGWpWjcMmJomdqHeoctbWKqJHoiT4goTOouyiqIULdsI
36
+ Iz8KpDs6xSOYLDYPDoupFCQApNPFHbhXikFB/0zqRI/yjI+YvBBUX+HetWa4uUX3
37
+ El/PaxIDut06koycg1mirrhyCSSmMr7RU8TWy/iKCYyrjlSHvMKAC7cvWQO72ANU
38
+ XxQc+csmLwoyZsiLougOqAJtgvGg4TaKxrc2OVHS273aSkbh0cfmGco77psB+aAn
39
+ 6M2IXA0IIJoDE2zUP2yEh116iXIlWoyN/mGa9VLkKAKYZeIZOL1TH46MHDj3raWl
40
+ AQtRnT0CggEBAKx/SceWAIF7nyEEjxj+daCua99JNiB9jWd4Y+WLXyGSwVeSeKhj
41
+ 5tKlaGsPo7CQxIrdZgut1xKX3HLyi2u8hafuVcjTtZ11u/O3rkJyTS6/Uft+z3W4
42
+ sOC1A6idDh+EWUR398KwdWyfIs7AWY0Gr50dRoBnKv0h9CpKCe20/9x2INeCsgwv
43
+ D4j2fYDDN7nRt/4sO2IU5ZUBEHcRFjsj6M8Dh0IUbyU21Qle56H4KrSt1xa0dJLb
44
+ W1vaS8lOIWhMO5iG32shO90Vk06IhC2vJ1C/jRpAnJyT8XfwEW73hngrstdjyK/C
45
+ lD8GvxED3UpuLxDRrtuz3H13gNfqsotbGWsCggEAAnt56fTLGmTu9pdM3FtTEaLN
46
+ rmO9JbRDsxnXTN84hLci27HW0rU/AFGw+a6MHNiBNVfBqhMnZwPgAsNVf6TB//iE
47
+ FZTotJWcTHkbiBwpXvRHHQ0BwxKluDicLqzzvEW8fmiNVjDig2JeS/45r2x0S4M/
48
+ 3TVHK7A/vXQWvBgQi9a2ooViRjRXdhzlIkjNNsYieAwX7793Nw2KqZbHKXvelEOQ
49
+ I6nTIqNDZOZ7MmGKHnGpj4SIupCKdkalQgakkGFbpltsyKBC7gooHQuKjQsYnRgl
50
+ XzOy39QzIn0WF9AoyLg/W8yPsnhc1S5Ed6Lq8KL3HWV6a8n9QRSHVCX6dafBcg==
51
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,23 @@
1
+ def spec_path
2
+ File.expand_path( "#{File.dirname( __FILE__ )}/../.." ) + '/'
3
+ end
4
+
5
+ def support_path
6
+ "#{spec_path}support/"
7
+ end
8
+
9
+ def fixtures_path
10
+ "#{support_path}fixtures/"
11
+ end
12
+
13
+ def pems_path
14
+ "#{fixtures_path}pems/"
15
+ end
16
+
17
+ def support_lib_path
18
+ "#{support_path}lib/"
19
+ end
20
+
21
+ def servers_path
22
+ "#{spec_path}support/servers/"
23
+ end
@@ -0,0 +1,117 @@
1
+ require 'socket'
2
+ require 'openssl'
3
+
4
+ def port_to_socket( port )
5
+ "/tmp/arachni-reactor-socket-#{port}"
6
+ end
7
+
8
+ def run_reactor_in_thread
9
+ t = Thread.new do
10
+ reactor.run
11
+ end
12
+ sleep 0.1
13
+ t
14
+ end
15
+
16
+ def tcp_connect( host, port )
17
+ TCPSocket.new( host, port )
18
+ end
19
+
20
+ def tcp_write( host, port, data )
21
+ s = tcp_connect( host, port )
22
+ s.write data
23
+ s
24
+ end
25
+
26
+ if Arachni::Reactor.supports_unix_sockets?
27
+
28
+ def unix_connect( socket )
29
+ UNIXSocket.new( socket )
30
+ end
31
+
32
+ def unix_server( socket )
33
+ UNIXServer.new( socket )
34
+ end
35
+
36
+ end
37
+
38
+ def unix_write( socket, data )
39
+ s = unix_connect( socket )
40
+ s.write data
41
+ s
42
+ end
43
+
44
+ def tcp_server( host, port )
45
+ TCPServer.new( host, port )
46
+ end
47
+
48
+ def tcp_ssl_connect( host, port, options = {} )
49
+ convert_client_to_ssl( tcp_connect( host, port ), options )
50
+ end
51
+
52
+ def unix_ssl_connect( socket, options = {} )
53
+ convert_client_to_ssl( unix_connect( socket ), options)
54
+ end
55
+
56
+ def tcp_ssl_write( host, port, data, options = {} )
57
+ s = tcp_ssl_connect( host, port, options )
58
+ s.write data
59
+ s
60
+ end
61
+
62
+ def unix_ssl_write( socket, data, options = {} )
63
+ s = unix_ssl_connect( socket, options )
64
+ s.write data
65
+ s
66
+ end
67
+
68
+ def unix_ssl_server( socket, options = {} )
69
+ convert_server_to_ssl( unix_server( socket ), options )
70
+ end
71
+
72
+ def tcp_ssl_server( host, port, options = {} )
73
+ convert_server_to_ssl( tcp_server( host, port ), options )
74
+ end
75
+
76
+ def ssl_context( options )
77
+ context = OpenSSL::SSL::SSLContext.new
78
+ context.cert = OpenSSL::X509::Certificate.new( File.open( options[:certificate] ) )
79
+ context.key = OpenSSL::PKey::RSA.new( File.open( options[:private_key] ) )
80
+
81
+ context.ca_file = options[:ca]
82
+ context.verify_mode =
83
+ OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
84
+
85
+ context
86
+ end
87
+
88
+ def convert_server_to_ssl( server, options = {} )
89
+ if options[:certificate] && options[:private_key]
90
+ context = ssl_context( options )
91
+ else
92
+ context = OpenSSL::SSL::SSLContext.new
93
+ context.key = OpenSSL::PKey::RSA.new( 2048 )
94
+ context.cert = OpenSSL::X509::Certificate.new
95
+ context.cert.subject = OpenSSL::X509::Name.new( [['CN', 'localhost']] )
96
+ context.cert.issuer = context.cert.subject
97
+ context.cert.public_key = context.key
98
+ context.cert.not_before = Time.now
99
+ context.cert.not_after = Time.now + 60 * 60 * 24
100
+ end
101
+
102
+ OpenSSL::SSL::SSLServer.new( server, context )
103
+ end
104
+
105
+ def convert_client_to_ssl( client, options = {} )
106
+ if options[:certificate] && options[:private_key]
107
+ context = ssl_context( options )
108
+ else
109
+ context = OpenSSL::SSL::SSLContext.new
110
+ context.verify_mode = OpenSSL::SSL::VERIFY_NONE
111
+ end
112
+
113
+ s = OpenSSL::SSL::SSLSocket.new( client, context )
114
+ s.sync_close = true
115
+ s.connect
116
+ s
117
+ end
@@ -0,0 +1,29 @@
1
+ require 'optparse'
2
+
3
+ class ServerOptionParser
4
+
5
+ DEFAULT = {
6
+ host: '0.0.0.0',
7
+ port: 4567
8
+ }
9
+
10
+ def self.parse
11
+ options = {}
12
+
13
+ OptionParser.new do |opts|
14
+
15
+ opts.on('-o', '--host [host]',
16
+ "Sets the host (default is #{options[:host]}).") do |host|
17
+ options[:host] = host
18
+ end
19
+
20
+ opts.on('-p', '--port [port]', Integer,
21
+ "Sets the port (default is #{options[:port]}).") do |port|
22
+ options[:port] = port
23
+ end
24
+
25
+ end.parse!
26
+
27
+ DEFAULT.merge(options)
28
+ end
29
+ end
@@ -0,0 +1,133 @@
1
+ require 'singleton'
2
+ require 'net/http'
3
+
4
+ class Servers
5
+ include Singleton
6
+
7
+ RUNNER = "#{support_lib_path}/servers/runner.rb"
8
+
9
+ attr_reader :lib
10
+
11
+ def initialize
12
+ @lib = File.expand_path( File.dirname(__FILE__) + '/../servers' )
13
+ @servers = {}
14
+
15
+ Dir.glob(File.join(@lib + '/**', '*.rb')) do |path|
16
+ @servers[normalize_name( File.basename(path, '.rb') )] = {
17
+ port: available_port,
18
+ path: path
19
+ }
20
+ end
21
+ end
22
+
23
+ def start( name )
24
+ server_info = data_for( name )
25
+
26
+ return [host_for(name), port_for(name)] if server_info[:pid] && up?( name )
27
+
28
+ server_info[:pid] = Process.spawn(
29
+ 'ruby', RUNNER, server_info[:path], '-p', server_info[:port].to_s,
30
+ '-o', host_for( name )
31
+ )
32
+
33
+ Process.detach server_info[:pid]
34
+
35
+ sleep 0.1 while !up?( name )
36
+
37
+ [host_for(name), port_for(name)]
38
+ end
39
+
40
+ def address_for( name )
41
+ "#{host_for( name )}:#{port_for( name )}"
42
+ end
43
+
44
+ def host_for( name )
45
+ '127.0.0.1'
46
+ end
47
+
48
+ def port_for( name )
49
+ data_for( name )[:port]
50
+ end
51
+
52
+ def up?( name )
53
+ if name.to_s.include? 'unix'
54
+ return File.exist?( port_to_socket( port_for( name ) ) )
55
+ end
56
+
57
+ socket = Socket.new( Socket::Constants::AF_INET, Socket::Constants::SOCK_STREAM, 0 )
58
+ sockaddr = Socket.sockaddr_in( port_for( name ), host_for( name ) )
59
+
60
+ begin
61
+ socket.connect( sockaddr )
62
+ rescue Errno::ECONNREFUSED, Errno::EADDRINUSE
63
+ return false
64
+ end
65
+
66
+ socket.close
67
+
68
+ true
69
+ end
70
+
71
+ def data_for( name )
72
+ @servers[normalize_name( name )]
73
+ end
74
+
75
+ def kill( name )
76
+ server_info = data_for( name )
77
+ return if !server_info[:pid]
78
+
79
+ begin
80
+ Process.kill( 'KILL', server_info[:pid] ) while sleep 0.1
81
+ rescue Errno::ESRCH
82
+ server_info.delete(:pid)
83
+
84
+ socket = port_to_socket( server_info[:port] )
85
+ if File.exist?( socket )
86
+ File.delete socket
87
+ end
88
+
89
+ return true
90
+ end
91
+ end
92
+
93
+ def killall
94
+ @servers.keys.each { |n| kill n }
95
+ end
96
+
97
+ def available_port
98
+ loop do
99
+ port = 5555 + rand( 9999 )
100
+
101
+ begin
102
+ socket = ::Socket.new( :INET, :STREAM, 0 )
103
+ socket.bind( ::Socket.sockaddr_in( port, '127.0.0.1' ) )
104
+ socket.close
105
+
106
+ return port if !File.exist?( port_to_socket( port ) )
107
+ rescue Errno::EADDRINUSE
108
+ end
109
+ end
110
+ end
111
+
112
+ def normalize_name( name )
113
+ name.to_s.to_sym
114
+ end
115
+
116
+ def self.method_missing( sym, *args, &block )
117
+ if instance.respond_to?( sym )
118
+ instance.send( sym, *args, &block )
119
+ elsif super( sym, *args, &block )
120
+ end
121
+ end
122
+
123
+ def self.respond_to?( m )
124
+ super( m ) || instance.respond_to?( m )
125
+ end
126
+
127
+ private
128
+
129
+ def set_data_for( name, data )
130
+ @servers[normalize_name( name )] = data
131
+ end
132
+
133
+ end