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,9 @@
1
+ class NetworkApp
2
+ def initialize(cluster)
3
+ super
4
+ cluster.getApp(:networkNode)
5
+
6
+ assert{networkNode}
7
+ @networkNode=networkNode
8
+ end
9
+ end
@@ -0,0 +1,471 @@
1
+ require 'service.rb'
2
+ require 'net_service.rb'
3
+ require 'breaking_mutex.rb'
4
+ require File.expand_path('../remote_service.rb',__FILE__)
5
+ require File.expand_path('../secure_node.rb',__FILE__)
6
+
7
+ class NetworkNodeApp_Disabled<Service
8
+
9
+ NODE_TYPE=SecureNetNode
10
+
11
+ class NodeNotReachable<Exception
12
+ end
13
+
14
+ Node=Struct.new(:node,:hops,:route,:timestamp)
15
+
16
+
17
+ class Node
18
+ alias :oldInit :initialize
19
+ def initialize(n=nil,h=nil,r=nil)
20
+ oldInit(n,h,r,Node::currentTimestamp)
21
+ end
22
+
23
+ def self.currentTimestamp
24
+ Time.now.to_f
25
+ end
26
+
27
+ def olderThan(other)
28
+ assert{(self<=>other)==0}
29
+ timestamp<other.timestamp
30
+ end
31
+ def ==(other)
32
+ [:node,:hops,:route].each{|i|
33
+ return false if self.send(i)!=other.send(i)
34
+ }
35
+ true
36
+ end
37
+ def <=>(other)
38
+ assert{self.class==other.class}
39
+ if self.hops==:unreachable
40
+ if other.hops!=:unreachable
41
+ return -1
42
+ end
43
+ else
44
+ if other.hops==:unreachable
45
+ return 1
46
+ else
47
+ a=(self.hops<=>other.hops)
48
+ return a if a!=0
49
+ end
50
+ end
51
+ a=(self.node<=>other.node)
52
+ return a if a!=0
53
+ if self.route.nil?
54
+ unless other.route.nil?
55
+ return -1
56
+ end
57
+ else
58
+ if other.route.nil?
59
+ return 1
60
+ else
61
+ a=(self.route<=>other.route)
62
+ return a if a!=0
63
+ end
64
+ end
65
+ 0
66
+ end
67
+ end
68
+
69
+ # these are default settings and can be overridden by *options*
70
+ MIN_COMPANIONS=5
71
+ MAX_COMPANIONS=10
72
+ MAX_HOPS=5
73
+
74
+ attr_reader :transceiver, :services
75
+
76
+ event :connected,1
77
+
78
+ def initialize(cluster,options)
79
+
80
+ super(cluster,options,:networkNode)
81
+
82
+ @minCompanions=options[:minCompanions]
83
+ @maxCompanions=options[:maxCompanions]
84
+ @maxHops=options[:maxHops]
85
+
86
+ @minCompanions||=MIN_COMPANIONS
87
+ @maxCompanions||=MAX_COMPANIONS
88
+ @maxHops||=MAX_HOPS
89
+
90
+ @protocol=:secure
91
+
92
+ port=nil
93
+ port=cluster.options[:port]
94
+ loop do
95
+ break if NetService.checkPort(port)
96
+ port=rand(2000)+2000
97
+ end
98
+ sleep 0.1
99
+ @listMutex=BreakingMutex.new
100
+ @nodeList={}
101
+ @newNodes={}
102
+
103
+ hash=options[:nodeHash]
104
+ hash||=genNodeHash
105
+
106
+ assert{hash.is_a?(String)}
107
+
108
+ @transceiver=NODE_TYPE.new(port,self,hash)
109
+ @hooks={}
110
+ @transceiver.setHook do |*s|
111
+ pp "NetworkNode hook #{s[0]}"
112
+ case s[0]
113
+ when :nodeListRoute
114
+ nodeListRoute
115
+ when :newNodes
116
+ log "new Nodes:-)"
117
+ gotNewNodes(*(s[1..-1]))
118
+ when :eventConnected
119
+ eventConnected(*(s[1..-1]))
120
+ when :serviceList
121
+ cluster.getGlobalServices.map{|s|RemoteServiceID.new(myNodeId,s.name,s.provides)}
122
+ when :call
123
+ incomingCall(*(s[1..-1]))
124
+ when :remoteApp
125
+ remoteApp(*(s[1..-1]))
126
+ when :run
127
+ incomingRun(*(s[1..-1]))
128
+ when :hook
129
+ if @hooks.key?(s[0])
130
+ @hooks[s[0]].call(*(s[1..-1]))
131
+ end
132
+ else
133
+ log "Unknown Message #{s}"
134
+ end
135
+ end
136
+ end
137
+
138
+ def hook(name,&block)
139
+ @hooks[name]=block
140
+ end
141
+ def unhook(name)
142
+ @hooks.delete(name)
143
+ end
144
+ def remoteApp(nodeId,name,*args)
145
+ log "remoteApp called #{nodeId} #{myNodeId}"
146
+ if nodeId==myNodeId
147
+ log "LOCAL"
148
+ if @hooks.key?(name)
149
+ log "hook found"
150
+ @hooks[name].call(*args)
151
+ else
152
+ log "no hook found for #{name}!"
153
+ end
154
+ else
155
+ puts "REMOTE #{nodeId}"
156
+ nextHop=getRoute(nodeId)
157
+ puts "ROUTE #{nextHop.inspect}"
158
+ pp @transceiver.nodeList
159
+ nextHop=nodeId if @transceiver.nodeList.member?(nodeId)
160
+ puts "ROUTE #{nextHop.inspect}"
161
+ return nil if nextHop.nil?
162
+ @transceiver.getConnection(nextHop).remoteCallSync(:remoteApp,nodeId,name,*args)
163
+ end
164
+ end
165
+
166
+ def genNodeHash
167
+ Crypt::digest(rand.to_s)
168
+ end
169
+
170
+ def info
171
+ {
172
+ :transceiver=>@transceiver.info,
173
+ :nodelist=>@nodeList.values,
174
+ :newNodes=>@newNodes.length,
175
+ :services=>@services
176
+ }
177
+ end
178
+
179
+ def nodeList
180
+ @nodeList.values.map{|node|node.node}
181
+ end
182
+ def nodeListRoute(timestamp=0)
183
+ @nodeList.values.map{|node|
184
+ n=node.dup
185
+ n.route=myNodeId
186
+ n
187
+ }.select{|n|n.timestamp>timestamp}
188
+ end
189
+
190
+ def getRoutesDirectly
191
+ @nodeList.values
192
+ end
193
+
194
+ def cron
195
+ log("cron")
196
+ measureTime {
197
+ log "routes:",getRoutesDirectly
198
+ begin
199
+ log "register at master..."
200
+ registerAtMasterServer
201
+ log "get new from local storage..."
202
+ getNewFromLocalStorage
203
+ if @nodeList.length==0
204
+ log "get new from master..."
205
+ getNewFromMaster
206
+ end
207
+ log "get new from neighbors..."
208
+ log "connected nodes:",@transceiver.nodeList.length
209
+ getNodesFromNeighbors # FIXME: optimize this
210
+ log "call connectNodes..."
211
+ connectNodes
212
+ log "ready connectNodes."
213
+ log "ndodelist:",@nodeList.length
214
+ log "connected nodes:",@transceiver.nodeList.length
215
+ log "call findServices...."
216
+ findServices
217
+ log "ready findServices."
218
+ super
219
+ rescue Exception=>e
220
+ log "Error in cron:",e,e.backtrace,e.class
221
+ end
222
+ log("cron ready",getRoutesDirectly,"--")
223
+
224
+ log("checking connected nodes")
225
+ pp getRoutesDirectly
226
+ @transceiver.nodeList.each{|l|
227
+ log "checking:",l
228
+ assert{nodeReachable(l)}
229
+ }
230
+ log("checked connected nodes")
231
+ }
232
+ @cronCount||=0
233
+ @cronCount+=1
234
+ log "connected nodes:",@transceiver.nodeList.length
235
+ log "cron #",@cronCount
236
+ end
237
+
238
+ def myNodeId
239
+ @transceiver.nodeId
240
+ end
241
+
242
+ def complete?
243
+ @nodeList.values.select{|node|node.route==:unreachable}==[]
244
+ end
245
+
246
+ def getAllNodes
247
+ @nodeList
248
+ end
249
+
250
+ def stop
251
+ super
252
+ @transceiver.stop
253
+ end
254
+
255
+
256
+ def getNodesFromNeighbors
257
+ @lastTimestamp||=0
258
+ time=Node::currentTimestamp
259
+ result=(@transceiver.sendAll(:nodeListRoute,@lastTimestamp)+nodeListRoute).flatten.uniq
260
+ @lastTimestamp=time
261
+ log "getNodesFromNeighbors..."
262
+ result.each{|node|
263
+ insertNodeFromNeighbor(node)
264
+ }
265
+
266
+ result.map{|node|node.node}.uniq
267
+ end
268
+
269
+
270
+ def getRemoteService(api)
271
+ findServices if @services.nil?
272
+ s=@services.select{|s|s.provides.member?(api)}
273
+ RemoteService.new(s[0],self)
274
+ end
275
+
276
+ def services
277
+ @services
278
+ end
279
+
280
+ def nodeReachable(node)
281
+ getRoute(node)
282
+ end
283
+
284
+ def call(service,s)
285
+ nextHop=getRoute(service.nodeInformation)
286
+ raise NodeNotReachable.new if nextHop.nil?
287
+ # maybe raise ???
288
+ @transceiver.getConnection(nextHop).remoteCallSync(:call,service,s)
289
+ end
290
+ def callRun(service,s)
291
+ nextHop=getRoute(service.nodeInformation)
292
+ raise NodeNotReachable.new if nextHop.nil?
293
+ # maybe raise ???
294
+ @transceiver.getConnection(nextHop).remoteCall(:call,service,s)
295
+ end
296
+
297
+ private
298
+
299
+ def insertNodeFromNeighbor(node)
300
+ node.hops+=1 if node.hops!=:unreachable
301
+ insertNode(node)
302
+ end
303
+
304
+ def insertNode(node)
305
+ server=node.node
306
+ if @nodeList[server].nil?
307
+ log "add to list #{node} from companion replacing #{@nodeList[server]} - because not known"
308
+ @nodeList[server]=node
309
+ elsif @nodeList[server].hops==:unreachable
310
+ log "add to list #{node} from companion replacing #{@nodeList[server]} - because yet unreachable"
311
+ @nodeList[server]=node
312
+ elsif node.hops==:unreachable
313
+ #nothing
314
+ elsif node.hops<@nodeList[server].hops
315
+ log "add to list #{node} from companion replacing #{@nodeList[server]} - because shorter"
316
+ @nodeList[server]=node
317
+ end
318
+ end
319
+
320
+
321
+ def getRoute(node)
322
+ #node=service
323
+ return nil unless @nodeList.key?(node)
324
+ route=@nodeList[node].route
325
+ if route==myNodeId
326
+ route=node
327
+ end
328
+ route
329
+ end
330
+
331
+ def incomingCall(service,s)
332
+ if service.nodeInformation==myNodeId
333
+ # do it
334
+ # FIXME: check rights
335
+ pp "doing it",*s
336
+ app=cluster.getApp(service.name)
337
+ pp "on:",app
338
+ app.send(*s)
339
+ else
340
+ # relay
341
+ call(service,s)
342
+ end
343
+ end
344
+
345
+ def findServices
346
+ findServicesFromNeighbors
347
+
348
+ # TODO: DNS !!!
349
+ end
350
+
351
+ def findServicesFromNeighbors
352
+ log "known nodes",@nodeList
353
+ log "getting serviceList..."
354
+
355
+ services=@transceiver.sendAll(:serviceList).flatten
356
+ pp "SERVICES:",services,"_____"
357
+ @services||=[]
358
+ @services+=services
359
+ @services.uniq!
360
+ pp "SERVICES2:",services,"_____"
361
+
362
+ @services
363
+ end
364
+
365
+ def registerAtMasterServer
366
+ app=getApp(:networkLookup)
367
+ app.register(myNodeId) if app
368
+ end
369
+
370
+ def eventConnected(by)
371
+ log "eventConnected by #{by.pretty_inspect} me:#{myNodeId}"
372
+ @nodeList[by]=Node.new(by,0,by)
373
+ isConnected(by)
374
+ end
375
+
376
+ def getNewFromLocalStorage
377
+ pp "getNewFromLOCAL"
378
+ @listMutex.synchronize {
379
+ if @nodeList.length==0
380
+ app=cluster.getApp(:localTupleSpace)
381
+ if app
382
+ servers=app.read(:networkNodeList)
383
+ if servers
384
+ servers.each{|server|
385
+ log "got server #{server} from local storage"
386
+ n=Node.new(server,:unreachable,nil)
387
+ pp n
388
+ log "add to list #{n.inspect}"
389
+ @nodeList[server]=n
390
+ log "inserted server #{server}"
391
+ }
392
+ end
393
+ end
394
+ end
395
+ }
396
+ end
397
+
398
+
399
+ def connectNodes
400
+ log "connectNodes..."
401
+ if @transceiver.nodeList.length<@minCompanions
402
+
403
+
404
+ # FIXME: make this tx shorter !!!!
405
+ log "connectNode!"
406
+ # only reading - no mutex needed
407
+ possible=@nodeList.keys-@transceiver.nodeList
408
+ log "nodelist #:",@nodeList.length
409
+ log "possible #:",possible.length
410
+ if possible.length>0
411
+ log possible
412
+ possible.shuffle!
413
+
414
+ log "sorting"
415
+ pp possible
416
+ puts "--"
417
+ possible.each{|a|pp @nodeList[a]}
418
+ puts "--"
419
+ possible.sort!{|a,b|
420
+ @nodeList[a] <=> @nodeList[b]
421
+ }
422
+ log "sorted"
423
+
424
+ begin
425
+ @transceiver.connect(possible[0]) if possible.length>0
426
+
427
+ possible=possible[0]
428
+ @listMutex.synchronize {
429
+ @nodeList[possible].hops=0
430
+ @newNodes[possible]=@nodeList[possible]
431
+ }
432
+ rescue Errno::ECONNREFUSED
433
+ log "Connection refused"
434
+ end
435
+ end
436
+
437
+ end
438
+ end
439
+
440
+ def getNewFromMaster
441
+ log "current nodecount #{@nodeList.length}"
442
+ lookupApp=getApp(:networkLookup)
443
+ if lookupApp
444
+ servers=lookupApp.getServers
445
+ log "loaded Servers from master:",servers
446
+ @listMutex.synchronize {
447
+ servers.each{|server|
448
+ if @nodeList[server].nil?
449
+ n=Node.new(server,:unreachable,nil)
450
+ log "add to list #{n.inspect}"
451
+ @nodeList[server]=n
452
+ end
453
+ }
454
+ }
455
+ else
456
+ log "getNewFromMaster - failed - no networklookup"
457
+ end
458
+ log "getNewFromMaster - ready"
459
+ end
460
+
461
+ def getFromMaster
462
+ log "fetch servers from master"
463
+ servers=cluster.getApp(:networkLookup).getServers
464
+ servers.each{|server|
465
+ log "got server #{server} from master"
466
+ insertNewNodeDirect(Node.new(server,0))
467
+ log "inserted server #{server}"
468
+ }
469
+ end
470
+
471
+ end