]>
Commit | Line | Data |
---|---|---|
1 | #!/usr/bin/perl | |
2 | ||
3 | my $firmware_tarball = '/boot/efi/vendorfw/firmware.tar'; | |
4 | my $firmware_manifest = '/lib/firmware/ASAHI_FIRMWARE_MANIFEST'; | |
5 | my $grubcfg = '/mnt/EFI/debian/grub.cfg'; | |
6 | ||
7 | sub | |
8 | find_root_device | |
9 | { | |
10 | open(MOUNT, '<', '/proc/mounts') || die ("Can not open /proc/mounts for reading: $!"); | |
11 | my @lines = <MOUNT>; | |
12 | close(MOUNT); | |
13 | ||
14 | for (@lines) { | |
15 | if (/^([\S]+)+ \/ /) { | |
16 | return $1; | |
17 | } | |
18 | } | |
19 | ||
20 | die("Could not find root device"); | |
21 | } | |
22 | ||
23 | sub | |
24 | find_fs_uuid_of_device | |
25 | { | |
26 | my $dev = shift || die; | |
27 | my $blkid_output = `blkid ${dev}`; | |
28 | ||
29 | if ($blkid_output =~ /UUID="([^"]+)"/) { | |
30 | return $1; | |
31 | } | |
32 | ||
33 | die("Could not find fs uuid of $dev"); | |
34 | } | |
35 | ||
36 | sub | |
37 | find_efi_parition | |
38 | { | |
39 | my $uuid_in_grub_cfg = shift || die; | |
40 | my @candidates; | |
41 | ||
42 | my $efi_parition = undef; | |
43 | ||
44 | for (`blkid`) { | |
45 | if (/^([\S]+):.*TYPE="vfat"/) { | |
46 | push(@candidates, $1); | |
47 | } | |
48 | } | |
49 | ||
50 | for my $dev (@candidates) { | |
51 | system("mount -o ro $dev /mnt"); | |
52 | if (-f $grubcfg) { | |
53 | open(GRUBCFG, '<', $grubcfg) || die ("Can't open $grubcfg: $!"); | |
54 | my @lines = <GRUBCFG>; | |
55 | for (@lines) { | |
56 | if (/${uuid_in_grub_cfg}/) { | |
57 | $efi_parition = $dev; | |
58 | } | |
59 | } | |
60 | close(GRUBCFG); | |
61 | } | |
62 | system("umount /mnt"); | |
63 | last if defined $efi_parition; | |
64 | } | |
65 | ||
66 | die ("No efi parition found") unless defined $efi_parition; | |
67 | ||
68 | return $efi_parition; | |
69 | } | |
70 | ||
71 | sub | |
72 | generate_fstab | |
73 | { | |
74 | my $root_fs_uuid = shift || die; | |
75 | my $efi_fs_uuid = shift || die; | |
76 | ||
77 | open(FSTAB, '>', '/etc/fstab') || die ("Can not open fstab"); | |
78 | print FSTAB <<EOF; | |
79 | UUID="$root_fs_uuid" / ext4 defaults 0 0 | |
80 | UUID="$efi_fs_uuid" /boot/efi vfat defaults 0 0 | |
81 | EOF | |
82 | close(FSTAB); | |
83 | } | |
84 | ||
85 | sub | |
86 | install_grub | |
87 | { | |
88 | system('rm -rf /boot/efi/EFI'); | |
89 | system('apt-get install -y grub-efi-arm64-signed-'); | |
90 | system("echo 'grub-efi-arm64 grub2/update_nvram boolean false' | debconf-set-selections"); | |
91 | system("echo 'grub-efi-arm64 grub2/force_efi_extra_removable boolean true' | debconf-set-selections"); | |
92 | system('dpkg-reconfigure -fnoninteractive grub-efi-arm64'); | |
93 | system('update-grub'); | |
94 | system('grub-install --removable /boot/efi'); | |
95 | } | |
96 | ||
97 | sub | |
98 | update_wifi_firmware_if_necessary | |
99 | { | |
100 | return unless -f $firmware_tarball; | |
101 | ||
102 | if (-f $firmware_manifest) { | |
103 | system("sha256sum -c $firmware_manifest --quiet"); | |
104 | return if $? == 0; | |
105 | } | |
106 | ||
107 | system("sha256sum $firmware_tarball > $firmware_manifest"); | |
108 | system("tar -C /lib/firmware/ -xf $firmware_tarball"); | |
109 | ||
110 | unlink('/etc/modprobe.d/blacklist.conf'); | |
111 | system('modprobe brcmfmac'); | |
112 | } | |
113 | ||
114 | my $root_block_device = undef; | |
115 | my $initial_root_fs_uuid = undef; | |
116 | my $efi_block_device = undef; | |
117 | my $efi_fs_uuid = undef; | |
118 | ||
119 | unless (-f '/boot/grub/grub.cfg') { | |
120 | $root_block_device = find_root_device(); | |
121 | system("resize2fs $root_block_device"); | |
122 | $initial_root_fs_uuid = find_fs_uuid_of_device($root_block_device); | |
123 | $efi_block_device = find_efi_parition($initial_root_fs_uuid); | |
124 | $efi_fs_uuid = find_fs_uuid_of_device($efi_block_device); | |
125 | generate_fstab($initial_root_fs_uuid, $efi_fs_uuid); | |
126 | system('mount /boot/efi'); | |
127 | install_grub(); | |
128 | } | |
129 | ||
130 | update_wifi_firmware_if_necessary(); |