cloud-mu 2.1.0beta → 3.0.0beta

Sign up to get free protection for your applications and to get access to all the features.
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'],