cloud-toaster 1.1.2

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 (515) hide show
  1. checksums.yaml +15 -0
  2. data/LICENSE +202 -0
  3. data/README.md +54 -0
  4. data/Rakefile +51 -0
  5. data/VERSION +1 -0
  6. data/bin/strace-4.8_patched/strace-i686 +0 -0
  7. data/bin/strace-4.8_patched/strace-x86_64 +0 -0
  8. data/bin/toaster +74 -0
  9. data/chef/cookbooks/chef-solo-search/CHANGELOG +16 -0
  10. data/chef/cookbooks/chef-solo-search/Gemfile +8 -0
  11. data/chef/cookbooks/chef-solo-search/LICENSE +202 -0
  12. data/chef/cookbooks/chef-solo-search/NOTICE +18 -0
  13. data/chef/cookbooks/chef-solo-search/README.md +143 -0
  14. data/chef/cookbooks/chef-solo-search/Rakefile +10 -0
  15. data/chef/cookbooks/chef-solo-search/libraries/search/overrides.rb +100 -0
  16. data/chef/cookbooks/chef-solo-search/libraries/search/parser.rb +222 -0
  17. data/chef/cookbooks/chef-solo-search/libraries/search.rb +75 -0
  18. data/chef/cookbooks/chef-solo-search/libraries/vendor/chef/solr_query/lucene.treetop +150 -0
  19. data/chef/cookbooks/chef-solo-search/libraries/vendor/chef/solr_query/lucene_nodes.rb +285 -0
  20. data/chef/cookbooks/chef-solo-search/libraries/vendor/chef/solr_query/query_transform.rb +65 -0
  21. data/chef/cookbooks/chef-solo-search/metadata.rb +11 -0
  22. data/chef/cookbooks/chef-solo-search/recipes/default.rb +3 -0
  23. data/chef/cookbooks/chef-solo-search/tests/data/data_bags/node/alpha.json +10 -0
  24. data/chef/cookbooks/chef-solo-search/tests/data/data_bags/node/beta.json +10 -0
  25. data/chef/cookbooks/chef-solo-search/tests/data/data_bags/node/without_json_class.json +7 -0
  26. data/chef/cookbooks/chef-solo-search/tests/data/data_bags/users/jerry.json +8 -0
  27. data/chef/cookbooks/chef-solo-search/tests/data/data_bags/users/lea.json +10 -0
  28. data/chef/cookbooks/chef-solo-search/tests/data/data_bags/users/mike.json +13 -0
  29. data/chef/cookbooks/chef-solo-search/tests/data/data_bags/users/tom.json +10 -0
  30. data/chef/cookbooks/chef-solo-search/tests/gemfiles/Gemfile.10 +4 -0
  31. data/chef/cookbooks/chef-solo-search/tests/gemfiles/Gemfile.11 +5 -0
  32. data/chef/cookbooks/chef-solo-search/tests/test_data_bags.rb +45 -0
  33. data/chef/cookbooks/chef-solo-search/tests/test_search.rb +244 -0
  34. data/chef/cookbooks/lxc/attributes/create_lxc.rb +8 -0
  35. data/chef/cookbooks/lxc/attributes/general.rb +15 -0
  36. data/chef/cookbooks/lxc/attributes/init_bare_os.rb +15 -0
  37. data/chef/cookbooks/lxc/attributes/init_proto.rb +18 -0
  38. data/chef/cookbooks/lxc/attributes/install_ruby.rb +51 -0
  39. data/chef/cookbooks/lxc/attributes/mount_volume.rb +11 -0
  40. data/chef/cookbooks/lxc/attributes/setup_host.rb +9 -0
  41. data/chef/cookbooks/lxc/attributes/setup_proxy.rb +3 -0
  42. data/chef/cookbooks/lxc/attributes/start_lxc.rb +11 -0
  43. data/chef/cookbooks/lxc/attributes/stop_lxc.rb +3 -0
  44. data/chef/cookbooks/lxc/files/install.chef.sh +78 -0
  45. data/chef/cookbooks/lxc/metadata.json +6 -0
  46. data/chef/cookbooks/lxc/recipes/create_lxc.rb +106 -0
  47. data/chef/cookbooks/lxc/recipes/init_bare_os.rb +82 -0
  48. data/chef/cookbooks/lxc/recipes/init_proto.rb +417 -0
  49. data/chef/cookbooks/lxc/recipes/install_docker.rb +61 -0
  50. data/chef/cookbooks/lxc/recipes/install_ruby.rb +28 -0
  51. data/chef/cookbooks/lxc/recipes/mount_volume.rb +63 -0
  52. data/chef/cookbooks/lxc/recipes/setup_database.rb +22 -0
  53. data/chef/cookbooks/lxc/recipes/setup_host.rb +179 -0
  54. data/chef/cookbooks/lxc/recipes/setup_proxy.rb +157 -0
  55. data/chef/cookbooks/lxc/recipes/start_lxc.rb +180 -0
  56. data/chef/cookbooks/lxc/recipes/stop_lxc.rb +86 -0
  57. data/chef/cookbooks/mysql/CHANGELOG.md +391 -0
  58. data/chef/cookbooks/mysql/README.md +211 -0
  59. data/chef/cookbooks/mysql/attributes/default.rb +22 -0
  60. data/chef/cookbooks/mysql/libraries/helpers.rb +277 -0
  61. data/chef/cookbooks/mysql/libraries/matchers.rb +17 -0
  62. data/chef/cookbooks/mysql/libraries/provider_mysql_client.rb +10 -0
  63. data/chef/cookbooks/mysql/libraries/provider_mysql_client_debian.rb +37 -0
  64. data/chef/cookbooks/mysql/libraries/provider_mysql_client_fedora.rb +38 -0
  65. data/chef/cookbooks/mysql/libraries/provider_mysql_client_freebsd.rb +33 -0
  66. data/chef/cookbooks/mysql/libraries/provider_mysql_client_omnios.rb +41 -0
  67. data/chef/cookbooks/mysql/libraries/provider_mysql_client_rhel.rb +42 -0
  68. data/chef/cookbooks/mysql/libraries/provider_mysql_client_smartos.rb +33 -0
  69. data/chef/cookbooks/mysql/libraries/provider_mysql_client_suse.rb +37 -0
  70. data/chef/cookbooks/mysql/libraries/provider_mysql_client_ubuntu.rb +37 -0
  71. data/chef/cookbooks/mysql/libraries/provider_mysql_service.rb +10 -0
  72. data/chef/cookbooks/mysql/libraries/provider_mysql_service_debian.rb +193 -0
  73. data/chef/cookbooks/mysql/libraries/provider_mysql_service_fedora.rb +157 -0
  74. data/chef/cookbooks/mysql/libraries/provider_mysql_service_freebsd.rb +151 -0
  75. data/chef/cookbooks/mysql/libraries/provider_mysql_service_omnios.rb +232 -0
  76. data/chef/cookbooks/mysql/libraries/provider_mysql_service_rhel.rb +318 -0
  77. data/chef/cookbooks/mysql/libraries/provider_mysql_service_smartos.rb +216 -0
  78. data/chef/cookbooks/mysql/libraries/provider_mysql_service_suse.rb +170 -0
  79. data/chef/cookbooks/mysql/libraries/provider_mysql_service_ubuntu.rb +218 -0
  80. data/chef/cookbooks/mysql/libraries/resource_mysql_client.rb +11 -0
  81. data/chef/cookbooks/mysql/libraries/resource_mysql_service.rb +194 -0
  82. data/chef/cookbooks/mysql/metadata.json +40 -0
  83. data/chef/cookbooks/mysql/metadata.rb +20 -0
  84. data/chef/cookbooks/mysql/recipes/client.rb +22 -0
  85. data/chef/cookbooks/mysql/recipes/server.rb +33 -0
  86. data/chef/cookbooks/mysql/recipes/server_deprecated.rb +23 -0
  87. data/chef/cookbooks/mysql/templates/default/5.0/my.cnf.erb +38 -0
  88. data/chef/cookbooks/mysql/templates/default/5.1/my.cnf.erb +38 -0
  89. data/chef/cookbooks/mysql/templates/default/5.5/my.cnf.erb +38 -0
  90. data/chef/cookbooks/mysql/templates/default/5.6/my.cnf.erb +39 -0
  91. data/chef/cookbooks/mysql/templates/default/apparmor/usr.sbin.mysqld.erb +40 -0
  92. data/chef/cookbooks/mysql/templates/default/debian/debian.cnf.erb +12 -0
  93. data/chef/cookbooks/mysql/templates/default/debian/mysql-server.seed.erb +10 -0
  94. data/chef/cookbooks/mysql/templates/default/deprecated/my.cnf.erb +374 -0
  95. data/chef/cookbooks/mysql/templates/default/grants/grants.sql.erb +27 -0
  96. data/chef/cookbooks/mysql/templates/default/omnios/mysql.xml.erb +26 -0
  97. data/chef/cookbooks/mysql/templates/default/omnios/svc.method.mysqld.erb +29 -0
  98. data/chef/cookbooks/mysql/templates/default/smartos/mysql.xml.erb +32 -0
  99. data/chef/cookbooks/mysql/templates/default/smartos/svc.method.mysqld.erb +29 -0
  100. data/chef/cookbooks/openssl/README.md +37 -0
  101. data/chef/cookbooks/openssl/libraries/secure_password.rb +37 -0
  102. data/chef/cookbooks/openssl/metadata.json +30 -0
  103. data/chef/cookbooks/openssl/metadata.rb +8 -0
  104. data/chef/cookbooks/openssl/recipes/default.rb +19 -0
  105. data/chef/cookbooks/ssh/attributes/default.rb +8 -0
  106. data/chef/cookbooks/ssh/recipes/authorize_key.rb +20 -0
  107. data/chef/cookbooks/toaster/attributes/testing.rb +37 -0
  108. data/chef/cookbooks/toaster/libraries/default.rb +61 -0
  109. data/chef/cookbooks/toaster/recipes/post__cakephp__default.rb +27 -0
  110. data/chef/cookbooks/toaster/recipes/post__cube__default.rb +26 -0
  111. data/chef/cookbooks/toaster/recipes/post__drupal__default.rb +16 -0
  112. data/chef/cookbooks/toaster/recipes/post__icinga__default.rb +9 -0
  113. data/chef/cookbooks/toaster/recipes/post__node__default.rb +16 -0
  114. data/chef/cookbooks/toaster/recipes/post__virtualbox__default.rb +12 -0
  115. data/chef/cookbooks/toaster/recipes/post__wordpress__default.rb +12 -0
  116. data/chef/cookbooks/toaster/recipes/pre__aegir__default.rb +12 -0
  117. data/chef/cookbooks/toaster/recipes/pre__app__default.rb +3 -0
  118. data/chef/cookbooks/toaster/recipes/pre__cakephp__default.rb +24 -0
  119. data/chef/cookbooks/toaster/recipes/pre__cube__default.rb +9 -0
  120. data/chef/cookbooks/toaster/recipes/pre__disco__default.rb +21 -0
  121. data/chef/cookbooks/toaster/recipes/pre__drbd__default.rb +7 -0
  122. data/chef/cookbooks/toaster/recipes/pre__eaccelerator__default.rb +2 -0
  123. data/chef/cookbooks/toaster/recipes/pre__elasticsearch-head__default.rb +11 -0
  124. data/chef/cookbooks/toaster/recipes/pre__elasticsearch__default.rb +6 -0
  125. data/chef/cookbooks/toaster/recipes/pre__gitosis__default.rb +17 -0
  126. data/chef/cookbooks/toaster/recipes/pre__kafka__default.rb +3 -0
  127. data/chef/cookbooks/toaster/recipes/pre__munin__server.rb +6 -0
  128. data/chef/cookbooks/toaster/recipes/pre__mysql__server.rb +4 -0
  129. data/chef/cookbooks/toaster/recipes/pre__nagios__default.rb +3 -0
  130. data/chef/cookbooks/toaster/recipes/pre__netkernel__default.rb +24 -0
  131. data/chef/cookbooks/toaster/recipes/pre__php__default.rb +2 -0
  132. data/chef/cookbooks/toaster/recipes/pre__postgresql__server.rb +3 -0
  133. data/chef/cookbooks/toaster/recipes/pre__pxe_dust__default.rb +9 -0
  134. data/chef/cookbooks/toaster/recipes/pre__pxe_install_server__default.rb +6 -0
  135. data/chef/cookbooks/toaster/recipes/pre__riak__default.rb +40 -0
  136. data/chef/cookbooks/toaster/recipes/pre__sensu__default.rb +9 -0
  137. data/chef/cookbooks/toaster/recipes/pre__sol__default.rb +2 -0
  138. data/chef/cookbooks/toaster/recipes/pre__solr__default.rb +6 -0
  139. data/chef/cookbooks/toaster/recipes/pre__sonar__default.rb +2 -0
  140. data/chef/cookbooks/toaster/recipes/pre__storm__default.rb +3 -0
  141. data/chef/cookbooks/toaster/recipes/pre__vmware__tools.rb +4 -0
  142. data/chef/cookbooks/toaster/recipes/pre__wordpress__default.rb +17 -0
  143. data/chef/cookbooks/toaster/recipes/pre__xen__default.rb +7 -0
  144. data/chef/cookbooks/toaster/recipes/pre__znc__default.rb +7 -0
  145. data/chef/cookbooks/toaster/recipes/testing.rb +241 -0
  146. data/chef/cookbooks/toaster/recipes/testing_post.rb +36 -0
  147. data/chef/cookbooks/yum/CHANGELOG.md +212 -0
  148. data/chef/cookbooks/yum/README.md +268 -0
  149. data/chef/cookbooks/yum/attributes/main.rb +97 -0
  150. data/chef/cookbooks/yum/libraries/matchers.rb +27 -0
  151. data/chef/cookbooks/yum/metadata.json +34 -0
  152. data/chef/cookbooks/yum/metadata.rb +13 -0
  153. data/chef/cookbooks/yum/providers/globalconfig.rb +37 -0
  154. data/chef/cookbooks/yum/providers/repository.rb +85 -0
  155. data/chef/cookbooks/yum/recipes/default.rb +34 -0
  156. data/chef/cookbooks/yum/resources/globalconfig.rb +105 -0
  157. data/chef/cookbooks/yum/resources/repository.rb +63 -0
  158. data/chef/cookbooks/yum/templates/default/main.erb +251 -0
  159. data/chef/cookbooks/yum/templates/default/repo.erb +109 -0
  160. data/chef/cookbooks/yum-mysql-community/CHANGELOG.md +67 -0
  161. data/chef/cookbooks/yum-mysql-community/README.md +137 -0
  162. data/chef/cookbooks/yum-mysql-community/attributes/mysql-connectors-community.rb +31 -0
  163. data/chef/cookbooks/yum-mysql-community/attributes/mysql55-community.rb +29 -0
  164. data/chef/cookbooks/yum-mysql-community/attributes/mysql56-community.rb +31 -0
  165. data/chef/cookbooks/yum-mysql-community/files/default/mysql_pubkey.asc +33 -0
  166. data/chef/cookbooks/yum-mysql-community/metadata.json +30 -0
  167. data/chef/cookbooks/yum-mysql-community/metadata.rb +8 -0
  168. data/chef/cookbooks/yum-mysql-community/recipes/connectors.rb +48 -0
  169. data/chef/cookbooks/yum-mysql-community/recipes/mysql55.rb +48 -0
  170. data/chef/cookbooks/yum-mysql-community/recipes/mysql56.rb +48 -0
  171. data/config.json +34 -0
  172. data/lib/toaster/api.rb +447 -0
  173. data/lib/toaster/chef/chef_listener.rb +514 -0
  174. data/lib/toaster/chef/chef_node_inspector.rb +165 -0
  175. data/lib/toaster/chef/chef_util.rb +865 -0
  176. data/lib/toaster/chef/failsafe_resource_parser.rb +140 -0
  177. data/lib/toaster/chef/resource_inspector.rb +536 -0
  178. data/lib/toaster/db/cache.rb +98 -0
  179. data/lib/toaster/db/cached_db.rb +53 -0
  180. data/lib/toaster/db/cgi_session_cache.rb +209 -0
  181. data/lib/toaster/db/db.rb +98 -0
  182. data/lib/toaster/db/mysql.rb +18 -0
  183. data/lib/toaster/db/ram_cache.rb +203 -0
  184. data/lib/toaster/markup/jdom-1.1.jar +0 -0
  185. data/lib/toaster/markup/jdom-b7.jar +0 -0
  186. data/lib/toaster/markup/markup_util.rb +437 -0
  187. data/lib/toaster/markup/vmtools-utils-0.5.jar +0 -0
  188. data/lib/toaster/markup/xmldiff.sh +5 -0
  189. data/lib/toaster/model/additional_property.rb +11 -0
  190. data/lib/toaster/model/automation.rb +218 -0
  191. data/lib/toaster/model/automation_attribute.rb +13 -0
  192. data/lib/toaster/model/automation_run.rb +104 -0
  193. data/lib/toaster/model/ignore_property.rb +11 -0
  194. data/lib/toaster/model/key_value_pair.rb +59 -0
  195. data/lib/toaster/model/run_attribute.rb +17 -0
  196. data/lib/toaster/model/state.rb +17 -0
  197. data/lib/toaster/model/state_change.rb +79 -0
  198. data/lib/toaster/model/task.rb +292 -0
  199. data/lib/toaster/model/task_execution.rb +76 -0
  200. data/lib/toaster/model/task_parameter.rb +66 -0
  201. data/lib/toaster/model/user.rb +32 -0
  202. data/lib/toaster/ohai/_disabled_/network_ports.rb +81 -0
  203. data/lib/toaster/ohai/apache/apache.rb +48 -0
  204. data/lib/toaster/ohai/cron/cron.rb +32 -0
  205. data/lib/toaster/ohai/files/_meta.rb +30 -0
  206. data/lib/toaster/ohai/files/files.rb +20 -0
  207. data/lib/toaster/ohai/gems/gems.rb +19 -0
  208. data/lib/toaster/ohai/groups/groups.rb +20 -0
  209. data/lib/toaster/ohai/iptables/iptables.rb +48 -0
  210. data/lib/toaster/ohai/mounts/mounts.rb +26 -0
  211. data/lib/toaster/ohai/mysql/mysql.rb +31 -0
  212. data/lib/toaster/ohai/packages/_meta.rb +86 -0
  213. data/lib/toaster/ohai/packages/packages.rb +33 -0
  214. data/lib/toaster/ohai/ports/ports.rb +21 -0
  215. data/lib/toaster/ohai/routes/routes.rb +25 -0
  216. data/lib/toaster/ohai/services/services.rb +42 -0
  217. data/lib/toaster/ohai/users/users.rb +17 -0
  218. data/lib/toaster/state/convergence.rb +197 -0
  219. data/lib/toaster/state/idempotence.rb +192 -0
  220. data/lib/toaster/state/ptrace_util.rb +48 -0
  221. data/lib/toaster/state/state_node.rb +105 -0
  222. data/lib/toaster/state/state_transition.rb +38 -0
  223. data/lib/toaster/state/state_transition_graph.rb +701 -0
  224. data/lib/toaster/state/syscall_tracer.rb +317 -0
  225. data/lib/toaster/state/system_state.rb +349 -0
  226. data/lib/toaster/state/transition_edge.rb +65 -0
  227. data/lib/toaster/test/test_attribute.rb +19 -0
  228. data/lib/toaster/test/test_case.rb +175 -0
  229. data/lib/toaster/test/test_coverage.rb +147 -0
  230. data/lib/toaster/test/test_coverage_goal.rb +108 -0
  231. data/lib/toaster/test/test_generator.rb +246 -0
  232. data/lib/toaster/test/test_orchestrator.rb +165 -0
  233. data/lib/toaster/test/test_result.rb +73 -0
  234. data/lib/toaster/test/test_runner.rb +394 -0
  235. data/lib/toaster/test/test_suite.rb +151 -0
  236. data/lib/toaster/test_manager.rb +281 -0
  237. data/lib/toaster/toaster_app_service.rb +141 -0
  238. data/lib/toaster/util/blocking_map.rb +80 -0
  239. data/lib/toaster/util/combinatorial.rb +58 -0
  240. data/lib/toaster/util/config.rb +103 -0
  241. data/lib/toaster/util/docker.rb +71 -0
  242. data/lib/toaster/util/logging.rb +19 -0
  243. data/lib/toaster/util/lxc.rb +383 -0
  244. data/lib/toaster/util/mem_dump.rb +38 -0
  245. data/lib/toaster/util/proxy.rb +23 -0
  246. data/lib/toaster/util/timestamp.rb +131 -0
  247. data/lib/toaster/util/util.rb +437 -0
  248. data/lib/toaster/web_ui.rb +7 -0
  249. data/webapp/Gemfile +46 -0
  250. data/webapp/Gemfile.lock +237 -0
  251. data/webapp/Rakefile +6 -0
  252. data/webapp/app/assets/fonts/font.woff +0 -0
  253. data/webapp/app/assets/images/final_state.gif +0 -0
  254. data/webapp/app/assets/images/initial_state.gif +0 -0
  255. data/webapp/app/assets/images/loading.gif +0 -0
  256. data/webapp/app/assets/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  257. data/webapp/app/assets/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  258. data/webapp/app/assets/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  259. data/webapp/app/assets/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  260. data/webapp/app/assets/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  261. data/webapp/app/assets/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  262. data/webapp/app/assets/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  263. data/webapp/app/assets/images/ui-icons_222222_256x240.png +0 -0
  264. data/webapp/app/assets/javascripts/analysis.js.coffee +3 -0
  265. data/webapp/app/assets/javascripts/application.js +16 -0
  266. data/webapp/app/assets/javascripts/execs.js.coffee +3 -0
  267. data/webapp/app/assets/javascripts/graph.js +441 -0
  268. data/webapp/app/assets/javascripts/jquery-1.7.2.js +9404 -0
  269. data/webapp/app/assets/javascripts/jquery-ui-1.8.22.js +11529 -0
  270. data/webapp/app/assets/javascripts/jquery.cookie.js +96 -0
  271. data/webapp/app/assets/javascripts/jquery.hotkeys.js +99 -0
  272. data/webapp/app/assets/javascripts/jquery.jstree.js +4551 -0
  273. data/webapp/app/assets/javascripts/jsPlumb/jquery.jsPlumb-1.3.14-all-min.js +1 -0
  274. data/webapp/app/assets/javascripts/jstree.util.js +53 -0
  275. data/webapp/app/assets/javascripts/scripts.js.coffee +3 -0
  276. data/webapp/app/assets/javascripts/settings.js.coffee +3 -0
  277. data/webapp/app/assets/javascripts/test.js.coffee +3 -0
  278. data/webapp/app/assets/javascripts/util.js.coffee +3 -0
  279. data/webapp/app/assets/stylesheets/analysis.css.scss +3 -0
  280. data/webapp/app/assets/stylesheets/application.css +49 -0
  281. data/webapp/app/assets/stylesheets/execs.css.scss +3 -0
  282. data/webapp/app/assets/stylesheets/graph.css +159 -0
  283. data/webapp/app/assets/stylesheets/jquery-ui-1.8.6.custom.css +572 -0
  284. data/webapp/app/assets/stylesheets/layout.css +151 -0
  285. data/webapp/app/assets/stylesheets/menu.css +186 -0
  286. data/webapp/app/assets/stylesheets/reset.css +41 -0
  287. data/webapp/app/assets/stylesheets/scripts.css.scss +3 -0
  288. data/webapp/app/assets/stylesheets/settings.css.scss +3 -0
  289. data/webapp/app/assets/stylesheets/test.css.scss +3 -0
  290. data/webapp/app/assets/stylesheets/util.css.scss +3 -0
  291. data/webapp/app/assets/stylesheets/websymbols/websymbols-regular-webfont.eot +0 -0
  292. data/webapp/app/assets/stylesheets/websymbols/websymbols-regular-webfont.svg +1 -0
  293. data/webapp/app/assets/stylesheets/websymbols/websymbols-regular-webfont.ttf +0 -0
  294. data/webapp/app/assets/stylesheets/websymbols/websymbols-regular-webfont.woff +0 -0
  295. data/webapp/app/controllers/analysis_controller.rb +7 -0
  296. data/webapp/app/controllers/application_controller.rb +14 -0
  297. data/webapp/app/controllers/base_controller.rb +91 -0
  298. data/webapp/app/controllers/execs_controller.rb +59 -0
  299. data/webapp/app/controllers/graph_controller.rb +17 -0
  300. data/webapp/app/controllers/scripts_controller.rb +166 -0
  301. data/webapp/app/controllers/settings_controller.rb +10 -0
  302. data/webapp/app/controllers/test_controller.rb +127 -0
  303. data/webapp/app/controllers/util_controller.rb +6 -0
  304. data/webapp/app/helpers/analysis_helper.rb +2 -0
  305. data/webapp/app/helpers/application_helper.rb +2 -0
  306. data/webapp/app/helpers/automations_helper.rb +2 -0
  307. data/webapp/app/helpers/execs_helper.rb +2 -0
  308. data/webapp/app/helpers/scripts_helper.rb +2 -0
  309. data/webapp/app/helpers/settings_helper.rb +2 -0
  310. data/webapp/app/helpers/test_helper.rb +2 -0
  311. data/webapp/app/helpers/util_helper.rb +2 -0
  312. data/webapp/app/views/analysis/convergence.html.erb +156 -0
  313. data/webapp/app/views/analysis/idempotence.html.erb +2 -0
  314. data/webapp/app/views/execs/automation_runs.html.erb +98 -0
  315. data/webapp/app/views/execs/task_executions.html.erb +154 -0
  316. data/webapp/app/views/graph/graph_frame.html +101 -0
  317. data/webapp/app/views/layouts/application.html.erb +114 -0
  318. data/webapp/app/views/scripts/edit.html.erb +58 -0
  319. data/webapp/app/views/scripts/graph.html.erb +75 -0
  320. data/webapp/app/views/scripts/import_chef.html.erb +104 -0
  321. data/webapp/app/views/scripts/scripts.html.erb +116 -0
  322. data/webapp/app/views/scripts/tasks.html.erb +139 -0
  323. data/webapp/app/views/settings/containers.html.erb +161 -0
  324. data/webapp/app/views/settings/index.html.erb +51 -0
  325. data/webapp/app/views/test/cases.html.erb +2 -0
  326. data/webapp/app/views/test/gen.html.erb +229 -0
  327. data/webapp/app/views/test/suites.html.erb +205 -0
  328. data/webapp/app/views/util/chef.html.erb +53 -0
  329. data/webapp/bin/bundle +3 -0
  330. data/webapp/bin/rails +4 -0
  331. data/webapp/bin/rake +4 -0
  332. data/webapp/config/application.rb +28 -0
  333. data/webapp/config/boot.rb +18 -0
  334. data/webapp/config/database.yml +42 -0
  335. data/webapp/config/environment.rb +5 -0
  336. data/webapp/config/environments/development.rb +35 -0
  337. data/webapp/config/environments/production.rb +80 -0
  338. data/webapp/config/environments/test.rb +36 -0
  339. data/webapp/config/initializers/backtrace_silencers.rb +7 -0
  340. data/webapp/config/initializers/devise.rb +256 -0
  341. data/webapp/config/initializers/filter_parameter_logging.rb +4 -0
  342. data/webapp/config/initializers/inflections.rb +16 -0
  343. data/webapp/config/initializers/mime_types.rb +5 -0
  344. data/webapp/config/initializers/patches.rb +13 -0
  345. data/webapp/config/initializers/secret_token.rb +12 -0
  346. data/webapp/config/initializers/session_store.rb +6 -0
  347. data/webapp/config/initializers/wrap_parameters.rb +16 -0
  348. data/webapp/config/locales/devise.en.yml +59 -0
  349. data/webapp/config/locales/en.yml +23 -0
  350. data/webapp/config/routes.rb +113 -0
  351. data/webapp/config.ru +4 -0
  352. data/webapp/db/development.sqlite3 +0 -0
  353. data/webapp/db/migrate/20140624002037_devise_create_users.rb +42 -0
  354. data/webapp/db/migrate/20140628002058_create_all_tables.rb +159 -0
  355. data/webapp/db/schema.rb +162 -0
  356. data/webapp/db/seeds.rb +7 -0
  357. data/webapp/log/development.log +167823 -0
  358. data/webapp/public/404.html +58 -0
  359. data/webapp/public/422.html +58 -0
  360. data/webapp/public/500.html +57 -0
  361. data/webapp/public/favicon.ico +0 -0
  362. data/webapp/public/robots.txt +5 -0
  363. data/webapp/test/controllers/analysis_controller_test.rb +14 -0
  364. data/webapp/test/controllers/automations_controller_test.rb +49 -0
  365. data/webapp/test/controllers/execs_controller_test.rb +9 -0
  366. data/webapp/test/controllers/executions_controller_test.rb +9 -0
  367. data/webapp/test/controllers/runs_controller_test.rb +7 -0
  368. data/webapp/test/controllers/scripts_controller_test.rb +9 -0
  369. data/webapp/test/controllers/settings_controller_test.rb +9 -0
  370. data/webapp/test/controllers/test_controller_test.rb +14 -0
  371. data/webapp/test/controllers/util_controller_test.rb +9 -0
  372. data/webapp/test/fixtures/users.yml +11 -0
  373. data/webapp/test/helpers/analysis_helper_test.rb +4 -0
  374. data/webapp/test/helpers/automations_helper_test.rb +4 -0
  375. data/webapp/test/helpers/execs_helper_test.rb +4 -0
  376. data/webapp/test/helpers/executions_helper_test.rb +4 -0
  377. data/webapp/test/helpers/runs_helper_test.rb +4 -0
  378. data/webapp/test/helpers/scripts_helper_test.rb +4 -0
  379. data/webapp/test/helpers/settings_helper_test.rb +4 -0
  380. data/webapp/test/helpers/test_helper_test.rb +4 -0
  381. data/webapp/test/helpers/util_helper_test.rb +4 -0
  382. data/webapp/test/models/user_test.rb +7 -0
  383. data/webapp/test/test_helper.rb +15 -0
  384. data/webapp/tmp/cache/assets/development/sass/1330a34c6b24ed44c0f194c03246f627289a985a/analysis.css.scssc +0 -0
  385. data/webapp/tmp/cache/assets/development/sass/1330a34c6b24ed44c0f194c03246f627289a985a/automations.css.scssc +0 -0
  386. data/webapp/tmp/cache/assets/development/sass/1330a34c6b24ed44c0f194c03246f627289a985a/execs.css.scssc +0 -0
  387. data/webapp/tmp/cache/assets/development/sass/1330a34c6b24ed44c0f194c03246f627289a985a/executions.css.scssc +0 -0
  388. data/webapp/tmp/cache/assets/development/sass/1330a34c6b24ed44c0f194c03246f627289a985a/scripts.css.scssc +0 -0
  389. data/webapp/tmp/cache/assets/development/sass/1330a34c6b24ed44c0f194c03246f627289a985a/settings.css.scssc +0 -0
  390. data/webapp/tmp/cache/assets/development/sass/1330a34c6b24ed44c0f194c03246f627289a985a/test.css.scssc +0 -0
  391. data/webapp/tmp/cache/assets/development/sass/1330a34c6b24ed44c0f194c03246f627289a985a/util.css.scssc +0 -0
  392. data/webapp/tmp/cache/assets/development/sprockets/06a1cdb3d5472dd126cffc18f548c342 +0 -0
  393. data/webapp/tmp/cache/assets/development/sprockets/0dc0562647e703ca0535da3b9fcad796 +0 -0
  394. data/webapp/tmp/cache/assets/development/sprockets/113f1c71cb0f2a786729477989122982 +0 -0
  395. data/webapp/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  396. data/webapp/tmp/cache/assets/development/sprockets/151a1c6b128721d8923ba0c380a2af17 +0 -0
  397. data/webapp/tmp/cache/assets/development/sprockets/1722fb8a6daad566c8a6d5ef31969459 +0 -0
  398. data/webapp/tmp/cache/assets/development/sprockets/1a05555c46560c6b246aa0a996679bc6 +0 -0
  399. data/webapp/tmp/cache/assets/development/sprockets/1cb7fb6aa8bd1c2b7df8f7c52442e345 +0 -0
  400. data/webapp/tmp/cache/assets/development/sprockets/1d76f803b0a83adc5ea7e7c848657967 +0 -0
  401. data/webapp/tmp/cache/assets/development/sprockets/200152f95fc464d69c425ed8fdc2fbcc +0 -0
  402. data/webapp/tmp/cache/assets/development/sprockets/2049c8927ebd046c8a3291f81041d5f1 +0 -0
  403. data/webapp/tmp/cache/assets/development/sprockets/207907100aabd08a6767e39a95b364e3 +0 -0
  404. data/webapp/tmp/cache/assets/development/sprockets/249e2d4db815922fc72419c4a1407caf +0 -0
  405. data/webapp/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  406. data/webapp/tmp/cache/assets/development/sprockets/3034e4c334b1ebed9433e33050555f18 +0 -0
  407. data/webapp/tmp/cache/assets/development/sprockets/316c88d859cc3666044e51b1dd89e872 +0 -0
  408. data/webapp/tmp/cache/assets/development/sprockets/347f43d816178c8ba11a28a771696924 +0 -0
  409. data/webapp/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  410. data/webapp/tmp/cache/assets/development/sprockets/36ab92a3b8d527ed1eff0944b5f1263d +0 -0
  411. data/webapp/tmp/cache/assets/development/sprockets/3893b852ff196f05ff6ca8e38bb2237f +0 -0
  412. data/webapp/tmp/cache/assets/development/sprockets/3c358bd5fa32d151c7aa44971dd9b96f +0 -0
  413. data/webapp/tmp/cache/assets/development/sprockets/3ce88fad85146e0bed233f5419c24d29 +0 -0
  414. data/webapp/tmp/cache/assets/development/sprockets/3dabcb7c89677292e1e019a9bac446e5 +0 -0
  415. data/webapp/tmp/cache/assets/development/sprockets/4116fac01e6d379ede37af725a592477 +0 -0
  416. data/webapp/tmp/cache/assets/development/sprockets/42628e032b8f0b16a5ba01a1fcc7b6d7 +0 -0
  417. data/webapp/tmp/cache/assets/development/sprockets/437b258a98e8fe2c87fa8e24b7ce9abf +0 -0
  418. data/webapp/tmp/cache/assets/development/sprockets/43e98ed206f05738ae305e7e1b09a840 +0 -0
  419. data/webapp/tmp/cache/assets/development/sprockets/468da8933ba442b88b2f4b0e40c2ac30 +0 -0
  420. data/webapp/tmp/cache/assets/development/sprockets/48ef3fa68e9084c7cfa84e525decc318 +0 -0
  421. data/webapp/tmp/cache/assets/development/sprockets/4b68dcc030691297629a7156361018dc +0 -0
  422. data/webapp/tmp/cache/assets/development/sprockets/50368b1bd77c9130d821cbad89ab83ac +0 -0
  423. data/webapp/tmp/cache/assets/development/sprockets/511a980807b8d16fc3fb839991041865 +0 -0
  424. data/webapp/tmp/cache/assets/development/sprockets/516a0973874a73d0d15feec9448f7466 +0 -0
  425. data/webapp/tmp/cache/assets/development/sprockets/569e21b0ca1a230c7880f8d7a8b1febf +0 -0
  426. data/webapp/tmp/cache/assets/development/sprockets/5b5543d2ed5bed100f1739fc12ebf2c5 +0 -0
  427. data/webapp/tmp/cache/assets/development/sprockets/5c10dbffb918651dc0498579ba9a6853 +0 -0
  428. data/webapp/tmp/cache/assets/development/sprockets/5c366b5370316b3e9c03d1a58cb5eb44 +0 -0
  429. data/webapp/tmp/cache/assets/development/sprockets/5fcb9466e0d5cb0e31b35957fe2d3901 +0 -0
  430. data/webapp/tmp/cache/assets/development/sprockets/61da396fb86c5ecd844a2d83ac759b4b +0 -0
  431. data/webapp/tmp/cache/assets/development/sprockets/624ba87170059068845a4651b3cd2c7c +0 -0
  432. data/webapp/tmp/cache/assets/development/sprockets/6391f61b6121feda70da6d0a22520fdd +0 -0
  433. data/webapp/tmp/cache/assets/development/sprockets/653a981829c12a52bd57b7918168a148 +0 -0
  434. data/webapp/tmp/cache/assets/development/sprockets/66479793d9e5683d9f7fa67522d1962d +0 -0
  435. data/webapp/tmp/cache/assets/development/sprockets/69c589bd224ee0df5ab02e4568e0ab39 +0 -0
  436. data/webapp/tmp/cache/assets/development/sprockets/6dd7c564897b7e66eecbb180baeef2c6 +0 -0
  437. data/webapp/tmp/cache/assets/development/sprockets/6e2b92a4e6966cb78e63207bc7888391 +0 -0
  438. data/webapp/tmp/cache/assets/development/sprockets/70adb410f59a0edc5aea8c2b2ef8a441 +0 -0
  439. data/webapp/tmp/cache/assets/development/sprockets/72cbfd5bf33945bcce154f7a4feaf04d +0 -0
  440. data/webapp/tmp/cache/assets/development/sprockets/740ee9d355ada8cf5e9beb620f2cd5cc +0 -0
  441. data/webapp/tmp/cache/assets/development/sprockets/74770a22b5d1b0b3bc3527da83706f96 +0 -0
  442. data/webapp/tmp/cache/assets/development/sprockets/759bf97655af50852816720db7b59fcb +0 -0
  443. data/webapp/tmp/cache/assets/development/sprockets/76e9c19246c684413a02af695fa2b0bc +0 -0
  444. data/webapp/tmp/cache/assets/development/sprockets/7728beeace48ca12e336d2bce0158871 +0 -0
  445. data/webapp/tmp/cache/assets/development/sprockets/77f49730c7b689f75a2e174fbd3ace2a +0 -0
  446. data/webapp/tmp/cache/assets/development/sprockets/78021a57030fd36cf82699aad9910b26 +0 -0
  447. data/webapp/tmp/cache/assets/development/sprockets/796b349b06da691fe5f069f9e3947fcb +0 -0
  448. data/webapp/tmp/cache/assets/development/sprockets/79e7505c70697cc7d34d4a8351c3b840 +0 -0
  449. data/webapp/tmp/cache/assets/development/sprockets/7b2b7d9034fc7b77daf5da1436667e6f +0 -0
  450. data/webapp/tmp/cache/assets/development/sprockets/7c2ea2ca2cdd89b062bf23f44e8f599c +0 -0
  451. data/webapp/tmp/cache/assets/development/sprockets/7ea112af55e6df12cdff377052b71420 +0 -0
  452. data/webapp/tmp/cache/assets/development/sprockets/7f27632588dd316836b009a621c0176c +0 -0
  453. data/webapp/tmp/cache/assets/development/sprockets/7fcef9f644290dea8d0e4bf13f6bb8e9 +0 -0
  454. data/webapp/tmp/cache/assets/development/sprockets/81c6bf67419a29257ed79f442c24907d +0 -0
  455. data/webapp/tmp/cache/assets/development/sprockets/83656ce9260eb473c1654420e0180167 +0 -0
  456. data/webapp/tmp/cache/assets/development/sprockets/83e8bdddefc2dce069b56e6650135397 +0 -0
  457. data/webapp/tmp/cache/assets/development/sprockets/880c796f41e5d67ae68ed239acfc91e3 +0 -0
  458. data/webapp/tmp/cache/assets/development/sprockets/8c1c39dd537d2c9990fe9c70a5646b06 +0 -0
  459. data/webapp/tmp/cache/assets/development/sprockets/8d763042da5254015767385ce324b348 +0 -0
  460. data/webapp/tmp/cache/assets/development/sprockets/91e1ccbf65ff4d9b0f42b1159796bcf2 +0 -0
  461. data/webapp/tmp/cache/assets/development/sprockets/92cdfac7698b6bb68983cf317c1cedef +0 -0
  462. data/webapp/tmp/cache/assets/development/sprockets/94cab8cbc120e152ce4c444492a3fc1d +0 -0
  463. data/webapp/tmp/cache/assets/development/sprockets/96b918c3c041b6a089c8adc870fa3aaa +0 -0
  464. data/webapp/tmp/cache/assets/development/sprockets/97cbe306627b432ab3bfb52416690d1d +0 -0
  465. data/webapp/tmp/cache/assets/development/sprockets/98da83d396c0c00eb03937ecbc2e6bfa +0 -0
  466. data/webapp/tmp/cache/assets/development/sprockets/9db04db20ec9c4a0f84ed01caa5e6e2b +0 -0
  467. data/webapp/tmp/cache/assets/development/sprockets/9dc1c251f50c828fae95d6107619c53e +0 -0
  468. data/webapp/tmp/cache/assets/development/sprockets/9e91711ab34bbf89ad1cfb4351027d36 +0 -0
  469. data/webapp/tmp/cache/assets/development/sprockets/9f587881f98b328b656e6456178418b5 +0 -0
  470. data/webapp/tmp/cache/assets/development/sprockets/9fc981560caba00621bb95d0974ad076 +0 -0
  471. data/webapp/tmp/cache/assets/development/sprockets/9fd4385f8fda99f3ddd3f133a89231d1 +0 -0
  472. data/webapp/tmp/cache/assets/development/sprockets/a32ab71649e3db15eca95bcc3a7588da +0 -0
  473. data/webapp/tmp/cache/assets/development/sprockets/a497c976969bdbb1f69875358d39d3b5 +0 -0
  474. data/webapp/tmp/cache/assets/development/sprockets/b06058d455770c1d9db6b6670bc4bf4d +0 -0
  475. data/webapp/tmp/cache/assets/development/sprockets/b3da405f1e68470ad6146a1322f2438c +0 -0
  476. data/webapp/tmp/cache/assets/development/sprockets/b4ba5853663f6721d15942ce08dd76bf +0 -0
  477. data/webapp/tmp/cache/assets/development/sprockets/b6f1534bcdbff92a16c85487f363235a +0 -0
  478. data/webapp/tmp/cache/assets/development/sprockets/b9c57b9750f8af3551b1a5d9e27f0a92 +0 -0
  479. data/webapp/tmp/cache/assets/development/sprockets/bb5be6a0ee889a15214e2442aee8c6e1 +0 -0
  480. data/webapp/tmp/cache/assets/development/sprockets/bc80a81b2d67b5ad40f3c7a2bb6e6f22 +0 -0
  481. data/webapp/tmp/cache/assets/development/sprockets/bfaba27d5ce71d292f453659b0755511 +0 -0
  482. data/webapp/tmp/cache/assets/development/sprockets/bfac6cd2984fbd5e0d762389e3c37164 +0 -0
  483. data/webapp/tmp/cache/assets/development/sprockets/c17bec9e3b5db6d8385c3d6eb362e628 +0 -0
  484. data/webapp/tmp/cache/assets/development/sprockets/c1a9eceddc0a1e41eb2992e9204f71e6 +0 -0
  485. data/webapp/tmp/cache/assets/development/sprockets/c50cd87be040044504b5c3fde1047e24 +0 -0
  486. data/webapp/tmp/cache/assets/development/sprockets/c5907cfd07b24ad19b8c80e8af618a57 +0 -0
  487. data/webapp/tmp/cache/assets/development/sprockets/c8da5594caf845a183dd1c6cd45c5433 +0 -0
  488. data/webapp/tmp/cache/assets/development/sprockets/cbc6968ed49fa14db439a64dd0a46abc +0 -0
  489. data/webapp/tmp/cache/assets/development/sprockets/cedf710ee090647b81c08675583eca62 +0 -0
  490. data/webapp/tmp/cache/assets/development/sprockets/cf1e3cebfad43293c3c470a5e437ebc9 +0 -0
  491. data/webapp/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  492. data/webapp/tmp/cache/assets/development/sprockets/d5a14f86bb4b422fdd8eb4722d966c9a +0 -0
  493. data/webapp/tmp/cache/assets/development/sprockets/d66b9cdd3230f9e5354e495e17097c49 +0 -0
  494. data/webapp/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  495. data/webapp/tmp/cache/assets/development/sprockets/dfa0ed87d851222fe58ada385e3f037d +0 -0
  496. data/webapp/tmp/cache/assets/development/sprockets/e1aa402390382db4d97b27cb094485fa +0 -0
  497. data/webapp/tmp/cache/assets/development/sprockets/e4f1db35ef9d9fbbf53252a44e381eb8 +0 -0
  498. data/webapp/tmp/cache/assets/development/sprockets/e57eb6c1ad51fd8c13afc0e719a259b5 +0 -0
  499. data/webapp/tmp/cache/assets/development/sprockets/e7c37b542e914e392ec326190cea1aa2 +0 -0
  500. data/webapp/tmp/cache/assets/development/sprockets/e923d7e19c216d4a924831f3896e007a +0 -0
  501. data/webapp/tmp/cache/assets/development/sprockets/e96a414a621483bbc89e73f11be5e7b4 +0 -0
  502. data/webapp/tmp/cache/assets/development/sprockets/eafcfc3d2561c18743c1b32f0f710c68 +0 -0
  503. data/webapp/tmp/cache/assets/development/sprockets/ecdd630f5466d45a2afa7515aaa5fc3b +0 -0
  504. data/webapp/tmp/cache/assets/development/sprockets/ee60a0a35d60cff425373970547694bd +0 -0
  505. data/webapp/tmp/cache/assets/development/sprockets/eee2c36b75709b0c3797c2a151fdd5d3 +0 -0
  506. data/webapp/tmp/cache/assets/development/sprockets/f104b66c0f89b453d0c8c73980fbab18 +0 -0
  507. data/webapp/tmp/cache/assets/development/sprockets/f26d1bc86590415685e9836ad75d1774 +0 -0
  508. data/webapp/tmp/cache/assets/development/sprockets/f4081e868eb565527099dba2c9d8c4de +0 -0
  509. data/webapp/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  510. data/webapp/tmp/cache/assets/development/sprockets/f813030b97e30415ad276bbd1f7e1fb4 +0 -0
  511. data/webapp/tmp/cache/assets/development/sprockets/f8e3e28bc9640c25da58aea46c3ac4b3 +0 -0
  512. data/webapp/tmp/cache/assets/development/sprockets/f9169d0a8b70eaf95de52b3c6ad51105 +0 -0
  513. data/webapp/tmp/cache/assets/development/sprockets/f939450f7a481e3fbeb158b81b39c624 +0 -0
  514. data/webapp/tmp/cache/assets/development/sprockets/fce73296b8298ac4c74b3e95cde4dfdb +0 -0
  515. metadata +941 -0
