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.
Files changed (161) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +75 -35
  4. data/assets/network-stack.conf +63 -0
  5. data/assets/system.conf +38 -0
  6. data/bin/getch +14 -4
  7. data/lib/clean.rb +149 -0
  8. data/lib/cmdline.rb +128 -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 +94 -124
  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 +11 -0
  37. data/lib/getch/config.rb +19 -53
  38. data/lib/getch/device.rb +67 -0
  39. data/lib/getch/filesystem/ext4/encrypt/config.rb +11 -68
  40. data/lib/getch/filesystem/ext4/encrypt/deps.rb +17 -25
  41. data/lib/getch/filesystem/ext4/encrypt/device.rb +13 -5
  42. data/lib/getch/filesystem/ext4/encrypt/format.rb +8 -15
  43. data/lib/getch/filesystem/ext4/encrypt/mount.rb +9 -13
  44. data/lib/getch/filesystem/ext4/encrypt/partition.rb +10 -82
  45. data/lib/getch/filesystem/ext4/encrypt/void.rb +63 -0
  46. data/lib/getch/filesystem/ext4/encrypt.rb +4 -0
  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/ext4/hybrid/void.rb +62 -0
  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} +8 -3
  62. data/lib/getch/filesystem/ext4/minimal/config.rb +25 -0
  63. data/lib/getch/filesystem/ext4/{device.rb → minimal/deps.rb} +4 -3
  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 +9 -6
  70. data/lib/getch/filesystem/zfs/encrypt/config.rb +12 -57
  71. data/lib/getch/filesystem/zfs/encrypt/deps.rb +7 -86
  72. data/lib/getch/filesystem/zfs/encrypt/device.rb +9 -45
  73. data/lib/getch/filesystem/zfs/encrypt/format.rb +8 -90
  74. data/lib/getch/filesystem/zfs/encrypt/mount.rb +16 -34
  75. data/lib/getch/filesystem/zfs/encrypt/partition.rb +8 -50
  76. data/lib/getch/filesystem/zfs/encrypt.rb +4 -0
  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 +3 -6
  85. data/lib/getch/filesystem.rb +2 -6
  86. data/lib/getch/gentoo/bootloader.rb +47 -0
  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 +82 -52
  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 +11 -12
  96. data/lib/getch/gentoo/use_flag.rb +74 -52
  97. data/lib/getch/gentoo.rb +11 -63
  98. data/lib/getch/guard.rb +71 -0
  99. data/lib/getch/helpers.rb +128 -48
  100. data/lib/getch/log.rb +91 -26
  101. data/lib/getch/options.rb +79 -40
  102. data/lib/getch/states.rb +37 -10
  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/tarball.rb +89 -0
  111. data/lib/getch/void/terraform.rb +28 -0
  112. data/lib/getch/void/update.rb +33 -0
  113. data/lib/getch/void.rb +15 -0
  114. data/lib/getch.rb +104 -92
  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 +140 -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 +96 -45
  124. metadata.gz.sig +0 -0
  125. data/.gitignore +0 -2
  126. data/CHANGELOG.md +0 -90
  127. data/Rakefile +0 -21
  128. data/bin/setup.sh +0 -90
  129. data/getch.gemspec +0 -25
  130. data/lib/getch/filesystem/clean.rb +0 -51
  131. data/lib/getch/filesystem/device.rb +0 -61
  132. data/lib/getch/filesystem/ext4/config.rb +0 -58
  133. data/lib/getch/filesystem/ext4/deps.rb +0 -22
  134. data/lib/getch/filesystem/ext4/format.rb +0 -28
  135. data/lib/getch/filesystem/ext4/mount.rb +0 -23
  136. data/lib/getch/filesystem/ext4/partition.rb +0 -52
  137. data/lib/getch/filesystem/lvm/config.rb +0 -59
  138. data/lib/getch/filesystem/lvm/deps.rb +0 -42
  139. data/lib/getch/filesystem/lvm/device.rb +0 -43
  140. data/lib/getch/filesystem/lvm/encrypt/config.rb +0 -71
  141. data/lib/getch/filesystem/lvm/encrypt/deps.rb +0 -46
  142. data/lib/getch/filesystem/lvm/encrypt/device.rb +0 -46
  143. data/lib/getch/filesystem/lvm/encrypt/format.rb +0 -32
  144. data/lib/getch/filesystem/lvm/encrypt/mount.rb +0 -25
  145. data/lib/getch/filesystem/lvm/encrypt/partition.rb +0 -80
  146. data/lib/getch/filesystem/lvm/encrypt.rb +0 -15
  147. data/lib/getch/filesystem/lvm/format.rb +0 -29
  148. data/lib/getch/filesystem/lvm/mount.rb +0 -23
  149. data/lib/getch/filesystem/lvm/partition.rb +0 -69
  150. data/lib/getch/filesystem/mount.rb +0 -56
  151. data/lib/getch/filesystem/partition.rb +0 -77
  152. data/lib/getch/filesystem/zfs/config.rb +0 -57
  153. data/lib/getch/filesystem/zfs/deps.rb +0 -95
  154. data/lib/getch/filesystem/zfs/device.rb +0 -58
  155. data/lib/getch/filesystem/zfs/format.rb +0 -114
  156. data/lib/getch/filesystem/zfs/mount.rb +0 -48
  157. data/lib/getch/filesystem/zfs/partition.rb +0 -64
  158. data/lib/getch/gentoo/boot.rb +0 -109
  159. data/lib/getch/gentoo/chroot.rb +0 -77
  160. data/lib/getch/gentoo/config.rb +0 -129
  161. 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 Helpers
