]>
Commit | Line | Data |
---|---|---|
e1af00a3 TG |
1 | #!/usr/bin/perl |
2 | ||
7022d096 | 3 | my $firmware_tarball = '/boot/efi/vendorfw/firmware.tar'; |
de764601 | 4 | my $firmware_manifest = '/lib/firmware/ASAHI_FIRMWARE_MANIFEST'; |
60b2ebc1 | 5 | my $grubcfg = '/mnt/EFI/debian/grub.cfg'; |
de764601 | 6 | |
e1af00a3 TG |
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 | ||
e323215d TG |
23 | sub |
24 | find_fs_uuid_of_device | |
25 | { | |
26 | my $dev = shift || die; | |
27 | my $blkid_output = `blkid ${dev}`; | |
de764601 | 28 | |
e323215d TG |
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"); | |
60b2ebc1 TG |
52 | if (-f $grubcfg) { |
53 | open(GRUBCFG, '<', $grubcfg) || die ("Can't open $grubcfg: $!"); | |
e323215d TG |
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 | ||
ccc0e1bb TG |
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; | |
ccc0e1bb TG |
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 | } | |
e1af00a3 | 84 | |
d72e8ddd TG |
85 | sub |
86 | install_grub | |
87 | { | |
f4dfa7be | 88 | system('rm -rf /boot/efi/EFI'); |
d72e8ddd | 89 | system('apt-get install -y grub-efi-arm64-signed-'); |
d72e8ddd TG |
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"); | |
f4dfa7be TG |
92 | system('dpkg-reconfigure -fnoninteractive grub-efi-arm64'); |
93 | system('update-grub'); | |
94 | system('grub-install --removable /boot/efi'); | |
d72e8ddd TG |
95 | } |
96 | ||
de764601 TG |
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 | system('rmmod brcmfmac'); | |
111 | system('rmmod brcmutil'); | |
112 | sleep(1); | |
113 | system('modprobe brcmfmac'); | |
114 | sleep(1); | |
115 | system('rmmod brcmfmac'); | |
116 | sleep(1); | |
117 | system('modprobe brcmfmac'); | |
118 | } | |
119 | ||
ccc0e1bb | 120 | my $root_block_device = undef; |
fb2efba4 | 121 | my $initial_root_fs_uuid = undef; |
ccc0e1bb TG |
122 | my $efi_block_device = undef; |
123 | my $efi_fs_uuid = undef; | |
124 | ||
5bd8c45b | 125 | unless (-f '/boot/grub/grub.cfg') { |
ccc0e1bb TG |
126 | $root_block_device = find_root_device(); |
127 | system("resize2fs $root_block_device"); | |
fb2efba4 TG |
128 | $initial_root_fs_uuid = find_fs_uuid_of_device($root_block_device); |
129 | $efi_block_device = find_efi_parition($initial_root_fs_uuid); | |
076a2682 | 130 | $efi_fs_uuid = find_fs_uuid_of_device($efi_block_device); |
7a08e3cf | 131 | generate_fstab($initial_root_fs_uuid, $efi_fs_uuid); |
ccc0e1bb | 132 | system('mount /boot/efi'); |
d72e8ddd | 133 | install_grub(); |
ccc0e1bb | 134 | } |
de764601 TG |
135 | |
136 | update_wifi_firmware_if_necessary(); |