@@ -0,0 +1,317 @@
1
+
2
+ #
3
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
4
+ #
5
+
6
+ require "toaster/state/transition_edge"
7
+ require "toaster/markup/markup_util"
8
+ require "toaster/state/ptrace_util"
9
+ require "pty"
10
+
11
+ include Toaster
12
+
13
+ module Toaster
14
+
15
+ class SyscallTracer
16
+
17
+ FILE_DUMPSTATE = "/tmp/tracer.dumpstate"
18
+ FILE_STATEDUMP = "/tmp/tracer.state.dump"
19
+ FILE_TMPDIR = "/tmp/tracer.tmp.dir"
20
+ FILE_ACKS = "/tmp/tracer.acks"
21
+
22
+ def initialize()
23
+ # type 0 syscalls (see below for parsing)
24
+ @syscalls_0 = ["open", "write", "openat"]
25
+ # type 1 syscalls (see below for parsing)
26
+ @syscalls_1 = ["creat", "mkdir", "rmdir", "link", "unlink", "symlink",
27
+ "chown", "lchown", "chmod"]
28
+ # type 2 syscalls (see below for parsing)
29
+ @syscalls_2 = ["rename", "unlinkat", "mkdirat", "fchownat", "mknodat"]
30
+ # type 3 syscalls (see below for parsing)
31
+ @syscalls_3 = ["fchmod", "fchown"]
32
+ # type 4 syscalls (see below for parsing)
33
+ @syscalls_4 = ["utimensat"]
34
+ @acked_syscalls = @syscalls_0.concat(@syscalls_1).concat(@syscalls_2).concat(@syscalls_3).concat(@syscalls_4)
35
+ @monitored_syscalls = @acked_syscalls.dup.concat(["open", "openat", "chdir"]) #, "close", "dup", "dup2", "dup3"
36
+ @grep_cmd = "ps aux | grep -v grep | grep -v bash | grep -v screen | grep -v SCREEN | grep strace | grep #{Process.pid}"
37
+ @pwd_map = {}
38
+ @num_acks_sent = 0
39
+ @num_acks_received = 0
40
+ @execution_prestate = {"files"=>{}}
41
+ end
42
+
43
+ def dump_execution_prestate
44
+ Util.write(FILE_DUMPSTATE, "1", true)
45
+
46
+ # HACK: this causes a syscall which initiates the dump further below..
47
+ Dir.mkdir(FILE_TMPDIR)
48
+ Dir.rmdir(FILE_TMPDIR)
49
+
50
+ state = File.read(FILE_STATEDUMP)
51
+ if state.strip == ""
52
+ puts "WARN: could not read pre-state dump from #{FILE_STATEDUMP}"
53
+ return {}
54
+ else
55
+ return MarkupUtil.parse_json(state)
56
+ end
57
+ end
58
+
59
+ def start()
60
+
61
+ #puts "INFO: writing values to #{FILE_ACKS}"
62
+ `echo ":#{@acked_syscalls.join(':')}:" > #{FILE_ACKS}`
63
+ @monitoring_active = true
64
+
65
+ `echo "" > #{FILE_DUMPSTATE}`
66
+ `echo "" > #{FILE_STATEDUMP}`
67
+
68
+ # start strace process
69
+ do_start_process = true
70
+ do_start_thread = false
71
+
72
+ if do_start_process
73
+
74
+ tracer_pid = start_strace()
75
+
76
+ if do_start_thread
77
+ __legacy_start_thread()
78
+ end
79
+
80
+ else
81
+ __legacy_ruby_ptrace()
82
+ end
83
+
84
+ end
85
+
86
+ def stop()
87
+ puts "DEBUG: writing empty string to #{FILE_ACKS}"
88
+ `echo "" > #{FILE_ACKS}`
89
+ @monitoring_active = false
90
+ end
91
+
92
+ def parse_line(line)
93
+ pwd_map = @pwd_map
94
+ if is_correct_strace_line(line)
95
+
96
+ syscall = extract_syscall(line)
97
+ syscall_pid = extract_pid(line)
98
+ if !pwd_map[syscall_pid]
99
+ # get initial pwd for the process which does the syscall
100
+ pwd_map[syscall_pid] = get_pwd_for_pid(syscall_pid)
101
+ end
102
+ pwd = pwd_map[syscall_pid]
103
+ if syscall == "chdir"
104
+ pwd = pwd_map[syscall_pid] = get_pwd_for_pid(syscall_pid)
105
+ elsif syscall == "write"
106
+ if line.match(/.*write\([0-9]+<(.*)>.*/)
107
+ mod_file = line.gsub(/.*write\([0-9]+<(.*)>.*/, '\1').strip
108
+ return report_file(mod_file, pwd)
109
+ elsif line.match(/.*write\([0-9]+,.*/)
110
+ fd = line.gsub(/.*write\(([0-9]+),.*/, '\1').strip
111
+ mod_file = PtraceUtil.get_filename_for_fd(syscall_pid, fd)
112
+ return report_file(mod_file, pwd)
113
+ end
114
+ elsif syscall == "open" || syscall == "openat"
115
+ if line.match(/O_WRONLY/) ||
116
+ line.match(/O_RDWR/) ||
117
+ line.match(/O_APPEND/) ||
118
+ line.match(/O_CREAT/)
119
+ if syscall == "open"
120
+ mod_file = line.gsub(/.*open\("([^"]+)".*/, '\1').strip
121
+ return report_file(mod_file, pwd)
122
+ elsif syscall == "openat"
123
+ if line.match(/.*openat\(AT_FDCWD,\s*"([^"]+)".*/)
124
+ mod_file = line.gsub(/.*openat\(AT_FDCWD,\s*"([^"]+)".*/, '\1').strip
125
+ return report_file(mod_file, pwd)
126
+ elsif line.match(/.*openat\([0-9]+,\s*"([^"]+)".*/)
127
+ fd = line.gsub(/.*openat\(([0-9]+),\s*"[^"]+".*/, '\1').strip.to_i
128
+ mod_file = PtraceUtil.get_filename_for_fd(syscall_pid, fd)
129
+ return report_file(mod_file, pwd)
130
+ elsif line.match(/.*openat\("([^"]+)",\s*"[^"]+".*/)
131
+ mod_file = line.gsub(/.*openat\("([^"]+)",\s*"[^"]+".*/, '\1').strip
132
+ return report_file(mod_file, pwd)
133
+ end
134
+ end
135
+ end
136
+ else
137
+
138
+ if @syscalls_1.include?(syscall)
139
+ mod_file = line.gsub(/.*((#{@syscalls_1.join(')|(')}))\("([^"]+)".*/, "\\#{@syscalls_1.size + 2}").strip
140
+ return report_file(mod_file, pwd)
141
+ end
142
+ if @syscalls_2.include?(syscall)
143
+ mod_file = line.gsub(/.*((#{@syscalls_2.join(')|(')}))\([^,]+,\s*"([^"]+)".*/, "\\#{@syscalls_2.size + 2}").strip
144
+ return report_file(mod_file, pwd)
145
+ end
146
+ if @syscalls_3.include?(syscall)
147
+ fd = line.gsub(/.*((#{@syscalls_3.join(')|(')}))\(([^,]+),.*/, "\\#{@syscalls_3.size + 2}").strip.to_i
148
+ mod_file = PtraceUtil.get_filename_for_fd(syscall_pid, fd)
149
+ #puts "!! syscalls_3: #{mod_file}"
150
+ return report_file(mod_file, pwd)
151
+ end
152
+ if @syscalls_4.include?(syscall)
153
+ mod_file = nil
154
+ pattern1 = ".*((#{@syscalls_4.join(')|(')}))\\(([0-9]+),.*"
155
+ pattern2 = ".*((#{@syscalls_4.join(')|(')}))\\([^,]+,\\s*\"([^\"]+)\".*"
156
+ if line.match(/#{pattern1}/)
157
+ fd = line.gsub(/#{pattern1}/, "\\#{@syscalls_4.size + 2}").strip.to_i
158
+ mod_file = PtraceUtil.get_filename_for_fd(syscall_pid, fd)
159
+ elsif line.match(/#{pattern2}/)
160
+ mod_file = line.gsub(/#{pattern2}/, "\\#{@syscalls_4.size + 2}")
161
+ end
162
+ #puts "!! syscalls_3: #{mod_file}"
163
+ return report_file(mod_file, pwd)
164
+ end
165
+
166
+ end
167
+
168
+ end
169
+ return nil
170
+ end
171
+
172
+ def is_correct_strace_line(line)
173
+ line.match(/^(\[pid\s+)?[0-9]+\]?\s+[a-zA-Z0-2]+\(.*/)
174
+ end
175
+ def extract_syscall(line)
176
+ line.gsub(/^(\[pid\s+)?[0-9]+\]?\s+([a-zA-Z0-2]+)\(.*/, '\2').strip
177
+ end
178
+ def extract_pid(line)
179
+ line.gsub(/^(\[pid\s+)?([0-9]+)\]?\s+([a-zA-Z0-2]+)\(.*/, '\2').strip
180
+ end
181
+
182
+ def report_file(mod_file, pwd)
183
+ if !mod_file || mod_file.to_s.strip == ""
184
+ return
185
+ end
186
+ if !mod_file.match(/pipe:.*/) &&
187
+ !mod_file.match(/socket:.*/) &&
188
+ !mod_file.match(/\/dev\/.*/) &&
189
+ !mod_file.match(/\/proc\/.*/) &&
190
+ !mod_file.match(/\/tmp\/chef-script.*/) &&
191
+ !mod_file.match(/\/var\/chef\/cache\/.*/) &&
192
+ !mod_file.match(/\/tmp\/tracer\.acks.*/)
193
+ if is_correct_strace_line(mod_file)
194
+ puts "WARN: Apparently could not parse syscall line from strace: #{mod_file}"
195
+ return
196
+ end
197
+ #puts "=====> #{pwd} - #{mod_file}"
198
+ if mod_file[0] != "/" && pwd != ""
199
+ mod_file = "#{pwd}/#{mod_file}"
200
+ end
201
+ # ignore /tmp files
202
+ if !mod_file.match(/^\/tmp\//)
203
+ return mod_file
204
+ end
205
+ return nil
206
+ end
207
+ end
208
+
209
+ private
210
+
211
+ def start_strace()
212
+
213
+ tracer_pid = get_tracer_pid()
214
+ if tracer_pid == ""
215
+ # Start monitoring process in background
216
+ exec_dir = File.join(File.dirname(File.expand_path(__FILE__)),
217
+ "..", "..", "..", "bin", "strace-4.8_patched")
218
+ to_exec = nil
219
+ if (/x86_64/ =~ RUBY_PLATFORM) != nil
220
+ to_exec = "#{exec_dir}/strace-x86_64"
221
+ elsif (/i686/ =~ RUBY_PLATFORM) != nil
222
+ to_exec = "#{exec_dir}/strace-i686"
223
+ else
224
+ emsg = "Unsupported platform or CPU architecture (no strace binary available): #{RUBY_PLATFORM}"
225
+ puts "WARN: #{emsg}"
226
+ throw emsg
227
+ end
228
+ tracer_cmd = "#{to_exec} -p #{Process.pid} -f -e #{@monitored_syscalls.join(',')} -s 0"
229
+
230
+ if File.exist?(to_exec)
231
+ puts "INFO: Start monitoring process in background: #{tracer_cmd}"
232
+ fork_pid = Process.fork do
233
+ PTY.spawn( tracer_cmd ) do |stdout, stdin, pid|
234
+ begin
235
+ stdout.each { |line|
236
+ #puts ": #{line}"
237
+
238
+ # write prestate dump to file if requested..
239
+ if File.read(FILE_DUMPSTATE).strip == "1"
240
+ puts "INFO: dumping state to file #{FILE_STATEDUMP}.."
241
+ #puts "DEBUG: this syscall: #{line}"
242
+ Util.write(FILE_STATEDUMP, MarkupUtil.to_json(@execution_prestate), true)
243
+ @execution_prestate = {"files" => {}}
244
+ Util.write(FILE_DUMPSTATE, "0", true)
245
+ end
246
+
247
+ begin
248
+ if line.match(/waiting for ack for syscall/)
249
+ #puts "sending ACK for syscall: #{line}"
250
+ stdin.puts("y")
251
+ @num_acks_sent += 1
252
+ #puts "num_acks_sent: #{@num_acks_sent}" if (@num_acks_sent % 100 == 0)
253
+ elsif line.match(/got ack for syscall/)
254
+ @num_acks_received += 1
255
+ #puts "num_acks_received: #{@num_acks_received}" if @num_acks_received % 100 == 0
256
+ else
257
+ if @monitoring_active
258
+ mod_file = parse_line(line)
259
+ if mod_file
260
+ #puts "=====> #{mod_file}"
261
+ if !@execution_prestate["files"].include?(mod_file) # don't overwrite previous state info!
262
+ Util.build_file_hash_for_ohai([mod_file], @execution_prestate["files"])
263
+ end
264
+ end
265
+ end
266
+ end
267
+
268
+ rescue => exc
269
+ puts "WARN: Exception in strace processing: #{exc} - #{exc.backtrace.join("\n")}"
270
+ end
271
+ }
272
+ rescue Errno::EIO
273
+ # swallow - this probably just means that the process has finished giving output"
274
+ end
275
+ puts "INFO: Strace process terminating..."
276
+ end
277
+ end
278
+
279
+ else
280
+
281
+ puts "WARN: Cannot find patched strace executable: #{tracer_cmd}"
282
+
283
+ end
284
+
285
+ end
286
+ tracer_pid = get_tracer_pid()
287
+ return tracer_pid
288
+ end
289
+
290
+ def kill_tracer_process()
291
+ pid = get_tracer_pid()
292
+ if pid && pid != ""
293
+ `kill #{pid}`
294
+ end
295
+ end
296
+
297
+ def get_tracer_pid()
298
+ tracer_pid = `#{@grep_cmd}`
299
+ #puts "grepping for strace - output: #{tracer_pid}"
300
+ tracer_pid = tracer_pid.gsub(/[^\s]+\s+([^\s]+)\s+.*/, '\1').strip
301
+ return tracer_pid
302
+ end
303
+
304
+ def get_pwd_for_pid(pid)
305
+ dir = `pwdx #{pid} 2> /dev/null`
306
+ dir = dir.gsub(/[0-9]*:\s+(.*)/, '\1').strip
307
+ if dir != ""
308
+ return dir
309
+ end
310
+ #puts "WARN: Unknown pwd for process #{pid}, fallback to '#{Dir.pwd}'"
311
+ # fallback to pwd
312
+ return Dir.pwd
313
+ end
314
+
315
+ end
316
+
317
+ end
@@ -0,0 +1,349 @@
1
+
2
+ #
3
+ # Author: Waldemar Hummer (hummer@dsg.tuwien.ac.at)
4
+ #
5
+
6
+ require "toaster/markup/markup_util"
7
+ require "toaster/util/util"
8
+ require "ohai/application"
9
+
10
+ include Toaster
11
+
12
+ module Toaster
13
+ class SystemState
14
+
15
+ @@initialized = false
16
+ @@include_default_state_props = false
17
+ @@required_builtin_ohai_plugins = ["languages.rb", "ruby.rb", "kernel.rb", "os.rb"]
18
+ @@original_ohai_plugin_paths = []
19
+ @@ohai_dir = File.join(File.expand_path(File.dirname(__FILE__)), '..', 'ohai')
20
+ @@max_arglist_length = 5000 # maximum number of characters to pass as cmdline parameter to ohai
21
+
22
+ def self.get_system_state(state_change_config = {})
23
+ puts "INFO: Taking snapshot of system state..."
24
+ puts "DEBUG: State snapshot configuration: #{state_change_config}"
25
+
26
+ if !@@initialized
27
+ @@original_ohai_plugin_paths.concat(Ohai::Config[:plugin_path])
28
+ @@original_ohai_plugin_paths.each do |path|
29
+ @@required_builtin_ohai_plugins.dup.each do |pl|
30
+ required_file = File.join(path, pl)
31
+ if File.exist?(required_file)
32
+ @@required_builtin_ohai_plugins.delete(pl)
33
+ @@required_builtin_ohai_plugins << required_file
34
+ end
35
+ end
36
+ end
37
+ @@initialized = true
38
+ end
39
+
40
+ Ohai::Config[:plugin_path] = []
41
+ if @@include_default_state_props
42
+ Ohai::Config[:plugin_path].concat(@@original_ohai_plugin_paths)
43
+ end
44
+
45
+ state_change_config.each do |name,config|
46
+ # register tailor-made Ohai extensions
47
+ path = File.expand_path(File.join(@@ohai_dir, name))
48
+ # puts "Registering ohai extensions within directory #{path}"
49
+ Ohai::Config[:plugin_path].push(path)
50
+ end
51
+
52
+ ENV["OHAI_PARAMS"] = state_change_config.to_json().to_s
53
+
54
+ # NOTE: We need to be careful here. OHAI_PARAMS is passed as
55
+ # command line argument to ohai, and if this hash becomes
56
+ # too big, we end up with an "Argument list too long" error.
57
+ # If the hash becomes too big, save it to a file and read it
58
+ # from there afterwards!
59
+ if ENV["OHAI_PARAMS"].size > @@max_arglist_length
60
+ params_file = "/tmp/toaster.ohai_params.tmp"
61
+ Util.write(params_file, ENV["OHAI_PARAMS"], true)
62
+ ENV["OHAI_PARAMS"] = "{\"__read_from_file__\": \"#{params_file}\"}"
63
+ end
64
+
65
+ ohai = Ohai::System.new
66
+ @@required_builtin_ohai_plugins.each do |plugin_file|
67
+ begin
68
+ if !defined?(ohai.from_file(plugin_file))
69
+ # some ohai versions don't seem to mix-in "from_file"
70
+ Ohai::System.send(:include, Chef::Mixin::FromFile)
71
+ end
72
+ ohai.from_file(plugin_file)
73
+ rescue => ex
74
+ puts "WARN: Unable to include ohai plugin file '#{plugin_file}': #{ex}: #{ex.backtrace.join("\n")}"
75
+ throw ex
76
+ end
77
+ end
78
+
79
+ if Ohai::Config[:file]
80
+ ohai.from_file(Ohai::Config[:file])
81
+ else
82
+ ohai.all_plugins
83
+ end
84
+ json = JSON.parse(ohai.to_json)
85
+ filter_unimportant_properties(json)
86
+ #puts "DEBUG: System state json: #{json.inspect}"
87
+
88
+ return json
89
+ end
90
+
91
+ # Given two states, preprocess the state difference computation
92
+ # by removing those state properties which are usually very large
93
+ # and infeasible to process with the generic approach (structural
94
+ # diff of state property trees).
95
+ #
96
+ # * Returns: an array [s1,s2,diffs] with the (potentially) modified
97
+ # states ("s1" and "s2") and part of the differences ("diffs")
98
+ # between the original states.
99
+ def self.preprocess_state_diff(state1, state2)
100
+ diffs = []
101
+ keys1 = state1.keys.dup
102
+ keys2 = state2.keys.dup
103
+
104
+ keys1.each do |k|
105
+ file = File.join(@@ohai_dir, k, "_meta.rb")
106
+ if File.exist?(file)
107
+ require file
108
+ s1 = state1[k]
109
+ s2 = state2[k]
110
+ if !s1 || !s2
111
+ next
112
+ end
113
+ tmp_result = nil
114
+ begin
115
+ eval("tmp_result = diff__#{k}(s1, s2)")
116
+ if tmp_result && tmp_result.kind_of?(Array)
117
+ state1.delete(k)
118
+ state2.delete(k)
119
+ diffs.concat(tmp_result)
120
+ end
121
+ rescue => ex
122
+ puts "WARN: Unable to compute diff of state property '#{k}' using code in file #{file}:"
123
+ Util.print_backtrace(ex, 10)
124
+ end
125
+ end
126
+ end
127
+
128
+ return [state1, state2, diffs]
129
+ end
130
+
131
+ ## Reconstruct the final post-state that results from a
132
+ ## sequence of task executions and their individual
133
+ ## state changes
134
+ def self.reconstruct_state_from_execs_seq(execs_seq)
135
+ state = execs_seq[0].state_before
136
+ #puts "DEBUG: Eliminate map entries from state: #{state}"
137
+ MarkupUtil.eliminate_inserted_map_entries!(state)
138
+ return reconstruct_state_from_change_seq(
139
+ execs_seq.collect{ |ex| ex.state_changes },
140
+ state
141
+ )
142
+ end
143
+ ## Reconstruct the final post-state that results from a
144
+ ## sequence of state changes
145
+ def self.reconstruct_state_from_change_seq(state_change_seq, initial_state={})
146
+ state = initial_state
147
+ state_change_seq.each do |change_set|
148
+ change_set.each do |ch|
149
+ if ch.action == StateChange::ACTION_DELETE
150
+ #puts "==> delete property #{ch.property}"
151
+ MarkupUtil.delete_value_by_path(state, ch.property)
152
+ elsif ch.action == StateChange::ACTION_INSERT ||
153
+ ch.action == StateChange::ACTION_MODIFY
154
+ #puts "==> set property #{ch.property} = #{ch.value}"
155
+ MarkupUtil.set_value_by_path(state, ch.property, ch.value)
156
+ end
157
+ end
158
+ end
159
+ #puts "DEBUG: Reconstructed state from state change sequence: #{state.to_s}"
160
+ return state
161
+ end
162
+
163
+ # Compute the difference between two system state snapshots.
164
+ # Returns an array of StateChange objects.
165
+ def self.get_state_diff(s_before, s_after)
166
+ tmp = preprocess_state_diff(s_before, s_after)
167
+ s_before = tmp[0]
168
+ s_after = tmp[1]
169
+ prop_changes = tmp[2]
170
+
171
+ prop_changes.concat(MarkupUtil.hash_diff_as_prop_changes(s_before, s_after))
172
+ return prop_changes
173
+ end
174
+
175
+ # Given two states which are "too" big, reduce the size of both states
176
+ # by removing properties that are equal in both states and hence not
177
+ # relevant for the state change computation.
178
+ def self.reduce_state_size(state1, state2)
179
+ state1_copy = state1.dup
180
+ state2_copy = state2.dup
181
+
182
+ state1.keys.each do |k|
183
+ file = File.join(@@ohai_dir, k, "_meta.rb")
184
+ if File.exist?(file)
185
+ require file
186
+ s1 = state1[k]
187
+ s2 = state2[k]
188
+ tmp_result = nil
189
+ begin
190
+ eval("tmp_result = reduce__#{k}(s1, s2)")
191
+ if tmp_result && tmp_result.kind_of?(Array)
192
+ state1_copy[k] = tmp_result[0]
193
+ state2_copy[k] = tmp_result[1]
194
+ end
195
+ rescue => ex
196
+ puts "WARN: Unable to compute reduced hash of state property '#{k}' using code in file #{file}:"
197
+ Util.print_backtrace(ex, 10)
198
+ end
199
+ end
200
+ end
201
+ return [state1_copy, state2_copy]
202
+ end
203
+
204
+ def self.get_statechange_config_from_state(state)
205
+ cfg = {}
206
+ if state["files"]
207
+ cfg["files"] = {"paths" => []}
208
+ state["files"].each do |path,info|
209
+ cfg["files"]["paths"] << path
210
+ end
211
+ end
212
+ return cfg
213
+ end
214
+
215
+ def self.read_ignore_properties()
216
+ require "toaster/model/ignore_property"
217
+ result = Set.new
218
+ Dir["#{@@ohai_dir}/*"].each do |dir|
219
+ file = File.join(dir, "_meta.rb")
220
+ if File.exist?(file)
221
+ require file
222
+ tmp_result = nil
223
+ name = dir.sub(/.*\/([a-z0-9A-Z_\-]+)\/*/, '\1')
224
+ begin
225
+ eval("tmp_result = ignore_properties__#{name}()")
226
+ tmp_result = [tmp_result] if !tmp_result.kind_of?(Array)
227
+ tmp_result.each do |r|
228
+ result << IgnoreProperty.new(:key => r.to_s)
229
+ end
230
+ rescue => ex
231
+ puts "WARN: Unable to get ignore properties using code in file #{file}:"
232
+ Util.print_backtrace(ex, 10)
233
+ end
234
+ end
235
+ end
236
+ return result.to_a()
237
+ end
238
+
239
+ def self.remove_ignore_props!(props_hash, ignore_prop_names=nil, key_path=[], print_info=false)
240
+ if !ignore_prop_names
241
+ ignore_prop_names = read_ignore_properties()
242
+ end
243
+ #puts "TRACE: ignore_prop_names #{ignore_prop_names}"
244
+ ignore_prop_names.each do |key|
245
+ if props_hash.kind_of?(Array)
246
+ props_hash.dup.each do |k|
247
+
248
+ # check if we have an array of StateChange
249
+ if k.kind_of?(StateChange)
250
+ if k.property.eql?(key) ||
251
+ Util.starts_with?(k.property, "#{key}.") ||
252
+ k.property.match(key)
253
+ props_hash.delete(k)
254
+ end
255
+
256
+ else
257
+ # this is not a StateChange, but an
258
+ # array of values or hashes --> to be implemented
259
+ puts "WARN: SystemState.remove_ignore_props(..) not implemented for non-StateChange arrays!"
260
+ end
261
+ end
262
+
263
+ else
264
+ # assume this is an actual state properties hash
265
+ props_hash.keys.dup.each do |k|
266
+ new_path = key_path.dup
267
+ new_path << k
268
+ long_key = "'#{new_path.join("'.'")}'"
269
+ #puts "TRACE: long key #{long_key}"
270
+ if k == "#{key}" || Util.starts_with?(k, "#{key}.") || k.match("#{key}") ||
271
+ long_key == "#{key}" || Util.starts_with?(long_key, "#{key}.") || long_key.match("#{key}")
272
+ deleted = props_hash.delete(k)
273
+ elsif props_hash[k].kind_of?(Hash)
274
+ # --> recursion!
275
+ remove_ignore_props!(props_hash[k], ignore_prop_names, new_path)
276
+ end
277
+ end
278
+ end
279
+ end
280
+ end
281
+
282
+ def self.get_flat_attributes(current=nil, name_so_far="", list_so_far={})
283
+ if current.nil?
284
+ name_so_far = name_so_far[1..-1] if name_so_far[0] == "."
285
+ list_so_far[name_so_far] = nil
286
+ return list_so_far
287
+ end
288
+ if !current.kind_of?(Hash)
289
+ name_so_far = name_so_far[1..-1] if name_so_far[0] == "."
290
+ list_so_far[name_so_far] = current
291
+ return list_so_far
292
+ end
293
+ current.each do |name,value|
294
+ name = "#{name_so_far}.'#{name}'"
295
+ get_flat_attributes(value, name, list_so_far)
296
+ end
297
+ return list_so_far
298
+ end
299
+
300
+ private
301
+
302
+ def self.filter_unimportant_properties(json)
303
+ if @@include_default_state_props
304
+ remove_properties(json, ["network", "interfaces"])
305
+ remove_properties(json, ["counters", "network", "interfaces"])
306
+ remove_properties(json, ["etc", "passwd"])
307
+ remove_properties(json, ["etc", "group"])
308
+ remove_properties(json, ["cpu", "json--map--entry", "value", "flags"])
309
+ remove_properties(json, ["filesystem"])
310
+ remove_properties(json, ["uptime_seconds"])
311
+ remove_properties(json, ["uptime"])
312
+ remove_properties(json, ["idletime_seconds"])
313
+ remove_properties(json, ["ohai_time"])
314
+ remove_properties(json, ["idletime"])
315
+ remove_properties(json, ["kernel", "version"])
316
+ remove_properties(json, ["os_version"])
317
+ remove_properties(json, ["os"])
318
+ #remove_properties(json, ["memory", "anon-pages"])
319
+ #remove_properties(json, ["memory", "dirty"])
320
+ remove_properties(json, ["dmi"]) # for now, ignore the whole dmi section
321
+ remove_properties(json, ["memory"]) # for now, ignore the whole memory section
322
+ remove_properties(json, ["cpu"]) # for now, ignore the whole cpu section
323
+ remove_properties(json, ["block_device"]) # for now, ignore the whole block_device section
324
+ #remove_properties(json, ["block_device",/ram.*/])
325
+ remove_properties(json, ["keys"])
326
+ remove_properties(json, ["chef_packages"])
327
+ remove_properties(json, ["kernel","modules",/.*/,"size"])
328
+ remove_properties(json, ["kernel","modules",/.*/,"refcount"])
329
+ end
330
+
331
+ remove_properties(json, ["languages"])
332
+
333
+ remove_properties(json, ["nginx"]) # this is added automatically by the nginx Chef recipe
334
+
335
+ if json["kernel"] && json["kernel"]["modules"]
336
+ mod_names = ""
337
+ json["kernel"]["modules"].each do |key,value|
338
+ mod_names += key + " "
339
+ end
340
+ json["kernel"]["modules"] = mod_names.strip
341
+ end
342
+ end
343
+
344
+ def self.remove_properties(json, props)
345
+ MarkupUtil.remove_properties(json, props)
346
+ end
347
+
348
+ end
349
+ end