getch 0.0.5 → 0.1.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 (65) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CHANGELOG.md +30 -0
  5. data/README.md +31 -6
  6. data/bin/setup.sh +29 -13
  7. data/lib/getch.rb +43 -30
  8. data/lib/getch/command.rb +163 -0
  9. data/lib/getch/filesystem.rb +8 -0
  10. data/lib/getch/filesystem/ext4.rb +14 -0
  11. data/lib/getch/filesystem/ext4/config.rb +59 -0
  12. data/lib/getch/filesystem/ext4/deps.rb +22 -0
  13. data/lib/getch/filesystem/ext4/device.rb +16 -0
  14. data/lib/getch/filesystem/ext4/encrypt.rb +15 -0
  15. data/lib/getch/filesystem/ext4/encrypt/config.rb +85 -0
  16. data/lib/getch/filesystem/ext4/encrypt/deps.rb +59 -0
  17. data/lib/getch/filesystem/ext4/encrypt/device.rb +21 -0
  18. data/lib/getch/filesystem/ext4/encrypt/format.rb +32 -0
  19. data/lib/getch/filesystem/ext4/encrypt/mount.rb +64 -0
  20. data/lib/getch/filesystem/ext4/encrypt/partition.rb +116 -0
  21. data/lib/getch/filesystem/ext4/format.rb +30 -0
  22. data/lib/getch/filesystem/ext4/mount.rb +62 -0
  23. data/lib/getch/filesystem/ext4/partition.rb +75 -0
  24. data/lib/getch/filesystem/lvm.rb +14 -0
  25. data/lib/getch/filesystem/lvm/config.rb +63 -0
  26. data/lib/getch/filesystem/lvm/deps.rb +57 -0
  27. data/lib/getch/filesystem/lvm/device.rb +19 -0
  28. data/lib/getch/filesystem/lvm/encrypt.rb +15 -0
  29. data/lib/getch/filesystem/lvm/encrypt/config.rb +74 -0
  30. data/lib/getch/filesystem/lvm/encrypt/deps.rb +63 -0
  31. data/lib/getch/filesystem/lvm/encrypt/device.rb +22 -0
  32. data/lib/getch/filesystem/lvm/encrypt/format.rb +32 -0
  33. data/lib/getch/filesystem/lvm/encrypt/mount.rb +64 -0
  34. data/lib/getch/filesystem/lvm/encrypt/partition.rb +92 -0
  35. data/lib/getch/filesystem/lvm/format.rb +25 -0
  36. data/lib/getch/filesystem/lvm/mount.rb +62 -0
  37. data/lib/getch/filesystem/lvm/partition.rb +81 -0
  38. data/lib/getch/filesystem/zfs.rb +14 -0
  39. data/lib/getch/filesystem/zfs/config.rb +58 -0
  40. data/lib/getch/filesystem/zfs/deps.rb +90 -0
  41. data/lib/getch/filesystem/zfs/device.rb +19 -0
  42. data/lib/getch/filesystem/zfs/encrypt.rb +15 -0
  43. data/lib/getch/filesystem/zfs/encrypt/config.rb +67 -0
  44. data/lib/getch/filesystem/zfs/encrypt/deps.rb +94 -0
  45. data/lib/getch/filesystem/zfs/encrypt/device.rb +21 -0
  46. data/lib/getch/filesystem/zfs/encrypt/format.rb +22 -0
  47. data/lib/getch/filesystem/zfs/encrypt/mount.rb +67 -0
  48. data/lib/getch/filesystem/zfs/encrypt/partition.rb +151 -0
  49. data/lib/getch/filesystem/zfs/format.rb +20 -0
  50. data/lib/getch/filesystem/zfs/mount.rb +67 -0
  51. data/lib/getch/filesystem/zfs/partition.rb +147 -0
  52. data/lib/getch/gentoo.rb +3 -2
  53. data/lib/getch/gentoo/boot.rb +29 -25
  54. data/lib/getch/gentoo/chroot.rb +18 -14
  55. data/lib/getch/gentoo/config.rb +18 -9
  56. data/lib/getch/gentoo/sources.rb +45 -31
  57. data/lib/getch/gentoo/stage.rb +2 -2
  58. data/lib/getch/helpers.rb +24 -6
  59. data/lib/getch/log.rb +54 -0
  60. data/lib/getch/options.rb +16 -7
  61. data/lib/getch/version.rb +1 -1
  62. metadata +48 -5
  63. metadata.gz.sig +0 -0
  64. data/lib/getch/disk.rb +0 -77
  65. data/lib/getch/mount.rb +0 -73
