summarylogtreecommitdiffstats
path: root/memtest86-efi
blob: 7d4add53dfb932dee72264e7eb5393b24e6de7a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#!/usr/bin/bash

export LC_ALL=C
CONFFILE=/etc/memtest86-efi.conf
source $CONFFILE
[[ "$(uname -m)" == "i686" ]]   && ARCH=ia32
[[ "$(uname -m)" == "x86_64" ]] && ARCH=x64

install() {
	if [[ $install == 1 ]]; then
		echo "MemTest86 is already installed in ESP." > /dev/stderr
		exit 1
	fi

	partition=$(fdisk -l | grep "EFI System" | awk '{print $1}' | tail -n1)
	echo -e "Welcome in $0. This script is to easily use MemTest86 with your UEFI, as an EFI application."
	echo -e "\033[1;31mThis script is unofficial, written by an AUR user. Use it at your own risk.\033[0m\n"
	echo -en "If \033[1m$partition\033[0m is your ESP partition, press Enter. Else, enter device, then press Enter: "
	read choice
	[[ -n $choice ]] && partition=$choice
	esp=$(mount | grep $partition | awk '{print $3}' | tail -n1)
	echo -e "Your choice is: \033[1m$partition\033[0m. So your ESP is mounted on: \033[1m$esp\033[0m\n"
	[[ -z $esp ]] && echo -e "\033[1;31mNo ESP mounted found !\033[0m" && exit 1

	echo "Please, how do you want to use $0 ?"
	echo -e "\033[1m1\033[0m: From \033[1mLaunch EFI Shell\033[0m (in UEFI Setup), e.g. as shellx64.efi on ESP's root (bit safe)"
	echo -e "\033[1m2\033[0m: Add a new boot entry (more safe)"
	echo -e "\033[1m3\033[0m: Add a file for GRUB2"
	echo -e "\033[1m4: Cancel\033[0m"
	choice=0; while [[ $choice < 1 ]] || [[ $choice > 4 ]]; do
		read choice
		echo
	done

	if [[ $choice == 1 ]]; then
		# Install MemTest86 in $esp
		echo -e "MemTest86 will be installed in \033[1m$esp\033[0m."
		[[ -f "$esp/shell$ARCH.efi" ]] && mv -v "$esp/shell$ARCH.efi" "$esp/shell$ARCH.efi.bak" # Backup if exist
		cp -v "$MEMTEST86_PATH/"*		"$esp/"	# Move files in ESP root
		mv -v "$esp/boot$ARCH.efi"		"$esp/shell$ARCH.efi"	# Rename .efi file
	elif [[ $choice == 2 ]]; then
		# Install MemTest86 in $esp/EFI/memtest86 & Add a boot entry
		echo -e "MemTest86 will be installed in \033[1m$esp/EFI/memtest86\033[0m."
		mkdir -pv "$esp/EFI/memtest86"
		cp -v "$MEMTEST86_PATH/"*		"$esp/EFI/memtest86/" # Move files in memtest ESP directory
		mv -v "$esp/EFI/memtest86/boot$ARCH.efi" "$esp/EFI/memtest86/memtest$ARCH.efi" # Rename .efi file
		echo -e "\nAdd a new EFI boot entry..."
		efibootmgr -c -d ${partition:0:8} -p ${partition:8} -w -L "MemTest86" -l "\EFI\memtest86\memtest$ARCH.efi" # Manage efi entry
	elif [[ $choice == 3 ]]; then
		# Install MemTest86 in $esp/EFI/memtest86 & Add a file for GRUB2
		echo -e "MemTest86 will be installed in \033[1m$esp/EFI/memtest86\033[0m."
		if [[ ! -d "/etc/grub.d/" ]]; then
			echo -e "\033[1;31mGRUB2 seems not installed on your system. Aborted.\033[0m"
			exit 2
		fi
		mkdir -pv "$esp/EFI/memtest86"
		cp -v "$MEMTEST86_PATH/"*		"$esp/EFI/memtest86/" # Move files in memtest ESP directory
		mv -v "$esp/EFI/memtest86/boot$ARCH.efi" "$esp/EFI/memtest86/memtest$ARCH.efi" # Rename .efi file
		echo -e "\nAdd a new configuration file for GRUB..."
		echo -e "cat <<-EOF
			if [ \"x\\\${grub_platform}\" == \"xefi\" ]; then
			  menuentry \"Memtest86\" {
			    search --set=root --no-floppy --fs-uuid $(blkid $partition -s UUID -o value)
			    chainloader /EFI/memtest86/memtest$ARCH.efi
			  }
			fi
			EOF" > "/etc/grub.d/86_memtest"
		chmod +x "/etc/grub.d/86_memtest"
		grub-mkconfig -o "/boot/grub/grub.cfg"
	elif [[ $choice == 4 ]]; then
		# Do nothing and quit
		echo -e "Canceled. MemTest86 will not be installed."
		exit 1
	fi

	echo "Write configuration..."
	sed -i "s|@PARTITION@|$partition|g" "$CONFFILE"
	sed -i "s|@ESP@|$esp|g" "$CONFFILE"
	sed -i "s|@CHOICE@|$choice|g" "$CONFFILE"
	sed -i "s|install=0|install=1|g" "$CONFFILE"

	echo -e "\nMemTest86 has been installed in ESP."
}

