File: drbl-prepare-memtest

package info (click to toggle)
drbl 5.7.11-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 6,984 kB
  • sloc: sh: 43,522; perl: 8,820; xml: 867; makefile: 131
file content (241 lines) | stat: -rwxr-xr-x 10,212 bytes parent folder | download | duplicates (2)
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
#!/bin/bash
# Steven Shiau <steven _at_ clonezilla org>
# License: GPL
# Description: prepare the memtest86+ by using the files on the system or download and extract the required programs for DRBL.
DRBL_SCRIPT_PATH="${DRBL_SCRIPT_PATH:-/usr/share/drbl}"

. $DRBL_SCRIPT_PATH/sbin/drbl-conf-functions
[ -e /etc/drbl/drbl-ocs.conf ] && . /etc/drbl/drbl-ocs.conf
[ -e $DRBL_SCRIPT_PATH/sbin/ocs-functions ] && . $DRBL_SCRIPT_PATH/sbin/ocs-functions

# Local settings
# By default we only copy the required files to $pxelinux_binsrc_dir. This option will allow us to copy files to dir $pxecfg_pd.
deploy_to_system_too="no"

# Functions
USAGE() {
  echo "Put the memtest86+ files in DRBL package repository"
  echo "Usage: $0 [OPTION]"
  echo "OPTION:"
  echo "-u, --from-upstream   Use the binary from upstream ($MEMTEST86_URL). If this option is not assigned, DRBL will try to use the memtest86+ from your GNU/Linux distribution."
  echo "-mv, --memtest86-version VERSION  The memtest86+ version to be used with -u|--from-upstream. If not assigned, the version number specified in drbl.conf will be used."
  echo "-d, --deploy-to-system-too   Deploy the file to DRBL system ($pxecfg_pd), too."
  echo "Ex: To use the memtest86+ 4.20 from $MEMTEST86_URL, run '$0 -u -mv 4.20'"
}

#
put_memtest_bin_2_drbl_repo() {
  local memtest_bin_abs_path="$1"
  [ -z "$memtest_bin_abs_path" ] && return 1
  echo "Putting memtest86+ in DRBL package repository $memtest86_dir/... "
  memtest_f="$(shorten_memtest_filename `basename $memtest_bin_abs_path`)"
  cp -af $memtest_bin_abs_path $memtest86_dir/$memtest_f
  memtest_v="$(LC_ALL=C strings $memtest_bin_abs_path  | grep -Ei 'Memtest86\+[[:space:]]+v' |\
	       sed -r -e "s/^[[:space:]]*//g" | sort | head -n 1)"
  echo "Memtest86+ version: $memtest_v"
  echo $memtest_v > $memtest86_dir/VERSION
  echo "done!"
  if [ "$deploy_to_system_too" = "yes" ]; then
    echo -n "Putting memtest86+ in DRBL system dir $pxecfg_pd/... "
    cp -af $memtest_f $pxecfg_pd/
    echo $memtest_v > $pxecfg_pd/MEMTEST86+_VERSION
    echo "done!"
  fi
} # end of put_memtest_bin_2_drbl_repo