6
- def self.efi?
7
- Dir.exist? '/sys/firmware/efi/efivars'
8
- end
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
- 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)
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
- 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}"
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
- def self.create_dir(path, perm = 0755)
26
- FileUtils.mkdir_p path, mode: perm if ! Dir.exist?(path)
27
- end
45
+ def self.sys(cmd)
46
+ system(cmd)
47
+ $?.success? || abort("Error with #{cmd}")
48
+ end
28
49
 
29
- def self.add_file(path, content = '')
30
- File.write path, content if ! File.exist? path
31
- end
50
+ def self.partuuid(dev)
51
+ `lsblk -o PARTUUID #{dev}`.match(/\w+-\w+-\w+-\w+-\w+/)
52
+ end
32
53
 
33
- def self.mkdir(dir)
34
- FileUtils.mkdir_p dir if ! Dir.exist? dir
35
- end
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
- def self.touch(file)
38
- File.write file, '' if ! File.exist? file
39
- end
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
- 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)
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
- def self.sys(cmd)
53
- system(cmd)
54
- unless $?.success?
55
- raise "Error with #{cmd}"
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
- def self.partuuid(dev)
60
- `lsblk -o PARTUUID #{dev}`.match(/[\w]+-[\w]+-[\w]+-[\w]+-[\w]+/)
61
- end
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
- def self.uuid(dev)
64
- `lsblk -do UUID #{dev}`.match(/[\w]+-[\w]+-[\w]+-[\w]+-[\w]+/)
65
- end
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
- # 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}/)
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
- def initialize
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
- check_file
8
- init_log
9
- init_log_text
21
+ @verbose = verbose
22
+ init
10
23
  end
11
24
 
25
+ # TODO remove length
12
26
  def info(msg)
13
- @logger.info(msg)
14
- @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"
15
35
  end
16
36
 
17
37
  def error(msg)
18
- @logger.error(msg)
19
- @logger_text.error(msg)
38
+ @error.error "#{BOLD} > #{CLEAR}#{WHITE}#{msg}#{CLEAR}"
39
+ @save.error(msg)
20
40
  end
21
41
 
22
42
  def debug(msg)
23
- @logger.debug(msg)
24
- @logger_text.debug(msg)
43
+ @debug.debug "#{BOLD} > #{CLEAR}#{WHITE}#{msg}#{CLEAR}"
44
+ @save.debug(msg)
25
45
  end
26
46
 
27
47
  def fatal(msg)
28
- @logger.fatal(msg)
29
- @logger_text.fatal(msg)
48
+ @fatal.fatal "#{BOLD} > #{CLEAR}#{WHITE}#{msg}#{CLEAR}\n"
49
+ @save.fatal(msg)
50
+ exit 1
30
51
  end
31
52
 
32
- private
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
- @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"
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 init_log_text
47
- @logger_text = Logger.new(@log_file, 1)
48
- @logger_text.level = Logger::DEBUG
49
- @logger_text.formatter = proc { |severity, datetime, progname, msg|
50
- "#{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"
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
- attr_reader :language, :zoneinfo, :keymap, :disk, :fs, :username, :boot_disk, :cache_disk, :home_disk, :encrypt, :verbose
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.on("-l", "--language LANG", "Default is en_US") do |lang|
27
- @language = lang
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
- opts.on("-z", "--zoneinfo ZONE", "Default is US/Eastern") do |zone|
30
- @zoneinfo = zone
25
+
26
+ opts.on('-t', '--timezone ZONE', 'Default is UTC') do |zone|
27
+ OPTIONS[:timezone] = Getch::Guard.zone(zone)
31
28
  end
32
- opts.on("-k", "--keymap KEY", "Default is us") do |key|
33
- @keymap = key
29
+
30
+ opts.on('-k', '--keymap KEY', 'Default is us') do |key|
31
+ OPTIONS[:keymap] = Getch::Guard.keymap(key)
34
32
  end
35
- opts.on("-d", "--disk DISK", "Disk where install Gentoo (sda,sdb), default use #{@disk}") do |disk|
36
- @disk = disk
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
- 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
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
- opts.on("-u", "--username USERNAME", "Create a new user /home/USERNAME with password.") do |user|
43
- @username = user
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
- 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
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
- 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
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
- 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
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
- opts.on("--encrypt", "Encrypt your system.") do
58
- @encrypt = true
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
- opts.on("--verbose", "Write more messages to the standard output.") do
61
- @verbose = true
68
+
69
+ opts.on('--lvm',
70
+ 'System will use LVM, do not work with ZFS.') do
71
+ OPTIONS[:lvm] = true
62
72
  end
63
- opts.on("-h", "--help", "Display this") do
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
- end.parse!(into: DEFAULT_OPTIONS)
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 stage3
26
- STATES[:gentoo_base] = true
27
+ def tarball
28
+ STATES[:tarball] = true
27
29
  save
28
30
  end
29
31
 
30
- def config
31
- STATES[:gentoo_config] = true
32
+ def pre_config
33
+ STATES[:pre_config] = true
32
34
  save
33
35
  end
34
36
 
35
37
  def update
36
- 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
59
+ save
60
+ end
61
+
62
+ def bootloader
63
+ STATES[:bootloader] = true
37
64
  save
38
65
  end
39
66
 
40
- def kernel
41
- STATES[:gentoo_kernel] = true
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::dump(STATES, f) }
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
- STDERR.puts "Initialize states"
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
@@ -1,3 +1,3 @@
1
1
  module Getch
2
- VERSION = '0.1.3'.freeze
2
+ VERSION = '0.3.0'.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