getch 0.1.9 → 0.3.3

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 (164) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +132 -0
  4. data/LICENSE +10 -0
  5. data/README.md +35 -29
  6. data/bin/getch +8 -6
  7. data/getch.gemspec +31 -0
  8. data/lib/clean.rb +149 -0
  9. data/lib/cryptsetup.rb +132 -0
  10. data/lib/devs.rb +199 -0
  11. data/lib/dracut/encrypt.rb +36 -0
  12. data/lib/dracut/hybrid.rb +15 -0
  13. data/lib/dracut/lvm.rb +14 -0
  14. data/lib/dracut/minimal.rb +11 -0
  15. data/lib/dracut/root.rb +45 -0
  16. data/lib/dracut/zfs.rb +35 -0
  17. data/lib/dracut.rb +11 -0
  18. data/lib/fstab/encrypt.rb +44 -0
  19. data/lib/fstab/hybrid.rb +34 -0
  20. data/lib/fstab/lvm.rb +25 -0
  21. data/lib/fstab/minimal.rb +6 -0
  22. data/lib/fstab/root.rb +93 -0
  23. data/lib/fstab/zfs.rb +23 -0
  24. data/lib/fstab.rb +11 -0
  25. data/lib/getch/assembly.rb +150 -0
  26. data/lib/getch/command.rb +88 -128
  27. data/lib/getch/config/account.rb +39 -0
  28. data/lib/getch/config/dhcp.rb +104 -0
  29. data/lib/getch/config/grub.rb +42 -0
  30. data/lib/getch/config/iwd.rb +60 -0
  31. data/lib/getch/config/keymap.rb +78 -0
  32. data/lib/getch/config/locale.rb +96 -0
  33. data/lib/getch/config/portage.rb +90 -0
  34. data/lib/getch/config/pre_network.rb +37 -0
  35. data/lib/getch/config/timezone.rb +52 -0
  36. data/lib/getch/config/void.rb +0 -36
  37. data/lib/getch/config.rb +16 -37
  38. data/lib/getch/device.rb +67 -0
  39. data/lib/getch/filesystem/ext4/encrypt/config.rb +9 -71
  40. data/lib/getch/filesystem/ext4/encrypt/deps.rb +15 -25
  41. data/lib/getch/filesystem/ext4/encrypt/device.rb +11 -5
  42. data/lib/getch/filesystem/ext4/encrypt/format.rb +6 -15
  43. data/lib/getch/filesystem/ext4/encrypt/mount.rb +7 -11
  44. data/lib/getch/filesystem/ext4/encrypt/partition.rb +10 -76
  45. data/lib/getch/filesystem/ext4/encrypt/void.rb +0 -38
  46. data/lib/getch/filesystem/ext4/encrypt.rb +2 -1
  47. data/lib/getch/filesystem/ext4/hybrid/config.rb +27 -0
  48. data/lib/getch/filesystem/ext4/hybrid/deps.rb +55 -0
  49. data/lib/getch/filesystem/ext4/hybrid/device.rb +24 -0
  50. data/lib/getch/filesystem/ext4/hybrid/format.rb +23 -0
  51. data/lib/getch/filesystem/ext4/hybrid/mount.rb +21 -0
  52. data/lib/getch/filesystem/ext4/hybrid/partition.rb +27 -0
  53. data/lib/getch/filesystem/{lvm/encrypt → ext4/hybrid}/void.rb +0 -39
  54. data/lib/getch/filesystem/ext4/hybrid.rb +19 -0
  55. data/lib/getch/filesystem/ext4/lvm/config.rb +25 -0
  56. data/lib/getch/filesystem/ext4/lvm/deps.rb +56 -0
  57. data/lib/getch/filesystem/ext4/lvm/device.rb +28 -0
  58. data/lib/getch/filesystem/ext4/lvm/format.rb +21 -0
  59. data/lib/getch/filesystem/ext4/lvm/mount.rb +21 -0
  60. data/lib/getch/filesystem/ext4/lvm/partition.rb +28 -0
  61. data/lib/getch/filesystem/{lvm.rb → ext4/lvm.rb} +6 -4
  62. data/lib/getch/filesystem/ext4/minimal/config.rb +25 -0
  63. data/lib/getch/filesystem/ext4/{device.rb → minimal/deps.rb} +3 -1
  64. data/lib/getch/filesystem/ext4/minimal/device.rb +22 -0
  65. data/lib/getch/filesystem/ext4/minimal/format.rb +23 -0
  66. data/lib/getch/filesystem/ext4/minimal/mount.rb +21 -0
  67. data/lib/getch/filesystem/ext4/minimal/partition.rb +28 -0
  68. data/lib/getch/filesystem/ext4/minimal.rb +19 -0
  69. data/lib/getch/filesystem/ext4.rb +7 -7
  70. data/lib/getch/filesystem/zfs/encrypt/config.rb +10 -39
  71. data/lib/getch/filesystem/zfs/encrypt/deps.rb +4 -55
  72. data/lib/getch/filesystem/zfs/encrypt/device.rb +7 -51
  73. data/lib/getch/filesystem/zfs/encrypt/format.rb +6 -90
  74. data/lib/getch/filesystem/zfs/encrypt/mount.rb +16 -35
  75. data/lib/getch/filesystem/zfs/encrypt/partition.rb +6 -54
  76. data/lib/getch/filesystem/zfs/encrypt.rb +2 -1
  77. data/lib/getch/filesystem/zfs/minimal/config.rb +37 -0
  78. data/lib/getch/filesystem/zfs/minimal/deps.rb +126 -0
  79. data/lib/getch/filesystem/zfs/minimal/device.rb +24 -0
  80. data/lib/getch/filesystem/zfs/minimal/format.rb +23 -0
  81. data/lib/getch/filesystem/zfs/minimal/mount.rb +23 -0
  82. data/lib/getch/filesystem/zfs/minimal/partition.rb +23 -0
  83. data/lib/getch/filesystem/zfs/minimal.rb +19 -0
  84. data/lib/getch/filesystem/zfs.rb +1 -7
  85. data/lib/getch/filesystem.rb +0 -6
  86. data/lib/getch/gentoo/bootloader.rb +23 -44
  87. data/lib/getch/gentoo/finalize.rb +25 -0
  88. data/lib/getch/gentoo/post_config.rb +75 -0
  89. data/lib/getch/gentoo/pre_config.rb +37 -0
  90. data/lib/getch/gentoo/services.rb +18 -0
  91. data/lib/getch/gentoo/sources.rb +39 -33
  92. data/lib/getch/gentoo/tarball.rb +91 -0
  93. data/lib/getch/gentoo/terraform.rb +34 -0
  94. data/lib/getch/gentoo/update.rb +54 -0
  95. data/lib/getch/gentoo/use.rb +9 -6
  96. data/lib/getch/gentoo/use_flag.rb +17 -20
  97. data/lib/getch/gentoo.rb +9 -75
  98. data/lib/getch/guard.rb +3 -3
  99. data/lib/getch/helpers.rb +63 -115
  100. data/lib/getch/log.rb +87 -25
  101. data/lib/getch/options.rb +41 -11
  102. data/lib/getch/states.rb +28 -8
  103. data/lib/getch/tree.rb +56 -0
  104. data/lib/getch/version.rb +1 -1
  105. data/lib/getch/void/bootloader.rb +18 -0
  106. data/lib/getch/void/finalize.rb +31 -0
  107. data/lib/getch/void/post_config.rb +19 -0
  108. data/lib/getch/void/pre_config.rb +18 -0
  109. data/lib/getch/void/services.rb +18 -0
  110. data/lib/getch/void/{stage.rb → tarball.rb} +34 -14
  111. data/lib/getch/void/terraform.rb +28 -0
  112. data/lib/getch/void/update.rb +33 -0
  113. data/lib/getch/void.rb +9 -59
  114. data/lib/getch.rb +58 -90
  115. data/lib/luks.rb +239 -0
  116. data/lib/lvm2.rb +112 -0
  117. data/lib/mkfs/zfs.rb +167 -0
  118. data/lib/mkfs.rb +144 -0
  119. data/lib/mountfs.rb +154 -0
  120. data/lib/nito.rb +131 -0
  121. data/lib/sgdisk.rb +160 -0
  122. data.tar.gz.sig +0 -0
  123. metadata +113 -74
  124. metadata.gz.sig +0 -0
  125. data/lib/getch/config/gentoo.rb +0 -58
  126. data/lib/getch/filesystem/clean.rb +0 -58
  127. data/lib/getch/filesystem/device.rb +0 -63
  128. data/lib/getch/filesystem/ext4/config.rb +0 -62
  129. data/lib/getch/filesystem/ext4/deps.rb +0 -24
  130. data/lib/getch/filesystem/ext4/format.rb +0 -31
  131. data/lib/getch/filesystem/ext4/mount.rb +0 -26
  132. data/lib/getch/filesystem/ext4/partition.rb +0 -55
  133. data/lib/getch/filesystem/ext4/void.rb +0 -44
  134. data/lib/getch/filesystem/lvm/config.rb +0 -44
  135. data/lib/getch/filesystem/lvm/deps.rb +0 -44
  136. data/lib/getch/filesystem/lvm/device.rb +0 -45
  137. data/lib/getch/filesystem/lvm/encrypt/config.rb +0 -74
  138. data/lib/getch/filesystem/lvm/encrypt/deps.rb +0 -49
  139. data/lib/getch/filesystem/lvm/encrypt/device.rb +0 -48
  140. data/lib/getch/filesystem/lvm/encrypt/format.rb +0 -35
  141. data/lib/getch/filesystem/lvm/encrypt/mount.rb +0 -27
  142. data/lib/getch/filesystem/lvm/encrypt/partition.rb +0 -84
  143. data/lib/getch/filesystem/lvm/encrypt.rb +0 -18
  144. data/lib/getch/filesystem/lvm/format.rb +0 -32
  145. data/lib/getch/filesystem/lvm/mount.rb +0 -26
  146. data/lib/getch/filesystem/lvm/partition.rb +0 -72
  147. data/lib/getch/filesystem/lvm/void.rb +0 -46
  148. data/lib/getch/filesystem/mount.rb +0 -63
  149. data/lib/getch/filesystem/partition.rb +0 -85
  150. data/lib/getch/filesystem/zfs/config.rb +0 -43
  151. data/lib/getch/filesystem/zfs/deps.rb +0 -67
  152. data/lib/getch/filesystem/zfs/device.rb +0 -66
  153. data/lib/getch/filesystem/zfs/encrypt/void.rb +0 -97
  154. data/lib/getch/filesystem/zfs/format.rb +0 -117
  155. data/lib/getch/filesystem/zfs/mount.rb +0 -47
  156. data/lib/getch/filesystem/zfs/partition.rb +0 -69
  157. data/lib/getch/filesystem/zfs/void.rb +0 -81
  158. data/lib/getch/gentoo/boot.rb +0 -64
  159. data/lib/getch/gentoo/chroot.rb +0 -75
  160. data/lib/getch/gentoo/config.rb +0 -167
  161. data/lib/getch/gentoo/stage.rb +0 -73
  162. data/lib/getch/void/boot.rb +0 -84
  163. data/lib/getch/void/chroot.rb +0 -56
  164. data/lib/getch/void/config.rb +0 -90
