poolparty 0.2.69 → 0.2.84

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 (298) hide show
  1. data/Capfile +1 -0
  2. data/History.txt +6 -0
  3. data/Manifest.txt +140 -143
  4. data/PostInstall.txt +1 -1
  5. data/README.txt +2 -0
  6. data/bin/cloud-configure +5 -2
  7. data/bin/cloud-handle-load +3 -3
  8. data/bin/cloud-maintain +3 -3
  9. data/bin/cloud-provision +6 -5
  10. data/bin/cloud-rsync +28 -0
  11. data/bin/cloud-setup-dev +25 -0
  12. data/bin/cloud-spec +40 -0
  13. data/bin/cloud-start +5 -3
  14. data/bin/server-clean-cert-for +15 -0
  15. data/bin/server-rerun +0 -1
  16. data/bin/server-start-client +1 -1
  17. data/bin/server-start-master +1 -1
  18. data/bin/server-start-node +1 -1
  19. data/bin/server-update-hosts +4 -3
  20. data/bin/server-write-new-nodes +26 -0
  21. data/generators/poolspec/USAGE +2 -2
  22. data/generators/poolspec/poolspec_generator.rb +1 -1
  23. data/lib/erlang/messenger/Makefile +15 -0
  24. data/lib/erlang/messenger/ebin/client_app.beam +0 -0
  25. data/lib/erlang/messenger/ebin/client_server.beam +0 -0
  26. data/lib/erlang/messenger/ebin/erl_crash.dump +10326 -0
  27. data/lib/erlang/messenger/ebin/master_app.beam +0 -0
  28. data/lib/erlang/messenger/ebin/node_app.beam +0 -0
  29. data/lib/erlang/messenger/ebin/pm_client.beam +0 -0
  30. data/lib/erlang/messenger/ebin/pm_client_old.beam +0 -0
  31. data/lib/erlang/messenger/ebin/pm_client_supervisor.beam +0 -0
  32. data/lib/erlang/messenger/ebin/pm_cluster.beam +0 -0
  33. data/lib/erlang/messenger/ebin/pm_event_manager.beam +0 -0
  34. data/lib/erlang/messenger/ebin/pm_master.beam +0 -0
  35. data/lib/erlang/messenger/ebin/pm_master_event_handler.beam +0 -0
  36. data/lib/erlang/messenger/ebin/pm_master_supervisor.beam +0 -0
  37. data/lib/erlang/messenger/ebin/pm_node.beam +0 -0
  38. data/lib/erlang/messenger/ebin/pm_node_supervisor.beam +0 -0
  39. data/lib/erlang/messenger/ebin/pm_packager.beam +0 -0
  40. data/lib/erlang/messenger/ebin/pm_spawner.beam +0 -0
  41. data/lib/erlang/messenger/ebin/pm_strings.beam +0 -0
  42. data/lib/erlang/messenger/ebin/utils.beam +0 -0
  43. data/lib/erlang/messenger/lib/eunit/Makefile +28 -0
  44. data/lib/erlang/messenger/lib/eunit/ebin/autoload.beam +0 -0
  45. data/lib/erlang/messenger/lib/eunit/ebin/code_monitor.beam +0 -0
  46. data/lib/erlang/messenger/lib/eunit/ebin/eunit.beam +0 -0
  47. data/lib/erlang/messenger/lib/eunit/ebin/eunit_autoexport.beam +0 -0
  48. data/lib/erlang/messenger/lib/eunit/ebin/eunit_data.beam +0 -0
  49. data/lib/erlang/messenger/lib/eunit/ebin/eunit_lib.beam +0 -0
  50. data/lib/erlang/messenger/lib/eunit/ebin/eunit_proc.beam +0 -0
  51. data/lib/erlang/messenger/lib/eunit/ebin/eunit_serial.beam +0 -0
  52. data/lib/erlang/messenger/lib/eunit/ebin/eunit_server.beam +0 -0
  53. data/lib/erlang/messenger/lib/eunit/ebin/eunit_striptests.beam +0 -0
  54. data/lib/erlang/messenger/lib/eunit/ebin/eunit_test.beam +0 -0
  55. data/lib/erlang/messenger/lib/eunit/ebin/eunit_tests.beam +0 -0
  56. data/lib/erlang/messenger/lib/eunit/ebin/eunit_tty.beam +0 -0
  57. data/lib/erlang/messenger/lib/eunit/ebin/file_monitor.beam +0 -0
  58. data/lib/erlang/messenger/lib/eunit/src/Makefile +46 -0
  59. data/lib/erlang/messenger/src/pm_master.erl +5 -0
  60. data/lib/erlang/messenger/src/pm_node.erl +2 -3
  61. data/lib/erlang/messenger/src/pm_spawner.erl +213 -0
  62. data/lib/poolparty/base_packages/heartbeat.rb +57 -43
  63. data/lib/poolparty/base_packages/poolparty.rb +18 -15
  64. data/lib/poolparty/capistrano.rb +18 -0
  65. data/lib/poolparty/core/class.rb +24 -0
  66. data/lib/poolparty/core/kernel.rb +7 -0
  67. data/lib/poolparty/core/module.rb +2 -2
  68. data/lib/poolparty/core/string.rb +1 -1
  69. data/lib/poolparty/dependency_resolutions/puppet.rb +10 -2
  70. data/lib/poolparty/exceptions/ProvisionerException.rb +5 -0
  71. data/lib/poolparty/extra/deployments.rb +31 -0
  72. data/lib/poolparty/helpers/binary.rb +14 -2
  73. data/lib/poolparty/helpers/optioner.rb +61 -22
  74. data/lib/poolparty/helpers/ruberl.rb +33 -0
  75. data/lib/poolparty/modules/cloud_dsl.rb +2 -1
  76. data/lib/poolparty/modules/cloud_resourcer.rb +30 -6
  77. data/lib/poolparty/modules/configurable.rb +2 -0
  78. data/lib/poolparty/modules/file_writer.rb +4 -4
  79. data/lib/poolparty/modules/resourcing_dsl.rb +5 -5
  80. data/lib/poolparty/monitors/base_monitor.rb +1 -1
  81. data/lib/poolparty/monitors/monitors/cpu_monitor.rb +2 -2
  82. data/lib/poolparty/net/messenger.rb +1 -1
  83. data/lib/poolparty/net/remote.rb +2 -2
  84. data/lib/poolparty/net/remote_bases/ec2.rb +51 -11
  85. data/lib/poolparty/net/remote_instance.rb +7 -3
  86. data/lib/poolparty/net/remoter.rb +72 -24
  87. data/lib/poolparty/net/remoter_base.rb +10 -0
  88. data/lib/poolparty/plugins/deploydirectory.rb +10 -5
  89. data/lib/poolparty/plugins/git.rb +51 -0
  90. data/lib/poolparty/{pool → poolparty}/base.rb +4 -2
  91. data/lib/poolparty/{pool → poolparty}/cloud.rb +32 -10
  92. data/lib/poolparty/{pool → poolparty}/plugin_model.rb +4 -4
  93. data/lib/poolparty/{pool → poolparty}/pool.rb +2 -2
  94. data/lib/poolparty/{pool → poolparty}/resource.rb +33 -15
  95. data/lib/poolparty/{pool → poolparty}/resources/class_package.rb +3 -3
  96. data/lib/poolparty/{pool → poolparty}/resources/directory.rb +6 -3
  97. data/lib/poolparty/{pool → poolparty}/resources/exec.rb +2 -5
  98. data/lib/poolparty/{pool → poolparty}/resources/file.rb +3 -3
  99. data/lib/poolparty/{pool → poolparty}/resources/package.rb +1 -1
  100. data/lib/poolparty/{pool → poolparty}/resources/remote_file.rb +1 -1
  101. data/lib/poolparty/poolparty/resources/remote_user.rb +17 -0
  102. data/lib/poolparty/{pool → poolparty}/resources/sshkey.rb +5 -1
  103. data/lib/poolparty/{pool → poolparty}/script.rb +1 -1
  104. data/lib/poolparty/provisioners/capistrano/capistrano.rb +127 -0
  105. data/lib/poolparty/provisioners/capistrano/capistrano_configurer.rb +58 -0
  106. data/lib/poolparty/provisioners/capistrano/recipies/base.rb +104 -0
  107. data/lib/poolparty/provisioners/capistrano/recipies/master.rb +121 -0
  108. data/lib/poolparty/provisioners/capistrano/recipies/slave.rb +12 -0
  109. data/lib/poolparty/provisioners/provisioner_base.rb +204 -0
  110. data/lib/poolparty/spec/core/string.rb +16 -0
  111. data/lib/poolparty/spec/matchers/a_spec_extensions_base.rb +26 -0
  112. data/lib/poolparty/spec/matchers/have_cron.rb +28 -0
  113. data/lib/poolparty/spec/matchers/have_deploydirectory.rb +15 -0
  114. data/lib/poolparty/spec/matchers/have_directory.rb +31 -0
  115. data/lib/poolparty/spec/matchers/have_exec.rb +28 -0
  116. data/lib/poolparty/spec/matchers/have_file.rb +28 -0
  117. data/lib/poolparty/spec/matchers/have_gempackage.rb +28 -0
  118. data/lib/poolparty/spec/matchers/have_git.rb +28 -0
  119. data/lib/poolparty/spec/matchers/have_host.rb +28 -0
  120. data/lib/poolparty/spec/matchers/have_mount.rb +28 -0
  121. data/lib/poolparty/spec/matchers/have_package.rb +28 -0
  122. data/lib/poolparty/spec/matchers/have_remotefile.rb +28 -0
  123. data/lib/poolparty/spec/matchers/have_rsyncmirror.rb +28 -0
  124. data/lib/poolparty/spec/matchers/have_service.rb +28 -0
  125. data/lib/poolparty/spec/matchers/have_sshkey.rb +28 -0
  126. data/lib/poolparty/spec/matchers/have_symlink.rb +28 -0
  127. data/lib/poolparty/spec/matchers/have_variable.rb +32 -0
  128. data/lib/poolparty/spec/spec/dynamic_matchers.rb +63 -0
  129. data/lib/poolparty/spec/spec/ensure_matchers_exist.rb +7 -0
  130. data/lib/poolparty/spec/templates/have_base.rb +28 -0
  131. data/lib/poolparty/templates/authkeys +1 -1
  132. data/lib/poolparty/templates/gem +12 -10
  133. data/lib/poolparty/templates/ha.cf +9 -11
  134. data/lib/poolparty/templates/haresources +1 -1
  135. data/lib/poolparty/templates/logd.cf +42 -0
  136. data/lib/poolparty/templates/puppet.conf +18 -8
  137. data/lib/poolparty/templates/puppetcleaner +9 -3
  138. data/lib/poolparty/templates/puppetrerun +16 -3
  139. data/lib/poolparty/templates/puppetrunner +1 -1
  140. data/lib/poolparty/version.rb +1 -1
  141. data/lib/poolparty.rb +12 -8
  142. data/lib/poolpartyspec.rb +34 -0
  143. data/poolparty.gemspec +151 -149
  144. data/spec/poolparty/aska/aska_spec.rb +0 -5
  145. data/spec/poolparty/bin/console_spec.rb +3 -0
  146. data/spec/poolparty/extra/deployments_spec.rb +64 -0
  147. data/spec/poolparty/helpers/binary_spec.rb +1 -1
  148. data/spec/poolparty/helpers/optioner_spec.rb +17 -4
  149. data/spec/poolparty/modules/cloud_resourcer_spec.rb +19 -2
  150. data/spec/poolparty/modules/configurable_spec.rb +2 -2
  151. data/spec/poolparty/net/remote_bases/ec2_spec.rb +5 -2
  152. data/spec/poolparty/net/remote_instance_spec.rb +5 -0
  153. data/spec/poolparty/net/remote_spec.rb +24 -31
  154. data/spec/poolparty/net/remoter_base_spec.rb +11 -6
  155. data/spec/poolparty/net/remoter_spec.rb +55 -27
  156. data/spec/poolparty/plugins/deploydirectory_spec.rb +1 -0
  157. data/spec/poolparty/plugins/git_spec.rb +45 -0
  158. data/spec/poolparty/{pool → poolparty}/cloud_spec.rb +41 -0
  159. data/spec/poolparty/{pool → poolparty}/plugin_spec.rb +1 -1
  160. data/spec/poolparty/{pool → poolparty}/pool_spec.rb +1 -1
  161. data/spec/poolparty/{pool → poolparty}/resource_spec.rb +15 -2
  162. data/spec/poolparty/poolparty/resources/user_spec.rb +38 -0
  163. data/spec/poolparty/poolparty/test_plugins/virtual_host_template.erb +0 -0
  164. data/spec/poolparty/poolparty_spec.rb +1 -1
  165. data/spec/poolparty/provisioners/capistrano/capistrano_spec.rb +27 -0
  166. data/spec/poolparty/provisioners/provisioner_base_spec.rb +120 -0
  167. data/spec/poolparty/spec/core/string_spec.rb +57 -0
  168. data/spec/poolparty/spec_helper.rb +48 -6
  169. data/tasks/deployment.rake +3 -5
  170. data/tasks/spec.rake +2 -3
  171. data/website/index.html +2 -2
  172. metadata +150 -148
  173. data/lib/erlang/messenger/lib/eunit/.svn/all-wcprops +0 -53
  174. data/lib/erlang/messenger/lib/eunit/.svn/entries +0 -140
  175. data/lib/erlang/messenger/lib/eunit/.svn/format +0 -1
  176. data/lib/erlang/messenger/lib/eunit/.svn/prop-base/NOTES.svn-base +0 -5
  177. data/lib/erlang/messenger/lib/eunit/.svn/text-base/AUTHORS.svn-base +0 -2
  178. data/lib/erlang/messenger/lib/eunit/.svn/text-base/CHANGELOG.svn-base +0 -14
  179. data/lib/erlang/messenger/lib/eunit/.svn/text-base/COPYING.svn-base +0 -504
  180. data/lib/erlang/messenger/lib/eunit/.svn/text-base/NOTES.svn-base +0 -276
  181. data/lib/erlang/messenger/lib/eunit/.svn/text-base/README.svn-base +0 -3
  182. data/lib/erlang/messenger/lib/eunit/.svn/text-base/sys.config.svn-base +0 -9
  183. data/lib/erlang/messenger/lib/eunit/.svn/text-base/vsn.mk.svn-base +0 -1
  184. data/lib/erlang/messenger/lib/eunit/doc/.svn/all-wcprops +0 -59
  185. data/lib/erlang/messenger/lib/eunit/doc/.svn/entries +0 -142
  186. data/lib/erlang/messenger/lib/eunit/doc/.svn/format +0 -1
  187. data/lib/erlang/messenger/lib/eunit/doc/.svn/prop-base/erlang.png.svn-base +0 -5
  188. data/lib/erlang/messenger/lib/eunit/doc/.svn/prop-base/eunit.html.svn-base +0 -5
  189. data/lib/erlang/messenger/lib/eunit/doc/.svn/prop-base/index.html.svn-base +0 -5
  190. data/lib/erlang/messenger/lib/eunit/doc/.svn/prop-base/modules-frame.html.svn-base +0 -5
  191. data/lib/erlang/messenger/lib/eunit/doc/.svn/prop-base/overview-summary.html.svn-base +0 -5
  192. data/lib/erlang/messenger/lib/eunit/doc/.svn/prop-base/packages-frame.html.svn-base +0 -5
  193. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/edoc-info.svn-base +0 -3
  194. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/erlang.png.svn-base +0 -0
  195. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/eunit.html.svn-base +0 -172
  196. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/index.html.svn-base +0 -17
  197. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/modules-frame.html.svn-base +0 -12
  198. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/overview-summary.html.svn-base +0 -984
  199. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/overview.edoc.svn-base +0 -980
  200. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/packages-frame.html.svn-base +0 -11
  201. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/stylesheet.css.svn-base +0 -55
  202. data/lib/erlang/messenger/lib/eunit/ebin/.svn/all-wcprops +0 -5
  203. data/lib/erlang/messenger/lib/eunit/ebin/.svn/dir-prop-base +0 -8
  204. data/lib/erlang/messenger/lib/eunit/ebin/.svn/entries +0 -28
  205. data/lib/erlang/messenger/lib/eunit/ebin/.svn/format +0 -1
  206. data/lib/erlang/messenger/lib/eunit/examples/.svn/all-wcprops +0 -23
  207. data/lib/erlang/messenger/lib/eunit/examples/.svn/entries +0 -66
  208. data/lib/erlang/messenger/lib/eunit/examples/.svn/format +0 -1
  209. data/lib/erlang/messenger/lib/eunit/examples/.svn/prop-base/eunit_examples.erl.svn-base +0 -5
  210. data/lib/erlang/messenger/lib/eunit/examples/.svn/prop-base/fib.erl.svn-base +0 -5
  211. data/lib/erlang/messenger/lib/eunit/examples/.svn/text-base/eunit_examples.erl.svn-base +0 -339
  212. data/lib/erlang/messenger/lib/eunit/examples/.svn/text-base/fib.erl.svn-base +0 -19
  213. data/lib/erlang/messenger/lib/eunit/examples/.svn/text-base/tests.txt.svn-base +0 -1
  214. data/lib/erlang/messenger/lib/eunit/include/.svn/all-wcprops +0 -11
  215. data/lib/erlang/messenger/lib/eunit/include/.svn/entries +0 -41
  216. data/lib/erlang/messenger/lib/eunit/include/.svn/format +0 -1
  217. data/lib/erlang/messenger/lib/eunit/include/.svn/prop-base/eunit.hrl.svn-base +0 -5
  218. data/lib/erlang/messenger/lib/eunit/include/.svn/text-base/eunit.hrl.svn-base +0 -313
  219. data/lib/erlang/messenger/lib/eunit/src/.svn/all-wcprops +0 -113
  220. data/lib/erlang/messenger/lib/eunit/src/.svn/entries +0 -259
  221. data/lib/erlang/messenger/lib/eunit/src/.svn/format +0 -1
  222. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/autoload.erl.svn-base +0 -5
  223. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/code_monitor.erl.svn-base +0 -5
  224. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit.erl.svn-base +0 -5
  225. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_autoexport.erl.svn-base +0 -5
  226. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_data.erl.svn-base +0 -5
  227. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_internal.hrl.svn-base +0 -5
  228. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_lib.erl.svn-base +0 -5
  229. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_proc.erl.svn-base +0 -5
  230. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_serial.erl.svn-base +0 -5
  231. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_server.erl.svn-base +0 -5
  232. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_striptests.erl.svn-base +0 -5
  233. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_test.erl.svn-base +0 -5
  234. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_tests.erl.svn-base +0 -5
  235. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_tty.erl.svn-base +0 -5
  236. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/file_monitor.erl.svn-base +0 -5
  237. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/autoload.erl.svn-base +0 -388
  238. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/code_monitor.erl.svn-base +0 -243
  239. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit.app.src.svn-base +0 -21
  240. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit.appup.src.svn-base +0 -1
  241. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit.erl.svn-base +0 -196
  242. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_autoexport.erl.svn-base +0 -102
  243. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_data.erl.svn-base +0 -798
  244. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_internal.hrl.svn-base +0 -48
  245. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_lib.erl.svn-base +0 -682
  246. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_proc.erl.svn-base +0 -552
  247. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_serial.erl.svn-base +0 -157
  248. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_server.erl.svn-base +0 -340
  249. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_striptests.erl.svn-base +0 -64
  250. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_test.erl.svn-base +0 -334
  251. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_tests.erl.svn-base +0 -45
  252. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_tty.erl.svn-base +0 -272
  253. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/file_monitor.erl.svn-base +0 -409
  254. data/lib/erlang/messenger/src/pm_client_old.erl +0 -52
  255. data/lib/poolparty/helpers/provisioner_base.rb +0 -346
  256. data/lib/poolparty/helpers/provisioners/master.rb +0 -205
  257. data/lib/poolparty/helpers/provisioners/slave.rb +0 -64
  258. data/spec/poolparty/helpers/provisioner_base_spec.rb +0 -134
  259. data/spec/poolparty/helpers/provisioners/master_spec.rb +0 -54
  260. data/spec/poolparty/helpers/provisioners/slave_spec.rb +0 -28
  261. /data/lib/poolparty/{pool → poolparty}/custom_resource.rb +0 -0
  262. /data/lib/poolparty/{pool → poolparty}/loggable.rb +0 -0
  263. /data/lib/poolparty/{pool → poolparty}/plugin.rb +0 -0
  264. /data/lib/poolparty/{pool → poolparty}/resources/conditional.rb +0 -0
  265. /data/lib/poolparty/{pool → poolparty}/resources/cron.rb +0 -0
  266. /data/lib/poolparty/{pool → poolparty}/resources/custom_service.rb +0 -0
  267. /data/lib/poolparty/{pool → poolparty}/resources/gem_package.rb +0 -0
  268. /data/lib/poolparty/{pool → poolparty}/resources/host.rb +0 -0
  269. /data/lib/poolparty/{pool → poolparty}/resources/mount.rb +0 -0
  270. /data/lib/poolparty/{pool → poolparty}/resources/service.rb +0 -0
  271. /data/lib/poolparty/{pool → poolparty}/resources/symlink.rb +0 -0
  272. /data/lib/poolparty/{pool → poolparty}/resources/variable.rb +0 -0
  273. /data/log/{pool.logs → pool.log} +0 -0
  274. /data/spec/poolparty/{pool/test_plugins/virtual_host_template.erb → net/log/pool.log} +0 -0
  275. /data/spec/poolparty/{pool → poolparty}/base_spec.rb +0 -0
  276. /data/spec/poolparty/{pool → poolparty}/configurers/files/ruby_basic.rb +0 -0
  277. /data/spec/poolparty/{pool → poolparty}/configurers/files/ruby_plugins.rb +0 -0
  278. /data/spec/poolparty/{pool → poolparty}/configurers/ruby_spec.rb +0 -0
  279. /data/spec/poolparty/{pool → poolparty}/custom_resource_spec.rb +0 -0
  280. /data/spec/poolparty/{pool → poolparty}/example_spec.rb +0 -0
  281. /data/spec/poolparty/{pool → poolparty}/plugin_model_spec.rb +0 -0
  282. /data/spec/poolparty/{pool → poolparty}/resources/class_package_spec.rb +0 -0
  283. /data/spec/poolparty/{pool → poolparty}/resources/conditional_spec.rb +0 -0
  284. /data/spec/poolparty/{pool → poolparty}/resources/cron_spec.rb +0 -0
  285. /data/spec/poolparty/{pool → poolparty}/resources/directory_spec.rb +0 -0
  286. /data/spec/poolparty/{pool → poolparty}/resources/exec_spec.rb +0 -0
  287. /data/spec/poolparty/{pool → poolparty}/resources/file_spec.rb +0 -0
  288. /data/spec/poolparty/{pool → poolparty}/resources/gem_spec.rb +0 -0
  289. /data/spec/poolparty/{pool → poolparty}/resources/host_spec.rb +0 -0
  290. /data/spec/poolparty/{pool → poolparty}/resources/package_spec.rb +0 -0
  291. /data/spec/poolparty/{pool → poolparty}/resources/remote_file_spec.rb +0 -0
  292. /data/spec/poolparty/{pool → poolparty}/resources/service_spec.rb +0 -0
  293. /data/spec/poolparty/{pool → poolparty}/resources/sshkey_spec.rb +0 -0
  294. /data/spec/poolparty/{pool → poolparty}/resources/symlink_spec.rb +0 -0
  295. /data/spec/poolparty/{pool → poolparty}/resources/variable_spec.rb +0 -0
  296. /data/spec/poolparty/{pool → poolparty}/script_spec.rb +0 -0
  297. /data/spec/poolparty/{pool → poolparty}/test_plugins/sshkey_test +0 -0
  298. /data/spec/poolparty/{pool → poolparty}/test_plugins/webserver.rb +0 -0
