getch 0.1.2 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +66 -32
  4. data/assets/network-stack.conf +63 -0
  5. data/assets/system.conf +38 -0
  6. data/bin/getch +12 -4
  7. data/lib/cmdline.rb +128 -0
  8. data/lib/getch/command.rb +32 -22
  9. data/lib/getch/config/gentoo.rb +58 -0
  10. data/lib/getch/config/void.rb +47 -0
  11. data/lib/getch/config.rb +45 -0
  12. data/lib/getch/filesystem/clean.rb +22 -15
  13. data/lib/getch/filesystem/device.rb +8 -6
  14. data/lib/getch/filesystem/ext4/config.rb +8 -4
  15. data/lib/getch/filesystem/ext4/deps.rb +3 -1
  16. data/lib/getch/filesystem/ext4/device.rb +2 -3
  17. data/lib/getch/filesystem/ext4/encrypt/config.rb +15 -11
  18. data/lib/getch/filesystem/ext4/encrypt/deps.rb +5 -10
  19. data/lib/getch/filesystem/ext4/encrypt/device.rb +5 -3
  20. data/lib/getch/filesystem/ext4/encrypt/format.rb +4 -2
  21. data/lib/getch/filesystem/ext4/encrypt/mount.rb +3 -3
  22. data/lib/getch/filesystem/ext4/encrypt/partition.rb +29 -35
  23. data/lib/getch/filesystem/ext4/encrypt/void.rb +101 -0
  24. data/lib/getch/filesystem/ext4/encrypt.rb +3 -0
  25. data/lib/getch/filesystem/ext4/format.rb +4 -1
  26. data/lib/getch/filesystem/ext4/mount.rb +3 -0
  27. data/lib/getch/filesystem/ext4/partition.rb +11 -8
  28. data/lib/getch/filesystem/ext4/void.rb +44 -0
  29. data/lib/getch/filesystem/ext4.rb +3 -0
  30. data/lib/getch/filesystem/lvm/config.rb +10 -29
  31. data/lib/getch/filesystem/lvm/deps.rb +7 -11
  32. data/lib/getch/filesystem/lvm/device.rb +5 -3
  33. data/lib/getch/filesystem/lvm/encrypt/config.rb +17 -17
  34. data/lib/getch/filesystem/lvm/encrypt/deps.rb +8 -12
  35. data/lib/getch/filesystem/lvm/encrypt/device.rb +7 -5
  36. data/lib/getch/filesystem/lvm/encrypt/format.rb +5 -2
  37. data/lib/getch/filesystem/lvm/encrypt/mount.rb +4 -2
  38. data/lib/getch/filesystem/lvm/encrypt/partition.rb +17 -13
  39. data/lib/getch/filesystem/lvm/encrypt/void.rb +101 -0
  40. data/lib/getch/filesystem/lvm/encrypt.rb +3 -0
  41. data/lib/getch/filesystem/lvm/format.rb +4 -1
  42. data/lib/getch/filesystem/lvm/mount.rb +3 -0
  43. data/lib/getch/filesystem/lvm/partition.rb +10 -7
  44. data/lib/getch/filesystem/lvm/void.rb +46 -0
  45. data/lib/getch/filesystem/lvm.rb +3 -0
  46. data/lib/getch/filesystem/mount.rb +19 -12
  47. data/lib/getch/filesystem/partition.rb +19 -11
  48. data/lib/getch/filesystem/zfs/config.rb +10 -24
  49. data/lib/getch/filesystem/zfs/deps.rb +28 -58
  50. data/lib/getch/filesystem/zfs/device.rb +9 -1
  51. data/lib/getch/filesystem/zfs/encrypt/config.rb +12 -28
  52. data/lib/getch/filesystem/zfs/encrypt/deps.rb +29 -60
  53. data/lib/getch/filesystem/zfs/encrypt/device.rb +9 -1
  54. data/lib/getch/filesystem/zfs/encrypt/format.rb +24 -22
  55. data/lib/getch/filesystem/zfs/encrypt/mount.rb +15 -14
  56. data/lib/getch/filesystem/zfs/encrypt/partition.rb +24 -18
  57. data/lib/getch/filesystem/zfs/encrypt/void.rb +97 -0
  58. data/lib/getch/filesystem/zfs/encrypt.rb +3 -0
  59. data/lib/getch/filesystem/zfs/format.rb +21 -18
  60. data/lib/getch/filesystem/zfs/mount.rb +12 -13
  61. data/lib/getch/filesystem/zfs/partition.rb +20 -15
  62. data/lib/getch/filesystem/zfs/void.rb +81 -0
  63. data/lib/getch/filesystem/zfs.rb +3 -0
  64. data/lib/getch/filesystem.rb +2 -0
  65. data/lib/getch/gentoo/boot.rb +29 -67
  66. data/lib/getch/gentoo/bootloader.rb +68 -0
  67. data/lib/getch/gentoo/chroot.rb +26 -29
  68. data/lib/getch/gentoo/config.rb +69 -31
  69. data/lib/getch/gentoo/sources.rb +73 -38
  70. data/lib/getch/gentoo/stage.rb +12 -13
  71. data/lib/getch/gentoo/use.rb +39 -0
  72. data/lib/getch/gentoo/use_flag.rb +89 -0
  73. data/lib/getch/gentoo.rb +39 -21
  74. data/lib/getch/guard.rb +71 -0
  75. data/lib/getch/helpers.rb +180 -48
  76. data/lib/getch/log.rb +10 -7
  77. data/lib/getch/options.rb +50 -41
  78. data/lib/getch/states.rb +10 -3
  79. data/lib/getch/version.rb +1 -1
  80. data/lib/getch/void/boot.rb +84 -0
  81. data/lib/getch/void/chroot.rb +56 -0
  82. data/lib/getch/void/config.rb +90 -0
  83. data/lib/getch/void/stage.rb +69 -0
  84. data/lib/getch/void.rb +65 -0
  85. data/lib/getch.rb +125 -74
  86. data.tar.gz.sig +0 -0
  87. metadata +28 -10
  88. metadata.gz.sig +0 -0
  89. data/.gitignore +0 -2
  90. data/CHANGELOG.md +0 -80
  91. data/Rakefile +0 -21
  92. data/bin/setup.sh +0 -90
  93. data/getch.gemspec +0 -25
