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,91 @@
1
+ if false
2
+
3
+ $: << File.expand_path("../..",__FILE__)
4
+ require File.expand_path('../../routing.rb',__FILE__)
5
+
6
+ describe "Local Routing" do
7
+ it "should be possible to encode a neighbor and use it for routing" do
8
+ network=Nodes.new(30)
9
+ network.computeDistances
10
+ b=network.nodes[0]
11
+ l=LocalRouting.new(b,network)
12
+ n=b.neighbors[1]
13
+ p=l.getNodePos(n)
14
+ r=l.getRouteOrder(p)
15
+ puts r
16
+ end
17
+
18
+ end
19
+ describe "Global Routing" do
20
+ it "positions should transferable forth and back" do
21
+ network=Nodes.new(30)
22
+ network.computeDistances
23
+ rts=network.nodes.map2hash{|n|
24
+ GlobalRouting.new(n,network)
25
+ }
26
+ b=network.nodes[0]
27
+ n=b.neighbors[1]
28
+ n2=(n.neighbors-b.neighbors)[0]
29
+
30
+ p0=rts[n].getNodePos(n2)
31
+ p1=rts[b].translateFromNeighborToLocal(p0,n)
32
+
33
+ p2=rts[n].translateFromNeighborToLocal(p1,b)
34
+
35
+ perm0=p0.to_a.flatten.createPermutationFromOrder
36
+ perm1=p1.to_a.flatten.createPermutationFromOrder
37
+ perm2=p2.to_a.flatten.createPermutationFromOrder
38
+
39
+ # the order should be the same
40
+
41
+ perm0.should == perm2
42
+ end
43
+ it "should be possible to create global routing for all nodes in a decent time" do
44
+ network=Nodes.new(30)
45
+ network.computeDistances
46
+ i=0
47
+ rts=network.nodes.map2hash{|n|
48
+ puts i+=1
49
+ GlobalRouting.new(n,network)
50
+ }
51
+
52
+ a,b=network.nodes[0..1]
53
+
54
+ shortestPath=network.shortestPath(a,b)
55
+ puts shortestPath
56
+
57
+ # propagate pos of b through *shortestPath* til a
58
+ p=rts[b].getNodePos(b)
59
+ last=b
60
+ puts p
61
+
62
+ shortestPath.nodes.reverse[0..-1].each{|n|
63
+ i=shortestPath.nodes.index(n)
64
+ p=rts[n].translateFromNeighborToLocal(p,last)
65
+ puts "P #{i} #{p}"
66
+ last=n
67
+ }
68
+ puts "==="
69
+ # compute path from a to b
70
+ a2=a
71
+ i=1
72
+ p=rts[a2].getNodePos(shortestPath.nodes[1])
73
+ loop do
74
+ puts "I:",i
75
+ puts "P #{i} #{p}"
76
+ r=rts[a2].getRouteOrder(p)[0]
77
+ r.id.should == shortestPath.nodes[i].id
78
+
79
+ break if r==b
80
+ p=rts[r].translateFromNeighborToLocal(p,a2)
81
+ a2=r
82
+ i+=1
83
+ end
84
+
85
+ end
86
+
87
+ end
88
+
89
+
90
+
91
+ end
@@ -0,0 +1,437 @@
1
+ require 'gserver'
2
+ require 'secure_marshal.rb'
3
+ require 'whiteboard.rb'
4
+
5
+ module Secure
6
+
7
+
8
+ class IServer<GServer
9
+ def initialize(server,port,*args)
10
+ super(port,*args)
11
+ @server=server
12
+ end
13
+
14
+ def serve(io)
15
+ begin
16
+ c=Connection.new(io,@server)
17
+ @server.addConnection(c)
18
+ c.receiveLoop
19
+ rescue Object=>e
20
+ pp "SERVING EXCEPTION",e
21
+ end
22
+ end
23
+ end
24
+
25
+ class Connection
26
+ attr_reader :valid
27
+ def initialize(conn,server)
28
+ @conn=conn
29
+ @data=""
30
+ @server=server
31
+ @conn.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
32
+ @valid=true
33
+ @mutex=Mutex.new
34
+ end
35
+ def send(*what)
36
+ return unless @valid
37
+ begin
38
+ data=Secure::Marshal.dump(what)
39
+ puts "Sending data #{data.length} from #{@conn.addr} to #{@conn.peeraddr}"
40
+ @mutex.synchronize {
41
+ if @valid
42
+ len=data.length
43
+ result=@conn.write(data)
44
+ assert {len==result}
45
+ @conn.flush
46
+ else
47
+ raise "Connection invalid"
48
+ end
49
+ }
50
+ rescue Exception=>e
51
+ glog e,e.backtrace
52
+ @valid=false
53
+ end
54
+ end
55
+
56
+ def remotePort
57
+ begin
58
+ @conn.peeraddr[1]
59
+ rescue
60
+ end
61
+ end
62
+ def remoteHost
63
+ begin
64
+ @conn.peeraddr[3]
65
+ rescue
66
+ end
67
+ end
68
+
69
+ def disconnect(notifyRemote=true)
70
+ puts "Disconnecting from #{@conn.addr} to #{@conn.peeraddr}"
71
+ begin
72
+ #self.send(:closeConnection) if notifyRemote
73
+ #@mutex.synchronize {
74
+ #puts "SYNC Disconnecting from #{@conn.addr} to #{@conn.peeraddr}"
75
+ @valid=false
76
+ @server.removeConnection(self)
77
+ @conn.close
78
+ #}
79
+ rescue Object=>e
80
+ glog e
81
+ end
82
+ end
83
+
84
+ # pseudo-private
85
+ def receiveLoop
86
+ return unless @valid
87
+ begin
88
+ loop do
89
+ curdata=@conn.recv(1012)
90
+ @data+=curdata
91
+ if curdata.length>0
92
+ pp "GOT DATA (at #{@conn.addr}) #{@data.length}"
93
+ else
94
+ puts "NO DATA"
95
+ break
96
+ end
97
+ d=Secure::Data.new(@data)
98
+ begin
99
+ result=Secure::Marshal.load(d)
100
+ # important: loop until buffer is empty, because it's possible that there are more than 1 messages in @data
101
+ while result
102
+ @server.receive(self,result)
103
+ @data=d.str
104
+ result=Secure::Marshal.load(d)
105
+ end
106
+ rescue Secure::Marshal::OutOfData=>e
107
+ pp e,@data
108
+ end
109
+ break unless @valid
110
+ end
111
+ rescue Exception=>e
112
+ #glog e,e.backtrace,self
113
+ unless e.inspect.to_s=="#<RuntimeError: stop>"
114
+ pp e,e.backtrace,self
115
+ end
116
+ end
117
+ @server.removeConnection(self)
118
+ @valid=false
119
+ end
120
+ end
121
+
122
+ class Server
123
+ attr_reader :messages
124
+ attr_reader :connections
125
+ def initialize(port)
126
+ @iserver=IServer.new(self,port,"127.0.0.1",40)
127
+ @iserver.audit = true
128
+ @iserver.start
129
+ @connections=[]
130
+ @messages=[]
131
+ @threads=[]
132
+ @hook=nil
133
+ @hookConnected=nil
134
+ @hookDisconnected=nil
135
+ end
136
+ def stop
137
+ @iserver.stop
138
+ @threads.each{|th|th.kill}
139
+ end
140
+
141
+ def hook(&b)
142
+ @hook=b
143
+ end
144
+ def hookDisconnected(&b)
145
+ @hookDisconnected=b
146
+ end
147
+ def host
148
+ @iserver.host
149
+ end
150
+ def port
151
+ @iserver.port
152
+ end
153
+
154
+ def receive(from,xy)
155
+ #pp "RECVED:#{from}:#{xy}"
156
+ if @xy==:closeConnection
157
+ from.disconnect(false)
158
+ elsif @hook
159
+ #pp "calling hook"
160
+ @hook.call(from,xy,Time.now)
161
+ else
162
+ #pp "pushing message"
163
+ @messages<<[from,xy,Time.now]
164
+ end
165
+ end
166
+
167
+ def connect(there,port)
168
+ puts "#{self}:CONNECTING #{there} #{port}"
169
+ host=Socket.gethostbyname(there)
170
+ sock=TCPSocket.new(there,port)
171
+ c=Connection.new(sock,self)
172
+ @connections<<c
173
+ @threads<<Thread.new{
174
+ begin
175
+ puts "RECEIVING"
176
+ c.receiveLoop
177
+ rescue Object=>e
178
+ glog "Exception in connect-Thread " ,e
179
+ end
180
+ }
181
+ c
182
+ end
183
+
184
+ def hookConnected(&hook)
185
+ @hookConnected=hook
186
+ end
187
+
188
+ def eventConnected(con)
189
+ glog "eventConnected #{con}"
190
+ @hookConnected.call(con) if @hookConnected
191
+ end
192
+
193
+ def addConnection(con)
194
+ glog "addConnection #{con}"
195
+ assert{con.is_a?(Connection)}
196
+ @connections<<con
197
+ eventConnected(con)
198
+ end
199
+ def removeConnection(con)
200
+ assert{con.is_a?(Connection)}
201
+ @connections.delete(con)
202
+ @hookDisconnected.call(con)
203
+ end
204
+ end
205
+
206
+ Call=Struct.new(:type,:name,:args,:tx)
207
+
208
+ class SimpleConnection
209
+ attr_writer :remotePort, :remoteHost
210
+ def initialize(server,c,localHost,localPort)
211
+ @c=c
212
+ @server=server
213
+ @c.send(Call.new(:hi,"hi",{:port=>localPort,:host=>localHost},true))
214
+ end
215
+ def method_missing(name,*args)
216
+ if @server.remote_sync_func?(name)
217
+ tx=@server.getTxId(self)
218
+ call=Call.new(:call,name,args,tx)
219
+ #puts "simplecon: sending #{call.inspect}"
220
+ @c.send(call)
221
+ # wait for @server to get return
222
+ #puts "WAIT FOR RETURN OF #{name} #{args.inspect} in tx #{tx}"
223
+ @server.getReturn(tx,self)
224
+ elsif @server.remote_func?(name)
225
+ call=Call.new(:call,name,args,nil)
226
+ pp "CALL",call
227
+ @c.send(call)
228
+ else
229
+ super
230
+ end
231
+ end
232
+ def remoteHost
233
+ return @remoteHost if @remoteHost
234
+ @c.remoteHost
235
+ end
236
+ def remotePort
237
+ return @remotePort if @remotePort
238
+ @c.remotePort
239
+ end
240
+
241
+ def disconnect
242
+ @c.disconnect
243
+ end
244
+
245
+ def connection
246
+ @c
247
+ end
248
+ end
249
+
250
+ RemoteExceptionMS=Struct.new(:embedded)
251
+ class RemoteExceptionMS
252
+ def initialize(emb=nil)
253
+ self.embedded=[]
254
+ if emb.is_a?(Exception)
255
+ self.embedded=[emb.to_s,emb.backtrace.to_s]
256
+ end
257
+ end
258
+ end
259
+
260
+ class RemoteException<Exception
261
+ attr_reader :embedded
262
+ def initialize(rems)
263
+ @embedded=rems.embedded
264
+ end
265
+ def to_s
266
+ super+":["+@embedded.to_s+"]"
267
+ end
268
+ end
269
+
270
+ class SimpleServer
271
+ def initialize(port)
272
+ @@allowed||=[]
273
+ @remote=[]
274
+ @txMutex=Mutex.new
275
+ @txId=0
276
+ @server=Server.new(port)
277
+ @rtMutex=Mutex.new
278
+ @returns={}
279
+ @exceptions={}
280
+ @connections={}
281
+ @identified={}
282
+ @txs={}
283
+ @whiteboard=Whiteboard.new
284
+
285
+ @server.hookDisconnected{|from|
286
+ if @txs[from]
287
+ @whitebaord.put(@txs[from],:disconnected)
288
+ end
289
+ }
290
+
291
+ @server.hook{|from,msg,time|
292
+ msg=msg[0]
293
+ # pp "MSG:#{msg}"
294
+ if msg.is_a?(Call)
295
+ if msg.type==:call
296
+ name=msg.name
297
+ if @@allowed.member?(name)
298
+ args=msg.args
299
+ finished=false
300
+ begin
301
+ result=self.send(name,*args)
302
+ finished=true
303
+ rescue Object=>e
304
+ if msg.tx
305
+ from.send(Call.new(:exception,name,RemoteExceptionMS.new(e),msg.tx))
306
+ end
307
+ end
308
+ if msg.tx
309
+ if finished
310
+ from.send(Call.new(:return,name,result,msg.tx))
311
+ else
312
+ end
313
+ end
314
+
315
+ else
316
+ glog "invalid access with #{msg} from #{from} at #{time}"
317
+ end
318
+ elsif msg.type==:return
319
+ @whiteboard.put(msg.tx,[:return,msg.args])
320
+ if false
321
+ @rtMutex.synchronize {
322
+ #puts "adding return #{msg.tx} #{msg.tx.class} on #{self}"
323
+ @returns[msg.tx]=msg.args
324
+ ##pp @returns
325
+ }
326
+ end
327
+ elsif msg.type==:exception
328
+ @whiteboard.put(msg.tx,[:exception,msg.args])
329
+ #@rtMutex.synchronize {
330
+ # @exceptions[msg.tx]=msg.args
331
+ #}
332
+ elsif msg.type==:hi
333
+ con=checkCon(from)
334
+ con.remotePort=msg.args[:port]
335
+ con.remoteHost=msg.args[:host]
336
+ eventConnected(con.remoteHost,con.remotePort)
337
+ end
338
+ end
339
+ }
340
+ @server.hookConnected {|con|
341
+ # nothing ATM - let it say "hi" first (see above)
342
+ }
343
+ end
344
+
345
+ def getReturn(tx,conn)
346
+ result=@whiteboard.get(tx)
347
+ case result[0]
348
+ when :return
349
+ return result[1]
350
+ else
351
+ raise RemoteException.new(result[1])
352
+ end
353
+
354
+
355
+ loop do
356
+ #puts "waiting for return...#{tx} #{tx.class} (on #{self})"
357
+ @rtMutex.synchronize {
358
+ if @returns.key?(tx)
359
+ r=@returns[tx]
360
+ @returns.delete(tx)
361
+ return r
362
+ end
363
+ if @exceptions.key?(tx)
364
+ r=@exceptions[tx]
365
+ @exceptions.delete(tx)
366
+ raise RemoteException.new(r)
367
+ end
368
+ }
369
+ raise "Connection closed" unless conn.connection.valid
370
+ sleep 0.1
371
+ end
372
+ end
373
+
374
+ def getTxId(conn)
375
+ cid=nil
376
+ @txMutex.synchronize {
377
+ @txId+=1
378
+ cid=@txId
379
+ @txs[cid]=conn
380
+ }
381
+ cid
382
+ end
383
+
384
+ def self.allow(*funcNames)
385
+ @@allowed||=[]
386
+ @@allowed+=funcNames
387
+ end
388
+ def self.remote(*funcNames)
389
+ @@remote||=[]
390
+ @@remote+=funcNames
391
+ end
392
+ def self.remote_sync(*funcNames)
393
+ @@remote_sync||=[]
394
+ @@remote_sync+=funcNames
395
+ end
396
+
397
+ def connections
398
+ @server.connections.map{|c|checkCon(c)}
399
+ end
400
+
401
+ def connect(host,port)
402
+ checkCon(@server.connect(host,port))
403
+ end
404
+
405
+ def remote_func?(name)
406
+ @@remote||=[]
407
+ @@remote.member?(name)
408
+ end
409
+ def remote_sync_func?(name)
410
+ @@remote_sync||=[]
411
+ @@remote_sync.member?(name)
412
+ end
413
+
414
+ def localHost
415
+ @server.host
416
+ end
417
+ def localPort
418
+ @server.port
419
+ end
420
+
421
+ def stop
422
+ @server.stop
423
+ end
424
+
425
+ def eventConnected(host,port)
426
+ glog "eventConnected #{host},#{port}"
427
+ # pure virtual
428
+ end
429
+ private
430
+ def checkCon(con)
431
+ assert{con.valid}
432
+ @connections[con]||=SimpleConnection.new(self,con,localHost,localPort)
433
+ @connections[con]
434
+ end
435
+
436
+ end
437
+ end