danarchy_deploy 0.2.3 → 0.2.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9792fba2a8998890e49926fb51a20670a139b8f028f772eda429a4664b6090c9
4
- data.tar.gz: 1dca75853aad2879cfe30bf7c8f15688c3fef4e81dbcb79b993afc5f8815645b
3
+ metadata.gz: d4665ec27120f6fda4337da5a2b2cb465511534cef96b47c2a11791076012f64
4
+ data.tar.gz: e12104840e0273bf38d37a0465752ebc5bacc53d2d0f4a5b5783a936f5810afb
5
5
  SHA512:
6
- metadata.gz: 0b95c8e2bfeb5d1356edb6dd330533228f5a2a3961ec5caa66c6925bd48f6ed02a0eaeb73ea91772cb129d9adabc90e7dfbe0a33d164371e75f80e6cb0486eb0
7
- data.tar.gz: 8f6aba47acd3bb2c71c2b0d20dac76e0bf340055209cd0908c23b46980ea2c4c70b4bc5793f24be71508787ab303b568fa915cddba93c8241e5f66be9f675f9f
6
+ metadata.gz: 4bc766ba4a3e8f6e0e691dd1904029f9c08cd6b040146214ae31fb0c18b3a779bae3258b033b1b50205f70c02ebfdbc1fcdd5756ae5ef7b727ce8225397cb4b4
7
+ data.tar.gz: 7b22f9218392944730cec707bbf62cf9cc9c696fd411eccf02e6d7ceff54748b141c76b2b3de6750867287e9221a17f0be08be524a29c58e14b38b6741da4036
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ danarchy_deploy
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.7.2
data/CHANGELOG.md ADDED
@@ -0,0 +1,48 @@
1
+ patch_0.2.6
2
+ - DanarchyDeploy: gem install --bindir
3
+ - DanarchyDeploy: return from each class if not defined in a deployment
4
+ - Services::MySQL: Check for defaults_file instead of /etc/my.cnf, SecureRandom.hex for passwords
5
+ - Services::Init: clean up output and if statement
6
+ - Add RVM .ruby-version .ruby-gemset
7
+ - Rename danarchy_deploy-console to console-dd
8
+ - Add CHANGELOG.md
9
+
10
+ patch_0.2.5
11
+ - Adds Fstab system service
12
+ - Adds Dmcrypt/LVM system service
13
+ - Enforce MongoDB security/limits.d/mongodb.conf if it doesn't exist
14
+ - Clarify some CLI output
15
+ - Ignore first SSH known_hosts error in RemoteDeploy.remote_mkdir
16
+
17
+ patch_0.2.4
18
+ - mongodb limits newlines
19
+
20
+ patch_0.2.2
21
+ - Fix MongoDB so it correctly applies security limits file count
22
+
23
+ release_0.2.0
24
+ - Adds Applicator #wordpress #nginx #phpfpm #ssl
25
+ - Adds Services #init #mongodb #mysql
26
+ - Adds System #centos #debian #gentoo #openssue
27
+
28
+ patch_0.1.6
29
+ - User/Groups commands should use sudo
30
+
31
+ patch_0.1.5
32
+ - Don't upload to couchdb if using a .json/.yaml template
33
+
34
+ patch_0.1.4
35
+ - sudoers.d/ file root owned
36
+
37
+ patch_0.1.3
38
+ - prevents packages from being an empty array
39
+
40
+ patch_0.1.2
41
+ - chown/chmod on ~/.ssh contents
42
+ - fix JSON parse error
43
+
44
+ release_0.1.1
45
+ - Re-order archive extraction and template creation so that written templates aren't overwritten by archive data.
46
+ - Fixes user sudoers.d file creation; a+ append instead of r+ read-write (expects file to exist already).
47
+ - Cleans up package handling for Gentoo and also changes --usepkg to --buildpkg if hostname begins with 'image' or 'template' for binary creation during image builds.
48
+
data/Gemfile.lock CHANGED
@@ -1,26 +1,26 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- danarchy_deploy (0.2.0)
5
- danarchy_couchdb (~> 0.1.0)
6
- mongo (~> 2.13)
4
+ danarchy_deploy (0.2.6)
5
+ danarchy_couchdb (~> 0.1)
6
+ mongo (~> 2.17)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- bson (4.10.1)
12
- danarchy_couchdb (0.1.2)
13
- mongo (2.13.1)
11
+ bson (4.14.1)
12
+ danarchy_couchdb (0.1.3)
13
+ mongo (2.17.0)
14
14
  bson (>= 4.8.2, < 5.0.0)