data/lib/getch/helpers.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require 'open-uri'
4
4
  require 'open3'
5
5
  require 'fileutils'
6
+ require 'nito'
6
7
 
7
8
  module Getch
8
9
  module Helpers
@@ -10,63 +11,40 @@ module Getch
10
11
  Dir.exist? '/sys/firmware/efi/efivars'
11
12
  end
12
13
 
13
- def self.get_file_online(url, dest)
14
- URI.open(url) do |l|
15
- File.open(dest, "wb") { |f| f.write(l.read) }
16
- end
17
- end
18
-
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
24
- end
25
-
26
- def self.create_dir(path, perm = 0755)
27
- FileUtils.mkdir_p path, mode: perm unless Dir.exist? path
28
- end
29
-
30
- def self.add_file(path, content = '')
31
- File.write path, content unless File.exist? path
32
- end
33
-
34
- def self.mkdir(dir)
35
- FileUtils.mkdir_p dir unless Dir.exist? dir
14
+ def self.systemd?
15
+ Dir.exist? "#{OPTIONS[:mountpoint]}/etc/systemd"
36
16
  end
37
17
 
38
- def self.touch(file)
39
- File.write file, '' unless File.exist? file
18
+ def self.openrc?
19
+ File.exist? "#{OPTIONS[:mountpoint]}/etc/conf.d/keymaps"
40
20
  end