@@ -1,5 +0,0 @@
1
- K 12
2
- svn:keywords
3
- V 31
4
- Date Author Id Revision HeadURL
5
- END
@@ -1,5 +0,0 @@
1
- K 12
2
- svn:keywords
3
- V 31
4
- Date Author Id Revision HeadURL
5
- END
@@ -1,5 +0,0 @@
1
- K 12
2
- svn:keywords
3
- V 31
4
- Date Author Id Revision HeadURL
5
- END
@@ -1,5 +0,0 @@
1
- K 12
2
- svn:keywords
3
- V 31
4
- Date Author Id Revision HeadURL
5
- END
@@ -1,5 +0,0 @@
1
- K 12
2
- svn:keywords
3
- V 31
4
- Date Author Id Revision HeadURL
5
- END
@@ -1,5 +0,0 @@
1
- K 12
2
- svn:keywords
3
- V 31
4
- Date Author Id Revision HeadURL
5
- END
@@ -1,5 +0,0 @@
1
- K 12
2
- svn:keywords
3
- V 31
4
- Date Author Id Revision HeadURL
5
- END
@@ -1,5 +0,0 @@
1
- K 12
2
- svn:keywords
3
- V 31
4
- Date Author Id Revision HeadURL
5
- END
@@ -1,5 +0,0 @@
1
- K 12
2
- svn:keywords
3
- V 31
4
- Date Author Id Revision HeadURL
5
- END
@@ -1,5 +0,0 @@
1
- K 12
2
- svn:keywords
3
- V 31
4
- Date Author Id Revision HeadURL
5
- END
@@ -1,388 +0,0 @@
1
- %% This library is free software; you can redistribute it and/or modify
2
- %% it under the terms of the GNU Lesser General Public License as
3
- %% published by the Free Software Foundation; either version 2 of the
4
- %% License, or (at your option) any later version.
5
- %%
6
- %% This library is distributed in the hope that it will be useful, but
7
- %% WITHOUT ANY WARRANTY; without even the implied warranty of
8
- %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9
- %% Lesser General Public License for more details.
10
- %%
11
- %% You should have received a copy of the GNU Lesser General Public
12
- %% License along with this library; if not, write to the Free Software
13
- %% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
14
- %% USA
15
- %%
16
- %% $Id:$
17
- %%
18
- %% @private (for now)
19
- %% @author Richard Carlsson <richardc@it.uu.se>
20
- %% @copyright 2006 Richard Carlsson
21
- %% @doc Erlang automatic code loading service
22
-
23
- -module(autoload).
24
-
25
- -export([start/0, start/1, stop/0, stop/1,
26
- watch_module/1, watch_module/2, watch_module/3,
27
- watch_file/1, watch_file/2, watch_file/3,
28
- watch_dir/1, watch_dir/2, watch_dir/3
29
- ]).
30
-
31
- -include_lib("kernel/include/file.hrl").
32
-
33
- -define(SERVER, autoload).
34
- -define(ZERO_TIMESTAMP, {0,0,0}).
35
-
36
- %% TODO: un-watching functionality
37
-
38
- %% We're not trying to provide strong guarantees here. The autoloader is
39
- %% supposed to behave like a human assistant might - race conditions may
40
- %% cause modules to be reloaded twice, or cause a reload from the wrong
41
- %% file (if paths are suddenly changed).
42
-
43
-
44
- watch_dir(Path) ->
45
- watch_dir(Path, []).
46
-
47
- watch_dir(Path, Opts) ->
48
- watch_dir(?SERVER, Path, Opts).
49
-
50
- watch_dir(Server, Path, Opts) ->
51
- command(Server, {watch, {dir, filename:flatten(Path)}, Opts}).
52
-
53
- watch_file(Path) ->
54
- watch_file(Path, []).
55
-
56
- watch_file(Path, Opts) ->
57
- watch_file(?SERVER, Path, Opts).
58
-
59
- watch_file(Server, Path, Opts) ->
60
- command(Server, {watch, {file, filename:flatten(Path)}, Opts}).
61
-
62
- watch_module(Module) ->
63
- watch_module(Module, []).
64
-
65
- watch_module(Module, Opts) ->
66
- watch_module(?SERVER, Module, Opts).
67
-
68
- watch_module(Server, Module, Opts) when is_atom(Module) ->
69
- command(Server, {watch, {module, Module}, Opts}).
70
-
71
-
72
- command(Server, Msg) ->
73
- ServerPid = ensure_started(Server),
74
- ServerPid ! {command, self(), Msg},
75
- receive
76
- {ServerPid, Result} -> Result
77
- end.
78
-
79
- stop() ->
80
- stop(?SERVER).
81
-
82
- stop(Server) ->
83
- Server ! stop,
84
- ok.
85
-
86
- ensure_started(Name) when is_atom(Name) ->
87
- start(Name);
88
- ensure_started(Pid) when is_pid(Pid) ->
89
- Pid.
90
-
91
-
92
- start() ->
93
- start(?SERVER).
94
-
95
- start(Name) ->
96
- case whereis(Name) of
97
- undefined ->
98
- Parent = self(),
99
- Pid = spawn(fun () -> server_init(Name, Parent) end),
100
- receive
101
- {Pid, ok} -> Pid;
102
- {Pid, error} -> throw(no_server)
103
- end;
104
- Pid -> Pid
105
- end.
106
-
107
- -record(state, {name, modules, files, dirs}).
108
-
109
- -record(module, {time = ?ZERO_TIMESTAMP, file, opts = []}).
110
-
111
- server_init(Name, Parent) ->
112
- Self = self(),
113
- case catch register(Name, Self) of
114
- true ->
115
- Parent ! {Self, ok},
116
- code_monitor:monitor(self()),
117
- server(#state{name = Name,
118
- modules = dict:new(),
119
- files = dict:new(),
120
- dirs = dict:new()});
121
- _ ->
122
- init_failure(Parent)
123
- end.
124
-
125
- init_failure(Parent) ->
126
- Parent ! {self(), error},
127
- exit(failed).
128
-
129
- server(St) ->
130
- receive
131
- {file_monitor, _Ref, Msg} ->
132
- file_event(Msg, St);
133
- {code_monitor, Msg} ->
134
- code_event(Msg, St);
135
- {command, From, Cmd} ->
136
- server_command(From, Cmd, St);
137
- stop ->
138
- exit(normal);
139
- Msg ->
140
- erlang:display({autoload_unexpected, Msg}),
141
- server(St)
142
- end.
143
-
144
- server_command_reply(From, Msg) ->
145
- From ! {self(), Msg}.
146
-
147
- server_command(From, {watch, {dir, Path}, Opts}, St) ->
148
- server_command_reply(From, ok),
149
- server(monitor_dir(Path, Opts, St));
150
- server_command(From, {watch, {file, Path}, Opts}, St) ->
151
- server_command_reply(From, ok),
152
- server(monitor_file(Path, Opts, St));
153
- server_command(From, {watch, {module, M}, Opts}, St) ->
154
- server_command_reply(From, ok),
155
- server(monitor_module(M, Opts, St)).
156
-
157
- file_event({exists, Path, dir, _Info, Files}, St) ->
158
- %%erlang:display({autoload_saw_exists, dir, Path}),
159
- server(monitor_objs(Path, Files, St));
160
- file_event({exists, Path, file, Info, _}, St) ->
161
- %%erlang:display({autoload_saw_exists, file, Path}),
162
- %% treat file-exists messages just like file-changed messages
163
- server(changed_file(Path, Info#file_info.mtime, St));
164
- file_event({changed, Path, dir, _Info, Files}, St) ->
165
- %%erlang:display({autoload_saw_changed, dir, Path}),
166
- server(monitor_objs(Path, Files, St));
167
- file_event({changed, Path, file, #file_info{}=Info, _}, St) ->
168
- %%erlang:display({autoload_saw_changed, file, Path}),
169
- server(changed_file(Path, Info#file_info.mtime, St));
170
- file_event({error, _Path, file, _ErrorAtom}=_Msg, St) ->
171
- %%erlang:display({autoload_ignoring, _Msg}),
172
- %% just consider the files as being temporarily unavailable
173
- server(St);
174
- file_event(_Msg, St) ->
175
- erlang:display({autoload_unexpected_file_event, _Msg}),
176
- server(St).
177
-
178
- code_event({loaded, M, Time}, St) ->
179
- %%erlang:display({autoload_saw_loaded, M, Time}),
180
- server(loaded_module(M, Time, St));
181
- code_event(_Msg, St) ->
182
- erlang:display({autoload_unexpected_code_event, _Msg}),
183
- server(St).
184
-
185
-
186
- %% called when asked to watch a module M
187
-
188
- monitor_module(M, Opts, St) ->
189
- ensure_loaded(M, "", Opts),
190
- case code:which(M) of
191
- non_existing ->
192
- %% no module loaded or found in path (e.g., the user has not
193
- %% run 'make' yet, or has not updated the path): store
194
- %% mapping from M to undefined file, for late binding
195
- store_record(M, #module{opts = Opts}, St);
196
- File when is_list(File) ->
197
- %% existing file found (already loaded or in path): monitor
198
- %% the file and map M to that file (even if the first load
199
- %% might turn out to be from another file)
200
- store_record(M, #module{file = File},
201
- monitor_file(File, Opts, St));
202
- _ ->
203
- %% preloaded or cover-compiled module - ignore
204
- St
205
- end.
206
-
207
- %% called when a monitored directory is detected as new or changed
208
-
209
- monitor_objs(Path, Files, St) ->
210
- Opts = get_dir_opts(Path, St),
211
- ObjExt = file:objfile_extension(),
212
- Objs = [F || {added, F} <- Files, filename:extension(F) == ObjExt],
213
- lists:foldl(
214
- fun (F, St) ->
215
- F1 = filename:absname(filename:join(Path, F)),
216
- %%erlang:display({autoload_monitoring, file, F1}),
217
- monitor_file(F1, Opts, St)
218
- end,
219
- St,
220
- Objs).
221
-
222
- get_dir_opts(Path, St) ->
223
- case dict:find(Path, St#state.dirs) of
224
- {ok, {_Ref, Opts}} -> Opts;
225
- error -> []
226
- end.
227
-
228
- %% called when a module was detected as loaded or reloaded (either
229
- %% caused by an auto-load or by someone else)
230
-
231
- loaded_module(M, Time, St) ->
232
- case find_record(M, St) of
233
- {ok, R} ->
234
- File = code:which(M),
235
- case R#module.file of
236
- undefined when is_list(File) ->
237
- %% a watched module gets a late binding to a file
238
- %%erlang:display({autoload_late_binding, M, File}),
239
- Opts = R#module.opts,
240
- update_record(M, R, Time, File,
241
- monitor_file(File, Opts, St));
242
- File when is_list(File) ->
243
- %% loaded from watched file - update the load time
244
- update_record(M, R, Time, File, St);
245
- _ ->
246
- St %% not loaded from the watched file
247
- end;
248
- error ->
249
- St %% uninteresting module
250
- end.
251
-
252
-
253
- %% called whenever a file has changed and exists
254
-
255
- changed_file(File, Time, St) ->
256
- %% always reread the module name from the file
257
- case obj_module(File) of
258
- {module, M} ->
259
- case find_record(M, St) of
260
- {ok, R} ->
261
- check_reload(M, File, Time, R),
262
- St;
263
- error ->
264
- %% first time we see this module: map to file
265
- %% and don't try to reload
266
- R = #module{file = File},
267
- store_record(M, R, St)
268
- end;
269
- error ->
270
- St %% bad file - ignore until changed again
271
- end.
272
-
273
-
274
- %% check if a module needs to be reloaded, when its file has changed
275
-
276
- check_reload(M, File, Time, R) ->
277
- %%erlang:display({autoload_checking, M, File, Time, R}),
278
- case ((R#module.file == File)
279
- andalso is_loaded(M)
280
- andalso (code:which(M) == File)
281
- andalso is_newer(Time, R#module.time))
282
- of
283
- true ->
284
- reload(M);
285
- false ->
286
- ok
287
- end.
288
-
289
-
290
- reload(M) ->
291
- erlang:display({autoload_loading, M}),
292
- code:purge(M),
293
- code:load_file(M).
294
-
295
- update_record(M, R, Time, File, St) ->
296
- store_record(M, R#module{time = Time, file = File}, St).
297
-
298
- find_record(M, St) ->
299
- dict:find(M, St#state.modules).
300
-
301
- store_record(M, R, St) ->
302
- St#state{modules = dict:store(M, R, St#state.modules)}.
303
-
304
- %% we must remember watched files/dirs, so we don't set up more than one
305
- %% file monitor for the same path, and so we can cancel monitors; for
306
- %% dirs, we also remember options
307
-
308
- monitor_file(Path, Opts, St) ->
309
- ensure_loaded([], Path, Opts),
310
- case dict:is_key(Path, St#state.files) of
311
- true ->
312
- %%erlang:display({autoload_already_watching, Path}),
313
- St;
314
- false ->
315
- {ok, _, Ref} = file_monitor:monitor_file(Path, self()),
316
- St#state{files = dict:store(Path, Ref, St#state.files)}
317
- end.
318
-
319
- monitor_dir(Path, Opts, St) ->
320
- case dict:is_key(Path, St#state.dirs) of
321
- true ->
322
- %%erlang:display({autoload_already_watching, Path}),
323
- St;
324
- false ->
325
- {ok, _, Ref} = file_monitor:monitor_dir(Path, self()),
326
- St#state{dirs = dict:store(Path, {Ref, Opts},
327
- St#state.dirs)}
328
- end.
329
-
330
- %% try to ensure that a module/file is loaded (M is [] if unknown;
331
- %% File is "" if unknown)
332
-
333
- ensure_loaded(M, File, Opts) ->
334
- case proplists:get_bool(load, Opts) of
335
- true when is_atom(M) ->
336
- ensure_loaded_1(M, File); %% known module name
337
- true when M == [] ->
338
- case obj_module(File) of
339
- {module, Module} ->
340
- ensure_loaded_1(Module, File);
341
- error ->
342
- ok %% couldn't load
343
- end;
344
- false -> ok
345
- end.
346
-
347
- ensure_loaded_1(M, File) ->
348
- %% always try to load using the path first
349
- case code:ensure_loaded(M) of
350
- {module, _} ->
351
- ok;
352
- {error, _} when File == [] ->
353
- ok; %% ignore error
354
- {error, _} ->
355
- %% try loading directly from the file
356
- code:load_abs(File) %% ignore result
357
- end.
358
-
359
- %% find name of module stored in an object file
360
-
361
- obj_module(File) ->
362
- case beam_lib:info(File) of
363
- List when is_list(List) ->
364
- case lists:keysearch(module, 1, List) of
365
- {value, {module, M}} ->
366
- {module, M};
367
- _ ->
368
- error
369
- end;
370
- _ ->
371
- error
372
- end.
373
-
374
- %% check if the file timestamp (on DateTime format) is newer than
375
- %% the module load-time (on Now-format)
376
-
377
- is_newer(DateTime, LoadTime) ->
378
- calendar:datetime_to_gregorian_seconds(DateTime) >
379
- calendar:datetime_to_gregorian_seconds(
380
- calendar:now_to_local_time(LoadTime)).
381
-
382
- %% wrapper for code:is_loaded/1
383
-
384
- is_loaded(Module) ->
385
- case code:is_loaded(Module) of
386
- {file, _} -> true;
387
- false -> false
388
- end.
@@ -1,243 +0,0 @@
1
- %% This library is free software; you can redistribute it and/or modify
2
- %% it under the terms of the GNU Lesser General Public License as
3
- %% published by the Free Software Foundation; either version 2 of the
4
- %% License, or (at your option) any later version.
5
- %%
6
- %% This library is distributed in the hope that it will be useful, but
7
- %% WITHOUT ANY WARRANTY; without even the implied warranty of
8
- %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9
- %% Lesser General Public License for more details.
10
- %%
11
- %% You should have received a copy of the GNU Lesser General Public
12
- %% License along with this library; if not, write to the Free Software
13
- %% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
14
- %% USA
15
- %%
16
- %% $Id:$
17
- %%
18
- %% @private (for now)
19
- %% @author Richard Carlsson <richardc@it.uu.se>
20
- %% @copyright 2006 Richard Carlsson
21
- %% @doc Erlang code monitoring service
22
-
23
- -module(code_monitor).
24
-
25
- -export([start/0, start/1, stop/0, stop/1, monitor/1, monitor/2,
26
- demonitor/1, demonitor/2, install_codespy/1, wiretap/3]).
27
-
28
- -export([main/1]). %% private
29
-
30
-
31
- -define(SERVER, code_monitor).
32
-
33
- monitor(Pid) ->
34
- monitor(?SERVER, Pid).
35
-
36
- monitor(Server, Pid) when is_pid(Pid) ->
37
- ensure_started(Server),
38
- Server ! {monitor, Pid},
39
- ok.
40
-
41
- demonitor(Pid) ->
42
- demonitor(?SERVER, Pid).
43
-
44
- demonitor(Server, Pid) when is_pid(Pid) ->
45
- ensure_started(Server),
46
- Server ! {demonitor, Pid},
47
- ok.
48
-
49
- stop() ->
50
- stop(?SERVER).
51
-
52
- stop(Server) ->
53
- Server ! stop,
54
- ok.
55
-
56
- ensure_started(Name) when is_atom(Name) ->
57
- start(Name);
58
- ensure_started(Pid) when is_pid(Pid) ->
59
- Pid.
60
-
61
- start() ->
62
- start(?SERVER).
63
-
64
- start(Name) ->
65
- case whereis(Name) of
66
- undefined ->
67
- Parent = self(),
68
- Pid = spawn(fun () -> server_init(Name, Parent) end),
69
- receive
70
- {Pid, ok} -> Pid;
71
- {Pid, error} -> throw(no_server)
72
- end;
73
- Pid -> Pid
74
- end.
75
-
76
- server_init(undefined = Name, Parent) ->
77
- %% anonymous server
78
- server_init_1(Name, Parent);
79
- server_init(Name, Parent) ->
80
- case catch register(Name, self()) of
81
- true ->
82
- server_init_1(Name, Parent);
83
- _ ->
84
- init_failure(Parent)
85
- end.
86
-
87
- server_init_1(Name, Parent) ->
88
- case install_codespy(self()) of
89
- {ok, _Spy} ->
90
- Parent ! {self(), ok},
91
- server(Name, sets:new());
92
- {error, _} ->
93
- init_failure(Parent)
94
- end.
95
-
96
- init_failure(Parent) ->
97
- Parent ! {self(), error},
98
- exit(failed).
99
-
100
- server(Name, Listeners) ->
101
- ?MODULE:main({Name, Listeners}).
102
-
103
- %% @private
104
- main({Name, Listeners}) ->
105
- receive
106
- {code_server, {module, M}} ->
107
- cast({loaded, M, erlang:now()}, Listeners),
108
- server(Name, Listeners);
109
- {monitor, Pid} when is_pid(Pid) ->
110
- server(Name, sets:add_element(Pid, Listeners));
111
- {demonitor, Pid} ->
112
- server(Name, sets:del_element(Pid, Listeners));
113
- stop ->
114
- exit(normal);
115
- _ ->
116
- server(Name, Listeners)
117
- end.
118
-
119
- cast(M, Listeners) ->
120
- sets:fold(fun (L, M) -> L ! M end, {code_monitor, M}, Listeners).
121
-
122
-
123
- %% code server spy process using generic wiretap functionality
124
-
125
- install_codespy(To) ->
126
- wiretap(code_server, To, fun code_spy/3).
127
-
128
- code_spy({code_call,From,{load_file,_}=Req}, Server, To) ->
129
- handle_load(Req, From, Req, Server, To);
130
- code_spy({code_call,From,{ensure_loaded,M}=Req}=Msg, Server, To) ->
131
- case erlang:module_loaded(M) of
132
- true -> Server ! Msg;
133
- false -> handle_load(Req, From, Req, Server, To)
134
- end;
135
- code_spy({code_call,From,{load_abs,_,_}=Req}, Server, To) ->
136
- handle_load(Req, From, Req, Server, To);
137
- code_spy({code_call,From,{load_binary,_,_,_}=Req}, Server, To) ->
138
- handle_load(Req, From, Req, Server, To);
139
- code_spy({code_call,From,{load_native_partial,_,_}=Req}, Server, To) ->
140
- handle_load(Req, From, Req, Server, To);
141
- code_spy({code_call,From,{load_native_sticky,_,_,_}=Req}, Server, To) ->
142
- handle_load(Req, From, Req, Server, To);
143
- code_spy(Msg, Server, _To) ->
144
- Server ! Msg.
145
-
146
- handle_load(Req, From, Req, Server, To) ->
147
- ReplyTo = spawn(fun () -> reply_handler(Server, From, To) end),
148
- Server ! {code_call, ReplyTo, Req}.
149
-
150
- %% one-shot processes - receive, pass on and die
151
- reply_handler(Server, Client, To) ->
152
- link(Server),
153
- receive
154
- {code_server, _Reply} = M ->
155
- To ! Client ! M
156
- end.
157
-
158
- %% basic wiretapping of registered processes (it should be possible to
159
- %% have several wiretaps attached to the same registered name; they will
160
- %% transparently form a chain, without knowing about each other)
161
-
162
- wiretap(Name, To, F) when is_atom(Name), is_pid(To), is_function(F) ->
163
- Parent = self(),
164
- Pid = spawn(fun () -> wiretap_init(Name, To, F, Parent) end),
165
- receive
166
- {Pid, Result} -> Result
167
- end.
168
-
169
- wiretap_init(Name, To, F, Parent) ->
170
- case whereis(Name) of
171
- undefined ->
172
- Parent ! {self(), {error, undefined}},
173
- exit(error);
174
- Pid ->
175
- catch unregister(Name),
176
- catch register(Name, self()),
177
- Self = self(),
178
- case whereis(Name) of
179
- Self ->
180
- process_flag(trap_exit, true),
181
- link(Pid),
182
- link(To),
183
- Parent ! {self(), {ok, self()}},
184
- wiretap_loop(Name, To, Pid, F);
185
- _ ->
186
- Parent ! {self(), {error, register_failed}},
187
- exit(error)
188
- end
189
- end.
190
-
191
- wiretap_loop(Name, To, Pid, F) ->
192
- receive
193
- {'EXIT', Pid, _} ->
194
- wiretap_dropped(Name, To, F);
195
- {'EXIT', To, _} ->
196
- wiretap_exit(Name, Pid);
197
- Msg ->
198
- F(Msg, Pid, To),
199
- wiretap_loop(Name, To, Pid, F)
200
- end.
201
-
202
- %% note that the registered name might get stolen from the spy process,
203
- %% e.g., by another active wiretap
204
-
205
- wiretap_exit(Name, Pid) ->
206
- %% the receiver died - restore things and go away invisibly
207
- unlink(Pid),
208
- Self = self(),
209
- %% sadly, this is not atomic...
210
- case whereis(Name) of
211
- Self ->
212
- catch unregister(Name),
213
- catch register(Name, Pid);
214
- _ -> ok
215
- end,
216
- exit(normal).
217
-
218
- %% if the real server goes away, make sure to unregister, and keep watch
219
- %% in order to restart the wiretap when the server comes up again
220
-
221
- wiretap_dropped(Name, To, F) ->
222
- Self = self(),
223
- case whereis(Name) of
224
- Self -> (catch unregister(Name));
225
- _ -> ok
226
- end,
227
- wiretap_watch(Name, To, F).
228
-
229
- wiretap_watch(Name, To, F) ->
230
- receive
231
- {'EXIT', To, _} ->
232
- exit(normal)
233
- after 1000 ->
234
- case whereis(Name) of
235
- Pid when is_pid(Pid) ->
236
- %% this process will terminate after starting the
237
- %% new wiretap (even it that call fails)
238
- wiretap(Name, To, F),
239
- exit(normal);
240
- _ ->
241
- wiretap_watch(Name, To, F)
242
- end
243
- end.