appswarm 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 (305) hide show
  1. data/.autotest +124 -0
  2. data/History.txt +7 -0
  3. data/Manifest.txt +304 -0
  4. data/README.txt +373 -0
  5. data/Rakefile +153 -0
  6. data/TODO +7 -0
  7. data/apps/README.txt +17 -0
  8. data/apps/admin/admin.rb +79 -0
  9. data/apps/admin/controllers/admin.rb +81 -0
  10. data/apps/admin/controllers/settings.rb +63 -0
  11. data/apps/admin/controllers/users.rb +3 -0
  12. data/apps/admin/features/access.feature +21 -0
  13. data/apps/admin/features/mountLocal.feature +12 -0
  14. data/apps/admin/features/settings.feature +68 -0
  15. data/apps/admin/features/startApps.feature +27 -0
  16. data/apps/admin/layouts/main.rhtml +10 -0
  17. data/apps/admin/lib/settings.rb +52 -0
  18. data/apps/admin/static/admin.css +23 -0
  19. data/apps/admin/views/_log.rhtml +21 -0
  20. data/apps/admin/views/index.rhtml +43 -0
  21. data/apps/admin/views/info.rhtml +7 -0
  22. data/apps/admin/views/settings.rhtml +9 -0
  23. data/apps/admin/views/settings/_http_app.rhtml +15 -0
  24. data/apps/admin/views/settings/_web_server.rhtml +32 -0
  25. data/apps/admin/views/settings/index.rhtml +3 -0
  26. data/apps/admin/views/users/index.rhtml +6 -0
  27. data/apps/application_provider/application_provider.rb +11 -0
  28. data/apps/blog/blog.rb +27 -0
  29. data/apps/blog/controllers/blog.rb +29 -0
  30. data/apps/blog/views/index.rhtml +27 -0
  31. data/apps/browser_starter/browser_starter.rb +32 -0
  32. data/apps/crypto/crypto.rb +47 -0
  33. data/apps/crypto/crypto_rsa.rb +102 -0
  34. data/apps/crypto/spec/crypto_spec.rb +10 -0
  35. data/apps/directory_service/directory_service.rb +107 -0
  36. data/apps/directory_service/net_application.rb +92 -0
  37. data/apps/directory_service/spec/directory_service_spec.rb +36 -0
  38. data/apps/directory_service/spec/net_application_spec.rb +3 -0
  39. data/apps/global_application_interface/global_application.rb +52 -0
  40. data/apps/global_application_interface/global_application_interface.rb +84 -0
  41. data/apps/global_application_interface/spec/app_api_spec.rb +5 -0
  42. data/apps/global_tuple_space/global_tuple_space.rb +27 -0
  43. data/apps/global_web_proxy/features/session_handling.feature +7 -0
  44. data/apps/global_web_proxy/global_web_proxy.rb +221 -0
  45. data/apps/global_web_proxy/proxy/HTTPProxyServer-Dateien/rdoc-style.css +208 -0
  46. data/apps/global_web_proxy/proxy/HTTPProxyServer.html +566 -0
  47. data/apps/global_web_proxy/proxy/dnstest.rb +30 -0
  48. data/apps/global_web_proxy/proxy/proxy.rb +86 -0
  49. data/apps/global_web_proxy/proxy/wiki.html +267 -0
  50. data/apps/global_web_proxy/proxy/wiki.rb +115 -0
  51. data/apps/global_web_proxy/spec/res1 +112 -0
  52. data/apps/global_web_proxy/spec/res2 +125 -0
  53. data/apps/global_web_proxy/spec/web_proxy_spec.rb +88 -0
  54. data/apps/global_web_server/global_web_server.rb +120 -0
  55. data/apps/global_web_server/global_web_servlet.rb +6 -0
  56. data/apps/hello_world/controllers/hello_world.rb +11 -0
  57. data/apps/hello_world/features/show_on_local_web_server.feature +44 -0
  58. data/apps/hello_world/features/starting_apps.feature +6 -0
  59. data/apps/hello_world/features/through_global.feature +12 -0
  60. data/apps/hello_world/hello_world.rb +3 -0
  61. data/apps/hello_world/views/get.rhtml +10 -0
  62. data/apps/hello_world/views/index.rhtml +9 -0
  63. data/apps/hello_world/views/post.rhtml +10 -0
  64. data/apps/home/controllers/home.rb +11 -0
  65. data/apps/home/home.rb +12 -0
  66. data/apps/home/layouts/main.rhtml +16 -0
  67. data/apps/home/static/Zeichnung.svg +240 -0
  68. data/apps/home/static/home.css +134 -0
  69. data/apps/home/static/menu.css +99 -0
  70. data/apps/home/views/_appInfo.rhtml +22 -0
  71. data/apps/home/views/_dummy_fill.rhtml +3 -0
  72. data/apps/home/views/_info.rhtml +6 -0
  73. data/apps/home/views/_menu.rhtml +17 -0
  74. data/apps/home/views/index.rhtml +4 -0
  75. data/apps/home/views/overview.rhtml +2 -0
  76. data/apps/local_chunk_store/chunk_store.rb +15 -0
  77. data/apps/local_chunk_store/local_chunk_store.rb +123 -0
  78. data/apps/local_chunk_store/spec/local_chunk_store_spec.rb +30 -0
  79. data/apps/local_file_store/app_configuration.rb +78 -0
  80. data/apps/local_file_store/app_file_store.rb +32 -0
  81. data/apps/local_file_store/cached_file_store.rb +94 -0
  82. data/apps/local_file_store/features/testbed_handling_of_directories.feature +20 -0
  83. data/apps/local_file_store/local_file_store.rb +47 -0
  84. data/apps/local_file_store/spec/app_configuration_spec.rb +30 -0
  85. data/apps/local_file_store/spec/local_file_store_spec.rb +54 -0
  86. data/apps/local_object_storage/lib/cell.rb +29 -0
  87. data/apps/local_object_storage/lib/cellmgr.rb +57 -0
  88. data/apps/local_object_storage/lib/index.rb +43 -0
  89. data/apps/local_object_storage/lib/marshal.rb +96 -0
  90. data/apps/local_object_storage/lib/pagefile.rb +6 -0
  91. data/apps/local_object_storage/lib/persistent_object.rb +126 -0
  92. data/apps/local_object_storage/local_object_storage.rb +148 -0
  93. data/apps/local_object_storage/spec/local_object_storage_spec.rb +123 -0
  94. data/apps/local_secure_file_store/local_secure_file_store.rb +64 -0
  95. data/apps/local_secure_file_store/spec/local_secure_file_store_spec.rb +23 -0
  96. data/apps/local_tuple_space/local_tuple_space.rb +92 -0
  97. data/apps/local_tuple_space/spec/tuple_space_spec.rb +25 -0
  98. data/apps/local_web_server/features/parsing_args.feature +18 -0
  99. data/apps/local_web_server/local_web_server.rb +166 -0
  100. data/apps/logger/logger.rb +27 -0
  101. data/apps/master/master.rb +46 -0
  102. data/apps/master/spec/master_spec.rb +31 -0
  103. data/apps/my_spec_spec.rb +15 -0
  104. data/apps/name_service/name_service.rb +75 -0
  105. data/apps/name_service/spec/name_service_spec.rb +51 -0
  106. data/apps/network_discovery/network_discovery.rb +45 -0
  107. data/apps/network_discovery_localstore/network_discovery_localstore.rb +20 -0
  108. data/apps/network_discovery_udp/network_discovery_udp.rb +51 -0
  109. data/apps/network_lookup/network_lookup.rb +61 -0
  110. data/apps/network_node/abstract_node.rb +104 -0
  111. data/apps/network_node/drb_node.rb +90 -0
  112. data/apps/network_node/network_app.rb +9 -0
  113. data/apps/network_node/network_node.rb +471 -0
  114. data/apps/network_node/remote_service.rb +45 -0
  115. data/apps/network_node/secure_node.rb +125 -0
  116. data/apps/network_node/spec/drb_spec.rb +41 -0
  117. data/apps/network_node/spec/network_node_spec_not.rb +264 -0
  118. data/apps/new_network_node/new_network_node.rb +427 -0
  119. data/apps/new_network_node/spec/new_network_node_spec.rb +186 -0
  120. data/apps/node_broadcast/node_broadcast.rb +167 -0
  121. data/apps/node_broadcast/spec/node_broadcast_spec.rb +59 -0
  122. data/apps/permaspace/permaspace.rb +47 -0
  123. data/apps/plaindb/lib/btree.rb +38 -0
  124. data/apps/plaindb/plaindb.rb +199 -0
  125. data/apps/plaindb/spec/table_write_spec.rb +36 -0
  126. data/apps/routed_network/routed_network.rb +23 -0
  127. data/apps/routed_network/spec/routed_network_spec.rb +17 -0
  128. data/apps/session_manager/session_manager.rb +18 -0
  129. data/apps/spec_output.html +222 -0
  130. data/apps/todo/controllers/todo.rb +87 -0
  131. data/apps/todo/model/comment.rb +10 -0
  132. data/apps/todo/model/project.rb +20 -0
  133. data/apps/todo/model/todo.rb +16 -0
  134. data/apps/todo/model/user.rb +5 -0
  135. data/apps/todo/todo.rb +21 -0
  136. data/apps/todo/views/_commentList.rhtml +7 -0
  137. data/apps/todo/views/_createProject.rhtml +5 -0
  138. data/apps/todo/views/_partList.rhtml +12 -0
  139. data/apps/todo/views/_projectList.rhtml +16 -0
  140. data/apps/todo/views/edit.rhtml +11 -0
  141. data/apps/todo/views/editPart.rhtml +10 -0
  142. data/apps/todo/views/index.rhtml +2 -0
  143. data/apps/todo/views/question.rhtml +4 -0
  144. data/apps/transparent_network/transparent_network.rb +7 -0
  145. data/apps/udp_network/big_transfer.rb +97 -0
  146. data/apps/udp_network/features/information.feature +7 -0
  147. data/apps/udp_network/message_queue.rb +84 -0
  148. data/apps/udp_network/network_interface_api.rb +39 -0
  149. data/apps/udp_network/qos_queue.rb +186 -0
  150. data/apps/udp_network/simple_api.rb +180 -0
  151. data/apps/udp_network/spec/big_transfer_spec.rb +0 -0
  152. data/apps/udp_network/spec/qos_queue_spec.rb +99 -0
  153. data/apps/udp_network/spec/simple_api_spec.rb +35 -0
  154. data/apps/udp_network/spec/udp_network_spec.rb +115 -0
  155. data/apps/udp_network/spec/udp_transceiver_spec.rb +90 -0
  156. data/apps/udp_network/udp_network.rb +196 -0
  157. data/apps/udp_network/udp_transceiver.rb +329 -0
  158. data/apps/wiki/controllers/wiki.rb +56 -0
  159. data/apps/wiki/features/editing.feature +21 -0
  160. data/apps/wiki/layouts/main.rhtml +18 -0
  161. data/apps/wiki/lib/media_wiki_html.rb +35 -0
  162. data/apps/wiki/lib/wikicreole.rb +2147 -0
  163. data/apps/wiki/lib/wikicreole.tt +135 -0
  164. data/apps/wiki/lib/wikitest.rb +158 -0
  165. data/apps/wiki/lib/wikitest.tt +17 -0
  166. data/apps/wiki/model/menu.rb +15 -0
  167. data/apps/wiki/model/page.rb +31 -0
  168. data/apps/wiki/spec/wiki_creole_spec.rb +20 -0
  169. data/apps/wiki/spec/wiki_spec.rb +19 -0
  170. data/apps/wiki/static/Zeichnung.svg +240 -0
  171. data/apps/wiki/static/home.css +134 -0
  172. data/apps/wiki/static/mainMenu.css +32 -0
  173. data/apps/wiki/static/menu.css +99 -0
  174. data/apps/wiki/views/_mainMenu.rhtml +3 -0
  175. data/apps/wiki/views/_menu.rhtml +13 -0
  176. data/apps/wiki/views/edit.rhtml +13 -0
  177. data/apps/wiki/views/index.rhtml +2 -0
  178. data/apps/wiki/views/save.rhtml +1 -0
  179. data/apps/wiki/wiki.rb +17 -0
  180. data/bin/appswarm +47 -0
  181. data/cucumber.yml +2 -0
  182. data/data/PermaspaceApp/AFS_WikiApp_wiki_config +6 -0
  183. data/data/draft.txt +63 -0
  184. data/docs/appswarm_motivation.graffle +0 -0
  185. data/docs/appswarm_pics.graffle/QuickLook/Preview.pdf +0 -0
  186. data/docs/appswarm_pics.graffle/QuickLook/Thumbnail.tiff +0 -0
  187. data/docs/appswarm_pics.graffle/data.plist +63494 -0
  188. data/docs/appswarm_pics.graffle/image1.tiff +0 -0
  189. data/docs/appswarm_pics.graffle/image2.tif +0 -0
  190. data/docs/appswarm_pics.graffle/image3.tif +0 -0
  191. data/docs/appswarm_pics.graffle/image4.tif +0 -0
  192. data/docs/appswarm_pics.graffle/image5.tiff +0 -0
  193. data/docs/routing.graffle +0 -0
  194. data/features/step_definitions/appstart_steps.rb +28 -0
  195. data/features/step_definitions/cluster_steps.rb +18 -0
  196. data/features/step_definitions/testbed_steps.rb +64 -0
  197. data/features/step_definitions/webapp_steps.rb +257 -0
  198. data/features/support/env.rb +7 -0
  199. data/lib/appswarm.rb +127 -0
  200. data/lib/appswarm/README.txt +67 -0
  201. data/lib/appswarm/app_config.rb +19 -0
  202. data/lib/appswarm/application.rb +267 -0
  203. data/lib/appswarm/breaking_mutex.rb +41 -0
  204. data/lib/appswarm/cluster_funcs.rb +157 -0
  205. data/lib/appswarm/cross_spectool.rb +153 -0
  206. data/lib/appswarm/crypt.rb +10 -0
  207. data/lib/appswarm/crypt/crypto.rb +90 -0
  208. data/lib/appswarm/crypt/rsa_key +15 -0
  209. data/lib/appswarm/crypt/rsa_key.pub +5 -0
  210. data/lib/appswarm/crypt/test.rb +27 -0
  211. data/lib/appswarm/dir_tool.rb +41 -0
  212. data/lib/appswarm/event_api.rb +7 -0
  213. data/lib/appswarm/features_helper.rb +44 -0
  214. data/lib/appswarm/global_service.rb +38 -0
  215. data/lib/appswarm/http.rb +1 -0
  216. data/lib/appswarm/http/http_app.rb +257 -0
  217. data/lib/appswarm/http/http_controller.rb +267 -0
  218. data/lib/appswarm/http/http_provider.rb +80 -0
  219. data/lib/appswarm/http/static/favicon.ico +0 -0
  220. data/lib/appswarm/http/static/javascript/._prototype.js +0 -0
  221. data/lib/appswarm/http/static/javascript/prototype.js +2515 -0
  222. data/lib/appswarm/http/webrick_logger.rb +12 -0
  223. data/lib/appswarm/net_service.rb +69 -0
  224. data/lib/appswarm/package.rb +88 -0
  225. data/lib/appswarm/parallel_each.rb +46 -0
  226. data/lib/appswarm/protocols/protocol_dice.rb +25 -0
  227. data/lib/appswarm/proxy_testing.rb +48 -0
  228. data/lib/appswarm/public_api.rb +35 -0
  229. data/lib/appswarm/routing/matrix_math.rb +57 -0
  230. data/lib/appswarm/routing/pca.rb +211 -0
  231. data/lib/appswarm/routing/routetest.rb +85 -0
  232. data/lib/appswarm/routing/routing.rb +326 -0
  233. data/lib/appswarm/routing/spec/nods_spec.rb +23 -0
  234. data/lib/appswarm/routing/spec/pca_spec.rb +27 -0
  235. data/lib/appswarm/routing/spec/routing_spec.rb +91 -0
  236. data/lib/appswarm/secure_con.rb +437 -0
  237. data/lib/appswarm/secure_connection.rb +79 -0
  238. data/lib/appswarm/secure_marshal.rb +137 -0
  239. data/lib/appswarm/service.rb +76 -0
  240. data/lib/appswarm/simple_marshal.rb +96 -0
  241. data/lib/appswarm/simple_marshal_parser.rb +1243 -0
  242. data/lib/appswarm/simple_marshal_parser.tt +158 -0
  243. data/lib/appswarm/spec/application_spec.rb +50 -0
  244. data/lib/appswarm/spec/cluster_spec.rb +2 -0
  245. data/lib/appswarm/spec/hexdist_spec.rb +13 -0
  246. data/lib/appswarm/spec/http_controller_spec.rb +18 -0
  247. data/lib/appswarm/spec/main_spec.rb +6 -0
  248. data/lib/appswarm/spec/parallel_each_spec.rb +30 -0
  249. data/lib/appswarm/spec/secure_connection_spec.rb +108 -0
  250. data/lib/appswarm/spec/secure_marshal_spec.rb +93 -0
  251. data/lib/appswarm/spec/simple_marshal_spec.rb +87 -0
  252. data/lib/appswarm/spec/tools_spec.rb +13 -0
  253. data/lib/appswarm/spec/whiteboard_spec.rb +20 -0
  254. data/lib/appswarm/spec_helper.rb +18 -0
  255. data/lib/appswarm/test_bed.rb +207 -0
  256. data/lib/appswarm/tools.rb +284 -0
  257. data/lib/appswarm/tools/http_tunnel_client.rb +139 -0
  258. data/lib/appswarm/tools/http_tunnel_common.rb +8 -0
  259. data/lib/appswarm/tools/http_tunnel_server.rb +78 -0
  260. data/lib/appswarm/tools/parser/example_data.simple +102 -0
  261. data/lib/appswarm/tools/parser/match_test.rb +14 -0
  262. data/lib/appswarm/tools/parser/parser_lib.rb +165 -0
  263. data/lib/appswarm/tools/parser/parser_test.rb +104 -0
  264. data/lib/appswarm/tools/parser/spec/parser_spec.rb +44 -0
  265. data/lib/appswarm/tools/pipes.rb +95 -0
  266. data/lib/appswarm/tools/spec/tracing_spec.rb +16 -0
  267. data/lib/appswarm/tools/spec/waiting_queue_spec.rb +15 -0
  268. data/lib/appswarm/tools/thread_tool.rb +61 -0
  269. data/lib/appswarm/tools/tracing.rb +84 -0
  270. data/lib/appswarm/tools/treetop_test.rb +20 -0
  271. data/lib/appswarm/tools/treetop_test_grammar.rb +114 -0
  272. data/lib/appswarm/tools/treetop_test_grammar.tt +7 -0
  273. data/lib/appswarm/tools/waiting_prio_queue.rb +47 -0
  274. data/lib/appswarm/tools/waiting_queue.rb +34 -0
  275. data/lib/appswarm/whiteboard.rb +73 -0
  276. data/nettest.rb +50 -0
  277. data/packages/README.txt +1 -0
  278. data/packages/msandbox/data/packages/store/my.txt +1 -0
  279. data/packages/msandbox/interfaces.rb +172 -0
  280. data/packages/msandbox/old/defa.rb +3 -0
  281. data/packages/msandbox/old/test.rb +14 -0
  282. data/packages/msandbox/old/test2.rb +56 -0
  283. data/packages/msandbox/package.rb +67 -0
  284. data/packages/msandbox/packages/store/config.yml +1 -0
  285. data/packages/msandbox/packages/store/main.rb +27 -0
  286. data/packages/msandbox/packages/store/myinclude.rb +7 -0
  287. data/packages/msandbox/packages/store_test/config.yml +1 -0
  288. data/packages/msandbox/packages/store_test/main.rb +9 -0
  289. data/packages/msandbox/server.rb +146 -0
  290. data/packages/msandbox/test.rb +13 -0
  291. data/packages/msandbox/test2.rb +29 -0
  292. data/templates/web/appswarm/controllers/appswarm.rb +41 -0
  293. data/templates/web/appswarm/layouts/main.rhtml +20 -0
  294. data/templates/web/appswarm/models/asmenu.rb +14 -0
  295. data/templates/web/appswarm/models/asuser.rb +30 -0
  296. data/templates/web/appswarm/static/custom.css +15 -0
  297. data/templates/web/appswarm/static/home.css +134 -0
  298. data/templates/web/appswarm/static/mainMenu.css +32 -0
  299. data/templates/web/appswarm/static/menu.css +99 -0
  300. data/templates/web/appswarm/views/_mainMenu.rhtml +5 -0
  301. data/templates/web/appswarm/views/_menu.rhtml +13 -0
  302. data/templates/web/appswarm/views/_userInfo.rhtml +7 -0
  303. data/templates/web/appswarm/views/login.rhtml +9 -0
  304. data/tools/checkPort.rb +11 -0
  305. metadata +379 -0
