getch 0.1.3 → 0.3.0
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +75 -35
- data/assets/network-stack.conf +63 -0
- data/assets/system.conf +38 -0
- data/bin/getch +14 -4
- data/lib/clean.rb +149 -0
- data/lib/cmdline.rb +128 -0
- data/lib/cryptsetup.rb +132 -0
- data/lib/devs.rb +199 -0
- data/lib/dracut/encrypt.rb +36 -0
- data/lib/dracut/hybrid.rb +15 -0
- data/lib/dracut/lvm.rb +14 -0
- data/lib/dracut/minimal.rb +11 -0
- data/lib/dracut/root.rb +45 -0
- data/lib/dracut/zfs.rb +35 -0
- data/lib/dracut.rb +11 -0
- data/lib/fstab/encrypt.rb +44 -0
- data/lib/fstab/hybrid.rb +34 -0
- data/lib/fstab/lvm.rb +25 -0
- data/lib/fstab/minimal.rb +6 -0
- data/lib/fstab/root.rb +93 -0
- data/lib/fstab/zfs.rb +23 -0
- data/lib/fstab.rb +11 -0
- data/lib/getch/assembly.rb +150 -0
- data/lib/getch/command.rb +94 -124
- data/lib/getch/config/account.rb +39 -0
- data/lib/getch/config/dhcp.rb +104 -0
- data/lib/getch/config/grub.rb +42 -0
- data/lib/getch/config/iwd.rb +60 -0
- data/lib/getch/config/keymap.rb +78 -0
- data/lib/getch/config/locale.rb +96 -0
- data/lib/getch/config/portage.rb +90 -0
- data/lib/getch/config/pre_network.rb +37 -0
- data/lib/getch/config/timezone.rb +52 -0
- data/lib/getch/config/void.rb +11 -0
- data/lib/getch/config.rb +19 -53
- data/lib/getch/device.rb +67 -0
- data/lib/getch/filesystem/ext4/encrypt/config.rb +11 -68
- data/lib/getch/filesystem/ext4/encrypt/deps.rb +17 -25
- data/lib/getch/filesystem/ext4/encrypt/device.rb +13 -5
- data/lib/getch/filesystem/ext4/encrypt/format.rb +8 -15
- data/lib/getch/filesystem/ext4/encrypt/mount.rb +9 -13
- data/lib/getch/filesystem/ext4/encrypt/partition.rb +10 -82
- data/lib/getch/filesystem/ext4/encrypt/void.rb +63 -0
- data/lib/getch/filesystem/ext4/encrypt.rb +4 -0
- data/lib/getch/filesystem/ext4/hybrid/config.rb +27 -0
- data/lib/getch/filesystem/ext4/hybrid/deps.rb +55 -0
- data/lib/getch/filesystem/ext4/hybrid/device.rb +24 -0
- data/lib/getch/filesystem/ext4/hybrid/format.rb +23 -0
- data/lib/getch/filesystem/ext4/hybrid/mount.rb +21 -0
- data/lib/getch/filesystem/ext4/hybrid/partition.rb +27 -0
- data/lib/getch/filesystem/ext4/hybrid/void.rb +62 -0
- data/lib/getch/filesystem/ext4/hybrid.rb +19 -0
- data/lib/getch/filesystem/ext4/lvm/config.rb +25 -0
- data/lib/getch/filesystem/ext4/lvm/deps.rb +56 -0
- data/lib/getch/filesystem/ext4/lvm/device.rb +28 -0
- data/lib/getch/filesystem/ext4/lvm/format.rb +21 -0
- data/lib/getch/filesystem/ext4/lvm/mount.rb +21 -0
- data/lib/getch/filesystem/ext4/lvm/partition.rb +28 -0
- data/lib/getch/filesystem/{lvm.rb → ext4/lvm.rb} +8 -3
- data/lib/getch/filesystem/ext4/minimal/config.rb +25 -0
- data/lib/getch/filesystem/ext4/{device.rb → minimal/deps.rb} +4 -3
- data/lib/getch/filesystem/ext4/minimal/device.rb +22 -0
- data/lib/getch/filesystem/ext4/minimal/format.rb +23 -0
- data/lib/getch/filesystem/ext4/minimal/mount.rb +21 -0
- data/lib/getch/filesystem/ext4/minimal/partition.rb +28 -0
- data/lib/getch/filesystem/ext4/minimal.rb +19 -0
- data/lib/getch/filesystem/ext4.rb +9 -6
- data/lib/getch/filesystem/zfs/encrypt/config.rb +12 -57
- data/lib/getch/filesystem/zfs/encrypt/deps.rb +7 -86
- data/lib/getch/filesystem/zfs/encrypt/device.rb +9 -45
- data/lib/getch/filesystem/zfs/encrypt/format.rb +8 -90
- data/lib/getch/filesystem/zfs/encrypt/mount.rb +16 -34
- data/lib/getch/filesystem/zfs/encrypt/partition.rb +8 -50
- data/lib/getch/filesystem/zfs/encrypt.rb +4 -0
- data/lib/getch/filesystem/zfs/minimal/config.rb +37 -0
- data/lib/getch/filesystem/zfs/minimal/deps.rb +126 -0
- data/lib/getch/filesystem/zfs/minimal/device.rb +24 -0
- data/lib/getch/filesystem/zfs/minimal/format.rb +23 -0
- data/lib/getch/filesystem/zfs/minimal/mount.rb +23 -0
- data/lib/getch/filesystem/zfs/minimal/partition.rb +23 -0
- data/lib/getch/filesystem/zfs/minimal.rb +19 -0
- data/lib/getch/filesystem/zfs.rb +3 -6
- data/lib/getch/filesystem.rb +2 -6
- data/lib/getch/gentoo/bootloader.rb +47 -0
- data/lib/getch/gentoo/finalize.rb +25 -0
- data/lib/getch/gentoo/post_config.rb +75 -0
- data/lib/getch/gentoo/pre_config.rb +37 -0
- data/lib/getch/gentoo/services.rb +18 -0
- data/lib/getch/gentoo/sources.rb +82 -52
- data/lib/getch/gentoo/tarball.rb +91 -0
- data/lib/getch/gentoo/terraform.rb +34 -0
- data/lib/getch/gentoo/update.rb +54 -0
- data/lib/getch/gentoo/use.rb +11 -12
- data/lib/getch/gentoo/use_flag.rb +74 -52
- data/lib/getch/gentoo.rb +11 -63
- data/lib/getch/guard.rb +71 -0
- data/lib/getch/helpers.rb +128 -48
- data/lib/getch/log.rb +91 -26
- data/lib/getch/options.rb +79 -40
- data/lib/getch/states.rb +37 -10
- data/lib/getch/tree.rb +56 -0
- data/lib/getch/version.rb +1 -1
- data/lib/getch/void/bootloader.rb +18 -0
- data/lib/getch/void/finalize.rb +31 -0
- data/lib/getch/void/post_config.rb +19 -0
- data/lib/getch/void/pre_config.rb +18 -0
- data/lib/getch/void/services.rb +18 -0
- data/lib/getch/void/tarball.rb +89 -0
- data/lib/getch/void/terraform.rb +28 -0
- data/lib/getch/void/update.rb +33 -0
- data/lib/getch/void.rb +15 -0
- data/lib/getch.rb +104 -92
- data/lib/luks.rb +239 -0
- data/lib/lvm2.rb +112 -0
- data/lib/mkfs/zfs.rb +167 -0
- data/lib/mkfs.rb +140 -0
- data/lib/mountfs.rb +154 -0
- data/lib/nito.rb +131 -0
- data/lib/sgdisk.rb +160 -0
- data.tar.gz.sig +0 -0
- metadata +96 -45
- metadata.gz.sig +0 -0
- data/.gitignore +0 -2
- data/CHANGELOG.md +0 -90
- data/Rakefile +0 -21
- data/bin/setup.sh +0 -90
- data/getch.gemspec +0 -25
- data/lib/getch/filesystem/clean.rb +0 -51
- data/lib/getch/filesystem/device.rb +0 -61
- data/lib/getch/filesystem/ext4/config.rb +0 -58
- data/lib/getch/filesystem/ext4/deps.rb +0 -22
- data/lib/getch/filesystem/ext4/format.rb +0 -28
- data/lib/getch/filesystem/ext4/mount.rb +0 -23
- data/lib/getch/filesystem/ext4/partition.rb +0 -52
- data/lib/getch/filesystem/lvm/config.rb +0 -59
- data/lib/getch/filesystem/lvm/deps.rb +0 -42
- data/lib/getch/filesystem/lvm/device.rb +0 -43
- data/lib/getch/filesystem/lvm/encrypt/config.rb +0 -71
- data/lib/getch/filesystem/lvm/encrypt/deps.rb +0 -46
- data/lib/getch/filesystem/lvm/encrypt/device.rb +0 -46
- data/lib/getch/filesystem/lvm/encrypt/format.rb +0 -32
- data/lib/getch/filesystem/lvm/encrypt/mount.rb +0 -25
- data/lib/getch/filesystem/lvm/encrypt/partition.rb +0 -80
- data/lib/getch/filesystem/lvm/encrypt.rb +0 -15
- data/lib/getch/filesystem/lvm/format.rb +0 -29
- data/lib/getch/filesystem/lvm/mount.rb +0 -23
- data/lib/getch/filesystem/lvm/partition.rb +0 -69
- data/lib/getch/filesystem/mount.rb +0 -56
- data/lib/getch/filesystem/partition.rb +0 -77
- data/lib/getch/filesystem/zfs/config.rb +0 -57
- data/lib/getch/filesystem/zfs/deps.rb +0 -95
- data/lib/getch/filesystem/zfs/device.rb +0 -58
- data/lib/getch/filesystem/zfs/format.rb +0 -114
- data/lib/getch/filesystem/zfs/mount.rb +0 -48
- data/lib/getch/filesystem/zfs/partition.rb +0 -64
- data/lib/getch/gentoo/boot.rb +0 -109
- data/lib/getch/gentoo/chroot.rb +0 -77
- data/lib/getch/gentoo/config.rb +0 -129
- data/lib/getch/gentoo/stage.rb +0 -74
data/lib/getch/helpers.rb
CHANGED
|
@@ -1,71 +1,151 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'open-uri'
|
|
2
4
|
require 'open3'
|
|
3
5
|
require 'fileutils'
|
|
6
|
+
require 'nito'
|
|
4
7
|
|
|
5
|
-
module
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
module Getch
|
|
9
|
+
module Helpers
|
|
10
|
+
def self.efi?
|
|
11
|
+
Dir.exist? '/sys/firmware/efi/efivars'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.systemd?
|
|
15
|
+
Dir.exist? "#{OPTIONS[:mountpoint]}/etc/systemd"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.openrc?
|
|
19
|
+
File.exist? "#{OPTIONS[:mountpoint]}/etc/conf.d/keymaps"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.runit?
|
|
23
|
+
Dir.exist? "#{OPTIONS[:mountpoint]}/etc/runit"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def self.grub?
|
|
27
|
+
File.exist? "#{OPTIONS[:mountpoint]}/etc/default/grub"
|
|
28
|
+
end
|
|
9
29
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
f.write(l.read)
|
|
30
|
+
def self.get_file_online(url, dest)
|
|
31
|
+
URI.open(url) do |l|
|
|
32
|
+
File.open(dest, "wb") { |f| f.write(l.read) }
|
|
14
33
|
end
|
|
34
|
+
rescue Net::OpenTimeout => e
|
|
35
|
+
abort "DNS error #{e}"
|
|
15
36
|
end
|
|
16
|
-
end
|
|
17
37
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
38
|
+
def self.exec_or_die(cmd)
|
|
39
|
+
_, stderr, status = Open3.capture3(cmd)
|
|
40
|
+
unless status.success?
|
|
41
|
+
abort "Problem running #{cmd}, stderr was:\n#{stderr}"
|
|
42
|
+
end
|
|
22
43
|
end
|
|
23
|
-
end
|
|
24
44
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
45
|
+
def self.sys(cmd)
|
|
46
|
+
system(cmd)
|
|
47
|
+
$?.success? || abort("Error with #{cmd}")
|
|
48
|
+
end
|
|
28
49
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
50
|
+
def self.partuuid(dev)
|
|
51
|
+
`lsblk -o PARTUUID #{dev}`.match(/\w+-\w+-\w+-\w+-\w+/)
|
|
52
|
+
end
|
|
32
53
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
54
|
+
def self.uuid(dev)
|
|
55
|
+
Dir.glob('/dev/disk/by-uuid/*').each do |f|
|
|
56
|
+
if File.readlink(f).match(/#{dev}/)
|
|
57
|
+
return f.delete_prefix('/dev/disk/by-uuid/')
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
Log.new.fatal("UUID on #{dev} is no found")
|
|
61
|
+
end
|
|
36
62
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
63
|
+
def self.get_dm(name)
|
|
64
|
+
Dir.glob('/dev/mapper/*').each do |f|
|
|
65
|
+
if f =~ /#{name}/ && f != '/dev/mapper/control'
|
|
66
|
+
return File.readlink(f).tr('../', '')
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
Log.new.fatal("Dm for #{name} is no found")
|
|
70
|
+
end
|
|
40
71
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
72
|
+
# Used by ZFS for the pool creation
|
|
73
|
+
# sleep is necessary here at least the first time
|
|
74
|
+
def self.get_id(dev)
|
|
75
|
+
sleep 3
|
|
76
|
+
Dir.glob('/dev/disk/by-id/*').each do |f|
|
|
77
|
+
if File.readlink(f).match(/#{dev}/)
|
|
78
|
+
return f.delete_prefix('/dev/disk/by-id/')
|
|
79
|
+
end
|
|
47
80
|
end
|
|
81
|
+
Log.new.fatal("ID on #{dev} is no found")
|
|
48
82
|
end
|
|
49
|
-
is_found
|
|
50
|
-
end
|
|
51
83
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
84
|
+
# https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Base
|
|
85
|
+
def self.mount_all
|
|
86
|
+
dest = OPTIONS[:mountpoint]
|
|
87
|
+
NiTo.mount '--types proc /proc', "#{dest}/proc"
|
|
88
|
+
['dev', 'sys', 'run'].each do |d|
|
|
89
|
+
NiTo.mount '--rbind', "/#{d}", "#{dest}/#{d}"
|
|
90
|
+
NiTo.mount '--make-rslave', "#{dest}/#{d}"
|
|
91
|
+
end
|
|
56
92
|
end
|
|
57
|
-
end
|
|
58
93
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
94
|
+
def self.get_memory
|
|
95
|
+
mem = nil
|
|
96
|
+
File.open('/proc/meminfo').each do |l|
|
|
97
|
+
t = l.split(' ') if l =~ /memtotal/i
|
|
98
|
+
t && mem = t[1]
|
|
99
|
+
end
|
|
100
|
+
mem || Log.new.fatal('get_memory - failed to get memory')
|
|
62
101
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
102
|
+
mem += 'K'
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# get the sector size of a disk
|
|
106
|
+
def self.get_bs(path)
|
|
107
|
+
cmd = Getch::Command.new('blockdev', '--getpbsz', path)
|
|
108
|
+
cmd.res
|
|
109
|
+
end
|
|
66
110
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
111
|
+
module Void
|
|
112
|
+
def command_output(args)
|
|
113
|
+
print " => Exec: #{args}..."
|
|
114
|
+
cmd = "chroot #{Getch::MOUNTPOINT} /bin/bash -c \"#{args}\""
|
|
115
|
+
Open3.popen2e(cmd) do |_, stdout_err, wait_thr|
|
|
116
|
+
puts
|
|
117
|
+
stdout_err.each { |l| puts l }
|
|
118
|
+
|
|
119
|
+
exit_status = wait_thr.value
|
|
120
|
+
unless exit_status.success?
|
|
121
|
+
raise "\n[-] Fail cmd #{args} - #{stdout_err}."
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Used only when need password
|
|
127
|
+
def chroot(cmd)
|
|
128
|
+
unless system('chroot', Getch::MOUNTPOINT, '/bin/bash', '-c', cmd)
|
|
129
|
+
raise "[-] Error with: #{cmd}"
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def s_uuid(dev)
|
|
134
|
+
device = dev.delete_prefix('/dev/')
|
|
135
|
+
Dir.glob('/dev/disk/by-partuuid/*').each do |f|
|
|
136
|
+
link = File.readlink(f)
|
|
137
|
+
return f.delete_prefix('/dev/disk/by-partuuid/') if link.match(/#{device}$/)
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def line_fstab(dev, rest)
|
|
142
|
+
conf = "#{Getch::MOUNTPOINT}/etc/fstab"
|
|
143
|
+
device = s_uuid(dev)
|
|
144
|
+
raise "No partuuid for #{dev} #{device}" unless device
|
|
145
|
+
raise "Bad partuuid for #{dev} #{device}" if device.kind_of? Array
|
|
146
|
+
|
|
147
|
+
add_line(conf, "PARTUUID=#{device} #{rest}")
|
|
148
|
+
end
|
|
149
|
+
end
|
|
70
150
|
end
|
|
71
151
|
end
|
data/lib/getch/log.rb
CHANGED
|
@@ -1,54 +1,119 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'logger'
|
|
2
4
|
|
|
3
5
|
module Getch
|
|
4
6
|
class Log
|
|
5
|
-
|
|
7
|
+
|
|
8
|
+
WHITE = "\033[37m"
|
|
9
|
+
CYAN = "\033[36m"
|
|
10
|
+
MAGENTA = "\033[35m"
|
|
11
|
+
BLUE = "\033[34m"
|
|
12
|
+
YELLOW = "\033[33m"
|
|
13
|
+
GREEN = "\033[32m"
|
|
14
|
+
RED = "\033[31m"
|
|
15
|
+
BLACK = "\033[30m"
|
|
16
|
+
BOLD = "\033[1m"
|
|
17
|
+
CLEAR = "\033[0m"
|
|
18
|
+
|
|
19
|
+
def initialize(verbose = false)
|
|
6
20
|
@log_file = '/tmp/log_install.txt'
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
init_log_text
|
|
21
|
+
@verbose = verbose
|
|
22
|
+
init
|
|
10
23
|
end
|
|
11
24
|
|
|
25
|
+
# TODO remove length
|
|
12
26
|
def info(msg)
|
|
13
|
-
|
|
14
|
-
|
|
27
|
+
tab = msg.match("\n") ? '' : add_tab(msg)
|
|
28
|
+
l = msg.length
|
|
29
|
+
@info.info "#{GREEN}#{BOLD} >>> #{CLEAR}#{l} #{WHITE}#{msg}#{CLEAR}" + tab
|
|
30
|
+
@save.info(msg)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def result_ok
|
|
34
|
+
@result.info "#{GREEN}[ #{WHITE}ok#{GREEN} ]#{CLEAR}\n"
|
|
15
35
|
end
|
|
16
36
|
|
|
17
37
|
def error(msg)
|
|
18
|
-
@
|
|
19
|
-
@
|
|
38
|
+
@error.error "#{BOLD} > #{CLEAR}#{WHITE}#{msg}#{CLEAR}"
|
|
39
|
+
@save.error(msg)
|
|
20
40
|
end
|
|
21
41
|
|
|
22
42
|
def debug(msg)
|
|
23
|
-
@
|
|
24
|
-
@
|
|
43
|
+
@debug.debug "#{BOLD} > #{CLEAR}#{WHITE}#{msg}#{CLEAR}"
|
|
44
|
+
@save.debug(msg)
|
|
25
45
|
end
|
|
26
46
|
|
|
27
47
|
def fatal(msg)
|
|
28
|
-
@
|
|
29
|
-
@
|
|
48
|
+
@fatal.fatal "#{BOLD} > #{CLEAR}#{WHITE}#{msg}#{CLEAR}\n"
|
|
49
|
+
@save.fatal(msg)
|
|
50
|
+
exit 1
|
|
30
51
|
end
|
|
31
52
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def check_file
|
|
35
|
-
puts "Creating log at #{@log_file}" if ! File.exist? @log_file
|
|
36
|
-
end
|
|
53
|
+
protected
|
|
37
54
|
|
|
38
55
|
def init_log
|
|
39
|
-
@
|
|
40
|
-
@
|
|
41
|
-
@
|
|
42
|
-
"#{severity}
|
|
56
|
+
@info = Logger.new $stdout
|
|
57
|
+
@info.level = @verbose ? Logger::DEBUG : Logger::INFO
|
|
58
|
+
@info.formatter = proc { |severity, _, _, msg|
|
|
59
|
+
"#{BOLD}#{severity[0]}#{CLEAR}#{msg}"
|
|
43
60
|
}
|
|
44
61
|
end
|
|
45
62
|
|
|
46
|
-
def
|
|
47
|
-
@
|
|
48
|
-
@
|
|
49
|
-
|
|
50
|
-
|
|
63
|
+
def init_res
|
|
64
|
+
@result = Logger.new $stdout, level: 'INFO'
|
|
65
|
+
@result.formatter = proc do | _, _, _, msg | msg end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def init_debug
|
|
69
|
+
@debug = Logger.new $stdout
|
|
70
|
+
@debug.formatter = proc do | severity, _, _, msg |
|
|
71
|
+
"\n#{BLUE}#{BOLD}#{severity[0]}#{CLEAR} [#{Process.pid}]#{CLEAR}#{msg}"
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def init_error
|
|
76
|
+
@error = Logger.new $stdout
|
|
77
|
+
@error.formatter = proc do | severity, _, _, msg |
|
|
78
|
+
"#{RED}#{BOLD}#{severity[0]}#{CLEAR}#{msg}\t"
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def init_fatal
|
|
83
|
+
@fatal = Logger.new $stdout
|
|
84
|
+
@fatal.formatter = proc do | severity, _, _, msg |
|
|
85
|
+
"\n#{YELLOW}#{BOLD}#{severity[0]}#{CLEAR}#{msg}"
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def init_save
|
|
90
|
+
File.exist? @log_file || puts("Creating log at #{@log_file}")
|
|
91
|
+
@save = Logger.new(@log_file, 1)
|
|
92
|
+
@save.level = Logger::DEBUG
|
|
93
|
+
@save.formatter = proc { |severity, datetime, _, msg|
|
|
94
|
+
"#{severity}, #{datetime}, #{msg}\n"
|
|
51
95
|
}
|
|
52
96
|
end
|
|
97
|
+
|
|
98
|
+
private
|
|
99
|
+
|
|
100
|
+
def init
|
|
101
|
+
init_log
|
|
102
|
+
init_res
|
|
103
|
+
init_error
|
|
104
|
+
init_debug
|
|
105
|
+
init_fatal
|
|
106
|
+
init_save
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def add_tab(text)
|
|
110
|
+
case text.length
|
|
111
|
+
when 39..47 then "\t\t"
|
|
112
|
+
when 31..38 then "\t\t\t"
|
|
113
|
+
when 23..30 then "\t\t\t\t"
|
|
114
|
+
when 16..22 then "\t\t\t\t\t"
|
|
115
|
+
else "\t"
|
|
116
|
+
end
|
|
117
|
+
end
|
|
53
118
|
end
|
|
54
119
|
end
|
data/lib/getch/options.rb
CHANGED
|
@@ -1,21 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'optparse'
|
|
4
|
+
require 'nito'
|
|
2
5
|
|
|
3
6
|
module Getch
|
|
4
7
|
class Options
|
|
5
|
-
|
|
8
|
+
include NiTo
|
|
6
9
|
|
|
7
10
|
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
11
|
parse(argv)
|
|
20
12
|
end
|
|
21
13
|
|
|
@@ -23,48 +15,95 @@ module Getch
|
|
|
23
15
|
|
|
24
16
|
def parse(argv)
|
|
25
17
|
OptionParser.new do |opts|
|
|
26
|
-
opts.
|
|
27
|
-
|
|
18
|
+
opts.banner = 'Usage: getch [OPTION...] <action>'
|
|
19
|
+
|
|
20
|
+
opts.separator "\noptions:"
|
|
21
|
+
|
|
22
|
+
opts.on('-l', '--language LANG', 'Default is en_US') do |lang|
|
|
23
|
+
OPTIONS[:language] = lang
|
|
28
24
|
end
|
|
29
|
-
|
|
30
|
-
|
|
25
|
+
|
|
26
|
+
opts.on('-t', '--timezone ZONE', 'Default is UTC') do |zone|
|
|
27
|
+
OPTIONS[:timezone] = Getch::Guard.zone(zone)
|
|
31
28
|
end
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
|
|
30
|
+
opts.on('-k', '--keymap KEY', 'Default is us') do |key|
|
|
31
|
+
OPTIONS[:keymap] = Getch::Guard.keymap(key)
|
|
34
32
|
end
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
|
|
34
|
+
opts.on('-d', '--disk DISK',
|
|
35
|
+
'Root Disk where install the system (sda,sdb)') do |disk|
|
|
36
|
+
OPTIONS[:disk] = Getch::Guard.disk(disk)
|
|
37
37
|
end
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
|
|
39
|
+
opts.on('-f', '--format FS',
|
|
40
|
+
'Can be ext4, zfs. Default use ext4') do |fs|
|
|
41
|
+
OPTIONS[:fs] = Getch::Guard.format(fs)
|
|
41
42
|
end
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
|
|
44
|
+
opts.on('-u', '--username USERNAME',
|
|
45
|
+
'Create a new user /home/USERNAME with password.') do |user|
|
|
46
|
+
OPTIONS[:username] = user
|
|
44
47
|
end
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
+
|
|
49
|
+
opts.on('-o', '--os NAME', /gentoo|void/,
|
|
50
|
+
'Install distro NAME, can be gentoo or void.') do |name|
|
|
51
|
+
OPTIONS[:os] = name
|
|
48
52
|
end
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
53
|
+
|
|
54
|
+
opts.on('--separate-boot DISK',
|
|
55
|
+
'Use a different DISK for the /boot or /efi partition.') do |boot|
|
|
56
|
+
OPTIONS[:boot_disk] = Getch::Guard.disk(boot)
|
|
52
57
|
end
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
58
|
+
|
|
59
|
+
opts.on('--separate-cache DISK',
|
|
60
|
+
'Use a different DISK for the swap partition, add ZIL/L2ARC for ZFS when set.') do |swap|
|
|
61
|
+
OPTIONS[:cache_disk] = Getch::Guard.disk(swap)
|
|
56
62
|
end
|
|
57
|
-
|
|
58
|
-
|
|
63
|
+
|
|
64
|
+
opts.on('--separate-home DISK',
|
|
65
|
+
'Use a different DISK for the /home partition.') do |home|
|
|
66
|
+
OPTIONS[:home_disk] = Getch::Guard.disk(home)
|
|
59
67
|
end
|
|
60
|
-
|
|
61
|
-
|
|
68
|
+
|
|
69
|
+
opts.on('--lvm',
|
|
70
|
+
'System will use LVM, do not work with ZFS.') do
|
|
71
|
+
OPTIONS[:lvm] = true
|
|
62
72
|
end
|
|
63
|
-
|
|
73
|
+
|
|
74
|
+
opts.on('--encrypt',
|
|
75
|
+
'Encrypt your system, use LUKS or native encryption for ZFS.') do
|
|
76
|
+
OPTIONS[:encrypt] = true
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
opts.on('--musl', 'Prefer to install Musl over Glibc.') do
|
|
80
|
+
OPTIONS[:musl] = true
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
opts.on('--verbose', 'Write more messages to the standard output.') do
|
|
84
|
+
OPTIONS[:verbose] = true
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
opts.on('-h', '--help', 'Display this') do
|
|
64
88
|
puts opts
|
|
65
89
|
exit
|
|
66
90
|
end
|
|
67
|
-
|
|
91
|
+
|
|
92
|
+
opts.separator "\n<action> is one of:"
|
|
93
|
+
|
|
94
|
+
opts.on('--restart', 'Restart the whole installation') do
|
|
95
|
+
rm '/tmp/install_gentoo.yaml'
|
|
96
|
+
rm '/tmp/log_install.txt'
|
|
97
|
+
rm '/tmp/getch_devs.yaml'
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
begin
|
|
101
|
+
opts.parse!(argv)
|
|
102
|
+
rescue OptionParser::ParseError => e
|
|
103
|
+
warn e.message, "\n", opts
|
|
104
|
+
exit 1
|
|
105
|
+
end
|
|
106
|
+
end
|
|
68
107
|
end
|
|
69
108
|
end
|
|
70
109
|
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
|
|
@@ -22,39 +24,64 @@ module Getch
|
|
|
22
24
|
save
|
|
23
25
|
end
|
|
24
26
|
|
|
25
|
-
def
|
|
26
|
-
STATES[:
|
|
27
|
+
def tarball
|
|
28
|
+
STATES[:tarball] = true
|
|
27
29
|
save
|
|
28
30
|
end
|
|
29
31
|
|
|
30
|
-
def
|
|
31
|
-
STATES[:
|
|
32
|
+
def pre_config
|
|
33
|
+
STATES[:pre_config] = true
|
|
32
34
|
save
|
|
33
35
|
end
|
|
34
36
|
|
|
35
37
|
def update
|
|
36
|
-
STATES[:
|
|
38
|
+
STATES[:update] = true
|
|
39
|
+
save
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def post_config
|
|
43
|
+
STATES[:post_config] = true
|
|
44
|
+
save
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def terraform
|
|
48
|
+
STATES[:terraform] = true
|
|
49
|
+
save
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def services
|
|
53
|
+
STATES[:services] = true
|
|
54
|
+
save
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def luks_keys
|
|
58
|
+
STATES[:luks_keys] = true
|
|
59
|
+
save
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def bootloader
|
|
63
|
+
STATES[:bootloader] = true
|
|
37
64
|
save
|
|
38
65
|
end
|
|
39
66
|
|
|
40
|
-
def
|
|
41
|
-
STATES[:
|
|
67
|
+
def finalize
|
|
68
|
+
STATES[:finalize] = true
|
|
42
69
|
save
|
|
43
70
|
end
|
|
44
71
|
|
|
45
72
|
private
|
|
46
73
|
|
|
47
74
|
def save
|
|
48
|
-
File.open(@file, 'w') { |f| YAML
|
|
75
|
+
File.open(@file, 'w') { |f| YAML.dump(STATES, f) }
|
|
49
76
|
end
|
|
50
77
|
|
|
51
|
-
def load_state
|
|
78
|
+
def load_state
|
|
52
79
|
if File.exist? @file
|
|
53
80
|
state_file = YAML.load_file(@file)
|
|
54
81
|
STATES.merge!(state_file)
|
|
55
82
|
else
|
|
56
83
|
save
|
|
57
|
-
|
|
84
|
+
warn 'Initialize states'
|
|
58
85
|
end
|
|
59
86
|
end
|
|
60
87
|
end
|
data/lib/getch/tree.rb
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Getch
|
|
4
|
+
module Tree
|
|
5
|
+
class Os
|
|
6
|
+
|
|
7
|
+
OS_TREE = {
|
|
8
|
+
gentoo: Gentoo,
|
|
9
|
+
void: Void
|
|
10
|
+
}.freeze
|
|
11
|
+
|
|
12
|
+
def initialize
|
|
13
|
+
@os = OPTIONS[:os]
|
|
14
|
+
@log = Log.new
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def select
|
|
18
|
+
OS_TREE[@os.to_sym] || @log.fatal('OS no found')
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
class FS
|
|
22
|
+
|
|
23
|
+
FS_TREE = {
|
|
24
|
+
true => { # + encrypt
|
|
25
|
+
true => { # + lvm
|
|
26
|
+
ext4: FileSystem::Ext4::Hybrid,
|
|
27
|
+
},
|
|
28
|
+
false => { # - lvm
|
|
29
|
+
ext4: FileSystem::Ext4::Encrypt,
|
|
30
|
+
zfs: FileSystem::Zfs::Encrypt
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
false => { # - encrypt
|
|
34
|
+
true => { # + lvm
|
|
35
|
+
ext4: FileSystem::Ext4::Lvm,
|
|
36
|
+
},
|
|
37
|
+
false => { # - lvm
|
|
38
|
+
ext4: FileSystem::Ext4::Minimal,
|
|
39
|
+
zfs: FileSystem::Zfs::Minimal,
|
|
40
|
+
},
|
|
41
|
+
}
|
|
42
|
+
}.freeze
|
|
43
|
+
|
|
44
|
+
def initialize
|
|
45
|
+
@encrypt = OPTIONS[:encrypt]
|
|
46
|
+
@lvm = OPTIONS[:lvm]
|
|
47
|
+
@fs = OPTIONS[:fs]
|
|
48
|
+
@log = Log.new
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def select
|
|
52
|
+
FS_TREE[@encrypt][@lvm][@fs.to_sym] || @log.fatal('Error in FS_TREE or no comptatible options')
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
data/lib/getch/version.rb
CHANGED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Getch
|
|
4
|
+
module Void
|
|
5
|
+
class Bootloader
|
|
6
|
+
def dependencies
|
|
7
|
+
Helpers.efi? ?
|
|
8
|
+
Install.new('grub-x86_64-efi') :
|
|
9
|
+
Install.new('grub')
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def install
|
|
13
|
+
Config::Grub.new
|
|
14
|
+
ChrootOutput.new('xbps-reconfigure -fa') # this command also start grub-mkconfig
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Getch
|
|
4
|
+
module Void
|
|
5
|
+
class Finalize
|
|
6
|
+
def initialize
|
|
7
|
+
x
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
protected
|
|
11
|
+
|
|
12
|
+
def x
|
|
13
|
+
shell
|
|
14
|
+
accounts
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
# Make the default shell /bin/bash instead of /bin/sh
|
|
20
|
+
def shell
|
|
21
|
+
Chroot.new('chsh -s /bin/bash')
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def accounts
|
|
25
|
+
account = Config::Account.new
|
|
26
|
+
account.root
|
|
27
|
+
account.new_user
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|