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.
- checksums.yaml +7 -0
- data/Berksfile +56 -0
- data/Berksfile.lock +250 -0
- data/Jenkinsfile +184 -0
- data/LICENSE.md +37 -0
- data/README.md +26 -0
- data/bin/mu-aws-setup +376 -0
- data/bin/mu-cleanup +68 -0
- data/bin/mu-configure +1133 -0
- data/bin/mu-deploy +166 -0
- data/bin/mu-firewall-allow-clients +30 -0
- data/bin/mu-gcp-setup +200 -0
- data/bin/mu-gen-docs +34 -0
- data/bin/mu-gen-env +42 -0
- data/bin/mu-load-config.rb +158 -0
- data/bin/mu-node-manage +683 -0
- data/bin/mu-self-update +228 -0
- data/bin/mu-ssh +23 -0
- data/bin/mu-tunnel-nagios +144 -0
- data/bin/mu-upload-chef-artifacts +757 -0
- data/bin/mu-user-manage +275 -0
- data/cookbooks/awscli/LICENSE +37 -0
- data/cookbooks/awscli/README.md +58 -0
- data/cookbooks/awscli/attributes/default.rb +1 -0
- data/cookbooks/awscli/libraries/instance_metadata.rb +21 -0
- data/cookbooks/awscli/metadata.rb +20 -0
- data/cookbooks/awscli/recipes/default.rb +56 -0
- data/cookbooks/awscli/templates/default/config.erb +18 -0
- data/cookbooks/mu-activedirectory/CHANGELOG.md +13 -0
- data/cookbooks/mu-activedirectory/LICENSE +37 -0
- data/cookbooks/mu-activedirectory/README.md +6 -0
- data/cookbooks/mu-activedirectory/attributes/default.rb +98 -0
- data/cookbooks/mu-activedirectory/files/default/password-auth +32 -0
- data/cookbooks/mu-activedirectory/files/default/sshd_pol.pp +0 -0
- data/cookbooks/mu-activedirectory/files/default/sshd_pol.te +32 -0
- data/cookbooks/mu-activedirectory/files/default/syslogd_oddjobd.pp +0 -0
- data/cookbooks/mu-activedirectory/files/default/syslogd_oddjobd.te +10 -0
- data/cookbooks/mu-activedirectory/files/default/system-auth +34 -0
- data/cookbooks/mu-activedirectory/files/default/winbindpol.pp +0 -0
- data/cookbooks/mu-activedirectory/files/default/winbindpol.te +37 -0
- data/cookbooks/mu-activedirectory/libraries/config.rb +106 -0
- data/cookbooks/mu-activedirectory/libraries/helper.rb +86 -0
- data/cookbooks/mu-activedirectory/metadata.rb +17 -0
- data/cookbooks/mu-activedirectory/providers/domain.rb +152 -0
- data/cookbooks/mu-activedirectory/providers/domain_controller.rb +89 -0
- data/cookbooks/mu-activedirectory/providers/domain_node.rb +275 -0
- data/cookbooks/mu-activedirectory/recipes/default.rb +8 -0
- data/cookbooks/mu-activedirectory/recipes/domain-controller.rb +44 -0
- data/cookbooks/mu-activedirectory/recipes/domain-node.rb +50 -0
- data/cookbooks/mu-activedirectory/recipes/domain.rb +43 -0
- data/cookbooks/mu-activedirectory/recipes/sssd.rb +185 -0
- data/cookbooks/mu-activedirectory/resources/domain.rb +25 -0
- data/cookbooks/mu-activedirectory/resources/domain_controller.rb +25 -0
- data/cookbooks/mu-activedirectory/resources/domain_node.rb +20 -0
- data/cookbooks/mu-activedirectory/templates/default/dhclient-eth0.conf.erb +4 -0
- data/cookbooks/mu-activedirectory/templates/default/interface +0 -0
- data/cookbooks/mu-activedirectory/templates/default/krb5.conf.erb +23 -0
- data/cookbooks/mu-activedirectory/templates/default/ntp.conf.erb +56 -0
- data/cookbooks/mu-activedirectory/templates/default/smb.conf.erb +33 -0
- data/cookbooks/mu-activedirectory/templates/default/sssd.conf.erb +60 -0
- data/cookbooks/mu-activedirectory/templates/windows/Backup.xml.erb +20 -0
- data/cookbooks/mu-activedirectory/templates/windows/bkupInfo.xml.erb +1 -0
- data/cookbooks/mu-activedirectory/templates/windows/gpreprt.xml.erb +198 -0
- data/cookbooks/mu-activedirectory/templates/windows/gptmpl.inf.erb +12 -0
- data/cookbooks/mu-activedirectory/templates/windows/manifest.xml.erb +1 -0
- data/cookbooks/mu-firewall/CHANGELOG.md +11 -0
- data/cookbooks/mu-firewall/LICENSE +37 -0
- data/cookbooks/mu-firewall/README.md +5 -0
- data/cookbooks/mu-firewall/attributes/default.rb +3 -0
- data/cookbooks/mu-firewall/metadata.rb +16 -0
- data/cookbooks/mu-firewall/recipes/default.rb +10 -0
- data/cookbooks/mu-glusterfs/CHANGELOG.md +13 -0
- data/cookbooks/mu-glusterfs/LICENSE +37 -0
- data/cookbooks/mu-glusterfs/README.md +5 -0
- data/cookbooks/mu-glusterfs/attributes/default.rb +34 -0
- data/cookbooks/mu-glusterfs/metadata.rb +17 -0
- data/cookbooks/mu-glusterfs/recipes/client.rb +62 -0
- data/cookbooks/mu-glusterfs/recipes/default.rb +16 -0
- data/cookbooks/mu-glusterfs/recipes/samba.rb +57 -0
- data/cookbooks/mu-glusterfs/recipes/server.rb +200 -0
- data/cookbooks/mu-glusterfs/templates/default/mu-gluster-client.erb +71 -0
- data/cookbooks/mu-glusterfs/templates/default/smb.conf.erb +14 -0
- data/cookbooks/mu-jenkins/CHANGELOG.md +13 -0
- data/cookbooks/mu-jenkins/LICENSE +37 -0
- data/cookbooks/mu-jenkins/README.md +105 -0
- data/cookbooks/mu-jenkins/attributes/default.rb +42 -0
- data/cookbooks/mu-jenkins/files/default/cleanup_deploy_config.xml +73 -0
- data/cookbooks/mu-jenkins/files/default/deploy_config.xml +44 -0
- data/cookbooks/mu-jenkins/metadata.rb +21 -0
- data/cookbooks/mu-jenkins/recipes/default.rb +195 -0
- data/cookbooks/mu-jenkins/recipes/node-ssh-config.rb +54 -0
- data/cookbooks/mu-jenkins/recipes/public_key.rb +24 -0
- data/cookbooks/mu-jenkins/templates/default/example_job.config.xml.erb +24 -0
- data/cookbooks/mu-jenkins/templates/default/org.jvnet.hudson.plugins.SSHBuildWrapper.xml.erb +14 -0
- data/cookbooks/mu-jenkins/templates/default/ssh_config.erb +6 -0
- data/cookbooks/mu-master/CHANGELOG.md +13 -0
- data/cookbooks/mu-master/LICENSE +37 -0
- data/cookbooks/mu-master/README.md +6 -0
- data/cookbooks/mu-master/attributes/default.rb +95 -0
- data/cookbooks/mu-master/files/default/0-mu-log-server.conf +19 -0
- data/cookbooks/mu-master/files/default/addRSA.ldif +8 -0
- data/cookbooks/mu-master/files/default/check_mem.pl +197 -0
- data/cookbooks/mu-master/files/default/cloudamatic.png +0 -0
- data/cookbooks/mu-master/files/default/dirsrv_admin.pp +0 -0
- data/cookbooks/mu-master/files/default/dirsrv_admin.te +13 -0
- data/cookbooks/mu-master/files/default/nagios_selinux.pp +0 -0
- data/cookbooks/mu-master/files/default/nagios_selinux.te +51 -0
- data/cookbooks/mu-master/files/default/nagios_selinux_7.pp +0 -0
- data/cookbooks/mu-master/files/default/nagios_selinux_7.te +17 -0
- data/cookbooks/mu-master/files/default/pam_sshd +18 -0
- data/cookbooks/mu-master/files/default/ssl_enable.ldif +18 -0
- data/cookbooks/mu-master/files/default/syslogd_oddjobd.pp +0 -0
- data/cookbooks/mu-master/files/default/syslogd_oddjobd.te +10 -0
- data/cookbooks/mu-master/files/default/vimrc +19 -0
- data/cookbooks/mu-master/libraries/mu.rb +29 -0
- data/cookbooks/mu-master/metadata.rb +30 -0
- data/cookbooks/mu-master/providers/user.rb +41 -0
- data/cookbooks/mu-master/recipes/389ds.rb +164 -0
- data/cookbooks/mu-master/recipes/basepackages.rb +58 -0
- data/cookbooks/mu-master/recipes/caching_nameserver.rb +37 -0
- data/cookbooks/mu-master/recipes/default.rb +451 -0
- data/cookbooks/mu-master/recipes/eks-kubectl.rb +41 -0
- data/cookbooks/mu-master/recipes/firewall-holes.rb +70 -0
- data/cookbooks/mu-master/recipes/init.rb +542 -0
- data/cookbooks/mu-master/recipes/ssl-certs.rb +109 -0
- data/cookbooks/mu-master/recipes/sssd.rb +89 -0
- data/cookbooks/mu-master/recipes/update_nagios_only.rb +242 -0
- data/cookbooks/mu-master/recipes/vault.rb +111 -0
- data/cookbooks/mu-master/resources/user.rb +19 -0
- data/cookbooks/mu-master/templates/default/389-directory-setup.inf.erb +28 -0
- data/cookbooks/mu-master/templates/default/chef-server.rb.erb +18 -0
- data/cookbooks/mu-master/templates/default/dhclient-eth0.conf.erb +9 -0
- data/cookbooks/mu-master/templates/default/mu-momma-cat.erb +149 -0
- data/cookbooks/mu-master/templates/default/mu.rc.erb +9 -0
- data/cookbooks/mu-master/templates/default/openssl.cnf.erb +354 -0
- data/cookbooks/mu-master/templates/default/sssd.conf.erb +44 -0
- data/cookbooks/mu-master/templates/default/web_app.conf.erb +90 -0
- data/cookbooks/mu-mongo/CHANGELOG.md +13 -0
- data/cookbooks/mu-mongo/LICENSE +37 -0
- data/cookbooks/mu-mongo/README.md +5 -0
- data/cookbooks/mu-mongo/attributes/default.rb +22 -0
- data/cookbooks/mu-mongo/files/default/keyfile +16 -0
- data/cookbooks/mu-mongo/files/default/remove_nodes.js +5 -0
- data/cookbooks/mu-mongo/metadata.rb +17 -0
- data/cookbooks/mu-mongo/recipes/default.rb +149 -0
- data/cookbooks/mu-mongo/recipes/yum-update-rule.rb +18 -0
- data/cookbooks/mu-mongo/templates/default/mongo_create_openfema_db.js.erb +2 -0
- data/cookbooks/mu-mongo/templates/default/mongo_init.js.erb +1 -0
- data/cookbooks/mu-mongo/templates/default/mongo_logrotate.erb +14 -0
- data/cookbooks/mu-mongo/templates/default/mongo_replset_addnodes.js.erb +6 -0
- data/cookbooks/mu-mongo/templates/default/replset_init.js.erb +2 -0
- data/cookbooks/mu-openvpn/CHANGELOG.md +13 -0
- data/cookbooks/mu-openvpn/LICENSE +37 -0
- data/cookbooks/mu-openvpn/README.md +6 -0
- data/cookbooks/mu-openvpn/attributes/default.rb +119 -0
- data/cookbooks/mu-openvpn/metadata.rb +18 -0
- data/cookbooks/mu-openvpn/recipes/default.rb +108 -0
- data/cookbooks/mu-openvpn/templates/default/users.json.erb +42 -0
- data/cookbooks/mu-php54/CHANGELOG.md +12 -0
- data/cookbooks/mu-php54/LICENSE +37 -0
- data/cookbooks/mu-php54/README.md +0 -0
- data/cookbooks/mu-php54/files/centos/php.ini +1802 -0
- data/cookbooks/mu-php54/files/ubuntu/php.ini +1870 -0
- data/cookbooks/mu-php54/metadata.rb +21 -0
- data/cookbooks/mu-php54/recipes/default.rb +97 -0
- data/cookbooks/mu-splunk/CHANGELOG.md +37 -0
- data/cookbooks/mu-splunk/LICENSE +37 -0
- data/cookbooks/mu-splunk/README.md +451 -0
- data/cookbooks/mu-splunk/attributes/default.rb +95 -0
- data/cookbooks/mu-splunk/attributes/upgrade.rb +49 -0
- data/cookbooks/mu-splunk/definitions/splunk_installer.rb +103 -0
- data/cookbooks/mu-splunk/files/default/splunk-nocheck +10 -0
- data/cookbooks/mu-splunk/libraries/helpers.rb +72 -0
- data/cookbooks/mu-splunk/libraries/splunk_app_provider.rb +156 -0
- data/cookbooks/mu-splunk/libraries/splunk_app_resource.rb +43 -0
- data/cookbooks/mu-splunk/metadata.json +30 -0
- data/cookbooks/mu-splunk/metadata.rb +17 -0
- data/cookbooks/mu-splunk/recipes/client.rb +143 -0
- data/cookbooks/mu-splunk/recipes/default.rb +31 -0
- data/cookbooks/mu-splunk/recipes/disabled.rb +41 -0
- data/cookbooks/mu-splunk/recipes/install_forwarder.rb +23 -0
- data/cookbooks/mu-splunk/recipes/install_server.rb +23 -0
- data/cookbooks/mu-splunk/recipes/server.rb +53 -0
- data/cookbooks/mu-splunk/recipes/service.rb +95 -0
- data/cookbooks/mu-splunk/recipes/setup_auth.rb +49 -0
- data/cookbooks/mu-splunk/recipes/setup_ssl.rb +63 -0
- data/cookbooks/mu-splunk/recipes/upgrade.rb +94 -0
- data/cookbooks/mu-splunk/recipes/user.rb +34 -0
- data/cookbooks/mu-splunk/templates/default/base_logs_unix_inputs.conf.erb +26 -0
- data/cookbooks/mu-splunk/templates/default/inputs.conf.erb +13 -0
- data/cookbooks/mu-splunk/templates/default/outputs.conf.erb +9 -0
- data/cookbooks/mu-splunk/templates/default/splunk-init.erb +74 -0
- data/cookbooks/mu-splunk/templates/default/system-web.conf.erb +7 -0
- data/cookbooks/mu-tools/CHANGELOG.md +12 -0
- data/cookbooks/mu-tools/LICENSE +37 -0
- data/cookbooks/mu-tools/README.md +188 -0
- data/cookbooks/mu-tools/attributes/default.rb +142 -0
- data/cookbooks/mu-tools/attributes/ebs_rolling_snapshots.rb +3 -0
- data/cookbooks/mu-tools/files/amazon/etc/freshclam.conf +235 -0
- data/cookbooks/mu-tools/files/centos/CentOS-Base.repo +52 -0
- data/cookbooks/mu-tools/files/centos/etc/bashrc +93 -0
- data/cookbooks/mu-tools/files/centos/etc/freshclam.conf +235 -0
- data/cookbooks/mu-tools/files/centos/etc/login.defs +72 -0
- data/cookbooks/mu-tools/files/centos/etc/profile +77 -0
- data/cookbooks/mu-tools/files/centos/etc/security/limits.conf +57 -0
- data/cookbooks/mu-tools/files/centos/etc/sysconfig/init +19 -0
- data/cookbooks/mu-tools/files/centos/etc/sysctl.conf +82 -0
- data/cookbooks/mu-tools/files/centos-6/README_MU +0 -0
- data/cookbooks/mu-tools/files/centos-6/etc/audit/stig.rules +173 -0
- data/cookbooks/mu-tools/files/centos-6/etc/bashrc +90 -0
- data/cookbooks/mu-tools/files/centos-6/etc/login.defs +70 -0
- data/cookbooks/mu-tools/files/centos-6/etc/pam.d/su +12 -0
- data/cookbooks/mu-tools/files/centos-6/etc/profile +83 -0
- data/cookbooks/mu-tools/files/centos-6/etc/securetty +12 -0
- data/cookbooks/mu-tools/files/centos-6/etc/sysconfig/init +30 -0
- data/cookbooks/mu-tools/files/centos-6/etc/sysctl.conf +40 -0
- data/cookbooks/mu-tools/files/default/Mu_CA.pem +34 -0
- data/cookbooks/mu-tools/files/default/PSWindowsUpdate.zip +0 -0
- data/cookbooks/mu-tools/files/default/ebs_snapshots.py +123 -0
- data/cookbooks/mu-tools/files/default/etc/BANNER +0 -0
- data/cookbooks/mu-tools/files/default/etc/BANNER-FEDERAL +19 -0
- data/cookbooks/mu-tools/files/default/gpo_no_uac.zip +0 -0
- data/cookbooks/mu-tools/files/default/mypol.pp +0 -0
- data/cookbooks/mu-tools/files/default/mypol.te +37 -0
- data/cookbooks/mu-tools/files/default/nrpe_c7.pp +0 -0
- data/cookbooks/mu-tools/files/default/nrpe_c7.te +31 -0
- data/cookbooks/mu-tools/files/default/nrpe_check_disk.pp +0 -0
- data/cookbooks/mu-tools/files/default/nrpe_check_disk.te +11 -0
- data/cookbooks/mu-tools/files/default/nrpe_disk.pp +0 -0
- data/cookbooks/mu-tools/files/default/nrpe_disk.te +10 -0
- data/cookbooks/mu-tools/files/default/nrpe_file.pp +0 -0
- data/cookbooks/mu-tools/files/default/nrpe_file.te +31 -0
- data/cookbooks/mu-tools/files/default/ntrights +0 -0
- data/cookbooks/mu-tools/files/default/serverclass.conf +18 -0
- data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_unix/local/app.conf +1 -0
- data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_unix/local/inputs.conf +13 -0
- data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_windows/local/app.conf +1 -0
- data/cookbooks/mu-tools/files/default/splunk-apps/base_logs_windows/local/inputs.conf +8 -0
- data/cookbooks/mu-tools/files/default/sshd_pol.pp +0 -0
- data/cookbooks/mu-tools/files/default/sshd_pol.te +32 -0
- data/cookbooks/mu-tools/files/redhat/etc/bashrc +93 -0
- data/cookbooks/mu-tools/files/redhat/etc/freshclam.conf +235 -0
- data/cookbooks/mu-tools/files/redhat/etc/login.defs +72 -0
- data/cookbooks/mu-tools/files/redhat/etc/profile +77 -0
- data/cookbooks/mu-tools/files/redhat/etc/security/limits.conf +57 -0
- data/cookbooks/mu-tools/files/redhat/etc/sysconfig/init +19 -0
- data/cookbooks/mu-tools/files/redhat/etc/sysctl.conf +82 -0
- data/cookbooks/mu-tools/files/redhat-6/README_MU +0 -0
- data/cookbooks/mu-tools/files/redhat-6/etc/audit/stig.rules +173 -0
- data/cookbooks/mu-tools/files/redhat-6/etc/bashrc +90 -0
- data/cookbooks/mu-tools/files/redhat-6/etc/login.defs +70 -0
- data/cookbooks/mu-tools/files/redhat-6/etc/pam.d/su +12 -0
- data/cookbooks/mu-tools/files/redhat-6/etc/profile +83 -0
- data/cookbooks/mu-tools/files/redhat-6/etc/securetty +12 -0
- data/cookbooks/mu-tools/files/redhat-6/etc/sysconfig/init +30 -0
- data/cookbooks/mu-tools/files/redhat-6/etc/sysctl.conf +40 -0
- data/cookbooks/mu-tools/files/redhat-7.1/etc/freshclam.conf +235 -0
- data/cookbooks/mu-tools/files/ubuntu-12.04/etc/bash.bashrc +64 -0
- data/cookbooks/mu-tools/files/ubuntu-12.04/etc/common-session +30 -0
- data/cookbooks/mu-tools/files/ubuntu-12.04/etc/login.defs +338 -0
- data/cookbooks/mu-tools/files/ubuntu-12.04/etc/profile +30 -0
- data/cookbooks/mu-tools/files/ubuntu-12.04/etc/security/limits.conf +56 -0
- data/cookbooks/mu-tools/files/ubuntu-12.04/etc/sysctl.conf +60 -0
- data/cookbooks/mu-tools/libraries/helper.rb +292 -0
- data/cookbooks/mu-tools/metadata.rb +28 -0
- data/cookbooks/mu-tools/recipes/add_admin_ssh_keys.rb +35 -0
- data/cookbooks/mu-tools/recipes/apply_security.rb +440 -0
- data/cookbooks/mu-tools/recipes/aws_api.rb +23 -0
- data/cookbooks/mu-tools/recipes/base_repositories.rb +31 -0
- data/cookbooks/mu-tools/recipes/cisbenchmark.rb +59 -0
- data/cookbooks/mu-tools/recipes/clamav.rb +53 -0
- data/cookbooks/mu-tools/recipes/cloudinit.rb +58 -0
- data/cookbooks/mu-tools/recipes/configure_oracle_tools.rb +81 -0
- data/cookbooks/mu-tools/recipes/disable-requiretty.rb +22 -0
- data/cookbooks/mu-tools/recipes/ebs_rolling_snapshots.rb +75 -0
- data/cookbooks/mu-tools/recipes/efs.rb +70 -0
- data/cookbooks/mu-tools/recipes/eks.rb +160 -0
- data/cookbooks/mu-tools/recipes/gcloud.rb +98 -0
- data/cookbooks/mu-tools/recipes/google_api.rb +25 -0
- data/cookbooks/mu-tools/recipes/maldet.rb +67 -0
- data/cookbooks/mu-tools/recipes/nagios.rb +19 -0
- data/cookbooks/mu-tools/recipes/newclient.rb +23 -0
- data/cookbooks/mu-tools/recipes/nrpe.rb +115 -0
- data/cookbooks/mu-tools/recipes/python_pip.rb +35 -0
- data/cookbooks/mu-tools/recipes/retrieve_application.rb +51 -0
- data/cookbooks/mu-tools/recipes/rsyslog.rb +65 -0
- data/cookbooks/mu-tools/recipes/set_local_fw.rb +57 -0
- data/cookbooks/mu-tools/recipes/set_mu_hostname.rb +81 -0
- data/cookbooks/mu-tools/recipes/split_var_partitions.rb +86 -0
- data/cookbooks/mu-tools/recipes/splunk-client.rb +69 -0
- data/cookbooks/mu-tools/recipes/splunk-server.rb +104 -0
- data/cookbooks/mu-tools/recipes/store_inspec_attr.rb +8 -0
- data/cookbooks/mu-tools/recipes/updates.rb +96 -0
- data/cookbooks/mu-tools/recipes/windows-client.rb +202 -0
- data/cookbooks/mu-tools/resources/aws_windows.rb +33 -0
- data/cookbooks/mu-tools/resources/disk.rb +88 -0
- data/cookbooks/mu-tools/resources/mommacat_request.rb +11 -0
- data/cookbooks/mu-tools/resources/scheduled_tasks.rb +29 -0
- data/cookbooks/mu-tools/resources/sshd_service.rb +45 -0
- data/cookbooks/mu-tools/resources/windows_users.rb +242 -0
- data/cookbooks/mu-tools/templates/amazon/sshd_config.erb +168 -0
- data/cookbooks/mu-tools/templates/centos-6/sshd_config.erb +212 -0
- data/cookbooks/mu-tools/templates/centos-7/sshd_config.erb +215 -0
- data/cookbooks/mu-tools/templates/default/0-mu-log-client.conf.erb +13 -0
- data/cookbooks/mu-tools/templates/default/conf.maldet.erb +137 -0
- data/cookbooks/mu-tools/templates/default/etc_hosts.erb +30 -0
- data/cookbooks/mu-tools/templates/default/etc_pamd_password-auth.erb +14 -0
- data/cookbooks/mu-tools/templates/default/etc_pamd_system-auth.erb +14 -0
- data/cookbooks/mu-tools/templates/default/etc_sysconfig_network.erb +12 -0
- data/cookbooks/mu-tools/templates/default/kubeconfig.erb +29 -0
- data/cookbooks/mu-tools/templates/default/kubelet.service.erb +35 -0
- data/cookbooks/mu-tools/templates/default/maldet_scanall.sh.erb +15 -0
- data/cookbooks/mu-tools/templates/default/nrpe.cfg.erb +233 -0
- data/cookbooks/mu-tools/templates/redhat-6/sshd_config.erb +213 -0
- data/cookbooks/mu-tools/templates/redhat-7/sshd_config.erb +215 -0
- data/cookbooks/mu-tools/templates/ubuntu-12.04/sshd_config.erb +146 -0
- data/cookbooks/mu-tools/templates/ubuntu-14.04/sshd_config.erb +145 -0
- data/cookbooks/mu-tools/templates/windows/Backup.xml.erb +20 -0
- data/cookbooks/mu-tools/templates/windows/bkupInfo.xml.erb +1 -0
- data/cookbooks/mu-tools/templates/windows/gpreprt.xml.erb +214 -0
- data/cookbooks/mu-tools/templates/windows/gptmpl.inf.erb +12 -0
- data/cookbooks/mu-tools/templates/windows/manifest.xml.erb +1 -0
- data/cookbooks/mu-tools/templates/windows/set_ad_dns_scheduled_task.ps1.erb +6 -0
- data/cookbooks/mu-tools/templates/windows/sshd_config.erb +136 -0
- data/cookbooks/mu-utility/CHANGELOG.md +12 -0
- data/cookbooks/mu-utility/LICENSE +37 -0
- data/cookbooks/mu-utility/README.md +6 -0
- data/cookbooks/mu-utility/attributes/default.rb +1 -0
- data/cookbooks/mu-utility/libraries/matchers.rb +21 -0
- data/cookbooks/mu-utility/metadata.rb +16 -0
- data/cookbooks/mu-utility/recipes/apt.rb +23 -0
- data/cookbooks/mu-utility/recipes/cleanup_image_helper.rb +118 -0
- data/cookbooks/mu-utility/recipes/iptables.rb +26 -0
- data/cookbooks/mu-utility/recipes/luks.rb +18 -0
- data/cookbooks/mu-utility/recipes/nat.rb +104 -0
- data/cookbooks/mu-utility/recipes/php.rb +33 -0
- data/cookbooks/mu-utility/recipes/rdp_gateway.rb +83 -0
- data/cookbooks/mu-utility/recipes/remi.rb +44 -0
- data/cookbooks/mu-utility/recipes/vim.rb +26 -0
- data/cookbooks/mu-utility/recipes/windows_basics.rb +37 -0
- data/cookbooks/mu-utility/recipes/zip.rb +26 -0
- data/cookbooks/mu-utility/templates/default/BundleConfig.xml.erb +34 -0
- data/cookbooks/mu-utility/templates/default/config.xml.erb +60 -0
- data/cookbooks/nagios/Berksfile +8 -0
- data/cookbooks/nagios/CHANGELOG.md +589 -0
- data/cookbooks/nagios/CONTRIBUTING.md +11 -0
- data/cookbooks/nagios/LICENSE +37 -0
- data/cookbooks/nagios/README.md +328 -0
- data/cookbooks/nagios/TESTING.md +2 -0
- data/cookbooks/nagios/attributes/config.rb +171 -0
- data/cookbooks/nagios/attributes/default.rb +228 -0
- data/cookbooks/nagios/chefignore +102 -0
- data/cookbooks/nagios/definitions/command.rb +33 -0
- data/cookbooks/nagios/definitions/contact.rb +33 -0
- data/cookbooks/nagios/definitions/contactgroup.rb +33 -0
- data/cookbooks/nagios/definitions/host.rb +33 -0
- data/cookbooks/nagios/definitions/hostdependency.rb +33 -0
- data/cookbooks/nagios/definitions/hostescalation.rb +34 -0
- data/cookbooks/nagios/definitions/hostgroup.rb +33 -0
- data/cookbooks/nagios/definitions/nagios_conf.rb +38 -0
- data/cookbooks/nagios/definitions/resource.rb +33 -0
- data/cookbooks/nagios/definitions/service.rb +33 -0
- data/cookbooks/nagios/definitions/servicedependency.rb +33 -0
- data/cookbooks/nagios/definitions/serviceescalation.rb +34 -0
- data/cookbooks/nagios/definitions/servicegroup.rb +33 -0
- data/cookbooks/nagios/definitions/timeperiod.rb +33 -0
- data/cookbooks/nagios/libraries/base.rb +314 -0
- data/cookbooks/nagios/libraries/command.rb +91 -0
- data/cookbooks/nagios/libraries/contact.rb +230 -0
- data/cookbooks/nagios/libraries/contactgroup.rb +112 -0
- data/cookbooks/nagios/libraries/custom_option.rb +36 -0
- data/cookbooks/nagios/libraries/data_bag_helper.rb +23 -0
- data/cookbooks/nagios/libraries/default.rb +90 -0
- data/cookbooks/nagios/libraries/host.rb +412 -0
- data/cookbooks/nagios/libraries/hostdependency.rb +181 -0
- data/cookbooks/nagios/libraries/hostescalation.rb +173 -0
- data/cookbooks/nagios/libraries/hostgroup.rb +119 -0
- data/cookbooks/nagios/libraries/nagios.rb +282 -0
- data/cookbooks/nagios/libraries/resource.rb +59 -0
- data/cookbooks/nagios/libraries/service.rb +455 -0
- data/cookbooks/nagios/libraries/servicedependency.rb +215 -0
- data/cookbooks/nagios/libraries/serviceescalation.rb +195 -0
- data/cookbooks/nagios/libraries/servicegroup.rb +144 -0
- data/cookbooks/nagios/libraries/timeperiod.rb +160 -0
- data/cookbooks/nagios/libraries/users_helper.rb +54 -0
- data/cookbooks/nagios/metadata.rb +25 -0
- data/cookbooks/nagios/recipes/_load_databag_config.rb +153 -0
- data/cookbooks/nagios/recipes/_load_default_config.rb +241 -0
- data/cookbooks/nagios/recipes/apache.rb +48 -0
- data/cookbooks/nagios/recipes/default.rb +204 -0
- data/cookbooks/nagios/recipes/nginx.rb +82 -0
- data/cookbooks/nagios/recipes/pagerduty.rb +143 -0
- data/cookbooks/nagios/recipes/server_package.rb +40 -0
- data/cookbooks/nagios/recipes/server_source.rb +164 -0
- data/cookbooks/nagios/templates/default/apache2.conf.erb +96 -0
- data/cookbooks/nagios/templates/default/cgi.cfg.erb +266 -0
- data/cookbooks/nagios/templates/default/commands.cfg.erb +13 -0
- data/cookbooks/nagios/templates/default/contacts.cfg.erb +37 -0
- data/cookbooks/nagios/templates/default/hostgroups.cfg.erb +25 -0
- data/cookbooks/nagios/templates/default/hosts.cfg.erb +15 -0
- data/cookbooks/nagios/templates/default/htpasswd.users.erb +6 -0
- data/cookbooks/nagios/templates/default/nagios.cfg.erb +22 -0
- data/cookbooks/nagios/templates/default/nginx.conf.erb +62 -0
- data/cookbooks/nagios/templates/default/pagerduty.cgi.erb +185 -0
- data/cookbooks/nagios/templates/default/resource.cfg.erb +27 -0
- data/cookbooks/nagios/templates/default/servicedependencies.cfg.erb +15 -0
- data/cookbooks/nagios/templates/default/servicegroups.cfg.erb +14 -0
- data/cookbooks/nagios/templates/default/services.cfg.erb +14 -0
- data/cookbooks/nagios/templates/default/templates.cfg.erb +31 -0
- data/cookbooks/nagios/templates/default/timeperiods.cfg.erb +13 -0
- data/cookbooks/s3fs/CHANGELOG.md +13 -0
- data/cookbooks/s3fs/LICENSE +37 -0
- data/cookbooks/s3fs/README.md +6 -0
- data/cookbooks/s3fs/attributes/default.rb +15 -0
- data/cookbooks/s3fs/files/default/fuse-2.9.3.zip +0 -0
- data/cookbooks/s3fs/metadata.rb +16 -0
- data/cookbooks/s3fs/recipes/default.rb +91 -0
- data/data_bags/demo/app.json +7 -0
- data/data_bags/nagios_services/chef.json +6 -0
- data/data_bags/nagios_services/linux_diskspace.json +5 -0
- data/data_bags/nagios_services/momma_cat.json +6 -0
- data/data_bags/nagios_services/mu-master-memory.json +5 -0
- data/data_bags/nagios_services/nagios_ui.json +6 -0
- data/data_bags/nagios_services/node_ssh.json +6 -0
- data/data_bags/nagios_services/ssh.json +6 -0
- data/demo/lambda_test.yaml +29 -0
- data/environments/DEV.json +8 -0
- data/environments/PROD.json +8 -0
- data/environments/dev.json +8 -0
- data/environments/development.json +8 -0
- data/environments/prod.json +8 -0
- data/extras/README.md +1 -0
- data/extras/admin-role-binding.yaml +16 -0
- data/extras/admin-user.yaml +6 -0
- data/extras/aws-auth-cm.yaml.erb +12 -0
- data/extras/clean-stock-amis +48 -0
- data/extras/git-fix-permissions-hook +12 -0
- data/extras/gitlab-eks-helper.sh.erb +20 -0
- data/extras/image-generators/README.md +2 -0
- data/extras/image-generators/aws/centos6.yaml +18 -0
- data/extras/image-generators/aws/centos7-govcloud.yaml +24 -0
- data/extras/image-generators/aws/centos7.yaml +17 -0
- data/extras/image-generators/aws/rhel7.yaml +17 -0
- data/extras/image-generators/aws/win2k12.yaml +16 -0
- data/extras/image-generators/aws/win2k16.yaml +16 -0
- data/extras/image-generators/aws/windows.yaml +18 -0
- data/extras/image-generators/gcp/centos6.yaml +17 -0
- data/extras/lambda_waf_domain_blacklist.py +103 -0
- data/extras/platform_berksfile_base +50 -0
- data/extras/ruby_rpm/build.sh +17 -0
- data/extras/ruby_rpm/muby.spec +44 -0
- data/extras/vault_tools/README.md +6 -0
- data/extras/vault_tools/export_vaults.sh +3 -0
- data/extras/vault_tools/recreate_vaults.sh +5 -0
- data/extras/vault_tools/test_vaults.sh +5 -0
- data/install/README.md +8 -0
- data/install/cfn_create_mu_master.json +1034 -0
- data/install/chef-server.rb.erb +19 -0
- data/install/deprecated-bash-library.sh +1891 -0
- data/install/images/Usage.png +0 -0
- data/install/installer +71 -0
- data/install/jenkinskeys.rb +8 -0
- data/install/user-dot-murc.erb +14 -0
- data/modules/html.erb +19 -0
- data/modules/mommacat.ru +426 -0
- data/modules/mu/cleanup.rb +339 -0
- data/modules/mu/cloud.rb +1446 -0
- data/modules/mu/clouds/README.md +201 -0
- data/modules/mu/clouds/aws/alarm.rb +319 -0
- data/modules/mu/clouds/aws/cache_cluster.rb +1010 -0
- data/modules/mu/clouds/aws/collection.rb +373 -0
- data/modules/mu/clouds/aws/container_cluster.rb +667 -0
- data/modules/mu/clouds/aws/database.rb +1836 -0
- data/modules/mu/clouds/aws/dnszone.rb +911 -0
- data/modules/mu/clouds/aws/firewall_rule.rb +641 -0
- data/modules/mu/clouds/aws/folder.rb +92 -0
- data/modules/mu/clouds/aws/function.rb +349 -0
- data/modules/mu/clouds/aws/group.rb +251 -0
- data/modules/mu/clouds/aws/loadbalancer.rb +888 -0
- data/modules/mu/clouds/aws/log.rb +363 -0
- data/modules/mu/clouds/aws/msg_queue.rb +480 -0
- data/modules/mu/clouds/aws/notification.rb +139 -0
- data/modules/mu/clouds/aws/role.rb +656 -0
- data/modules/mu/clouds/aws/search_domain.rb +646 -0
- data/modules/mu/clouds/aws/server.rb +2294 -0
- data/modules/mu/clouds/aws/server_pool.rb +1388 -0
- data/modules/mu/clouds/aws/storage_pool.rb +495 -0
- data/modules/mu/clouds/aws/user.rb +382 -0
- data/modules/mu/clouds/aws/userdata/README.md +4 -0
- data/modules/mu/clouds/aws/userdata/linux.erb +179 -0
- data/modules/mu/clouds/aws/userdata/windows.erb +278 -0
- data/modules/mu/clouds/aws/vpc.rb +1943 -0
- data/modules/mu/clouds/aws.rb +1009 -0
- data/modules/mu/clouds/cloudformation/alarm.rb +146 -0
- data/modules/mu/clouds/cloudformation/cache_cluster.rb +167 -0
- data/modules/mu/clouds/cloudformation/collection.rb +117 -0
- data/modules/mu/clouds/cloudformation/database.rb +278 -0
- data/modules/mu/clouds/cloudformation/dnszone.rb +274 -0
- data/modules/mu/clouds/cloudformation/firewall_rule.rb +308 -0
- data/modules/mu/clouds/cloudformation/loadbalancer.rb +193 -0
- data/modules/mu/clouds/cloudformation/log.rb +170 -0
- data/modules/mu/clouds/cloudformation/server.rb +370 -0
- data/modules/mu/clouds/cloudformation/server_pool.rb +279 -0
- data/modules/mu/clouds/cloudformation/vpc.rb +322 -0
- data/modules/mu/clouds/cloudformation.rb +733 -0
- data/modules/mu/clouds/docker.rb +30 -0
- data/modules/mu/clouds/google/container_cluster.rb +290 -0
- data/modules/mu/clouds/google/database.rb +152 -0
- data/modules/mu/clouds/google/firewall_rule.rb +267 -0
- data/modules/mu/clouds/google/group.rb +164 -0
- data/modules/mu/clouds/google/loadbalancer.rb +479 -0
- data/modules/mu/clouds/google/server.rb +1510 -0
- data/modules/mu/clouds/google/server_pool.rb +274 -0
- data/modules/mu/clouds/google/user.rb +266 -0
- data/modules/mu/clouds/google/userdata/README.md +4 -0
- data/modules/mu/clouds/google/userdata/linux.erb +137 -0
- data/modules/mu/clouds/google/userdata/windows.erb +275 -0
- data/modules/mu/clouds/google/vpc.rb +890 -0
- data/modules/mu/clouds/google.rb +811 -0
- data/modules/mu/config/README.md +11 -0
- data/modules/mu/config/alarm.rb +271 -0
- data/modules/mu/config/cache_cluster.rb +172 -0
- data/modules/mu/config/collection.rb +87 -0
- data/modules/mu/config/container_cluster.rb +103 -0
- data/modules/mu/config/container_cluster.yml +36 -0
- data/modules/mu/config/database.rb +458 -0
- data/modules/mu/config/database.yml +26 -0
- data/modules/mu/config/dnszone.rb +327 -0
- data/modules/mu/config/firewall_rule.rb +118 -0
- data/modules/mu/config/folder.rb +70 -0
- data/modules/mu/config/function.rb +140 -0
- data/modules/mu/config/group.rb +64 -0
- data/modules/mu/config/loadbalancer.rb +482 -0
- data/modules/mu/config/log.rb +47 -0
- data/modules/mu/config/log.yml +6 -0
- data/modules/mu/config/msg_queue.rb +47 -0
- data/modules/mu/config/msg_queue.yml +9 -0
- data/modules/mu/config/notification.rb +44 -0
- data/modules/mu/config/project.rb +71 -0
- data/modules/mu/config/role.rb +102 -0
- data/modules/mu/config/search_domain.rb +61 -0
- data/modules/mu/config/search_domain.yml +25 -0
- data/modules/mu/config/server.rb +587 -0
- data/modules/mu/config/server.yml +8 -0
- data/modules/mu/config/server_pool.rb +216 -0
- data/modules/mu/config/server_pool.yml +71 -0
- data/modules/mu/config/storage_pool.rb +145 -0
- data/modules/mu/config/user.rb +78 -0
- data/modules/mu/config/vpc.rb +743 -0
- data/modules/mu/config/vpc.yml +6 -0
- data/modules/mu/config.rb +2000 -0
- data/modules/mu/defaults/README.md +2 -0
- data/modules/mu/defaults/amazon_images.yaml +121 -0
- data/modules/mu/defaults/google_images.yaml +16 -0
- data/modules/mu/deploy.rb +686 -0
- data/modules/mu/groomer.rb +123 -0
- data/modules/mu/groomers/README.md +58 -0
- data/modules/mu/groomers/chef.rb +1024 -0
- data/modules/mu/kittens.rb +11319 -0
- data/modules/mu/logger.rb +208 -0
- data/modules/mu/master/README.md +27 -0
- data/modules/mu/master/chef.rb +471 -0
- data/modules/mu/master/ldap.rb +1005 -0
- data/modules/mu/master.rb +415 -0
- data/modules/mu/mommacat.rb +2703 -0
- data/modules/mu-load-config.rb +1 -0
- data/modules/mu.rb +724 -0
- data/modules/scratchpad.erb +1 -0
- data/modules/tests/super_complex_bok.yml +41 -0
- data/modules/tests/super_simple_bok.yml +40 -0
- data/mu.gemspec +62 -0
- data/roles/demo-dbservice-configure.json +19 -0
- data/roles/demo-portal-configure.json +19 -0
- data/roles/mu-master-jenkins.json +24 -0
- data/roles/mu-master-nagios-only.json +13 -0
- data/roles/mu-master.json +12 -0
- data/roles/mu-node.json +19 -0
- data/roles/mu-splunk-server.json +13 -0
- data/roles/mu-splunk.json +13 -0
- data/test/clean_up.py +25 -0
- data/test/demo-test-profile/README.md +3 -0
- data/test/demo-test-profile/controls/flask.rb +84 -0
- data/test/demo-test-profile/inspec.lock +7 -0
- data/test/demo-test-profile/inspec.yml +11 -0
- data/test/etco-test-profile/README.md +3 -0
- data/test/etco-test-profile/controls/all-in-one.rb +182 -0
- data/test/etco-test-profile/inspec.lock +7 -0
- data/test/etco-test-profile/inspec.yml +11 -0
- data/test/exec_inspec.py +246 -0
- data/test/exec_mu_install.py +241 -0
- data/test/exec_retry.py +44 -0
- data/test/mu-master-test/README.md +3 -0
- data/test/mu-master-test/controls/all_in_one.rb +557 -0
- data/test/mu-master-test/inspec.lock +3 -0
- data/test/mu-master-test/inspec.yml +11 -0
- data/test/mu-tools-test/README.md +3 -0
- data/test/mu-tools-test/controls/base.rb +265 -0
- data/test/mu-tools-test/inspec.lock +3 -0
- data/test/mu-tools-test/inspec.yml +8 -0
- data/test/simple-server-php-test/README.md +3 -0
- data/test/simple-server-php-test/controls/apachephp.rb +25 -0
- data/test/simple-server-php-test/controls/example.rb +19 -0
- data/test/simple-server-php-test/inspec.lock +7 -0
- data/test/simple-server-php-test/inspec.yml +12 -0
- data/test/simple-server-rails-test/README.md +3 -0
- data/test/simple-server-rails-test/controls/rails.rb +188 -0
- data/test/simple-server-rails-test/inspec.lock +7 -0
- data/test/simple-server-rails-test/inspec.yml +11 -0
- data/test/simple-windows-test/README.md +3 -0
- data/test/simple-windows-test/controls/windows.rb +20 -0
- data/test/simple-windows-test/inspec.lock +7 -0
- data/test/simple-windows-test/inspec.yml +11 -0
- data/test/smoke_test.rb +75 -0
- data/test/wordpress-test/README.md +3 -0
- data/test/wordpress-test/controls/wordpress.rb +97 -0
- data/test/wordpress-test/inspec.lock +7 -0
- data/test/wordpress-test/inspec.yml +11 -0
- 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
|