data/lib/getch/helpers.rb CHANGED
@@ -1,71 +1,203 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'open-uri'
2
4
  require 'open3'
3
5
  require 'fileutils'
4
6
 
5
- module Helpers
6
- def self.efi?
7
- Dir.exist? '/sys/firmware/efi/efivars'
8
- end
7
+ module Getch
8
+ module Helpers
9
+ def self.efi?
10
+ Dir.exist? '/sys/firmware/efi/efivars'
11
+ end
9
12
 
10
- def self.get_file_online(url, dest)
11
- URI.open(url) do |l|
12
- File.open(dest, "wb") do |f|
13
- f.write(l.read)
13
+ def self.get_file_online(url, dest)
14
+ URI.open(url) do |l|
15
+ File.open(dest, "wb") { |f| f.write(l.read) }
14
16
  end
15
17
  end
16
- end
17
18
 
18
- def self.exec_or_die(cmd)
19
- _, stderr, status = Open3.capture3(cmd)
20
- unless status.success?
21
- raise "Problem running #{cmd}, stderr was:\n#{stderr}"
19
+ def self.exec_or_die(cmd)
20
+ _, stderr, status = Open3.capture3(cmd)
21
+ unless status.success?
22
+ raise "Problem running #{cmd}, stderr was:\n#{stderr}"
23
+ end
22
24
  end
23
- end
24
25
 
25
- def self.create_dir(path, perm = 0755)
26
- FileUtils.mkdir_p path, mode: perm if ! Dir.exist?(path)
27
- end
26
+ def self.create_dir(path, perm = 0755)
27
+ FileUtils.mkdir_p path, mode: perm unless Dir.exist? path
28
+ end
28
29
 
29
- def self.add_file(path, content = '')
30
- File.write path, content if ! File.exist? path
31
- end
30
+ def self.add_file(path, content = '')
31
+ File.write path, content unless File.exist? path
32
+ end
32
33
 
33
- def self.mkdir(dir)
34
- FileUtils.mkdir_p dir if ! Dir.exist? dir
35
- end
34
+ def self.mkdir(dir)
35
+ FileUtils.mkdir_p dir unless Dir.exist? dir
36
+ end
36
37
 
