cloud-mu 1.9.0.pre.beta

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 (618) hide show
  1. checksums.yaml +7 -0
  2. data/Berksfile +56 -0
  3. data/Berksfile.lock +250 -0
  4. data/Jenkinsfile +184 -0
  5. data/LICENSE.md +37 -0
  6. data/README.md +26 -0
  7. data/bin/mu-aws-setup +376 -0
  8. data/bin/mu-cleanup +68 -0
  9. data/bin/mu-configure +1133 -0
  10. data/bin/mu-deploy +166 -0
  11. data/bin/mu-firewall-allow-clients +30 -0
  12. data/bin/mu-gcp-setup +200 -0
  13. data/bin/mu-gen-docs +34 -0
  14. data/bin/mu-gen-env +42 -0
  15. data/bin/mu-load-config.rb +158 -0
  16. data/bin/mu-node-manage +683 -0
  17. data/bin/mu-self-update +228 -0
  18. data/bin/mu-ssh +23 -0
  19. data/bin/mu-tunnel-nagios +144 -0
  20. data/bin/mu-upload-chef-artifacts +757 -0
  21. data/bin/mu-user-manage +275 -0
  22. data/cookbooks/awscli/LICENSE +37 -0
  23. data/cookbooks/awscli/README.md +58 -0
  24. data/cookbooks/awscli/attributes/default.rb +1 -0
  25. data/cookbooks/awscli/libraries/instance_metadata.rb +21 -0
  26. data/cookbooks/awscli/metadata.rb +20 -0
  27. data/cookbooks/awscli/recipes/default.rb +56 -0
  28. data/cookbooks/awscli/templates/default/config.erb +18 -0
  29. data/cookbooks/mu-activedirectory/CHANGELOG.md +13 -0
  30. data/cookbooks/mu-activedirectory/LICENSE +37 -0
  31. data/cookbooks/mu-activedirectory/README.md +6 -0
  32. data/cookbooks/mu-activedirectory/attributes/default.rb +98 -0
  33. data/cookbooks/mu-activedirectory/files/default/password-auth +32 -0
  34. data/cookbooks/mu-activedirectory/files/default/sshd_pol.pp +0 -0
  35. data/cookbooks/mu-activedirectory/files/default/sshd_pol.te +32 -0
  36. data/cookbooks/mu-activedirectory/files/default/syslogd_oddjobd.pp +0 -0
  37. data/cookbooks/mu-activedirectory/files/default/syslogd_oddjobd.te +10 -0
  38. data/cookbooks/mu-activedirectory/files/default/system-auth +34 -0
  39. data/cookbooks/mu-activedirectory/files/default/winbindpol.pp +0 -0
  40. data/cookbooks/mu-activedirectory/files/default/winbindpol.te +37 -0
  41. data/cookbooks/mu-activedirectory/libraries/config.rb +106 -0
  42. data/cookbooks/mu-activedirectory/libraries/helper.rb +86 -0
  43. data/cookbooks/mu-activedirectory/metadata.rb +17 -0
  44. data/cookbooks/mu-activedirectory/providers/domain.rb +152 -0
  45. data/cookbooks/mu-activedirectory/providers/domain_controller.rb +89 -0
  46. data/cookbooks/mu-activedirectory/providers/domain_node.rb +275 -0
  47. data/cookbooks/mu-activedirectory/recipes/default.rb +8 -0
  48. data/cookbooks/mu-activedirectory/recipes/domain-controller.rb +44 -0
  49. data/cookbooks/mu-activedirectory/recipes/domain-node.rb +50 -0
  50. data/cookbooks/mu-activedirectory/recipes/domain.rb +43 -0
  51. data/cookbooks/mu-activedirectory/recipes/sssd.rb +185 -0
  52. data/cookbooks/mu-activedirectory/resources/domain.rb +25 -0
  53. data/cookbooks/mu-activedirectory/resources/domain_controller.rb +25 -0
  54. data/cookbooks/mu-activedirectory/resources/domain_node.rb +20 -0
  55. data/cookbooks/mu-activedirectory/templates/default/dhclient-eth0.conf.erb +4 -0
  56. data/cookbooks/mu-activedirectory/templates/default/interface +0 -0
  57. data/cookbooks/mu-activedirectory/templates/default/krb5.conf.erb +23 -0
  58. data/cookbooks/mu-activedirectory/templates/default/ntp.conf.erb +56 -0
  59. data/cookbooks/mu-activedirectory/templates/default/smb.conf.erb +33 -0
  60. data/cookbooks/mu-activedirectory/templates/default/sssd.conf.erb +60 -0
  61. data/cookbooks/mu-activedirectory/templates/windows/Backup.xml.erb +20 -0
  62. data/cookbooks/mu-activedirectory/templates/windows/bkupInfo.xml.erb +1 -0
  63. data/cookbooks/mu-activedirectory/templates/windows/gpreprt.xml.erb +198 -0
  64. data/cookbooks/mu-activedirectory/templates/windows/gptmpl.inf.erb +12 -0
  65. data/cookbooks/mu-activedirectory/templates/windows/manifest.xml.erb +1 -0
  66. data/cookbooks/mu-firewall/CHANGELOG.md +11 -0
  67. data/cookbooks/mu-firewall/LICENSE +37 -0
  68. data/cookbooks/mu-firewall/README.md +5 -0
  69. data/cookbooks/mu-firewall/attributes/default.rb +3 -0
  70. data/cookbooks/mu-firewall/metadata.rb +16 -0
  71. data/cookbooks/mu-firewall/recipes/default.rb +10 -0
  72. data/cookbooks/mu-glusterfs/CHANGELOG.md +13 -0
  73. data/cookbooks/mu-glusterfs/LICENSE +37 -0
  74. data/cookbooks/mu-glusterfs/README.md +5 -0
  75. data/cookbooks/mu-glusterfs/attributes/default.rb +34 -0
  76. data/cookbooks/mu-glusterfs/metadata.rb +17 -0
  77. data/cookbooks/mu-glusterfs/recipes/client.rb +62 -0
  78. data/cookbooks/mu-glusterfs/recipes/default.rb +16 -0
  79. data/cookbooks/mu-glusterfs/recipes/samba.rb +57 -0
  80. data/cookbooks/mu-glusterfs/recipes/server.rb +200 -0
  81. data/cookbooks/mu-glusterfs/templates/default/mu-gluster-client.erb +71 -0
  82. data/cookbooks/mu-glusterfs/templates/default/smb.conf.erb +14 -0
  83. data/cookbooks/mu-jenkins/CHANGELOG.md +13 -0
  84. data/cookbooks/mu-jenkins/LICENSE +37 -0
  85. data/cookbooks/mu-jenkins/README.md +105 -0
  86. data/cookbooks/mu-jenkins/attributes/default.rb +42 -0
  87. data/cookbooks/mu-jenkins/files/default/cleanup_deploy_config.xml +73 -0
  88. data/cookbooks/mu-jenkins/files/default/deploy_config.xml +44 -0
  89. data/cookbooks/mu-jenkins/metadata.rb +21 -0
  90. data/cookbooks/mu-jenkins/recipes/default.rb +195 -0
  91. data/cookbooks/mu-jenkins/recipes/node-ssh-config.rb +54 -0
  92. data/cookbooks/mu-jenkins/recipes/public_key.rb +24 -0
  93. data/cookbooks/mu-jenkins/templates/default/example_job.config.xml.erb +24 -0
  94. data/cookbooks/mu-jenkins/templates/default/org.jvnet.hudson.plugins.SSHBuildWrapper.xml.erb +14 -0
  95. data/cookbooks/mu-jenkins/templates/default/ssh_config.erb +6 -0
  96. data/cookbooks/mu-master/CHANGELOG.md +13 -0
  97. data/cookbooks/mu-master/LICENSE +37 -0
  98. data/cookbooks/mu-master/README.md +6 -0
  99. data/cookbooks/mu-master/attributes/default.rb +95 -0
  100. data/cookbooks/mu-master/files/default/0-mu-log-server.conf +19 -0
  101. data/cookbooks/mu-master/files/default/addRSA.ldif +8 -0
  102. data/cookbooks/mu-master/files/default/check_mem.pl +197 -0
  103. data/cookbooks/mu-master/files/default/cloudamatic.png +0 -0
  104. data/cookbooks/mu-master/files/default/dirsrv_admin.pp +0 -0
  105. data/cookbooks/mu-master/files/default/dirsrv_admin.te +13 -0
  106. data/cookbooks/mu-master/files/default/nagios_selinux.pp +0 -0
  107. data/cookbooks/mu-master/files/default/nagios_selinux.te +51 -0
  108. data/cookbooks/mu-master/files/default/nagios_selinux_7.pp +0 -0
  109. data/cookbooks/mu-master/files/default/nagios_selinux_7.te +17 -0
  110. data/cookbooks/mu-master/files/default/pam_sshd +18 -0
  111. data/cookbooks/mu-master/files/default/ssl_enable.ldif +18 -0
  112. data/cookbooks/mu-master/files/default/syslogd_oddjobd.pp +0 -0
  113. data/cookbooks/mu-master/files/default/syslogd_oddjobd.te +10 -0
  114. data/cookbooks/mu-master/files/default/vimrc +19 -0
  115. data/cookbooks/mu-master/libraries/mu.rb +29 -0
  116. data/cookbooks/mu-master/metadata.rb +30 -0
  117. data/cookbooks/mu-master/providers/user.rb +41 -0
  118. data/cookbooks/mu-master/recipes/389ds.rb +164 -0
  119. data/cookbooks/mu-master/recipes/basepackages.rb +58 -0
  120. data/cookbooks/mu-master/recipes/caching_nameserver.rb +37 -0
  121. data/cookbooks/mu-master/recipes/default.rb +451 -0
  122. data/cookbooks/mu-master/recipes/eks-kubectl.rb +41 -0
  123. data/cookbooks/mu-master/recipes/firewall-holes.rb +70 -0
  124. data/cookbooks/mu-master/recipes/init.rb +542 -0
  125. data/cookbooks/mu-master/recipes/ssl-certs.rb +109 -0
  126. data/cookbooks/mu-master/recipes/sssd.rb +89 -0
  127. data/cookbooks/mu-master/recipes/update_nagios_only.rb +242 -0
  128. data/cookbooks/mu-master/recipes/vault.rb +111 -0
  129. data/cookbooks/mu-master/resources/user.rb +19 -0
  130. data/cookbooks/mu-master/templates/default/389-directory-setup.inf.erb +28 -0
  131. data/cookbooks/mu-master/templates/default/chef-server.rb.erb +18 -0
  132. data/cookbooks/mu-master/templates/default/dhclient-eth0.conf.erb +9 -0
  133. data/cookbooks/mu-master/templates/default/mu-momma-cat.erb +149 -0
  134. data/cookbooks/mu-master/templates/default/mu.rc.erb +9 -0
  135. data/cookbooks/mu-master/templates/default/openssl.cnf.erb +354 -0
  136. data/cookbooks/mu-master/templates/default/sssd.conf.erb +44 -0
  137. data/cookbooks/mu-master/templates/default/web_app.conf.erb +90 -0
  138. data/cookbooks/mu-mongo/CHANGELOG.md +13 -0
  139. data/cookbooks/mu-mongo/LICENSE +37 -0
  140. data/cookbooks/mu-mongo/README.md +5 -0
  141. data/cookbooks/mu-mongo/attributes/default.rb +22 -0
  142. data/cookbooks/mu-mongo/files/default/keyfile +16 -0
  143. data/cookbooks/mu-mongo/files/default/remove_nodes.js +5 -0
  144. data/cookbooks/mu-mongo/metadata.rb +17 -0
  145. data/cookbooks/mu-mongo/recipes/default.rb +149 -0
  146. data/cookbooks/mu-mongo/recipes/yum-update-rule.rb +18 -0
  147. data/cookbooks/mu-mongo/templates/default/mongo_create_openfema_db.js.erb +2 -0
  148. data/cookbooks/mu-mongo/templates/default/mongo_init.js.erb +1 -0
  149. data/cookbooks/mu-mongo/templates/default/mongo_logrotate.erb +14 -0
  150. data/cookbooks/mu-mongo/templates/default/mongo_replset_addnodes.js.erb +6 -0
  151. data/cookbooks/mu-mongo/templates/default/replset_init.js.erb +2 -0
  152. data/cookbooks/mu-openvpn/CHANGELOG.md +13 -0
  153. data/cookbooks/mu-openvpn/LICENSE +37 -0
  154. data/cookbooks/mu-openvpn/README.md +6 -0
  155. data/cookbooks/mu-openvpn/attributes/default.rb +119 -0
  156. data/cookbooks/mu-openvpn/metadata.rb +18 -0
  157. data/cookbooks/mu-openvpn/recipes/default.rb +108 -0
  158. data/cookbooks/mu-openvpn/templates/default/users.json.erb +42 -0
  159. data/cookbooks/mu-php54/CHANGELOG.md +12 -0
  160. data/cookbooks/mu-php54/LICENSE +37 -0
  161. data/cookbooks/mu-php54/README.md +0 -0
  162. data/cookbooks/mu-php54/files/centos/php.ini +1802 -0
  163. data/cookbooks/mu-php54/files/ubuntu/php.ini +1870 -0
  164. data/cookbooks/mu-php54/metadata.rb +21 -0
  165. data/cookbooks/mu-php54/recipes/default.rb +97 -0
  166. data/cookbooks/mu-splunk/CHANGELOG.md +37 -0
  167. data/cookbooks/mu-splunk/LICENSE +37 -0
  168. data/cookbooks/mu-splunk/README.md +451 -0
  169. data/cookbooks/mu-splunk/attributes/default.rb +95 -0
  170. data/cookbooks/mu-splunk/attributes/upgrade.rb +49 -0
  171. data/cookbooks/mu-splunk/definitions/splunk_installer.rb +103 -0
  172. data/cookbooks/mu-splunk/files/default/splunk-nocheck +10 -0
  173. data/cookbooks/mu-splunk/libraries/helpers.rb +72 -0
  174. data/cookbooks/mu-splunk/libraries/splunk_app_provider.rb +156 -0
  175. data/cookbooks/mu-splunk/libraries/splunk_app_resource.rb +43 -0
  176. data/cookbooks/mu-splunk/metadata.json +30 -0
  177. data/cookbooks/mu-splunk/metadata.rb +17 -0
  178. data/cookbooks/mu-splunk/recipes/client.rb +143 -0
  179. data/cookbooks/mu-splunk/recipes/default.rb +31 -0
  180. data/cookbooks/mu-splunk/recipes/disabled.rb +41 -0
  181. data/cookbooks/mu-splunk/recipes/install_forwarder.rb +23 -0
  182. data/cookbooks/mu-splunk/recipes/install_server.rb +23 -0
  183. data/cookbooks/mu-splunk/recipes/server.rb +53 -0
  184. data/cookbooks/mu-splunk/recipes/service.rb +95 -0
  185. data/cookbooks/mu-splunk/recipes/setup_auth.rb +49 -0
  186. data/cookbooks/mu-splunk/recipes/setup_ssl.rb +63 -0
  187. data/cookbooks/mu-splunk/recipes/upgrade.rb +94 -0
  188. data/cookbooks/mu-splunk/recipes/user.rb +34 -0
  189. data/cookbooks/mu-splunk/templates/default/base_logs_unix_inputs.conf.erb +26 -0
  190. data/cookbooks/mu-splunk/templates/default/inputs.conf.erb +13 -0
  191. data/cookbooks/mu-splunk/templates/default/outputs.conf.erb +9 -0
  192. data/cookbooks/mu-splunk/templates/default/splunk-init.erb +74 -0
  193. data/cookbooks/mu-splunk/templates/default/system-web.conf.erb +7 -0
  194. data/cookbooks/mu-tools/CHANGELOG.md +12 -0
  195. data/cookbooks/mu-tools/LICENSE +37 -0
  196. data/cookbooks/mu-tools/README.md +188 -0
  197. data/cookbooks/mu-tools/attributes/default.rb +142 -0
  198. data/cookbooks/mu-tools/attributes/ebs_rolling_snapshots.rb +3 -0
  199. data/cookbooks/mu-tools/files/amazon/etc/freshclam.conf +235 -0
  200. data/cookbooks/mu-tools/files/centos/CentOS-Base.repo +52 -0
  201. data/cookbooks/mu-tools/files/centos/etc/bashrc +93 -0
  202. data/cookbooks/mu-tools/files/centos/etc/freshclam.conf +235 -0
  203. data/cookbooks/mu-tools/files/centos/etc/login.defs +72 -0
  204. data/cookbooks/mu-tools/files/centos/etc/profile +77 -0
  205. data/cookbooks/mu-tools/files/centos/etc/security/limits.conf +57 -0
  206. data/cookbooks/mu-tools/files/centos/etc/sysconfig/init +19 -0
  207. data/cookbooks/mu-tools/files/centos/etc/sysctl.conf +82 -0
  208. data/cookbooks/mu-tools/files/centos-6/README_MU +0 -0
  209. data/cookbooks/mu-tools/files/centos-6/etc/audit/stig.rules +173 -0
  210. data/cookbooks/mu-tools/files/centos-6/etc/bashrc +90 -0
  211. data/cookbooks/mu-tools/files/centos-6/etc/login.defs +70 -0
  212. data/cookbooks/mu-tools/files/centos-6/etc/pam.d/su +12 -0
  213. data/cookbooks/mu-tools/files/centos-6/etc/profile +83 -0
  214. data/cookbooks/mu-tools/files/centos-6/etc/securetty +12 -0
  215. data/cookbooks/mu-tools/files/centos-6/etc/sysconfig/init +30 -0
  216. data/cookbooks/mu-tools/files/centos-6/etc/sysctl.conf +40 -0
  217. data/cookbooks/mu-tools/files/default/Mu_CA.pem +34 -0
  218. data/cookbooks/mu-tools/files/default/PSWindowsUpdate.zip +0 -0
  219. data/cookbooks/mu-tools/files/default/ebs_snapshots.py +123 -0
  220. data/cookbooks/mu-tools/files/default/etc/BANNER +0 -0
  221. data/cookbooks/mu-tools/files/default/etc/BANNER-FEDERAL +19 -0
  222. data/cookbooks/mu-tools/files/default/gpo_no_uac.zip +0 -0
  223. data/cookbooks/mu-tools/files/default/mypol.pp +0 -0
  224. data/cookbooks/mu-tools/files/default/mypol.te +37 -0
  225. data/cookbooks/mu-tools/files/default/nrpe_c7.pp +0 -0
  226. data/cookbooks/mu-tools/files/default/nrpe_c7.te +31 -0
  227. data/cookbooks/mu-tools/files/default/nrpe_check_disk.pp +0 -0
  228. data/cookbooks/mu-tools/files/default/nrpe_check_disk.te +11 -0
  229. data/cookbooks/mu-tools/files/default/nrpe_disk.pp +0 -0
  230. data/cookbooks/mu-tools/files/default/nrpe_disk.te +10 -0
  231. data/cookbooks/mu-tools/files/default/nrpe_file.pp +0 -0
  232. data/cookbooks/mu-tools/files/default/nrpe_file.te +31 -0
  233. data/cookbooks/mu-tools/files/default/ntrights +0 -0
  234. data/cookbooks/mu-tools/files/default/serverclass.conf +18 -0
  235. data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_unix/local/app.conf +1 -0
  236. data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_unix/local/inputs.conf +13 -0
  237. data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_windows/local/app.conf +1 -0
  238. data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_windows/local/inputs.conf +8 -0
  239. data/cookbooks/mu-tools/files/default/sshd_pol.pp +0 -0
  240. data/cookbooks/mu-tools/files/default/sshd_pol.te +32 -0
  241. data/cookbooks/mu-tools/files/redhat/etc/bashrc +93 -0
  242. data/cookbooks/mu-tools/files/redhat/etc/freshclam.conf +235 -0
  243. data/cookbooks/mu-tools/files/redhat/etc/login.defs +72 -0
  244. data/cookbooks/mu-tools/files/redhat/etc/profile +77 -0
  245. data/cookbooks/mu-tools/files/redhat/etc/security/limits.conf +57 -0
  246. data/cookbooks/mu-tools/files/redhat/etc/sysconfig/init +19 -0
  247. data/cookbooks/mu-tools/files/redhat/etc/sysctl.conf +82 -0
  248. data/cookbooks/mu-tools/files/redhat-6/README_MU +0 -0
  249. data/cookbooks/mu-tools/files/redhat-6/etc/audit/stig.rules +173 -0
  250. data/cookbooks/mu-tools/files/redhat-6/etc/bashrc +90 -0
  251. data/cookbooks/mu-tools/files/redhat-6/etc/login.defs +70 -0
  252. data/cookbooks/mu-tools/files/redhat-6/etc/pam.d/su +12 -0
  253. data/cookbooks/mu-tools/files/redhat-6/etc/profile +83 -0
  254. data/cookbooks/mu-tools/files/redhat-6/etc/securetty +12 -0
  255. data/cookbooks/mu-tools/files/redhat-6/etc/sysconfig/init +30 -0
  256. data/cookbooks/mu-tools/files/redhat-6/etc/sysctl.conf +40 -0
  257. data/cookbooks/mu-tools/files/redhat-7.1/etc/freshclam.conf +235 -0
  258. data/cookbooks/mu-tools/files/ubuntu-12.04/etc/bash.bashrc +64 -0
  259. data/cookbooks/mu-tools/files/ubuntu-12.04/etc/common-session +30 -0
  260. data/cookbooks/mu-tools/files/ubuntu-12.04/etc/login.defs +338 -0
  261. data/cookbooks/mu-tools/files/ubuntu-12.04/etc/profile +30 -0
  262. data/cookbooks/mu-tools/files/ubuntu-12.04/etc/security/limits.conf +56 -0
  263. data/cookbooks/mu-tools/files/ubuntu-12.04/etc/sysctl.conf +60 -0
  264. data/cookbooks/mu-tools/libraries/helper.rb +292 -0
  265. data/cookbooks/mu-tools/metadata.rb +28 -0
  266. data/cookbooks/mu-tools/recipes/add_admin_ssh_keys.rb +35 -0
  267. data/cookbooks/mu-tools/recipes/apply_security.rb +440 -0
  268. data/cookbooks/mu-tools/recipes/aws_api.rb +23 -0
  269. data/cookbooks/mu-tools/recipes/base_repositories.rb +31 -0
  270. data/cookbooks/mu-tools/recipes/cisbenchmark.rb +59 -0
  271. data/cookbooks/mu-tools/recipes/clamav.rb +53 -0
  272. data/cookbooks/mu-tools/recipes/cloudinit.rb +58 -0
  273. data/cookbooks/mu-tools/recipes/configure_oracle_tools.rb +81 -0
  274. data/cookbooks/mu-tools/recipes/disable-requiretty.rb +22 -0
  275. data/cookbooks/mu-tools/recipes/ebs_rolling_snapshots.rb +75 -0
  276. data/cookbooks/mu-tools/recipes/efs.rb +70 -0
  277. data/cookbooks/mu-tools/recipes/eks.rb +160 -0
  278. data/cookbooks/mu-tools/recipes/gcloud.rb +98 -0
  279. data/cookbooks/mu-tools/recipes/google_api.rb +25 -0
  280. data/cookbooks/mu-tools/recipes/maldet.rb +67 -0
  281. data/cookbooks/mu-tools/recipes/nagios.rb +19 -0
  282. data/cookbooks/mu-tools/recipes/newclient.rb +23 -0
  283. data/cookbooks/mu-tools/recipes/nrpe.rb +115 -0
  284. data/cookbooks/mu-tools/recipes/python_pip.rb +35 -0
  285. data/cookbooks/mu-tools/recipes/retrieve_application.rb +51 -0
  286. data/cookbooks/mu-tools/recipes/rsyslog.rb +65 -0
  287. data/cookbooks/mu-tools/recipes/set_local_fw.rb +57 -0
  288. data/cookbooks/mu-tools/recipes/set_mu_hostname.rb +81 -0
  289. data/cookbooks/mu-tools/recipes/split_var_partitions.rb +86 -0
  290. data/cookbooks/mu-tools/recipes/splunk-client.rb +69 -0
  291. data/cookbooks/mu-tools/recipes/splunk-server.rb +104 -0
  292. data/cookbooks/mu-tools/recipes/store_inspec_attr.rb +8 -0
  293. data/cookbooks/mu-tools/recipes/updates.rb +96 -0
  294. data/cookbooks/mu-tools/recipes/windows-client.rb +202 -0
  295. data/cookbooks/mu-tools/resources/aws_windows.rb +33 -0
  296. data/cookbooks/mu-tools/resources/disk.rb +88 -0
  297. data/cookbooks/mu-tools/resources/mommacat_request.rb +11 -0
  298. data/cookbooks/mu-tools/resources/scheduled_tasks.rb +29 -0
  299. data/cookbooks/mu-tools/resources/sshd_service.rb +45 -0
  300. data/cookbooks/mu-tools/resources/windows_users.rb +242 -0
  301. data/cookbooks/mu-tools/templates/amazon/sshd_config.erb +168 -0
  302. data/cookbooks/mu-tools/templates/centos-6/sshd_config.erb +212 -0
  303. data/cookbooks/mu-tools/templates/centos-7/sshd_config.erb +215 -0
  304. data/cookbooks/mu-tools/templates/default/0-mu-log-client.conf.erb +13 -0
  305. data/cookbooks/mu-tools/templates/default/conf.maldet.erb +137 -0
  306. data/cookbooks/mu-tools/templates/default/etc_hosts.erb +30 -0
  307. data/cookbooks/mu-tools/templates/default/etc_pamd_password-auth.erb +14 -0
  308. data/cookbooks/mu-tools/templates/default/etc_pamd_system-auth.erb +14 -0
  309. data/cookbooks/mu-tools/templates/default/etc_sysconfig_network.erb +12 -0
  310. data/cookbooks/mu-tools/templates/default/kubeconfig.erb +29 -0
  311. data/cookbooks/mu-tools/templates/default/kubelet.service.erb +35 -0
  312. data/cookbooks/mu-tools/templates/default/maldet_scanall.sh.erb +15 -0
  313. data/cookbooks/mu-tools/templates/default/nrpe.cfg.erb +233 -0
  314. data/cookbooks/mu-tools/templates/redhat-6/sshd_config.erb +213 -0
  315. data/cookbooks/mu-tools/templates/redhat-7/sshd_config.erb +215 -0
  316. data/cookbooks/mu-tools/templates/ubuntu-12.04/sshd_config.erb +146 -0
  317. data/cookbooks/mu-tools/templates/ubuntu-14.04/sshd_config.erb +145 -0
  318. data/cookbooks/mu-tools/templates/windows/Backup.xml.erb +20 -0
  319. data/cookbooks/mu-tools/templates/windows/bkupInfo.xml.erb +1 -0
  320. data/cookbooks/mu-tools/templates/windows/gpreprt.xml.erb +214 -0
  321. data/cookbooks/mu-tools/templates/windows/gptmpl.inf.erb +12 -0
  322. data/cookbooks/mu-tools/templates/windows/manifest.xml.erb +1 -0
  323. data/cookbooks/mu-tools/templates/windows/set_ad_dns_scheduled_task.ps1.erb +6 -0
  324. data/cookbooks/mu-tools/templates/windows/sshd_config.erb +136 -0
  325. data/cookbooks/mu-utility/CHANGELOG.md +12 -0
  326. data/cookbooks/mu-utility/LICENSE +37 -0
  327. data/cookbooks/mu-utility/README.md +6 -0
  328. data/cookbooks/mu-utility/attributes/default.rb +1 -0
  329. data/cookbooks/mu-utility/libraries/matchers.rb +21 -0
  330. data/cookbooks/mu-utility/metadata.rb +16 -0
  331. data/cookbooks/mu-utility/recipes/apt.rb +23 -0
  332. data/cookbooks/mu-utility/recipes/cleanup_image_helper.rb +118 -0
  333. data/cookbooks/mu-utility/recipes/iptables.rb +26 -0
  334. data/cookbooks/mu-utility/recipes/luks.rb +18 -0
  335. data/cookbooks/mu-utility/recipes/nat.rb +104 -0
  336. data/cookbooks/mu-utility/recipes/php.rb +33 -0
  337. data/cookbooks/mu-utility/recipes/rdp_gateway.rb +83 -0
  338. data/cookbooks/mu-utility/recipes/remi.rb +44 -0
  339. data/cookbooks/mu-utility/recipes/vim.rb +26 -0
  340. data/cookbooks/mu-utility/recipes/windows_basics.rb +37 -0
  341. data/cookbooks/mu-utility/recipes/zip.rb +26 -0
  342. data/cookbooks/mu-utility/templates/default/BundleConfig.xml.erb +34 -0
  343. data/cookbooks/mu-utility/templates/default/config.xml.erb +60 -0
  344. data/cookbooks/nagios/Berksfile +8 -0
  345. data/cookbooks/nagios/CHANGELOG.md +589 -0
  346. data/cookbooks/nagios/CONTRIBUTING.md +11 -0
  347. data/cookbooks/nagios/LICENSE +37 -0
  348. data/cookbooks/nagios/README.md +328 -0
  349. data/cookbooks/nagios/TESTING.md +2 -0
  350. data/cookbooks/nagios/attributes/config.rb +171 -0
  351. data/cookbooks/nagios/attributes/default.rb +228 -0
  352. data/cookbooks/nagios/chefignore +102 -0
  353. data/cookbooks/nagios/definitions/command.rb +33 -0
  354. data/cookbooks/nagios/definitions/contact.rb +33 -0
  355. data/cookbooks/nagios/definitions/contactgroup.rb +33 -0
  356. data/cookbooks/nagios/definitions/host.rb +33 -0
  357. data/cookbooks/nagios/definitions/hostdependency.rb +33 -0
  358. data/cookbooks/nagios/definitions/hostescalation.rb +34 -0
  359. data/cookbooks/nagios/definitions/hostgroup.rb +33 -0
  360. data/cookbooks/nagios/definitions/nagios_conf.rb +38 -0
  361. data/cookbooks/nagios/definitions/resource.rb +33 -0
  362. data/cookbooks/nagios/definitions/service.rb +33 -0
  363. data/cookbooks/nagios/definitions/servicedependency.rb +33 -0
  364. data/cookbooks/nagios/definitions/serviceescalation.rb +34 -0
  365. data/cookbooks/nagios/definitions/servicegroup.rb +33 -0
  366. data/cookbooks/nagios/definitions/timeperiod.rb +33 -0
  367. data/cookbooks/nagios/libraries/base.rb +314 -0
  368. data/cookbooks/nagios/libraries/command.rb +91 -0
  369. data/cookbooks/nagios/libraries/contact.rb +230 -0
  370. data/cookbooks/nagios/libraries/contactgroup.rb +112 -0
  371. data/cookbooks/nagios/libraries/custom_option.rb +36 -0
  372. data/cookbooks/nagios/libraries/data_bag_helper.rb +23 -0
  373. data/cookbooks/nagios/libraries/default.rb +90 -0
  374. data/cookbooks/nagios/libraries/host.rb +412 -0
  375. data/cookbooks/nagios/libraries/hostdependency.rb +181 -0
  376. data/cookbooks/nagios/libraries/hostescalation.rb +173 -0
  377. data/cookbooks/nagios/libraries/hostgroup.rb +119 -0
  378. data/cookbooks/nagios/libraries/nagios.rb +282 -0
  379. data/cookbooks/nagios/libraries/resource.rb +59 -0
  380. data/cookbooks/nagios/libraries/service.rb +455 -0
  381. data/cookbooks/nagios/libraries/servicedependency.rb +215 -0
  382. data/cookbooks/nagios/libraries/serviceescalation.rb +195 -0
  383. data/cookbooks/nagios/libraries/servicegroup.rb +144 -0
  384. data/cookbooks/nagios/libraries/timeperiod.rb +160 -0
  385. data/cookbooks/nagios/libraries/users_helper.rb +54 -0
  386. data/cookbooks/nagios/metadata.rb +25 -0
  387. data/cookbooks/nagios/recipes/_load_databag_config.rb +153 -0
  388. data/cookbooks/nagios/recipes/_load_default_config.rb +241 -0
  389. data/cookbooks/nagios/recipes/apache.rb +48 -0
  390. data/cookbooks/nagios/recipes/default.rb +204 -0
  391. data/cookbooks/nagios/recipes/nginx.rb +82 -0
  392. data/cookbooks/nagios/recipes/pagerduty.rb +143 -0
  393. data/cookbooks/nagios/recipes/server_package.rb +40 -0
  394. data/cookbooks/nagios/recipes/server_source.rb +164 -0
  395. data/cookbooks/nagios/templates/default/apache2.conf.erb +96 -0
  396. data/cookbooks/nagios/templates/default/cgi.cfg.erb +266 -0
  397. data/cookbooks/nagios/templates/default/commands.cfg.erb +13 -0
  398. data/cookbooks/nagios/templates/default/contacts.cfg.erb +37 -0
  399. data/cookbooks/nagios/templates/default/hostgroups.cfg.erb +25 -0
  400. data/cookbooks/nagios/templates/default/hosts.cfg.erb +15 -0
  401. data/cookbooks/nagios/templates/default/htpasswd.users.erb +6 -0
  402. data/cookbooks/nagios/templates/default/nagios.cfg.erb +22 -0
  403. data/cookbooks/nagios/templates/default/nginx.conf.erb +62 -0
  404. data/cookbooks/nagios/templates/default/pagerduty.cgi.erb +185 -0
  405. data/cookbooks/nagios/templates/default/resource.cfg.erb +27 -0
  406. data/cookbooks/nagios/templates/default/servicedependencies.cfg.erb +15 -0
  407. data/cookbooks/nagios/templates/default/servicegroups.cfg.erb +14 -0
  408. data/cookbooks/nagios/templates/default/services.cfg.erb +14 -0
  409. data/cookbooks/nagios/templates/default/templates.cfg.erb +31 -0
  410. data/cookbooks/nagios/templates/default/timeperiods.cfg.erb +13 -0
  411. data/cookbooks/s3fs/CHANGELOG.md +13 -0
  412. data/cookbooks/s3fs/LICENSE +37 -0
  413. data/cookbooks/s3fs/README.md +6 -0
  414. data/cookbooks/s3fs/attributes/default.rb +15 -0
  415. data/cookbooks/s3fs/files/default/fuse-2.9.3.zip +0 -0
  416. data/cookbooks/s3fs/metadata.rb +16 -0
  417. data/cookbooks/s3fs/recipes/default.rb +91 -0
  418. data/data_bags/demo/app.json +7 -0
  419. data/data_bags/nagios_services/chef.json +6 -0
  420. data/data_bags/nagios_services/linux_diskspace.json +5 -0
  421. data/data_bags/nagios_services/momma_cat.json +6 -0
  422. data/data_bags/nagios_services/mu-master-memory.json +5 -0
  423. data/data_bags/nagios_services/nagios_ui.json +6 -0
  424. data/data_bags/nagios_services/node_ssh.json +6 -0
  425. data/data_bags/nagios_services/ssh.json +6 -0
  426. data/demo/lambda_test.yaml +29 -0
  427. data/environments/DEV.json +8 -0
  428. data/environments/PROD.json +8 -0
  429. data/environments/dev.json +8 -0
  430. data/environments/development.json +8 -0
  431. data/environments/prod.json +8 -0
  432. data/extras/README.md +1 -0
  433. data/extras/admin-role-binding.yaml +16 -0
  434. data/extras/admin-user.yaml +6 -0
  435. data/extras/aws-auth-cm.yaml.erb +12 -0
  436. data/extras/clean-stock-amis +48 -0
  437. data/extras/git-fix-permissions-hook +12 -0
  438. data/extras/gitlab-eks-helper.sh.erb +20 -0
  439. data/extras/image-generators/README.md +2 -0
  440. data/extras/image-generators/aws/centos6.yaml +18 -0
  441. data/extras/image-generators/aws/centos7-govcloud.yaml +24 -0
  442. data/extras/image-generators/aws/centos7.yaml +17 -0
  443. data/extras/image-generators/aws/rhel7.yaml +17 -0
  444. data/extras/image-generators/aws/win2k12.yaml +16 -0
  445. data/extras/image-generators/aws/win2k16.yaml +16 -0
  446. data/extras/image-generators/aws/windows.yaml +18 -0
  447. data/extras/image-generators/gcp/centos6.yaml +17 -0
  448. data/extras/lambda_waf_domain_blacklist.py +103 -0
  449. data/extras/platform_berksfile_base +50 -0
  450. data/extras/ruby_rpm/build.sh +17 -0
  451. data/extras/ruby_rpm/muby.spec +44 -0
  452. data/extras/vault_tools/README.md +6 -0
  453. data/extras/vault_tools/export_vaults.sh +3 -0
  454. data/extras/vault_tools/recreate_vaults.sh +5 -0
  455. data/extras/vault_tools/test_vaults.sh +5 -0
  456. data/install/README.md +8 -0
  457. data/install/cfn_create_mu_master.json +1034 -0
  458. data/install/chef-server.rb.erb +19 -0
  459. data/install/deprecated-bash-library.sh +1891 -0
  460. data/install/images/Usage.png +0 -0
  461. data/install/installer +71 -0
  462. data/install/jenkinskeys.rb +8 -0
  463. data/install/user-dot-murc.erb +14 -0
  464. data/modules/html.erb +19 -0
  465. data/modules/mommacat.ru +426 -0
  466. data/modules/mu/cleanup.rb +339 -0
  467. data/modules/mu/cloud.rb +1446 -0
  468. data/modules/mu/clouds/README.md +201 -0
  469. data/modules/mu/clouds/aws/alarm.rb +319 -0
  470. data/modules/mu/clouds/aws/cache_cluster.rb +1010 -0
  471. data/modules/mu/clouds/aws/collection.rb +373 -0
  472. data/modules/mu/clouds/aws/container_cluster.rb +667 -0
  473. data/modules/mu/clouds/aws/database.rb +1836 -0
  474. data/modules/mu/clouds/aws/dnszone.rb +911 -0
  475. data/modules/mu/clouds/aws/firewall_rule.rb +641 -0
  476. data/modules/mu/clouds/aws/folder.rb +92 -0
  477. data/modules/mu/clouds/aws/function.rb +349 -0
  478. data/modules/mu/clouds/aws/group.rb +251 -0
  479. data/modules/mu/clouds/aws/loadbalancer.rb +888 -0
  480. data/modules/mu/clouds/aws/log.rb +363 -0
  481. data/modules/mu/clouds/aws/msg_queue.rb +480 -0
  482. data/modules/mu/clouds/aws/notification.rb +139 -0
  483. data/modules/mu/clouds/aws/role.rb +656 -0
  484. data/modules/mu/clouds/aws/search_domain.rb +646 -0
  485. data/modules/mu/clouds/aws/server.rb +2294 -0
  486. data/modules/mu/clouds/aws/server_pool.rb +1388 -0
  487. data/modules/mu/clouds/aws/storage_pool.rb +495 -0
  488. data/modules/mu/clouds/aws/user.rb +382 -0
  489. data/modules/mu/clouds/aws/userdata/README.md +4 -0
  490. data/modules/mu/clouds/aws/userdata/linux.erb +179 -0
  491. data/modules/mu/clouds/aws/userdata/windows.erb +278 -0
  492. data/modules/mu/clouds/aws/vpc.rb +1943 -0
  493. data/modules/mu/clouds/aws.rb +1009 -0
  494. data/modules/mu/clouds/cloudformation/alarm.rb +146 -0
  495. data/modules/mu/clouds/cloudformation/cache_cluster.rb +167 -0
  496. data/modules/mu/clouds/cloudformation/collection.rb +117 -0
  497. data/modules/mu/clouds/cloudformation/database.rb +278 -0
  498. data/modules/mu/clouds/cloudformation/dnszone.rb +274 -0
  499. data/modules/mu/clouds/cloudformation/firewall_rule.rb +308 -0
  500. data/modules/mu/clouds/cloudformation/loadbalancer.rb +193 -0
  501. data/modules/mu/clouds/cloudformation/log.rb +170 -0
  502. data/modules/mu/clouds/cloudformation/server.rb +370 -0
  503. data/modules/mu/clouds/cloudformation/server_pool.rb +279 -0
  504. data/modules/mu/clouds/cloudformation/vpc.rb +322 -0
  505. data/modules/mu/clouds/cloudformation.rb +733 -0
  506. data/modules/mu/clouds/docker.rb +30 -0
  507. data/modules/mu/clouds/google/container_cluster.rb +290 -0
  508. data/modules/mu/clouds/google/database.rb +152 -0
  509. data/modules/mu/clouds/google/firewall_rule.rb +267 -0
  510. data/modules/mu/clouds/google/group.rb +164 -0
  511. data/modules/mu/clouds/google/loadbalancer.rb +479 -0
  512. data/modules/mu/clouds/google/server.rb +1510 -0
  513. data/modules/mu/clouds/google/server_pool.rb +274 -0
  514. data/modules/mu/clouds/google/user.rb +266 -0
  515. data/modules/mu/clouds/google/userdata/README.md +4 -0
  516. data/modules/mu/clouds/google/userdata/linux.erb +137 -0
  517. data/modules/mu/clouds/google/userdata/windows.erb +275 -0
  518. data/modules/mu/clouds/google/vpc.rb +890 -0
  519. data/modules/mu/clouds/google.rb +811 -0
  520. data/modules/mu/config/README.md +11 -0
  521. data/modules/mu/config/alarm.rb +271 -0
  522. data/modules/mu/config/cache_cluster.rb +172 -0
  523. data/modules/mu/config/collection.rb +87 -0
  524. data/modules/mu/config/container_cluster.rb +103 -0
  525. data/modules/mu/config/container_cluster.yml +36 -0
  526. data/modules/mu/config/database.rb +458 -0
  527. data/modules/mu/config/database.yml +26 -0
  528. data/modules/mu/config/dnszone.rb +327 -0
  529. data/modules/mu/config/firewall_rule.rb +118 -0
  530. data/modules/mu/config/folder.rb +70 -0
  531. data/modules/mu/config/function.rb +140 -0
  532. data/modules/mu/config/group.rb +64 -0
  533. data/modules/mu/config/loadbalancer.rb +482 -0
  534. data/modules/mu/config/log.rb +47 -0
  535. data/modules/mu/config/log.yml +6 -0
  536. data/modules/mu/config/msg_queue.rb +47 -0
  537. data/modules/mu/config/msg_queue.yml +9 -0
  538. data/modules/mu/config/notification.rb +44 -0
  539. data/modules/mu/config/project.rb +71 -0
  540. data/modules/mu/config/role.rb +102 -0
  541. data/modules/mu/config/search_domain.rb +61 -0
  542. data/modules/mu/config/search_domain.yml +25 -0
  543. data/modules/mu/config/server.rb +587 -0
  544. data/modules/mu/config/server.yml +8 -0
  545. data/modules/mu/config/server_pool.rb +216 -0
  546. data/modules/mu/config/server_pool.yml +71 -0
  547. data/modules/mu/config/storage_pool.rb +145 -0
  548. data/modules/mu/config/user.rb +78 -0
  549. data/modules/mu/config/vpc.rb +743 -0
  550. data/modules/mu/config/vpc.yml +6 -0
  551. data/modules/mu/config.rb +2000 -0
  552. data/modules/mu/defaults/README.md +2 -0
  553. data/modules/mu/defaults/amazon_images.yaml +121 -0
  554. data/modules/mu/defaults/google_images.yaml +16 -0
  555. data/modules/mu/deploy.rb +686 -0
  556. data/modules/mu/groomer.rb +123 -0
  557. data/modules/mu/groomers/README.md +58 -0
  558. data/modules/mu/groomers/chef.rb +1024 -0
  559. data/modules/mu/kittens.rb +11319 -0
  560. data/modules/mu/logger.rb +208 -0
  561. data/modules/mu/master/README.md +27 -0
  562. data/modules/mu/master/chef.rb +471 -0
  563. data/modules/mu/master/ldap.rb +1005 -0
  564. data/modules/mu/master.rb +415 -0
  565. data/modules/mu/mommacat.rb +2703 -0
  566. data/modules/mu-load-config.rb +1 -0
  567. data/modules/mu.rb +724 -0
  568. data/modules/scratchpad.erb +1 -0
  569. data/modules/tests/super_complex_bok.yml +41 -0
  570. data/modules/tests/super_simple_bok.yml +40 -0
  571. data/mu.gemspec +62 -0
  572. data/roles/demo-dbservice-configure.json +19 -0
  573. data/roles/demo-portal-configure.json +19 -0
  574. data/roles/mu-master-jenkins.json +24 -0
  575. data/roles/mu-master-nagios-only.json +13 -0
  576. data/roles/mu-master.json +12 -0
  577. data/roles/mu-node.json +19 -0
  578. data/roles/mu-splunk-server.json +13 -0
  579. data/roles/mu-splunk.json +13 -0
  580. data/test/clean_up.py +25 -0
  581. data/test/demo-test-profile/README.md +3 -0
  582. data/test/demo-test-profile/controls/flask.rb +84 -0
  583. data/test/demo-test-profile/inspec.lock +7 -0
  584. data/test/demo-test-profile/inspec.yml +11 -0
  585. data/test/etco-test-profile/README.md +3 -0
  586. data/test/etco-test-profile/controls/all-in-one.rb +182 -0
  587. data/test/etco-test-profile/inspec.lock +7 -0
  588. data/test/etco-test-profile/inspec.yml +11 -0
  589. data/test/exec_inspec.py +246 -0
  590. data/test/exec_mu_install.py +241 -0
  591. data/test/exec_retry.py +44 -0
  592. data/test/mu-master-test/README.md +3 -0
  593. data/test/mu-master-test/controls/all_in_one.rb +557 -0
  594. data/test/mu-master-test/inspec.lock +3 -0
  595. data/test/mu-master-test/inspec.yml +11 -0
  596. data/test/mu-tools-test/README.md +3 -0
  597. data/test/mu-tools-test/controls/base.rb +265 -0
  598. data/test/mu-tools-test/inspec.lock +3 -0
  599. data/test/mu-tools-test/inspec.yml +8 -0
  600. data/test/simple-server-php-test/README.md +3 -0
  601. data/test/simple-server-php-test/controls/apachephp.rb +25 -0
  602. data/test/simple-server-php-test/controls/example.rb +19 -0
  603. data/test/simple-server-php-test/inspec.lock +7 -0
  604. data/test/simple-server-php-test/inspec.yml +12 -0
  605. data/test/simple-server-rails-test/README.md +3 -0
  606. data/test/simple-server-rails-test/controls/rails.rb +188 -0
  607. data/test/simple-server-rails-test/inspec.lock +7 -0
  608. data/test/simple-server-rails-test/inspec.yml +11 -0
  609. data/test/simple-windows-test/README.md +3 -0
  610. data/test/simple-windows-test/controls/windows.rb +20 -0
  611. data/test/simple-windows-test/inspec.lock +7 -0
  612. data/test/simple-windows-test/inspec.yml +11 -0
  613. data/test/smoke_test.rb +75 -0
  614. data/test/wordpress-test/README.md +3 -0
  615. data/test/wordpress-test/controls/wordpress.rb +97 -0
  616. data/test/wordpress-test/inspec.lock +7 -0
  617. data/test/wordpress-test/inspec.yml +11 -0
  618. metadata +979 -0
