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,47 @@
1
+ require 'application.rb'
2
+ require 'crypto_rsa.rb'
3
+
4
+ class CryptoApp<Application
5
+ def initialize(cluster,options)
6
+ super
7
+ @keys={}
8
+ @myKey=options[:myKey]
9
+ @myKey||=:my
10
+
11
+ getMyKey # prefetch (generate)
12
+ end
13
+
14
+ def getKey(name)
15
+ @keys[name]||=getKeyInternal(name)
16
+ end
17
+
18
+ def getMyKey
19
+ getKey(@myKey)
20
+ end
21
+
22
+ private
23
+ def getKeyInternal(name)
24
+ # FIXME: add a layer inbetween ??
25
+ name=name.to_s
26
+ name.gsub!(/[^0-9A-Za-z_]*/,"")
27
+ return nil if name.length==0
28
+ filename="pk_#{name}"
29
+ path=File.join(getAppDataPath,filename)
30
+ if File.exists?(path)
31
+ Crypto::Key.new(loadFile(path))
32
+ elsif File.exists?(path+".pub")
33
+ Crypto::Key.new(loadFile(path+".pub"))
34
+ else
35
+ createKey(name,path)
36
+ end
37
+ end
38
+ def createKey(name,path)
39
+ k=Crypto.create_keys
40
+ k=Crypto::Key.new(k.to_s)
41
+ k.save(path)
42
+ k
43
+ end
44
+ def loadFile(f)
45
+ File.open(f){|f|f.read}
46
+ end
47
+ end
@@ -0,0 +1,102 @@
1
+ require 'openssl'
2
+ require 'base64'
3
+
4
+ # Documentation at http://net-ssh.rubyforge.org/api/classes/OpenSSL/PKey/RSA.html
5
+ module Crypto
6
+
7
+ def self.create_keys(priv = "rsa_key", pub = "#{priv}.pub", bits = 1024)
8
+ private_key = OpenSSL::PKey::RSA.new(bits)
9
+ #File.open(priv, "w+") { |fp| fp << private_key.to_s }
10
+ #File.open(pub, "w+") { |fp| fp << private_key.public_key.to_s }
11
+ private_key
12
+ end
13
+
14
+ def self.generate_secret_with_openssl
15
+ if !File.exist?("/dev/urandom")
16
+ # OpenSSL transparently seeds the random number generator with
17
+ # data from /dev/urandom. On platforms where that is not
18
+ # available, such as Windows, we have to provide OpenSSL with
19
+ # our own seed. Unfortunately there's no way to provide a
20
+ # secure seed without OS support, so we'll have to do with
21
+ # rand() and Time.now.usec().
22
+ OpenSSL::Random.seed(rand(0).to_s + Time.now.usec.to_s)
23
+ end
24
+ data = OpenSSL::BN.rand(2048, -1, false).to_s
25
+ return Base64.encode64(OpenSSL::Digest::SHA1.digest(data)).chomp
26
+ end
27
+
28
+ def self.doHmac(secret, payload)
29
+ key = Base64.decode64(secret)
30
+ hashmac = OpenSSL::HMAC.digest(OpenSSL::Digest::SHA1.new(key), key, payload)
31
+ Base64.encode64(hashmac).chomp
32
+ end
33
+
34
+ def self.doSha1(text)
35
+ Base64.encode64(OpenSSL::Digest::SHA1.digest(text)).chomp
36
+ end
37
+
38
+ class Key
39
+ def initialize(data)
40
+ #@public = (data =~ /^-----BEGIN (RSA|DSA) PRIVATE KEY-----$/).nil?
41
+ @public = false
42
+ @key = OpenSSL::PKey::RSA.new(data)
43
+ end
44
+
45
+ def self.from_file(filename)
46
+ self.new File.read( filename )
47
+ end
48
+
49
+ # saves private key under *filename* and the public key under *filename*.pub
50
+ def save(filename)
51
+ priv=filename
52
+ pub=filename+".pub"
53
+ if @key.respond_to?(:public_key)
54
+ File.open(priv, "w+") { |fp| fp << @key.to_s }
55
+ File.open(pub, "w+") { |fp| fp << @key.public_key.to_s }
56
+ else
57
+ File.open(pub, "w+") { |fp| fp << @key.to_s }
58
+ end
59
+ end
60
+
61
+ def encrypt(text)
62
+ Base64.encode64(@key.send("#{key_type}_encrypt", text))
63
+ end
64
+
65
+ def sign(text)
66
+ Base64.encode64(@key.send("sign", OpenSSL::Digest::SHA1.new, text))
67
+ end
68
+
69
+ def sign_other(text)
70
+ digest = OpenSSL::Digest::SHA1.new(text).to_s
71
+ encrypt(digest)
72
+ end
73
+
74
+ def sign_other1(text)
75
+ digest = OpenSSL::Digest::SHA1.new
76
+ text.each_byte{ |c| digest.update(c.to_s) }
77
+ digest = digest.hexdigest
78
+ encrypt(digest)
79
+ end
80
+
81
+ def verify(sig, text)
82
+ @key.send("verify", OpenSSL::Digest::SHA1.new, Base64.decode64(sig), text)
83
+ end
84
+
85
+ def decrypt(text)
86
+ @key.send("#{key_type}_decrypt", Base64.decode64(text))
87
+ end
88
+
89
+ def private?
90
+ !@public
91
+ end
92
+
93
+ def public?
94
+ @public
95
+ end
96
+
97
+ def key_type
98
+ @public ? :public : :private
99
+ end
100
+ end
101
+
102
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper.rb'
2
+
3
+ describe "Crypto" do
4
+ it "should generate a private/public key pair" do
5
+ b=TestBed.new
6
+ c=b.run("Crypto")
7
+ c.getKey(:my).should be_an_instance_of(Crypto::Key)
8
+ b.stop
9
+ end
10
+ end
@@ -0,0 +1,107 @@
1
+ require 'crypt.rb'
2
+ require File.expand_path('../net_application.rb',__FILE__)
3
+
4
+ class DirectoryServiceApp<NetApplication
5
+
6
+ requires :fullNetworkNode
7
+ provides :directoryService
8
+
9
+ # this must be defined for the whole network in the same manner in order for the directory to work
10
+ # it defines on how many servers the information will be stored
11
+ REDUNDANCY=2
12
+
13
+ MAX_HOPS=5
14
+
15
+ def initialize(cluster,options)
16
+ super
17
+
18
+ @storage={}
19
+ end
20
+ def run
21
+
22
+ defApi :lookup, :registerRemote
23
+ provides :directoryService
24
+ super
25
+ end
26
+
27
+ # get the locally stored data
28
+ def locallyStored
29
+ @storage
30
+ end
31
+
32
+ def info
33
+ locallyStored
34
+ end
35
+
36
+ # store remote - don't use this function in your programs
37
+ def registerRemote(key,value)
38
+ ns=nodes(key)
39
+ log "registerRemote #{key} - #{value}"
40
+
41
+ if ns.member?(node.me)
42
+ @storage[key]=value
43
+ log "MATCHEESSSS!"
44
+ else
45
+ log "NOOOOO"
46
+ raise "NOOOOOOOOOOOOOOOOOOOO"
47
+ end
48
+ end
49
+ protected :registerRemote
50
+
51
+ def register(key,value)
52
+ #assert{nodeCount>0}
53
+ ns=nodes(key)
54
+ log ns
55
+ assert{ns.length>0}
56
+ ns.each{|curNode|
57
+ log "curNode:#{curNode} #{node.me}"
58
+ n=node(curNode)
59
+ log n
60
+ n.registerRemote(key,value)
61
+ }
62
+ end
63
+
64
+ def lookup(key,hops=nil)
65
+ hops||=0
66
+ hops+=1
67
+
68
+ return nil if hops>MAX_HOPS
69
+ return @storage[key].dup if @storage[key]
70
+ ns=nodes(key)
71
+ if ns.member?(node.me)
72
+ @storage[key]
73
+ else
74
+ nodes(key).each{|nodeId|
75
+ result=node(nodeId).lookup(key)
76
+ return result.dup if result
77
+ }
78
+ end
79
+ end
80
+
81
+ alias :get :lookup
82
+ alias :set :register
83
+
84
+ private
85
+
86
+ def myHash
87
+ hash(node.myNodeId)
88
+ end
89
+
90
+ def nodeCount
91
+ node.nodeList.length
92
+ end
93
+
94
+ def nodes(key,count=REDUNDANCY)
95
+ h=hash(key)
96
+ log "HASH #{key.inspect} - #{h.inspect}"
97
+ log node.knownNodes
98
+ ([node.me]+node.knownNodes).uniq.sort{|a,b|
99
+ hexDist(h,hash(a))<=>hexDist(h,hash(b))
100
+ }[0...count]
101
+ end
102
+
103
+ def hash(pNode)
104
+ [Crypt::digest(pNode.to_s)].pack("m")
105
+ end
106
+ end
107
+
@@ -0,0 +1,92 @@
1
+ ServiceId=Struct.new(:name)
2
+ class ServiceId
3
+ def hash
4
+ Crypt::digest(@name.to_s)
5
+ end
6
+ end
7
+
8
+ class ServiceDescriptor
9
+ attr_accessor :redundancy, :serviceId
10
+ end
11
+
12
+ # NetApplication is an application that runs on *every* node and provides some
13
+ # basic functionality like a directory service
14
+ class NetApplication<Application
15
+
16
+ class NotInitialized<Exception
17
+
18
+ end
19
+
20
+ class CouldNotInitialize<Exception
21
+
22
+ end
23
+
24
+ class RemoteNode
25
+ def initialize(myNode,remoteNode,app)
26
+ @myNode=myNode
27
+ @remoteNode=remoteNode
28
+ @app=app
29
+ assert{myNode}
30
+ assert{remoteNode}
31
+ end
32
+ def method_missing(*args)
33
+ @app.log "Trying to call"
34
+ @app.log "Trying to call #{@remoteNode} #{args.inspect}"
35
+ result=@myNode.send(@remoteNode,*args).wait
36
+ @app.log "Trying to called RESULT ",result
37
+ result
38
+ end
39
+ end
40
+
41
+ def initialize(cluster,options)
42
+ super
43
+ end
44
+
45
+ def waitForNodeCount(count)
46
+ while node.nodeList.length<count
47
+ sleep 1
48
+ end
49
+ end
50
+
51
+ def defApi(*array)
52
+ wait=10
53
+ wait.times{
54
+ break if node?
55
+ sleep 1
56
+ }
57
+ raise CouldNotInitialize unless node?
58
+ #return unless node?
59
+ this=self
60
+ log "setting hook #{getAppName}"
61
+ @service=node.api.hook(getAppName) do |*args|
62
+ log "PAPI:"
63
+ log args
64
+ name=args[0]
65
+ args=args[1..-1]
66
+ if array.member?(name)
67
+ this.send(name,*args)
68
+ end
69
+ end
70
+ end
71
+
72
+ def node?
73
+ if cluster
74
+ @node||=getApp(:fullNetworkNode)
75
+ end
76
+ @node
77
+ end
78
+
79
+ def node(nodeId=nil)
80
+ # log nodeId
81
+ node?
82
+ if nodeId.nil?
83
+ raise NotInitialized.new unless @node
84
+ return @node
85
+ end
86
+ RemoteNode.new(@service,nodeId,self)
87
+ end
88
+
89
+ def stop
90
+ @node.removeReceiver(getAppName) if @node
91
+ end
92
+ end
@@ -0,0 +1,36 @@
1
+
2
+ describe "ServiceDirectory" do
3
+ it_should_behave_like "AppSwarm Test"
4
+
5
+ it "should register a service" do
6
+ t=NetworkTestBed.new(10)
7
+ t.runOnOne("Master")
8
+ sleepDebug 0.2
9
+ t.run("UdpNetwork","DirectoryService")
10
+ loop do
11
+ incomplete=false
12
+ t.eachApp(:fullNetworkNode){|app|
13
+ incomplete=true if app.knownNodes.length<t.length
14
+ }
15
+ sleepDebug 2
16
+ break unless incomplete==true
17
+ end
18
+
19
+
20
+ pp "REGISTER","_________________________"
21
+ measureTime {
22
+ t.first(:directoryService).register(:hello,"HI")
23
+ }
24
+ pp "DONE REGISTERING"
25
+
26
+ found=false
27
+ t.eachApp(:directoryService){|app|
28
+ found=true if app.locallyStored.length > 0
29
+ }
30
+ found.should==true
31
+ t.stop
32
+
33
+ end
34
+
35
+
36
+ end
@@ -0,0 +1,3 @@
1
+ describe 'NetApplication' do
2
+
3
+ end
@@ -0,0 +1,52 @@
1
+ class GlobalApplication<Application
2
+ requires :fullNetworkNode
3
+ requires :directoryService
4
+
5
+ def initialize(cluster,options,name=nil)
6
+ super(cluster,options)
7
+
8
+ # register
9
+ @api=[]
10
+ @name=name
11
+ @offers=[]
12
+
13
+
14
+ end
15
+
16
+ def offer(atName)
17
+ @offers<<atName
18
+ getApp(:directoryService).set([:appNodes,atName],[@networkNode.me])
19
+ end
20
+ protected :offer
21
+
22
+ def run
23
+ log "SETTING APPNODES"
24
+ @networkNode=getApp(:fullNetworkNode)
25
+ assert { @networkNode }
26
+
27
+ # FIXME: 1) add only and 2) use secure (restricted storage)
28
+ assert { getApp(:directoryService) }
29
+ @networkNode.api.hook(:globalApp){|*call|
30
+ dispatch(call)
31
+ }
32
+ offer(@name) if @name
33
+ super
34
+ end
35
+
36
+ def dispatch(call)
37
+ return unless call.is_a?(Array)
38
+ log "DISPATCH",call,@name,@offers
39
+ if @offers.member?(call[0])
40
+ # FIXME: check api
41
+ log "CALLING #{call[1]} withs params #{((call[2..-1])).inspect}"
42
+ return self.send(call[1],*call[2])
43
+ end
44
+ puts "NO APP FOUND"
45
+ nil
46
+ end
47
+
48
+ protected
49
+ def api(funcName,description,args)
50
+
51
+ end
52
+ end