37
- def self.touch(file)
38
- File.write file, '' if ! File.exist? file
39
- end
38
+ def self.touch(file)
39
+ File.write file, '' unless File.exist? file
40
+ end
41
+
42
+ def self.echo(src, content = '')
43
+ File.write(src, "#{content}\n", mode: 'w')
44
+ end
45
+
46
+ def self.echo_a(src, content = '')
47
+ raise "No file #{src} found !" unless File.exist? src
48
+
49
+ File.write(src, "#{content}\n", mode: 'a') unless self.grep?(src, content)
50
+ end
40
51
 
41
- def self.grep?(file, regex)
42
- is_found = false
43
- return is_found if ! File.exist? file
44
- File.open(file) do |f|
45
- f.each do |line|
46
- is_found = true if line.match(regex)
52
+ def self.cp(src, dest)
53
+ raise "Src file #{src} no found" unless File.exist? src
54
+
55
+ FileUtils.cp(src, dest)
56
+ end
57
+
58
+ def self.grep?(file, regex)
59
+ is_found = false
60
+ return is_found unless File.exist? file
61
+ File.open(file) do |f|
62
+ f.each { |l| is_found = true if l.match(regex) }
47
63
  end
64
+ is_found
48
65
  end
49
- is_found
50
- end
51
66
 
52
- def self.sys(cmd)
53
- system(cmd)
54
- unless $?.success?
55
- raise "Error with #{cmd}"
67
+ def self.sys(cmd)
68
+ system(cmd)
69
+ raise "Error with #{cmd}" unless $?.success?
56
70
  end
57
- end
58
71
 
59
- def self.partuuid(dev)
60
- `lsblk -o PARTUUID #{dev}`.match(/[\w]+-[\w]+-[\w]+-[\w]+-[\w]+/)
61
- end
72
+ def self.partuuid(dev)
73
+ `lsblk -o PARTUUID #{dev}`.match(/\w+-\w+-\w+-\w+-\w+/)
74
+ end
62
75
 