41
21
 
42
- def self.echo(src, content = '')
43
- File.write(src, "#{content}\n", mode: 'w')
22
+ def self.runit?
23
+ Dir.exist? "#{OPTIONS[:mountpoint]}/etc/runit"
44
24
  end
45
25
 
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)
26
+ def self.grub?
27
+ File.exist? "#{OPTIONS[:mountpoint]}/etc/default/grub"
50
28
  end
51
29
 
52
- def self.cp(src, dest)
53
- raise "Src file #{src} no found" unless File.exist? src
54
-
55
- FileUtils.cp(src, dest)
30
+ def self.get_file_online(url, dest)
31
+ URI.open(url) do |l|
32
+ File.open(dest, "wb") { |f| f.write(l.read) }
33
+ end
34
+ rescue Net::OpenTimeout => e
35
+ abort "DNS error #{e}"
56
36
  end
57
37
 
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) }
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}"
63
42
  end
64
- is_found
65
43
  end
66
44
 
67
45
  def self.sys(cmd)
68
46
  system(cmd)
69
- raise "Error with #{cmd}" unless $?.success?
47
+ $?.success? || abort("Error with #{cmd}")
70
48
  end
71
49
 
72
50
  def self.partuuid(dev)
@@ -79,39 +57,58 @@ module Getch
79
57
  return f.delete_prefix('/dev/disk/by-uuid/')
