fairchild-poolparty 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (519) hide show
  1. data/History.txt +35 -0
  2. data/License.txt +20 -0
  3. data/PostInstall.txt +19 -0
  4. data/README.txt +77 -0
  5. data/Rakefile +45 -0
  6. data/VERSION.yml +4 -0
  7. data/bin/cloud +32 -0
  8. data/bin/cloud-bootstrap +21 -0
  9. data/bin/cloud-configure +28 -0
  10. data/bin/cloud-console +12 -0
  11. data/bin/cloud-contract +17 -0
  12. data/bin/cloud-expand +19 -0
  13. data/bin/cloud-handle-load +27 -0
  14. data/bin/cloud-list +23 -0
  15. data/bin/cloud-osxcopy +17 -0
  16. data/bin/cloud-provision +30 -0
  17. data/bin/cloud-rsync +28 -0
  18. data/bin/cloud-run +18 -0
  19. data/bin/cloud-setup-dev +25 -0
  20. data/bin/cloud-show +27 -0
  21. data/bin/cloud-spec +41 -0
  22. data/bin/cloud-ssh +23 -0
  23. data/bin/cloud-start +28 -0
  24. data/bin/cloud-stats +17 -0
  25. data/bin/cloud-terminate +20 -0
  26. data/bin/ec2-list-active +24 -0
  27. data/bin/messenger-get-current-nodes +14 -0
  28. data/bin/pool +31 -0
  29. data/bin/pool-describe +8 -0
  30. data/bin/pool-generate +18 -0
  31. data/bin/pool-init +28 -0
  32. data/bin/pool-list +30 -0
  33. data/bin/pool-start +26 -0
  34. data/bin/server-become-master +24 -0
  35. data/bin/server-build-messenger +28 -0
  36. data/bin/server-butterfly +25 -0
  37. data/bin/server-clean-cert-for +15 -0
  38. data/bin/server-cloud-elections +26 -0
  39. data/bin/server-ensure-provisioning +38 -0
  40. data/bin/server-fire-cmd +14 -0
  41. data/bin/server-get-load +15 -0
  42. data/bin/server-list-active +26 -0
  43. data/bin/server-list-instances +15 -0
  44. data/bin/server-manage-election +67 -0
  45. data/bin/server-monitor.ru +25 -0
  46. data/bin/server-provision +32 -0
  47. data/bin/server-query-agent +15 -0
  48. data/bin/server-rerun +23 -0
  49. data/bin/server-send-command +18 -0
  50. data/bin/server-show-stats +17 -0
  51. data/bin/server-start-agent +15 -0
  52. data/bin/server-start-client +29 -0
  53. data/bin/server-start-master +26 -0
  54. data/bin/server-start-node +32 -0
  55. data/bin/server-stop-client +3 -0
  56. data/bin/server-stop-master +3 -0
  57. data/bin/server-stop-node +3 -0
  58. data/bin/server-update-hosts +49 -0
  59. data/bin/server-write-new-nodes +26 -0
  60. data/config/jeweler.rb +43 -0
  61. data/config/requirements.rb +7 -0
  62. data/examples/basic.rb +23 -0
  63. data/examples/deploy.rb +5 -0
  64. data/examples/fairchild.rb +32 -0
  65. data/examples/fairchild_chef.rb +19 -0
  66. data/examples/paparazzi.conf.erb +21 -0
  67. data/examples/plugin_without_plugin_directory.rb +12 -0
  68. data/examples/poolparty.rb +12 -0
  69. data/generators/poolspec/USAGE +5 -0
  70. data/generators/poolspec/poolspec_generator.rb +58 -0
  71. data/generators/poolspec/templates/pool_spec_template.erb +9 -0
  72. data/lib/erlang/messenger/Emakefile +1 -0
  73. data/lib/erlang/messenger/Makefile +15 -0
  74. data/lib/erlang/messenger/README +5 -0
  75. data/lib/erlang/messenger/Rakefile +72 -0
  76. data/lib/erlang/messenger/control +11 -0
  77. data/lib/erlang/messenger/ebin/client.app +19 -0
  78. data/lib/erlang/messenger/ebin/master.app +19 -0
  79. data/lib/erlang/messenger/ebin/node.app +19 -0
  80. data/lib/erlang/messenger/ebin/packager.app +19 -0
  81. data/lib/erlang/messenger/ebin/pm_client_rel-0.1.rel +1 -0
  82. data/lib/erlang/messenger/ebin/pm_master_rel-0.1.rel +1 -0
  83. data/lib/erlang/messenger/ebin/pm_node_rel-0.1.rel +1 -0
  84. data/lib/erlang/messenger/include/defines.hrl +27 -0
  85. data/lib/erlang/messenger/lib/eunit/AUTHORS +2 -0
  86. data/lib/erlang/messenger/lib/eunit/CHANGELOG +14 -0
  87. data/lib/erlang/messenger/lib/eunit/COPYING +504 -0
  88. data/lib/erlang/messenger/lib/eunit/Makefile +28 -0
  89. data/lib/erlang/messenger/lib/eunit/NOTES +276 -0
  90. data/lib/erlang/messenger/lib/eunit/README +3 -0
  91. data/lib/erlang/messenger/lib/eunit/doc/edoc-info +3 -0
  92. data/lib/erlang/messenger/lib/eunit/doc/erlang.png +0 -0
  93. data/lib/erlang/messenger/lib/eunit/doc/eunit.html +172 -0
  94. data/lib/erlang/messenger/lib/eunit/doc/index.html +17 -0
  95. data/lib/erlang/messenger/lib/eunit/doc/modules-frame.html +12 -0
  96. data/lib/erlang/messenger/lib/eunit/doc/overview-summary.html +984 -0
  97. data/lib/erlang/messenger/lib/eunit/doc/overview.edoc +980 -0
  98. data/lib/erlang/messenger/lib/eunit/doc/packages-frame.html +11 -0
  99. data/lib/erlang/messenger/lib/eunit/doc/stylesheet.css +55 -0
  100. data/lib/erlang/messenger/lib/eunit/ebin/autoload.beam +0 -0
  101. data/lib/erlang/messenger/lib/eunit/ebin/code_monitor.beam +0 -0
  102. data/lib/erlang/messenger/lib/eunit/ebin/eunit.app +21 -0
  103. data/lib/erlang/messenger/lib/eunit/ebin/eunit.appup +1 -0
  104. data/lib/erlang/messenger/lib/eunit/ebin/eunit.beam +0 -0
  105. data/lib/erlang/messenger/lib/eunit/ebin/eunit_autoexport.beam +0 -0
  106. data/lib/erlang/messenger/lib/eunit/ebin/eunit_data.beam +0 -0
  107. data/lib/erlang/messenger/lib/eunit/ebin/eunit_lib.beam +0 -0
  108. data/lib/erlang/messenger/lib/eunit/ebin/eunit_proc.beam +0 -0
  109. data/lib/erlang/messenger/lib/eunit/ebin/eunit_serial.beam +0 -0
  110. data/lib/erlang/messenger/lib/eunit/ebin/eunit_server.beam +0 -0
  111. data/lib/erlang/messenger/lib/eunit/ebin/eunit_striptests.beam +0 -0
  112. data/lib/erlang/messenger/lib/eunit/ebin/eunit_test.beam +0 -0
  113. data/lib/erlang/messenger/lib/eunit/ebin/eunit_tests.beam +0 -0
  114. data/lib/erlang/messenger/lib/eunit/ebin/eunit_tty.beam +0 -0
  115. data/lib/erlang/messenger/lib/eunit/ebin/file_monitor.beam +0 -0
  116. data/lib/erlang/messenger/lib/eunit/examples/eunit_examples.erl +339 -0
  117. data/lib/erlang/messenger/lib/eunit/examples/fib.erl +19 -0
  118. data/lib/erlang/messenger/lib/eunit/examples/tests.txt +1 -0
  119. data/lib/erlang/messenger/lib/eunit/include/eunit.hrl +313 -0
  120. data/lib/erlang/messenger/lib/eunit/src/Makefile +46 -0
  121. data/lib/erlang/messenger/lib/eunit/src/autoload.erl +388 -0
  122. data/lib/erlang/messenger/lib/eunit/src/code_monitor.erl +243 -0
  123. data/lib/erlang/messenger/lib/eunit/src/eunit.app.src +21 -0
  124. data/lib/erlang/messenger/lib/eunit/src/eunit.appup.src +1 -0
  125. data/lib/erlang/messenger/lib/eunit/src/eunit.erl +196 -0
  126. data/lib/erlang/messenger/lib/eunit/src/eunit_autoexport.erl +102 -0
  127. data/lib/erlang/messenger/lib/eunit/src/eunit_data.erl +798 -0
  128. data/lib/erlang/messenger/lib/eunit/src/eunit_internal.hrl +48 -0
  129. data/lib/erlang/messenger/lib/eunit/src/eunit_lib.erl +682 -0
  130. data/lib/erlang/messenger/lib/eunit/src/eunit_proc.erl +552 -0
  131. data/lib/erlang/messenger/lib/eunit/src/eunit_serial.erl +157 -0
  132. data/lib/erlang/messenger/lib/eunit/src/eunit_server.erl +340 -0
  133. data/lib/erlang/messenger/lib/eunit/src/eunit_striptests.erl +64 -0
  134. data/lib/erlang/messenger/lib/eunit/src/eunit_test.erl +334 -0
  135. data/lib/erlang/messenger/lib/eunit/src/eunit_tests.erl +45 -0
  136. data/lib/erlang/messenger/lib/eunit/src/eunit_tty.erl +272 -0
  137. data/lib/erlang/messenger/lib/eunit/src/file_monitor.erl +409 -0
  138. data/lib/erlang/messenger/lib/eunit/sys.config +9 -0
  139. data/lib/erlang/messenger/lib/eunit/vsn.mk +1 -0
  140. data/lib/erlang/messenger/pm_client_rel-0.1.boot +0 -0
  141. data/lib/erlang/messenger/pm_client_rel-0.1.script +238 -0
  142. data/lib/erlang/messenger/pm_master_rel-0.1.boot +0 -0
  143. data/lib/erlang/messenger/pm_master_rel-0.1.script +239 -0
  144. data/lib/erlang/messenger/pm_node_rel-0.1.boot +0 -0
  145. data/lib/erlang/messenger/pm_node_rel-0.1.script +237 -0
  146. data/lib/erlang/messenger/src/client_app.erl +39 -0
  147. data/lib/erlang/messenger/src/client_server.erl +60 -0
  148. data/lib/erlang/messenger/src/master_app.erl +39 -0
  149. data/lib/erlang/messenger/src/node_app.erl +39 -0
  150. data/lib/erlang/messenger/src/pm_client.erl +49 -0
  151. data/lib/erlang/messenger/src/pm_client_supervisor.erl +38 -0
  152. data/lib/erlang/messenger/src/pm_cluster.erl +61 -0
  153. data/lib/erlang/messenger/src/pm_event_manager.erl +27 -0
  154. data/lib/erlang/messenger/src/pm_master.erl +215 -0
  155. data/lib/erlang/messenger/src/pm_master_event_handler.erl +72 -0
  156. data/lib/erlang/messenger/src/pm_master_supervisor.erl +39 -0
  157. data/lib/erlang/messenger/src/pm_node.erl +200 -0
  158. data/lib/erlang/messenger/src/pm_node_supervisor.erl +38 -0
  159. data/lib/erlang/messenger/src/pm_packager.erl +76 -0
  160. data/lib/erlang/messenger/src/pm_spawner.erl +213 -0
  161. data/lib/erlang/messenger/src/pm_strings.erl +11 -0
  162. data/lib/erlang/messenger/src/utils.erl +72 -0
  163. data/lib/erlang/messenger/useful_snippets +17 -0
  164. data/lib/poolparty/aska/aska.rb +152 -0
  165. data/lib/poolparty/base_packages/bind.rb +11 -0
  166. data/lib/poolparty/base_packages/haproxy.rb +46 -0
  167. data/lib/poolparty/base_packages/heartbeat.rb +58 -0
  168. data/lib/poolparty/base_packages/poolparty.rb +14 -0
  169. data/lib/poolparty/base_packages/ruby.rb +42 -0
  170. data/lib/poolparty/base_packages/runit.rb +21 -0
  171. data/lib/poolparty/capistrano/cloud_tasks.rb +10 -0
  172. data/lib/poolparty/capistrano.rb +54 -0
  173. data/lib/poolparty/config/postlaunchmessage.txt +5 -0
  174. data/lib/poolparty/core/array.rb +36 -0
  175. data/lib/poolparty/core/class.rb +26 -0
  176. data/lib/poolparty/core/exception.rb +10 -0
  177. data/lib/poolparty/core/float.rb +13 -0
  178. data/lib/poolparty/core/hash.rb +71 -0
  179. data/lib/poolparty/core/kernel.rb +66 -0
  180. data/lib/poolparty/core/metaid.rb +15 -0
  181. data/lib/poolparty/core/module.rb +40 -0
  182. data/lib/poolparty/core/my_open_struct.rb +18 -0
  183. data/lib/poolparty/core/object.rb +93 -0
  184. data/lib/poolparty/core/ordered_hash.rb +99 -0
  185. data/lib/poolparty/core/proc.rb +7 -0
  186. data/lib/poolparty/core/string.rb +140 -0
  187. data/lib/poolparty/core/symbol.rb +17 -0
  188. data/lib/poolparty/core/time.rb +56 -0
  189. data/lib/poolparty/dependencies.rb +49 -0
  190. data/lib/poolparty/dependency_resolver/chef_resolver.rb +221 -0
  191. data/lib/poolparty/dependency_resolver/dependency_resolver.rb +42 -0
  192. data/lib/poolparty/dependency_resolver/dependency_resolver_cloud_extensions.rb +28 -0
  193. data/lib/poolparty/dependency_resolver/puppet.rb +75 -0
  194. data/lib/poolparty/dependency_resolver/puppet_resolver.rb +173 -0
  195. data/lib/poolparty/exceptions/CloudNotFoundException.rb +7 -0
  196. data/lib/poolparty/exceptions/LoadRulesException.rb +7 -0
  197. data/lib/poolparty/exceptions/MasterException.rb +10 -0
  198. data/lib/poolparty/exceptions/ProvisionerException.rb +5 -0
  199. data/lib/poolparty/exceptions/RemoteException.rb +12 -0
  200. data/lib/poolparty/exceptions/ResourceException.rb +7 -0
  201. data/lib/poolparty/exceptions/RuntimeException.rb +7 -0
  202. data/lib/poolparty/exceptions/SpecException.rb +7 -0
  203. data/lib/poolparty/exceptions/TemplateNotFound.rb +7 -0
  204. data/lib/poolparty/exceptions/UnacceptableCommand.rb +5 -0
  205. data/lib/poolparty/exceptions/dependency_resolver_exception.rb +5 -0
  206. data/lib/poolparty/exceptions/package_exception.rb +7 -0
  207. data/lib/poolparty/extra/deployments.rb +31 -0
  208. data/lib/poolparty/helpers/binary.rb +67 -0
  209. data/lib/poolparty/helpers/console.rb +48 -0
  210. data/lib/poolparty/helpers/display.rb +30 -0
  211. data/lib/poolparty/helpers/hash_printer.rb +44 -0
  212. data/lib/poolparty/helpers/loading.rb +4 -0
  213. data/lib/poolparty/helpers/nice_printer.rb +36 -0
  214. data/lib/poolparty/helpers/optioner.rb +149 -0
  215. data/lib/poolparty/helpers/ruberl.rb +33 -0
  216. data/lib/poolparty/lite.rb +20 -0
  217. data/lib/poolparty/modules/cloud_dsl.rb +20 -0
  218. data/lib/poolparty/modules/cloud_resourcer.rb +122 -0
  219. data/lib/poolparty/modules/daemonizable.rb +141 -0
  220. data/lib/poolparty/modules/definable_resource.rb +57 -0
  221. data/lib/poolparty/modules/file_writer.rb +95 -0
  222. data/lib/poolparty/modules/output.rb +13 -0
  223. data/lib/poolparty/modules/pretty_printer.rb +40 -0
  224. data/lib/poolparty/modules/resourcing_dsl.rb +74 -0
  225. data/lib/poolparty/modules/s3_string.rb +32 -0
  226. data/lib/poolparty/modules/safe_instance.rb +31 -0
  227. data/lib/poolparty/modules/thread_pool.rb +106 -0
  228. data/lib/poolparty/monitors/base_monitor.rb +81 -0
  229. data/lib/poolparty/monitors/monitor_rack.rb +132 -0
  230. data/lib/poolparty/monitors/monitors/load_monitor.rb +15 -0
  231. data/lib/poolparty/monitors/monitors/memory_monitor.rb +50 -0
  232. data/lib/poolparty/monitors/monitors/server_monitor.rb +7 -0
  233. data/lib/poolparty/monitors/monitors/web_monitor.rb +18 -0
  234. data/lib/poolparty/monitors/neighborhood_monitor.rb +25 -0
  235. data/lib/poolparty/monitors/stats_monitor.rb +182 -0
  236. data/lib/poolparty/monitors.rb +6 -0
  237. data/lib/poolparty/net/init.rb +11 -0
  238. data/lib/poolparty/net/messenger.rb +55 -0
  239. data/lib/poolparty/net/remote_bases.rb +21 -0
  240. data/lib/poolparty/net/remote_instance.rb +109 -0
  241. data/lib/poolparty/net/remoter/cloud_control.rb +251 -0
  242. data/lib/poolparty/net/remoter/connections.rb +180 -0
  243. data/lib/poolparty/net/remoter/interactive.rb +121 -0
  244. data/lib/poolparty/net/remoter/lists.rb +12 -0
  245. data/lib/poolparty/net/remoter_base.rb +97 -0
  246. data/lib/poolparty/net/remoter_bases/ec2/ec2.rb +235 -0
  247. data/lib/poolparty/net/remoter_bases/ec2/ec2_remote_instance.rb +53 -0
  248. data/lib/poolparty/net/remoter_bases/ec2/ec2_response_object.rb +64 -0
  249. data/lib/poolparty/plugins/chef.rb +168 -0
  250. data/lib/poolparty/plugins/deploydirectory.rb +47 -0
  251. data/lib/poolparty/plugins/git.rb +66 -0
  252. data/lib/poolparty/plugins/line_in_file.rb +13 -0
  253. data/lib/poolparty/plugins/rsyncmirror.rb +28 -0
  254. data/lib/poolparty/plugins/runit.rb +96 -0
  255. data/lib/poolparty/plugins/svn.rb +48 -0
  256. data/lib/poolparty/poolparty/cloud.rb +216 -0
  257. data/lib/poolparty/poolparty/custom_resource.rb +45 -0
  258. data/lib/poolparty/poolparty/default.rb +167 -0
  259. data/lib/poolparty/poolparty/key.rb +75 -0
  260. data/lib/poolparty/poolparty/loggable.rb +28 -0
  261. data/lib/poolparty/poolparty/neighborhoods.rb +69 -0
  262. data/lib/poolparty/poolparty/plugin.rb +69 -0
  263. data/lib/poolparty/poolparty/plugin_model.rb +45 -0
  264. data/lib/poolparty/poolparty/pool.rb +76 -0
  265. data/lib/poolparty/poolparty/poolparty_base_class.rb +181 -0
  266. data/lib/poolparty/poolparty/resource.rb +205 -0
  267. data/lib/poolparty/poolparty/script.rb +58 -0
  268. data/lib/poolparty/poolparty/service.rb +34 -0
  269. data/lib/poolparty/poolparty/template.rb +27 -0
  270. data/lib/poolparty/provision/boot_strapper.rb +141 -0
  271. data/lib/poolparty/provision/configurations/chef.rb +22 -0
  272. data/lib/poolparty/provision/configurations/puppet.rb +28 -0
  273. data/lib/poolparty/provision/dr_configure.rb +85 -0
  274. data/lib/poolparty/resources/cron.rb +14 -0
  275. data/lib/poolparty/resources/custom_service.rb +30 -0
  276. data/lib/poolparty/resources/directory.rb +13 -0
  277. data/lib/poolparty/resources/exec.rb +25 -0
  278. data/lib/poolparty/resources/file.rb +29 -0
  279. data/lib/poolparty/resources/host.rb +16 -0
  280. data/lib/poolparty/resources/mount.rb +21 -0
  281. data/lib/poolparty/resources/package.rb +12 -0
  282. data/lib/poolparty/resources/remote_file.rb +20 -0
  283. data/lib/poolparty/resources/service.rb +20 -0
  284. data/lib/poolparty/resources/sshkey.rb +27 -0
  285. data/lib/poolparty/resources/symlink.rb +21 -0
  286. data/lib/poolparty/resources/user.rb +13 -0
  287. data/lib/poolparty/resources/variable.rb +9 -0
  288. data/lib/poolparty/schema.rb +64 -0
  289. data/lib/poolparty/services/conditional.rb +46 -0
  290. data/lib/poolparty/services/gem_package.rb +52 -0
  291. data/lib/poolparty/spec/core/string.rb +18 -0
  292. data/lib/poolparty/spec/matchers/a_spec_extensions_base.rb +26 -0
  293. data/lib/poolparty/spec/matchers/have_cron.rb +28 -0
  294. data/lib/poolparty/spec/matchers/have_deploydirectory.rb +15 -0
  295. data/lib/poolparty/spec/matchers/have_directory.rb +31 -0
  296. data/lib/poolparty/spec/matchers/have_exec.rb +28 -0
  297. data/lib/poolparty/spec/matchers/have_file.rb +28 -0
  298. data/lib/poolparty/spec/matchers/have_gempackage.rb +28 -0
  299. data/lib/poolparty/spec/matchers/have_git.rb +28 -0
  300. data/lib/poolparty/spec/matchers/have_host.rb +28 -0
  301. data/lib/poolparty/spec/matchers/have_mount.rb +28 -0
  302. data/lib/poolparty/spec/matchers/have_package.rb +28 -0
  303. data/lib/poolparty/spec/matchers/have_remotefile.rb +28 -0
  304. data/lib/poolparty/spec/matchers/have_rsyncmirror.rb +28 -0
  305. data/lib/poolparty/spec/matchers/have_service.rb +28 -0
  306. data/lib/poolparty/spec/matchers/have_sshkey.rb +28 -0
  307. data/lib/poolparty/spec/matchers/have_symlink.rb +28 -0
  308. data/lib/poolparty/spec/matchers/have_variable.rb +32 -0
  309. data/lib/poolparty/spec/spec/dynamic_matchers.rb +63 -0
  310. data/lib/poolparty/spec/spec/ensure_matchers_exist.rb +7 -0
  311. data/lib/poolparty/spec/templates/have_base.rb +28 -0
  312. data/lib/poolparty/spec.rb +31 -0
  313. data/lib/poolparty/templates/authkeys +2 -0
  314. data/lib/poolparty/templates/cib.xml +54 -0
  315. data/lib/poolparty/templates/erlang_cookie_maker +6 -0
  316. data/lib/poolparty/templates/gem +27 -0
  317. data/lib/poolparty/templates/gemrc +11 -0
  318. data/lib/poolparty/templates/ha.cf +17 -0
  319. data/lib/poolparty/templates/haproxy.conf +36 -0
  320. data/lib/poolparty/templates/haresources +3 -0
  321. data/lib/poolparty/templates/logd.cf +42 -0
  322. data/lib/poolparty/templates/messenger/client/log-run.erb +2 -0
  323. data/lib/poolparty/templates/messenger/client/run.erb +4 -0
  324. data/lib/poolparty/templates/messenger/master/log-run.erb +2 -0
  325. data/lib/poolparty/templates/messenger/master/run.erb +4 -0
  326. data/lib/poolparty/templates/messenger/node/log-run.erb +2 -0
  327. data/lib/poolparty/templates/messenger/node/run.erb +4 -0
  328. data/lib/poolparty/templates/monitor.ru +16 -0
  329. data/lib/poolparty/templates/namespaceauth.conf +19 -0
  330. data/lib/poolparty/templates/poolparty.monitor +14 -0
  331. data/lib/poolparty/templates/puppet/add_puppet_to_hosts +6 -0
  332. data/lib/poolparty/templates/puppet/puppet.conf +2 -0
  333. data/lib/poolparty/templates/puppet/puppetrunner +14 -0
  334. data/lib/poolparty/templates/puppet/site.pp +4 -0
  335. data/lib/poolparty/templates/puppetrunner +14 -0
  336. data/lib/poolparty/templates/yaws.conf +19 -0
  337. data/lib/poolparty/version.rb +15 -0
  338. data/lib/poolparty.rb +148 -0
  339. data/lib/poolpartycl.rb +7 -0
  340. data/script/destroy +14 -0
  341. data/script/generate +14 -0
  342. data/spec/bin/bin_spec_helper.rb +7 -0
  343. data/spec/bin/fixtures/bin_cloud_for_test.rb +19 -0
  344. data/spec/bin/server-list-active_spec.rb +22 -0
  345. data/spec/poolparty/aska/aska_spec.rb +117 -0
  346. data/spec/poolparty/base_packages/haproxy_spec.rb +7 -0
  347. data/spec/poolparty/base_packages/heartbeat_spec.rb +7 -0
  348. data/spec/poolparty/bin/console_spec.rb +83 -0
  349. data/spec/poolparty/core/array_spec.rb +46 -0
  350. data/spec/poolparty/core/float.rb +13 -0
  351. data/spec/poolparty/core/hash_spec.rb +83 -0
  352. data/spec/poolparty/core/kernel_spec.rb +24 -0
  353. data/spec/poolparty/core/module_spec.rb +15 -0
  354. data/spec/poolparty/core/object_spec.rb +68 -0
  355. data/spec/poolparty/core/ordered_hash_spec.rb +48 -0
  356. data/spec/poolparty/core/string_spec.rb +145 -0
  357. data/spec/poolparty/core/time_spec.rb +49 -0
  358. data/spec/poolparty/dependencies_spec.rb +11 -0
  359. data/spec/poolparty/dependency_resolver/chef_resolver_spec.rb +119 -0
  360. data/spec/poolparty/dependency_resolver/dependency_resolver_cloud_extensions_spec.rb +128 -0
  361. data/spec/poolparty/dependency_resolver/dependency_resolver_spec.rb +16 -0
  362. data/spec/poolparty/dependency_resolver/puppet_resolver_spec.rb +124 -0
  363. data/spec/poolparty/extra/deployments_spec.rb +68 -0
  364. data/spec/poolparty/fixtures/clouds.json +128 -0
  365. data/spec/poolparty/fixtures/test_template.erb +1 -0
  366. data/spec/poolparty/helpers/binary_spec.rb +26 -0
  367. data/spec/poolparty/helpers/display_spec.rb +13 -0
  368. data/spec/poolparty/helpers/hash_printer_spec.rb +34 -0
  369. data/spec/poolparty/helpers/optioner_spec.rb +50 -0
  370. data/spec/poolparty/id_rsa +27 -0
  371. data/spec/poolparty/modules/cloud_resourcer_spec.rb +67 -0
  372. data/spec/poolparty/modules/definable_resource.rb +9 -0
  373. data/spec/poolparty/modules/file_writer_spec.rb +64 -0
  374. data/spec/poolparty/modules/s3_string_spec.rb +15 -0
  375. data/spec/poolparty/monitors/base_monitor_spec.rb +112 -0
  376. data/spec/poolparty/monitors/monitors/cpu_monitor_spec.rb +18 -0
  377. data/spec/poolparty/monitors/monitors/memory_monitor_spec.rb +48 -0
  378. data/spec/poolparty/net/messenger_spec.rb +16 -0
  379. data/spec/poolparty/net/remote_instance_spec.rb +17 -0
  380. data/spec/poolparty/net/remote_spec.rb +286 -0
  381. data/spec/poolparty/net/remoter_base_spec.rb +35 -0
  382. data/spec/poolparty/net/remoter_bases/ec2_mocks_and_stubs.rb +24 -0
  383. data/spec/poolparty/net/remoter_bases/ec2_remote_instance_spec.rb +125 -0
  384. data/spec/poolparty/net/remoter_bases/ec2_spec.rb +119 -0
  385. data/spec/poolparty/net/remoter_spec.rb +130 -0
  386. data/spec/poolparty/plugins/chef_spec.rb +7 -0
  387. data/spec/poolparty/plugins/deploydirectory_spec.rb +51 -0
  388. data/spec/poolparty/plugins/git_spec.rb +40 -0
  389. data/spec/poolparty/plugins/line_spec.rb +22 -0
  390. data/spec/poolparty/plugins/svn_spec.rb +16 -0
  391. data/spec/poolparty/poolparty/cloud_spec.rb +345 -0
  392. data/spec/poolparty/poolparty/configurers/files/ruby_basic.rb +16 -0
  393. data/spec/poolparty/poolparty/configurers/files/ruby_plugins.rb +16 -0
  394. data/spec/poolparty/poolparty/configurers/ruby_spec.rb +42 -0
  395. data/spec/poolparty/poolparty/custom_resource_spec.rb +79 -0
  396. data/spec/poolparty/poolparty/default_spec.rb +139 -0
  397. data/spec/poolparty/poolparty/example_spec.rb +60 -0
  398. data/spec/poolparty/poolparty/key_spec.rb +42 -0
  399. data/spec/poolparty/poolparty/neighborhoods_spec.rb +66 -0
  400. data/spec/poolparty/poolparty/plugin_model_spec.rb +54 -0
  401. data/spec/poolparty/poolparty/plugin_spec.rb +41 -0
  402. data/spec/poolparty/poolparty/pool_spec.rb +100 -0
  403. data/spec/poolparty/poolparty/resource_spec.rb +209 -0
  404. data/spec/poolparty/poolparty/script_spec.rb +49 -0
  405. data/spec/poolparty/poolparty/service_spec.rb +5 -0
  406. data/spec/poolparty/poolparty/template_spec.rb +26 -0
  407. data/spec/poolparty/poolparty/test_plugins/sshkey_test +2 -0
  408. data/spec/poolparty/poolparty/test_plugins/virtual_host_template.erb +0 -0
  409. data/spec/poolparty/poolparty/test_plugins/webserver.rb +30 -0
  410. data/spec/poolparty/poolparty_base_class_spec.rb +80 -0
  411. data/spec/poolparty/poolparty_spec.rb +36 -0
  412. data/spec/poolparty/resources/cron_spec.rb +44 -0
  413. data/spec/poolparty/resources/directory_spec.rb +40 -0
  414. data/spec/poolparty/resources/exec_spec.rb +37 -0
  415. data/spec/poolparty/resources/file_spec.rb +63 -0
  416. data/spec/poolparty/resources/gem_spec.rb +7 -0
  417. data/spec/poolparty/resources/host_spec.rb +35 -0
  418. data/spec/poolparty/resources/package_spec.rb +29 -0
  419. data/spec/poolparty/resources/service_spec.rb +29 -0
  420. data/spec/poolparty/resources/sshkey_spec.rb +40 -0
  421. data/spec/poolparty/resources/symlink_spec.rb +29 -0
  422. data/spec/poolparty/resources/user_spec.rb +48 -0
  423. data/spec/poolparty/resources/variable_spec.rb +26 -0
  424. data/spec/poolparty/schema_spec.rb +53 -0
  425. data/spec/poolparty/services/conditional_spec.rb +52 -0
  426. data/spec/poolparty/spec/core/string_spec.rb +57 -0
  427. data/spec/poolparty/spec_helper.rb +263 -0
  428. data/spec/poolparty/test_spec_helper.rb +13 -0
  429. data/tasks/cloud.rake +3 -0
  430. data/tasks/development.rake +82 -0
  431. data/tasks/ec2.rake +13 -0
  432. data/tasks/environment.rake +7 -0
  433. data/tasks/instance.rake +2 -0
  434. data/tasks/poolparty.rake +54 -0
  435. data/tasks/server.rake +44 -0
  436. data/tasks/spec.rake +16 -0
  437. data/test/fixtures/test_template.erb +1 -0
  438. data/test/poolparty/core/hash_test.rb +23 -0
  439. data/test/poolparty/poolparty/template_test.rb +31 -0
  440. data/test/poolparty/provision/boot_strapper_test.rb +6 -0
  441. data/test/poolparty/provision/dr_configure_test.rb +6 -0
  442. data/test/test_generator_helper.rb +29 -0
  443. data/test/test_helper.rb +5 -0
  444. data/test/test_pool_spec_generator.rb +47 -0
  445. data/test/test_poolparty.rb +11 -0
  446. data/vendor/gems/butterfly/History.txt +4 -0
  447. data/vendor/gems/butterfly/PostInstall.txt +2 -0
  448. data/vendor/gems/butterfly/README.rdoc +48 -0
  449. data/vendor/gems/butterfly/Rakefile +62 -0
  450. data/vendor/gems/butterfly/VERSION.yml +4 -0
  451. data/vendor/gems/butterfly/bin/flutter +4 -0
  452. data/vendor/gems/butterfly/butterfly.gemspec +37 -0
  453. data/vendor/gems/butterfly/examples/config.ru +15 -0
  454. data/vendor/gems/butterfly/examples/my_app.rb +12 -0
  455. data/vendor/gems/butterfly/lib/butterfly.rb +14 -0
  456. data/vendor/gems/butterfly/lib/handler.rb +48 -0
  457. data/vendor/gems/butterfly/lib/request.rb +29 -0
  458. data/vendor/gems/butterfly/lib/response.rb +49 -0
  459. data/vendor/gems/butterfly/script/console +10 -0
  460. data/vendor/gems/butterfly/script/destroy +14 -0
  461. data/vendor/gems/butterfly/script/generate +14 -0
  462. data/vendor/gems/butterfly/test/test_adapter_base.rb +23 -0
  463. data/vendor/gems/butterfly/test/test_butterfly_request.rb +46 -0
  464. data/vendor/gems/butterfly/test/test_butterfly_response.rb +43 -0
  465. data/vendor/gems/butterfly/test/test_butterfly_server.rb +16 -0
  466. data/vendor/gems/butterfly/test/test_default.rb +12 -0
  467. data/vendor/gems/butterfly/test/test_helper.rb +6 -0
  468. data/vendor/gems/dslify/History.txt +4 -0
  469. data/vendor/gems/dslify/Manifest.txt +25 -0
  470. data/vendor/gems/dslify/PostInstall.txt +5 -0
  471. data/vendor/gems/dslify/README.txt +60 -0
  472. data/vendor/gems/dslify/Rakefile +56 -0
  473. data/vendor/gems/dslify/config/hoe.rb +73 -0
  474. data/vendor/gems/dslify/config/requirements.rb +15 -0
  475. data/vendor/gems/dslify/dslify.gemspec +40 -0
  476. data/vendor/gems/dslify/lib/dslify/dslify.rb +69 -0
  477. data/vendor/gems/dslify/lib/dslify/version.rb +10 -0
  478. data/vendor/gems/dslify/lib/dslify.rb +7 -0
  479. data/vendor/gems/dslify/script/console +10 -0
  480. data/vendor/gems/dslify/script/destroy +14 -0
  481. data/vendor/gems/dslify/script/generate +14 -0
  482. data/vendor/gems/dslify/script/txt2html +82 -0
  483. data/vendor/gems/dslify/setup.rb +1585 -0
  484. data/vendor/gems/dslify/tasks/deployment.rake +34 -0
  485. data/vendor/gems/dslify/tasks/environment.rake +7 -0
  486. data/vendor/gems/dslify/tasks/website.rake +17 -0
  487. data/vendor/gems/dslify/test/test_dslify.rb +114 -0
  488. data/vendor/gems/dslify/website/index.html +86 -0
  489. data/vendor/gems/dslify/website/index.txt +83 -0
  490. data/vendor/gems/dslify/website/javascripts/rounded_corners_lite.inc.js +285 -0
  491. data/vendor/gems/dslify/website/stylesheets/screen.css +138 -0
  492. data/vendor/gems/dslify/website/template.html.erb +48 -0
  493. data/vendor/gems/parenting/History.txt +4 -0
  494. data/vendor/gems/parenting/Manifest.txt +13 -0
  495. data/vendor/gems/parenting/PostInstall.txt +2 -0
  496. data/vendor/gems/parenting/README.rdoc +47 -0
  497. data/vendor/gems/parenting/Rakefile +28 -0
  498. data/vendor/gems/parenting/lib/parenting/base.rb +65 -0
  499. data/vendor/gems/parenting/lib/parenting.rb +10 -0
  500. data/vendor/gems/parenting/parenting.gemspec +39 -0
  501. data/vendor/gems/parenting/script/console +10 -0
  502. data/vendor/gems/parenting/script/destroy +14 -0
  503. data/vendor/gems/parenting/script/generate +14 -0
  504. data/vendor/gems/parenting/test/file_to_eval.rb +9 -0
  505. data/vendor/gems/parenting/test/test_helper.rb +5 -0
  506. data/vendor/gems/parenting/test/test_parenting.rb +89 -0
  507. data/vendor/gems/suitcase/LICENSE +20 -0
  508. data/vendor/gems/suitcase/README.rdoc +31 -0
  509. data/vendor/gems/suitcase/Rakefile +57 -0
  510. data/vendor/gems/suitcase/VERSION.yml +4 -0
  511. data/vendor/gems/suitcase/lib/suitcase/unzipper.rb +15 -0
  512. data/vendor/gems/suitcase/lib/suitcase/zipper.rb +103 -0
  513. data/vendor/gems/suitcase/lib/suitcase.rb +5 -0
  514. data/vendor/gems/suitcase/suitcase.gemspec +52 -0
  515. data/vendor/gems/suitcase/test/suitcase_test.rb +89 -0
  516. data/vendor/gems/suitcase/test/test_dir/box.rb +1 -0
  517. data/vendor/gems/suitcase/test/test_dir/test.txt +1 -0
  518. data/vendor/gems/suitcase/test/test_helper.rb +12 -0
  519. metadata +810 -0