63
- def self.uuid(dev)
64
- `lsblk -do UUID #{dev}`.match(/[\w]+-[\w]+-[\w]+-[\w]+-[\w]+/)
65
- end
76
+ def self.uuid(dev)
77
+ Dir.glob('/dev/disk/by-uuid/*').each do |f|
78
+ if File.readlink(f).match(/#{dev}/)
79
+ return f.delete_prefix('/dev/disk/by-uuid/')
80
+ end
81
+ end
82
+ end
66
83
 
67
- # Used with ZFS for the pool name
68
- def self.pool_id(dev)
69
- `lsblk -o PARTUUID #{dev}`.delete("\n").delete("PARTUUID").match(/[\w]{5}/)
84
+ # Used with ZFS for the pool name
85
+ def self.pool_id(dev)
86
+ if dev.match(/[0-9]/)
87
+ sleep 1
88
+ `lsblk -o PARTUUID #{dev}`.delete("\n").delete('PARTUUID').match(/\w{5}/)
89
+ else
90
+ puts 'Please, enter a pool name'
91
+ while true
92
+ print "\n> "
93
+ value = gets
94
+ if value.match(/[a-z]{4,20}/)
95
+ return value
96
+ end
97
+ puts "Bad name, you enter: #{value}"
98
+ puts 'Valid pool name use character only, between 4-20.'
99
+ end
100
+ end
101
+ end
102
+
103
+ module Void
104
+ def command(args)
105
+ print " => Exec: #{args}..."
106
+ cmd = "chroot #{Getch::MOUNTPOINT} /bin/bash -c \"#{args}\""
107
+ _, stderr, status = Open3.capture3(cmd)
108
+ if status.success?
109
+ puts "\s[OK]"
110
+ return
111
+ end
112
+ raise "\n[-] Fail cmd #{args} - #{stderr}."
113
+ end
114
+
115
+ def command_output(args)
116
+ print " => Exec: #{args}..."
117
+ cmd = "chroot #{Getch::MOUNTPOINT} /bin/bash -c \"#{args}\""
118
+ Open3.popen2e(cmd) do |_, stdout_err, wait_thr|
119
+ puts
120
+ stdout_err.each { |l| puts l }
121
+
122
+ exit_status = wait_thr.value
123
+ unless exit_status.success?
124
+ raise "\n[-] Fail cmd #{args} - #{stdout_err}."
125
+ end
126
+ end
127
+ end
128
+
129
+ def add_line(file, line)
130
+ raise "No file #{file} found !" unless File.exist? file
131
+
132
+ File.write(file, "#{line}\n", mode: 'a')
133
+ end
134
+
135
+ def search(file, text)
136
+ File.open(file).each do |line|
137
+ return true if line.match(/#{text}/)
138
+ end
139
+ false
140
+ end
141
+
142
+ # Used only when need password
143
+ def chroot(cmd)
144
+ unless system('chroot', Getch::MOUNTPOINT, '/bin/bash', '-c', cmd)
145
+ raise "[-] Error with: #{cmd}"
146
+ end
147
+ end
148
+
149
+ def s_uuid(dev)
150
+ device = dev.delete_prefix('/dev/')
151
+ Dir.glob('/dev/disk/by-partuuid/*').each do |f|
152
+ link = File.readlink(f)
153
+ return f.delete_prefix('/dev/disk/by-partuuid/') if link.match(/#{device}$/)
154
+ end
155
+ end
156
+
157
+ def line_fstab(dev, rest)
158
+ conf = "#{Getch::MOUNTPOINT}/etc/fstab"
159
+ device = s_uuid(dev)
160
+ raise "No partuuid for #{dev} #{device}" unless device
161
+ raise "Bad partuuid for #{dev} #{device}" if device.kind_of? Array
162
+
163
+ add_line(conf, "PARTUUID=#{device} #{rest}")
164
+ end
165
+
166
+ def grub_cmdline(*args)
167
+ conf = "#{Getch::MOUNTPOINT}/etc/default/grub"
168
+ list = args.join(' ')
169
+ secs = "GRUB_CMDLINE_LINUX=\"#{list} init_on_alloc=1 init_on_free=1"
170
+ secs += ' slab_nomerge pti=on slub_debug=ZF vsyscall=none"'
171
+ raise 'No default/grub found' unless File.exist? conf
172
+
173
+ unless search(conf, 'GRUB_CMDLINE_LINUX=')
174
+ File.write(conf, "#{secs}\n", mode: 'a')
175
+ end
176
+ end
177
+ end
178
+
179
+ module Cryptsetup
180
+ def encrypt(dev)
181
+ raise "No device #{dev}" unless File.exist? dev
182
+
183
+ puts " => Encrypting device #{dev}..."
184
+ if Helpers.efi? && Getch::OPTIONS[:os] == 'gentoo'
185
+ Helpers.sys("cryptsetup luksFormat --type luks #{dev}")
186
+ else
187
+ Helpers.sys("cryptsetup luksFormat --type luks1 #{dev}")
188
+ end
189
+ end
190
+
191
+ def open_crypt(dev, map_name)
192
+ raise "No device #{dev}" unless File.exist? dev
193
+
194
+ puts " => Opening encrypted device #{dev}..."
195
+ if Helpers.efi? && Getch::OPTIONS[:os] == 'gentoo'
196
+ Helpers.sys("cryptsetup open --type luks #{dev} #{map_name}")
197
+ else
198
+ Helpers.sys("cryptsetup open --type luks1 #{dev} #{map_name}")
199
+ end
200
+ end
201
+ end
70
202
  end
71
203
  end
data/lib/getch/log.rb CHANGED
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'logger'
2
4
 
3
5
  module Getch
4
6
  class Log
5
- def initialize
7
+ def initialize(verbose = false)
6
8
  @log_file = '/tmp/log_install.txt'
9
+ @verbose = verbose
7
10
  check_file
8
11
  init_log
9
12
  init_log_text
@@ -32,21 +35,21 @@ module Getch
32
35
  private
33
36
 
34
37
  def check_file
35
- puts "Creating log at #{@log_file}" if ! File.exist? @log_file
38
+ puts "Creating log at #{@log_file}" unless File.exist? @log_file
36
39
  end
37
40
 
38
41
  def init_log
39
- @logger = Logger.new(STDOUT)
40
- @logger.level = DEFAULT_OPTIONS[:verbose] ? Logger::DEBUG : Logger::INFO
41
- @logger.formatter = proc { |severity, datetime, progname, msg|
42
- "#{severity}, #{msg}\n"
42
+ @logger = Logger.new($stdout)
43
+ @logger.level = @verbose ? Logger::DEBUG : Logger::INFO
44
+ @logger.formatter = proc { |severity, _, _, msg|
45
+ "#{severity}, #{msg}\n"
43
46
  }
44
47
  end
45
48
 
46
49
  def init_log_text
47
50
  @logger_text = Logger.new(@log_file, 1)
48
51
  @logger_text.level = Logger::DEBUG
49
- @logger_text.formatter = proc { |severity, datetime, progname, msg|
52
+ @logger_text.formatter = proc { |severity, datetime, _, msg|
50
53
  "#{severity}, #{datetime}, #{msg}\n"
51
54
  }
52
55
  end
data/lib/getch/options.rb CHANGED
@@ -1,21 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'optparse'
2
4
 
3
5
  module Getch
4
6
  class Options
5
- attr_reader :language, :zoneinfo, :keymap, :disk, :fs, :username, :boot_disk, :cache_disk, :home_disk, :encrypt, :verbose
6
-
7
7
  def initialize(argv)
8
- @language = DEFAULT_OPTIONS[:language]
9
- @zoneinfo = DEFAULT_OPTIONS[:zoneinfo]
10
- @keymap = DEFAULT_OPTIONS[:keymap]
11
- @disk = DEFAULT_OPTIONS[:disk]
12
- @fs = DEFAULT_OPTIONS[:fs]
13
- @username = DEFAULT_OPTIONS[:username]
14
- @boot_disk = DEFAULT_OPTIONS[:boot_disk]
15
- @cache_disk = DEFAULT_OPTIONS[:cache_disk]
16
- @home_disk = DEFAULT_OPTIONS[:home_disk]
17
- @encrypt = DEFAULT_OPTIONS[:encrypt]
18
- @verbose = DEFAULT_OPTIONS[:verbose]
19
8
  parse(argv)
20
9
  end
21
10
 
@@ -23,48 +12,68 @@ module Getch
23
12
 
24
13
  def parse(argv)
25
14
  OptionParser.new do |opts|
26
- opts.on("-l", "--language LANG", "Default is en_US") do |lang|
27
- @language = lang
15
+ opts.version = VERSION
16
+
17
+ opts.on('-l', '--language LANG', 'Default is en_US') do |lang|
18
+ OPTIONS[:language] = lang
28
19
  end
29
- opts.on("-z", "--zoneinfo ZONE", "Default is US/Eastern") do |zone|
30
- @zoneinfo = zone
20
+
21
+ opts.on('-z', '--zoneinfo ZONE', 'Default is US/Eastern') do |zone|
22
+ OPTIONS[:zoneinfo] = Getch::Guard.zone(zone)
31
23
  end
32
- opts.on("-k", "--keymap KEY", "Default is us") do |key|
33
- @keymap = key
24
+
25
+ opts.on('-k', '--keymap KEY', 'Default is us') do |key|
26
+ OPTIONS[:keymap] = Getch::Guard.keymap(key)
34
27
  end
35
- opts.on("-d", "--disk DISK", "Disk where install Gentoo (sda,sdb), default use #{@disk}") do |disk|
36
- @disk = disk
28
+
29
+ opts.on('-d', '--disk DISK', 'Root Disk where install the system (sda,sdb)') do |disk|
30
+ OPTIONS[:disk] = Getch::Guard.disk(disk)
31
+ end
32
+
33
+ opts.on('-f', '--format FS', 'Can be ext4, lvm or zfs. Default use ext4') do |fs|
34
+ OPTIONS[:fs] = Getch::Guard.format(fs)
37
35
  end
38
- opts.on("-f", "--format FS", "Can be ext4, lvm or zfs. Default use ext4") do |fs|
39
- @fs = fs
40
- DEFAULT_OPTIONS[:fs] = fs # dont known why, but it should be enforce
36
+
37
+ opts.on('-u', '--username USERNAME', 'Create a new user /home/USERNAME with password.') do |user|
38
+ OPTIONS[:username] = user
41
39
  end
42
- opts.on("-u", "--username USERNAME", "Create a new user /home/USERNAME with password.") do |user|
43
- @username = user
40
+
41
+ opts.on('-o', '--os NAME', /gentoo|void/, 'Install distro NAME, can be gentoo or void.') do |name|
42
+ OPTIONS[:os] = name
44
43
  end
45
- opts.on("--separate-boot DISK", "Disk for the boot/efi partition, default use #{@disk}") do |boot|
46
- @boot_disk = boot
47
- DEFAULT_OPTIONS[:boot_disk] = boot
44
+
45
+ opts.on('--separate-boot DISK', 'Use a different DISK for the /boot or /efi partition.') do |boot|
46
+ OPTIONS[:boot_disk] = Getch::Guard.disk(boot)
48
47
  end
49
- opts.on("--separate-cache DISK", "Disk for the swap partition, add ZIL/L2ARC for ZFS when set, default use #{@disk}") do |swap|
50
- @cache_disk = swap
51
- DEFAULT_OPTIONS[:cache_disk] = swap
48
+
49
+ opts.on('--separate-cache DISK', 'Use a different DISK for the swap partition, add ZIL/L2ARC for ZFS when set.') do |swap|
50
+ OPTIONS[:cache_disk] = Getch::Guard.disk(swap)
52
51
  end
53
- opts.on("--separate-home DISK", "Disk for the /home partition, default is nil") do |home|
54
- @home_disk = home
55
- DEFAULT_OPTIONS[:home_disk] = home
52
+
53
+ opts.on('--separate-home DISK', 'Use a different DISK for the /home partition.') do |home|
54
+ OPTIONS[:home_disk] = Getch::Guard.disk(home)
56
55
  end
57
- opts.on("--encrypt", "Encrypt your system.") do
58
- @encrypt = true
56
+
57
+ opts.on('--encrypt', 'Encrypt your system, use LUKS or native encryption for ZFS.') do
58
+ OPTIONS[:encrypt] = true
59
59
  end
60
- opts.on("--verbose", "Write more messages to the standard output.") do
61
- @verbose = true
60
+
61
+ opts.on('--verbose', 'Write more messages to the standard output.') do
62
+ OPTIONS[:verbose] = true
62
63
  end
63
- opts.on("-h", "--help", "Display this") do
64
+
65
+ opts.on('-h', '--help', 'Display this') do
64
66
  puts opts
65
67
  exit
66
68
  end
67
- end.parse!(into: DEFAULT_OPTIONS)
69
+
70
+ begin
71
+ opts.parse!(argv)
72
+ rescue OptionParser::ParseError => e
73
+ warn e.message, "\n", opts
74
+ exit 1
75
+ end
76
+ end
68
77
  end
69
78
  end
70
79
  end
data/lib/getch/states.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'yaml'
2
4
 
3
5
  module Getch
@@ -37,6 +39,11 @@ module Getch
37
39
  save
38
40
  end
39
41
 
42
+ def bootloader
43
+ STATES[:gentoo_bootloader] = true
44
+ save
45
+ end
46
+
40
47
  def kernel
41
48
  STATES[:gentoo_kernel] = true
42
49
  save
@@ -45,16 +52,16 @@ module Getch
45
52
  private
46
53
 
47
54
  def save
48
- File.open(@file, 'w') { |f| YAML::dump(STATES, f) }
55
+ File.open(@file, 'w') { |f| YAML.dump(STATES, f) }
49
56
  end
50
57
 
51
- def load_state()
58
+ def load_state
52
59
  if File.exist? @file
53
60
  state_file = YAML.load_file(@file)
54
61
  STATES.merge!(state_file)
55
62
  else
56
63
  save
57
- STDERR.puts "Initialize states"
64
+ warn 'Initialize states'
58
65
  end
59
66
  end
60
67
  end
data/lib/getch/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Getch
2
- VERSION = '0.1.2'.freeze
2
+ VERSION = '0.1.9'.freeze
3
3
  end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fileutils'
4
+
5
+ module Getch
6
+ module Void
7
+ class Boot
8
+ include Helpers::Void
9
+
10
+ def initialize
11
+ @efi = Helpers.efi?
12
+ @class_fs = Getch::select_fs
13
+ @fs = @class_fs::Void.new
14
+ @user = OPTIONS[:username]
15
+ @fs.create_key if @class_fs::Void.method_defined? :create_key
16
+ end
17
+
18
+ def new_user
19
+ puts ' => Add a password for root.'
20
+ chroot 'passwd'
21
+ puts
22
+ return unless @user
23
+
24
+ print " => Creating a new user #{@user}..."
25
+ puts "\s[OK]"
26
+ command "useradd -m -G users,wheel,audio,video #{@user}"
27
+ puts " => Add a password for #{@user}."
28
+ chroot "passwd #{@user}"
29
+ puts
30
+ end
31
+
32
+ def fstab
33
+ print ' => Configuring fstab...'
34
+ @fs.fstab
35
+ puts "\s[OK]"
36
+ @fs.crypttab if @class_fs::Void.method_defined? :crypttab
37
+ end
38
+
39
+ # Test dracut in chroot (version in /lib/modules/5.1.7-1):
40
+ # dracut -H -f --kver 5.1.7-1
41
+ def dracut
42
+ print ' => Configuring Dracut...'
43
+ @fs.config_dracut
44
+ @fs.kernel_cmdline_dracut
45
+ puts "\s[OK]"
46
+ end
47
+
48
+ def grub
49
+ disk = OPTIONS[:boot_disk] ||= OPTIONS[:disk]
50
+ # https://wiki.archlinux.org/title/Install_Arch_Linux_on_ZFS
51
+ prefix = OPTIONS[:fs] == 'zfs' ? 'ZPOOL_VDEV_NAME_PATH=1' : ''
52
+ print " => Installing Grub on #{disk}..."
53
+ if @efi
54
+ command_output 'xbps-install -y grub-x86_64-efi'
55
+ @fs.config_grub if @class_fs::Void.method_defined? :config_grub
56
+ command_output "#{prefix} grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=\"Void\""
57
+ else
58
+ command_output 'xbps-install -y grub'
59
+ @fs.config_grub if @class_fs::Void.method_defined? :config_grub
60
+ command_output "#{prefix} grub-install /dev/#{disk}"
61
+ end
62
+ end
63
+
64
+ def initramfs
65
+ puts ' => Generating an initramfs...'
66
+ command_output 'xbps-reconfigure -fa' # this command also start grub-mkconfig
67
+ end
68
+
69
+ def finish
70
+ puts
71
+ puts '[*!*] Install finished [*!*]'
72
+ puts
73
+ @fs.finish
74
+ puts
75
+ end
76
+
77
+ private
78
+
79
+ def chroot(cmd)
80
+ system('chroot', MOUNTPOINT, '/bin/bash', '-c', cmd)
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Getch
4
+ module Void
5
+ class Chroot
6
+ include Helpers::Void
7
+
8
+ def initialize
9
+ @state = Getch::States.new
10
+ @pkgs = []
11
+ mount
12
+ end
13
+
14
+ # https://docs.voidlinux.org/installation/guides/chroot.html#install-base-system-rootfs-method-only
15
+ def update
16
+ return if STATES[:gentoo_update]
17
+
18
+ command_output '/usr/bin/xbps-install -Suy xbps' # y to force (--yes)
19
+ command_output '/usr/bin/xbps-install -uy'
20
+ command_output '/usr/bin/xbps-install -y base-system'
21
+ #command_output '/usr/bin/xbps-remove base-voidstrap'
22
+ @state.update
23
+ end
24
+
25
+ def extras
26
+ @pkgs << 'vim'
27
+ @pkgs << 'iptables'
28
+ @pkgs << 'iwd'
29
+ end
30
+
31
+ def fs
32
+ @pkgs << 'lvm2' if OPTIONS[:fs] == 'lvm'
33
+ @pkgs << 'zfs' if OPTIONS[:fs] == 'zfs'
34
+ @pkgs << 'cryptsetup' if OPTIONS[:encrypt]
35
+ end
36
+
37
+ def install_pkgs
38
+ all_pkgs = @pkgs.join(' ')
39
+ command_output "/usr/bin/xbps-install -y #{all_pkgs}"
40
+ end
41
+
42
+ private
43
+
44
+ def mount
45
+ puts 'Populate /proc, /sys and /dev.'
46
+ Helpers.exec_or_die("mount --types proc /proc \"#{MOUNTPOINT}/proc\"")
47
+ Helpers.exec_or_die("mount --rbind /sys \"#{MOUNTPOINT}/sys\"")
48
+ Helpers.exec_or_die("mount --make-rslave \"#{MOUNTPOINT}/sys\"")
49
+ Helpers.exec_or_die("mount --rbind /dev \"#{MOUNTPOINT}/dev\"")
50
+ Helpers.exec_or_die("mount --make-rslave \"#{MOUNTPOINT}/dev\"")
51
+ # Maybe add /dev/shm like describe here:
52
+ # https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Base
53
+ end
54
+ end
55
+ end
56
+ end