cloud-mu 2.1.0beta → 3.0.0beta

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 (291) hide show
  1. checksums.yaml +5 -5
  2. data/Berksfile +4 -5
  3. data/Berksfile.lock +179 -0
  4. data/README.md +1 -6
  5. data/ansible/roles/geerlingguy.firewall/templates/firewall.bash.j2 +0 -0
  6. data/ansible/roles/mu-installer/README.md +33 -0
  7. data/ansible/roles/mu-installer/defaults/main.yml +2 -0
  8. data/ansible/roles/mu-installer/handlers/main.yml +2 -0
  9. data/ansible/roles/mu-installer/meta/main.yml +60 -0
  10. data/ansible/roles/mu-installer/tasks/main.yml +13 -0
  11. data/ansible/roles/mu-installer/tests/inventory +2 -0
  12. data/ansible/roles/mu-installer/tests/test.yml +5 -0
  13. data/ansible/roles/mu-installer/vars/main.yml +2 -0
  14. data/bin/mu-adopt +125 -0
  15. data/bin/mu-aws-setup +4 -4
  16. data/bin/mu-azure-setup +265 -0
  17. data/bin/mu-azure-tests +43 -0
  18. data/bin/mu-cleanup +20 -8
  19. data/bin/mu-configure +224 -98
  20. data/bin/mu-deploy +8 -3
  21. data/bin/mu-gcp-setup +16 -8
  22. data/bin/mu-gen-docs +92 -8
  23. data/bin/mu-load-config.rb +52 -12
  24. data/bin/mu-momma-cat +36 -0
  25. data/bin/mu-node-manage +34 -27
  26. data/bin/mu-self-update +2 -2
  27. data/bin/mu-ssh +12 -8
  28. data/bin/mu-upload-chef-artifacts +11 -4
  29. data/bin/mu-user-manage +3 -0
  30. data/cloud-mu.gemspec +8 -11
  31. data/cookbooks/firewall/libraries/helpers_iptables.rb +2 -2
  32. data/cookbooks/firewall/metadata.json +1 -1
  33. data/cookbooks/firewall/recipes/default.rb +5 -9
  34. data/cookbooks/mu-firewall/attributes/default.rb +2 -0
  35. data/cookbooks/mu-firewall/metadata.rb +1 -1
  36. data/cookbooks/mu-glusterfs/templates/default/mu-gluster-client.erb +0 -0
  37. data/cookbooks/mu-master/Berksfile +2 -2
  38. data/cookbooks/mu-master/files/default/check_mem.pl +0 -0
  39. data/cookbooks/mu-master/files/default/cloudamatic.png +0 -0
  40. data/cookbooks/mu-master/metadata.rb +5 -4
  41. data/cookbooks/mu-master/recipes/389ds.rb +1 -1
  42. data/cookbooks/mu-master/recipes/basepackages.rb +30 -10
  43. data/cookbooks/mu-master/recipes/default.rb +59 -7
  44. data/cookbooks/mu-master/recipes/firewall-holes.rb +1 -1
  45. data/cookbooks/mu-master/recipes/init.rb +65 -47
  46. data/cookbooks/mu-master/recipes/{eks-kubectl.rb → kubectl.rb} +4 -10
  47. data/cookbooks/mu-master/recipes/sssd.rb +2 -1
  48. data/cookbooks/mu-master/recipes/update_nagios_only.rb +6 -6
  49. data/cookbooks/mu-master/templates/default/web_app.conf.erb +2 -2
  50. data/cookbooks/mu-master/templates/mods/ldap.conf.erb +4 -0
  51. data/cookbooks/mu-php54/Berksfile +1 -2
  52. data/cookbooks/mu-php54/metadata.rb +4 -5
  53. data/cookbooks/mu-php54/recipes/default.rb +1 -1
  54. data/cookbooks/mu-splunk/templates/default/splunk-init.erb +0 -0
  55. data/cookbooks/mu-tools/Berksfile +3 -2
  56. data/cookbooks/mu-tools/files/default/Mu_CA.pem +33 -0
  57. data/cookbooks/mu-tools/libraries/helper.rb +20 -8
  58. data/cookbooks/mu-tools/metadata.rb +5 -2
  59. data/cookbooks/mu-tools/recipes/apply_security.rb +2 -3
  60. data/cookbooks/mu-tools/recipes/eks.rb +1 -1
  61. data/cookbooks/mu-tools/recipes/gcloud.rb +5 -30
  62. data/cookbooks/mu-tools/recipes/nagios.rb +1 -1
  63. data/cookbooks/mu-tools/recipes/rsyslog.rb +1 -0
  64. data/cookbooks/mu-tools/recipes/selinux.rb +19 -0
  65. data/cookbooks/mu-tools/recipes/split_var_partitions.rb +0 -1
  66. data/cookbooks/mu-tools/recipes/windows-client.rb +256 -122
  67. data/cookbooks/mu-tools/resources/disk.rb +3 -1
  68. data/cookbooks/mu-tools/templates/amazon/sshd_config.erb +1 -1
  69. data/cookbooks/mu-tools/templates/default/etc_hosts.erb +1 -1
  70. data/cookbooks/mu-tools/templates/default/{kubeconfig.erb → kubeconfig-eks.erb} +0 -0
  71. data/cookbooks/mu-tools/templates/default/kubeconfig-gke.erb +27 -0
  72. data/cookbooks/mu-tools/templates/windows-10/sshd_config.erb +137 -0
  73. data/cookbooks/mu-utility/recipes/nat.rb +4 -0
  74. data/extras/alpha.png +0 -0
  75. data/extras/beta.png +0 -0
  76. data/extras/clean-stock-amis +2 -2
  77. data/extras/generate-stock-images +131 -0
  78. data/extras/git-fix-permissions-hook +0 -0
  79. data/extras/image-generators/AWS/centos6.yaml +17 -0
  80. data/extras/image-generators/{aws → AWS}/centos7-govcloud.yaml +0 -0
  81. data/extras/image-generators/{aws → AWS}/centos7.yaml +0 -0
  82. data/extras/image-generators/{aws → AWS}/rhel7.yaml +0 -0
  83. data/extras/image-generators/{aws → AWS}/win2k12.yaml +0 -0
  84. data/extras/image-generators/{aws → AWS}/win2k16.yaml +0 -0
  85. data/extras/image-generators/{aws → AWS}/windows.yaml +0 -0
  86. data/extras/image-generators/{gcp → Google}/centos6.yaml +1 -0
  87. data/extras/image-generators/Google/centos7.yaml +18 -0
  88. data/extras/python_rpm/build.sh +0 -0
  89. data/extras/release.png +0 -0
  90. data/extras/ruby_rpm/build.sh +0 -0
  91. data/extras/ruby_rpm/muby.spec +1 -1
  92. data/install/README.md +43 -5
  93. data/install/deprecated-bash-library.sh +0 -0
  94. data/install/installer +1 -1
  95. data/install/jenkinskeys.rb +0 -0
  96. data/install/mu-master.yaml +55 -0
  97. data/modules/mommacat.ru +41 -7
  98. data/modules/mu.rb +444 -149
  99. data/modules/mu/adoption.rb +500 -0
  100. data/modules/mu/cleanup.rb +235 -158
  101. data/modules/mu/cloud.rb +675 -138
  102. data/modules/mu/clouds/aws.rb +156 -24
  103. data/modules/mu/clouds/aws/alarm.rb +4 -14
  104. data/modules/mu/clouds/aws/bucket.rb +60 -18
  105. data/modules/mu/clouds/aws/cache_cluster.rb +8 -20
  106. data/modules/mu/clouds/aws/collection.rb +12 -22
  107. data/modules/mu/clouds/aws/container_cluster.rb +209 -118
  108. data/modules/mu/clouds/aws/database.rb +120 -45
  109. data/modules/mu/clouds/aws/dnszone.rb +7 -18
  110. data/modules/mu/clouds/aws/endpoint.rb +5 -15
  111. data/modules/mu/clouds/aws/firewall_rule.rb +144 -72
  112. data/modules/mu/clouds/aws/folder.rb +4 -11
  113. data/modules/mu/clouds/aws/function.rb +6 -16
  114. data/modules/mu/clouds/aws/group.rb +4 -12
  115. data/modules/mu/clouds/aws/habitat.rb +11 -13
  116. data/modules/mu/clouds/aws/loadbalancer.rb +40 -28
  117. data/modules/mu/clouds/aws/log.rb +5 -13
  118. data/modules/mu/clouds/aws/msg_queue.rb +9 -24
  119. data/modules/mu/clouds/aws/nosqldb.rb +4 -12
  120. data/modules/mu/clouds/aws/notifier.rb +6 -13
  121. data/modules/mu/clouds/aws/role.rb +69 -40
  122. data/modules/mu/clouds/aws/search_domain.rb +17 -20
  123. data/modules/mu/clouds/aws/server.rb +184 -94
  124. data/modules/mu/clouds/aws/server_pool.rb +33 -38
  125. data/modules/mu/clouds/aws/storage_pool.rb +5 -12
  126. data/modules/mu/clouds/aws/user.rb +59 -33
  127. data/modules/mu/clouds/aws/userdata/linux.erb +18 -30
  128. data/modules/mu/clouds/aws/userdata/windows.erb +9 -9
  129. data/modules/mu/clouds/aws/vpc.rb +214 -145
  130. data/modules/mu/clouds/azure.rb +978 -44
  131. data/modules/mu/clouds/azure/container_cluster.rb +413 -0
  132. data/modules/mu/clouds/azure/firewall_rule.rb +500 -0
  133. data/modules/mu/clouds/azure/habitat.rb +167 -0
  134. data/modules/mu/clouds/azure/loadbalancer.rb +205 -0
  135. data/modules/mu/clouds/azure/role.rb +211 -0
  136. data/modules/mu/clouds/azure/server.rb +810 -0
  137. data/modules/mu/clouds/azure/user.rb +257 -0
  138. data/modules/mu/clouds/azure/userdata/README.md +4 -0
  139. data/modules/mu/clouds/azure/userdata/linux.erb +137 -0
  140. data/modules/mu/clouds/azure/userdata/windows.erb +275 -0
  141. data/modules/mu/clouds/azure/vpc.rb +782 -0
  142. data/modules/mu/clouds/cloudformation.rb +12 -9
  143. data/modules/mu/clouds/cloudformation/firewall_rule.rb +5 -13
  144. data/modules/mu/clouds/cloudformation/server.rb +10 -1
  145. data/modules/mu/clouds/cloudformation/server_pool.rb +1 -0
  146. data/modules/mu/clouds/cloudformation/vpc.rb +0 -2
  147. data/modules/mu/clouds/google.rb +554 -117
  148. data/modules/mu/clouds/google/bucket.rb +173 -32
  149. data/modules/mu/clouds/google/container_cluster.rb +1112 -157
  150. data/modules/mu/clouds/google/database.rb +24 -47
  151. data/modules/mu/clouds/google/firewall_rule.rb +344 -89
  152. data/modules/mu/clouds/google/folder.rb +156 -79
  153. data/modules/mu/clouds/google/group.rb +272 -82
  154. data/modules/mu/clouds/google/habitat.rb +177 -52
  155. data/modules/mu/clouds/google/loadbalancer.rb +9 -34
  156. data/modules/mu/clouds/google/role.rb +1211 -0
  157. data/modules/mu/clouds/google/server.rb +491 -227
  158. data/modules/mu/clouds/google/server_pool.rb +233 -48
  159. data/modules/mu/clouds/google/user.rb +479 -125
  160. data/modules/mu/clouds/google/userdata/linux.erb +3 -3
  161. data/modules/mu/clouds/google/userdata/windows.erb +9 -9
  162. data/modules/mu/clouds/google/vpc.rb +381 -223
  163. data/modules/mu/config.rb +689 -214
  164. data/modules/mu/config/bucket.rb +1 -1
  165. data/modules/mu/config/cache_cluster.rb +1 -1
  166. data/modules/mu/config/cache_cluster.yml +0 -4
  167. data/modules/mu/config/container_cluster.rb +18 -9
  168. data/modules/mu/config/database.rb +6 -23
  169. data/modules/mu/config/firewall_rule.rb +9 -15
  170. data/modules/mu/config/folder.rb +22 -21
  171. data/modules/mu/config/habitat.rb +22 -21
  172. data/modules/mu/config/loadbalancer.rb +2 -2
  173. data/modules/mu/config/role.rb +9 -40
  174. data/modules/mu/config/server.rb +26 -5
  175. data/modules/mu/config/server_pool.rb +1 -1
  176. data/modules/mu/config/storage_pool.rb +2 -2
  177. data/modules/mu/config/user.rb +4 -0
  178. data/modules/mu/config/vpc.rb +350 -110
  179. data/modules/mu/defaults/{amazon_images.yaml → AWS.yaml} +37 -39
  180. data/modules/mu/defaults/Azure.yaml +17 -0
  181. data/modules/mu/defaults/Google.yaml +24 -0
  182. data/modules/mu/defaults/README.md +1 -1
  183. data/modules/mu/deploy.rb +168 -125
  184. data/modules/mu/groomer.rb +2 -1
  185. data/modules/mu/groomers/ansible.rb +104 -32
  186. data/modules/mu/groomers/chef.rb +96 -44
  187. data/modules/mu/kittens.rb +20602 -0
  188. data/modules/mu/logger.rb +38 -11
  189. data/modules/mu/master.rb +90 -8
  190. data/modules/mu/master/chef.rb +2 -3
  191. data/modules/mu/master/ldap.rb +0 -1
  192. data/modules/mu/master/ssl.rb +250 -0
  193. data/modules/mu/mommacat.rb +917 -513
  194. data/modules/scratchpad.erb +1 -1
  195. data/modules/tests/super_complex_bok.yml +0 -0
  196. data/modules/tests/super_simple_bok.yml +0 -0
  197. data/roles/mu-master.json +2 -1
  198. data/spec/azure_creds +5 -0
  199. data/spec/mu.yaml +56 -0
  200. data/spec/mu/clouds/azure_spec.rb +164 -27
  201. data/spec/spec_helper.rb +5 -0
  202. data/test/clean_up.py +0 -0
  203. data/test/exec_inspec.py +0 -0
  204. data/test/exec_mu_install.py +0 -0
  205. data/test/exec_retry.py +0 -0
  206. data/test/smoke_test.rb +0 -0
  207. metadata +90 -118
  208. data/cookbooks/mu-jenkins/Berksfile +0 -14
  209. data/cookbooks/mu-jenkins/CHANGELOG.md +0 -13
  210. data/cookbooks/mu-jenkins/LICENSE +0 -37
  211. data/cookbooks/mu-jenkins/README.md +0 -105
  212. data/cookbooks/mu-jenkins/attributes/default.rb +0 -42
  213. data/cookbooks/mu-jenkins/files/default/cleanup_deploy_config.xml +0 -73
  214. data/cookbooks/mu-jenkins/files/default/deploy_config.xml +0 -44
  215. data/cookbooks/mu-jenkins/metadata.rb +0 -21
  216. data/cookbooks/mu-jenkins/recipes/default.rb +0 -195
  217. data/cookbooks/mu-jenkins/recipes/node-ssh-config.rb +0 -54
  218. data/cookbooks/mu-jenkins/recipes/public_key.rb +0 -24
  219. data/cookbooks/mu-jenkins/templates/default/example_job.config.xml.erb +0 -24
  220. data/cookbooks/mu-jenkins/templates/default/org.jvnet.hudson.plugins.SSHBuildWrapper.xml.erb +0 -14
  221. data/cookbooks/mu-jenkins/templates/default/ssh_config.erb +0 -6
  222. data/cookbooks/nagios/Berksfile +0 -11
  223. data/cookbooks/nagios/CHANGELOG.md +0 -589
  224. data/cookbooks/nagios/CONTRIBUTING.md +0 -11
  225. data/cookbooks/nagios/LICENSE +0 -37
  226. data/cookbooks/nagios/README.md +0 -328
  227. data/cookbooks/nagios/TESTING.md +0 -2
  228. data/cookbooks/nagios/attributes/config.rb +0 -171
  229. data/cookbooks/nagios/attributes/default.rb +0 -228
  230. data/cookbooks/nagios/chefignore +0 -102
  231. data/cookbooks/nagios/definitions/command.rb +0 -33
  232. data/cookbooks/nagios/definitions/contact.rb +0 -33
  233. data/cookbooks/nagios/definitions/contactgroup.rb +0 -33
  234. data/cookbooks/nagios/definitions/host.rb +0 -33
  235. data/cookbooks/nagios/definitions/hostdependency.rb +0 -33
  236. data/cookbooks/nagios/definitions/hostescalation.rb +0 -34
  237. data/cookbooks/nagios/definitions/hostgroup.rb +0 -33
  238. data/cookbooks/nagios/definitions/nagios_conf.rb +0 -38
  239. data/cookbooks/nagios/definitions/resource.rb +0 -33
  240. data/cookbooks/nagios/definitions/service.rb +0 -33
  241. data/cookbooks/nagios/definitions/servicedependency.rb +0 -33
  242. data/cookbooks/nagios/definitions/serviceescalation.rb +0 -34
  243. data/cookbooks/nagios/definitions/servicegroup.rb +0 -33
  244. data/cookbooks/nagios/definitions/timeperiod.rb +0 -33
  245. data/cookbooks/nagios/libraries/base.rb +0 -314
  246. data/cookbooks/nagios/libraries/command.rb +0 -91
  247. data/cookbooks/nagios/libraries/contact.rb +0 -230
  248. data/cookbooks/nagios/libraries/contactgroup.rb +0 -112
  249. data/cookbooks/nagios/libraries/custom_option.rb +0 -36
  250. data/cookbooks/nagios/libraries/data_bag_helper.rb +0 -23
  251. data/cookbooks/nagios/libraries/default.rb +0 -90
  252. data/cookbooks/nagios/libraries/host.rb +0 -412
  253. data/cookbooks/nagios/libraries/hostdependency.rb +0 -181
  254. data/cookbooks/nagios/libraries/hostescalation.rb +0 -173
  255. data/cookbooks/nagios/libraries/hostgroup.rb +0 -119
  256. data/cookbooks/nagios/libraries/nagios.rb +0 -282
  257. data/cookbooks/nagios/libraries/resource.rb +0 -59
  258. data/cookbooks/nagios/libraries/service.rb +0 -455
  259. data/cookbooks/nagios/libraries/servicedependency.rb +0 -215
  260. data/cookbooks/nagios/libraries/serviceescalation.rb +0 -195
  261. data/cookbooks/nagios/libraries/servicegroup.rb +0 -144
  262. data/cookbooks/nagios/libraries/timeperiod.rb +0 -160
  263. data/cookbooks/nagios/libraries/users_helper.rb +0 -54
  264. data/cookbooks/nagios/metadata.rb +0 -25
  265. data/cookbooks/nagios/recipes/_load_databag_config.rb +0 -153
  266. data/cookbooks/nagios/recipes/_load_default_config.rb +0 -241
  267. data/cookbooks/nagios/recipes/apache.rb +0 -48
  268. data/cookbooks/nagios/recipes/default.rb +0 -204
  269. data/cookbooks/nagios/recipes/nginx.rb +0 -82
  270. data/cookbooks/nagios/recipes/pagerduty.rb +0 -143
  271. data/cookbooks/nagios/recipes/server_package.rb +0 -40
  272. data/cookbooks/nagios/recipes/server_source.rb +0 -164
  273. data/cookbooks/nagios/templates/default/apache2.conf.erb +0 -96
  274. data/cookbooks/nagios/templates/default/cgi.cfg.erb +0 -266
  275. data/cookbooks/nagios/templates/default/commands.cfg.erb +0 -13
  276. data/cookbooks/nagios/templates/default/contacts.cfg.erb +0 -37
  277. data/cookbooks/nagios/templates/default/hostgroups.cfg.erb +0 -25
  278. data/cookbooks/nagios/templates/default/hosts.cfg.erb +0 -15
  279. data/cookbooks/nagios/templates/default/htpasswd.users.erb +0 -6
  280. data/cookbooks/nagios/templates/default/nagios.cfg.erb +0 -22
  281. data/cookbooks/nagios/templates/default/nginx.conf.erb +0 -62
  282. data/cookbooks/nagios/templates/default/pagerduty.cgi.erb +0 -185
  283. data/cookbooks/nagios/templates/default/resource.cfg.erb +0 -27
  284. data/cookbooks/nagios/templates/default/servicedependencies.cfg.erb +0 -15
  285. data/cookbooks/nagios/templates/default/servicegroups.cfg.erb +0 -14
  286. data/cookbooks/nagios/templates/default/services.cfg.erb +0 -14
  287. data/cookbooks/nagios/templates/default/templates.cfg.erb +0 -31
  288. data/cookbooks/nagios/templates/default/timeperiods.cfg.erb +0 -13
  289. data/extras/image-generators/aws/centos6.yaml +0 -18
  290. data/modules/mu/defaults/google_images.yaml +0 -16
  291. data/roles/mu-master-jenkins.json +0 -24