@@ -0,0 +1,409 @@
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: file_monitor.erl 250 2008-08-23 09:12:02Z rcarlsson $
17
+ %%
18
+ %% @private (for now)
19
+ %% @author Richard Carlsson <richardc@it.uu.se>
20
+ %% @copyright 2006 Richard Carlsson
21
+ %% @doc Erlang file monitoring service
22
+
23
+ %% The behaviour of this service is inspired by the open source FAM
24
+ %% daemon [http://oss.sgi.com/projects/fam/].
25
+
26
+ -module(file_monitor).
27
+
28
+ -export([start/0, start/1, start/2, stop/0, stop/1, monitor_file/2,
29
+ monitor_file/3, monitor_dir/2, monitor_dir/3, demonitor/1,
30
+ demonitor/2]).
31
+
32
+ -export([main/1]). %% private
33
+
34
+ -include_lib("kernel/include/file.hrl").
35
+
36
+ -define(POLL_TIME, 5000). % default; change with option poll_time
37
+ -define(SERVER, file_monitor).
38
+
39
+ %% NOTE: paths should be absolute, but this is not checked
40
+
41
+ %% We don't change the paths, e.g. from relative to absolute, but we
42
+ %% make sure that the path is a flat string and return it to the caller.
43
+
44
+ monitor_file(Path, Pid) ->
45
+ monitor_file(?SERVER, Path, Pid).
46
+
47
+ monitor_file(Server, Path, Pid) ->
48
+ monitor(Server, file, filename:flatten(Path), Pid).
49
+
50
+ monitor_dir(Path, Pid) ->
51
+ monitor_dir(?SERVER, Path, Pid).
52
+
53
+ monitor_dir(Server, Path, Pid) ->
54
+ monitor(Server, dir, filename:flatten(Path), Pid).
55
+
56
+ monitor(Server, Type, Path, Pid) when is_pid(Pid) ->
57
+ {ok, Ref} = command(Server, {monitor, {Type, Path}, Pid}),
58
+ {ok, Path, Ref}.
59
+
60
+ demonitor(Ref) ->
61
+ demonitor(?SERVER, Ref).
62
+
63
+ demonitor(Server, Ref) ->
64
+ ok = command(Server, {demonitor, Ref}).
65
+
66
+
67
+ command(Server, Cmd) ->
68
+ ServerPid = ensure_started(Server),
69
+ ServerPid ! {command, self(), Cmd},
70
+ receive
71
+ {ServerPid, Result} -> Result
72
+ end.
73
+
74
+
75
+ stop() ->
76
+ stop(?SERVER).
77
+
78
+ stop(Server) ->
79
+ Server ! stop,
80
+ ok.
81
+
82
+ ensure_started(Name) when is_atom(Name) ->
83
+ start(Name, []);
84
+ ensure_started(Pid) when is_pid(Pid) ->
85
+ Pid.
86
+
87
+ start() ->
88
+ start([]).
89
+
90
+ start(Options) ->
91
+ start(?SERVER, Options).
92
+
93
+ start(Name, Options) ->
94
+ case whereis(Name) of
95
+ undefined ->
96
+ Parent = self(),
97
+ Pid = spawn(fun () -> server_init(Name, Parent, Options) end),
98
+ receive
99
+ {Pid, ok} -> Pid;
100
+ {Pid, error} -> throw(no_server)
101
+ end;
102
+ Pid -> Pid
103
+ end.
104
+
105
+ -record(state, {name, time, dirs, files, clients, refs}).
106
+
107
+ server_init(undefined = Name, Parent, Options) ->
108
+ %% anonymous server
109
+ server_init_1(Name, Parent, Options);
110
+ server_init(Name, Parent, Options) ->
111
+ case catch register(Name, self()) of
112
+ true ->
113
+ server_init_1(Name, Parent, Options);
114
+ _ ->
115
+ Parent ! {self(), error},
116
+ exit(failed)
117
+ end.
118
+
119
+ server_init_1(Name, Parent, Options) ->
120
+ Parent ! {self(), ok},
121
+ server(set_timer(init_state(Name, Options))).
122
+
123
+ init_state(Name, Options) ->
124
+ Time = case proplists:get_value(poll_time, Options) of
125
+ N when is_integer(N), N >= 100 -> N;
126
+ _ -> ?POLL_TIME
127
+ end,
128
+ #state{name = Name,
129
+ time = Time,
130
+ dirs = dict:new(),
131
+ files = dict:new(),
132
+ clients = dict:new(),
133
+ refs = dict:new()}.
134
+
135
+ server(St) -> ?MODULE:main(St).
136
+
137
+ %% @private
138
+ main(St) ->
139
+ receive
140
+ {command, From, {monitor, Object, Pid}} when is_pid(Pid) ->
141
+ {Ref, St1} = new_monitor(Object, Pid, St),
142
+ server_reply(From, {ok, Ref}),
143
+ server(add_client(Pid, St1));
144
+ {command, From, {demonitor, Ref}} ->
145
+ server_reply(From, ok),
146
+ server(delete_monitor(Ref, St));
147
+ stop ->
148
+ exit(normal);
149
+ time ->
150
+ server(set_timer(poll(St)));
151
+ {'DOWN', _Ref, process, Pid, _Info} ->
152
+ server(purge_pid(Pid, del_client(Pid, St)));
153
+ _ ->
154
+ server(St)
155
+ end.
156
+
157
+ server_reply(To, Msg) ->
158
+ To ! {self(), Msg}.
159
+
160
+ set_timer(St) ->
161
+ erlang:send_after(St#state.time, self(), time),
162
+ St.
163
+
164
+
165
+ %% client monitoring (once a client, always a client - until death)
166
+
167
+ add_client(Pid, St) ->
168
+ case dict:is_key(Pid, St#state.clients) of
169
+ true ->
170
+ St;
171
+ false ->
172
+ Ref = erlang:monitor(process, Pid),
173
+ St#state{clients = dict:store(Pid, Ref, St#state.clients)}
174
+ end.
175
+
176
+ del_client(Pid, St) ->
177
+ case dict:find(Pid, St#state.clients) of
178
+ {ok, Ref} ->
179
+ erlang:demonitor(Ref, [flush]),
180
+ St#state{clients = dict:erase(Pid, St#state.clients)};
181
+ error ->
182
+ St
183
+ end.
184
+
185
+
186
+ -record(monitor, {pid, reference}).
187
+
188
+ -record(entry, {info = undefined, files = [], monitors = sets:new()}).
189
+
190
+ new_monitor(Object, Pid, St) ->
191
+ Ref = make_ref(),
192
+ Monitor = #monitor{pid = Pid, reference = Ref},
193
+ new_monitor(Object, Monitor, Ref,
194
+ St#state{refs = dict:store(Ref, {Pid, Object},
195
+ St#state.refs)}).
196
+
197
+ %% We must separate the namespaces for files and dirs, since we can't
198
+ %% trust the users to keep them distinct; there may be simultaneous file
199
+ %% and dir monitors for the same path.
200
+
201
+ new_monitor({file, Path}, Monitor, Ref, St) ->
202
+ {Ref, St#state{files = add_monitor(Path, Monitor, file,
203
+ St#state.files)}};
204
+ new_monitor({dir, Path}, Monitor, Ref, St) ->
205
+ {Ref, St#state{dirs = add_monitor(Path, Monitor, dir,
206
+ St#state.dirs)}}.
207
+
208
+ %% Adding a new monitor forces an immediate poll of the file, such that
209
+ %% previous monitors only see any real change, while the new monitor
210
+ %% either gets {exists, ...} or {error, ...}.
211
+
212
+ add_monitor(Path, Monitor, Type, Dict) ->
213
+ Entry = case dict:find(Path, Dict) of
214
+ {ok, OldEntry} -> poll_file(Path, OldEntry, Type);
215
+ error -> new_entry(Path, Type)
216
+ end,
217
+ event(#entry{}, dummy_entry(Entry, Monitor), Type, Path),
218
+ NewEntry = Entry#entry{monitors =
219
+ sets:add_element(Monitor,
220
+ Entry#entry.monitors)},
221
+ dict:store(Path, NewEntry, Dict).
222
+
223
+ dummy_entry(Entry, Monitor) ->
224
+ Entry#entry{monitors = sets:add_element(Monitor, sets:new())}.
225
+
226
+ new_entry(Path, Type) ->
227
+ refresh_entry(Path, #entry{monitors = sets:new()}, Type).
228
+
229
+ %% deleting a monitor by reference
230
+
231
+ delete_monitor(Ref, St) ->
232
+ case dict:find(Ref, St#state.refs) of
233
+ {ok, {_Pid, Object}} ->
234
+ St1 = St#state{refs = dict:erase(Ref, St#state.refs)},
235
+ delete_monitor_1(Ref, Object, St1);
236
+ error ->
237
+ St
238
+ end.
239
+
240
+ delete_monitor_1(Ref, {file, Path}, St) ->
241
+ St#state{files = delete_monitor_2(Path, Ref, St#state.files)};
242
+ delete_monitor_1(Ref, {dir, Path}, St) ->
243
+ St#state{dirs = delete_monitor_2(Path, Ref, St#state.dirs)}.
244
+
245
+ delete_monitor_2(Path, Ref, Dict) ->
246
+ case dict:find(Path, Dict) of
247
+ {ok, Entry} ->
248
+ purge_empty_sets(
249
+ dict:store(Path, purge_monitor_ref(Ref, Entry), Dict));
250
+ error ->
251
+ Dict
252
+ end.
253
+
254
+ purge_monitor_ref(Ref, Entry) ->
255
+ Entry#entry{monitors =
256
+ sets:filter(fun (#monitor{reference = R})
257
+ when R == Ref -> false;
258
+ (_) -> true
259
+ end,
260
+ Entry#entry.monitors)}.
261
+
262
+ %% purging monitors belonging to dead clients
263
+
264
+ purge_pid(Pid, St) ->
265
+ Files = dict:map(fun (_Path, Entry) ->
266
+ purge_monitor_pid(Pid, Entry)
267
+ end,
268
+ St#state.files),
269
+ Dirs = dict:map(fun (_Path, Entry) ->
270
+ purge_monitor_pid(Pid, Entry)
271
+ end,
272
+ St#state.dirs),
273
+ Refs = dict:filter(fun (_Ref, {P, _})
274
+ when P == Pid -> false;
275
+ (_, _) -> true
276
+ end,
277
+ St#state.refs),
278
+ St#state{refs = Refs,
279
+ files = purge_empty_sets(Files),
280
+ dirs = purge_empty_sets(Dirs)}.
281
+
282
+ purge_monitor_pid(Pid, Entry) ->
283
+ Entry#entry{monitors =
284
+ sets:filter(fun (#monitor{pid = P})
285
+ when P == Pid -> false;
286
+ (_) -> true
287
+ end,
288
+ Entry#entry.monitors)}.
289
+
290
+ purge_empty_sets(Dict) ->
291
+ dict:filter(fun (_Path, Entry) ->
292
+ sets:size(Entry#entry.monitors) > 0
293
+ end, Dict).
294
+
295
+
296
+ %% generating events upon state changes
297
+
298
+ %% Message formats:
299
+ %% {exists, Path, Type, #file_info{}, Files}
300
+ %% {changed, Path, Type, #file_info{}, Files}
301
+ %% {error, Path, Type, Info}
302
+ %%
303
+ %% Type is dir or file. If Type is file, Files is always []. If Type is
304
+ %% dir, Files is a list of {added, FileName} and {deleted, FileName},
305
+ %% where FileName is relative to dir, without any path component.
306
+ %%
307
+ %% When a new monitor is installed for a path, an initial {exists,...}
308
+ %% or {error,...} message will be sent to the monitor owner.
309
+ %%
310
+ %% Subsequent events will be either {changed,...} or {error,...}.
311
+
312
+ event(#entry{info = Info}, #entry{info = Info}, _Type, _Path) ->
313
+ %% no change in state
314
+ ok;
315
+ event(#entry{info = undefined}, #entry{info = NewInfo}=Entry,
316
+ Type, Path)
317
+ when not is_atom(NewInfo) ->
318
+ %% file or directory exists, for a fresh monitor
319
+ Files = [{added, F} || F <- Entry#entry.files],
320
+ cast({exists, Path, Type, NewInfo, Files}, Entry#entry.monitors);
321
+ event(_OldEntry, #entry{info = NewInfo}=Entry, Type, Path)
322
+ when is_atom(NewInfo) ->
323
+ %% file is not available
324
+ cast({error, Path, Type, NewInfo}, Entry#entry.monitors);
325
+ event(_OldEntry, Entry, file, Path) ->
326
+ %% a normal file has changed
327
+ cast({changed, Path, file, Entry#entry.info, []},
328
+ Entry#entry.monitors);
329
+ event(#entry{info = OldInfo}, #entry{info = NewInfo}=Entry, dir, Path)
330
+ when is_atom(OldInfo) ->
331
+ %% a directory has suddenly become available
332
+ Files = [{added, F} || F <- Entry#entry.files],
333
+ cast({changed, Path, dir, NewInfo, Files}, Entry#entry.monitors);
334
+ event(OldEntry, #entry{info = NewInfo}=Entry, dir, Path) ->
335
+ %% a directory has changed
336
+ Files = diff_lists(Entry#entry.files, OldEntry#entry.files),
337
+ cast({changed, Path, dir, NewInfo, Files}, Entry#entry.monitors).
338
+
339
+
340
+ poll(St) ->
341
+ St#state{files = dict:map(fun (Path, Entry) ->
342
+ poll_file(Path, Entry, file)
343
+ end,
344
+ St#state.files),
345
+ dirs = dict:map(fun (Path, Entry) ->
346
+ poll_file(Path, Entry, dir)
347
+ end,
348
+ St#state.dirs)}.
349
+
350
+ poll_file(Path, Entry, Type) ->
351
+ NewEntry = refresh_entry(Path, Entry, Type),
352
+ event(Entry, NewEntry, Type, Path),
353
+ NewEntry.
354
+
355
+ refresh_entry(Path, Entry, Type) ->
356
+ Info = get_file_info(Path),
357
+ Files = case Type of
358
+ dir when not is_atom(Info) -> get_dir_files(Path);
359
+ _ -> []
360
+ end,
361
+ Entry#entry{info = Info, files = Files}.
362
+
363
+
364
+ %% We clear some fields of the file_info so that we only trigger on real
365
+ %% changes; see the //kernel/file.erl manual and file.hrl for details.
366
+
367
+ get_file_info(Path) ->
368
+ case file:read_file_info(Path) of
369
+ {ok, Info} ->
370
+ Info#file_info{access = undefined,
371
+ atime = undefined};
372
+ {error, Error} ->
373
+ Error % posix error code as atom
374
+ end.
375
+
376
+ %% Listing the members of a directory; note that it yields the empty
377
+ %% list if it fails - this is not the place for error detection.
378
+
379
+ get_dir_files(Path) ->
380
+ case file:list_dir(Path) of
381
+ {ok, Files} -> lists:sort(Files);
382
+ {error, _} -> []
383
+ end.
384
+
385
+ %% both lists must be sorted for this diff to work
386
+
387
+ diff_lists([F1 | Fs1], [F2 | _]=Fs2) when F1 < F2 ->
388
+ [{added, F1} | diff_lists(Fs1, Fs2)];
389
+ diff_lists([F1 | _]=Fs1, [F2 | Fs2]) when F1 > F2 ->
390
+ [{deleted, F2} | diff_lists(Fs1, Fs2)];
391
+ diff_lists([_ | Fs1], [_ | Fs2]) ->
392
+ diff_lists(Fs1, Fs2);
393
+ diff_lists([F | Fs1], Fs2) ->
394
+ [{added, F} | diff_lists(Fs1, Fs2)];
395
+ diff_lists(Fs1, [F | Fs2]) ->
396
+ [{deleted, F} | diff_lists(Fs1, Fs2)];
397
+ diff_lists([], []) ->
398
+ [].
399
+
400
+
401
+ %% Multicasting events to clients
402
+
403
+ cast(Msg, Monitors) ->
404
+ sets:fold(fun (#monitor{pid = Pid, reference = Ref}, Msg) ->
405
+ %%erlang:display({file_monitor, Ref, Msg}),
406
+ Pid ! {file_monitor, Ref, Msg},
407
+ Msg % note that this is a fold, not a map
408
+ end,
409
+ Msg, Monitors).
@@ -0,0 +1,9 @@
1
+ [
2
+ {kernel,
3
+ [{error_logger,
4
+ {file, "priv/eunit.log"}}]},
5
+ {sasl,
6
+ [{sasl_error_logger, false},
7
+ {error_logger_mf_dir, "."},
8
+ {error_logger_mf_maxfiles, 20},
9
+ {error_logger_mf_maxbytes, 1000000}]}].
@@ -0,0 +1 @@
1
+ EUNIT_VSN = 2.0 beta 1
@@ -0,0 +1,238 @@
1
+ %% script generated at {2008,11,23} {3,48,11}
2
+ {script,
3
+ {"client","0.1"},
4
+ [{preLoaded,[erlang,erl_prim_loader,prim_file,prim_inet,init,otp_ring0]},
5
+ {progress,preloaded},
6
+ {path,
7
+ ["/opt/local/lib/erlang/lib/kernel-2.12.5/ebin",
8
+ "/opt/local/lib/erlang/lib/stdlib-1.15.5/ebin"]},
9
+ {primLoad,[error_handler]},
10
+ {kernel_load_completed},
11
+ {progress,kernel_load_completed},
12
+ {path,["/opt/local/lib/erlang/lib/kernel-2.12.5/ebin"]},
13
+ {primLoad,
14
+ [zlib,wrap_log_reader,user_sup,user_drv,user,seq_trace,rpc,ram_file,
15
+ prim_zip,pg2,packages,os,net_kernel,net_adm,net,kernel_config,
16
+ kernel,inet_udp,inet_tcp_dist,inet_tcp,inet_sctp,inet_res,
17
+ inet_parse,inet_hosts,inet_gethost_native,inet_dns,inet_db,
18
+ inet_config,inet6_udp,inet6_tcp_dist,inet6_tcp,inet,
19
+ hipe_unified_loader,heart,group,global_search,global_group,global,
20
+ gen_udp,gen_tcp,gen_sctp,file_server,file_io_server,file,erts_debug,
21
+ error_logger,erl_reply,erl_epmd,erl_distribution,erl_ddll,
22
+ erl_boot_server,dist_util,dist_ac,disk_log_sup,disk_log_server,
23
+ disk_log_1,disk_log,code_server,code,auth,application_starter,
24
+ application_master,application_controller,application]},
25
+ {path,["/opt/local/lib/erlang/lib/stdlib-1.15.5/ebin"]},
26
+ {primLoad,
27
+ [zip,win32reg,unicode,timer,sys,supervisor_bridge,supervisor,string,
28
+ sofs,slave,shell_default,shell,sets,regexp,re,random,queue,qlc_pt,
29
+ qlc,proplists,proc_lib,pool,pg,otp_internal,ordsets,orddict,
30
+ ms_transform,math,log_mf_h,lists,lib,io_lib_pretty,io_lib_fread,
31
+ io_lib_format,io_lib,io,gen_server,gen_fsm,gen_event,gen,gb_trees,
32
+ gb_sets,filename,filelib,file_sorter,eval_bits,ets,escript,
33
+ error_logger_tty_h,error_logger_file_h,erl_tar,erl_scan,erl_pp,
34
+ erl_posix_msg,erl_parse,erl_lint,erl_internal,erl_expand_records,
35
+ erl_eval,erl_compile,erl_bits,epp,edlin_expand,edlin,digraph_utils,
36
+ digraph,dict,dets_v9,dets_v8,dets_utils,dets_sup,dets_server,dets,
37
+ calendar,c,beam_lib,base64,array]},
38
+ {path,["/opt/local/lib/erlang/lib/inets-5.0.12/ebin"]},
39
+ {primLoad,
40
+ [tftp_sup,tftp_logger,tftp_lib,tftp_file,tftp_engine,tftp_binary,
41
+ tftp,mod_trace,mod_security_server,mod_security,mod_responsecontrol,
42
+ mod_range,mod_log,mod_include,mod_htaccess,mod_head,mod_get,mod_esi,
43
+ mod_disk_log,mod_dir,mod_cgi,mod_browser,mod_auth_server,
44
+ mod_auth_plain,mod_auth_mnesia,mod_auth_dets,mod_auth,mod_alias,
45
+ mod_actions,inets_sup,inets_service,inets_app,inets,httpd_util,
46
+ httpd_sup,httpd_socket,httpd_script_env,httpd_response,
47
+ httpd_request_handler,httpd_request,httpd_misc_sup,httpd_manager,
48
+ httpd_log,httpd_instance_sup,httpd_file,httpd_example,httpd_esi,
49
+ httpd_conf,httpd_cgi,httpd_acceptor_sup,httpd_acceptor,httpd,
50
+ httpc_sup,httpc_response,httpc_request,httpc_profile_sup,
51
+ httpc_manager,httpc_handler_sup,httpc_handler,http_util,http_uri,
52
+ http_transport,http_response,http_request,http_cookie,http_chunk,
53
+ http,ftp_sup,ftp_response,ftp_progress,ftp]},
54
+ {path,["/opt/local/lib/erlang/lib/crypto-1.5.3/ebin"]},
55
+ {primLoad,[crypto_sup,crypto_server,crypto_app,crypto]},
56
+ {path,["/opt/local/lib/erlang/lib/sasl-2.1.5.4/ebin"]},
57
+ {primLoad,
58
+ [systools_relup,systools_rc,systools_make,systools_lib,systools,
59
+ sasl_report_tty_h,sasl_report_file_h,sasl_report,sasl,
60
+ release_handler_1,release_handler,rb_format_supp,rb,overload,
61
+ misc_supp,format_lib_supp,erlsrv,alarm_handler]},
62
+ {path,
63
+ ["/Users/petegolibersuch/Development/ruby/poolparty/lib/erlang/messenger/ebin"]},
64
+ {primLoad,
65
+ [utils,pm_client_supervisor,pm_client,client_server,client_app]},
66
+ {progress,modules_loaded},
67
+ {path,
68
+ ["/opt/local/lib/erlang/lib/kernel-2.12.5/ebin",
69
+ "/opt/local/lib/erlang/lib/stdlib-1.15.5/ebin",
70
+ "/opt/local/lib/erlang/lib/inets-5.0.12/ebin",
71
+ "/opt/local/lib/erlang/lib/crypto-1.5.3/ebin",
72
+ "/opt/local/lib/erlang/lib/sasl-2.1.5.4/ebin",
73
+ "/Users/petegolibersuch/Development/ruby/poolparty/lib/erlang/messenger/ebin"]},
74
+ {kernelProcess,heart,{heart,start,[]}},
75
+ {kernelProcess,error_logger,{error_logger,start_link,[]}},
76
+ {kernelProcess,application_controller,
77
+ {application_controller,start,
78
+ [{application,kernel,
79
+ [{description,"ERTS CXC 138 10"},
80
+ {vsn,"2.12.5"},
81
+ {id,[]},
82
+ {modules,
83
+ [application,application_controller,application_master,
84
+ application_starter,auth,code,packages,code_server,
85
+ dist_util,erl_boot_server,erl_distribution,
86
+ erl_prim_loader,erl_reply,erlang,error_handler,
87
+ error_logger,file,file_server,file_io_server,
88
+ prim_file,prim_zip,global,global_group,global_search,
89
+ group,heart,hipe_unified_loader,inet6_tcp,
90
+ inet6_tcp_dist,inet6_udp,inet_config,inet_hosts,
91
+ inet_gethost_native,inet_tcp_dist,init,kernel,
92
+ kernel_config,net,net_adm,net_kernel,os,ram_file,rpc,
93
+ user,user_drv,user_sup,disk_log,disk_log_1,
94
+ disk_log_server,disk_log_sup,dist_ac,erl_ddll,
95
+ erl_epmd,erts_debug,gen_tcp,gen_udp,gen_sctp,
96
+ prim_inet,inet,inet_db,inet_dns,inet_parse,inet_res,
97
+ inet_tcp,inet_udp,inet_sctp,pg2,seq_trace,
98
+ wrap_log_reader,zlib,otp_ring0]},
99
+ {registered,
100
+ [application_controller,erl_reply,auth,boot_server,
101
+ code_server,disk_log_server,disk_log_sup,
102
+ erl_prim_loader,error_logger,file_server_2,
103
+ fixtable_server,global_group,global_name_server,heart,
104
+ init,kernel_config,kernel_sup,net_kernel,net_sup,rex,
105
+ user,os_server,ddll_server,erl_epmd,inet_db,pg2]},
106
+ {applications,[]},
107
+ {included_applications,[]},
108
+ {env,[{error_logger,tty}]},
109
+ {start_phases,undefined},
110
+ {maxT,infinity},
111
+ {maxP,infinity},
112
+ {mod,{kernel,[]}}]}]}},
113
+ {progress,init_kernel_started},
114
+ {apply,
115
+ {application,load,
116
+ [{application,stdlib,
117
+ [{description,"ERTS CXC 138 10"},
118
+ {vsn,"1.15.5"},
119
+ {id,[]},
120
+ {modules,
121
+ [array,base64,beam_lib,c,calendar,dets,dets_server,
122
+ dets_sup,dets_utils,dets_v8,dets_v9,dict,digraph,
123
+ digraph_utils,edlin,edlin_expand,epp,eval_bits,
124
+ erl_bits,erl_compile,erl_eval,erl_expand_records,
125
+ erl_internal,erl_lint,erl_parse,erl_posix_msg,erl_pp,
126
+ erl_scan,erl_tar,error_logger_file_h,
127
+ error_logger_tty_h,escript,ets,file_sorter,filelib,
128
+ filename,gb_trees,gb_sets,gen,gen_event,gen_fsm,
129
+ gen_server,io,io_lib,io_lib_format,io_lib_fread,
130
+ io_lib_pretty,lib,lists,log_mf_h,math,ms_transform,
131
+ orddict,ordsets,otp_internal,pg,pool,proc_lib,
132
+ proplists,qlc,qlc_pt,queue,random,re,regexp,sets,
133
+ shell,shell_default,slave,sofs,string,supervisor,
134
+ supervisor_bridge,sys,timer,unicode,win32reg,zip]},
135
+ {registered,
136
+ [timer_server,rsh_starter,take_over_monitor,
137
+ pool_master,dets]},
138
+ {applications,[kernel]},
139
+ {included_applications,[]},
140
+ {env,[]},
141
+ {start_phases,undefined},
142
+ {maxT,infinity},
143
+ {maxP,infinity}]}]}},
144
+ {apply,
145
+ {application,load,
146
+ [{application,inets,
147
+ [{description,"INETS CXC 138 49"},
148
+ {vsn,"5.0.12"},
149
+ {id,[]},
150
+ {modules,
151
+ [inets,inets_sup,inets_app,inets_service,ftp,
152
+ ftp_progress,ftp_response,ftp_sup,http,httpc_handler,
153
+ httpc_handler_sup,httpc_manager,httpc_profile_sup,
154
+ httpc_request,httpc_response,httpc_sup,http_cookie,
155
+ http_uri,http_chunk,http_request,http_response,
156
+ http_transport,http_util,httpd,httpd_acceptor,
157
+ httpd_acceptor_sup,httpd_cgi,httpd_conf,httpd_esi,
158
+ httpd_example,httpd_file,httpd_instance_sup,httpd_log,
159
+ httpd_manager,httpd_misc_sup,httpd_request,
160
+ httpd_request_handler,httpd_response,httpd_script_env,
161
+ httpd_socket,httpd_sup,httpd_util,mod_actions,
162
+ mod_alias,mod_auth,mod_auth_dets,mod_auth_mnesia,
163
+ mod_auth_plain,mod_auth_server,mod_browser,mod_cgi,
164
+ mod_dir,mod_disk_log,mod_esi,mod_get,mod_head,
165
+ mod_htaccess,mod_include,mod_log,mod_range,
166
+ mod_responsecontrol,mod_security,mod_security_server,
167
+ mod_trace,tftp,tftp_binary,tftp_engine,tftp_file,
168
+ tftp_lib,tftp_logger,tftp_sup]},
169
+ {registered,[inets_sup,httpc_manager]},
170
+ {applications,[kernel,stdlib]},
171
+ {included_applications,[]},
172
+ {env,[]},
173
+ {start_phases,undefined},
174
+ {maxT,infinity},
175
+ {maxP,infinity},
176
+ {mod,{inets_app,[]}}]}]}},
177
+ {apply,
178
+ {application,load,
179
+ [{application,crypto,
180
+ [{description,"CRYPTO version 1"},
181
+ {vsn,"1.5.3"},
182
+ {id,[]},
183
+ {modules,[crypto,crypto_app,crypto_sup,crypto_server]},
184
+ {registered,[crypto_sup,crypto_server]},
185
+ {applications,[kernel,stdlib]},
186
+ {included_applications,[]},
187
+ {env,[]},
188
+ {start_phases,undefined},
189
+ {maxT,infinity},
190
+ {maxP,infinity},
191
+ {mod,{crypto_app,[]}}]}]}},
192
+ {apply,
193
+ {application,load,
194
+ [{application,sasl,
195
+ [{description,"SASL CXC 138 11"},
196
+ {vsn,"2.1.5.4"},
197
+ {id,[]},
198
+ {modules,
199
+ [sasl,alarm_handler,format_lib_supp,misc_supp,overload,
200
+ rb,rb_format_supp,release_handler,release_handler_1,
201
+ erlsrv,sasl_report,sasl_report_tty_h,
202
+ sasl_report_file_h,systools,systools_make,systools_rc,
203
+ systools_relup,systools_lib]},
204
+ {registered,
205
+ [sasl_sup,alarm_handler,overload,release_handler]},
206
+ {applications,[kernel,stdlib]},
207
+ {included_applications,[]},
208
+ {env,[{sasl_error_logger,tty},{errlog_type,all}]},
209
+ {start_phases,undefined},
210
+ {maxT,infinity},
211
+ {maxP,infinity},
212
+ {mod,{sasl,[]}}]}]}},
213
+ {apply,
214
+ {application,load,
215
+ [{application,client,
216
+ [{description,"Client Server for PoolParty"},
217
+ {vsn,"0.1"},
218
+ {id,[]},
219
+ {modules,
220
+ [client_app,pm_client,client_server,
221
+ pm_client_supervisor,utils]},
222
+ {registered,[client_server,pm_client_supervisor]},
223
+ {applications,[kernel,stdlib]},
224
+ {included_applications,[]},
225
+ {env,[]},
226
+ {start_phases,[]},
227
+ {maxT,infinity},
228
+ {maxP,infinity},
229
+ {mod,{client_app,[]}}]}]}},
230
+ {progress,applications_loaded},
231
+ {apply,{application,start_boot,[kernel,permanent]}},
232
+ {apply,{application,start_boot,[stdlib,permanent]}},
233
+ {apply,{application,start_boot,[inets,permanent]}},
234
+ {apply,{application,start_boot,[crypto,permanent]}},
235
+ {apply,{application,start_boot,[sasl,permanent]}},
236
+ {apply,{application,start_boot,[client,permanent]}},
237
+ {apply,{c,erlangrc,[]}},
238
+ {progress,started}]}.