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
data/modules/mu.rb ADDED
@@ -0,0 +1,724 @@
1
+ #
2
+ # Licensed under the BSD-3 license (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License in the root of the project or at
5
+ #
6
+ # http://egt-labs.com/mu/LICENSE.html
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+
14
+ require 'rubygems'
15
+ require 'bundler/setup'
16
+ require 'yaml'
17
+ require 'socket'
18
+ require 'net/http'
19
+ gem 'aws-sdk-core'
20
+ autoload :Aws, "aws-sdk-core"
21
+ gem 'nokogiri'
22
+ autoload :Nokogiri, "nokogiri"
23
+ gem 'simple-password-gen'
24
+ autoload :Password, "simple-password-gen"
25
+ autoload :Resolv, 'resolv'
26
+ gem 'netaddr'
27
+ autoload :NetAddr, 'netaddr'
28
+
29
+ # weird magic (possibly unnecessary)
30
+ class Object
31
+ # weird magic (possibly unnecessary)
32
+ def metaclass
33
+ class << self;
34
+ self;
35
+ end
36
+ end
37
+ end
38
+
39
+ ENV['HOME'] = Etc.getpwuid(Process.uid).dir
40
+
41
+ require 'mu/logger'
42
+ module MU
43
+
44
+ # Wrapper class for fatal Exceptions. Gives our internals something to
45
+ # inherit that will log an error message appropriately before bubbling up.
46
+ class MuError < StandardError
47
+ def initialize(message = nil)
48
+ MU.log message, MU::ERR if !message.nil?
49
+ if MU.verbosity == MU::Logger::SILENT
50
+ super
51
+ else
52
+ super ""
53
+ end
54
+ end
55
+ end
56
+
57
+ # Wrapper class for temporary Exceptions. Gives our internals something to
58
+ # inherit that will log a notice message appropriately before bubbling up.
59
+ class MuNonFatal < StandardError
60
+ def initialize(message = nil)
61
+ MU.log message, MU::NOTICE if !message.nil?
62
+ if MU.verbosity == MU::Logger::SILENT
63
+ super
64
+ else
65
+ super ""
66
+ end
67
+ end
68
+ end
69
+
70
+ if !ENV.has_key?("MU_LIBDIR") and ENV.has_key?("MU_INSTALLDIR")
71
+ ENV['MU_LIBDIR'] = ENV['MU_INSTALLDIR']+"/lib"
72
+ else
73
+ ENV['MU_LIBDIR'] = File.realpath(File.expand_path(File.dirname(__FILE__))+"/../")
74
+ end
75
+ # Mu's installation directory.
76
+ @@myRoot = File.expand_path(ENV['MU_LIBDIR'])
77
+ # Mu's installation directory.
78
+ # @return [String]
79
+ def self.myRoot;
80
+ @@myRoot
81
+ end
82
+
83
+
84
+ # The main (root) Mu user's data directory.
85
+ @@mainDataDir = File.expand_path(@@myRoot+"/../var")
86
+ # The main (root) Mu user's data directory.
87
+ # @return [String]
88
+ def self.mainDataDir;
89
+ @@mainDataDir
90
+ end
91
+
92
+ # The Mu config directory
93
+ @@etcDir = File.expand_path(@@myRoot+"/../etc")
94
+ # The Mu config directory
95
+ # @return [String]
96
+ def self.etcDir;
97
+ @@etcDir
98
+ end
99
+
100
+ # The Mu install directory
101
+ @@installDir = File.expand_path(@@myRoot+"/..")
102
+ # The Mu install directory
103
+ # @return [String]
104
+ def self.installDir;
105
+ @@installDir
106
+ end
107
+
108
+ # Mu's main metadata directory (also the deployment metadata for the 'mu'
109
+ @@globals = Hash.new
110
+ @@globals[Thread.current.object_id] = Hash.new
111
+ # Rig us up to share some global class variables (as MU.var_name).
112
+ # These values are PER-THREAD, so that things like Momma Cat can be more or
113
+ # less thread-safe with global values.
114
+ def self.globals;
115
+ @@globals
116
+ end
117
+
118
+ @@global_var_semaphore = Mutex.new
119
+
120
+ # Set one of our global per-thread variables.
121
+ def self.setVar(name, value)
122
+ @@global_var_semaphore.synchronize {
123
+ @@globals[Thread.current.object_id] ||= Hash.new
124
+ @@globals[Thread.current.object_id][name] ||= Hash.new
125
+ @@globals[Thread.current.object_id][name] = value
126
+ }
127
+ end
128
+
129
+ # Copy the set of global variables in use by another thread, typically our
130
+ # parent thread.
131
+ def self.dupGlobals(parent_thread_id)
132
+ @@globals[parent_thread_id].each_pair { |name, value|
133
+ setVar(name, value)
134
+ }
135
+ end
136
+
137
+ # Expunge all global variables.
138
+ def self.purgeGlobals
139
+ @@globals.delete(Thread.current.object_id)
140
+ end
141
+
142
+ # Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.
143
+ def self.mommacat;
144
+ @@globals[Thread.current.object_id]['mommacat']
145
+ end
146
+
147
+ # Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.
148
+ def self.deploy_id;
149
+ @@globals[Thread.current.object_id]['deploy_id']
150
+ end
151
+
152
+ # Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.
153
+ def self.appname;
154
+ @@globals[Thread.current.object_id]['appname']
155
+ end
156
+
157
+ # Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.
158
+ def self.environment;
159
+ @@globals[Thread.current.object_id]['environment']
160
+ end
161
+
162
+ # Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.
163
+ def self.timestamp;
164
+ @@globals[Thread.current.object_id]['timestamp']
165
+ end
166
+
167
+ # Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.
168
+ def self.seed;
169
+ @@globals[Thread.current.object_id]['seed']
170
+ end
171
+
172
+ # Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.
173
+ def self.handle;
174
+ @@globals[Thread.current.object_id]['handle']
175
+ end
176
+
177
+ # Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.
178
+ def self.chef_user;
179
+ if @@globals.has_key?(Thread.current.object_id) and @@globals[Thread.current.object_id].has_key?('chef_user')
180
+ @@globals[Thread.current.object_id]['chef_user']
181
+ elsif Etc.getpwuid(Process.uid).name == "root"
182
+ return "mu"
183
+ else
184
+ return Etc.getpwuid(Process.uid).name
185
+ end
186
+ end
187
+
188
+ # Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.
189
+ def self.mu_user
190
+ if @@globals.has_key?(Thread.current.object_id) and @@globals[Thread.current.object_id].has_key?('mu_user')
191
+ return @@globals[Thread.current.object_id]['mu_user']
192
+ elsif Etc.getpwuid(Process.uid).name == "root"
193
+ return "mu"
194
+ else
195
+ return Etc.getpwuid(Process.uid).name
196
+ end
197
+ end
198
+
199
+ # Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.
200
+ def self.curRegion
201
+ @@globals[Thread.current.object_id]['curRegion'] ||= myRegion || ENV['EC2_REGION']
202
+ end
203
+
204
+ # Accessor for per-thread global variable. There is probably a Ruby-clever way to define this.
205
+ def self.syncLitterThread;
206
+ @@globals[Thread.current.object_id]['syncLitterThread']
207
+ end
208
+
209
+ # Mu's deployment metadata directory.
210
+ @myDataDir = File.expand_path(ENV['MU_DATADIR']) if ENV.has_key?("MU_DATADIR")
211
+ @myDataDir = @@mainDataDir if @myDataDir.nil?
212
+ # Mu's deployment metadata directory.
213
+ def self.dataDir
214
+ if MU.mu_user.nil? or MU.mu_user.empty? or MU.mu_user == "mu" or MU.mu_user == "root"
215
+ return @myDataDir
216
+ else
217
+ return Etc.getpwnam(MU.mu_user).dir+"/.mu/var"
218
+ end
219
+ end
220
+
221
+ # The verbose logging flag merits a default value.
222
+ def self.verbosity
223
+ if @@globals[Thread.current.object_id].nil? or @@globals[Thread.current.object_id]['verbosity'].nil?
224
+ MU.setVar("verbosity", MU::Logger::NORMAL)
225
+ end
226
+ @@globals[Thread.current.object_id]['verbosity']
227
+ end
228
+
229
+ # Set parameters parameters for calls to {MU#log}
230
+ def self.setLogging(verbosity, webify_logs = false, handle = STDOUT)
231
+ MU.setVar("verbosity", verbosity)
232
+ @@logger ||= MU::Logger.new(verbosity, webify_logs, handle)
233
+ @@logger.html = webify_logs
234
+ @@logger.verbosity = verbosity
235
+ @@logger.handle = handle
236
+ end
237
+
238
+ setLogging(MU::Logger::NORMAL, false)
239
+
240
+ # Shortcut to get SUMMARY messages from the global MU::Logger instance
241
+ # @return [Array<String>]
242
+ def self.summary
243
+ @@logger.summary
244
+ end
245
+
246
+ # Shortcut to invoke {MU::Logger#log}
247
+ def self.log(msg, level = MU::INFO, details: nil, html: html = false, verbosity: MU.verbosity)
248
+ return if (level == MU::DEBUG and verbosity <= MU::Logger::LOUD)
249
+ return if verbosity == MU::Logger::SILENT
250
+
251
+ if (level == MU::ERR or
252
+ level == MU::WARN or
253
+ level == MU::DEBUG or
254
+ verbosity >= MU::Logger::LOUD or
255
+ (level == MU::NOTICE and !details.nil?)
256
+ )
257
+ # TODO add more stuff to details here (e.g. call stack)
258
+ extra = nil
259
+ if Thread.current.thread_variable_get("name") and (level > MU::NOTICE or verbosity >= MU::Logger::LOUD)
260
+ extra = Hash.new
261
+ extra = {
262
+ :thread => Thread.current.object_id,
263
+ :name => Thread.current.thread_variable_get("name")
264
+ }
265
+ end
266
+ if !details.nil?
267
+ extra = Hash.new if extra.nil?
268
+ extra[:details] = details
269
+ end
270
+ @@logger.log(msg, level, details: extra, verbosity: MU::Logger::LOUD, html: html)
271
+ else
272
+ @@logger.log(msg, level, html: html, verbosity: verbosity)
273
+ end
274
+ end
275
+
276
+ # For log entries that should only be logged when we're in verbose mode
277
+ DEBUG = 0.freeze
278
+ # For ordinary log entries
279
+ INFO = 1.freeze
280
+ # For more interesting log entries which are not errors
281
+ NOTICE = 2.freeze
282
+ # Log entries for non-fatal errors
283
+ WARN = 3.freeze
284
+ # Log entries for non-fatal errors
285
+ WARNING = 3.freeze
286
+ # Log entries for fatal errors
287
+ ERR = 4.freeze
288
+ # Log entries for fatal errors
289
+ ERROR = 4.freeze
290
+ # Log entries that will be held and displayed/emailed at the end of deploy,
291
+ # cleanup, etc.
292
+ SUMMARY = 5.freeze
293
+
294
+
295
+ autoload :Cleanup, 'mu/cleanup'
296
+ autoload :Deploy, 'mu/deploy'
297
+ autoload :MommaCat, 'mu/mommacat'
298
+ autoload :Master, 'mu/master'
299
+ require 'mu/cloud'
300
+ require 'mu/groomer'
301
+
302
+ # Little hack to initialize library-only environments' config files
303
+ if !$MU_CFG
304
+ require "#{@@myRoot}/bin/mu-load-config.rb"
305
+
306
+ if !$MU_CFG['auto_detection_done'] and (!$MU_CFG['multiuser'] or !cfgExists?)
307
+ MU.log "Auto-detecting cloud providers"
308
+ new_cfg = $MU_CFG.dup
309
+ examples = {}
310
+ MU::Cloud.supportedClouds.each { |cloud|
311
+ cloudclass = Object.const_get("MU").const_get("Cloud").const_get(cloud)
312
+ begin
313
+ if cloudclass.hosted? and !$MU_CFG[cloud.downcase]
314
+ cfg_blob = cloudclass.hosted_config
315
+ if cfg_blob
316
+ new_cfg[cloud.downcase] = cfg_blob
317
+ MU.log "Adding #{cloud} stanza to #{cfgPath}", MU::NOTICE
318
+ end
319
+ elsif !$MU_CFG[cloud.downcase] and !cloudclass.config_example.nil?
320
+ examples[cloud.downcase] = cloudclass.config_example
321
+ end
322
+ rescue NoMethodError => e
323
+ # missing .hosted? is normal for dummy layers like CloudFormation
324
+ MU.log e.message, MU::WARN
325
+ end
326
+ }
327
+ new_cfg['auto_detection_done'] = true
328
+ if new_cfg != $MU_CFG or !cfgExists?
329
+ MU.log "Generating #{cfgPath}"
330
+ saveMuConfig(new_cfg, examples) # XXX and reload it
331
+ end
332
+ end
333
+ end
334
+
335
+ @@my_private_ip = nil
336
+ @@my_public_ip = nil
337
+ @@mu_public_addr = nil
338
+ @@mu_public_ip = nil
339
+ if $MU_CFG['aws'] # XXX this should be abstracted to elsewhere
340
+ @@my_private_ip = MU::Cloud::AWS.getAWSMetaData("local-ipv4")
341
+ @@my_public_ip = MU::Cloud::AWS.getAWSMetaData("public-ipv4")
342
+ @@mu_public_addr = @@my_public_ip
343
+ @@mu_public_ip = @@my_public_ip
344
+ end
345
+ if !$MU_CFG.nil? and !$MU_CFG['public_address'].nil? and !$MU_CFG['public_address'].empty? and @@my_public_ip != $MU_CFG['public_address']
346
+ @@mu_public_addr = $MU_CFG['public_address']
347
+ if !@@mu_public_addr.match(/^\d+\.\d+\.\d+\.\d+$/)
348
+ resolver = Resolv::DNS.new
349
+ @@mu_public_ip = resolver.getaddress(@@mu_public_addr).to_s
350
+ else
351
+ @@mu_public_ip = @@mu_public_addr
352
+ end
353
+ elsif !@@my_public_ip.nil? and !@@my_public_ip.empty?
354
+ @@mu_public_addr = @@my_public_ip
355
+ @@mu_public_ip = @@my_public_ip
356
+ else
357
+ @@mu_public_addr = @@my_private_ip
358
+ @@mu_public_ip = @@my_private_ip
359
+ end
360
+
361
+ # This machine's private IP address
362
+ def self.my_private_ip;
363
+ @@my_private_ip
364
+ end
365
+
366
+ # This machine's public IP address
367
+ def self.my_public_ip;
368
+ @@my_public_ip
369
+ end
370
+
371
+ # Public Mu server name, not necessarily the same as MU.my_public_ip (an be a proxy, load balancer, etc)
372
+ def self.mu_public_ip;
373
+ @@mu_public_ip
374
+ end
375
+
376
+ # Public Mu server IP address, not necessarily the same as MU.my_public_ip (an be a proxy, load balancer, etc)
377
+ def self.mu_public_addr;
378
+ @@mu_public_addr
379
+ end
380
+
381
+
382
+ mu_user = Etc.getpwuid(Process.uid).name
383
+ chef_user = Etc.getpwuid(Process.uid).name.gsub(/\./, "")
384
+ chef_user = "mu" if chef_user == "root"
385
+
386
+ MU.setVar("chef_user", chef_user)
387
+ MU.setVar("mu_user", mu_user)
388
+
389
+ @userlist = nil
390
+
391
+ # Fetch the email address of a given Mu user
392
+ def self.userEmail(user = MU.mu_user)
393
+ @userlist ||= MU::Master.listUsers
394
+ user = "mu" if user == "root"
395
+ if Dir.exists?("#{MU.mainDataDir}/users/#{user}")
396
+ return File.read("#{MU.mainDataDir}/users/#{user}/email").chomp
397
+ elsif @userlist.has_key?(user)
398
+ return @userlist[user]['email']
399
+ else
400
+ MU.log "Attempted to load nonexistent user #{user}", MU::ERR
401
+ return nil
402
+ end
403
+ end
404
+
405
+ # Fetch the real-world name of a given Mu user
406
+ def self.userName(user = MU.mu_user)
407
+ @userlist ||= MU::Master.listUsers
408
+ if Dir.exists?("#{MU.mainDataDir}/users/#{user}")
409
+ return File.read("#{MU.mainDataDir}/users/#{user}/realname").chomp
410
+ elsif @userlist.has_key?(user)
411
+ return @userlist[user]['email']
412
+ else
413
+ MU.log "Attempted to load nonexistent user #{user}", MU::ERR
414
+ return nil
415
+ end
416
+ end
417
+
418
+
419
+ # XXX these guys to move into mu/groomer
420
+ # List of known/supported grooming agents (configuration management tools)
421
+ def self.supportedGroomers
422
+ ["Chef"]
423
+ end
424
+
425
+ MU.supportedGroomers.each { |groomer|
426
+ require "mu/groomers/#{groomer.downcase}"
427
+ }
428
+ # @param groomer [String]: The grooming agent to load.
429
+ # @return [Class]: The class object implementing this groomer agent
430
+ def self.loadGroomer(groomer)
431
+ if !File.size?(MU.myRoot+"/modules/mu/groomers/#{groomer.downcase}.rb")
432
+ raise MuError, "Requested to use unsupported grooming agent #{groomer}"
433
+ end
434
+ require "mu/groomers/#{groomer.downcase}"
435
+ return Object.const_get("MU").const_get("Groomer").const_get(groomer)
436
+ end
437
+
438
+ @@myRegion_var = nil
439
+ # Find the cloud provider region where this master resides, if any
440
+ def self.myRegion
441
+ if MU::Cloud::Google.hosted?
442
+ zone = MU::Cloud::Google.getGoogleMetaData("instance/zone")
443
+ @@myRegion_var = zone.gsub(/^.*?\/|\-\d+$/, "")
444
+ elsif MU::Cloud::AWS.hosted?
445
+ @@myRegion_var ||= MU::Cloud::AWS.myRegion
446
+ else
447
+ @@myRegion_var = nil
448
+ end
449
+ @@myRegion_var
450
+ end
451
+
452
+ require 'mu/config'
453
+
454
+ # Figure out what cloud provider we're in, if any.
455
+ # @return [String]: Google, AWS, etc. Returns nil if we don't seem to be in a cloud.
456
+ def self.myCloud
457
+ if MU::Cloud::Google.hosted?
458
+ @@myInstanceId = MU::Cloud::Google.getGoogleMetaData("instance/name")
459
+ return "Google"
460
+ elsif MU::Cloud::AWS.hosted?
461
+ @@myInstanceId = MU::Cloud::AWS.getAWSMetaData("instance-id")
462
+ return "AWS"
463
+ end
464
+ nil
465
+ end
466
+
467
+ # Wrapper for {MU::Cloud::AWS.account_number}
468
+ def self.account_number
469
+ if !@@globals[Thread.current.object_id].nil? and
470
+ !@@globals[Thread.current.object_id]['account_number'].nil?
471
+ return @@globals[Thread.current.object_id]['account_number']
472
+ end
473
+ @@globals[Thread.current.object_id] ||= {}
474
+ @@globals[Thread.current.object_id]['account_number'] = MU::Cloud::AWS.account_number
475
+ @@globals[Thread.current.object_id]['account_number']
476
+ end
477
+
478
+ # The cloud instance identifier of this Mu master
479
+ def self.myInstanceId
480
+ return nil if MU.myCloud.nil?
481
+ @@myInstanceId # MU.myCloud will have set this, since it's our test variable
482
+ end
483
+
484
+ # If our Mu master is hosted in a cloud provider, we can use this to get its
485
+ # cloud API descriptor.
486
+ def self.myCloudDescriptor;
487
+ @@myCloudDescriptor
488
+ end
489
+
490
+ @@myAZ_var = nil
491
+ # Find the cloud provider availability zone where this master resides, if any
492
+ def self.myAZ
493
+ if MU::Cloud::Google.hosted?
494
+ zone = MU::Cloud::Google.getGoogleMetaData("instance/zone")
495
+ @@myAZ_var = zone.gsub(/.*?\//, "")
496
+ elsif MU::Cloud::AWS.hosted?
497
+ return nil if MU.myCloudDescriptor.nil?
498
+ begin
499
+ @@myAZ_var ||= MU.myCloudDescriptor.placement.availability_zone
500
+ rescue Aws::EC2::Errors::InternalError => e
501
+ MU.log "Got #{e.inspect} on MU::Cloud::AWS.ec2(#{MU.myRegion}).describe_instances(instance_ids: [#{@@myInstanceId}])", MU::WARN
502
+ sleep 10
503
+ end
504
+ end
505
+ @@myAZ_var
506
+ end
507
+
508
+ @@myCloudDescriptor = nil
509
+ if MU::Cloud::Google.hosted?
510
+ @@myCloudDescriptor = MU::Cloud::Google.compute.get_instance(
511
+ MU::Cloud::Google.myProject,
512
+ MU.myAZ,
513
+ MU.myInstanceId
514
+ )
515
+ elsif MU::Cloud::AWS.hosted?
516
+ begin
517
+ @@myCloudDescriptor = MU::Cloud::AWS.ec2(MU.myRegion).describe_instances(instance_ids: [MU.myInstanceId]).reservations.first.instances.first
518
+ rescue Aws::EC2::Errors::InvalidInstanceIDNotFound => e
519
+ rescue Aws::Errors::MissingCredentialsError => e
520
+ MU.log "I'm hosted in AWS, but I can't make API calls. Does this instance have an appropriate IAM profile?", MU::WARN
521
+ end
522
+ end
523
+
524
+
525
+ @@myVPC_var = nil
526
+ # The VPC/Network in which this Mu master resides
527
+ # XXX account for Google and non-cloud situations
528
+ def self.myVPC
529
+ return nil if MU.myCloudDescriptor.nil?
530
+ begin
531
+ if MU::Cloud::AWS.hosted?
532
+ @@myVPC_var ||= MU.myCloudDescriptor.vpc_id
533
+ elsif MU::Cloud::Google.hosted?
534
+ @@myVPC_var = MU.myCloudDescriptor.network_interfaces.first.network.gsub(/.*?\/([^\/]+)$/, '\1')
535
+ else
536
+ nil
537
+ end
538
+ rescue Aws::EC2::Errors::InternalError => e
539
+ MU.log "Got #{e.inspect} on MU::Cloud::AWS.ec2(#{MU.myRegion}).describe_instances(instance_ids: [#{@@myInstanceId}])", MU::WARN
540
+ sleep 10
541
+ end
542
+ @@myVPC_var
543
+ end
544
+
545
+ @@mySubnets_var = nil
546
+ # The AWS Subnets associated with the VPC this MU Master is in
547
+ # XXX account for Google and non-cloud situations
548
+ def self.mySubnets
549
+ @@mySubnets_var ||= MU::Cloud::AWS.ec2(MU.myRegion).describe_subnets(
550
+ filters: [
551
+ {
552
+ name: "vpc-id",
553
+ values: [MU.myVPC]
554
+ }
555
+ ]
556
+ ).subnets
557
+ end
558
+
559
+ # The version of Chef we will install on nodes.
560
+ @@chefVersion = "14.0.190"
561
+ # The version of Chef we will install on nodes.
562
+ # @return [String]
563
+ def self.chefVersion;
564
+ @@chefVersion
565
+ end
566
+
567
+ # Mu's SSL certificate directory
568
+ @@mySSLDir = MU.dataDir+"/ssl" if MU.dataDir
569
+ @@mySSLDir ||= File.realpath(File.expand_path(File.dirname(__FILE__))+"/../var/ssl")
570
+ # Mu's SSL certificate directory
571
+ # @return [String]
572
+ def self.mySSLDir
573
+ @@mySSLDir
574
+ end
575
+
576
+ # Recursively compare two hashes. Intended to see when cloud API descriptions
577
+ # of existing resources differ from proposed changes so we know when to
578
+ # bother updating.
579
+ # @param hash1 [Hash]: The first hash
580
+ # @param hash2 [Hash]: The second hash
581
+ # @param missing_is_default [Boolean]: Assume that any element missing from hash2 but present in hash1 is a default value to be ignored
582
+ # @return [Boolean]
583
+ def self.hashCmp(hash1, hash2, missing_is_default: false)
584
+ return false if hash1.nil?
585
+ hash2.each_pair { |k, v|
586
+ if hash1[k].nil?
587
+ return false
588
+ end
589
+ }
590
+ if !missing_is_default
591
+ hash1.each_pair { |k, v|
592
+ if hash2[k].nil?
593
+ return false
594
+ end
595
+ }
596
+ end
597
+
598
+ hash1.each_pair { |k, v|
599
+ if hash1[k].is_a?(Array)
600
+ return false if !missing_is_default and hash2[k].nil?
601
+ if !hash2[k].nil?
602
+ hash2[k].each { |item|
603
+ if !hash1[k].include?(item)
604
+ return false
605
+ end
606
+ }
607
+ end
608
+ elsif hash1[k].is_a?(Hash) and !hash2[k].nil?
609
+ result = hashCmp(hash1[k], hash2[k], missing_is_default: missing_is_default)
610
+ return false if !result
611
+ else
612
+ if missing_is_default
613
+ return false if !hash2[k].nil? and hash1[k] != hash2[k]
614
+ else
615
+ return false if hash1[k] != hash2[k]
616
+ end
617
+ end
618
+ }
619
+ true
620
+ end
621
+
622
+ # Recursively turn a Ruby OpenStruct into a Hash
623
+ # @param struct [OpenStruct]
624
+ # @return [Hash]
625
+ def self.structToHash(struct)
626
+ google_struct = false
627
+ begin
628
+ google_struct = struct.class.ancestors.include?(::Google::Apis::Core::Hashable)
629
+ rescue NameError
630
+ end
631
+
632
+ aws_struct = false
633
+ begin
634
+ aws_struct = struct.class.ancestors.include?(::Seahorse::Client::Response)
635
+ rescue NameError
636
+ end
637
+
638
+ if struct.is_a?(Struct) or struct.class.ancestors.include?(Struct) or
639
+ google_struct or aws_struct
640
+
641
+ hash = struct.to_h
642
+ hash.each_pair { |key, value|
643
+ hash[key] = self.structToHash(value)
644
+ }
645
+ return hash
646
+ elsif struct.is_a?(Hash)
647
+ struct.each_pair { |key, value|
648
+ struct[key] = self.structToHash(value)
649
+ }
650
+ return struct
651
+ elsif struct.is_a?(Array)
652
+ struct.map! { |elt|
653
+ self.structToHash(elt)
654
+ }
655
+ else
656
+ return struct
657
+ end
658
+ end
659
+
660
+ # Generate a random password which will satisfy the complexity requirements of stock Amazon Windows AMIs.
661
+ # return [String]: A password string.
662
+ def self.generateWindowsPassword
663
+ # We have dopey complexity requirements, be stringent here.
664
+ # I'll be nice and not condense this into one elegant-but-unreadable regular expression
665
+ attempts = 0
666
+ safe_metachars = Regexp.escape('~!@#%^&*_-+=`|(){}[]:;<>,.?')
667
+ begin
668
+ if attempts > 25
669
+ MU.log "Failed to generate an adequate Windows password after #{attempts}", MU::ERR
670
+ raise MuError, "Failed to generate an adequate Windows password after #{attempts}"
671
+ end
672
+ winpass = Password.random(14..16)
673
+ attempts += 1
674
+ end while winpass.nil? or !winpass.match(/[A-Z]/) or !winpass.match(/[a-z]/) or !winpass.match(/\d/) or !winpass.match(/[#{safe_metachars}]/) or winpass.match(/[^\w\d#{safe_metachars}]/)
675
+
676
+ MU.log "Generated Windows password after #{attempts} attempts", MU::DEBUG
677
+ return winpass
678
+ end
679
+
680
+
681
+ # Return the name of the S3 Mu log and key bucket for this Mu server.
682
+ # @return [String]
683
+ # XXX account for Google and non-cloud situations
684
+ def self.adminBucketName
685
+ bucketname = $MU_CFG['aws']['log_bucket_name']
686
+ if bucketname.nil? or bucketname.empty?
687
+ bucketname = "Mu_Logs_"+Socket.gethostname+"_"+MU::Cloud::AWS.getAWSMetaData("instance-id")
688
+ end
689
+ return bucketname
690
+ end
691
+
692
+ # Log bucket policy for enabling CloudTrail logging to our log bucket in S3.
693
+ CLOUDTRAIL_BUCKET_POLICY = '{
694
+ "Version": "2012-10-17",
695
+ "Statement": [
696
+ {
697
+ "Sid": "AWSCloudTrailAclCheck20131101",
698
+ "Effect": "Allow",
699
+ "Principal": {
700
+ "AWS": "arn:'+(MU::Cloud::AWS.isGovCloud? ? "aws-us-gov" : "aws")+':iam::<%= MU.account_number %>:root",
701
+ "Service": "cloudtrail.amazonaws.com"
702
+ },
703
+ "Action": "s3:GetBucketAcl",
704
+ "Resource": "arn:'+(MU::Cloud::AWS.isGovCloud? ? "aws-us-gov" : "aws")+':s3:::<%= $bucketname %>"
705
+ },
706
+ {
707
+ "Sid": "AWSCloudTrailWrite20131101",
708
+ "Effect": "Allow",
709
+ "Principal": {
710
+ "AWS": "arn:'+(MU::Cloud::AWS.isGovCloud? ? "aws-us-gov" : "aws")+':iam::<%= MU.account_number %>:root",
711
+ "Service": "cloudtrail.amazonaws.com"
712
+ },
713
+ "Action": "s3:PutObject",
714
+ "Resource": "arn:'+(MU::Cloud::AWS.isGovCloud? ? "aws-us-gov" : "aws")+':s3:::<%= $bucketname %>/AWSLogs/<%= MU.account_number %>/*",
715
+ "Condition": {
716
+ "StringEquals": {
717
+ "s3:x-amz-acl": "bucket-owner-full-control"
718
+ }
719
+ }
720
+ }
721
+ ]
722
+ }'
723
+
724
+ end