@@ -0,0 +1,686 @@
1
+ # Copyright:: Copyright (c) 2014 eGlobalTech, Inc., all rights reserved
2
+ #
3
+ # Licensed under the BSD-3 license (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License in the root of the project or at
6
+ #
7
+ # http://egt-labs.com/mu/LICENSE.html
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require "net/http"
16
+ require "net/smtp"
17
+ require 'json'
18
+ require 'rexml/document'
19
+
20
+ module MU
21
+ # The Deploy class is the main interface for resource creation. It is
22
+ # typically invoked from the *mu-deploy* utility. It consumes a configuration
23
+ # parsed by {MU::Config} and generates cloud artifacts accordingly, ordering
24
+ # them per their dependencies and handing off to OS management tools (e.g.
25
+ # Chef) for application-level orchestration.
26
+ class Deploy
27
+
28
+ Thread.current.thread_variable_set("name", "main_thread");
29
+
30
+ # These also exist as instance variables, but we end up needing versions of
31
+ # them in static contexts too.
32
+ @deploy_semaphore = Mutex.new
33
+
34
+ # The name of the application which we're building.
35
+ attr_reader :appname
36
+
37
+ # The timestamp at which this deployment was begun
38
+ attr_reader :timestamp
39
+
40
+ # The environment into which we're deploying
41
+ attr_reader :environment
42
+
43
+ # The cloud provider's account identifier
44
+ attr_reader :account_number
45
+
46
+ # This flag indicates that cleanup operations should be skipped if a
47
+ # failure occurs.
48
+ attr_reader :nocleanup
49
+
50
+ # We just pass this flag to MommaCat, telling it not to save any metadata.
51
+ attr_reader :no_artifacts
52
+
53
+ # Indicates whether we are updating an existing deployment, as opposed to
54
+ # creating a new one.
55
+ attr_reader :updating
56
+
57
+ # @param environment [String]: The environment name for this application stack (e.g. "dev" or "prod")
58
+ # @param verbosity [Integer]: Debug level for MU.log output
59
+ # @param webify_logs [Boolean]: Toggles web-friendly log output
60
+ # @param nocleanup [Boolean]: Toggles whether to skip cleanup of resources if this deployment fails.
61
+ # @param cloudformation_path [String]: If we're outputting CloudFormation, here's where to put it
62
+ # @param force_cloudformation [Boolean]: Output CloudFormation regardless of what cloud resources target
63
+ # @param reraise_thread [Thread]: Raise any major exceptions to this thread
64
+ # @param stack_conf [Hash]: A full application stack configuration parsed by {MU::Config}
65
+ # @param no_artifacts [Boolean]: Do not save deploy metadata
66
+ # @param deploy_id [String]: Reload and re-process an existing deploy
67
+ def initialize(environment,
68
+ verbosity: MU::Logger::NORMAL,
69
+ webify_logs: false,
70
+ nocleanup: false,
71
+ cloudformation_path: nil,
72
+ force_cloudformation: false,
73
+ reraise_thread: nil,
74
+ stack_conf: nil,
75
+ no_artifacts: false,
76
+ deploy_id: nil,
77
+ deploy_obj: nil)
78
+ MU.setVar("verbosity", verbosity)
79
+ @webify_logs = webify_logs
80
+ @verbosity = verbosity
81
+ @nocleanup = nocleanup
82
+ @no_artifacts = no_artifacts
83
+ @reraise_thread = reraise_thread
84
+ MU.setLogging(verbosity, webify_logs)
85
+
86
+ MU::Cloud::CloudFormation.emitCloudFormation(set: force_cloudformation)
87
+ @cloudformation_output = cloudformation_path
88
+
89
+ if stack_conf.nil? or !stack_conf.is_a?(Hash)
90
+ raise MuError, "Deploy objects require a stack_conf hash"
91
+ end
92
+
93
+ @my_threads = Array.new
94
+ @last_sigterm = 0
95
+ @dependency_threads = {}
96
+ @dependency_semaphore = Mutex.new
97
+
98
+ @main_config = stack_conf
99
+ @original_config = Marshal.load(Marshal.dump(stack_conf))
100
+ @original_config.freeze
101
+ @admins = stack_conf["admins"]
102
+ @mommacat = deploy_obj
103
+
104
+ if deploy_id
105
+ @mommacat ||= MU::MommaCat.new(deploy_id)
106
+ @updating = true
107
+ else
108
+ @environment = environment
109
+ @updating = false
110
+ time=Time.new
111
+ @appname = stack_conf["appname"]
112
+ @timestamp = time.strftime("%Y%m%d%H").to_s;
113
+ @timestamp.freeze
114
+ @timestart = time.to_s;
115
+ @timestart.freeze
116
+
117
+ retries = 0
118
+ begin
119
+ raise MuError, "Failed to allocate an unused MU-ID after #{retries} tries!" if retries > 70
120
+ seedsize = 1 + (retries/10).abs
121
+ seed = (0...seedsize+1).map { ('a'..'z').to_a[rand(26)] }.join
122
+ deploy_id = @appname.upcase + "-" + @environment.upcase + "-" + @timestamp + "-" + seed.upcase
123
+ end while MU::MommaCat.deploy_exists?(deploy_id) or seed == "mu" or seed[0] == seed[1]
124
+ MU.setVar("deploy_id", deploy_id)
125
+ MU.setVar("appname", @appname.upcase)
126
+ MU.setVar("environment", @environment.upcase)
127
+ MU.setVar("timestamp", @timestamp)
128
+ MU.setVar("seed", seed)
129
+ MU.setVar("handle", MU::MommaCat.generateHandle(seed))
130
+
131
+ MU.log "Deployment id: #{MU.appname} \"#{MU.handle}\" (#{MU.deploy_id})"
132
+ end
133
+
134
+ # Instance variables that are effectively class variables
135
+ @my_instance_id = MU::Cloud::AWS.getAWSMetaData("instance-id")
136
+ @my_az = MU::Cloud::AWS.getAWSMetaData("placement/availability-zone")
137
+
138
+ @fromName ='chef-server';
139
+
140
+ MU::Cloud.resource_types.each { |cloudclass, data|
141
+ if !@main_config[data[:cfg_plural]].nil? and @main_config[data[:cfg_plural]].size > 0
142
+ @main_config[data[:cfg_plural]].each { |resource|
143
+ if force_cloudformation
144
+ if resource['cloud'] = "AWS"
145
+ resource['cloud'] = "CloudFormation"
146
+ if resource.has_key?("vpc") and resource["vpc"].is_a?(Hash)
147
+ resource["vpc"]['cloud'] = "CloudFormation"
148
+ elsif resource.has_key?("vpcs") and resource["vpcs"].is_a?(Array)
149
+ resource['vpcs'].each { |v| v['cloud'] = "CloudFormation" }
150
+ end
151
+ end
152
+ end
153
+ }
154
+ shortclass, cfg_name, cfg_plural, classname = MU::Cloud.getResourceNames(data[:cfg_plural])
155
+ @main_config[data[:cfg_plural]].each { |resource|
156
+ resource["#MU_CLOUDCLASS"] = classname
157
+ }
158
+ setThreadDependencies(@main_config[data[:cfg_plural]])
159
+ end
160
+ }
161
+ end
162
+
163
+
164
+ # Activate this deployment, instantiating all resources, orchestrating them,
165
+ # and saving metadata about them.
166
+ def run
167
+ Signal.trap("INT") do
168
+ # Don't use MU.log in here, it does a synchronize {} and that ain't
169
+ # legal inside a trap.
170
+ die = true if (Time.now.to_i - @last_sigterm) < 5
171
+ if !die and !MU::MommaCat.trapSafeLocks.nil? and MU::MommaCat.trapSafeLocks.size > 0
172
+ puts "------------------------------"
173
+ puts "Thread and lock debugging data"
174
+ puts "------------------------------"
175
+ puts "Open flock() locks:"
176
+ pp MU::MommaCat.trapSafeLocks
177
+ puts "------------------------------"
178
+ end
179
+ Thread.list.each do |t|
180
+ next if !t.status # skip threads that've been cleanly terminated
181
+ if !die
182
+ thread_name = t.thread_variable_get("name")
183
+ puts "Thread #{thread_name} (#{t.object_id}): #{t.inspect} #{t.status}"
184
+ t.thread_variables.each { |tvar|
185
+ puts "#{tvar} = #{t.thread_variable_get(tvar)}"
186
+ }
187
+ pp t.backtrace
188
+ if !@dependency_threads[thread_name].nil?
189
+ puts ""
190
+ puts "Waiting on #{@dependency_threads[thread_name]}"
191
+ Thread.list.each { |parent|
192
+ parent_name = parent.thread_variable_get("name")
193
+ if @dependency_threads[thread_name].include?(parent_name)
194
+ puts "\t#{parent_name} (#{parent.object_id}): #{parent.inspect} #{parent.status}"
195
+ parent.thread_variables.each { |tvar|
196
+ puts "\t#{tvar} = #{parent.thread_variable_get(tvar)}"
197
+ }
198
+ end
199
+ }
200
+ end
201
+ puts "------------------------------"
202
+ t.run
203
+ end
204
+ end
205
+ if !die
206
+ puts "Received SIGINT, hit ctrl-C again within five seconds to kill this deployment."
207
+ else
208
+ raise "Terminated by user"
209
+ end
210
+ @last_sigterm = Time.now.to_i
211
+ end
212
+
213
+ begin
214
+ if !@mommacat
215
+ metadata = {
216
+ "appname" => @appname,
217
+ "timestamp" => @timestamp,
218
+ "environment" => @environment,
219
+ "seed" => MU.seed,
220
+ "deployment_start_time" => @timestart,
221
+ "chef_user" => MU.chef_user,
222
+ "mu_user" => MU.mu_user
223
+ }
224
+ @mommacat = MU::MommaCat.new(
225
+ MU.deploy_id,
226
+ create: true,
227
+ config: @main_config,
228
+ environment: @environment,
229
+ nocleanup: @nocleanup,
230
+ no_artifacts: @no_artifacts,
231
+ set_context_to_me: true,
232
+ deployment_data: metadata,
233
+ mu_user: MU.mu_user
234
+ )
235
+ MU.setVar("mommacat", @mommacat)
236
+ end
237
+
238
+ @admins.each { |admin|
239
+ @mommacat.notify("admins", admin['name'], admin)
240
+ }
241
+
242
+ @deploy_semaphore = Mutex.new
243
+ parent_thread_id = Thread.current.object_id
244
+ @main_thread = Thread.current
245
+
246
+ # Kick off threads to create each of our new servers.
247
+ @my_threads << Thread.new {
248
+ MU.dupGlobals(parent_thread_id)
249
+ Thread.current.thread_variable_set("name", "mu_create_container")
250
+ Thread.abort_on_exception = true
251
+ MU::Cloud.resource_types.each { |cloudclass, data|
252
+ if !@main_config[data[:cfg_plural]].nil? and
253
+ @main_config[data[:cfg_plural]].size > 0 and
254
+ data[:instance].include?(:create)
255
+ createResources(@main_config[data[:cfg_plural]], "create")
256
+ end
257
+ }
258
+ }
259
+
260
+ # Some resources have a "groom" phase too
261
+ @my_threads << Thread.new {
262
+ MU.dupGlobals(parent_thread_id)
263
+ Thread.current.thread_variable_set("name", "mu_groom_container")
264
+ Thread.abort_on_exception = true
265
+ MU::Cloud.resource_types.each { |cloudclass, data|
266
+ if !@main_config[data[:cfg_plural]].nil? and
267
+ @main_config[data[:cfg_plural]].size > 0 and
268
+ data[:instance].include?(:groom)
269
+ createResources(@main_config[data[:cfg_plural]], "groom")
270
+ end
271
+ }
272
+ }
273
+
274
+ # Poke child threads to make sure they're awake
275
+ @my_threads.each do |t|
276
+ t.run if t.alive?
277
+ end
278
+
279
+ sleep 5
280
+
281
+ # Reap child threads.
282
+ @my_threads.each do |t|
283
+ t.join
284
+ end
285
+
286
+ rescue Exception => e
287
+ @my_threads.each do |t|
288
+ if t.object_id != Thread.current.object_id and t.thread_variable_get("name") != "main_thread" and t.object_id != parent_thread_id
289
+ MU::MommaCat.unlockAll
290
+ t.kill
291
+ end
292
+ end
293
+
294
+ # If it was a regular old exit, we assume something deeper in already
295
+ # handled logging and cleanup for us, and just quietly go away.
296
+ if e.class.to_s != "SystemExit"
297
+ MU.log e.inspect, MU::ERR, details: e.backtrace if @verbosity != MU::Logger::SILENT
298
+ if !@nocleanup
299
+ Thread.list.each do |t|
300
+ if t.object_id != Thread.current.object_id and t.thread_variable_get("name") != "main_thread" and t.object_id != parent_thread_id
301
+ t.kill
302
+ end
303
+ end
304
+ MU::Cleanup.run(MU.deploy_id, skipsnapshots: true, verbosity: @verbosity, mommacat: @mommacat)
305
+ @nocleanup = true # so we don't run this again later
306
+ end
307
+ end
308
+ @reraise_thread.raise MuError, e.inspect, e.backtrace if @reraise_thread
309
+ Thread.current.exit
310
+ ensure
311
+ if @mommacat and @mommacat.numKittens(clouds: ["CloudFormation"]) > 0
312
+ MU::Cloud::CloudFormation.writeCloudFormationTemplate(tails: MU::Config.tails, config: @main_config, path: @cloudformation_output, mommacat: @mommacat)
313
+ # If we didn't build anything besides CloudFormation, purge useless
314
+ # metadata.
315
+ if @mommacat.numKittens(clouds: ["CloudFormation"], negate: true) == 0
316
+ Thread.list.each do |t|
317
+ if t.object_id != Thread.current.object_id and t.thread_variable_get("name") != "main_thread" and t.object_id != parent_thread_id
318
+ t.kill
319
+ end
320
+ end
321
+ MU::Cleanup.run(MU.deploy_id, skipcloud: true, verbosity: MU::Logger::SILENT, mommacat: @mommacat)
322
+ return
323
+ end
324
+ end
325
+ end
326
+ if @mommacat.numKittens(clouds: ["CloudFormation"], negate: true) > 0
327
+ if !@mommacat.deployment['servers'].nil? and @mommacat.deployment['servers'].keys.size > 0
328
+ # XXX some kind of filter (obey sync_siblings on nodes' configs)
329
+ @mommacat.syncLitter(@mommacat.deployment['servers'].keys)
330
+ end
331
+ deployment = @mommacat.deployment
332
+ deployment["deployment_end_time"]=Time.new.strftime("%I:%M %p on %A, %b %d, %Y").to_s;
333
+ if MU.myCloud == "AWS"
334
+ MU::Cloud::AWS.openFirewallForClients # XXX add the other clouds, or abstract
335
+ end
336
+ MU::MommaCat.getLitter(MU.deploy_id, use_cache: false)
337
+ if @mommacat.numKittens(types: ["Server", "ServerPool"]) > 0
338
+ # MU::MommaCat.syncMonitoringConfig # TODO only invoke if Server or ServerPool actually changed something when @updating
339
+ end
340
+ end
341
+
342
+
343
+ # Send notifications
344
+ sendMail
345
+ if @mommacat.numKittens(clouds: ["AWS"]) > 0
346
+ MU.log "Generating cost calculation URL for all Amazon Web Services resources."
347
+ MU.setLogging(MU::Logger::SILENT)
348
+
349
+ @environment ||= "dev"
350
+
351
+ begin
352
+ Thread.abort_on_exception = false
353
+ t = Thread.new {
354
+ Thread.abort_on_exception = true
355
+
356
+ # I do not understand why this is necessary, but here we are.
357
+ Thread.handle_interrupt(MU::Cloud::MuCloudResourceNotImplemented => :never) {
358
+ begin
359
+ Thread.handle_interrupt(MU::Cloud::MuCloudResourceNotImplemented => :immediate) {
360
+ MU.log "Cost calculator not available for this stack, as it uses a resource not implemented in Mu's CloudFormation layer.", MU::WARN, verbosity: MU::Logger::NORMAL
361
+ Thread.current.exit
362
+ }
363
+ ensure
364
+ end
365
+ }
366
+ begin
367
+ MU.setVar("deploy_id", nil) # make sure we won't ever accidentally blow away the parent deploy
368
+ cost_dummy_deploy = MU::Deploy.new(
369
+ @environment.dup,
370
+ verbosity: MU::Logger::SILENT,
371
+ force_cloudformation: true,
372
+ cloudformation_path: "/dev/null",
373
+ nocleanup: false, # make sure we clean up the cost allocation deploy
374
+ stack_conf: @original_config,
375
+ reraise_thread: @main_thread,
376
+ no_artifacts: true
377
+ )
378
+ cost_dummy_deploy.run
379
+ rescue MU::Cloud::MuCloudFlagNotImplemented, MU::Cloud::MuCloudResourceNotImplemented, MU::MuError => e
380
+ # This doesn't seem to get caught and I don't know why and I don't care
381
+ # MU.log "Failed to generate AWS cost-calculation URL. Skipping.", MU::WARN, details: "Deployment uses a feature not available in CloudFormation layer.", verbosity: MU::Logger::NORMAL
382
+ end
383
+ }
384
+
385
+ t.join
386
+ rescue MU::Cloud::MuCloudFlagNotImplemented, MU::Cloud::MuCloudResourceNotImplemented => e
387
+ # already handled in the thread what did it
388
+ MU.log "Failed to generate AWS cost-calculation URL. Skipping.", MU::WARN, details: "Deployment uses a feature not available in CloudFormation layer.", verbosity: MU::Logger::NORMAL
389
+ ensure
390
+ MU.setLogging(@verbosity)
391
+ MU.log "Deployment #{MU.deploy_id} \"#{MU.handle}\" complete", details: deployment, verbosity: @verbosity
392
+ end
393
+ else
394
+ MU.log "Deployment #{MU.deploy_id} \"#{MU.handle}\" complete", details: deployment, verbosity: @verbosity
395
+ end
396
+
397
+
398
+ if MU.summary.size > 0
399
+ MU.summary.each { |msg|
400
+ puts msg
401
+ }
402
+ end
403
+
404
+ if $MU_CFG['slack'] and $MU_CFG['slack']['webhook'] and
405
+ (!$MU_CFG['slack']['skip_environments'] or !$MU_CFG['slack']['skip_environments'].any?{ |s| s.casecmp(MU.environment)==0 })
406
+ require 'slack-notifier'
407
+ slack = Slack::Notifier.new $MU_CFG['slack']['webhook']
408
+
409
+ slack.ping "Mu deployment #{MU.appname} *\"#{MU.handle}\"* (`#{MU.deploy_id}`) successfully completed on *#{$MU_CFG['hostname']}* (#{$MU_CFG['public_address']})", channel: $MU_CFG['slack']['channel']
410
+ if MU.summary.size > 0
411
+ MU.summary.each { |msg|
412
+ slack.ping msg, channel: $MU_CFG['slack']['channel']
413
+ }
414
+ end
415
+ end
416
+
417
+ end
418
+
419
+ private
420
+
421
+ def sendMail()
422
+
423
+ $str = ""
424
+
425
+ if MU.summary.size > 0
426
+ MU.summary.each { |msg|
427
+ $str += msg+"\n"
428
+ }
429
+ end
430
+
431
+ $str += JSON.pretty_generate(@mommacat.deployment)
432
+
433
+ admin_addrs = @admins.map { |admin|
434
+ admin['name']+" <"+admin['email']+">"
435
+ }
436
+
437
+ @admins.each do |data|
438
+
439
+ message = <<MESSAGE_END
440
+ From: #{MU.handle} <#{@fromName}>
441
+ To: #{admin_addrs.join(", ")}>
442
+ MIME-Version: 1.0
443
+ Content-type: text/html
444
+ Subject: Mu deployment #{MU.appname} \"#{MU.handle}\" (#{MU.deploy_id}) successfully completed
445
+
446
+ <br>
447
+ <pre>#{$str}</pre>
448
+ MESSAGE_END
449
+ Net::SMTP.start('localhost') do |smtp|
450
+ smtp.send_message message, @fromName, data["email"]
451
+ end
452
+ end
453
+ end
454
+
455
+
456
+ #########################################################################
457
+ #########################################################################
458
+ def waitOnThreadDependencies(dependent)
459
+ if @dependency_threads[dependent].nil?
460
+ MU.log "I don't see any dependencies for #{dependent}, moving on", MU::DEBUG
461
+ return
462
+ else
463
+ MU.log "#{dependent} checking/waiting for parent threads...", MU::DEBUG, details: @dependency_threads[dependent]
464
+ end
465
+
466
+ retries = 0
467
+ @dependency_threads[dependent].each { |dependent_thread|
468
+ found = false
469
+ @my_threads.each { |parent_thread|
470
+ parent = parent_thread.thread_variable_get("name");
471
+ if parent == dependent_thread
472
+ found = true
473
+ Thread.current.thread_variable_set("waiting_for", parent)
474
+ parent_thread.join
475
+ Thread.current.thread_variable_set("waiting_for", nil)
476
+ MU.log "Thread #{parent} completed, thread #{dependent} proceeding", MU::DEBUG, details: @dependency_threads[dependent]
477
+ end
478
+ }
479
+ # This vile hack brought to you by parent threads spawning after things
480
+ # that depend on them. We're working around the slight race condition
481
+ # that results. If the parent threads never show up, though, we have
482
+ # a more serious problem.
483
+ if !found and retries < 5
484
+ sleep 5
485
+ retries = retries + 1
486
+ redo
487
+ end
488
+ if retries >= 5
489
+ raise MuError, "#{dependent} tried five times but never saw #{dependent_thread} in live thread list...\n"+@my_threads.join("\t\n")
490
+ end
491
+ }
492
+ end
493
+
494
+
495
+ #########################################################################
496
+ # Helper for setThreadDependencies
497
+ #########################################################################
498
+ def addDependentThread(parent, child)
499
+ @dependency_semaphore.synchronize {
500
+ @dependency_threads[child] = Array.new if !@dependency_threads[child]
501
+ @dependency_threads[child] << parent
502
+ MU.log "Thread #{child} will wait on #{parent}", MU::DEBUG, details: @dependency_threads[child]
503
+ }
504
+ end
505
+
506
+ #########################################################################
507
+ # Tell a service's deploy (and optionally, create) thread to wait on its
508
+ # dependent service's create (and optionally, deploy) threads to finish.
509
+ # XXX This nomenclature is unreasonably confusing.
510
+ #########################################################################
511
+ def setThreadDependencies(services)
512
+ if services.nil? or services.size < 1
513
+ # MU.log "Got nil service list in setThreadDependencies for called from #{caller_locations(1,1)[0].label}", MU::DEBUG
514
+ return
515
+ end
516
+
517
+ services.each { |resource|
518
+ if !resource["#MU_CLOUDCLASS"]
519
+ pp resource
520
+ end
521
+ res_type = resource["#MU_CLOUDCLASS"].cfg_name
522
+ name = res_type+"_"+resource["name"]
523
+
524
+ # All resources wait to "groom" until after their own "create" thread
525
+ # finishes, and also on the main thread which spawns them (so all
526
+ # siblings will exist for dependency checking before we start).
527
+ @dependency_threads["#{name}_create"]=["mu_create_container"]
528
+ @dependency_threads["#{name}_groom"]=["#{name}_create", "mu_groom_container"]
529
+
530
+ MU.log "Setting dependencies for #{name}", MU::DEBUG, details: resource["dependencies"]
531
+ if resource["dependencies"] != nil then
532
+ resource["dependencies"].each { |dependency|
533
+ parent_class = nil
534
+ MU::Cloud.resource_types.each_pair { |name, attrs|
535
+ if attrs[:cfg_name] == dependency['type']
536
+ parent_class = Object.const_get("MU").const_get("Cloud").const_get(name)
537
+ break
538
+ end
539
+ }
540
+
541
+ parent_type = parent_class.cfg_name
542
+
543
+ # our groom thread will always need to wait on our parent's create
544
+ parent = parent_type+"_"+dependency["name"]+"_create"
545
+ addDependentThread(parent, "#{name}_groom")
546
+
547
+ # should our creation thread also wait on our parent's create?
548
+ if !resource["no_create_wait"] and
549
+ (resource["#MU_CLOUDCLASS"].waits_on_parent_completion or
550
+ dependency['phase'] == "create" or
551
+ (parent_class.deps_wait_on_my_creation and parent_type != res_type))
552
+ addDependentThread(parent, "#{name}_create")
553
+ end
554
+
555
+
556
+ # how about our groom thread waiting on our parents' grooms?
557
+ if (dependency['phase'] == "groom" or resource["#MU_CLOUDCLASS"].waits_on_parent_completion) and parent_class.instance_methods(false).include?(:groom)
558
+ parent = parent_type+"_"+dependency["name"]+"_groom"
559
+ addDependentThread(parent, "#{name}_groom")
560
+ if (parent_class.deps_wait_on_my_creation and parent_type != res_type) or resource["#MU_CLOUDCLASS"].waits_on_parent_completion or dependency['phase'] == "groom"
561
+ addDependentThread(parent, "#{name}_create")
562
+ end
563
+ end
564
+ }
565
+ end
566
+ }
567
+ end
568
+
569
+ #########################################################################
570
+ # Kick off a thread to create a resource.
571
+ #########################################################################
572
+ def createResources(services, mode="create")
573
+ return if services.nil?
574
+
575
+ parent_thread_id = Thread.current.object_id
576
+ parent_thread = Thread.current
577
+ services.uniq!
578
+ services.each do |service|
579
+ @my_threads << Thread.new(service) { |myservice|
580
+ MU.dupGlobals(parent_thread_id)
581
+ threadname = service["#MU_CLOUDCLASS"].cfg_name+"_"+myservice["name"]+"_#{mode}"
582
+ Thread.current.thread_variable_set("name", threadname)
583
+ Thread.abort_on_exception = true
584
+ waitOnThreadDependencies(threadname)
585
+
586
+ if service["#MU_CLOUDCLASS"].instance_methods(false).include?(:groom) and !service['dependencies'].nil? and !service['dependencies'].size == 0
587
+ if mode == "create"
588
+ MU::MommaCat.lock(service["#MU_CLOUDCLASS"].cfg_name+"_"+myservice["name"]+"-dependencies")
589
+ elsif mode == "groom"
590
+ MU::MommaCat.unlock(service["#MU_CLOUDCLASS"].cfg_name+"_"+myservice["name"]+"-dependencies")
591
+ end
592
+ end
593
+
594
+ MU.log "Launching thread #{threadname}", MU::DEBUG
595
+ begin
596
+ if service['#MUOBJECT'].nil?
597
+ service['#MUOBJECT'] = service["#MU_CLOUDCLASS"].new(mommacat: @mommacat, kitten_cfg: myservice, delayed_save: @updating)
598
+ end
599
+ rescue Exception => e
600
+ MU::MommaCat.unlockAll
601
+ @main_thread.raise MuError, "Error instantiating object from #{service["#MU_CLOUDCLASS"]} (#{e.inspect})", e.backtrace
602
+ raise e
603
+ end
604
+ begin
605
+ run_this_method = service['#MUOBJECT'].method(mode)
606
+ rescue Exception => e
607
+ MU::MommaCat.unlockAll
608
+ @main_thread.raise MuError, "Error invoking #{service["#MU_CLOUDCLASS"]}.#{mode} for #{myservice['name']} (#{e.inspect})", e.backtrace
609
+ raise e
610
+ end
611
+ begin
612
+ MU.log "Checking whether to run #{service['#MUOBJECT']}.#{mode} (updating: #{@updating})", MU::DEBUG
613
+ if !@updating or mode != "create"
614
+ myservice = run_this_method.call
615
+ else
616
+
617
+ # XXX experimental create behavior for --liveupdate flag, only works on a couple of resource types. Inserting new resources into an old deploy is tricky.
618
+ opts = {}
619
+ if service["#MU_CLOUDCLASS"].cfg_name == "loadbalancer"
620
+ opts['classic'] = service['classic'] ? true : false
621
+ end
622
+
623
+ found = MU::MommaCat.findStray(service['cloud'],
624
+ service["#MU_CLOUDCLASS"].cfg_name,
625
+ name: service['name'],
626
+ region: service['region'],
627
+ deploy_id: @mommacat.deploy_id,
628
+ # allow_multi: service["#MU_CLOUDCLASS"].has_multiple,
629
+ tag_key: "MU-ID",
630
+ tag_value: @mommacat.deploy_id,
631
+ flags: opts,
632
+ dummy_ok: false
633
+ )
634
+
635
+ found = found.delete_if { |x|
636
+ x.cloud_id.nil? and x.cloudobj.cloud_id.nil?
637
+ }
638
+
639
+ if found.size == 0
640
+ if service["#MU_CLOUDCLASS"].cfg_name == "loadbalancer" or
641
+ service["#MU_CLOUDCLASS"].cfg_name == "firewall_rule" or
642
+ service["#MU_CLOUDCLASS"].cfg_name == "msg_queue" or
643
+ service["#MU_CLOUDCLASS"].cfg_name == "server_pool" or
644
+ service["#MU_CLOUDCLASS"].cfg_name == "container_cluster"
645
+ # XXX only know LBs to be safe, atm
646
+ MU.log "#{service["#MU_CLOUDCLASS"].name} #{service['name']} not found, creating", MU::NOTICE
647
+ myservice = run_this_method.call
648
+ end
649
+ else
650
+ real_descriptor = @mommacat.findLitterMate(type: service["#MU_CLOUDCLASS"].cfg_name, name: service['name'], created_only: true)
651
+
652
+ if !real_descriptor and (
653
+ service["#MU_CLOUDCLASS"].cfg_name == "loadbalancer" or
654
+ service["#MU_CLOUDCLASS"].cfg_name == "firewall_rule" or
655
+ service["#MU_CLOUDCLASS"].cfg_name == "msg_queue" or
656
+ service["#MU_CLOUDCLASS"].cfg_name == "server_pool" or
657
+ service["#MU_CLOUDCLASS"].cfg_name == "container_cluster"
658
+ )
659
+ MU.log "Invoking #{run_this_method.to_s} #{service['name']} #{service['name']}", MU::NOTICE
660
+ myservice = run_this_method.call
661
+ end
662
+ #MU.log "#{service["#MU_CLOUDCLASS"].cfg_name} #{service['name']}", MU::NOTICE
663
+ end
664
+
665
+ end
666
+ rescue Exception => e
667
+ MU.log e.inspect, MU::ERR, details: e.backtrace if @verbosity != MU::Logger::SILENT
668
+ MU::MommaCat.unlockAll
669
+ Thread.list.each do |t|
670
+ if t.object_id != Thread.current.object_id and t.thread_variable_get("name") != "main_thread" and t.object_id != parent_thread_id
671
+ t.kill
672
+ end
673
+ end
674
+ if !@nocleanup
675
+ MU::Cleanup.run(MU.deploy_id, verbosity: @verbosity, skipsnapshots: true)
676
+ @nocleanup = true # so we don't run this again later
677
+ end
678
+ @main_thread.raise MuError, e.message, e.backtrace
679
+ end
680
+ MU.purgeGlobals
681
+ }
682
+ end
683
+ end
684
+
685
+ end #class
686
+ end #module