getch 0.1.9 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
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