#
put_upstream_memtest(){
  # Function to use the upstream binary directly
  local ver="$1"
  if [ -z "$ver" ]; then
    [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
    echo "No upstream memtest version was assigned. Program terminated."
    [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
    USAGE
    exit 1
  fi
  memfile="memtest86+-${ver}.bin"
  tmp_wd="$(LC_ALL=C mktemp -d /tmp/memtest_tmp.XXXXXXX)"
  echo -n "Downloading ${ver} memtest86+ files from $MEMTEST86_URL... "
  LC_ALL=C wget $wget_opt -P $tmp_wd $MEMTEST86_URL/$ver/$memfile
  echo "done!"
  put_memtest_bin_2_drbl_repo $tmp_wd/$memfile
  if [ -d "$tmp_wd" -a -n "$(echo "$tmp_wd" | grep -i memtest_tmp)" ]; then
    rm -rf $tmp_wd
  fi
} # end of put_upstream_memtest
#
shorten_memtest_filename() {
  local inp_fn="$1"
  # memtest86+.bin -> mt86+x32.mbr
  # memtest86+x32.bin -> mt86+x32.mbr
  # memtest86+x32.efi -> mt86+x32.efi
  # memtest86+ia32.bin -> mt86+x32.mbr
  # memtest86+ia32.efi -> mt86+x32.efi
  # memtest86+x64.bin -> mt86+x64.mbr
  # memtest86+x64.efi -> mt86+x64.efi
  case "$inp_fn" in
    memtest86+.bin)     echo mt86+x32.mbr;;
    memtest86+x32.bin)  echo mt86+x32.mbr;;
    memtest86+x32.efi)  echo mt86+x32.efi;;
    memtest86+ia32.bin) echo mt86+x32.mbr;;
    memtest86+ia32.efi) echo mt86+x32.efi;;
    memtest86+x64.bin)  echo mt86+x64.mbr;;
    memtest86+x64.efi)  echo mt86+x64.efi;;
    *)                  echo $inp_fn;;
  esac
} # end of shorten_memtest_filename
#
put_distribution_memtest() {
  # Function to use the package from distribution.
  # Memtest86+ file name on different distributions:
  # Debian/Ubuntu
  #  <= v7.2: /boot/memtest86+x64.bin, /boot/memtest86+x64.efi;
  #  >= v8.0: /boot/mt86+ia32, /boot/mt86+x64 (Unified Binary, no longer separate .bin (Legacy) and .efi (UEFI) files
  #  i.e., a single binary for both UEFI and legacy boot.)
  # SuSE: "memtest.bin"
  # Fedora 14: "/boot/memtest86+"
  # Centos 5.6: "/boot/memtest86+-1.65"
  if $query_pkglist_exist_cmd memtest86+ &>/dev/null; then
     # Found on the system
     # For Redhat-like system, there might return more than one file on a system, i.e. one file belongs to 2 rpm packages.
     # 2022/11/23, 2023/05/17 On Debian, memtest86+ v6 is available:
     # /boot/memtest86+x32.bin
     # /boot/memtest86+x32.efi
     # /boot/memtest86+ia32.bin (For newer package)
     # /boot/memtest86+ia32.efi (For newer package)
     # /boot/memtest86+x64.bin
     # /boot/memtest86+x64.efi
     # While for memtest86+ <= v5, the file is:
     # /boot/memtest86+.bin

     # For syslinux in FAT file system, 
     # "memtest86+.bin" is 9 characters, will go wrong when it's FAT (usb flash drive). We use memtest to overwrite the one comes from Debian live.
     # In addition, do NOT use memtest.bin, use memtest instead of memtest.bin
     # since "*.bin" has specially purpose for syslinux.
     # So here they are:
     # memtest86+.bin -> mt86+x32.mbr
     # memtest86+x32.bin -> mt86+x32.mbr
     # memtest86+x32.efi -> mt86+x32.efi
     # memtest86+ia32.bin -> mt86+x32.mbr
     # memtest86+ia32.efi -> mt86+x32.efi
     # memtest86+x64.bin -> mt86+x64.mbr
     # memtest86+x64.efi -> mt86+x64.efi

     # For memtest <= v5.0
     memtest_bin="$(LC_ALL=C $query_pkglist_cmd memtest86+ | grep -Ew "(memtest86\+.bin$|memtest\.bin$|^/boot/memtest86+)" | sort | head -n 1)"
     # For memtest >= v6.0
     memtest_x32_bin="$(LC_ALL=C $query_pkglist_cmd memtest86+ | grep -Ew "^/boot/memtest86\+x32\.bin" | sort | head -n 1)"
     memtest_x32_efi="$(LC_ALL=C $query_pkglist_cmd memtest86+ | grep -Ew "^/boot/memtest86\+x32\.efi" | sort | head -n 1)"
     memtest_x32_bin="$(LC_ALL=C $query_pkglist_cmd memtest86+ | grep -Ew "^/boot/memtest86\+ia32\.bin" | sort | head -n 1)"
     memtest_x32_efi="$(LC_ALL=C $query_pkglist_cmd memtest86+ | grep -Ew "^/boot/memtest86\+ia32\.efi" | sort | head -n 1)"
     memtest_x64_bin="$(LC_ALL=C $query_pkglist_cmd memtest86+ | grep -Ew "^/boot/memtest86\+x64\.bin" | sort | head -n 1)"
     memtest_x64_efi="$(LC_ALL=C $query_pkglist_cmd memtest86+ | grep -Ew "^/boot/memtest86\+x64\.efi" | sort | head -n 1)"
     # For memtest >= v8.0
     memtest_x64="$(LC_ALL=C $query_pkglist_cmd memtest86+ | grep -Ew "^/boot/mt86\+x64$" | sort | head -n 1)"
     for im in $memtest_x64 $memtest_bin $memtest_x32_bin $memtest_x32_efi $memtest_x64_bin $memtest_x64_efi; do
       eval imfile="\$im"
       if [ -n "$imfile" ]; then
         echo "Found $imfile in this system, copying the memtest file to DRBL local repository..."
         put_memtest_bin_2_drbl_repo $imfile
       else
         [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
         echo "Package of memtest was installed, but memtest boot file not found!"
         [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
       fi
     done
  else
     # Download and extract it. The reason we do not install it is we do not want to bother the server's boot menu
     tmp_wd="$(LC_ALL=C mktemp -d /tmp/memtest_tmp.XXXXXXX)"
     echo "Trying to download memtest86+ from distribution repository..."
     if [ -e /etc/debian_version ]; then
       # Debian
       # The binary for memtest86+ in Debian Squeeze: /boot/memtest86+.bin
       # Clean all stale deb files in the cache dir. Otherwise there might be some old version of debs exist in the cache dir.
       LC_ALL=C apt-get clean  
       LC_ALL=C apt-get -d --reinstall install memtest86+
       (
        cd $tmp_wd
        LC_ALL=C dpkg --extract /var/cache/apt/archives/memtest86+*.deb .
	if [ -e "$(pwd)/boot/mt86+x64" ]; then
          put_memtest_bin_2_drbl_repo "$(pwd)"/boot/mt86+x64
	elif [ -e "$(pwd)/boot/memtest86+64.bin" ]; then
          put_memtest_bin_2_drbl_repo "$(pwd)"/boot/memtest86+x64.bin
	elif [ -e "$(pwd)/boot/memtest86+64.efi" ]; then
          put_memtest_bin_2_drbl_repo "$(pwd)"/boot/memtest86+x64.efi
	fi
       )
     elif [ -e /etc/SuSE-release ]; then
       # SuSE
       # The binary for memtest86+ in openSuse 11.3 is: /boot/memtest.bin
       LC_ALL=C zypper install -d -f -y memtest86+
       memtest86_rpm="$(LC_ALL=C find /var/cache/zypp/packages/ -name "memtest86+-*.rpm" -print)"
       memtest_bin="$(LC_ALL=C rpm -qpl "$memtest86_rpm" | grep -Ew "memtest.bin$")"
       (
        cd $tmp_wd
        LC_ALL=C rpm2cpio "$memtest86_rpm" | cpio -idm
        put_memtest_bin_2_drbl_repo "$(pwd)"/$memtest_bin
       )
     else
       # RH-like
       # The binary for memtest86+ in Fedora 14 is: /boot/memtest86+-4.10
       LC_ALL=C yumdownloader --destdir $tmp_wd memtest86+
       memtest_bin="$(LC_ALL=C rpm -qpl "$tmp_wd/memtest86*.rpm" | grep -Ew "^/boot/memtest86+")"
       (
        cd $tmp_wd
        LC_ALL=C rpm2cpio $tmp_wd/memtest86*.rpm | cpio -idm
        put_memtest_bin_2_drbl_repo "$(pwd)"/$memtest_bin
       )
     fi
     if [ -d "$tmp_wd" -a -n "$(LC_ALL=C echo "$tmp_wd" | grep -i memtest_tmp)" ]; then
       rm -rf $tmp_wd
     fi
  fi
} # end of put_distribution_memtest

############
### MAIN ###
############

check_if_root
ask_and_load_lang_set

#
while [ $# -gt 0 ]; do
  case "$1" in
    -u|--from-upstream) shift; mode="from-upstream" ;;
    -mv|--memtest86-version)
        shift;
        if [ -z "$(echo $1 |grep ^-.)" ]; then
          # skip the -xx option, in case 
          memtest_ver_requested="$1"
          [ -z "$memtest_ver_requested" ] && USAGE && exit 1
	  shift
        fi
	;;
    -d|--deploy-to-system-too) shift; deploy_to_system_too="yes" ;;
    *)  USAGE && exit 1 ;;
  esac
done

# Check arch
cpu_arch="$(LC_ALL=C uname -m)"
if [ "$cpu_arch" != "i686" -a "$cpu_arch" != "x86_64" ]; then
  [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
  echo "CPU arch is not i386/i686 or x86_64!"
  echo "Skipping preparing memtest+!"
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  echo "$msg_program_stop"
  exit 3
fi

# mode is essential
[ -z "$mode" ] && mode="from-distribution"
[ -z "$memtest_ver_requested" ] && memtest_ver_requested="$MEMTEST86_VER_DEF"

case "$mode" in
  from-distribution) put_distribution_memtest ;;
  from-upstream)     put_upstream_memtest $memtest_ver_requested ;;
esac

exit 0