@@ -0,0 +1,30 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Ext4
4
+ class Format < Getch::FileSystem::Ext4::Device
5
+ def initialize
6
+ super
7
+ @fs = 'ext4'
8
+ @state = Getch::States.new()
9
+ format
10
+ end
11
+
12
+ def format
13
+ return if STATES[:format]
14
+ puts "Format #{@disk} with #{@fs}"
15
+ exec("mkfs.fat -F32 #{@dev_boot_efi}") if Helpers::efi?
16
+ exec("mkswap -f #{@dev_swap}")
17
+ exec("mkfs.#{@fs} -F #{@dev_root}")
18
+ exec("mkfs.#{@fs} -F #{@dev_home}") if @dev_home
19
+ @state.format
20
+ end
21
+
22
+ private
23
+
24
+ def exec(cmd)
25
+ Getch::Command.new(cmd).run!
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,62 @@
1
+ require 'fileutils'
2
+
3
+ module Getch
4
+ module FileSystem
5
+ module Ext4
6
+ class Mount < Getch::FileSystem::Ext4::Device
7
+ def initialize
8
+ super
9
+ @root_dir = MOUNTPOINT
10
+ @boot_dir = "#{@root_dir}/boot"
11
+ @boot_efi_dir = "#{@root_dir}/boot/efi"
12
+ @home_dir = @user ? "#{@root_dir}/home/#{@user}" : nil
13
+ @state = Getch::States.new()
14
+ end
15
+
16
+ def run
17
+ return if STATES[:mount]
18
+ mount_swap
19
+ mount_root
20
+ mount_boot
21
+ mount_home
22
+ mount_boot_efi
23
+ @state.mount
24
+ end
25
+
26
+ private
27
+
28
+ def mount_swap
29
+ return if ! @dev_swap
30
+ system("swapon #{@dev_swap}")
31
+ end
32
+
33
+ def mount_root
34
+ return if ! @dev_root
35
+ Dir.mkdir(@root_dir, 0700) if ! Dir.exist?(@root_dir)
36
+ system("mount #{@dev_root} #{@root_dir}")
37
+ end
38
+
39
+ def mount_boot_efi
40
+ return if ! @dev_boot_efi
41
+ FileUtils.mkdir_p @boot_efi_dir, mode: 0700 if ! Dir.exist?(@boot_efi_dir)
42
+ system("mount #{@dev_boot_efi} #{@boot_efi_dir}")
43
+ end
44
+
45
+ def mount_boot
46
+ return if ! @dev_boot
47
+ FileUtils.mkdir_p @boot_dir, mode: 0700 if ! Dir.exist?(@boot_dir)
48
+ system("mount #{@dev_boot} #{@boot_dir}")
49
+ end
50
+
51
+ def mount_home
52
+ return if ! @dev_home
53
+ if @user != nil then
54
+ FileUtils.mkdir_p @home_dir, mode: 0700 if ! Dir.exist?(@home_dir)
55
+ system("mount #{@dev_home} #{@home_dir}")
56
+ end
57
+ @state.mount
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,75 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Ext4
4
+ class Partition < Getch::FileSystem::Ext4::Device
5
+ def initialize
6
+ super
7
+ @state = Getch::States.new()
8
+ run_partition
9
+ end
10
+
11
+ def run_partition
12
+ return if STATES[:partition ]
13
+ clear_struct
14
+ cleaning
15
+ if Helpers::efi?
16
+ partition_efi
17
+ else
18
+ partition_bios
19
+ end
20
+ @state.partition
21
+ end
22
+
23
+ private
24
+
25
+ def clear_struct
26
+ exec("sgdisk -Z /dev/#{@disk}")
27
+ exec("wipefs -a /dev/#{@disk}")
28
+ end
29
+
30
+ def cleaning
31
+ puts
32
+ print "Cleaning data on #{@disk}, can be long, avoid this on Flash Memory (SSD,USB,...) ? (n,y) "
33
+ case gets.chomp
34
+ when /^y|^Y/
35
+ bloc=`blockdev --getbsz /dev/#{@disk}`.chomp
36
+ exec("dd if=/dev/urandom of=/dev/#{@disk} bs=#{bloc} status=progress")
37
+ else
38
+ return
39
+ end
40
+ end
41
+
42
+ # Follow https://wiki.archlinux.org/index.php/Partitioning
43
+ def partition_efi
44
+ # /boot/efi - EFI system partition - 260MB
45
+ # / - Root
46
+ # swap - Linux Swap - size of the ram
47
+ # /home - Home
48
+ mem=`awk '/MemTotal/ {print $2}' /proc/meminfo`.chomp + 'K'
49
+
50
+ exec("sgdisk -n1:1M:+260M -t1:EF00 /dev/#{@disk}")
51
+ exec("sgdisk -n2:0:+15G -t2:8304 /dev/#{@disk}")
52
+ exec("sgdisk -n3:0:+#{mem} -t3:8200 /dev/#{@disk}")
53
+ exec("sgdisk -n4:0:0 -t4:8302 /dev/#{@disk}") if @dev_home
54
+ end
55
+
56
+ def partition_bios
57
+ # None - Bios Boot Partition - 1MiB
58
+ # / - Root
59
+ # swap - Linux Swap - size of the ram
60
+ # /home - Home
61
+ mem=`awk '/MemTotal/ {print $2}' /proc/meminfo`.chomp + 'K'
62
+
63
+ exec("sgdisk -n1:1MiB:+1MiB -t1:EF02 /dev/#{@disk}")
64
+ exec("sgdisk -n2:0:+15G -t2:8304 /dev/#{@disk}")
65
+ exec("sgdisk -n3:0:+#{mem} -t3:8200 /dev/#{@disk}")
66
+ exec("sgdisk -n4:0:0 -t4:8302 /dev/#{@disk}") if @dev_home
67
+ end
68
+
69
+ def exec(cmd)
70
+ Getch::Command.new(cmd).run!
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,14 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Lvm
4
+ end
5
+ end
6
+ end
7
+
8
+ require_relative 'lvm/device'
9
+ require_relative 'lvm/partition'
10
+ require_relative 'lvm/format'
11
+ require_relative 'lvm/mount'
12
+ require_relative 'lvm/config'
13
+ require_relative 'lvm/deps'
14
+ require_relative 'lvm/encrypt'
@@ -0,0 +1,63 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Lvm
4
+ class Config < Getch::FileSystem::Lvm::Device
5
+ def initialize
6
+ super
7
+ gen_uuid
8
+ @root_dir = MOUNTPOINT
9
+ @init = '/usr/lib/systemd/systemd'
10
+ end
11
+
12
+ def fstab
13
+ file = "#{@root_dir}/etc/fstab"
14
+ datas = data_fstab
15
+ File.write(file, datas.join("\n"))
16
+ end
17
+
18
+ def systemd_boot
19
+ return if ! Helpers::efi?
20
+ esp = '/boot/efi'
21
+ dir = "#{@root_dir}/#{esp}/loader/entries/"
22
+ datas_gentoo = [
23
+ 'title Gentoo Linux',
24
+ 'linux /vmlinuz',
25
+ 'initrd /initramfs',
26
+ "options resume=UUID=#{@uuid_swap} root=UUID=#{@uuid_root} init=#{@init} dolvm rw"
27
+ ]
28
+ File.write("#{dir}/gentoo.conf", datas_gentoo.join("\n"))
29
+ end
30
+
31
+ def grub
32
+ return if Helpers::efi?
33
+ file = "#{@root_dir}/etc/default/grub"
34
+ cmdline = [
35
+ "GRUB_CMDLINE_LINUX=\"resume=UUID=#{@uuid_swap} root=UUID=#{@uuid_root} init=#{@init} dolvm rw\""
36
+ ]
37
+ File.write("#{file}", cmdline.join("\n"), mode: 'a')
38
+ end
39
+
40
+ private
41
+
42
+ def gen_uuid
43
+ @uuid_swap = `lsblk -o "UUID" #{@lv_swap} | tail -1`.chomp() if @lv_swap
44
+ @uuid_root = `lsblk -o "UUID" #{@lv_root} | tail -1`.chomp() if @lv_root
45
+ @uuid_dev_root = `lsblk -o "UUID" #{@dev_root} | tail -1`.chomp() if @dev_root
46
+ @uuid_boot = `lsblk -o "UUID" #{@dev_boot} | tail -1`.chomp() if @dev_boot
47
+ @uuid_boot_efi = `lsblk -o "UUID" #{@dev_boot_efi} | tail -1`.chomp() if @dev_boot_efi
48
+ @uuid_home = `lsblk -o "UUID" #{@lv_home} | tail -1`.chomp() if @lv_home
49
+ end
50
+
51
+ def data_fstab
52
+ boot_efi = @dev_boot_efi ? "UUID=#{@uuid_boot_efi} /boot/efi vfat noauto,noatime 1 2" : ''
53
+ boot = @dev_boot ? "UUID=#{@uuid_boot} /boot ext4 noauto,noatime 1 2" : ''
54
+ swap = @lv_swap ? "UUID=#{@uuid_swap} none swap discard 0 0" : ''
55
+ root = @lv_root ? "UUID=#{@uuid_root} / ext4 defaults 0 1" : ''
56
+ home = @lv_home ? "UUID=#{@uuid_home} /home/#{@user} ext4 defaults 0 2" : ''
57
+
58
+ [ boot_efi, boot, swap, root, home ]
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,57 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Lvm
4
+ class Deps
5
+ def initialize
6
+ if Helpers::efi?
7
+ install_efi
8
+ else
9
+ install_bios
10
+ end
11
+ install_deps
12
+ end
13
+
14
+ def make
15
+ options_make
16
+ Getch::Make.new("genkernel --kernel-config=/usr/src/linux/.config all").run!
17
+ end
18
+
19
+ private
20
+ def options_make
21
+ grub = Helpers::efi? ? 'BOOTLOADER="no"' : 'BOOTLOADER="grub2"'
22
+ datas = [
23
+ '',
24
+ grub,
25
+ 'INSTALL="yes"',
26
+ 'MENUCONFIG="no"',
27
+ 'CLEAN="yes"',
28
+ 'SAVE_CONFIG="yes"',
29
+ 'MOUNTBOOT="yes"',
30
+ 'MRPROPER="no"',
31
+ 'LVM="yes"',
32
+ ]
33
+ file = "#{MOUNTPOINT}/etc/genkernel.conf"
34
+ File.write(file, datas.join("\n"), mode: 'a')
35
+ end
36
+
37
+ def install_efi
38
+ end
39
+
40
+ def install_bios
41
+ exec("euse -p sys-boot/grub -E device-mapper")
42
+ end
43
+
44
+ def install_deps
45
+ exec("euse -E lvm")
46
+ Getch::Emerge.new('genkernel lvm2').pkg!
47
+ Getch::Garden.new('-a lvm').run!
48
+ exec("systemctl enable lvm2-monitor")
49
+ end
50
+
51
+ def exec(cmd)
52
+ Getch::Chroot.new(cmd).run!
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,19 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Lvm
4
+ class Device
5
+ def initialize
6
+ @disk = DEFAULT_OPTIONS[:disk]
7
+ @user = DEFAULT_OPTIONS[:username]
8
+ @dev_boot_efi = Helpers::efi? ? "/dev/#{@disk}1" : nil
9
+ @dev_boot = Helpers::efi? ? nil : "/dev/#{@disk}2"
10
+ @dev_root = Helpers::efi? ? "/dev/#{@disk}2" : "/dev/#{@disk}3"
11
+ @vg = 'vg0'
12
+ @lv_root = "/dev/mapper/#{@vg}-root"
13
+ @lv_swap = "/dev/mapper/#{@vg}-swap"
14
+ @lv_home = @user ? "/dev/mapper/#{@vg}-home" : nil
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Lvm
4
+ module Encrypt
5
+ end
6
+ end
7
+ end
8
+ end
9
+
10
+ require_relative 'encrypt/device'
11
+ require_relative 'encrypt/partition'
12
+ require_relative 'encrypt/format'
13
+ require_relative 'encrypt/mount'
14
+ require_relative 'encrypt/config'
15
+ require_relative 'encrypt/deps'
@@ -0,0 +1,74 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Lvm
4
+ module Encrypt
5
+ class Config < Getch::FileSystem::Lvm::Encrypt::Device
6
+ def initialize
7
+ super
8
+ gen_uuid
9
+ @root_dir = MOUNTPOINT
10
+ @init = '/usr/lib/systemd/systemd'
11
+ crypttab
12
+ end
13
+
14
+ def fstab
15
+ file = "#{@root_dir}/etc/fstab"
16
+ datas = data_fstab
17
+ File.write(file, datas.join("\n"))
18
+ end
19
+
20
+ def systemd_boot
21
+ return if ! Helpers::efi?
22
+ esp = '/boot/efi'
23
+ dir = "#{@root_dir}/#{esp}/loader/entries/"
24
+ datas_gentoo = [
25
+ 'title Gentoo Linux',
26
+ 'linux /vmlinuz',
27
+ 'initrd /initramfs',
28
+ "options crypt_root=UUID=#{@uuid_dev_root} root=#{@lv_root} init=#{@init} keymap=#{DEFAULT_OPTIONS[:keymap]} dolvm rw"
29
+ ]
30
+ File.write("#{dir}/gentoo.conf", datas_gentoo.join("\n"))
31
+ end
32
+
33
+ def crypttab
34
+ datas = [
35
+ "cryptswap #{@lv_swap} /dev/urandom swap,cipher=aes-xts-plain64:sha256,size=256"
36
+ ]
37
+ File.write("#{@root_dir}/etc/crypttab", datas.join("\n"))
38
+ end
39
+
40
+ def grub
41
+ return if Helpers::efi?
42
+ file = "#{@root_dir}/etc/default/grub"
43
+ cmdline = [
44
+ "GRUB_CMDLINE_LINUX=\"crypt_root=UUID=#{@uuid_dev_root} root=#{@lv_root} init=#{@init} dolvm rw slub_debug=P page_poison=1 slab_nomerge pti=on vsyscall=none spectre_v2=on spec_store_bypass_disable=seccomp iommu=force keymap=#{DEFAULT_OPTIONS[:keymap]}\"",
45
+ "GRUB_ENABLE_CRYPTODISK=y"
46
+ ]
47
+ File.write("#{file}", cmdline.join("\n"), mode: 'a')
48
+ end
49
+
50
+ private
51
+
52
+ def gen_uuid
53
+ @uuid_swap = `lsblk -o "UUID" #{@lv_swap} | tail -1`.chomp() if @lv_swap
54
+ @uuid_root = `lsblk -d -o "UUID" #{@lv_root} | tail -1`.chomp() if @lv_root
55
+ @uuid_dev_root = `lsblk -d -o "UUID" #{@dev_root} | tail -1`.chomp() if @dev_root
56
+ @uuid_boot = `lsblk -o "UUID" #{@dev_boot} | tail -1`.chomp() if @dev_boot
57
+ @uuid_boot_efi = `lsblk -o "UUID" #{@dev_boot_efi} | tail -1`.chomp() if @dev_boot_efi
58
+ @uuid_home = `lsblk -o "UUID" #{@lv_home} | tail -1`.chomp() if @lv_home
59
+ end
60
+
61
+ def data_fstab
62
+ boot_efi = @dev_boot_efi ? "UUID=#{@uuid_boot_efi} /boot/efi vfat noauto,noatime 1 2" : ''
63
+ boot = @dev_boot ? "UUID=#{@uuid_boot} /boot ext4 noauto,noatime 1 2" : ''
64
+ swap = @lv_swap ? "/dev/mapper/cryptswap none swap discard 0 0" : ''
65
+ root = @lv_root ? "UUID=#{@uuid_root} / ext4 defaults 0 1" : ''
66
+ home = @lv_home ? "UUID=#{@uuid_home} /home/#{@user} ext4 defaults 0 2" : ''
67
+
68
+ [ boot_efi, boot, swap, root, home ]
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,63 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Lvm
4
+ module Encrypt
5
+ class Deps
6
+ def initialize
7
+ if Helpers::efi?
8
+ install_efi
9
+ else
10
+ install_bios
11
+ end
12
+ install_deps
13
+ end
14
+
15
+ def make
16
+ options_make
17
+ Getch::Make.new("genkernel --kernel-config=/usr/src/linux/.config all").run!
18
+ end
19
+
20
+ private
21
+ def options_make
22
+ grub = Helpers::efi? ? 'BOOTLOADER="no"' : 'BOOTLOADER="grub2"'
23
+ datas = [
24
+ '',
25
+ grub,
26
+ 'INSTALL="yes"',
27
+ 'MENUCONFIG="no"',
28
+ 'CLEAN="yes"',
29
+ 'KEYMAP="yes"',
30
+ 'SAVE_CONFIG="yes"',
31
+ 'MOUNTBOOT="yes"',
32
+ 'MRPROPER="no"',
33
+ 'LVM="yes"',
34
+ 'LUKS="yes"',
35
+ ]
36
+ file = "#{MOUNTPOINT}/etc/genkernel.conf"
37
+ File.write(file, datas.join("\n"), mode: 'a')
38
+ end
39
+
40
+ def install_efi
41
+ end
42
+
43
+ def install_bios
44
+ exec("euse -p sys-boot/grub -E device-mapper")
45
+ end
46
+
47
+ def install_deps
48
+ make_conf = "#{MOUNTPOINT}/etc/portage/make.conf"
49
+ exec("euse -E lvm") if ! Helpers::grep?(make_conf, /lvm/)
50
+ exec("euse -E cryptsetup") if ! Helpers::grep?(make_conf, /cryptsetup/)
51
+ Getch::Emerge.new('genkernel systemd sys-fs/cryptsetup lvm2').pkg!
52
+ Getch::Garden.new('-a lvm').run!
53
+ exec("systemctl enable lvm2-monitor")
54
+ end
55
+
56
+ def exec(cmd)
57
+ Getch::Chroot.new(cmd).run!
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end