simp-cli 1.0.12
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 +15 -0
- data/LICENSE +27 -0
- data/README.md +48 -0
- data/Rakefile +142 -0
- data/bin/simp +5 -0
- data/lib/simp/cli.rb +88 -0
- data/lib/simp/cli/commands/bootstrap.rb +275 -0
- data/lib/simp/cli/commands/check.rb +163 -0
- data/lib/simp/cli/commands/cleancerts.rb +114 -0
- data/lib/simp/cli/commands/config.rb +235 -0
- data/lib/simp/cli/commands/doc.rb +14 -0
- data/lib/simp/cli/commands/passgen.rb +128 -0
- data/lib/simp/cli/commands/puppeteval.rb +82 -0
- data/lib/simp/cli/commands/runpuppet.rb +95 -0
- data/lib/simp/cli/config/item.rb +456 -0
- data/lib/simp/cli/config/item/add_ldap_to_hiera.rb +43 -0
- data/lib/simp/cli/config/item/answers_yaml_file_writer.rb +58 -0
- data/lib/simp/cli/config/item/certificates.rb +39 -0
- data/lib/simp/cli/config/item/client_nets.rb +65 -0
- data/lib/simp/cli/config/item/common_runlevel_default.rb +32 -0
- data/lib/simp/cli/config/item/dns_search.rb +48 -0
- data/lib/simp/cli/config/item/dns_servers.rb +57 -0
- data/lib/simp/cli/config/item/failover_log_servers.rb +27 -0
- data/lib/simp/cli/config/item/gateway.rb +32 -0
- data/lib/simp/cli/config/item/grub_password.rb +51 -0
- data/lib/simp/cli/config/item/hostname.rb +24 -0
- data/lib/simp/cli/config/item/hostname_conf.rb +48 -0
- data/lib/simp/cli/config/item/ipaddress.rb +46 -0
- data/lib/simp/cli/config/item/is_master_yum_server.rb +23 -0
- data/lib/simp/cli/config/item/ldap_base_dn.rb +38 -0
- data/lib/simp/cli/config/item/ldap_bind_dn.rb +34 -0
- data/lib/simp/cli/config/item/ldap_bind_hash.rb +28 -0
- data/lib/simp/cli/config/item/ldap_bind_pw.rb +24 -0
- data/lib/simp/cli/config/item/ldap_master.rb +33 -0
- data/lib/simp/cli/config/item/ldap_root_dn.rb +42 -0
- data/lib/simp/cli/config/item/ldap_root_hash.rb +35 -0
- data/lib/simp/cli/config/item/ldap_sync_dn.rb +24 -0
- data/lib/simp/cli/config/item/ldap_sync_hash.rb +28 -0
- data/lib/simp/cli/config/item/ldap_sync_pw.rb +26 -0
- data/lib/simp/cli/config/item/ldap_uri.rb +43 -0
- data/lib/simp/cli/config/item/log_servers.rb +27 -0
- data/lib/simp/cli/config/item/netmask.rb +39 -0
- data/lib/simp/cli/config/item/network_conf.rb +63 -0
- data/lib/simp/cli/config/item/network_dhcp.rb +27 -0
- data/lib/simp/cli/config/item/network_interface.rb +41 -0
- data/lib/simp/cli/config/item/network_setup_nic.rb +28 -0
- data/lib/simp/cli/config/item/ntp_servers.rb +69 -0
- data/lib/simp/cli/config/item/puppet_autosign.rb +66 -0
- data/lib/simp/cli/config/item/puppet_ca.rb +31 -0
- data/lib/simp/cli/config/item/puppet_ca_port.rb +28 -0
- data/lib/simp/cli/config/item/puppet_conf.rb +98 -0
- data/lib/simp/cli/config/item/puppet_fileserver.rb +104 -0
- data/lib/simp/cli/config/item/puppet_hosts_entry.rb +44 -0
- data/lib/simp/cli/config/item/puppet_server.rb +30 -0
- data/lib/simp/cli/config/item/puppet_server_ip.rb +25 -0
- data/lib/simp/cli/config/item/puppetdb_port.rb +25 -0
- data/lib/simp/cli/config/item/puppetdb_server.rb +26 -0
- data/lib/simp/cli/config/item/remove_ldap_from_hiera.rb +47 -0
- data/lib/simp/cli/config/item/rename_fqdn_yaml.rb +40 -0
- data/lib/simp/cli/config/item/rsync_base.rb +37 -0
- data/lib/simp/cli/config/item/rsync_server.rb +44 -0
- data/lib/simp/cli/config/item/rsync_timeout.rb +26 -0
- data/lib/simp/cli/config/item/set_grub_password.rb +19 -0
- data/lib/simp/cli/config/item/simp_yum_servers.rb +30 -0
- data/lib/simp/cli/config/item/use_auditd.rb +19 -0
- data/lib/simp/cli/config/item/use_fips.rb +46 -0
- data/lib/simp/cli/config/item/use_iptables.rb +22 -0
- data/lib/simp/cli/config/item/use_ldap.rb +19 -0
- data/lib/simp/cli/config/item/use_selinux.rb +32 -0
- data/lib/simp/cli/config/item/yum_repositories.rb +75 -0
- data/lib/simp/cli/config/item_list_factory.rb +236 -0
- data/lib/simp/cli/config/questionnaire.rb +86 -0
- data/lib/simp/cli/config/utils.rb +128 -0
- data/lib/simp/cli/lib/utils.rb +114 -0
- data/lib/simp/simp.rb +77 -0
- data/spec/lib/simp/cli/commands/config_spec.rb +42 -0
- data/spec/lib/simp/cli/config/item/add_ldap_to_hiera_spec.rb +58 -0
- data/spec/lib/simp/cli/config/item/answers_yaml_file_writer_spec.rb +86 -0
- data/spec/lib/simp/cli/config/item/certificates_spec.rb +50 -0
- data/spec/lib/simp/cli/config/item/client_nets_spec.rb +66 -0
- data/spec/lib/simp/cli/config/item/common_runlevel_default_spec.rb +27 -0
- data/spec/lib/simp/cli/config/item/dns_search_spec.rb +74 -0
- data/spec/lib/simp/cli/config/item/dns_servers_spec.rb +76 -0
- data/spec/lib/simp/cli/config/item/failover_log_servers_spec.rb +49 -0
- data/spec/lib/simp/cli/config/item/files/FakeCA/cacertkey +1 -0
- data/spec/lib/simp/cli/config/item/files/FakeCA/gencerts_nopass.sh +10 -0
- data/spec/lib/simp/cli/config/item/files/autosign.conf.new +11 -0
- data/spec/lib/simp/cli/config/item/files/autosign.conf.used +15 -0
- data/spec/lib/simp/cli/config/item/files/fileserver.conf +41 -0
- data/spec/lib/simp/cli/config/item/files/hosts +2 -0
- data/spec/lib/simp/cli/config/item/files/hosts.old_puppet_entry +3 -0
- data/spec/lib/simp/cli/config/item/files/puppet.conf +25 -0
- data/spec/lib/simp/cli/config/item/files/puppet.your.domain.yaml +21 -0
- data/spec/lib/simp/cli/config/item/files/resolv.conf__multiple +10 -0
- data/spec/lib/simp/cli/config/item/files/resolv.conf__single +4 -0
- data/spec/lib/simp/cli/config/item/files/rsyncd.conf +225 -0
- data/spec/lib/simp/cli/config/item/gateway_spec.rb +23 -0
- data/spec/lib/simp/cli/config/item/grub_password_spec.rb +24 -0
- data/spec/lib/simp/cli/config/item/hostname_conf_spec.rb +27 -0
- data/spec/lib/simp/cli/config/item/hostname_spec.rb +22 -0
- data/spec/lib/simp/cli/config/item/ipaddress_spec.rb +40 -0
- data/spec/lib/simp/cli/config/item/is_master_yum_server_spec.rb +29 -0
- data/spec/lib/simp/cli/config/item/ldap_base_dn_spec.rb +23 -0
- data/spec/lib/simp/cli/config/item/ldap_bind_dn_spec.rb +23 -0
- data/spec/lib/simp/cli/config/item/ldap_bind_hash_spec.rb +23 -0
- data/spec/lib/simp/cli/config/item/ldap_bind_pw_spec.rb +21 -0
- data/spec/lib/simp/cli/config/item/ldap_master_spec.rb +37 -0
- data/spec/lib/simp/cli/config/item/ldap_root_dn_spec.rb +23 -0
- data/spec/lib/simp/cli/config/item/ldap_root_hash_spec.rb +23 -0
- data/spec/lib/simp/cli/config/item/ldap_sync_dn_spec.rb +22 -0
- data/spec/lib/simp/cli/config/item/ldap_sync_hash_spec.rb +23 -0
- data/spec/lib/simp/cli/config/item/ldap_sync_pw_spec.rb +21 -0
- data/spec/lib/simp/cli/config/item/ldap_uri_spec.rb +32 -0
- data/spec/lib/simp/cli/config/item/log_servers_spec.rb +49 -0
- data/spec/lib/simp/cli/config/item/netmask_spec.rb +28 -0
- data/spec/lib/simp/cli/config/item/network_conf_spec.rb +63 -0
- data/spec/lib/simp/cli/config/item/network_dhcp_spec.rb +11 -0
- data/spec/lib/simp/cli/config/item/network_interface_spec.rb +26 -0
- data/spec/lib/simp/cli/config/item/network_setup_nic_spec.rb +29 -0
- data/spec/lib/simp/cli/config/item/ntp_servers_spec.rb +43 -0
- data/spec/lib/simp/cli/config/item/puppet_autosign_spec.rb +55 -0
- data/spec/lib/simp/cli/config/item/puppet_ca_port_spec.rb +23 -0
- data/spec/lib/simp/cli/config/item/puppet_ca_spec.rb +22 -0
- data/spec/lib/simp/cli/config/item/puppet_conf_spec.rb +110 -0
- data/spec/lib/simp/cli/config/item/puppet_fileserver_spec.rb +53 -0
- data/spec/lib/simp/cli/config/item/puppet_hosts_entry_spec.rb +85 -0
- data/spec/lib/simp/cli/config/item/puppet_server_ip_spec.rb +24 -0
- data/spec/lib/simp/cli/config/item/puppet_server_spec.rb +22 -0
- data/spec/lib/simp/cli/config/item/puppetdb_port_spec.rb +25 -0
- data/spec/lib/simp/cli/config/item/puppetdb_server_spec.rb +25 -0
- data/spec/lib/simp/cli/config/item/remove_ldap_from_hiera_spec.rb +58 -0
- data/spec/lib/simp/cli/config/item/rename_fqdn_yaml_spec.rb +63 -0
- data/spec/lib/simp/cli/config/item/rsync_base_spec.rb +28 -0
- data/spec/lib/simp/cli/config/item/rsync_server_spec.rb +41 -0
- data/spec/lib/simp/cli/config/item/rsync_timeout_spec.rb +21 -0
- data/spec/lib/simp/cli/config/item/set_grub_password_spec.rb +29 -0
- data/spec/lib/simp/cli/config/item/simp_yum_servers_spec.rb +41 -0
- data/spec/lib/simp/cli/config/item/spec_helper.rb +22 -0
- data/spec/lib/simp/cli/config/item/use_auditd_spec.rb +29 -0
- data/spec/lib/simp/cli/config/item/use_fips_spec.rb +29 -0
- data/spec/lib/simp/cli/config/item/use_iptables_spec.rb +29 -0
- data/spec/lib/simp/cli/config/item/use_ldap_spec.rb +29 -0
- data/spec/lib/simp/cli/config/item/use_selinux_spec.rb +24 -0
- data/spec/lib/simp/cli/config/item/yum_repositories_spec.rb +94 -0
- data/spec/lib/simp/cli/config/item_spec.rb +106 -0
- data/spec/lib/simp/cli/config/spec_helper.rb +1 -0
- data/spec/lib/simp/cli/config/utils_spec.rb +131 -0
- data/spec/lib/simp/cli/spec_helper.rb +1 -0
- data/spec/spec_helper.rb +91 -0
- metadata +391 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
require 'highline/import'
|
|
2
|
+
require File.expand_path( '../item', File.dirname(__FILE__) )
|
|
3
|
+
require File.expand_path( '../utils', File.dirname(__FILE__) )
|
|
4
|
+
|
|
5
|
+
module Simp; end
|
|
6
|
+
class Simp::Cli; end
|
|
7
|
+
module Simp::Cli::Config
|
|
8
|
+
class Item::RsyncBase < Item
|
|
9
|
+
def initialize
|
|
10
|
+
super
|
|
11
|
+
@key = 'rsync::base'
|
|
12
|
+
@description = <<-EOF.gsub(/^ {8}/,'')
|
|
13
|
+
Several modules use rsync as a means of pulling down large
|
|
14
|
+
collections of files. This provides a single point of configuration
|
|
15
|
+
for the system defaults.
|
|
16
|
+
|
|
17
|
+
Individual modules can be overridden as required.
|
|
18
|
+
EOF
|
|
19
|
+
if Facter.value('lsbmajdistrelease') < '7' then
|
|
20
|
+
@base_dir = '/srv/rsync'
|
|
21
|
+
else
|
|
22
|
+
@base_dir = File.exists?( '/var/simp/' ) ? '/var/simp/rsync' : '/srv/simp/rsync'
|
|
23
|
+
@base_dir = "#{@base_dir}/%{::operatingsystem}/%{::lsbmajdistrelease}"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def os_value; nil; end
|
|
28
|
+
|
|
29
|
+
def validate( x )
|
|
30
|
+
x =~ %r{^/} ? true : false
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def recommended_value
|
|
34
|
+
"#{@base_dir}"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require 'highline/import'
|
|
2
|
+
require File.expand_path( '../item', File.dirname(__FILE__) )
|
|
3
|
+
require File.expand_path( '../utils', File.dirname(__FILE__) )
|
|
4
|
+
|
|
5
|
+
module Simp; end
|
|
6
|
+
class Simp::Cli; end
|
|
7
|
+
module Simp::Cli::Config
|
|
8
|
+
class Item::RsyncServer < Item
|
|
9
|
+
attr_accessor :file
|
|
10
|
+
def initialize
|
|
11
|
+
super
|
|
12
|
+
@key = 'rsync::server'
|
|
13
|
+
@description = 'rsync server (usually the primary puppet master)'
|
|
14
|
+
@__warning = false
|
|
15
|
+
@file = '/etc/rsyncd.conf'
|
|
16
|
+
@skip_query = true
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def os_value
|
|
20
|
+
if File.readable?(@file)
|
|
21
|
+
res = File.readlines(@file).grep( /address\s*=/ ){|x| x.split('=').last.strip}
|
|
22
|
+
res.empty? ? nil : res.first
|
|
23
|
+
else
|
|
24
|
+
# only show the FIRST warning
|
|
25
|
+
if !@__warning
|
|
26
|
+
warning = "WARNING: cannot read #{file}"
|
|
27
|
+
say "<%= color(%q{#{warning}}, YELLOW) %>\n" unless @silent
|
|
28
|
+
@__warning = true
|
|
29
|
+
end
|
|
30
|
+
nil
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def recommended_value
|
|
35
|
+
os_value || '127.0.0.1'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def validate item
|
|
39
|
+
( Simp::Cli::Config::Utils.validate_ip( item ) ||
|
|
40
|
+
Simp::Cli::Config::Utils.validate_fqdn( item ) ||
|
|
41
|
+
Simp::Cli::Config::Utils.validate_hostname( item ) )
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'highline/import'
|
|
2
|
+
require File.expand_path( '../item', File.dirname(__FILE__) )
|
|
3
|
+
require File.expand_path( '../utils', File.dirname(__FILE__) )
|
|
4
|
+
|
|
5
|
+
module Simp; end
|
|
6
|
+
class Simp::Cli; end
|
|
7
|
+
module Simp::Cli::Config
|
|
8
|
+
class Item::RsyncTimeout < Item
|
|
9
|
+
def initialize
|
|
10
|
+
super
|
|
11
|
+
@key = 'rsync::timeout'
|
|
12
|
+
@description = 'maximum rsync timeout in seconds. 0 = no timeout'
|
|
13
|
+
@skip_query = true
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def os_value; nil; end
|
|
17
|
+
|
|
18
|
+
def validate( x )
|
|
19
|
+
x.to_s =~ %r{^\d+} ? true : false
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def recommended_value
|
|
23
|
+
'1'
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'highline/import'
|
|
2
|
+
require File.expand_path( '../item', File.dirname(__FILE__) )
|
|
3
|
+
require File.expand_path( '../utils', File.dirname(__FILE__) )
|
|
4
|
+
|
|
5
|
+
module Simp; end
|
|
6
|
+
class Simp::Cli; end
|
|
7
|
+
module Simp::Cli::Config
|
|
8
|
+
class Item::SetGrubPassword < YesNoItem
|
|
9
|
+
def initialize
|
|
10
|
+
super
|
|
11
|
+
@key = 'set_grub_password'
|
|
12
|
+
@description = %Q{Whether or not to set the GRUB password on this system.}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def recommended_value
|
|
16
|
+
os_value || 'yes'
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require "resolv"
|
|
2
|
+
require 'highline/import'
|
|
3
|
+
require File.expand_path( '../item', File.dirname(__FILE__) )
|
|
4
|
+
require File.expand_path( '../utils', File.dirname(__FILE__) )
|
|
5
|
+
|
|
6
|
+
module Simp; end
|
|
7
|
+
class Simp::Cli; end
|
|
8
|
+
module Simp::Cli::Config
|
|
9
|
+
class Item::SimpYumServers < ListItem
|
|
10
|
+
def initialize
|
|
11
|
+
super
|
|
12
|
+
@key = 'simp::yum::servers'
|
|
13
|
+
@description = %Q{Your SIMP yum server(s).}
|
|
14
|
+
@allow_empty_list = true
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def recommended_value
|
|
18
|
+
["%{hiera('puppet::server')}"]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def validate_item item
|
|
22
|
+
(
|
|
23
|
+
Simp::Cli::Config::Utils.validate_hiera_lookup( item ) ||
|
|
24
|
+
Simp::Cli::Config::Utils.validate_hostname( item ) ||
|
|
25
|
+
Simp::Cli::Config::Utils.validate_fqdn( item ) ||
|
|
26
|
+
Simp::Cli::Config::Utils.validate_ip( item )
|
|
27
|
+
)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'highline/import'
|
|
2
|
+
require File.expand_path( '../item', File.dirname(__FILE__) )
|
|
3
|
+
require File.expand_path( '../utils', File.dirname(__FILE__) )
|
|
4
|
+
|
|
5
|
+
module Simp; end
|
|
6
|
+
class Simp::Cli; end
|
|
7
|
+
module Simp::Cli::Config
|
|
8
|
+
class Item::UseAuditd < YesNoItem
|
|
9
|
+
def initialize
|
|
10
|
+
super
|
|
11
|
+
@key = 'use_auditd'
|
|
12
|
+
@description = %q{Whether or not to use auditd on this system.}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def recommended_value
|
|
16
|
+
os_value || 'yes'
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require 'highline/import'
|
|
2
|
+
require File.expand_path( '../item', File.dirname(__FILE__) )
|
|
3
|
+
require File.expand_path( '../utils', File.dirname(__FILE__) )
|
|
4
|
+
|
|
5
|
+
module Simp; end
|
|
6
|
+
class Simp::Cli; end
|
|
7
|
+
module Simp::Cli::Config
|
|
8
|
+
class Item::UseFips < YesNoItem
|
|
9
|
+
include Simp::Cli::Config::SafeApplying
|
|
10
|
+
|
|
11
|
+
def initialize
|
|
12
|
+
super
|
|
13
|
+
@key = 'use_fips'
|
|
14
|
+
@description = %q{Enable FIPS mode on this system.
|
|
15
|
+
|
|
16
|
+
FIPS mode enforces strict compliance with FIPS-140-2. All core SIMP modules
|
|
17
|
+
can support this configuration.
|
|
18
|
+
|
|
19
|
+
IMPORTANT: Be sure you know the security tradeoffs of FIPS-140-2 compliance.
|
|
20
|
+
FIPS mode disables the use of MD5 and may require weaker ciphers or key lengths
|
|
21
|
+
than your security policies allow.
|
|
22
|
+
}
|
|
23
|
+
@allow_user_apply = true
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def os_value
|
|
27
|
+
Facter.value('fips_enabled') ? 'yes' : 'no'
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def recommended_value
|
|
31
|
+
os_value || 'yes'
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def apply
|
|
35
|
+
if @value
|
|
36
|
+
# This is a one-off prep item needed to handle Puppet certs w/FIPS mode
|
|
37
|
+
cmd = %q(puppet config set digest_algorithm sha256)
|
|
38
|
+
puts cmd unless @silent
|
|
39
|
+
%x{#{cmd}}
|
|
40
|
+
else
|
|
41
|
+
puts 'not using FIPS mode: noop'
|
|
42
|
+
true # we applied nothing, successfully!
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require 'highline/import'
|
|
2
|
+
require File.expand_path( '../item', File.dirname(__FILE__) )
|
|
3
|
+
require File.expand_path( '../utils', File.dirname(__FILE__) )
|
|
4
|
+
|
|
5
|
+
module Simp; end
|
|
6
|
+
class Simp::Cli; end
|
|
7
|
+
module Simp::Cli::Config
|
|
8
|
+
class Item::UseIPtables < YesNoItem
|
|
9
|
+
def initialize
|
|
10
|
+
super
|
|
11
|
+
@key = 'use_iptables'
|
|
12
|
+
@description = %Q{Whether or not to use iptables on this system.
|
|
13
|
+
|
|
14
|
+
If there is code that calls the IPTables native type directly, this option may
|
|
15
|
+
not function properly. We are looking into solutions for this issue.}
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def recommended_value
|
|
19
|
+
os_value || 'yes'
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'highline/import'
|
|
2
|
+
require File.expand_path( '../item', File.dirname(__FILE__) )
|
|
3
|
+
require File.expand_path( '../utils', File.dirname(__FILE__) )
|
|
4
|
+
|
|
5
|
+
module Simp; end
|
|
6
|
+
class Simp::Cli; end
|
|
7
|
+
module Simp::Cli::Config
|
|
8
|
+
class Item::UseLdap < YesNoItem
|
|
9
|
+
def initialize
|
|
10
|
+
super
|
|
11
|
+
@key = 'use_ldap'
|
|
12
|
+
@description = %Q{Whether or not to use LDAP on this system.\nIf you disable this, modules will not attempt to use LDAP where possible.}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def recommended_value
|
|
16
|
+
os_value || 'yes'
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'highline/import'
|
|
2
|
+
require File.expand_path( '../item', File.dirname(__FILE__) )
|
|
3
|
+
require File.expand_path( '../utils', File.dirname(__FILE__) )
|
|
4
|
+
|
|
5
|
+
module Simp; end
|
|
6
|
+
class Simp::Cli; end
|
|
7
|
+
module Simp::Cli::Config
|
|
8
|
+
class Item::UseSELinux < Item
|
|
9
|
+
def initialize
|
|
10
|
+
super
|
|
11
|
+
@key = 'selinux::ensure'
|
|
12
|
+
@fact = 'selinux_current_mode'
|
|
13
|
+
@description = %Q{SELinux is good.
|
|
14
|
+
|
|
15
|
+
Not all modules are compatible with SELinux in enforcing mode but the core
|
|
16
|
+
SIMP modules are. You should not take this below 'permissive' unless it is
|
|
17
|
+
truly necessary.}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def validate( x )
|
|
21
|
+
(x.to_s =~ /permissive|disabled|enforcing/i ) ? true : false
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def not_valid_message
|
|
25
|
+
'Must be "enforcing," "permissive," or "disabled" (not recommended)'
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def recommended_value
|
|
29
|
+
os_value || 'enforcing'
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
require "resolv"
|
|
2
|
+
require 'highline/import'
|
|
3
|
+
require File.expand_path( '../item', File.dirname(__FILE__) )
|
|
4
|
+
require File.expand_path( '../utils', File.dirname(__FILE__) )
|
|
5
|
+
|
|
6
|
+
module Simp; end
|
|
7
|
+
class Simp::Cli; end
|
|
8
|
+
module Simp::Cli::Config
|
|
9
|
+
class Item::YumRepositories < ActionItem
|
|
10
|
+
|
|
11
|
+
attr_accessor :www_yum_dir, :yum_repos_d, :yaml_file
|
|
12
|
+
def initialize
|
|
13
|
+
super
|
|
14
|
+
@key = 'yum::repositories'
|
|
15
|
+
@description = %Q{Sets up the yum repositores for SIMP on apply. (apply-only; noop)}
|
|
16
|
+
@www_yum_dir = File.exists?( '/var/www/yum/') ? '/var/www/yum' : '/srv/www/yum'
|
|
17
|
+
@yum_repos_d = '/etc/yum.repos.d'
|
|
18
|
+
@yaml_file = '/etc/puppet/environments/simp/hieradata/hosts/puppet.your.domain.yaml'
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def apply
|
|
22
|
+
result = true
|
|
23
|
+
|
|
24
|
+
# set up yum repos
|
|
25
|
+
say_green 'Updating YUM Updates Repositories (NOTE: This may take some time)' if !@silent
|
|
26
|
+
yumpath = File.join( @www_yum_dir,
|
|
27
|
+
Facter.value('operatingsystem'),
|
|
28
|
+
Facter.value('operatingsystemrelease'),
|
|
29
|
+
Facter.value('architecture')
|
|
30
|
+
)
|
|
31
|
+
begin
|
|
32
|
+
Dir.chdir(yumpath) do
|
|
33
|
+
FileUtils.mkdir('Updates') unless File.directory?('Updates')
|
|
34
|
+
Dir.chdir('Updates') do
|
|
35
|
+
system( %q(find .. -type f -name '*.rpm' -exec ln -sf {} \\;) )
|
|
36
|
+
cmd = 'createrepo -qqq -p --update .'
|
|
37
|
+
if @silent
|
|
38
|
+
cmd << ' &> /dev/null'
|
|
39
|
+
else
|
|
40
|
+
puts cmd
|
|
41
|
+
end
|
|
42
|
+
system(cmd)
|
|
43
|
+
raise RuntimeError "'#{cmd}' failed in #{Dir.pwd}" unless ($?.nil? || $?.success?)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
system("chown -R root:apache #{@www_yum_dir}/ #{ '&> /dev/null' if @silent }")
|
|
47
|
+
system("chmod -R u=rwX,g=rX,o-rwx #{@www_yum_dir}/")
|
|
48
|
+
raise RuntimeError, "chmod -R u=rwX,g=rX,o-rwx #{@www_yum_dir}/ failed!" unless ($?.nil? || $?.success?)
|
|
49
|
+
say_green "Finished configuring Updates repository at #{yumpath}/Updates" if !@silent
|
|
50
|
+
rescue => err
|
|
51
|
+
say_red "ERROR: Something went wrong setting up the Updates repo in #{yumpath}!"
|
|
52
|
+
say_red ' Please make sure your Updates repo is properly configured.'
|
|
53
|
+
say_red "\nError output:\n #{err.class}\n\n #{err}"
|
|
54
|
+
result = false
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# disable any CentOS repo spam
|
|
58
|
+
Dir.chdir( @yum_repos_d ) do
|
|
59
|
+
if ! Dir.glob('CentOS*.repo').empty?
|
|
60
|
+
`grep "\\[*\\]" *CentOS*.repo | cut -d "[" -f2 | cut -d "]" -f1 | xargs yum-config-manager --disable`
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# enable 'simp::yum::enable_simp_repos' in hosts/puppet.your.domain.yaml
|
|
64
|
+
if @config_items.fetch('is_master_yum_server').value && !File.exist?('filesystem.repo')
|
|
65
|
+
cmd = %Q{sed -i '/simp::yum::enable_simp_repos : false/ c\\simp::yum::enable_simp_repos : true' #{@yaml_file}}
|
|
66
|
+
puts cmd if !@silent
|
|
67
|
+
%x{#{cmd}}
|
|
68
|
+
result = result && ($?.nil? || $?.success?)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
result
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
require File.expand_path( 'item', File.dirname(__FILE__) )
|
|
2
|
+
|
|
3
|
+
module Simp; end
|
|
4
|
+
class Simp::Cli; end
|
|
5
|
+
module Simp::Cli::Config; end
|
|
6
|
+
|
|
7
|
+
# Builds an Array of Config::Items
|
|
8
|
+
class Simp::Cli::Config::ItemListFactory
|
|
9
|
+
def initialize( options )
|
|
10
|
+
@options = {
|
|
11
|
+
:verbose => 0,
|
|
12
|
+
:puppet_system_file => '/tmp/out.yaml',
|
|
13
|
+
}.merge( options )
|
|
14
|
+
|
|
15
|
+
# A hash to look up Config::Item values set from other sources (files, cli).
|
|
16
|
+
# for each Hash element:
|
|
17
|
+
# - the key will be the the Config::Item#key
|
|
18
|
+
# - the value will be the @options#value
|
|
19
|
+
@answers_hash = {}
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def process( yaml=nil, answers_hash={} )
|
|
24
|
+
@answers_hash = answers_hash
|
|
25
|
+
|
|
26
|
+
# Require the config items
|
|
27
|
+
rb_files = File.expand_path( '../config/item/*.rb', File.dirname(__FILE__))
|
|
28
|
+
Dir.glob( rb_files ).sort_by(&:to_s).each { |file| require file }
|
|
29
|
+
|
|
30
|
+
items_yaml = yaml || <<-EOF.gsub(/^ {6}/,'')
|
|
31
|
+
# The Config::Item list is really a conditional tree. Some Items can
|
|
32
|
+
# prepend additional Items to the queue, depending on the answer.
|
|
33
|
+
#
|
|
34
|
+
# This YAML describes the full Item structure. The format is:
|
|
35
|
+
#
|
|
36
|
+
# - ItemA
|
|
37
|
+
# - ItemB
|
|
38
|
+
# answer1:
|
|
39
|
+
# - ItemC
|
|
40
|
+
# - ItemD
|
|
41
|
+
# answer2:
|
|
42
|
+
# - ItemE
|
|
43
|
+
# - ItemF
|
|
44
|
+
# - ItemG
|
|
45
|
+
---
|
|
46
|
+
# ==== network ====
|
|
47
|
+
- UseFips
|
|
48
|
+
- NetworkInterface
|
|
49
|
+
- SetupNIC:
|
|
50
|
+
true:
|
|
51
|
+
- DHCP:
|
|
52
|
+
static: # gather info first, then configure network
|
|
53
|
+
- Hostname
|
|
54
|
+
- IPAddress
|
|
55
|
+
- Netmask
|
|
56
|
+
- Gateway
|
|
57
|
+
- DNSServers
|
|
58
|
+
- DNSSearch
|
|
59
|
+
- NetworkConf
|
|
60
|
+
dhcp: # configure network, then get info (silently)
|
|
61
|
+
- NetworkConf
|
|
62
|
+
- Hostname SILENT
|
|
63
|
+
- IPAddress SILENT
|
|
64
|
+
- Netmask SILENT
|
|
65
|
+
- Gateway SILENT
|
|
66
|
+
- DNSServers SILENT
|
|
67
|
+
- DNSSearch SILENT
|
|
68
|
+
false: # don't configure network (but get network info)
|
|
69
|
+
- Hostname
|
|
70
|
+
- IPAddress
|
|
71
|
+
- Netmask
|
|
72
|
+
- Gateway
|
|
73
|
+
- DNSServers
|
|
74
|
+
- DNSSearch
|
|
75
|
+
- HostnameConf
|
|
76
|
+
- ClientNets
|
|
77
|
+
|
|
78
|
+
# ==== globals ====
|
|
79
|
+
- NTPServers NOAPPLY
|
|
80
|
+
- LogServers
|
|
81
|
+
- FailoverLogServers
|
|
82
|
+
- SimpYumServers
|
|
83
|
+
- UseAuditd
|
|
84
|
+
- UseIPtables
|
|
85
|
+
- CommonRunLevelDefault
|
|
86
|
+
- UseSELinux
|
|
87
|
+
- SetGrubPassword:
|
|
88
|
+
true:
|
|
89
|
+
- GrubPassword
|
|
90
|
+
- Certificates
|
|
91
|
+
- IsMasterYumServer
|
|
92
|
+
- YumRepositories
|
|
93
|
+
- RenameFqdnYaml
|
|
94
|
+
|
|
95
|
+
# ==== puppet ====
|
|
96
|
+
- PuppetServer
|
|
97
|
+
- PuppetServerIP
|
|
98
|
+
- PuppetCA
|
|
99
|
+
- PuppetCAPort
|
|
100
|
+
### NOTE: removed since update to puppet server: - PuppetFileServer
|
|
101
|
+
- PuppetAutosign
|
|
102
|
+
- PuppetConf
|
|
103
|
+
- PuppetHostsEntry
|
|
104
|
+
- PuppetDBServer
|
|
105
|
+
- PuppetDBPort
|
|
106
|
+
|
|
107
|
+
# ==== ldap ====
|
|
108
|
+
- UseLdap:
|
|
109
|
+
true:
|
|
110
|
+
- AddLdapToHiera
|
|
111
|
+
- LdapBaseDn
|
|
112
|
+
- LdapBindDn
|
|
113
|
+
- LdapBindPw
|
|
114
|
+
- LdapBindHash
|
|
115
|
+
- LdapSyncDn
|
|
116
|
+
- LdapSyncPw
|
|
117
|
+
- LdapSyncHash
|
|
118
|
+
- LdapRootDn
|
|
119
|
+
- LdapRootHash
|
|
120
|
+
- LdapMaster
|
|
121
|
+
- LdapUri
|
|
122
|
+
false:
|
|
123
|
+
- RemoveLdapFromHiera
|
|
124
|
+
|
|
125
|
+
# ==== rsync ====
|
|
126
|
+
- RsyncBase
|
|
127
|
+
- RsyncServer
|
|
128
|
+
- RsyncTimeout
|
|
129
|
+
|
|
130
|
+
# ==== writers ====
|
|
131
|
+
- AnswersYAMLFileWriter FILE=#{ @options.fetch( :puppet_system_file, '/dev/null') }
|
|
132
|
+
- AnswersYAMLFileWriter FILE=#{ @options.fetch( :output_file, '/dev/null') } USERAPPLY
|
|
133
|
+
EOF
|
|
134
|
+
items = YAML.load items_yaml
|
|
135
|
+
item_queue = build_item_queue( [], items )
|
|
136
|
+
item_queue
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def assign_value_from_hash( hash, item )
|
|
142
|
+
value = hash.fetch( item.key, nil )
|
|
143
|
+
if !value.nil?
|
|
144
|
+
# workaround to allow cli/env var arrays
|
|
145
|
+
value = value.split(',,') if item.is_a?(Simp::Cli::Config::ListItem) && !value.is_a?(Array)
|
|
146
|
+
if ! item.validate value
|
|
147
|
+
print_warning "'#{value}' is not an acceptable answer for '#{item.key}' (skipping)."
|
|
148
|
+
else
|
|
149
|
+
item.value = value
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
item
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
# returns an instance of an Config::Item based on a String of its class name
|
|
157
|
+
def create_item item_string
|
|
158
|
+
# create item instance
|
|
159
|
+
parts = item_string.split( /\s+/ )
|
|
160
|
+
name = parts.shift
|
|
161
|
+
item = Simp::Cli::Config::Item.const_get(name).new
|
|
162
|
+
|
|
163
|
+
# set item options
|
|
164
|
+
# ...based on YAML keywords
|
|
165
|
+
while !parts.empty?
|
|
166
|
+
part = parts.shift
|
|
167
|
+
if part =~ /^#/
|
|
168
|
+
parts = []
|
|
169
|
+
next
|
|
170
|
+
end
|
|
171
|
+
item.silent = true if part == 'SILENT'
|
|
172
|
+
item.skip_apply = true if part == 'NOAPPLY'
|
|
173
|
+
item.skip_query = true if part == 'SKIPQUERY'
|
|
174
|
+
item.skip_yaml = true if part == 'NOYAML'
|
|
175
|
+
item.allow_user_apply = true if part == 'USERAPPLY'
|
|
176
|
+
if part =~ /^FILE=(.+)/
|
|
177
|
+
item.file = $1
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
end
|
|
181
|
+
# ...based on cli options
|
|
182
|
+
item.silent = true if @options.fetch( :verbose ) < 0
|
|
183
|
+
item.skip_apply = true if @options.fetch( :dry_run, false )
|
|
184
|
+
|
|
185
|
+
# (try to) assign item values from various sources
|
|
186
|
+
item = assign_value_from_hash( @answers_hash, item )
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
# recursively build an item queue
|
|
191
|
+
def build_item_queue( item_queue, items )
|
|
192
|
+
writer = create_safety_writer_item
|
|
193
|
+
if !items.empty?
|
|
194
|
+
item = items.shift
|
|
195
|
+
item_queue << writer if writer
|
|
196
|
+
|
|
197
|
+
if item.is_a? String
|
|
198
|
+
item_queue << create_item( item )
|
|
199
|
+
|
|
200
|
+
elsif item.is_a? Hash
|
|
201
|
+
answers_tree = {}
|
|
202
|
+
item.values.first.each{ |answer, values|
|
|
203
|
+
answers_tree[ answer ] = build_item_queue( [], values )
|
|
204
|
+
}
|
|
205
|
+
_item = create_item( item.keys.first )
|
|
206
|
+
_item.next_items_tree = answers_tree
|
|
207
|
+
item_queue << _item
|
|
208
|
+
item_queue << writer if writer
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
item_queue = build_item_queue( item_queue, items )
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
# append a silent YAML writer to save progress after each item
|
|
215
|
+
|
|
216
|
+
item_queue
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
# create a YAML writer that will "safety save" after each answer
|
|
221
|
+
def create_safety_writer_item
|
|
222
|
+
if file = @options.fetch( :output_file, nil)
|
|
223
|
+
FileUtils.mkdir_p File.dirname( file ), :verbose => false
|
|
224
|
+
writer = Simp::Cli::Config::Item::AnswersYAMLFileWriter.new
|
|
225
|
+
file = File.join( File.dirname( file ), ".#{File.basename( file )}" )
|
|
226
|
+
writer.file = file
|
|
227
|
+
writer.allow_user_apply = true
|
|
228
|
+
writer.silent = true if @options.fetch(:verbose, 0) < 2
|
|
229
|
+
writer
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
def print_warning error
|
|
234
|
+
say "<%= color(%q{WARNING: }, YELLOW,BOLD) %><%= color(%q{#{error}}, YELLOW) %>\n"
|
|
235
|
+
end
|
|
236
|
+
end
|