80
58
  end
81
59
  end
60
+ Log.new.fatal("UUID on #{dev} is no found")
82
61
  end
83
62
 
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.'
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('../', '')
99
67
  end
100
68
  end
69
+ Log.new.fatal("Dm for #{name} is no found")
101
70
  end
102
71
 
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
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/')
111
79
  end
112
- raise "\n[-] Fail cmd #{args} - #{stderr}."
113
80
  end
81
+ Log.new.fatal("ID on #{dev} is no found")
82
+ end
83
+
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
92
+ end
93
+
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')
101
+
102
+ mem += 'K'
103
+ end
114
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
110
+
111
+ module Void
115
112
  def command_output(args)
116
113
  print " => Exec: #{args}..."
117
114
  cmd = "chroot #{Getch::MOUNTPOINT} /bin/bash -c \"#{args}\""
@@ -126,19 +123,6 @@ module Getch
126
123
  end
127
124
  end
128
125
 
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
126
  # Used only when need password
143
127
  def chroot(cmd)
144
128
  unless system('chroot', Getch::MOUNTPOINT, '/bin/bash', '-c', cmd)
@@ -162,42 +146,6 @@ module Getch
162
146
 
163
147
  add_line(conf, "PARTUUID=#{device} #{rest}")
164
148
  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
149
  end
202
150
  end
203
151
  end
data/lib/getch/log.rb CHANGED
@@ -4,54 +4,116 @@ require 'logger'
4
4
 
5
5
  module Getch
6
6
  class Log
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
+
7
19
  def initialize(verbose = false)
8
20
  @log_file = '/tmp/log_install.txt'
9
21
  @verbose = verbose
10
- check_file
11
- init_log
12
- init_log_text
22
+ init
13
23
  end
14
24
 
25
+ # TODO remove length
15
26
  def info(msg)
16
- @logger.info(msg)
17
- @logger_text.info(msg)
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"
18
35
  end
19
36
 
20
37
  def error(msg)
