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
@@ -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
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Getch
4
+ module Void
5
+ class PreConfig
6
+ def initialize
7
+ x
8
+ end
9
+
10
+ private
11
+
12
+ def x
13
+ Getch::Config::Locale.new
14
+ Getch::Config::PreNetwork.new
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Getch
4
+ module Void
5
+ class Services
6
+ def initialize
7
+ x
8
+ end
9
+
10
+ protected
11
+
12
+ def x
13
+ Config::Iwd.new
14
+ Config::Dhcp.new
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'open-uri'
4
+ require 'open3'
5
+
6
+ module Getch
7
+ module Void
8
+ class Tarball
9
+ def initialize
10
+ @log = Log.new
11
+ @url = 'https://alpha.de.repo.voidlinux.org/live/current'
12
+ @file = 'sha256sum.txt'
13
+ @xbps = false
14
+ Dir.chdir OPTIONS[:mountpoint]
15
+ end
16
+
17
+ def x
18
+ search_archive
19
+ download
20
+ checksum
21
+ install
22
+ end
23
+
24
+ protected
25
+
26
+ def tarball
27
+ OPTIONS[:musl] ?
28
+ /void-x86_64-musl-ROOTFS-[\d._]+.tar.xz/ :
29
+ /void-x86_64-ROOTFS-[\d._]+.tar.xz/
30
+ end
31
+
32
+ # Search only the glibc x86_64 for now
33
+ def search_archive
34
+ yurl = "#{@url}/#{@file}"
35
+ @log.info "Opening #{yurl}...\n"
36
+ Helpers.get_file_online(yurl, @file)
37
+ File.open(@file).each do |l|
38
+ @xbps = l.tr('()', '').split(' ') if l.match(tarball)
39
+ end
40
+ end
41
+
42
+ def download
43
+ @log.fatal 'No file found, retry later.' unless @xbps
44
+ return if File.exist? @xbps[1]
45
+
46
+ @log.info "Downloading #{@xbps[1]}..."
47
+ Helpers.get_file_online("#{@url}/#{@xbps[1]}", @xbps[1])
48
+ @log.result_ok
49
+ end
50
+
51
+ def checksum
52
+ @log.info 'Checking SHA256 checksum...'
53
+ # Should contain 2 spaces...
54
+ command = "echo #{@xbps[3]} #{@xbps[1]} | sha256sum --check"
55
+ _, stderr, status = Open3.capture3(command)
56
+ if status.success? then
57
+ @log.result_ok
58
+ return
59
+ end
60
+ cleaning
61
+ @log.fatal "Problem with the checksum, stderr\n#{stderr}"
62
+ end
63
+
64
+ def install
65
+ decompress
66
+ cleaning
67
+ end
68
+
69
+ private
70
+
71
+ def decompress
72
+ @log.info "Decompressing #{@xbps[1]}..."
73
+ cmd = "tar xpf #{@xbps[1]} --xattrs-include=\'*.*\' --numeric-owner"
74
+ _, stderr, status = Open3.capture3(cmd)
75
+ if status.success? then
76
+ @log.result_ok
77
+ return
78
+ end
79
+ cleaning
80
+ @log.fatal "Fail to decompressing #{@xbps[1]} - #{stderr}."
81
+ end
82
+
83
+ def cleaning
84
+ Dir.glob('void-x86_64*.tar.xz').each { |f| File.delete(f) }
85
+ Dir.glob('sha256*').each { |f| File.delete(f) }
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,28 @@
1
+ module Getch
2
+ module Void
3
+ class Terraform
4
+ def initialize
5
+ x
6
+ end
7
+
8
+ protected
9
+
10
+ def x
11
+ install_pkgs
12
+ end
13
+
14
+ def install_pkgs
15
+ @pkgs = 'sudo'
16
+ @pkgs << ' vim'
17
+ @pkgs << ' iptables'
18
+ @pkgs << ' runit-iptables'
19
+ @pkgs << ' iwd'
20
+ @pkgs << ' dhcpcd'
21
+ @pkgs << ' lvm2' if OPTIONS[:fs] == 'lvm'
22
+ @pkgs << ' zfs' if OPTIONS[:fs] == 'zfs'
23
+ @pkgs << ' cryptsetup' if OPTIONS[:encrypt]
24
+ Install.new(@pkgs)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Getch
4
+ module Void
5
+ class Update
6
+ def initialize
7
+ @log = Log.new
8
+ x
9
+ end
10
+
11
+ protected
12
+
13
+ # https://docs.voidlinux.org/installation/guides/chroot.html#install-base-system-rootfs-method-only
14
+ def x
15
+ sync
16
+ update
17
+ end
18
+
19
+ private
20
+
21
+ def sync
22
+ @log.info "Synchronize index...\n"
23
+ ChrootOutput.new '/usr/bin/xbps-install', '-Suy', 'xbps'
24
+ end
25
+
26
+ def update
27
+ ChrootOutput.new '/usr/bin/xbps-install -uy'
28
+ ChrootOutput.new '/usr/bin/xbps-install -y base-system'
29
+ ChrootOutput.new '/usr/bin/xbps-remove -y base-voidstrap'
30
+ end
31
+ end
32
+ end
33
+ end
data/lib/getch/void.rb ADDED
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Getch
4
+ module Void
5
+ end
6
+ end
7
+
8
+ require_relative 'void/tarball'
9
+ require_relative 'void/pre_config'
10
+ require_relative 'void/update'
11
+ require_relative 'void/post_config'
12
+ require_relative 'void/terraform'
13
+ require_relative 'void/services'
14
+ require_relative 'void/bootloader'
15
+ require_relative 'void/finalize'
data/lib/getch.rb CHANGED
@@ -1,118 +1,130 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'getch/helpers'
1
4
  require_relative 'getch/options'
