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,167 @@
1
+ require 'secure_marshal.rb'
2
+ require 'ipaddr'
3
+
4
+ class NodeBroadcastApp<Service
5
+
6
+ provides :udpBroadcast
7
+
8
+
9
+ PORT=8472
10
+ UDPSize = 512
11
+
12
+ SO_REUSEPORT = 0x0200
13
+
14
+ MULTICAST_ADDR= '228.5.6.8'
15
+
16
+ def initialize(cluster,options)
17
+ super(cluster,options,:udpBroadcast)
18
+
19
+ @port=options[:broadcast_port]
20
+ #@bind="localhost"
21
+ # @bcs=['<broadcast>','localhost','<any>',MULTICAST_ADDR]
22
+ @bcs=[MULTICAST_ADDR]
23
+
24
+ @protocols={}
25
+
26
+ @bind=MULTICAST_ADDR
27
+ @port||=PORT
28
+
29
+ addr=@bind
30
+ host = Socket.gethostname
31
+ maddr = addr.split('.').collect! { |b| b.to_i }.pack('CCCC')
32
+
33
+ sa=(Socket.gethostbyname(host)[3])[4..7]
34
+
35
+ mreq = maddr + sa
36
+ ip=mreq
37
+ @socket=UDPSocket.open
38
+
39
+ # enable support for multiple apps on single pc
40
+ @socket.setsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR,1)
41
+ @socket.setsockopt(Socket::SOL_SOCKET,SO_REUSEPORT,1)
42
+
43
+ # bind
44
+ @socket.bind(@bind,@port)
45
+ # submit membership to multicasting
46
+ @socket.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, ip)
47
+
48
+ @mutex=Mutex.new
49
+ @inBuffer=[]
50
+ @connectIds=0
51
+ end
52
+
53
+ def run
54
+ begin
55
+ recvLoop
56
+ rescue
57
+ end
58
+ end
59
+
60
+ class Protocol
61
+ def initialize(name,proxy)
62
+ @name=name
63
+ @blocks=[]
64
+ @proxy=proxy
65
+ end
66
+ def push(block,id)
67
+ @blocks<<[block,id]
68
+ end
69
+ def close(id)
70
+ @blocks.delete_if{|i|i[1]==id}
71
+ end
72
+ def send(x)
73
+ @proxy.send(@name,x)
74
+ end
75
+ def recv(o)
76
+ @blocks.each{|b|b[0].call(o)}
77
+ end
78
+ end
79
+ class Connection
80
+ def initialize(id,protocol)
81
+ @id=id
82
+ @protocol=protocol
83
+ end
84
+ def close
85
+ @protocol.close(id)
86
+ end
87
+ def send(x)
88
+ @protocol.send(x)
89
+ end
90
+ end
91
+
92
+ def connect(protocol,&block)
93
+ id=nil
94
+ Thread.critical do
95
+ @connectIds+=1
96
+ id=@connectIds
97
+ end
98
+ @protocols[protocol]||=Protocol.new(protocol,self)
99
+
100
+ @protocols[protocol].push(block,id)
101
+
102
+
103
+ Connection.new(id,@protocols[protocol])
104
+ end
105
+
106
+ def send(name,object)
107
+ sendStr(Secure::Marshal::dump([name,object]))
108
+ end
109
+
110
+ def stop
111
+ @quit=true
112
+ @socket.close
113
+ super
114
+ end
115
+
116
+
117
+ def buffer(&block)
118
+ finished=false
119
+ while finished==false do
120
+ arg=nil
121
+ @mutex.synchronize {
122
+ if @inBuffer.length>0
123
+ arg=@inBuffer.shift
124
+ end
125
+ }
126
+ block.call(arg) unless arg.nil?
127
+ @mutex.synchronize {
128
+ finished=true if @inBuffer.length==0
129
+ }
130
+ end
131
+ end
132
+
133
+ def push(str)
134
+ begin
135
+ s=str[0]
136
+ o=Secure::Marshal::load(s)
137
+ if @protocols[o[0]]
138
+ @protocols[o[0]].recv(o[1])
139
+ else
140
+ warning "WARNING: NodeBroadcast: Protocol #{o[0]} unknown !!!!!"
141
+ end
142
+ rescue Object=>e
143
+ pp e
144
+ @inBuffer << str
145
+ end
146
+ end
147
+
148
+ def sendStr(str)
149
+ soc=UDPSocket.open
150
+ soc.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)
151
+ @bcs.each{|bc|
152
+ begin
153
+ soc.send(str,0,bc,@port)
154
+ rescue Object=>e
155
+ pp e
156
+ end
157
+ }
158
+ end
159
+
160
+ def recvLoop
161
+ loop do
162
+ IO.select([@socket])
163
+ r=@socket.recvfrom_nonblock(UDPSize)
164
+ push(r)
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,59 @@
1
+ describe "Node broadcasting" do
2
+ it "should work at all" do
3
+ b=TestBed.new
4
+ bc=b.run("NodeBroadcast")
5
+ str="HUPE"
6
+ bc.sendStr(str)
7
+ ret=:nothinYet
8
+ sleep 0.05
9
+ bc.buffer{|buffer|
10
+ ret=buffer[0]
11
+ }
12
+ ret.should == str
13
+ b.stop
14
+ end
15
+
16
+
17
+ it "should work for simple protocols" do
18
+ b=TestBed.new
19
+ bc=b.run("NodeBroadcast")
20
+ result=nil
21
+ connection=bc.connect("nodeBroadcasting"){|result|
22
+ }
23
+ str="MUH sdkjhdf kdjh sh"
24
+ connection.send(str)
25
+ sleep 0.5
26
+ result.should == str
27
+ b.stop
28
+ end
29
+
30
+ it "should work with 2 (or more) broadcasters on a single pc" do
31
+ b1=TestBed.new
32
+ b2=TestBed.new
33
+
34
+ bc1=b1.run("NodeBroadcast")
35
+ bc2=b2.run("NodeBroadcast")
36
+
37
+ r1=[]
38
+ r2=[]
39
+
40
+ c1=bc1.connect("bcTest"){|result|
41
+ r1 << result
42
+ }
43
+ c2=bc2.connect("bcTest"){|result|
44
+ r2 << result
45
+ }
46
+
47
+ c1.send("C1")
48
+ c2.send("C2")
49
+
50
+ sleep 2
51
+
52
+ r1.uniq.should == r2.uniq
53
+ r1.uniq.sort.should == ["C1","C2"].sort
54
+
55
+ b1.stop
56
+ b2.stop
57
+
58
+ end
59
+ end
@@ -0,0 +1,47 @@
1
+ require 'service.rb'
2
+
3
+ class PermaspaceApp<Service
4
+ provides :permaspace
5
+ def initialize(cluster,options)
6
+ super(cluster,options,:permaspace)
7
+ end
8
+ def store(name,what)
9
+ mid=id(name)
10
+ if name!=""
11
+ f=File.open(File.join(getAppDataWritePath,mid),"w")
12
+
13
+ f.print what
14
+ f.close
15
+ return true
16
+ end
17
+ false
18
+ end
19
+ def load(name)
20
+ mid=id(name)
21
+ if mid!=""
22
+ getAppDataPaths.each{|path|
23
+ fname=File.join(path,mid)
24
+ if File.exists?(fname)
25
+ f=File.open(fname)
26
+ what=f.read
27
+ f.close
28
+ return what
29
+ end
30
+ }
31
+ end
32
+ nil
33
+ end
34
+
35
+ def rm(name)
36
+ mid=id(name)
37
+ fname=File.join(getAppDataWritePath,mid)
38
+ if File.exists?(fname)
39
+ File.rm_f(fname)
40
+ end
41
+ end
42
+
43
+ private
44
+ def id(name)
45
+ name.gsub(/[^a-zA-Z0-9_]/,'')
46
+ end
47
+ end
@@ -0,0 +1,38 @@
1
+ class BTree
2
+
3
+ class Node
4
+ def initialize(tree,parent)
5
+ @parent=parent
6
+ @tree=tree
7
+ @values=[]
8
+ @nodes=[]
9
+ end
10
+
11
+
12
+
13
+ private
14
+ def check
15
+ if @nodes.length>@tree.maxNodes
16
+ elsif @nodes.length<@tree.minNodes
17
+ end
18
+ end
19
+ end
20
+
21
+ attr_reader :maxNodes, :minNodes
22
+
23
+ def initialize(minNodes,maxNodes)
24
+ @minNodes=minNodes
25
+ @maxNodes=maxNodes
26
+ @root=Node.new(self,nil)
27
+ end
28
+
29
+ def insert(element)
30
+ @root.insert(element)
31
+ end
32
+
33
+ def delete(element)
34
+ @root.delete(element)
35
+ end
36
+
37
+
38
+ end
@@ -0,0 +1,199 @@
1
+ require 'service.rb'
2
+
3
+ class PlaindbApp<Service
4
+
5
+ class Column
6
+ attr_reader :name, :length, :type
7
+ def initialize(name,length,type)
8
+ @name=name
9
+ @length=length
10
+ @type=type
11
+ end
12
+
13
+ def self.int(name)
14
+ Column.new(name,4,:int)
15
+ end
16
+ def self.string(name,len=256)
17
+ Column.new(name,len,:string)
18
+ end
19
+ def packString
20
+ case @type
21
+ when :int
22
+ "N"
23
+ when :string
24
+ "a#{@length}"
25
+ end
26
+ end
27
+ end
28
+
29
+ class TableDefinition
30
+ attr_reader :columns
31
+ def initialize
32
+ @columns=[]
33
+ end
34
+ def add(column)
35
+ @columns<<column
36
+ end
37
+ def getId(name)
38
+ @columns.select{|col|col.name==name}[0]
39
+ end
40
+ def packString
41
+ columns.map{|col|
42
+ col.packString
43
+ }.join("")
44
+ end
45
+ end
46
+
47
+ class Row
48
+ attr_accessor :definition
49
+ attr_reader :data
50
+
51
+ def initialize(*data)
52
+ if data.length==2
53
+ if data[1].is_a?(TableDefinition) and data[0].is_a?(String)
54
+ @definition=data[1]
55
+ colCount=@definition.columns.length
56
+ tmp=data[0].unpack(@definition.packString+"N"*colCount)
57
+ @data=tmp[0..(colCount-1)]
58
+ lens=tmp[colCount..-1]
59
+ (0...colCount).each{|i|
60
+ if @definition.columns[i].type==:string
61
+ @data[i]=@data[i][0...lens[i]]
62
+ end
63
+ }
64
+
65
+ return
66
+ end
67
+
68
+ end
69
+ @data=data
70
+ end
71
+ def ==(row)
72
+ @data==row.data
73
+ end
74
+ def [](id)
75
+ if id.is_a?(Numeric)
76
+ @data[id]
77
+ else
78
+ @data[@definition.getId[id]]
79
+ end
80
+ end
81
+
82
+ def to_bs(definition)
83
+ @data.pack(definition.packString)+@data.map{|d|
84
+ if d.respond_to?(:length)
85
+ d.length
86
+ else
87
+ 0
88
+ end
89
+ }.pack("N"*@data.length)
90
+ end
91
+
92
+ end
93
+
94
+ class Table
95
+ attr_reader :rowLength
96
+ def initialize(db,table,definition)
97
+ @db=db
98
+ @table=table
99
+ @definition=definition
100
+
101
+ @rowLength=@definition.columns.inject(0){|size,column|size+column.length}+[0].pack("N").length*@definition.columns.length
102
+ end
103
+
104
+ def [](id)
105
+
106
+ end
107
+
108
+ def insert(row)
109
+
110
+ end
111
+ def rows
112
+
113
+ end
114
+
115
+ end
116
+
117
+ class FileTable<Table
118
+ VALID_RECORD=0
119
+ INVALID_RECORD=1
120
+
121
+ def initialize(db,table,definition)
122
+ super
123
+ @filename=db+"_"+table+".tab"
124
+ @handle=File.open(@filename,"w+")
125
+ @@stateSize=[VALID_RECORD].pack("N").length
126
+ end
127
+ def flush
128
+ @handle.flush
129
+ end
130
+ def size
131
+ @handle.lstat.size/rowLength
132
+ end
133
+
134
+ def delete(rowNumber)
135
+ pos=getPos(rowNumber)
136
+ @handle.seek(pos,IO::SEEK_SET)
137
+ @handle.write([INVALID_RECORD].pack("N"))
138
+ end
139
+
140
+ def insert(row)
141
+ store(row,size)
142
+ end
143
+ def store(row,rowNumber)
144
+ pos=getPos(rowNumber)
145
+ @handle.seek(pos,IO::SEEK_SET)
146
+ state=VALID_RECORD #
147
+ data=[state].pack("N")+row.to_bs(@definition)
148
+ @handle.write(data)
149
+ end
150
+ def load(rowNumber)
151
+ pos=getPos(rowNumber)
152
+ @handle.seek(pos,IO::SEEK_SET)
153
+ data=@handle.read(rowLength+@@stateSize)
154
+ state=data.unpack("N")
155
+ return nil if state==INVALID_STATE
156
+ data=data[@@stateSize..-1]
157
+ data=Row.new(data,@definition)
158
+ end
159
+ private
160
+ def getPos(rowNumber)
161
+ rowNumber*(rowLength+@@stateSize)
162
+ end
163
+ end
164
+
165
+ class DB
166
+ def initialize(db)
167
+ @db=db
168
+ @tables={}
169
+ end
170
+
171
+ def getTable(table,definition=nil)
172
+ @tables[table]||=FileTable.new(@db,table,definition)
173
+ end
174
+
175
+ private
176
+
177
+ end
178
+
179
+ class Join
180
+
181
+ end
182
+
183
+ def initialize(cluster,options)
184
+ super(cluster,options,:plaindb)
185
+ @dbs={}
186
+ end
187
+
188
+ def getDB(user,pw)
189
+ id=getID(user,pw)
190
+ @dbs[id]||=DB.new(getAppDataPath,id)
191
+ end
192
+
193
+ private
194
+ def getID(user,pw)
195
+ #FIXME: use sha1 or the like
196
+ user+pw
197
+ end
198
+
199
+ end