arachni-reactor 0.1.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE.md +29 -0
- data/README.md +79 -0
- data/Rakefile +53 -0
- data/lib/arachni/reactor.rb +679 -0
- data/lib/arachni/reactor/connection.rb +302 -0
- data/lib/arachni/reactor/connection/callbacks.rb +73 -0
- data/lib/arachni/reactor/connection/error.rb +114 -0
- data/lib/arachni/reactor/connection/peer_info.rb +92 -0
- data/lib/arachni/reactor/connection/tls.rb +107 -0
- data/lib/arachni/reactor/global.rb +26 -0
- data/lib/arachni/reactor/iterator.rb +251 -0
- data/lib/arachni/reactor/queue.rb +91 -0
- data/lib/arachni/reactor/tasks.rb +107 -0
- data/lib/arachni/reactor/tasks/base.rb +59 -0
- data/lib/arachni/reactor/tasks/delayed.rb +35 -0
- data/lib/arachni/reactor/tasks/one_off.rb +30 -0
- data/lib/arachni/reactor/tasks/periodic.rb +60 -0
- data/lib/arachni/reactor/tasks/persistent.rb +31 -0
- data/lib/arachni/reactor/version.rb +15 -0
- data/spec/arachni/reactor/connection/tls_spec.rb +332 -0
- data/spec/arachni/reactor/connection_spec.rb +58 -0
- data/spec/arachni/reactor/iterator_spec.rb +203 -0
- data/spec/arachni/reactor/queue_spec.rb +91 -0
- data/spec/arachni/reactor/tasks/base.rb +8 -0
- data/spec/arachni/reactor/tasks/delayed_spec.rb +54 -0
- data/spec/arachni/reactor/tasks/one_off_spec.rb +51 -0
- data/spec/arachni/reactor/tasks/periodic_spec.rb +40 -0
- data/spec/arachni/reactor/tasks/persistent_spec.rb +39 -0
- data/spec/arachni/reactor/tasks_spec.rb +136 -0
- data/spec/arachni/reactor_spec.rb +20 -0
- data/spec/arachni/reactor_tls_spec.rb +20 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/support/fixtures/handlers/echo_client.rb +34 -0
- data/spec/support/fixtures/handlers/echo_client_tls.rb +10 -0
- data/spec/support/fixtures/handlers/echo_server.rb +12 -0
- data/spec/support/fixtures/handlers/echo_server_tls.rb +8 -0
- data/spec/support/fixtures/pems/cacert.pem +37 -0
- data/spec/support/fixtures/pems/client/cert.pem +37 -0
- data/spec/support/fixtures/pems/client/foo-cert.pem +39 -0
- data/spec/support/fixtures/pems/client/foo-key.pem +51 -0
- data/spec/support/fixtures/pems/client/key.pem +51 -0
- data/spec/support/fixtures/pems/server/cert.pem +37 -0
- data/spec/support/fixtures/pems/server/key.pem +51 -0
- data/spec/support/helpers/paths.rb +23 -0
- data/spec/support/helpers/utilities.rb +117 -0
- data/spec/support/lib/server_option_parser.rb +29 -0
- data/spec/support/lib/servers.rb +133 -0
- data/spec/support/lib/servers/runner.rb +13 -0
- data/spec/support/servers/echo.rb +14 -0
- data/spec/support/servers/echo_tls.rb +22 -0
- data/spec/support/servers/echo_unix.rb +14 -0
- data/spec/support/servers/echo_unix_tls.rb +22 -0
- data/spec/support/shared/connection.rb +778 -0
- data/spec/support/shared/reactor.rb +785 -0
- data/spec/support/shared/task.rb +21 -0
- 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
|