2
5
  require_relative 'getch/states'
3
6
  require_relative 'getch/gentoo'
7
+ require_relative 'getch/void'
8
+ require_relative 'getch/device'
4
9
  require_relative 'getch/filesystem'
10
+ require_relative 'getch/tree'
11
+ require_relative 'getch/assembly'
5
12
  require_relative 'getch/command'
6
- require_relative 'getch/helpers'
7
13
  require_relative 'getch/log'
8
14
  require_relative 'getch/config'
15
+ require_relative 'getch/guard'
16
+ require_relative 'getch/version'
9
17
 
10
18
  module Getch
11
19
 
12
- DEFAULT_OPTIONS = {
13
- language: 'en_US',
14
- zoneinfo: 'US/Eastern',
15
- keymap: 'us',
16
- disk: 'sda',
17
- fs: 'ext4',
18
- username: nil,
19
- boot_disk: nil,
20
- cache_disk: nil,
21
- home_disk: nil,
20
+ OPTIONS = {
21
+ boot_disk: false,
22
+ disk: false,
23
+ cache_disk: false,
22
24
  encrypt: false,
23
- verbose: false
25
+ fs: 'ext4',
26
+ home_disk: false,
27
+ keymap: 'us',
28
+ language: 'en_US',
29
+ luks_name: 'luks',
30
+ lvm: false,
31
+ mountpoint: '/mnt/getch',
32
+ musl: false,
33
+ os: 'gentoo',
34
+ timezone: 'UTC',
35
+ username: false,
36
+ verbose: false,
37
+ vg_name: 'vg4',
38
+ zfs_name: 'pool'
24
39
  }
25
40
 
26
41
  STATES = {
27
- :partition => false,
28
- :format => false,
29
- :mount => false,
30
- :gentoo_base => false,
31
- :gentoo_config => false,
32
- :gentoo_update => false,
33
- :gentoo_kernel => false
42
+ partition: false,
43
+ format: false,
44
+ mount: false,
45
+ tarball: false,
46
+ pre_config: false,
47
+ update: false,
48
+ post_config: false,
49
+ terraform: false,
50
+ bootloader: false,
51
+ services: false,
52
+ finalize: false,
34
53
  }
35
54
 
36
- MOUNTPOINT = "/mnt/gentoo".freeze
37
- DEFAULT_FS = {
38
- true => {
39
- ext4: Getch::FileSystem::Ext4::Encrypt,
40
- lvm: Getch::FileSystem::Lvm::Encrypt,
41
- zfs: Getch::FileSystem::Zfs::Encrypt
42
- },
43
- false => {
44
- ext4: Getch::FileSystem::Ext4,
45
- lvm: Getch::FileSystem::Lvm,
46
- zfs: Getch::FileSystem::Zfs,
47
- }
48
- }.freeze
55
+ MOUNTPOINT = '/mnt/getch'
56
+ DEVS = {}
49
57
 
50
- def self.class_fs
51
- encrypt = DEFAULT_OPTIONS[:encrypt]
52
- fs = DEFAULT_OPTIONS[:fs].to_sym
53
- DEFAULT_FS[encrypt][fs]
54
- end
58
+ class Main
59
+ def initialize(argv)
60
+ argv[:cli]
61
+ @log = Log.new
62
+ @assembly = Assembly.new
63
+ end
64
+
65
+ def resume
66
+ STATES[:partition] && return
55
67
 
56
- def self.resume_options(opts)
57
- puts "\nBuild Gentoo with the following args:\n"
58
- puts "Lang: #{DEFAULT_OPTIONS[:language]}"
59
- puts "Zoneinfo: #{DEFAULT_OPTIONS[:zoneinfo]}"
60
- puts "Keymap: #{DEFAULT_OPTIONS[:keymap]}"
61
- puts "Disk: #{DEFAULT_OPTIONS[:disk]}"
62
- puts "Filesystem: #{DEFAULT_OPTIONS[:fs]}"
63
- puts "Username: #{DEFAULT_OPTIONS[:username]}"
64
- puts "Encrypt: #{DEFAULT_OPTIONS[:encrypt]}"
65
- puts
66
- puts "separate-boot disk: #{DEFAULT_OPTIONS[:boot_disk]}"
67
- puts "separate-cache disk: #{DEFAULT_OPTIONS[:cache_disk]}"
68
- puts "separate-home disk: #{DEFAULT_OPTIONS[:home_disk]}"
69
- puts
70
- print "Continue? (n,y) "
71
- case gets.chomp
72
- when /^y|^Y/
73
- return
74
- else
75
- exit 1
68
+ @log.fatal 'No disk, use at least getch with -d DISK' unless OPTIONS[:disk]
69
+
70
+ puts "\nBuild " + OPTIONS[:os].capitalize + " Linux with the following args:\n"
71
+ puts
72
+ puts "\tLang: #{OPTIONS[:language]}"
73
+ puts "\tTimezone: #{OPTIONS[:timezone]}"
74
+ puts "\tKeymap: #{OPTIONS[:keymap]}"
75
+ puts "\tDisk: #{OPTIONS[:disk]}"
76
+ puts "\tFilesystem: #{OPTIONS[:fs]}"
77
+ puts "\tUsername: #{OPTIONS[:username]}"
78
+ puts "\tEncrypt: #{OPTIONS[:encrypt]}"
79
+ puts "\tMusl: #{OPTIONS[:musl]}"
80
+ puts
81
+ puts "\tseparate-boot disk: #{OPTIONS[:boot_disk]}"
82
+ puts "\tseparate-cache disk: #{OPTIONS[:cache_disk]}"
83
+ puts "\tseparate-home disk: #{OPTIONS[:home_disk]}"
84
+ puts
85
+ print 'Continue? (y,N) '
86
+ case gets.chomp
87
+ when /^y|^Y/
88
+ else
89
+ exit
90
+ end
76
91
  end
77
- end
78
92
 
79
- def self.format(disk, fs, user)
80
- return if STATES[:format] and STATES[:partition]
81
- log = Log.new
82
- puts
83
- print "Partition and format disk #{disk}, this will erase all data, continue? (n,y) "
84
- case gets.chomp
85
- when /^y|^Y/
86
- log.info("Partition start")
87
- class_fs::Partition.new
88
- class_fs::Format.new
89
- else
90
- exit 1
93
+ def prepare_disk
94
+ @assembly.clean
95
+ @assembly.partition
96
+ @assembly.format
97
+ @assembly.mount
91
98
  end
92
- end
93
99
 
94
- def self.init_gentoo(options)
95
- gentoo = Getch::Gentoo
96
- gentoo.stage3
97
- gentoo.config(options)
98
- gentoo.chroot(options)
99
- gentoo.kernel
100
- gentoo.boot(options)
101
- end
100
+ def install_system
101
+ @assembly.tarball
102
+ @assembly.pre_config
103
+ @assembly.update
104
+ @assembly.post_config
105
+ end
102
106
 
103
- def self.configure(options)
104
- config = Getch::Config.new
105
- config.network
106
- end
107
+ def terraform
108
+ @assembly.terraform
109
+ @assembly.services
110
+ end
111
+
112
+ def bootloader
113
+ @assembly.luks_keys
114
+ @assembly.bootloader
115
+ end
107
116
 
108
- def self.main(argv)
109
- options = Options.new(argv)
110
- DEFAULT_OPTIONS.freeze
111
- resume_options(options)
112
- Getch::States.new # Update States
113
- format(options.disk, options.fs, options.username)
114
- class_fs::Mount.new.run
115
- init_gentoo(options)
116
- configure(options)
117
+ def finalize
118
+ @assembly.finalize
119
+ end
120
+
121
+ def configure
122
+ config = Getch::Config::Main.new
123
+ config.ethernet
124
+ config.wifi
125
+ config.dns
126
+ config.sysctl
127
+ config.shell
128
+ end
117
129
  end
118
130
  end
data/lib/luks.rb ADDED
@@ -0,0 +1,239 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'nito'
4
+ require 'getch/log'
5
+ require 'getch/command'
6
+
7
+ module Luks
8
+ class Main
9
+ include Luks
10
+ include NiTo
11
+
12
+ Permission = Class.new(StandardError)
13
+
14
+ def initialize(disk, options)
15
+ @disk = disk
16
+ @format = options[:fs]
17
+ @mountpoint = options[:mountpoint]
18
+ @luks_type = nil
19
+ @key_dir = nil
20
+ @key_name = nil
21
+ @mount = nil
22
+ @bootloader = false
23
+ @log = Getch::Log.new
24
+ @bs = get_bs
25
+ end
26
+
27
+ def encrypt
28
+ args = @luks_type == 'luks2' ? "#{@command_args} --sector-size #{@bs}" : @command_args
29
+ @log.info "Encrypting #{@luks_name} > #{@disk}...\n"
30
+ cmd_crypt 'cryptsetup', 'luksFormat', args, "/dev/#{@disk}"
31
+ end
32
+
33
+ def encrypt_with_key
34
+ make_key
35
+ args = @luks_type == 'luks2' ?
36
+ "#{@command_args} -q --sector-size #{@bs} -d #{@full_key_path}" :
37
+ "#{@command_args} -q -d #{@full_key_path}"
38
+ @log.info "Encrypting #{@luks_name} with #{@full_key_path}...\n"
39
+ cmd_crypt 'cryptsetup', 'luksFormat', args, "/dev/#{@disk}"
40
+ end
41
+
42
+ def open
43
+ return if File.exist? "/dev/mapper/#{@luks_name}"
44
+
45
+ @log.info "Opening #{@luks_name} > #{@disk}...\n"
46
+ cmd_crypt 'cryptsetup', 'open', @command_args, "/dev/#{@disk}", @luks_name
47
+ unless File.exist? "/dev/mapper/#{@luks_name}"
48
+ raise "No dev /dev/mapper/#{@luks_name}, open it first..."
49
+ end
50
+ end
51
+
52
+ def open_with_key(file = nil)
53
+ return if File.exist? "/dev/mapper/#{@luks_name}"
54
+
55
+ @full_key_path = "#{@mountpoint}#{@key_path}"
56
+ key = file ? file : @full_key_path
57
+ @log.info "Opening #{@luks_name} disk #{@disk} with #{key}...\n"
58
+ cmd_crypt 'cryptsetup', 'open', @command_args, '-d', key, "/dev/#{@disk}", @luks_name
59
+ end
60
+
61
+ def format
62
+ case @format
63
+ when 'ext4'
64
+ format_ext4
65
+ when 'xfs'
66
+ format_xfs
67
+ when 'fat'
68
+ format_fat
69
+ else
70
+ @log.fatal "#{@format} not yet supported."
71
+ end
72
+ end
73
+
74
+ def external_key
75
+ make_key
76
+ @log.info "Adding key for #{@luks_name}...\n"
77
+ cmd_crypt 'cryptsetup', 'luksAddKey', "/dev/#{@disk}", @full_key_path
78
+ end
79
+
80
+ def write_config
81
+ config
82
+ perm
83
+ end
84
+
85
+ def mount
86
+ mountpoint = @luks_name =~ /^root/ ? @mountpoint : "#{@mountpoint}#{@mount}"
87
+ NiTo.mount "/dev/mapper/#{@luks_name}", mountpoint
88
+ end
89
+
90
+ def close
91
+ return unless File.exist? "/dev/mapper/#{@luks_name}"
92
+
93
+ @log.info "Closing #{@luks_name}...\n"
94
+ cmd_crypt 'cryptsetup', 'close', @luks_name
95
+ end
96
+
97
+ def gen_datas
98
+ end
99
+
100
+ protected
101
+
102
+ def make_key
103
+ @key_path = "#{@key_dir}/#{@key_name}"
104
+ @full_key_path = "#{@mountpoint}#{@key_path}"
105
+ @log.info "Generating key...\n"
106
+ mkdir "#{@mountpoint}#{@key_dir}"
107
+ sh 'dd', 'bs=512', 'count=8', 'iflag=fullblock', 'if=/dev/urandom', "of=#{@full_key_path}"
108
+ end
109
+
110
+ # https://wiki.archlinux.org/title/Advanced_Format#File_systems
111
+ def format_ext4
112
+ @log.info "Formating disk with #{@format}...\n"
113
+ sh 'mkfs.ext4', '-F', '-b', @bs, "/dev/mapper/#{@luks_name}"
114
+ end
115
+
116
+ # https://wiki.archlinux.org/title/Advanced_Format#File_systems
117
+ def format_xfs
118
+ @log.info "Formating disk with #{@format}...\n"
119
+ sh 'mkfs.xfs', '-f', '-s', "size=#{@bs}", "/dev/mapper/#{@luks_name}"
120
+ end
121
+
122
+ def config
123
+ @key_path = "#{@key_dir}/#{@key_name}"
124
+ uuid = Getch::Helpers.uuid @disk
125
+ @log.info "Writing configs for #{@luks_name}...\n"
126
+
127
+ @log.info " * Writing #{@mountpoint}/etc/crypttab..."
128
+ line = "#{@luks_name} UUID=#{uuid} #{@key_path} luks"
129
+ echo_a "#{@mountpoint}/etc/crypttab", line
130
+ @log.result_ok
131
+
132
+ config_openrc
133
+ config_grub
134
+ end
135
+
136
+ # https://wiki.gentoo.org/wiki/Dm-crypt#Configuring_dm-crypt
137
+ def config_openrc
138
+ Getch::Helpers.openrc? || return
139
+
140
+ conf = "#{@mountpoint}/etc/conf.d/dmcrypt"
141
+ uuid = Getch::Helpers.uuid @disk
142
+ echo_a conf, "target=#{@luks_name}"
143
+ echo_a conf, "source=UUID=\"#{uuid}\""
144
+ echo_a conf, "key=#{@key_path}"
145
+ end
146
+
147
+ def config_grub
148
+ return unless @bootloader
149
+
150
+ if Getch::Helpers.grub?
151
+ @log.info ' * Writing to /etc/default/grub...'
152
+ line = 'GRUB_ENABLE_CRYPTODISK=y'
153
+ echo_a "#{@mountpoint}/etc/default/grub", line
154
+ @log.result_ok
155
+ end
156
+ end
157
+
158
+ def perm
159
+ @key_path = "#{@key_dir}/#{@key_name}"
160
+ @full_key_path = "#{@mountpoint}#{@key_path}"
161
+ @log.info "Enforcing permission on #{@full_key_path}..."
162
+ File.chmod 0400, "#{@mountpoint}#{@key_dir}"
163
+ File.chmod 0000, @full_key_path
164
+ File.chown 0, 0, @full_key_path
165
+ @log.result_ok
166
+ end
167
+
168
+ private
169
+
170
+ def get_bs
171
+ @disk || @log.fatal("No disk for #{@luks_name}.")
172
+
173
+ sh 'blockdev', '--getpbsz', "/dev/#{@disk}"
174
+ end
175
+
176
+ def cmd_crypt_raw(*args)
177
+ system args.join(' ')
178
+ return if $?.exitstatus == 0
179
+
180
+ @log.dbg args.join(' ')
181
+ @log.dbg $?
182
+ @log.fatal 'die'
183
+ end
184
+
185
+ def cmd_crypt(*args)
186
+ cmd_crypt_raw args
187
+ rescue => e
188
+ @log.fatal e
189
+ end
190
+
191
+ def sh(*args)
192
+ Getch::Command.new(args)
193
+ end
194
+ end
195
+
196
+ # Boot can decrypt the root (/)
197
+ class Boot < Main
198
+ def initialize(disk, options)
199
+ super
200
+ @luks_type = 'luks1'
201
+ @key_dir = '/boot'
202
+ @key_name = 'boot.key'
203
+ @bootloader = true
204
+ @mount = '/boot'
205
+ @luks = options[:luks_name]
206
+ @luks_name = "boot-#{@luks}"
207
+ @command_args = "--type #{@luks_type}"
208
+ end
209
+ end
210
+
211
+ # Root can decrypt the /home or other devs
212
+ class Root < Main
213
+ def initialize(disk, options)
214
+ super
215
+ @luks_type = 'luks2'
216
+ @key_dir = '/boot'
217
+ @key_name = 'root.key'
218
+ @luks = options[:luks_name]
219
+ @luks_name = "root-#{@luks}"
220
+ @mount = '/'
221
+ @command_args = "--type #{@luks_type}"
222
+ @bootloader = false
223
+ end
224
+ end
225
+
226
+ class Home < Main
227
+ def initialize(disk, options)
228
+ super
229
+ @luks_type = 'luks2'
230
+ @key_dir = '/root/keys'
231
+ @key_name = 'home.key'
232
+ @mount = '/home'
233
+ @command_args = "--type #{@luks_type}"
234
+ @luks = options[:luks_name]
235
+ @luks_name = "home-#{@luks}"
236
+ @bootloader = false
237
+ end
238
+ end
239
+ end