@@ -42,6 +42,8 @@ Usage:
42
42
  opt :cloudformation_output, "When emitting a CloudFormation template, put the final product in this location instead of in /tmp. Takes a local file path or an s3:// URI. S3 uploads will be given AUTHENTICATED-READ permissions.", :require => false, :type => :string
43
43
  opt :verbose, "Display debugging output.", :require => false, :default => false, :type => :boolean
44
44
  opt :quiet, "Display minimal output.", :require => false, :default => false, :type => :boolean
45
+ opt :color, "Display log output in human-friendly colors.", :require => false, :default => true, :type => :boolean
46
+ opt :credentials, "Set the default credential set to use for resources which do not specify a default", :require => false, :type => :string
45
47
  end
46
48
  verbosity = MU::Logger::NORMAL
47
49
  verbosity = MU::Logger::LOUD if $opts[:verbose]
@@ -58,7 +60,7 @@ if $opts[:liveupdate] and !$opts[:update]
58
60
  end
59
61
 
60
62
  MU.setVar("curRegion", $opts[:region]) if $opts[:region]
61
- MU.setLogging(verbosity, $opts[:web])
63
+ MU.setLogging(verbosity, $opts[:web], STDOUT, $opts[:color])
62
64
 
63
65
  # Parse any paramater options into something useable.
