getch 0.0.4 → 0.0.9

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 (51) 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 +40 -5
  5. data/README.md +31 -2
  6. data/bin/setup.sh +25 -11
  7. data/lib/getch.rb +41 -30
  8. data/lib/getch/command.rb +156 -0
  9. data/lib/getch/filesystem.rb +7 -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/gentoo.rb +4 -2
  39. data/lib/getch/gentoo/boot.rb +46 -11
  40. data/lib/getch/gentoo/chroot.rb +18 -14
  41. data/lib/getch/gentoo/config.rb +24 -9
  42. data/lib/getch/gentoo/sources.rb +54 -29
  43. data/lib/getch/gentoo/stage.rb +2 -2
  44. data/lib/getch/helpers.rb +28 -1
  45. data/lib/getch/log.rb +54 -0
  46. data/lib/getch/options.rb +16 -7
  47. data/lib/getch/version.rb +1 -1
  48. metadata +34 -5
  49. metadata.gz.sig +3 -4
  50. data/lib/getch/disk.rb +0 -77
  51. data/lib/getch/mount.rb +0 -73
@@ -0,0 +1,22 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Lvm
4
+ module Encrypt
5
+ class Device
6
+ def initialize
7
+ @disk = DEFAULT_OPTIONS[:disk]
8
+ @user = DEFAULT_OPTIONS[:username]
9
+ @dev_boot_efi = Helpers::efi? ? "/dev/#{@disk}1" : nil
10
+ @dev_boot = Helpers::efi? ? nil : "/dev/#{@disk}2"
11
+ @dev_root = Helpers::efi? ? "/dev/#{@disk}2" : "/dev/#{@disk}3"
12
+ @vg = 'vg0'
13
+ @lv_root = "/dev/mapper/#{@vg}-root"
14
+ @lv_swap = "/dev/mapper/#{@vg}-swap"
15
+ @lv_home = @user ? "/dev/mapper/#{@vg}-home" : nil
16
+ @luks_root = "/dev/mapper/cryptroot"
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,32 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Lvm
4
+ module Encrypt
5
+ class Format < Getch::FileSystem::Lvm::Encrypt::Device
6
+ def initialize
7
+ super
8
+ @fs = 'ext4'
9
+ @state = Getch::States.new()
10
+ format
11
+ end
12
+
13
+ def format
14
+ return if STATES[:format]
15
+ puts "Format #{@disk} with #{@fs}"
16
+ exec("mkfs.fat -F32 #{@dev_boot_efi}") if @dev_boot_efi
17
+ exec("mkfs.#{@fs} -F #{@dev_boot}") if @dev_boot
18
+ #exec("mkswap -f #{@lv_swap}")
19
+ exec("mkfs.#{@fs} -F #{@lv_root}")
20
+ exec("mkfs.#{@fs} -F #{@lv_home}") if @lv_home
21
+ @state.format
22
+ end
23
+
24
+ private
25
+ def exec(cmd)
26
+ Getch::Command.new(cmd).run!
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,64 @@
1
+ require 'fileutils'
2
+
3
+ module Getch
4
+ module FileSystem
5
+ module Lvm
6
+ module Encrypt
7
+ class Mount < Getch::FileSystem::Lvm::Encrypt::Device
8
+ def initialize
9
+ super
10
+ @root_dir = MOUNTPOINT
11
+ @boot_dir = "#{@root_dir}/boot"
12
+ @boot_efi_dir = "#{@root_dir}/boot/efi"
13
+ @home_dir = @user ? "#{@root_dir}/home/#{@user}" : nil
14
+ @state = Getch::States.new()
15
+ end
16
+
17
+ def run
18
+ return if STATES[:mount]
19
+ mount_swap
20
+ mount_root
21
+ mount_boot
22
+ mount_home
23
+ mount_boot_efi
24
+ @state.mount
25
+ end
26
+
27
+ private
28
+
29
+ def mount_swap
30
+ return if ! @lv_swap
31
+ system("swapon #{@lv_swap}")
32
+ end
33
+
34
+ def mount_root
35
+ return if ! @lv_root
36
+ Dir.mkdir(@root_dir, 0700) if ! Dir.exist?(@root_dir)
37
+ system("mount #{@lv_root} #{@root_dir}")
38
+ end
39
+
40
+ def mount_boot_efi
41
+ return if ! @dev_boot_efi
42
+ FileUtils.mkdir_p @boot_efi_dir, mode: 0700 if ! Dir.exist?(@boot_efi_dir)
43
+ system("mount #{@dev_boot_efi} #{@boot_efi_dir}")
44
+ end
45
+
46
+ def mount_boot
47
+ return if ! @dev_boot
48
+ FileUtils.mkdir_p @boot_dir, mode: 0700 if ! Dir.exist?(@boot_dir)
49
+ system("mount #{@dev_boot} #{@boot_dir}")
50
+ end
51
+
52
+ def mount_home
53
+ return if ! @lv_home
54
+ if @user != nil then
55
+ FileUtils.mkdir_p @home_dir, mode: 0700 if ! Dir.exist?(@home_dir)
56
+ system("mount #{@lv_home} #{@home_dir}")
57
+ end
58
+ @state.mount
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,92 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Lvm
4
+ module Encrypt
5
+ class Partition < Getch::FileSystem::Lvm::Encrypt::Device
6
+ def initialize
7
+ super
8
+ @state = Getch::States.new()
9
+ @log = Log.new
10
+ run_partition
11
+ end
12
+
13
+ def run_partition
14
+ return if STATES[:partition ]
15
+ clear_struct
16
+ cleaning
17
+ partition
18
+ encrypt
19
+ lvm
20
+ @state.partition
21
+ end
22
+
23
+ private
24
+
25
+ def clear_struct
26
+ oldvg = `vgdisplay | grep #{@vg}`.chomp
27
+ exec("vgremove -f #{@vg}") if oldvg != '' # remove older volume group
28
+ exec("pvremove -f #{@dev_root}") if oldvg != '' and File.exist? @dev_root # remove older volume group
29
+
30
+ exec("sgdisk -Z /dev/#{@disk}")
31
+ exec("wipefs -a /dev/#{@disk}")
32
+ end
33
+
34
+ def cleaning
35
+ puts
36
+ print "Cleaning data on #{@disk}, can be long, avoid this on Flash Memory (SSD,USB,...) ? (n,y) "
37
+ case gets.chomp
38
+ when /^y|^Y/
39
+ bloc=`blockdev --getbsz /dev/#{@disk}`.chomp
40
+ exec("dd if=/dev/urandom of=/dev/#{@disk} bs=#{bloc} status=progress")
41
+ else
42
+ return
43
+ end
44
+ end
45
+
46
+ def partition
47
+ if Helpers::efi?
48
+ exec("sgdisk -n1:1M:+260M -t1:EF00 /dev/#{@disk}")
49
+ exec("sgdisk -n2:0:+0 -t2:8e00 /dev/#{@disk}")
50
+ else
51
+ exec("sgdisk -n1:1MiB:+1MiB -t1:EF02 /dev/#{@disk}")
52
+ exec("sgdisk -n2:0:+128MiB -t2:8300 /dev/#{@disk}")
53
+ exec("sgdisk -n3:0:+0 -t3:8e00 /dev/#{@disk}")
54
+ end
55
+ end
56
+
57
+ def encrypt
58
+ @log.info("Format root")
59
+ Helpers::sys("cryptsetup luksFormat #{@dev_root}")
60
+ @log.debug("Opening root")
61
+ Helpers::sys("cryptsetup open --type luks #{@dev_root} cryptroot")
62
+ end
63
+
64
+ def lvm
65
+ mem=`awk '/MemTotal/ {print $2}' /proc/meminfo`.chomp + 'K'
66
+ exec("pvcreate -f #{@luks_root}")
67
+ exec("vgcreate -f #{@vg} #{@luks_root}")
68
+ # Wipe old signature: https://github.com/chef-cookbooks/lvm/issues/45
69
+ exec("lvcreate -y -Wy -Zy -L 15G -n root #{@vg}")
70
+ exec("lvcreate -y -Wy -Zy -L #{mem} -n swap #{@vg}")
71
+ exec("lvcreate -y -Wy -Zy -l 100%FREE -n home #{@vg}") if @user
72
+ exec("vgchange --available y")
73
+ end
74
+
75
+ # Follow https://wiki.archlinux.org/index.php/Partitioning
76
+ # Partition_efi
77
+ # /boot/efi - EFI system partition - 260MB
78
+ # / - Root
79
+
80
+ # Partition_bios
81
+ # None - Bios Boot Partition - 1MiB
82
+ # /boot - Boot - 8300
83
+ # / - Root
84
+
85
+ def exec(cmd)
86
+ Getch::Command.new(cmd).run!
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,25 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Lvm
4
+ class Format < Getch::FileSystem::Lvm::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
+ system("mkfs.fat -F32 #{@dev_boot_efi}") if @dev_boot_efi
16
+ system("mkfs.#{@fs} -F #{@dev_boot}") if @dev_boot
17
+ system("mkswap -f #{@lv_swap}")
18
+ system("mkfs.#{@fs} -F #{@lv_root}")
19
+ system("mkfs.#{@fs} -F #{@lv_home}") if @lv_home
20
+ @state.format
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,62 @@
1
+ require 'fileutils'
2
+
3
+ module Getch
4
+ module FileSystem
5
+ module Lvm
6
+ class Mount < Getch::FileSystem::Lvm::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 ! @lv_swap
30
+ system("swapon #{@lv_swap}")
31
+ end
32
+
33
+ def mount_root
34
+ return if ! @lv_root
35
+ Dir.mkdir(@root_dir, 0700) if ! Dir.exist?(@root_dir)
36
+ system("mount #{@lv_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 ! @lv_home
53
+ if @user != nil then
54
+ FileUtils.mkdir_p @home_dir, mode: 0700 if ! Dir.exist?(@home_dir)
55
+ system("mount #{@lv_home} #{@home_dir}")
56
+ end
57
+ @state.mount
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,81 @@
1
+ module Getch
2
+ module FileSystem
3
+ module Lvm
4
+ class Partition < Getch::FileSystem::Lvm::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
+ partition
16
+ lvm
17
+ @state.partition
18
+ end
19
+
20
+ private
21
+
22
+ def clear_struct
23
+ oldvg = `vgdisplay | grep #{@vg}`.chomp
24
+ exec("vgremove -f #{@vg}") if oldvg != '' # remove older volume group
25
+ exec("pvremove -f #{@dev_root}") if oldvg != '' and File.exist? @dev_root # remove older volume group
26
+
27
+ exec("sgdisk -Z /dev/#{@disk}")
28
+ exec("wipefs -a /dev/#{@disk}")
29
+ end
30
+
31
+ def cleaning
32
+ puts
33
+ print "Cleaning data on #{@disk}, can be long, avoid this on Flash Memory (SSD,USB,...) ? (n,y) "
34
+ case gets.chomp
35
+ when /^y|^Y/
36
+ bloc=`blockdev --getbsz /dev/#{@disk}`.chomp
37
+ exec("dd if=/dev/urandom of=/dev/#{@disk} bs=#{bloc} status=progress")
38
+ else
39
+ return
40
+ end
41
+ end
42
+
43
+ def partition
44
+ if Helpers::efi?
45
+ exec("sgdisk -n1:1M:+260M -t1:EF00 /dev/#{@disk}")
46
+ exec("sgdisk -n2:0:+0 -t2:8e00 /dev/#{@disk}")
47
+ else
48
+ exec("sgdisk -n1:1MiB:+1MiB -t1:EF02 /dev/#{@disk}")
49
+ exec("sgdisk -n2:0:+128MiB -t2:8300 /dev/#{@disk}")
50
+ exec("sgdisk -n3:0:+0 -t3:8e00 /dev/#{@disk}")
51
+ end
52
+ end
53
+
54
+ def lvm
55
+ mem=`awk '/MemTotal/ {print $2}' /proc/meminfo`.chomp + 'K'
56
+ exec("pvcreate -f #{@dev_root}")
57
+ exec("vgcreate -f #{@vg} #{@dev_root}")
58
+ # Wipe old signature: https://github.com/chef-cookbooks/lvm/issues/45
59
+ exec("lvcreate -y -Wy -Zy -L 15G -n root #{@vg}")
60
+ exec("lvcreate -y -Wy -Zy -L #{mem} -n swap #{@vg}")
61
+ exec("lvcreate -y -Wy -Zy -l 100%FREE -n home #{@vg}") if @user
62
+ exec("vgchange --available y")
63
+ end
64
+
65
+ # Follow https://wiki.archlinux.org/index.php/Partitioning
66
+ # Partition_efi
67
+ # /boot/efi - EFI system partition - 260MB
68
+ # / - Root
69
+
70
+ # Partition_bios
71
+ # None - Bios Boot Partition - 1MiB
72
+ # /boot - Boot - 8300
73
+ # / - Root
74
+
75
+ def exec(cmd)
76
+ Getch::Command.new(cmd).run!
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -32,18 +32,19 @@ module Getch
32
32
  config.repo
33
33
  config.network
34
34
  config.systemd(options)
35
+ config.hostname
35
36
  @state.config
36
37
  end
37
38
 
38
39
  def chroot
39
40
  chroot = Getch::Gentoo::Chroot.new()
40
41
  chroot.update
41
- chroot.world
42
42
  chroot.systemd
43
+ chroot.world
43
44
  return if STATES[:gentoo_kernel]
44
45
  chroot.kernel
45
46
  chroot.kernel_deps
46
- chroot.install_tools
47
+ chroot.install_pkgs
47
48
  end
48
49
 
49
50
  def kernel
@@ -51,6 +52,7 @@ module Getch
51
52
  source = Getch::Gentoo::Sources.new()
52
53
  new
53
54
  source.build_kspp
55
+ source.init_config
54
56
  source.build_others
55
57
  source.make
56
58
  @state.kernel
@@ -1,22 +1,62 @@
1
+ require 'fileutils'
2
+
1
3
  module Getch
2
4
  module Gentoo
3
5
  class Boot
4
6
  def initialize(opts)
5
7
  @disk = opts.disk
6
8
  @user = opts.username
9
+ @config = Getch.class_fs::Config.new()
7
10
  end
8
11
 
9
12
  def start
10
- gen_fstab
11
- grub
13
+ @config.fstab
14
+ bootloader
12
15
  password
13
16
  umount
14
17
  end
15
18
 
19
+ def bootloader
20
+ if Helpers::efi?
21
+ bootctl
22
+ else
23
+ grub
24
+ end
25
+ end
26
+
27
+ # bootctl is alrealy installed with the stage3-amd64-systemd
28
+ def bootctl
29
+ bootctl_dep
30
+ puts "Configuring systemd-boot."
31
+ # ref: https://forums.gentoo.org/viewtopic-p-8118822.html
32
+ esp = '/boot/efi'
33
+ exec_chroot("bootctl --path #{esp} install")
34
+ datas_loader = [
35
+ 'default gentoo',
36
+ 'timeout 3',
37
+ 'editor 0'
38
+ ]
39
+ @config.systemd_boot
40
+ File.write("#{MOUNTPOINT}/#{esp}/loader/loader.conf", datas_loader.join("\n"))
41
+
42
+ FileUtils.cp("#{MOUNTPOINT}/usr/src/linux/arch/x86/boot/bzImage", "#{MOUNTPOINT}/#{esp}/vmlinuz", preserve: true)
43
+
44
+ initramfs = Dir.glob("#{MOUNTPOINT}/boot/initramfs-*.img")
45
+ FileUtils.cp("#{initramfs[0]}", "#{MOUNTPOINT}/#{esp}/initramfs", preserve: true) if initramfs != []
46
+
47
+ exec_chroot("bootctl --path #{esp} update")
48
+ end
49
+
50
+ def bootctl_dep
51
+ puts 'Installing systemd-boot...'
52
+ exec_chroot("euse -p sys-apps/systemd -E gnuefi")
53
+ Getch::Emerge.new("sys-apps/systemd efivar").pkg!
54
+ end
55
+
16
56
  def grub
17
- return if Helpers::efi?
18
57
  puts 'Installing GRUB...'
19
- Helpers::emerge("sys-boot/grub:2", MOUNTPOINT)
58
+ Getch::Emerge.new("sys-boot/grub:2").pkg!
59
+ @config.grub
20
60
  exec_chroot("grub-install /dev/#{@disk}")
21
61
  exec_chroot('grub-mkconfig -o /boot/grub/grub.cfg')
22
62
  end
@@ -36,23 +76,18 @@ module Getch
36
76
 
37
77
  def umount
38
78
  Helpers::exec_or_die("umount -l /mnt/gentoo/dev{/shm,/pts,}")
39
- Helpers::exec_or_die("umount -R #{MOUNTPONT}")
79
+ Helpers::exec_or_die("umount -R #{MOUNTPOINT}")
40
80
  puts "Reboot when you have done"
41
81
  end
42
82
 
43
83
  private
44
84
 
45
- def gen_fstab
46
- mount = Getch::Mount.new(@disk, @user)
47
- mount.gen_fstab
48
- end
49
-
50
85
  def exec_chroot(cmd)
51
86
  script = "chroot #{MOUNTPOINT} /bin/bash -c \"
52
87
  source /etc/profile
53
88
  #{cmd}
54
89
  \""
55
- Helpers::exec_or_die(script)
90
+ Getch::Command.new(script).run!
56
91
  end
57
92
  end
58
93
  end