raktr 0.0.1

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 (58) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +1 -0
  3. data/LICENSE.md +29 -0
  4. data/README.md +77 -0
  5. data/Rakefile +53 -0
  6. data/lib/raktr/connection/callbacks.rb +71 -0
  7. data/lib/raktr/connection/error.rb +120 -0
  8. data/lib/raktr/connection/peer_info.rb +90 -0
  9. data/lib/raktr/connection/tls.rb +164 -0
  10. data/lib/raktr/connection.rb +339 -0
  11. data/lib/raktr/global.rb +24 -0
  12. data/lib/raktr/iterator.rb +249 -0
  13. data/lib/raktr/queue.rb +89 -0
  14. data/lib/raktr/tasks/base.rb +57 -0
  15. data/lib/raktr/tasks/delayed.rb +33 -0
  16. data/lib/raktr/tasks/one_off.rb +30 -0
  17. data/lib/raktr/tasks/periodic.rb +58 -0
  18. data/lib/raktr/tasks/persistent.rb +29 -0
  19. data/lib/raktr/tasks.rb +105 -0
  20. data/lib/raktr/version.rb +13 -0
  21. data/lib/raktr.rb +707 -0
  22. data/spec/raktr/connection/tls_spec.rb +348 -0
  23. data/spec/raktr/connection_spec.rb +74 -0
  24. data/spec/raktr/iterator_spec.rb +203 -0
  25. data/spec/raktr/queue_spec.rb +91 -0
  26. data/spec/raktr/tasks/base.rb +8 -0
  27. data/spec/raktr/tasks/delayed_spec.rb +71 -0
  28. data/spec/raktr/tasks/one_off_spec.rb +66 -0
  29. data/spec/raktr/tasks/periodic_spec.rb +57 -0
  30. data/spec/raktr/tasks/persistent_spec.rb +54 -0
  31. data/spec/raktr/tasks_spec.rb +155 -0
  32. data/spec/raktr_spec.rb +20 -0
  33. data/spec/raktr_tls_spec.rb +20 -0
  34. data/spec/spec_helper.rb +17 -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 +135 -0
  48. data/spec/support/lib/server_option_parser.rb +29 -0
  49. data/spec/support/lib/servers/runner.rb +13 -0
  50. data/spec/support/lib/servers.rb +133 -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 +696 -0
  56. data/spec/support/shared/raktr.rb +834 -0
  57. data/spec/support/shared/task.rb +21 -0
  58. metadata +140 -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,135 @@