64
66
  params = Hash.new
@@ -87,11 +89,11 @@ end
87
89
 
88
90
  MU.log "Loading #{config}", html: $opts[:web], details: $opts
89
91
 
90
- conf_engine = MU::Config.new(config, $opts[:skipinitialupdates], params: params, updating: $opts[:update])
92
+ conf_engine = MU::Config.new(config, $opts[:skipinitialupdates], params: params, updating: $opts[:update], default_credentials: $opts[:credentials])
91
93
  stack_conf = conf_engine.config
92
94
 
93
95
  if $opts[:dryrun] or $opts[:verbose]
94
- puts stack_conf.to_yaml
96
+ puts MU::Config.stripConfig(stack_conf).to_yaml
95
97
  conf_engine.visualizeDependencies
96
98
  end
97
99
 
@@ -112,6 +114,7 @@ if $opts[:dryrun]
112
114
  cost_dummy_deploy = MU::Deploy.new(
113
115
  $opts[:environment],
114
116
  verbosity: MU::Logger::SILENT,
117
+ color: $opts[:color],
115
118
  force_cloudformation: true,
116
119
  cloudformation_path: "/dev/null",
117
120
  nocleanup: false,
@@ -135,6 +138,7 @@ if $opts[:update]
135
138
  deployer = MU::Deploy.new(
136
139
  deploy.environment,
137
140
  verbosity: verbosity,
141
+ color: $opts[:color],
138
142
  webify_logs: $opts[:web],
139
143
  nocleanup: true, # don't accidentally blow up an existing deploy
140
144
  stack_conf: stack_conf,
@@ -156,6 +160,7 @@ end
156
160
  deployer = MU::Deploy.new(
157
161
  $opts[:environment],
158
162
  verbosity: verbosity,
163
+ color: $opts[:color],
159
164
  webify_logs: $opts[:web],
160
165
  nocleanup: $opts[:nocleanup],
161
166
  cloudformation_path: cfm_path,
@@ -31,6 +31,7 @@ require 'erb'
31
31
  require 'optimist'
32
32
  require 'json-schema'
33
33
  require 'mu'
34
+ require 'mu/master/ssl'
34
35
  Dir.chdir(MU.installDir)
35
36
 
36
37
  $opts = Optimist::options do
@@ -64,7 +65,7 @@ my_instance_id = MU::Cloud::AWS.getAWSMetaData("instance-id")
64
65
 
65
66
  if MU::Cloud::Google.hosted?
66
67
  instance = MU.myCloudDescriptor
67
- admin_sg_name = "mu-master-"+MU.myInstanceId+"-ingress-allow"
68
+ admin_sg_name = MU.myInstanceId+"-"+MU.myVPC+"-ingress-allow"
68
69
  if !instance.tags.items or !instance.tags.items.include?(admin_sg_name)
69
70
  newitems = instance.tags.items ? instance.tags.items.dup : []
70
71
  newitems << admin_sg_name
@@ -87,9 +88,10 @@ end
87
88
  # Create a security group, or manipulate an existing one, so that we have all
88
89
  # of the appropriate network holes.
89
90
  if $opts[:sg]
90
- open_ports = [80, 443, 2260, 7443, 8443, 9443, 8200]
91
+ open_ports = [80, 443, MU.mommaCatPort, 7443, 8443, 9443, 8200]
91
92
 
92
93
  found = MU::MommaCat.findStray("Google", "firewall_rule", dummy_ok: true, cloud_id: admin_sg_name)
94
+ found.reject! { |v| v.cloud_desc.network != MU.myVPC }
93
95
  admin_sg = found.first if !found.nil? and found.size > 0
94
96
 
95
97
  rules = []
@@ -108,21 +110,27 @@ if $opts[:sg]
108
110
  }
109
111
  cfg = {
110
112
  "name" => admin_sg_name,
113
+ "scrub_mu_isms" => true,
111
114
  "cloud" => "Google",
112
115
  "rules" => rules,
113
116
  "project" => MU::Cloud::Google.myProject,
114
117
  "target_tags" => [admin_sg_name],
115
118
  "vpc" => {
116
- "vpc_id" => instance.network_interfaces.first.network
119
+ "id" => MU.myVPC
117
120
  }
118
121
  }
119
122
 
120
123
  if !admin_sg
121
- admin_sg = MU::Cloud::FirewallRule.new(kitten_cfg: cfg, mu_name: "mu-master-"+MU.myInstanceId)
122
- admin_sg.create
123
- admin_sg.groom
124
+ admin_sg = MU::Cloud::FirewallRule.new(kitten_cfg: cfg, mu_name: admin_sg_name)
125
+ begin
126
+ admin_sg.create
127
+ rescue ::Google::Apis::ClientError => e
128
+ raise e if !e.message.match(/alreadyExists: /)
129
+ ensure
130
+ admin_sg.groom
131
+ end
124
132
  else
125
- # TODO Make sure the rules and tags are up to date
133
+ admin_sg.groom
126
134
  end
127
135
 
128
136
  end
@@ -208,7 +216,7 @@ end
208
216
  if $opts[:uploadlogs]
209
217
  today = Time.new.strftime("%Y%m%d").to_s
210
218
  ["master.log", "nodes.log"].each { |log|
211
- if File.exists?("/Mu_Logs/#{log}-#{today}")
219
+ if File.exist?("/Mu_Logs/#{log}-#{today}")
212
220
  MU.log "Uploading /Mu_Logs/#{log}-#{today} to bucket #{$bucketname}"
213
221
  MU::Cloud::AWS.s3.put_object(
214
222
  bucket: $bucketname,
@@ -20,10 +20,9 @@ end
20
20
 
21
21
  require 'rubygems'
22
22
  require 'bundler/setup'
23
- require 'json'
24
23
  require 'erb'
25
- require 'optimist'
26
- require 'json-schema'
24
+ require 'tempfile'
25
+ require 'fileutils'
27
26
  require File.realpath(File.expand_path(File.dirname(__FILE__)+"/mu-load-config.rb"))
28
27
  require 'mu'
29
28
 
@@ -43,19 +42,104 @@ rescue
43
42
  yard = File.dirname(Gem.ruby)+'/yard'
44
43
  end
45
44
 
46
-
45
+ docdir = Process.uid == 0 ? "/var/www/html/docs" : MU.dataDir+"/docs"
46
+ if !Dir.exist?(docdir)
47
+ FileUtils.mkdir_p(docdir, mode: 0755)
48
+ end
47
49
 
48
50
  MU::Config.emitSchemaAsRuby
49
- MU.log "Generating YARD documentation in /var/www/html/docs (see http://#{$MU_CFG['public_address']}/docs/frames.html)"
51
+ if Process.uid == 0
52
+ MU.log "Generating YARD documentation in #{docdir} (see http://#{$MU_CFG['public_address']}/docs/frames.html)"
53
+ else
54
+ MU.log "Generating YARD documentation in #{docdir}"
55
+ end
50
56
 
51
57
  File.umask 0022
52
58
 
53
59
  Dir.chdir(MU.myRoot) do
54
- #exec "env -i PATH=#{ENV['PATH']} HOME=#{ENV['HOME']} #{yard} doc modules -m markdown -o /var/www/html/docs" THIS DOESNT WORK IN CICD
60
+ imgs = %w{alpha.png beta.png release.png}
61
+ FileUtils.cp(imgs.map { |f| "extras/"+f }, docdir)
62
+ FileUtils.chmod(0644, imgs.map { |f| docdir+"/"+f })
63
+
64
+ readme = File.read("README.md")
65
+ readme += <<EOF
66
+
67
+ # Supported resources
68
+ EOF
55
69
 
56
- system(%Q{#{yard} doc modules -m markdown -o /var/www/html/docs})
70
+ impl_counts = {}
71
+ cloudlist = MU::Cloud.supportedClouds.sort { |a, b|
72
+ counts = {
73
+ a => 0,
74
+ b => 0
75
+ }
76
+ MU::Cloud.resource_types.each_pair { |type, cfg|
77
+ impl_counts[type] ||= 0
78
+ [a, b].each { |cloud|
79
+ begin
80
+ myclass = Object.const_get("MU").const_get("Cloud").const_get(cloud).const_get(type)
81
+ case myclass.quality
82
+ when MU::Cloud::RELEASE
83
+ counts[cloud] += 4
84
+ impl_counts[type] += 4
85
+ when MU::Cloud::BETA
86
+ counts[cloud] += 2
87
+ impl_counts[type] += 2
88
+ when MU::Cloud::ALPHA
89
+ counts[cloud] += 1
90
+ impl_counts[type] += 1
91
+ end
92
+ rescue MU::Cloud::MuCloudResourceNotImplemented
93
+ end
94
+ }
95
+ }
96
+ counts[b] <=> counts[a]
97
+ }
57
98
 
58
- system(%Q{chcon -R -h -t httpd_sys_script_exec_t /var/www/html/})
99
+ readme += "\n\n<table><tr><th></th>"
100
+ cloudlist.each { |cloud|
101
+ readme += "<th>"+cloud+"</th>"
102
+ }
103
+ readme += "</tr>\n"
59
104
 
105
+ icon_style = 'height:2.2em;width:2.2em;padding:0px;'
106
+ MU::Cloud.resource_types.keys.sort { |a, b| impl_counts[b] <=> impl_counts[a] }.each { |type|
107
+ readme += "<tr><td><strong>{MU::Config::BasketofKittens::#{MU::Cloud.resource_types[type][:cfg_plural]} #{type.to_s}}</strong></td>"
108
+ cloudlist.each { |cloud|
109
+ readme += "<td><center>"
110
+ begin
111
+ myclass = Object.const_get("MU").const_get("Cloud").const_get(cloud).const_get(type)
112
+ case myclass.quality
113
+ when MU::Cloud::RELEASE
114
+ readme += "<img src='release.png' style='#{icon_style}' title='Release Quality' alt='[Release Quality]'>"
115
+ when MU::Cloud::BETA
116
+ readme += "<img src='beta.png' style='#{icon_style}' title='Beta Quality' alt='[Beta Quality]'>"
117
+ when MU::Cloud::ALPHA
118
+ readme += "<img src='alpha.png' style='#{icon_style}' title='Alpha Quality' alt='[Alpha Quality]'>"
119
+ else
120
+ readme += "?"
121
+ end
122
+ rescue MU::Cloud::MuCloudResourceNotImplemented
123
+ readme += "-"
124
+ end
125
+ readme += "</center></td>"
126
+ }
127
+ readme += "</tr>\n"
128
+ }
129
+ readme += "</table>\n\n"
130
+
131
+ idx = Tempfile.new('mu-gen-docs-index', MU.myRoot)
132
+ idx.write(readme)
133
+ idx.rewind
134
+ idx.close
135
+ idx_short = idx.path.gsub(/.*?\/([^\/]+)$/, '\1')
136
+
137
+ system(%Q{#{yard} doc modules --readme #{idx_short} --markup markdown --output-dir #{docdir}})
138
+ # --exclude seems to just... not work
139
+ FileUtils.rm(docdir+"/file."+idx_short+".html")
140
+
141
+ if Process.uid == 0
142
+ system(%Q{chcon -R -h -t httpd_sys_script_exec_t /var/www/html/})
143
+ end
60
144
  system(%Q{#{yard} stats --list-undoc modules})
61
145
  end
@@ -64,6 +64,7 @@ end
64
64
  # into the Ruby $LOAD_PATH.
65
65
  # @return [Hash]
66
66
  def loadMuConfig(default_cfg_overrides = nil)
67
+
67
68
  # Start with sane defaults
68
69
  default_cfg = {
69
70
  "installdir" => "/opt/mu",
@@ -109,9 +110,25 @@ def loadMuConfig(default_cfg_overrides = nil)
109
110
  "dcs" => ["127.0.0.1"]
110
111
  }
111
112
  }
113
+
114
+ in_gem = (Gem.paths and Gem.paths.home and File.dirname(__FILE__).match(/^#{Gem.paths.home}/))
115
+
116
+ if in_gem
117
+ default_cfg.delete("ldap")
118
+ default_cfg.delete("ssl")
119
+ default_cfg.delete("scratchpad")
120
+ default_cfg.delete("libdir")
121
+ default_cfg.delete("installdir")
122
+ else
123
+ if File.exist?("/opt/mu/etc/mu.yaml")
124
+ default_cfg.merge!(YAML.load(File.read("/opt/mu/etc/mu.yaml")))
125
+ default_cfg["config_files"] = ["/opt/mu/etc/mu.yaml"]
126
+ end
127
+ end
128
+
112
129
  default_cfg.merge!(default_cfg_overrides) if default_cfg_overrides
113
130
 
114
- if !File.exists?(cfgPath) and Process.uid == 0
131
+ if !File.exist?(cfgPath) and Process.uid == 0
115
132
  puts "**** Master config #{cfgPath} does not exist, initializing *****"
116
133
  File.open(cfgPath, File::CREAT|File::TRUNC|File::RDWR, 0644){ |f|
117
134
  f.puts default_cfg.to_yaml
@@ -119,7 +136,7 @@ def loadMuConfig(default_cfg_overrides = nil)
119
136
  end
120
137
 
121
138
  global_cfg = { "config_files" => [] }
122
- if File.exists?(cfgPath)
139
+ if File.exist?(cfgPath)
123
140
  global_cfg = YAML.load(File.read(cfgPath))
124
141
  global_cfg["config_files"] = [cfgPath]
125
142
  end
@@ -127,33 +144,39 @@ def loadMuConfig(default_cfg_overrides = nil)
127
144
  home = Etc.getpwuid(Process.uid).dir
128
145
  username = Etc.getpwuid(Process.uid).name
129
146
  if File.readable?("#{home}/.mu.yaml") and cfgPath != "#{home}/.mu.yaml"
130
- global_cfg.merge!(YAML.load(File.read("#{home}/.mu.yaml")))
131
- global_cfg["config_files"] << "#{home}/.mu.yaml"
147
+ localfile = YAML.load(File.read("#{home}/.mu.yaml"))
148
+ if localfile
149
+ global_cfg.merge!(localfile)
150
+ global_cfg["config_files"] << "#{home}/.mu.yaml"
151
+ end
132
152
  end
133
153
  if !global_cfg.has_key?("installdir")
134
154
  if ENV['MU_INSTALLDIR']
135
155
  global_cfg["installdir"] = ENV['MU_INSTALLDIR']
136
- elsif Gem.paths and Gem.paths.home and !Dir.exists?("/opt/mu/lib")
137
- global_cfg["installdir"] = File.realpath(File.expand_path(File.dirname(Gem.paths.home))+"/../../../")
138
- else
156
+ elsif !in_gem
139
157
  global_cfg["installdir"] = "/opt/mu"
140
158
  end
141
159
  end
142
160
  if !global_cfg.has_key?("libdir")
143
161
  if ENV['MU_INSTALLDIR']
144
162
  global_cfg["libdir"] = ENV['MU_INSTALLDIR']+"/lib"
145
- else
163
+ elsif !in_gem
146
164
  global_cfg["libdir"] = File.realpath(File.expand_path(File.dirname(__FILE__))+"/..")
147
165
  end
148
166
  end
149
167
  if !global_cfg.has_key?("datadir")
150
168
  if username != "root"
151
- global_cfg["datadir"] = home+"/.mu"
169
+ global_cfg["datadir"] = home+"/.mu/var"
152
170
  elsif global_cfg.has_key?("installdir")
153
171
  global_cfg["datadir"] = global_cfg["installdir"]+"/var"
154
172
  else
155
173
  global_cfg["datadir"] = "/opt/mu/var"
156
174
  end
175
+ default_cfg["ssl"] = {
176
+ "cert" => global_cfg["datadir"]+"/ssl/mommacat.crt",
177
+ "key" => global_cfg["datadir"]+"/ssl/mommacat.key",
178
+ "chain" => global_cfg["datadir"]+"/ssl/Mu_CA.pem"
179
+ }
157
180
  end
158
181
 
159
182
  exit 1 if !validateClouds(global_cfg)
@@ -164,12 +187,29 @@ end
164
187
 
165
188
  # Shorthand for locating the path to mu.yaml
166
189
  def cfgPath
190
+ in_gem = false
191
+ gemwhich = %x{gem which mu 2>&1}.chomp
192
+ gemwhich = nil if $?.exitstatus != 0
193
+ mypath = File.realpath(File.expand_path(File.dirname(__FILE__)))
194
+ if !mypath.match(/^\/opt\/mu/)
195
+ if Gem.paths and Gem.paths.home and
196
+ (mypath.match(/^#{Gem.paths.home}/) or gemwhich.match(/^#{Gem.paths.home}/))
197
+ in_gem = true
198
+ elsif $?.exitstatus == 0 and gemwhich and !gemwhich.empty?
199
+ $LOAD_PATH.each { |path|
200
+ if path.match(/\/cloud-mu-[^\/]+\/modules/) or
201
+ path.match(/#{Regexp.quote(gemwhich)}/)
202
+ in_gem = true
203
+ end
204
+ }
205
+ end
206
+ end
167
207
  home = Etc.getpwuid(Process.uid).dir
168
208
  username = Etc.getpwuid(Process.uid).name
169
- if Process.uid == 0
209
+ if Process.uid == 0 and !in_gem
170
210
  if ENV.include?('MU_INSTALLDIR')
171
211
  ENV['MU_INSTALLDIR']+"/etc/mu.yaml"
172
- elsif Dir.exists?("/opt/mu")
212
+ elsif Dir.exist?("/opt/mu")
173
213
  "/opt/mu/etc/mu.yaml"
174
214
  else
175
215
  "#{home}/.mu.yaml"
@@ -180,7 +220,7 @@ def cfgPath
180
220
  end
181
221
 
182
222
  def cfgExists?
183
- File.exists?(cfgPath)
223
+ File.exist?(cfgPath)
184
224
  end
185
225
 
186
226
  # Output an in-memory configuration hash to the standard config file location,
@@ -0,0 +1,36 @@
1
+ #!/usr/local/ruby-current/bin/ruby
2
+ # Copyright:: Copyright (c) 2019 eGlobalTech, Inc., all rights reserved
3
+ #
4
+ # Licensed under the BSD-3 license (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License in the root of the project or at
7
+ #
8
+ # http://egt-labs.com/mu/LICENSE.html
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require File.expand_path(File.dirname(__FILE__))+"/mu-load-config.rb"
17
+ require 'rubygems'
18
+ require 'bundler/setup'
19
+ require 'mu'
20
+
21
+ if ARGV.size > 1 or !["start", "stop", "restart"].include?(ARGV[0])
22
+ MU.log "Expecting start, stop, or restart argument", MU::ERR
23
+ exit 1
24
+ end
25
+
26
+
27
+ case ARGV[0]
28
+ when "start"
29
+ MU::MommaCat.start
30
+ when "stop"
31
+ MU::MommaCat.stop
32
+ when "restart"
33
+ MU::MommaCat.restart
34
+ when "status"
35
+ MU::MommaCat.status
36
+ end
@@ -182,36 +182,38 @@ def reGroom(deploys = MU::MommaCat.listDeploys, nodes = [], vaults_only: false)
182
182
  deploys.each { |muid|
183
183
  mommacat = MU::MommaCat.new(muid)
184
184
  next if mommacat.kittens.nil? or mommacat.kittens['servers'].nil?
185
- mommacat.kittens['servers'].each_pair { |nodeclass, servers|
186
- servers.each_pair { |mu_name, server|
187
- next if nodes.size > 0 and !nodes.include?(mu_name)
188
- count = count + 1
189
- child = Process.fork {
190
- begin
191
- type = "server"
192
- type = "server_pool" if server.config.has_key?("basis")
193
- if vaults_only
194
- next if !server.config.has_key?("vault_access")
195
- server.config["vault_access"].each { |v|
196
- MU::Groomer::Chef.grantSecretAccess(mu_name, v['vault'], v['item'])
197
- }
198
- else
199
- mommacat.groomNode(server.cloud_id, nodeclass, type, mu_name: mu_name)
185
+ mommacat.kittens['servers'].each_pair { |habitat, nodeclasses|
186
+ nodeclasses.each_pair { |nodeclass, servers|
187
+ servers.each_pair { |mu_name, server|
188
+ next if nodes.size > 0 and !nodes.include?(mu_name)
189
+ count = count + 1
190
+ child = Process.fork {
191
+ begin
192
+ type = "server"
193
+ type = "server_pool" if server.config.has_key?("basis")
194
+ if vaults_only
195
+ next if !server.config.has_key?("vault_access")
196
+ server.config["vault_access"].each { |v|
197
+ MU::Groomer::Chef.grantSecretAccess(mu_name, v['vault'], v['item'])
198
+ }
199
+ else
200
+ mommacat.groomNode(server.cloud_id, nodeclass, type, mu_name: mu_name)
201
+ end
202
+ rescue Exception => e
203
+ MU.log e.inspect, MU::ERR, details: e.backtrace
204
+ exit 1
200
205
  end
201
- rescue Exception => e
202
- MU.log e.inspect, MU::ERR, details: e.backtrace
203
- exit 1
204
- end
206
+ }
207
+ $children[child] = mu_name
205
208
  }
206
- $children[child] = mu_name
207
- }
208
- while $children.size >= $opts[:concurrent]-1
209
- child = Process.wait
210
- if !$?.success?
211
- badnodes << $children[child]
209
+ while $children.size >= $opts[:concurrent]-1
210
+ child = Process.wait
211
+ if !$?.success?
212
+ badnodes << $children[child]
213
+ end
214
+ $children.delete(child)
212
215
  end
213
- $children.delete(child)
214
- end
216
+ }
215
217
  }
216
218
  }
217
219
  Process.waitall.each { |child|
@@ -240,6 +242,10 @@ def runCommand(deploys = MU::MommaCat.listDeploys, nodes = [], cmd = nil, print_
240
242
  done = false
241
243
  begin
242
244
  serverobj = mommacat.findLitterMate(type: "server", mu_name: nodename)
245
+ if !serverobj
246
+ MU.log "Failed to load server object for #{nodename}", MU::ERR
247
+ next
248
+ end
243
249
 
244
250
  # Generate the command if attemting a chef run
245
251
  if chefrun
@@ -419,6 +425,7 @@ def updateAWSMetaData(deploys = MU::MommaCat.listDeploys, nodes = [])
419
425
  "deploySSHKey" => mommacat.ssh_public_key,
420
426
  "muID" => muid,
421
427
  "muUser" => MU.chef_user,
428
+ "mommaCatPort" => MU.mommaCatPort,
422
429
  "publicIP" => MU.mu_public_ip,
423
430
  "resourceName" => svr_class,
424
431
  "windowsAdminName" => server['windows_admin_username'],