update() {
	if [[ $install == 0 ]]; then
		echo "MemTest86 is not installed in ESP: it can't be updated." > /dev/stderr
		exit 1
	fi

	if [[ $choice == 1 ]]; then
		echo -e "MemTest86 will be updated in \033[1m$esp\033[0m."
		cp -fv "$MEMTEST86_PATH/"*		"$esp/"
		mv -fv "$esp/boot$ARCH.efi"		"$esp/shell$ARCH.efi"
	elif [[ $choice == 2 ]] || [[ $choice == 3 ]]; then
		echo -e "MemTest86 will be updated in \033[1m$esp/EFI/memtest86\033[0m."
		cp -fv "$MEMTEST86_PATH/"*		"$esp/EFI/memtest86/"
		mv -fv "$esp/EFI/memtest86/boot$ARCH.efi" "$esp/EFI/memtest86/memtest$ARCH.efi"
	fi

	echo -e "\nMemTest86 has been updated in ESP."
}

remove() {
	if [[ $install == 0 ]]; then
		echo "MemTest86 is not installed in ESP: it can't be removed." > /dev/stderr
		exit 1
	fi

	if [[ $choice == 1 ]]; then
		echo -e "MemTest86 will be removed from \033[1m$esp\033[0m."
		rm -v "$esp/mt86.png" "$esp/shell$ARCH.efi"
		[[ -f "$esp/shell$ARCH.efi.bak" ]] && mv -v "$esp/shell$ARCH.efi.bak" "$esp/shell$ARCH.efi"
	elif [[ $choice == 2 ]]; then
		echo -e "MemTest86 will be removed from \033[1m$esp/EFI/memtest86\033[0m."
		rm -rfv "$esp/EFI/memtest86/"
		echo -e "\nRemove MemTest86 EFI boot entry..."
		efibootmgr -b $(efibootmgr | grep MemTest86 | cut -c 5-8) -B
	elif [[ $choice == 3 ]]; then
		echo -e "MemTest86 will be removed from \033[1m$esp/EFI/memtest86\033[0m."
		rm -rfv "$esp/EFI/memtest86/"
		echo -e "\nRemove configuration file for GRUB..."
		rm -v "/etc/grub.d/86_memtest"
		grub-mkconfig -o "/boot/grub/grub.cfg"
	fi

	echo "Write configuration..."
	sed -i "s|$partition|@PARTITION@|g" "/etc/memtest86-efi.conf"
	sed -i "s|$esp|@ESP@|g" "/etc/memtest86-efi.conf"
	sed -i "s|$choice|@CHOICE@|g" "/etc/memtest86-efi.conf"
	sed -i "s|install=1|install=0|g" "/etc/memtest86-efi.conf"

	echo -e "\nMemTest86 has been removed from ESP."
}

if [[ $EUID -ne 0 ]]; then
  echo -e "You must be root" > /dev/stderr
  exit 1
fi

case "$1" in
	-i|--install)		install; exit 0;;
	-u|--update)		update; exit 0;;
	-r|--remove)		remove; exit 0;;
	-s|--status)		exit $install;;
	*)			echo -e "Usage: $0 [argument]\n\nArgument:\n\t-i, --install\n\t-u, --update\n\t-r, --remove\n\t-s, --status"; exit 1;;
esac