1
+ require 'socket'
2
+ require 'openssl'
3
+
4
+ def port_to_socket( port )
5
+ "/tmp/raktr-socket-#{port}"
6
+ end
7
+
8
+ def run_reactor_in_thread
9
+ t = Thread.new do
10
+ raktr.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_socket
21
+ socket = Socket.new(
22
+ Socket::Constants::AF_INET,
23
+ Socket::Constants::SOCK_STREAM,
24
+ Socket::Constants::IPPROTO_IP
25
+ )
26
+ socket.do_not_reverse_lookup = true
27
+ socket
28
+ end
29
+
30
+ def tcp_write( host, port, data )
31
+ s = tcp_connect( host, port )
32
+ s.write data
33
+ s
34
+ end
35
+
36
+ if Raktr.supports_unix_sockets?
37
+
38
+ def unix_connect( socket )
39
+ UNIXSocket.new( socket )
40
+ end
41
+
42
+ def unix_server( socket )
43
+ UNIXServer.new( socket )
44
+ end
45
+
46
+ end
47
+
48
+ def unix_write( socket, data )
49
+ s = unix_connect( socket )
50
+ s.write data
51
+ s
52
+ end
53
+
54
+ def tcp_server( host, port )
55
+ TCPServer.new( host, port )
56
+ end
57
+
58
+ def tcp_ssl_socket( host, port, options = {} )
59
+ convert_client_to_ssl( tcp_socket, options )
60
+ end
61
+
62
+ def tcp_ssl_connect( host, port, options = {} )
63
+ convert_client_to_ssl( tcp_connect( host, port ), options )
64
+ end
65
+
66
+ def unix_ssl_connect( socket, options = {} )
67
+ convert_client_to_ssl( unix_connect( socket ), options)
68
+ end
69
+
70
+ def tcp_ssl_write( host, port, data, options = {} )
71
+ s = tcp_ssl_connect( host, port, options )
72
+ s.write data
73
+ s
74
+ end
75
+
76
+ def unix_ssl_write( socket, data, options = {} )
77
+ s = unix_ssl_connect( socket, options )
78
+ s.write data
79
+ s
80
+ end
81
+
82
+ def unix_ssl_server( socket, options = {} )
83
+ convert_server_to_ssl( unix_server( socket ), options )
84
+ end
85
+
86
+ def tcp_ssl_server( host, port, options = {} )
87
+ convert_server_to_ssl( tcp_server( host, port ), options )
88
+ end
89
+
90
+ def ssl_context( options )
91
+ context = OpenSSL::SSL::SSLContext.new
92
+ context.cert = OpenSSL::X509::Certificate.new( File.open( options[:certificate] ) )
93
+ context.key = OpenSSL::PKey::RSA.new( File.open( options[:private_key] ) )
94
+
95
+ context.ca_file = options[:ca]
96
+ context.verify_mode =
97
+ OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
98
+
99
+ context
100
+ end
101
+
102
+ def convert_server_to_ssl( server, options = {} )
103
+ if options[:certificate] && options[:private_key]
104
+ context = ssl_context( options )
105
+ else
106
+ context = OpenSSL::SSL::SSLContext.new
107
+ context.key = OpenSSL::PKey::RSA.new( 2048 )
108
+ context.cert = OpenSSL::X509::Certificate.new
109
+ context.cert.subject = OpenSSL::X509::Name.new( [['CN', 'localhost']] )
110
+ context.cert.issuer = context.cert.subject
111
+ context.cert.public_key = context.key
112
+ context.cert.not_before = Time.now
113
+ context.cert.not_after = Time.now + 60 * 60 * 24
114
+ context.cert.version = 2
115
+ context.cert.serial = 1
116
+
117
+ context.cert.sign( context.key, OpenSSL::Digest::SHA256.new )
118
+ end
119
+
120
+ OpenSSL::SSL::SSLServer.new( server, context )
121
+ end
122
+
123
+ def convert_client_to_ssl( client, options = {} )
124
+ if options[:certificate] && options[:private_key]
125
+ context = ssl_context( options )
126
+ else
127
+ context = OpenSSL::SSL::SSLContext.new
128
+ context.verify_mode = OpenSSL::SSL::VERIFY_NONE
129
+ end
130
+
131
+ s = OpenSSL::SSL::SSLSocket.new( client, context )
132
+ s.sync_close = true
133
+ s.connect
134
+ s
135
+ 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,13 @@
1
+ require 'ap'
2
+ require_relative '../../../../lib/raktr'
3
+
4
+ Thread.abort_on_exception = true
5
+
6
+ Dir["#{File.expand_path(File.dirname(__FILE__) + '/../..' )}/**/*.rb"].each do |f|
7
+ next if f.include?( '/servers/' ) || f.include?( 'shared' )
8
+ require f
9
+ end
10
+
11
+ $options = ServerOptionParser.parse
12
+
13
+ load ARGV[0]
@@ -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
+ RbConfig.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
@@ -0,0 +1,14 @@
1
+ server = tcp_server( $options[:host], $options[:port] )
2
+
3
+ loop do
4
+ Thread.new server.accept do |socket|
5
+ begin
6
+ loop do
7
+ next if (data = socket.gets).to_s.empty?
8
+ socket.write( data )
9
+ end
10
+ rescue EOFError, Errno::EPIPE, Errno::ECONNRESET
11
+ socket.close
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,22 @@
1
+ server = tcp_ssl_server( $options[:host], $options[:port] )
2
+
3
+ loop do
4
+ socket = nil
5
+ begin
6
+ socket = server.accept
7
+ rescue => e
8
+ # ap e
9
+ next
10
+ end
11
+
12
+ Thread.new do
13
+ begin
14
+ loop do
15
+ next if (data = socket.gets).to_s.empty?
16
+ socket.write( data )
17
+ end
18
+ rescue EOFError, Errno::EPIPE, Errno::ECONNRESET
19
+ socket.close
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,14 @@
1
+ server = unix_server( port_to_socket( $options[:port] ) )
2
+
3
+ loop do
4
+ Thread.new server.accept do |socket|
5
+ begin
6
+ loop do
7
+ next if (data = socket.gets).to_s.empty?
8
+ socket.write( data )
9
+ end
10
+ rescue EOFError, Errno::EPIPE, Errno::ECONNRESET
11
+ socket.close
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,22 @@
1
+ server = unix_ssl_server( port_to_socket( $options[:port] ) )
2
+
3
+ loop do
4
+ socket = nil
5
+ begin
6
+ socket = server.accept
7
+ rescue => e
8
+ # ap e
9
+ next
10
+ end
11
+
12
+ Thread.new do
13
+ begin
14
+ loop do
15
+ next if (data = socket.gets).to_s.empty?
16
+ socket.write( data )
17
+ end
18
+ rescue EOFError, Errno::EPIPE, Errno::ECONNRESET
19
+ socket.close
20
+ end
21
+ end
22
+ end