21
- @logger.error(msg)
22
- @logger_text.error(msg)
38
+ @error.error "#{BOLD} > #{CLEAR}#{WHITE}#{msg}#{CLEAR}"
39
+ @save.error(msg)
23
40
  end
24
41
 
25
42
  def debug(msg)
26
- @logger.debug(msg)
27
- @logger_text.debug(msg)
43
+ @debug.debug "#{BOLD} > #{CLEAR}#{WHITE}#{msg}#{CLEAR}"
44
+ @save.debug(msg)
28
45
  end
29
46
 
30
47
  def fatal(msg)
31
- @logger.fatal(msg)
32
- @logger_text.fatal(msg)
48
+ @fatal.fatal "#{BOLD} > #{CLEAR}#{WHITE}#{msg}#{CLEAR}\n"
49
+ @save.fatal(msg)
50
+ exit 1
33
51
  end
34
52
 
35
- private
36
-
37
- def check_file
38
- puts "Creating log at #{@log_file}" unless File.exist? @log_file
39
- end
53
+ protected
40
54
 
41
55
  def init_log
42
- @logger = Logger.new($stdout)
43
- @logger.level = @verbose ? Logger::DEBUG : Logger::INFO
44
- @logger.formatter = proc { |severity, _, _, msg|
45
- "#{severity}, #{msg}\n"
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}"
46
60
  }
47
61
  end
48
62
 
49
- def init_log_text
50
- @logger_text = Logger.new(@log_file, 1)
51
- @logger_text.level = Logger::DEBUG
52
- @logger_text.formatter = proc { |severity, datetime, _, msg|
53
- "#{severity}, #{datetime}, #{msg}\n"
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"
54
95
  }
55
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
56
118
  end
57
119
  end
data/lib/getch/options.rb CHANGED
@@ -1,9 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'optparse'
4
+ require 'nito'
4
5
 
5
6
  module Getch
6
7
  class Options
8
+ include NiTo
9
+
7
10
  def initialize(argv)
8
11
  parse(argv)
9
12
  end
@@ -12,52 +15,71 @@ module Getch
12
15
 
13
16
  def parse(argv)
14
17
  OptionParser.new do |opts|
15
- opts.version = VERSION
18
+ opts.banner = 'Usage: getch [OPTION...] <action>'
19
+
20
+ opts.separator "\noptions:"
16
21
 
17
22
  opts.on('-l', '--language LANG', 'Default is en_US') do |lang|
18
23
  OPTIONS[:language] = lang
19
24
  end
20
25
 
21
- opts.on('-z', '--zoneinfo ZONE', 'Default is US/Eastern') do |zone|
22
- OPTIONS[:zoneinfo] = Getch::Guard.zone(zone)
26
+ opts.on('-t', '--timezone ZONE', 'Default is UTC') do |zone|
27
+ OPTIONS[:timezone] = Getch::Guard.zone(zone)
23
28
  end
24
29
 
25
30
  opts.on('-k', '--keymap KEY', 'Default is us') do |key|
26
31
  OPTIONS[:keymap] = Getch::Guard.keymap(key)
27
32
  end
28
33
 
29
- opts.on('-d', '--disk DISK', 'Root Disk where install the system (sda,sdb)') do |disk|
34
+ opts.on('-d', '--disk DISK',
35
+ 'Root Disk where install the system (sda,sdb)') do |disk|
30
36
  OPTIONS[:disk] = Getch::Guard.disk(disk)
31
37
  end
32
38
 
33
- opts.on('-f', '--format FS', 'Can be ext4, lvm or zfs. Default use ext4') do |fs|
39
+ opts.on('-f', '--format FS',
40
+ 'Can be ext4, zfs. Default use ext4') do |fs|
34
41
  OPTIONS[:fs] = Getch::Guard.format(fs)
35
42
  end
36
43
 
37
- opts.on('-u', '--username USERNAME', 'Create a new user /home/USERNAME with password.') do |user|
44
+ opts.on('-u', '--username USERNAME',
45
+ 'Create a new user /home/USERNAME with password.') do |user|
38
46
  OPTIONS[:username] = user
39
47
  end