@@ -0,0 +1,196 @@
1
+ require 'udp_transceiver.rb'
2
+ require 'simple_api.rb'
3
+ require 'big_transfer.rb'
4
+ require 'message_queue.rb'
5
+ require 'qos_queue.rb'
6
+
7
+ class UdpNetworkApp<Service
8
+
9
+ MIDDLE_PRIORITY=10
10
+
11
+ SPREADING_INTERVAL=5
12
+
13
+ requires :networkDiscovery
14
+ provides :fullNetworkNode
15
+
16
+ Node=Struct.new(:node,:timestamp,:reachable)
17
+
18
+ class NodeStore
19
+ def initialize
20
+ @nodes={}
21
+ end
22
+ def add(node)
23
+ unless @nodes[node]
24
+ @nodes[node]=Node.new(node,Time.now.to_f,:unknown)
25
+ end
26
+ end
27
+
28
+ def setUnreachble(node)
29
+ assert {@nodes[node]}
30
+ @nodes[node].reachable=false
31
+ end
32
+
33
+ def setReachable(node)
34
+ assert {@nodes[node]}
35
+ @nodes[node].reachable=true
36
+ end
37
+
38
+ def nodesNewerThan(timestamp)
39
+ @nodes.values.select{|n|n.timestamp>timestamp && n.reachable!=false}.map{|n|n.node}
40
+ end
41
+ def nodesOlderThan(timestamp)
42
+ @nodes.values.select{|n|n.timestamp<=timestamp && n.reachable!=false}.map{|n|n.node}
43
+ end
44
+ def nodes
45
+ @nodes.values.select{|n|n.reachable!=false}.map{|n|n.node}
46
+ end
47
+ end
48
+
49
+
50
+
51
+ def initialize(cluster,options)
52
+ super(cluster,options,:fullNetworkNode)
53
+
54
+ @port=9876
55
+
56
+
57
+ @api=nil
58
+
59
+ loop do
60
+ begin
61
+ @transceiver=UdpTransceiver.new("127.0.0.1",@port)
62
+ break
63
+ rescue
64
+ @port+=1
65
+ end
66
+ end
67
+
68
+ discovery=getApp(:networkDiscovery)
69
+ if discovery
70
+ discovery.add(self.me)
71
+ end
72
+
73
+ @services=[]
74
+ @nodes=NodeStore.new
75
+
76
+ @receivers={}
77
+
78
+ log "UDPINIT"
79
+ @protocolAPIs=[]
80
+
81
+ addReceivers
82
+ end
83
+
84
+ def me
85
+ @transceiver.me
86
+ end
87
+
88
+
89
+ def knownNodes
90
+ @nodes.nodesNewerThan(0)
91
+ end
92
+
93
+
94
+ def run
95
+ loop do
96
+ gatherNodes
97
+ spreadNodes
98
+ sleep SPREADING_INTERVAL
99
+ break if @quit
100
+ end
101
+ @quit=:ok
102
+ end
103
+
104
+
105
+ def sendMessage(message,node)
106
+ @transceiver.send(node,message)
107
+ end
108
+ def addReceiver(receiver,&block)
109
+ @receivers[receiver]=block
110
+ end
111
+ def removeReceiver(receiver)
112
+ @receivers.delete(receiver)
113
+ end
114
+
115
+ def api(priority=nil)
116
+ return @api if @api
117
+ layers=[QoSQueue,BigTransfer,RemoteSimpleAPI]
118
+ layers=[BigTransfer,RemoteSimpleAPI]
119
+ api=self
120
+ layers.each{|layer|
121
+ @protocolAPIs << api=layer.new(api)
122
+ }
123
+ @api=api
124
+ #messageQueue=MessageQueue.new(self,priority)
125
+ #messageQueue=QoSQueue.new(self)
126
+ #bigTransfer=BigTransfer.new(messageQueue)
127
+ #@api||=RemoteSimpleAPI.new(bigTransfer)
128
+
129
+ @api.hook('_networkNodes'){|nodes|
130
+ nodes.each{|n|@nodes.add(n)}
131
+ }
132
+
133
+ #@protocolAPIs << messageQueue
134
+ #@protocolAPIs << bigTransfer
135
+ #@protocolAPIs << @api
136
+ @api
137
+ end
138
+
139
+ protect :api
140
+
141
+ def stop
142
+ super
143
+
144
+ log "UDP Alog successfully stopping #{@protocolAPIs.length}"
145
+ log caller
146
+ @quit=true
147
+ log @protocolAPIs.length
148
+ log "========="
149
+ @protocolAPIs.each{|api|
150
+ api.stop
151
+ }
152
+ @transceiver.stop
153
+ log "UDP Alog successfully stopped"
154
+ end
155
+
156
+ private
157
+
158
+ def spreadNodes
159
+ @lastSpread||=0
160
+ time=Time.now.to_f
161
+
162
+ maxSend=10
163
+
164
+ newer=@nodes.nodesNewerThan(@lastSpread)
165
+ older=@nodes.nodesOlderThan(@lastSpread)
166
+
167
+ newer.each{|target|
168
+ api.sendAsync(target,'_networkNodes',@nodes.nodes.shuffle[0...maxSend])
169
+ }
170
+
171
+ older.each{|target|
172
+ api.sendAsync(target,'_networkNodes',newer.shuffle[0...maxSend])
173
+ }
174
+
175
+ @lastSpread=time
176
+ end
177
+
178
+ def gatherNodes
179
+ discovery=getApp(:networkDiscovery)
180
+ nodes=[]
181
+ if discovery
182
+ nodes=discovery.get.select{|str|
183
+ str=~/udpsec/
184
+ }
185
+
186
+ end
187
+ nodes.each{|n|@nodes.add(n)}
188
+ end
189
+
190
+ def addReceivers
191
+ @transceiver.receive{|from,message|
192
+ @receivers.each{|rec,block|block.call(from,message)}
193
+ }
194
+ end
195
+
196
+ end
@@ -0,0 +1,329 @@
1
+ require 'secure_marshal.rb'
2
+ require 'tools/waiting_queue.rb'
3
+
4
+ class UdpTransceiver
5
+
6
+ UDPSize=4096
7
+ Overhead=400
8
+
9
+ Message=Struct.new(:type, :counter, :content)
10
+
11
+ class Message
12
+ def self.ack(counter)
13
+ self.new(:ack,counter,nil)
14
+ end
15
+
16
+ def self.request(counter)
17
+ self.new(:request,counter,nil)
18
+ end
19
+ def self.create(counter,content)
20
+ self.new(:pkg,counter,content)
21
+
22
+ end
23
+ end
24
+
25
+ Packet=Struct.new(:from, :to, :message)
26
+
27
+ class Stream
28
+ def initialize(connection)
29
+ @connection=connection
30
+ end
31
+
32
+ def write(s)
33
+ len=@connection.maxLength-1
34
+ len1=len-1
35
+ while s.length>0
36
+
37
+ if s.length>len
38
+ x=s[0..len1]
39
+ s=s[len..-1]
40
+ @connection.send(x)
41
+ else
42
+ @connection.send(s)
43
+ s=""
44
+ end
45
+ end
46
+ end
47
+
48
+ def read
49
+ s=""
50
+ loop do
51
+ tmp=@connection.read
52
+ if tmp.nil?
53
+ break
54
+ else
55
+ s+=tmp
56
+ end
57
+ end
58
+ s
59
+ end
60
+ end
61
+
62
+ class Connection
63
+ def initialize(node,transceiver)
64
+ @node=node
65
+ @transceiver=transceiver
66
+
67
+ @mutex=Mutex.new
68
+ @queue=[]
69
+ # FIXME: add event api
70
+ end
71
+
72
+ def stream
73
+ Stream.new(self)
74
+ end
75
+
76
+ def matches(host,port)
77
+ pp @node,[host,port]
78
+ @node==[host,port]
79
+ end
80
+
81
+ def maxLength
82
+ UDPSize-Overhead
83
+ end
84
+
85
+ def send(content)
86
+ if content.length>maxLength
87
+ raise "#{content} is too long"
88
+ end
89
+ @transceiver.send(@node,content)
90
+ end
91
+
92
+ def read
93
+ @mutex.synchronize {
94
+ @queue.shift
95
+ }
96
+ end
97
+
98
+ def close
99
+ @transceiver.close(self)
100
+ end
101
+
102
+ def enqueue(packet)
103
+ @mutex.synchronize {
104
+ pp "ENQ:",packet
105
+ @queue << packet
106
+ }
107
+ end
108
+ end
109
+
110
+ def initialize(bind,port)
111
+ @port=port
112
+ @bind=bind
113
+
114
+ @socket=UDPSocket.open
115
+ @socket.bind(@bind,@port)
116
+
117
+ @inQueue=WaitingQueue.new
118
+ @outQueue=WaitingQueue.new
119
+
120
+ @outCounter={}
121
+ @inCounter={}
122
+
123
+ @outCounterMutex=Mutex.new
124
+ @inCounterMutex=Mutex.new
125
+
126
+ @connsMutex=Mutex.new
127
+ @connections=[]
128
+
129
+ @quit=false
130
+ @receivers=[]
131
+
132
+ @threads=[]
133
+
134
+ @threads << Thread.new{
135
+ begin
136
+ recvLoop
137
+ rescue Object=>e
138
+ pp "RECV:",e,e.backtrace
139
+ end
140
+ }
141
+
142
+ # process ingthread
143
+ @threads << Thread.new{
144
+ begin
145
+ processInQueue
146
+ rescue Object=>e
147
+ pp "PROCESS IN QUEUE",e,e.backtrace
148
+ end
149
+ }
150
+
151
+ # sending thread
152
+ @threads << Thread.new{
153
+ begin
154
+ send!
155
+ rescue Object=>e
156
+ pp "SEND",e,e.backtrace
157
+ end
158
+ }
159
+ end
160
+
161
+ def close!
162
+ Thread.critical=true
163
+ @socket.close
164
+ @socket=nil
165
+ Thread.critical=false
166
+ end
167
+
168
+ def close(conn)
169
+ @connsMutex.synchronize {
170
+ @connections.delete(conn)
171
+ }
172
+ end
173
+
174
+ def connect(node)
175
+
176
+ c=Connection.new(nodeOrtho(node),self)
177
+ @connsMutex.synchronize {
178
+ @connections << c
179
+ }
180
+ c
181
+ end
182
+
183
+ def me
184
+ "udpsec://#{@bind}:#{@port}"
185
+ end
186
+
187
+ def send(node,content)
188
+ node=nodeOrtho(node)
189
+ @outQueue << Packet.new(me,node,Message.create(counterInc(node),content))
190
+ end
191
+
192
+ def receive(&block)
193
+ @receivers << block
194
+ end
195
+
196
+ def stop
197
+ @quit=true
198
+ @threads.each{|th|th.kill}
199
+ @socket.close
200
+ end
201
+
202
+ private
203
+ def pair2address(a=nil)
204
+ a=["127.0.0.1",a[1]] if a[0]=="::1"
205
+ a||=myAddress
206
+ "udpsec://"+a.join(":")
207
+ end
208
+
209
+ def myAddress
210
+ [@bind,@port]
211
+ end
212
+
213
+ def nodeOrtho(node)
214
+ if node.is_a?(String)
215
+ assert{node=~/udpsec/}
216
+ ar=node.gsub(/.*\//,"").split(":")
217
+ port=ar[-1]
218
+ host=ar[0..-2].join(":")
219
+ node=[host,port.to_i]
220
+ end
221
+ [IPSocket::getaddress(node[0]),node[1]]
222
+ end
223
+
224
+ def send!
225
+ while not quit?
226
+ o=@outQueue.pop
227
+
228
+ str=Secure::Marshal::dump(o.message)
229
+ host=o.to[0]
230
+ port=o.to[1]
231
+ #soc=UDPSocket.open
232
+ soc=@socket
233
+
234
+ host="localhost" if host=="::1"
235
+
236
+ begin
237
+ #pp "SEND #{str.length} to #{host.inspect} #{port.inspect}"
238
+ soc.send(str,0,host,port)
239
+ rescue Object=>e
240
+ pp e,e.backtrace
241
+ end
242
+ #measureTime {
243
+ sleep 0.001 # wait a little time to let get udp packets get through
244
+ #}
245
+ end
246
+ end
247
+
248
+ def counterInc(node)
249
+ @outCounterMutex.synchronize {
250
+ @outCounter[node]||=0
251
+ @outCounter[node]+=1
252
+ }
253
+ end
254
+
255
+ def recvLoop
256
+ while not quit?
257
+ #puts "select..."
258
+ IO.select([@socket])
259
+ r=@socket.recvfrom_nonblock(UDPSize)
260
+ #pp r
261
+ push(r)
262
+ end
263
+ end
264
+
265
+ def push(r)
266
+ #@inQueueMutex.synchronize {
267
+ @inQueue << r
268
+ #}
269
+ #processInQueue!
270
+ end
271
+ private
272
+
273
+ def quit?
274
+ @quit
275
+ end
276
+ def processInQueue
277
+ missed=[]
278
+ while not quit?
279
+ i=@inQueue.pop
280
+ conns=nil
281
+ @connsMutex.synchronize {
282
+ conns=@connections
283
+ }
284
+ content,from=i
285
+
286
+ content=Secure::Marshal::load(content)
287
+
288
+ if content.type==:pkg
289
+
290
+ node=nodeOrtho(from[1..2].reverse)
291
+ action=nil
292
+ matches=false
293
+
294
+ # check if this is the next packet
295
+
296
+ @inCounterMutex.synchronize {
297
+ @inCounter[node]||=1
298
+ missed.delete([node,content.counter])
299
+ if @inCounter[node]==content.counter
300
+ action=:take
301
+ @inCounter[node]+=1
302
+ matches=true
303
+ elsif @inCounter[node]>content.counter
304
+ action=:ignore
305
+ matches=true # ignore
306
+ else
307
+ action=:missed
308
+ # missed a packet ?
309
+ missed << [node,@inCounter[node]]
310
+ end
311
+ }
312
+ if action==:take
313
+ conns.each{|c|
314
+ if c.matches(*node)
315
+ c.enqueue(content.content)
316
+ end
317
+ }
318
+ @receivers.each{|r|r.call(pair2address(node),content.content)}
319
+
320
+ end
321
+
322
+
323
+ end
324
+ # FIXME: add fetching rest (?)
325
+ end
326
+
327
+ end
328
+
329
+ end