15
- rake (13.0.1)
15
+ rake (13.0.6)
16
16
 
17
17
  PLATFORMS
18
- ruby
18
+ x86_64-linux
19
19
 
20
20
  DEPENDENCIES
21
- bundler (~> 2.1)
21
+ bundler (~> 2.3)
22
22
  danarchy_deploy!
23
23
  rake (~> 13.0)
24
24
 
25
25
  BUNDLED WITH
26
- 2.1.4
26
+ 2.3.9
File without changes
data/bin/danarchy_deploy CHANGED
@@ -5,7 +5,7 @@ require 'date'
5
5
  require 'optparse'
6
6
 
7
7
  deployment = nil
8
- options = { couchdb: "#{ENV['HOME']}/.danarchy/danarchy_deploy/danarchy_deploy.json",
8
+ options = { couchdb: "#{ENV['HOME']}/.danarchy/danarchy_deploy/danarchy_couchdb.json",
9
9
  deploy_dir: '/danarchy/deploy',
10
10
  deploy_file: nil,
11
11
  first_run: false,
@@ -15,7 +15,8 @@ options = { couchdb: "#{ENV['HOME']}/.danarchy/danarchy_deploy/danarchy_deploy.j
15
15
 
16
16
  ARGV.push('--help') if ARGV.empty?
17
17
  optparse = OptionParser.new do |opts|
18
- opts.banner = "Usage: sudo #{$PROGRAM_NAME} (local|remote) --json /path/to/deployment.json [options]"
18
+ opts.banner = "Usage: danarchy_deploy (local|remote) --json #{options[:deploy_dir]}/<HOSTNAME>/<HOSTNAME>.json [options]"
19
+ opts.banner += "\n Local deployments require danarchy_deploy to be run as sudo/root.\n\n"
19
20
 
20
21
  opts.on('-j=file', '--json=file', 'Read configuration from JSON file.') do |file|
21
22
  require 'json'
@@ -65,7 +66,7 @@ optparse = OptionParser.new do |opts|
65
66
  end.parse!
66
67
 
67
68
  puts "DanarchyDeploy: #{DanarchyDeploy::VERSION}"
68
- location = ARGV.delete('remote') || ARGV.delete('local') || abort("ERROR: Need an option 'local' or 'remote' to know what to do!")
69
+ location = ARGV.delete('remote') || ARGV.delete('local') || abort("ERROR: Need a deployment type: 'local' or 'remote'!")
69
70
  cdb_config = File.exist?(options[:couchdb]) ? JSON.parse(File.read(options[:couchdb]), symbolize_names: true)[:couchdb] : nil
70
71
  cdb = DanarchyCouchDB::Connection.new(cdb_config) if cdb_config
71
72
 
@@ -94,7 +95,7 @@ end
94
95
  if location == 'remote'
95
96
  deployment = DanarchyDeploy::RemoteDeploy.new(deployment, options)
96
97
  elsif location == 'local'
97
- abort('Exiting! Must be run with sudo!') if Process.uid != 0
98
+ abort('Exiting! Local deployment must be run with sudo!') if Process.uid != 0
98
99
  puts "Deploying #{deployment[:hostname]} locally to #{`hostname`.chomp}."
99
100
 
100
101
  if !options[:pretend]
@@ -113,6 +114,7 @@ end
113
114
 
114
115
  if deployment && cdb && !options[:pretend] && options[:deploy_file] !~ /.*(json|yaml)$/
115
116
  puts "Saving deployment to CouchDB."
117
+ deployment[:_attachments].values.map { |v| v.delete(:data) } if deployment[:_attachments]
116
118
  old_rev = cdb.get(cdb_config[:database], deployment_name)[:_rev]
117
119
  save = cdb.put(cdb_config[:database], deployment[:_id], deployment)
118
120
 
@@ -28,10 +28,10 @@ Gem::Specification.new do |spec|
28
28
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
29
29
  spec.require_paths = ["lib"]
30
30
 
31
- spec.add_dependency "danarchy_couchdb", "~> 0.1.0"
31
+ spec.add_dependency "danarchy_couchdb", "~> 0.1"
32
32
 
33
- spec.add_development_dependency "bundler", "~> 2.1"
33
+ spec.add_development_dependency "bundler", "~> 2.3"
34
34
  spec.add_development_dependency "rake", "~> 13.0"
35
35
 
36
- spec.add_runtime_dependency "mongo", "~> 2.13"
36
+ spec.add_runtime_dependency "mongo", "~> 2.17"
37
37
  end
@@ -2,6 +2,7 @@
2
2
  module DanarchyDeploy
3
3
  class Groups
4
4
  def self.new(deployment, options)
5
+ return deployment if ! deployment[:groups]
5
6
  puts "\n" + self.name
6
7
  (groupadd_result, groupdel_result) = nil
7
8
 
@@ -5,6 +5,7 @@ module DanarchyDeploy
5
5
  module Services
6
6
  class Init
7
7
  def self.new(deployment, options)
8
+ return deployment if ! deployment[:services]
8
9
  puts "\n" + self.name
9
10
 
10
11
  deployment[:services].each do |service, params|
@@ -35,16 +36,16 @@ module DanarchyDeploy
35
36
 
36
37
  init_result = init.send(action)
37
38
 
38
- if init_result[:stderr]
39
- if init_result[:stderr].include?('unknown function')
39
+ if stderr = init_result[:stderr]
40
+ if stderr.include?('unknown function')
40
41
  puts " ! Action: #{action} not available for service: #{service}.\n" +
41
42
  " ! A restart may be needed! Otherwise, remove this action from the deployment.\n" +
42
43
  " ! Not taking any action here.\n"
43
44
  else
44
- abort(" ! Action: #{service} #{action} failed!")
45
+ abort(" ! Action: #{action} #{service} failed!")
45
46
  end
46
47
  else
47
- puts " |+ Action: #{service} #{action} succeeded."
48
+ puts " |+ Action: #{action} #{service} succeeded."
48
49
  end
49
50
  end
50
51
  end
@@ -13,7 +13,7 @@ module DanarchyDeploy
13
13
  Mongo::Logger.logger.level = Logger::FATAL
14
14
  mongodb_conf, updated_conf = self.load_mongodb_conf
15
15
  host_port = mongodb_conf['net']['bindIp'].split(',').first + ':' + mongodb_conf['net']['port'].to_s
16
- admin_user, new_admin = self.load_admin_user
16
+ admin_user, new_admin = self.load_admin_user
17
17
 
18
18
  if new_admin == true
19
19
  client = Mongo::Client.new(['127.0.0.1'], database: 'admin')
@@ -48,9 +48,7 @@ module DanarchyDeploy
48
48
  private
49
49
  def self.load_mongodb_conf
50
50
  updated_conf = false
51
- @mongodb[:mongodb_conf] = @mongodb[:mongodb_conf] ?
52
- @mongodb[:mongodb_conf] :
53
- '/etc/mongodb.conf'
51
+ @mongodb[:mongodb_conf] ||= '/etc/mongodb.conf'
54
52
  mongodb_conf = File.exist?(@mongodb[:mongodb_conf]) ? YAML.load_file(@mongodb[:mongodb_conf]) : Hash.new
55
53
 
56
54
  generated_mongodb_conf = self.generate_mongodb_conf
@@ -59,13 +57,15 @@ module DanarchyDeploy
59
57
  end
60
58
 
61
59
  def self.generate_mongodb_conf
62
- if File.readlines('/etc/security/limits.conf').grep(/mongodb/).empty?
63
- entry = 'mongodb soft nofile 32000\n'
64
- entry += 'mongodb hard nofile 64000\n'
65
- File.open('/etc/security/limits.conf', 'a+') do |f|
66
- f.write entry
67
- end
68
- end
60
+ security_limits = '/etc/security/limits.d/mongodb.conf'
61
+ limits = <<~EOF
62
+ mongodb soft nofile 64000
63
+ mongodb hard nofile 64000
64
+ mongodb soft nproc 64000
65
+ mongodb hard nproc 64000
66
+ EOF
67
+
68
+ File.write(security_limits, limits) if !File.exist?(security_limits)
69
69
 
70
70
  mongodb_conf = {
71
71
  'net' => { 'port' => 27017, 'bindIp' => '127.0.0.1' },
@@ -49,13 +49,13 @@ module DanarchyDeploy
49
49
  end
50
50
 
51
51
  def self.generate_root_mycnf(mysql, options)
52
- return if File.exist?(mysql[:default_file])
53
- puts " |+ Generating #{mysql[:default_file]} file."
54
- password = SecureRandom.base64(14)
52
+ return if File.exist?(mysql[:defaults_file])
53
+ puts " |+ Generating #{mysql[:defaults_file]} file."
54
+ password = SecureRandom.hex(24)
55
55
  source = options[:deploy_dir] +
56
56
  '/templates/services/mysql/root_my.cnf.erb'
57
57
 
58
- templates = [{ target: mysql[:default_file],
58
+ templates = [{ target: mysql[:defaults_file],
59
59
  source: source,
60
60
  variables: {
61
61
  host: 'localhost',
@@ -11,7 +11,7 @@ module DanarchyDeploy
11
11
  mysql = self.set_parameters(mysql)
12
12
  self.generate_my_cnf(mysql, options)
13
13
 
14
- if File.exist?(mysql[:my_cnf]) && Dir.exist?(mysql[:datadir] + '/mysql')
14
+ if File.exist?(mysql[:defaults_file]) && Dir.exist?(mysql[:datadir])
15
15
  puts " |+ Using existing MySQL service."
16
16
  else
17
17
  MySQL::NewServer.new(os, mysql, options)
@@ -24,8 +24,8 @@ module DanarchyDeploy
24
24
  end
25
25
 
26
26
  def self.set_parameters(mysql)
27
- mysql[:default_file] = mysql[:default_file] ?
28
- mysql[:default_file] :
27
+ mysql[:defaults_file] = mysql[:defaults_file] ?
28
+ mysql[:defaults_file] :
29
29
  '/root/.my.cnf'
30
30
  mysql[:my_cnf] = mysql[:my_cnf] ?
31
31
  mysql[:my_cnf] :
@@ -6,6 +6,7 @@ require_relative 'services/mysql'
6
6
  module DanarchyDeploy
7
7
  module Services
8
8
  def self.new(deployment, options)
9
+ return deployment if ! deployment[:services]
9
10
  puts "\n" + self.name
10
11
 
11
12
  deployment[:services].each do |service, params|
@@ -0,0 +1,144 @@
1
+
2
+ module DanarchyDeploy
3
+ module System
4
+ class Cryptsetup
5
+ def self.new(os, cryptsetup, options)
6
+ return false if cryptsetup.nil?
7
+ puts "\n" + self.name
8
+
9
+ # expects object: {
10
+ # "cryptsetup": {
11
+ # "source": "/danarchy/deploy/templates/system/cryptsetup.erb", (optional)
12
+ # "volumes": {
13
+ # "vg_name:vg0:/dev/vdb": {
14
+ # "target": "dm-vg0-mongodb",
15
+ # "source": "/dev/mapper/vg0-mongodb",
16
+ # "key": "/root/vdb_mongodb.key" } } } }
17
+
18
+ if os == 'gentoo'
19
+ DanarchyDeploy::Services::Init.init_manager(os, 'lvmetad', 'enable', options)
20
+ DanarchyDeploy::Services::Init.init_manager(os, 'lvmetad', 'start', options)
21
+ end
22
+
23
+ service, target, source = set_config(cryptsetup, options)
24
+ lvm_result, crypt_result = nil
25
+ cryptsetup[:volumes].each do |device, volume|
26
+ lvm_result = lvm_setup(device, volume, options)
27
+ crypt_result = encrypt_volume(volume, options)
28
+ end
29
+
30
+ deploy_template(target, source, cryptsetup[:volumes], options)
31
+ if os == 'gentoo'
32
+ DanarchyDeploy::Services::Init.init_manager(os, service, 'enable', options)
33
+ DanarchyDeploy::Services::Init.init_manager(os, service, 'start', options)
34
+ end
35
+ end
36
+
37
+ private
38
+ def self.set_config(cryptsetup, options)
39
+ service, target = File.exist?('/etc/conf.d/dmcrypt') ?
40
+ ['dmcrypt','/etc/conf.d/dmcrypt'] :
41
+ ['cryptsetup','/etc/crypttab']
42
+
43
+ source = if cryptsetup[:source]
44
+ cryptsetup[:source]
45
+ elsif target == '/etc/conf.d/dmcrypt'
46
+ options[:deploy_dir] + '/templates/system/dmcrypt.erb'
47
+ elsif target == '/etc/crypttab'
48
+ options[:deploy_dir] + '/templates/system/crypttab.erb'
49
+ else
50
+ nil
51
+ end
52
+
53
+ [service, target, source]
54
+ end
55
+
56
+ def self.lvm_setup(device, volume, options)
57
+ puts "\n > Configuring LVM"
58
+ name, vg, pv = device.to_s.split(/:/)
59
+
60
+ # Create physical volume
61
+ pvdisplay = DanarchyDeploy::Helpers.run_command("pvdisplay #{pv}", options)
62
+ if pvdisplay[:stderr]
63
+ puts "Creating physical volume: #{pv}"
64
+ pvcreate = DanarchyDeploy::Helpers.run_command("pvcreate -f #{pv}", options)
65
+ abort(" ! Failed to run pvcreate: #{pvcreate[:stderr]}") if pvcreate[:stderr]
66
+ puts pvcreate[:stdout]
67
+ pvdisplay = DanarchyDeploy::Helpers.run_command("pvdisplay #{pv}", options)
68
+ end
69
+ puts pvdisplay[:stderr] || pvdisplay[:stdout]
70
+
71
+ # Create volume group
72
+ vgdisplay = DanarchyDeploy::Helpers.run_command("vgdisplay #{vg}", options)
73
+ if vgdisplay[:stderr]
74
+ puts "Creating volume group: #{vg} with #{pv}"
75
+ vgcreate = DanarchyDeploy::Helpers.run_command("vgcreate #{vg} #{pv}", options)
76
+ abort(" ! Failed to run vgcreate: #{vgcreate[:stderr]}") if vgcreate[:stderr]
77
+ puts vgcreate[:stdout]
78
+ vgdisplay = DanarchyDeploy::Helpers.run_command("vgdisplay #{vg}", options)
79
+ end
80
+ puts vgdisplay[:stderr] || vgdisplay[:stdout]
81
+
82
+ # Create logical volume
83
+ lvdisplay = DanarchyDeploy::Helpers.run_command("lvdisplay #{vg}/#{name}", options)
84
+ if lvdisplay[:stderr]
85
+ puts "Creating volume group: #{vg}/#{name} with #{pv}"
86
+ lvcreate = DanarchyDeploy::Helpers.run_command("lvcreate -y -l 100%FREE -n #{name} #{vg}", options)
87
+ abort(" ! Failed to run lvcreate: #{lvcreate[:stderr]}") if lvcreate[:stderr]
88
+ puts lvcreate[:stdout]
89
+ lvdisplay = DanarchyDeploy::Helpers.run_command("lvdisplay #{vg}/#{name}", options)
90
+ end
91
+ puts lvdisplay[:stderr] || lvdisplay[:stdout]
92
+
93
+ [pvdisplay, vgdisplay, lvdisplay]
94
+ end
95
+
96
+ def self.encrypt_volume(volume, options)
97
+ puts "\n > Configuring Cryptsetup"
98
+ deploy_key(volume, options)
99
+ target = volume[:variables][:target]
100
+ source = volume[:variables][:source]
101
+ key = volume[:variables][:key]
102
+ abort(" ! Failed to find key: #{key}") if !File.exist?(key) && !options[:pretend]
103
+
104
+ # Encrypt logical volume with key
105
+ luksdump = DanarchyDeploy::Helpers.run_command("cryptsetup luksDump #{source}", options)
106
+ if luksdump[:stderr]
107
+ puts "\n > Encrypting volume: #{source}"
108
+ luksformat = DanarchyDeploy::Helpers.run_command("cryptsetup luksFormat #{source} #{key}", options)
109
+ abort(" ! Failed to run luksFormat: #{luksformat[:stderr]}") if luksformat[:stderr]
110
+ puts luksformat[:stdout]
111
+ luksdump = DanarchyDeploy::Helpers.run_command("cryptsetup luksDump #{source}", options)
112
+ end
113
+ puts luksdump[:stderr] || luksdump[:stdout]
114
+
115
+ # Open luks target
116
+ luksopen = { stderr: nil }
117
+ if !File.exist?("/dev/mapper/#{target}")
118
+ puts "\n > Opening volume: #{source}"
119
+ luksopen = DanarchyDeploy::Helpers.run_command("cryptsetup luksOpen -d #{key} #{source} #{target}", options)
120
+ abort(" ! Failed to run luksOpen: #{luksopen[:stderr]}") if luksopen[:stderr]
121
+ puts luksopen[:stdout]
122
+ end
123
+
124
+ [luksdump, luksopen]
125
+ end
126
+
127
+ def self.deploy_key(volume, options)
128
+ templates = [{ source: volume[:key_file],
129
+ target: volume[:variables][:key],
130
+ file_perms: {
131
+ owner: 'root',
132
+ group: 'root',
133
+ mode: '0400' } }]
134
+
135
+ DanarchyDeploy::Templater.new(templates, options)
136
+ end
137
+
138
+ def self.deploy_template(target, source, volumes, options)
139
+ templates = [{ target: target, source: source, variables: volumes }]
140
+ DanarchyDeploy::Templater.new(templates, options)
141
+ end
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,60 @@
1
+
2
+ module DanarchyDeploy
3
+ module System
4
+ class Fstab
5
+ def self.new(os, fstab, options)
6
+ puts "\n" + self.name
7
+ target, source = set_config(fstab, options)
8
+ deploy_template(target, source, fstab[:mounts], options)
9
+ format_mountpoints(fstab, options)
10
+ mount_all(options)
11
+ end
12
+
13
+ def self.mount_all(options)
14
+ puts "\n > Mounting Filesystems"
15
+ mount_result = DanarchyDeploy::Helpers.run_command('mount -a', options)
16
+ abort(' ! Failed to mount filesystems!') if mount_result[:stderr]
17
+ end
18
+
19
+ private
20
+ def self.set_config(fstab, options)
21
+ target = '/etc/fstab'
22
+ source = fstab[:source] ?
23
+ fstab[:source] :
24
+ '/danarchy/deploy/templates/system/fstab.erb'
25
+
26
+ [target, source]
27
+ end
28
+
29
+ def self.deploy_template(target, source, mounts, options)
30
+ templates = [{ target: target,
31
+ source: source,
32
+ variables: mounts }]
33
+
34
+ DanarchyDeploy::Templater.new(templates, options)
35
+ end
36
+
37
+ def self.format_mountpoints(fstab, options)
38
+ return false if fstab.nil?
39
+ puts "\n > Formatting mountpoints"
40
+
41
+ fstab[:mounts].each do |mount|
42
+ fs_check = DanarchyDeploy::Helpers.run_command(
43
+ "file -sL #{mount[:filesystem]}", options
44
+ )
45
+
46
+ if fs_check[:stdout] && fs_check[:stdout] =~ /.*data$/
47
+ puts "\n > Formatting #{mount[:filesystem]}"
48
+ mkfs = DanarchyDeploy::Helpers.run_command(
49
+ "mkfs -t #{mount[:type]} #{mount[:filesystem]}", options
50
+ )
51
+ abort(" ! Failed to run mkfs: #{mkfs[:stderr]}") if mkfs[:stderr]
52
+ end
53
+
54
+ FileUtils.mkdir_p(mount[:mountpoint]) if !options[:pretend] &&
55
+ !Dir.exist?(mount[:mountpoint])
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -3,10 +3,14 @@ require_relative 'system/debian'
3
3
  require_relative 'system/gentoo'
4
4
  require_relative 'system/opensuse'
5
5
 
6
+ require_relative 'system/cryptsetup'
7
+ require_relative 'system/fstab'
8
+
6
9
  module DanarchyDeploy
7
10
  module System
8
11
  def self.new(deployment, options)
9
12
  abort('Operating System not defined! Exiting!') if !deployment[:os]
13
+ return deployment if ! deployment[:system]
10
14
  puts "\n" + self.name
11
15
 
12
16
  installer, updater, cleaner = prep_operating_system(deployment, options)
@@ -46,28 +50,17 @@ module DanarchyDeploy
46
50
  if deployment[:system][:templates]
47
51
  puts "\n > Configuring system templates for #{deployment[:os]}"
48
52
  DanarchyDeploy::Templater.new(deployment[:system][:templates], options)
53
+ end
49
54
 
50
- # Add deployment[:system][:dmcrypt], deployment[:system][:lvm], and deployment[:system][:fstab] here
51
- deployment[:system][:templates].each do |t|
52
- if t[:target] == '/etc/fstab'
53
- t[:variables].each do |v|
54
- if !Dir.exist?(v[:mountpoint])
55
- puts "Creating mountpoint: #{v[:mountpoint]}"
56
- FileUtils.mkdir_p(v[:mountpoint]) if !options[:pretend]
57
- end
58
- end
59
- end
60
- end
55
+ DanarchyDeploy::System::Cryptsetup.new(deployment[:os], deployment[:system][:cryptsetup], options)
61
56
 
57
+ if deployment[:system][:fstab]
58
+ DanarchyDeploy::System::Fstab.new(deployment[:os], deployment[:system][:fstab], options)
59
+ else
60
+ DanarchyDeploy::System::Fstab.mount_all(options)
62
61
  end
63
62
  end
64
63
 
65
- puts "\n > Mounting Filesystems"
66
- if !options[:pretend]
67
- mount_result = DanarchyDeploy::Helpers.run_command('mount -a', options)
68
- abort(' |! Failed to mount filesystems!') if mount_result[:stderr]
69
- end
70
-
71
64
  if os.downcase == 'gentoo'
72
65
  (installer, updater, cleaner) = DanarchyDeploy::System::Gentoo.new(deployment, options)
73
66
  elsif %w[debian ubuntu].include?(os.downcase)
@@ -75,12 +68,30 @@ module DanarchyDeploy
75
68
  elsif os.downcase == 'opensuse'
76
69
  puts 'OpenSUSE is not fully supported yet!'
77
70
  (installer, updater, cleaner) = DanarchyDeploy::System::OpenSUSE.new(deployment, options)
78
- elsif %w[centos redhat].include?(os.downcase)
79
- puts 'CentOS/RedHat is not fully supported yet!'
71
+ elsif %w[fedora centos redhat].include?(os.downcase)
72
+ puts 'Fedora/CentOS/RedHat is not fully supported yet!'
80
73
  (installer, updater, cleaner) = DanarchyDeploy::System::CentOS.new(deployment, options)
81
74
  end
82
75
 
83
76
  [installer, updater, cleaner]
84
77
  end
78
+
79
+ def self.fstab_mount(deployment, options)
80
+ fstab = deployment[:system][:templates].collect { |t| t if t[:target] == '/etc/fstab' }.compact
81
+ fstab.each do |t|
82
+ t[:variables].each do |v|
83
+ if !Dir.exist?(v[:mountpoint])
84
+ puts "Creating mountpoint: #{v[:mountpoint]}"
85
+ FileUtils.mkdir_p(v[:mountpoint]) if !options[:pretend]
86
+ end
87
+ end
88
+ end
89
+
90
+ puts "\n > Mounting Filesystems"
91
+ if !options[:pretend]
92
+ mount_result = DanarchyDeploy::Helpers.run_command('mount -a', options)
93
+ abort(' |! Failed to mount filesystems!') if mount_result[:stderr]
94
+ end
95
+ end
85
96
  end
86
97
  end
@@ -2,6 +2,7 @@
2
2
  module DanarchyDeploy
3
3
  class Users
4
4
  def self.new(deployment, options)
5
+ return deployment if ! deployment[:users]
5
6
  puts "\n" + self.name
6
7
  (useradd_result, userdel_result, archives_result) = nil
7
8
 
@@ -56,7 +57,6 @@ module DanarchyDeploy
56
57
  user.delete(:username)
57
58
  end
58
59
 
59
- # [useradd_result, userdel_result]
60
60
  deployment
61
61
  end
62
62
 
@@ -1,3 +1,3 @@
1
1
  module DanarchyDeploy
2
- VERSION = "0.2.3"
2
+ VERSION = "0.2.6"
3
3
  end
@@ -21,10 +21,10 @@ module DanarchyDeploy
21
21
  printf("%12s %0s\n", 'Packages:', deployment[:packages].join(', ')) if deployment[:packages]
22
22
 
23
23
  deployment = DanarchyDeploy::System.new(deployment, options)
24
- deployment = DanarchyDeploy::Services.new(deployment, options) if deployment[:services]
25
- deployment = DanarchyDeploy::Groups.new(deployment, options) if deployment[:groups]
26
- deployment = DanarchyDeploy::Users.new(deployment, options) if deployment[:users]
27
- deployment = DanarchyDeploy::Services::Init.new(deployment, options) if deployment[:services]
24
+ deployment = DanarchyDeploy::Services.new(deployment, options)
25
+ deployment = DanarchyDeploy::Groups.new(deployment, options)
26
+ deployment = DanarchyDeploy::Users.new(deployment, options)
27
+ deployment = DanarchyDeploy::Services::Init.new(deployment, options)
28
28
 
29
29
  deployment[:last_deploy] = DateTime.now.strftime("%Y/%m/%d %H:%M:%S")
30
30
  puts "\nFinished Local Deployment at #{deployment[:last_deploy]}!"
@@ -61,7 +61,7 @@ module DanarchyDeploy
61
61
 
62
62
  gem_clean(connector, options)
63
63
  gem_binary = _locate_gem_binary(connector, options) # this should run before any install; check version too
64
- push_temmplates(connector, options)
64
+ push_templates(connector, options)
65
65
  push_deployment(connector, options)
66
66
  deploy_result = remote_LocalDeploy(connector, gem_binary, options)
67
67
 
@@ -79,10 +79,10 @@ module DanarchyDeploy
79
79
  private
80
80
  def self.remote_mkdir(connector, options)
81
81
  puts "\n > Creating directory: #{options[:working_dir]}"
82
- mkdir_cmd = _ssh_command(connector, "test -d #{options[:working_dir]} || sudo mkdir -vp #{options[:working_dir]}")
82
+ mkdir_cmd = _ssh_command(connector, "test -d #{options[:working_dir]} && echo 'Directory exists!' || sudo mkdir -vp #{options[:working_dir]}")
83
83
  mkdir_result = DanarchyDeploy::Helpers.run_command(mkdir_cmd, options)
84
84
 
85
- if mkdir_result[:stderr]
85
+ if mkdir_result[:stderr] && ! mkdir_result[:stdout]
86
86
  abort(' ! Directory creation failed!')
87
87
  else
88
88
  puts " |+ Created directory: '#{options[:deploy_dir]}'"
@@ -144,7 +144,7 @@ module DanarchyDeploy
144
144
  end
145
145
 
146
146
  puts "\n > Installing gem: #{gem} on #{connector[:hostname]}"
147
- install_cmd = _ssh_command(connector, "sudo gem install -f #{options[:deploy_dir]}/#{File.basename(gem)}")
147
+ install_cmd = _ssh_command(connector, "sudo gem install --bindir /usr/local/bin -f #{options[:deploy_dir]}/#{File.basename(gem)}")
148
148
  install_result = DanarchyDeploy::Helpers.run_command(install_cmd, options)
149
149
 
150
150
  if install_result[:stderr]
@@ -159,7 +159,7 @@ module DanarchyDeploy
159
159
  system(clean_cmd)
160
160
  end
161
161
 
162
- def self.push_temmplates(connector, options)
162
+ def self.push_templates(connector, options)
163
163
  template_dir = options[:deploy_dir] + '/templates'
164
164
  puts "\n > Pushing templates: #{template_dir}"
165
165
  push_cmd = _rsync_push(connector, template_dir, template_dir)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: danarchy_deploy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan James
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-21 00:00:00.000000000 Z
11
+ date: 2022-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: danarchy_couchdb
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.1.0
19
+ version: '0.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.1.0
26
+ version: '0.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '2.1'
33
+ version: '2.3'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '2.1'
40
+ version: '2.3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -58,35 +58,38 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '2.13'
61
+ version: '2.17'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '2.13'
68
+ version: '2.17'
69
69
  description: DanarchyDeploy intends to simplify Gentoo Linux (and other distro) deployments
70
70
  down to a single template from an input JSON or YAML file, or from a CouchDB file.
71
71
  email:
72
72
  - dan@danarchy.me
73
73
  executables:
74
+ - console-dd
74
75
  - danarchy_deploy
75
- - danarchy_deploy-console
76
76
  - setup
77
77
  extensions: []
78
78
  extra_rdoc_files: []
79
79
  files:
80
80
  - ".gitignore"
81
81
  - ".rspec"
82
+ - ".ruby-gemset"
83
+ - ".ruby-version"
82
84
  - ".travis.yml"
85
+ - CHANGELOG.md
83
86
  - Gemfile
84
87
  - Gemfile.lock
85
88
  - LICENSE.txt
86
89
  - README.md
87
90
  - Rakefile
91
+ - bin/console-dd
88
92
  - bin/danarchy_deploy
89
- - bin/danarchy_deploy-console
90
93
  - bin/setup
91
94
  - danarchy_deploy.gemspec
92
95
  - lib/danarchy_deploy.rb
@@ -115,7 +118,9 @@ files:
115
118
  - lib/danarchy_deploy/services/mysql/privileges.rb
116
119
  - lib/danarchy_deploy/system.rb
117
120
  - lib/danarchy_deploy/system/centos.rb
121
+ - lib/danarchy_deploy/system/cryptsetup.rb
118
122
  - lib/danarchy_deploy/system/debian.rb
123
+ - lib/danarchy_deploy/system/fstab.rb
119
124
  - lib/danarchy_deploy/system/gentoo.rb
120
125
  - lib/danarchy_deploy/system/opensuse.rb
121
126
  - lib/danarchy_deploy/templater.rb
@@ -127,7 +132,7 @@ licenses:
127
132
  - MIT
128
133
  metadata:
129
134
  allowed_push_host: https://rubygems.org
130
- post_install_message:
135
+ post_install_message:
131
136
  rdoc_options: []
132
137
  require_paths:
133
138
  - lib
@@ -142,8 +147,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
147
  - !ruby/object:Gem::Version
143
148
  version: '0'
144
149
  requirements: []
145
- rubygems_version: 3.0.3
146
- signing_key:
150
+ rubygems_version: 3.1.4
151
+ signing_key:
147
152
  specification_version: 4
148
153
  summary: Pushes deployments locally or remotely based on a JSON/YAML/CouchDB template.
149
154
  test_files: []