40
48
 
41
- opts.on('-o', '--os NAME', /gentoo|void/, 'Install distro NAME, can be gentoo or void.') do |name|
49
+ opts.on('-o', '--os NAME', /gentoo|void/,
50
+ 'Install distro NAME, can be gentoo or void.') do |name|
42
51
  OPTIONS[:os] = name
43
52
  end
44
53
 
45
- opts.on('--separate-boot DISK', 'Use a different DISK for the /boot or /efi partition.') do |boot|
54
+ opts.on('--separate-boot DISK',
55
+ 'Use a different DISK for the /boot or /efi partition.') do |boot|
46
56
  OPTIONS[:boot_disk] = Getch::Guard.disk(boot)
47
57
  end
48
58
 
49
- opts.on('--separate-cache DISK', 'Use a different DISK for the swap partition, add ZIL/L2ARC for ZFS when set.') do |swap|
59
+ opts.on('--separate-cache DISK',
60
+ 'Use a different DISK for the swap partition, add ZIL/L2ARC for ZFS when set.') do |swap|
50
61
  OPTIONS[:cache_disk] = Getch::Guard.disk(swap)
51
62
  end
52
63
 
53
- opts.on('--separate-home DISK', 'Use a different DISK for the /home partition.') do |home|
64
+ opts.on('--separate-home DISK',
65
+ 'Use a different DISK for the /home partition.') do |home|
54
66
  OPTIONS[:home_disk] = Getch::Guard.disk(home)
55
67
  end
56
68
 
57
- opts.on('--encrypt', 'Encrypt your system, use LUKS or native encryption for ZFS.') do
69
+ opts.on('--lvm',
70
+ 'System will use LVM, do not work with ZFS.') do
71
+ OPTIONS[:lvm] = true
72
+ end
73
+
74
+ opts.on('--encrypt',
75
+ 'Encrypt your system, use LUKS or native encryption for ZFS.') do
58
76
  OPTIONS[:encrypt] = true
59
77
  end
60
78
 
79
+ opts.on('--musl', 'Prefer to install Musl over Glibc.') do
80
+ OPTIONS[:musl] = true
81
+ end
82
+
61
83
  opts.on('--verbose', 'Write more messages to the standard output.') do
62
84
  OPTIONS[:verbose] = true
63
85
  end
@@ -67,6 +89,14 @@ module Getch
67
89
  exit
68
90
  end
69
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
+
70
100
  begin
71
101
  opts.parse!(argv)
72
102
  rescue OptionParser::ParseError => e
data/lib/getch/states.rb CHANGED
@@ -24,28 +24,48 @@ module Getch
24
24
  save
25
25
  end
26
26
 
27
- def stage3
28
- STATES[:gentoo_base] = true
27
+ def tarball
28
+ STATES[:tarball] = true
29
29
  save
30
30
  end
31
31
 
32
- def config
33
- STATES[:gentoo_config] = true
32
+ def pre_config
33
+ STATES[:pre_config] = true
34
34
  save
35
35
  end
36
36
 
37
37
  def update
38
- STATES[:gentoo_update] = true
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
39
59
  save
40
60
  end
41
61
 
42
62
  def bootloader
43
- STATES[:gentoo_bootloader] = true
63
+ STATES[:bootloader] = true
44
64
  save
45
65
  end
46
66
 
47
- def kernel
48
- STATES[:gentoo_kernel] = true
67
+ def finalize
68
+ STATES[:finalize] = true
49
69
  save
50
70
  end
51
71
 
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
@@ -1,3 +1,3 @@
1
1
  module Getch
2
- VERSION = '0.1.9'.freeze
2
+ VERSION = '0.3.3'.freeze
3
3
  end
@@ -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
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Getch
4
+ module Void
5
+ class PostConfig
6
+ def initialize
7
+ x
8
+ end
9
+
10
+ protected
11
+
12
+ def x
13
+ Getch::Config::Locale.new
14
+ Getch::Config::Keymap.new
15
+ Getch::Config::TimeZone.new
16
+ end
17
+ end
18
+ end
19
+ end