1cf200d32Sopenharmony_ci#!/bin/bash 2cf200d32Sopenharmony_ci# test gdisk and sgdisk by creating a dd file 3cf200d32Sopenharmony_ci# Copyright (C) 2011 Guillaume Delacour <gui@iroqwa.org> 4cf200d32Sopenharmony_ci# 5cf200d32Sopenharmony_ci# This program is free software; you can redistribute it and/or modify 6cf200d32Sopenharmony_ci# it under the terms of the GNU General Public License as published by 7cf200d32Sopenharmony_ci# the Free Software Foundation; either version 2 of the License, or 8cf200d32Sopenharmony_ci# (at your option) any later version. 9cf200d32Sopenharmony_ci# 10cf200d32Sopenharmony_ci# This program is distributed in the hope that it will be useful, 11cf200d32Sopenharmony_ci# but WITHOUT ANY WARRANTY; without even the implied warranty of 12cf200d32Sopenharmony_ci# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13cf200d32Sopenharmony_ci# GNU General Public License for more details. 14cf200d32Sopenharmony_ci# 15cf200d32Sopenharmony_ci# You should have received a copy of the GNU General Public License along 16cf200d32Sopenharmony_ci# with this program; if not, write to the Free Software Foundation, Inc., 17cf200d32Sopenharmony_ci# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18cf200d32Sopenharmony_ci# 19cf200d32Sopenharmony_ci# 20cf200d32Sopenharmony_ci# Requires: coreutils (mktemp, dd) and 64M of disk space in /tmp (temp dd disk) 21cf200d32Sopenharmony_ci# 22cf200d32Sopenharmony_ci# This script test gdisk commands through the following scenario: 23cf200d32Sopenharmony_ci# - Initialize a new GPT table 24cf200d32Sopenharmony_ci# - Create a single Linux partition 25cf200d32Sopenharmony_ci# - Change name of partition 26cf200d32Sopenharmony_ci# - Change type of partition 27cf200d32Sopenharmony_ci# - Backup to file the GPT table 28cf200d32Sopenharmony_ci# - Delete the single partition 29cf200d32Sopenharmony_ci# - Restore from backup file the GPT table 30cf200d32Sopenharmony_ci# - Wipe the GPT table 31cf200d32Sopenharmony_ci 32cf200d32Sopenharmony_ci# TODO 33cf200d32Sopenharmony_ci# Try to generate a wrong GPT table to detect problems (test --verify) 34cf200d32Sopenharmony_ci# Create MBR partition table with fdisk and migrate it with gdisk 35cf200d32Sopenharmony_ci 36cf200d32Sopenharmony_ciGDISK_BIN=./gdisk 37cf200d32Sopenharmony_ciSGDISK_BIN=./sgdisk 38cf200d32Sopenharmony_ci 39cf200d32Sopenharmony_ciOPT_CLEAR="o" 40cf200d32Sopenharmony_ciOPT_NEW="n" 41cf200d32Sopenharmony_ciOPT_CHANGE_NAME="c" 42cf200d32Sopenharmony_ciOPT_CHANGE_TYPE="t" 43cf200d32Sopenharmony_ciOPT_BACKUP="b" 44cf200d32Sopenharmony_ciOPT_DELETE="d" 45cf200d32Sopenharmony_ciOPT_ZAP="z" 46cf200d32Sopenharmony_ci 47cf200d32Sopenharmony_ci# temp disk for testing gdisk 48cf200d32Sopenharmony_ciTEMP_DISK=$(mktemp) 49cf200d32Sopenharmony_ci# 64 MiB 50cf200d32Sopenharmony_ciTEMP_DISK_SIZE=65536 51cf200d32Sopenharmony_ci 52cf200d32Sopenharmony_ci# the test partition to create 53cf200d32Sopenharmony_ciTEST_PART_TYPE="8300" 54cf200d32Sopenharmony_ciTEST_PART_DEFAULT_NAME="Linux filesystem" 55cf200d32Sopenharmony_ci 56cf200d32Sopenharmony_ci# newname for the partition 57cf200d32Sopenharmony_ciTEST_PART_NEWNAME=$(tr -dc "[:alpha:]" < /dev/urandom | head -c 8) 58cf200d32Sopenharmony_ci# and new type (swap for example) 59cf200d32Sopenharmony_ciTEST_PART_NEWTYPE="8200" 60cf200d32Sopenharmony_ci 61cf200d32Sopenharmony_ci# GPT data backup to filename 62cf200d32Sopenharmony_ciGPT_BACKUP_FILENAME=$(mktemp) 63cf200d32Sopenharmony_ci 64cf200d32Sopenharmony_ci# Pretty print string (Red if FAILED or green if SUCCESS) 65cf200d32Sopenharmony_ci# $1: string to pretty print 66cf200d32Sopenharmony_cipretty_print() { 67cf200d32Sopenharmony_ci if [ "$1" = "SUCCESS" ] 68cf200d32Sopenharmony_ci then 69cf200d32Sopenharmony_ci # green 70cf200d32Sopenharmony_ci color="32" 71cf200d32Sopenharmony_ci else 72cf200d32Sopenharmony_ci # red 73cf200d32Sopenharmony_ci color="31" 74cf200d32Sopenharmony_ci fi 75cf200d32Sopenharmony_ci 76cf200d32Sopenharmony_ci printf "\033[0;${color}m**$1**\033[m $2\n" 77cf200d32Sopenharmony_ci} 78cf200d32Sopenharmony_ci 79cf200d32Sopenharmony_ci# Verify that the partition exist and has the given type/name 80cf200d32Sopenharmony_ci# $1: Partition type to verify (ex.: 8300) 81cf200d32Sopenharmony_ci# $2: Partition name to verify (ex.: Linux filesystem) 82cf200d32Sopenharmony_ci# $3: Text to print 83cf200d32Sopenharmony_civerify_part() { 84cf200d32Sopenharmony_ci partition=$($GDISK_BIN -l $TEMP_DISK | tail -n 1) 85cf200d32Sopenharmony_ci echo $partition | grep -q "$1[[:space:]]$2$" 86cf200d32Sopenharmony_ci 87cf200d32Sopenharmony_ci if [ $? -eq 0 ] 88cf200d32Sopenharmony_ci then 89cf200d32Sopenharmony_ci pretty_print "SUCCESS" "$3" 90cf200d32Sopenharmony_ci else 91cf200d32Sopenharmony_ci pretty_print "FAILED" "$3" 92cf200d32Sopenharmony_ci exit 1 93cf200d32Sopenharmony_ci fi 94cf200d32Sopenharmony_ci} 95cf200d32Sopenharmony_ci 96cf200d32Sopenharmony_ci 97cf200d32Sopenharmony_ci##################################### 98cf200d32Sopenharmony_ci# Get GUID of disk 99cf200d32Sopenharmony_ci##################################### 100cf200d32Sopenharmony_ciget_diskguid() { 101cf200d32Sopenharmony_ci DISK_GUID=$($GDISK_BIN -l $TEMP_DISK | grep "^Disk identifier (GUID):" | awk '{print $4}') 102cf200d32Sopenharmony_ci return $DISK_GUID 103cf200d32Sopenharmony_ci} 104cf200d32Sopenharmony_ci 105cf200d32Sopenharmony_ci 106cf200d32Sopenharmony_ci##################################### 107cf200d32Sopenharmony_ci# Create a new empty table 108cf200d32Sopenharmony_ci##################################### 109cf200d32Sopenharmony_cicreate_table() { 110cf200d32Sopenharmony_ci case $1 in 111cf200d32Sopenharmony_ci gdisk) 112cf200d32Sopenharmony_ci $GDISK_BIN $TEMP_DISK << EOF 113cf200d32Sopenharmony_ci$OPT_CLEAR 114cf200d32Sopenharmony_ciY 115cf200d32Sopenharmony_ciw 116cf200d32Sopenharmony_ciY 117cf200d32Sopenharmony_ciEOF 118cf200d32Sopenharmony_ci 119cf200d32Sopenharmony_ci ret=$? 120cf200d32Sopenharmony_ci if [ $ret -ne 0 ] 121cf200d32Sopenharmony_ci then 122cf200d32Sopenharmony_ci pretty_print "FAILED" "gdisk return $ret when creating partition table" 123cf200d32Sopenharmony_ci exit 1 124cf200d32Sopenharmony_ci fi 125cf200d32Sopenharmony_ci ;; 126cf200d32Sopenharmony_ci sgdisk) 127cf200d32Sopenharmony_ci $SGDISK_BIN $TEMP_DISK -${OPT_CLEAR} 128cf200d32Sopenharmony_ci 129cf200d32Sopenharmony_ci ret=$? 130cf200d32Sopenharmony_ci if [ $ret -ne 0 ] 131cf200d32Sopenharmony_ci then 132cf200d32Sopenharmony_ci pretty_print "FAILED" "sgdisk return $ret when creating partition table" 133cf200d32Sopenharmony_ci exit 1 134cf200d32Sopenharmony_ci fi 135cf200d32Sopenharmony_ci ;; 136cf200d32Sopenharmony_ci esac 137cf200d32Sopenharmony_ci 138cf200d32Sopenharmony_ci # verify that the table is empty 139cf200d32Sopenharmony_ci # only the columns should appear in the table 140cf200d32Sopenharmony_ci verify_part "Code" "Name" "Create new empty GPT table" 141cf200d32Sopenharmony_ci echo "" 142cf200d32Sopenharmony_ci} 143cf200d32Sopenharmony_ci 144cf200d32Sopenharmony_ci 145cf200d32Sopenharmony_ci 146cf200d32Sopenharmony_ci##################################### 147cf200d32Sopenharmony_ci# First create a new partition 148cf200d32Sopenharmony_ci##################################### 149cf200d32Sopenharmony_cicreate_partition() { 150cf200d32Sopenharmony_ci case $1 in 151cf200d32Sopenharmony_ci gdisk) 152cf200d32Sopenharmony_ci $GDISK_BIN $TEMP_DISK << EOF 153cf200d32Sopenharmony_ci$OPT_NEW 154cf200d32Sopenharmony_ci1 155cf200d32Sopenharmony_ci 156cf200d32Sopenharmony_ci 157cf200d32Sopenharmony_ci$TEST_PART_TYPE 158cf200d32Sopenharmony_ciw 159cf200d32Sopenharmony_ciY 160cf200d32Sopenharmony_ciEOF 161cf200d32Sopenharmony_ci ;; 162cf200d32Sopenharmony_ci 163cf200d32Sopenharmony_ci sgdisk) 164cf200d32Sopenharmony_ci $SGDISK_BIN $TEMP_DISK -${OPT_NEW} 1 -${OPT_CHANGE_NAME} 1:"${TEST_PART_DEFAULT_NAME}" -${OPT_CHANGE_TYPE} 1:$TEST_PART_TYPE 165cf200d32Sopenharmony_ci ;; 166cf200d32Sopenharmony_ci esac 167cf200d32Sopenharmony_ci 168cf200d32Sopenharmony_ci verify_part "$TEST_PART_TYPE" "$TEST_PART_DEFAULT_NAME" "Create new partition" 169cf200d32Sopenharmony_ci echo "" 170cf200d32Sopenharmony_ci} 171cf200d32Sopenharmony_ci 172cf200d32Sopenharmony_ci 173cf200d32Sopenharmony_ci##################################### 174cf200d32Sopenharmony_ci# Change name of partition 175cf200d32Sopenharmony_ci##################################### 176cf200d32Sopenharmony_cichange_partition_name() { 177cf200d32Sopenharmony_ci case $1 in 178cf200d32Sopenharmony_ci gdisk) 179cf200d32Sopenharmony_ci $GDISK_BIN $TEMP_DISK << EOF 180cf200d32Sopenharmony_ci$OPT_CHANGE_NAME 181cf200d32Sopenharmony_ci$TEST_PART_NEWNAME 182cf200d32Sopenharmony_ciw 183cf200d32Sopenharmony_ciY 184cf200d32Sopenharmony_ciEOF 185cf200d32Sopenharmony_ci ;; 186cf200d32Sopenharmony_ci 187cf200d32Sopenharmony_ci sgdisk) 188cf200d32Sopenharmony_ci $SGDISK_BIN $TEMP_DISK -${OPT_CHANGE_NAME} 1:${TEST_PART_NEWNAME} 189cf200d32Sopenharmony_ci ;; 190cf200d32Sopenharmony_ci esac 191cf200d32Sopenharmony_ci 192cf200d32Sopenharmony_ci verify_part "$TEST_PART_TYPE" "$TEST_PART_NEWNAME" "Change partition 1 name ($TEST_PART_DEFAULT_NAME -> $TEST_PART_NEWNAME)" 193cf200d32Sopenharmony_ci echo "" 194cf200d32Sopenharmony_ci} 195cf200d32Sopenharmony_ci 196cf200d32Sopenharmony_ci 197cf200d32Sopenharmony_cichange_partition_type() { 198cf200d32Sopenharmony_ci##################################### 199cf200d32Sopenharmony_ci# Change type of partition 200cf200d32Sopenharmony_ci##################################### 201cf200d32Sopenharmony_ci case $1 in 202cf200d32Sopenharmony_ci gdisk) 203cf200d32Sopenharmony_ci $GDISK_BIN $TEMP_DISK << EOF 204cf200d32Sopenharmony_ci$OPT_CHANGE_TYPE 205cf200d32Sopenharmony_ci$TEST_PART_NEWTYPE 206cf200d32Sopenharmony_ciw 207cf200d32Sopenharmony_ciY 208cf200d32Sopenharmony_ciEOF 209cf200d32Sopenharmony_ci ;; 210cf200d32Sopenharmony_ci 211cf200d32Sopenharmony_ci sgdisk) 212cf200d32Sopenharmony_ci $SGDISK_BIN $TEMP_DISK -${OPT_CHANGE_TYPE} 1:${TEST_PART_NEWTYPE} 213cf200d32Sopenharmony_ci ;; 214cf200d32Sopenharmony_ci esac 215cf200d32Sopenharmony_ci 216cf200d32Sopenharmony_ci verify_part "$TEST_PART_NEWTYPE" "$TEST_PART_NEWNAME" "Change partition 1 type ($TEST_PART_TYPE -> $TEST_PART_NEWTYPE)" 217cf200d32Sopenharmony_ci echo "" 218cf200d32Sopenharmony_ci} 219cf200d32Sopenharmony_ci 220cf200d32Sopenharmony_ci 221cf200d32Sopenharmony_ci##################################### 222cf200d32Sopenharmony_ci# Backup GPT data to file 223cf200d32Sopenharmony_ci##################################### 224cf200d32Sopenharmony_cibackup_table() { 225cf200d32Sopenharmony_ci case $1 in 226cf200d32Sopenharmony_ci gdisk) 227cf200d32Sopenharmony_ci $GDISK_BIN $TEMP_DISK << EOF 228cf200d32Sopenharmony_ci$OPT_BACKUP 229cf200d32Sopenharmony_ci$GPT_BACKUP_FILENAME 230cf200d32Sopenharmony_ciq 231cf200d32Sopenharmony_ciEOF 232cf200d32Sopenharmony_ciecho "" 233cf200d32Sopenharmony_ci ;; 234cf200d32Sopenharmony_ci 235cf200d32Sopenharmony_ci sgdisk) 236cf200d32Sopenharmony_ci $SGDISK_BIN $TEMP_DISK -${OPT_BACKUP} ${GPT_BACKUP_FILENAME} 237cf200d32Sopenharmony_ci ;; 238cf200d32Sopenharmony_ci esac 239cf200d32Sopenharmony_ci 240cf200d32Sopenharmony_ci # if exist and not empty; we will test it after 241cf200d32Sopenharmony_ci if [ -s $GPT_BACKUP_FILENAME ] 242cf200d32Sopenharmony_ci then 243cf200d32Sopenharmony_ci pretty_print "SUCCESS" "GPT data backuped sucessfully" 244cf200d32Sopenharmony_ci else 245cf200d32Sopenharmony_ci pretty_print "FAILED" "Unable to create GPT backup file !" 246cf200d32Sopenharmony_ci exit 1 247cf200d32Sopenharmony_ci fi 248cf200d32Sopenharmony_ci} 249cf200d32Sopenharmony_ci 250cf200d32Sopenharmony_ci 251cf200d32Sopenharmony_ci##################################### 252cf200d32Sopenharmony_ci# Now, we can delete the partition 253cf200d32Sopenharmony_ci##################################### 254cf200d32Sopenharmony_cidelete_partition() { 255cf200d32Sopenharmony_ci case $1 in 256cf200d32Sopenharmony_ci gdisk) 257cf200d32Sopenharmony_ci $GDISK_BIN $TEMP_DISK << EOF 258cf200d32Sopenharmony_ci$OPT_DELETE 259cf200d32Sopenharmony_ciw 260cf200d32Sopenharmony_ciY 261cf200d32Sopenharmony_ciEOF 262cf200d32Sopenharmony_ci ;; 263cf200d32Sopenharmony_ci 264cf200d32Sopenharmony_ci sgdisk) 265cf200d32Sopenharmony_ci $SGDISK_BIN $TEMP_DISK -${OPT_DELETE} 1 266cf200d32Sopenharmony_ci ;; 267cf200d32Sopenharmony_ci esac 268cf200d32Sopenharmony_ci 269cf200d32Sopenharmony_ci # verify that the table is empty (just one partition): 270cf200d32Sopenharmony_ci # only the columns should appear in the table 271cf200d32Sopenharmony_ci verify_part "Code" "Name" "Delete partition 1" 272cf200d32Sopenharmony_ci echo "" 273cf200d32Sopenharmony_ci} 274cf200d32Sopenharmony_ci 275cf200d32Sopenharmony_ci 276cf200d32Sopenharmony_ci##################################### 277cf200d32Sopenharmony_ci# Restore GPT table 278cf200d32Sopenharmony_ci##################################### 279cf200d32Sopenharmony_cirestore_table() { 280cf200d32Sopenharmony_ci $GDISK_BIN $TEMP_DISK << EOF 281cf200d32Sopenharmony_cir 282cf200d32Sopenharmony_cir 283cf200d32Sopenharmony_cil 284cf200d32Sopenharmony_ci$GPT_BACKUP_FILENAME 285cf200d32Sopenharmony_ciw 286cf200d32Sopenharmony_ciY 287cf200d32Sopenharmony_ciEOF 288cf200d32Sopenharmony_ci 289cf200d32Sopenharmony_ci verify_part "$TEST_PART_NEWTYPE" "$TEST_PART_NEWNAME" "Restore the GPT backup" 290cf200d32Sopenharmony_ci echo "" 291cf200d32Sopenharmony_ci} 292cf200d32Sopenharmony_ci 293cf200d32Sopenharmony_ci 294cf200d32Sopenharmony_ci##################################### 295cf200d32Sopenharmony_ci# Change UID of disk 296cf200d32Sopenharmony_ci##################################### 297cf200d32Sopenharmony_cichange_disk_uid() { 298cf200d32Sopenharmony_ci 299cf200d32Sopenharmony_ci # get UID of disk before changing it 300cf200d32Sopenharmony_ci GUID=get_diskguid 301cf200d32Sopenharmony_ci 302cf200d32Sopenharmony_ci 303cf200d32Sopenharmony_ci case $1 in 304cf200d32Sopenharmony_ci gdisk) 305cf200d32Sopenharmony_ci $GDISK_BIN $TEMP_DISK << EOF 306cf200d32Sopenharmony_cix 307cf200d32Sopenharmony_cig 308cf200d32Sopenharmony_ciR 309cf200d32Sopenharmony_ciw 310cf200d32Sopenharmony_ciY 311cf200d32Sopenharmony_ciEOF 312cf200d32Sopenharmony_ci ;; 313cf200d32Sopenharmony_ci 314cf200d32Sopenharmony_ci sgdisk) 315cf200d32Sopenharmony_ci $SGDISK_BIN $TEMP_DISK -U=R 316cf200d32Sopenharmony_ci ;; 317cf200d32Sopenharmony_ci esac 318cf200d32Sopenharmony_ci 319cf200d32Sopenharmony_ci # get GUID after change 320cf200d32Sopenharmony_ci NEW_DISK_GUID=get_diskguid 321cf200d32Sopenharmony_ci 322cf200d32Sopenharmony_ci # compare them 323cf200d32Sopenharmony_ci if [ "$DISK_GUID" != "$NEW_DISK_GUID" ] 324cf200d32Sopenharmony_ci then 325cf200d32Sopenharmony_ci pretty_print "SUCCESS" "GUID of disk has been sucessfully changed" 326cf200d32Sopenharmony_ci else 327cf200d32Sopenharmony_ci pretty_print "FAILED" "GUID of disk is the same as the previous one" 328cf200d32Sopenharmony_ci exit 1 329cf200d32Sopenharmony_ci fi 330cf200d32Sopenharmony_ci} 331cf200d32Sopenharmony_ci 332cf200d32Sopenharmony_ci##################################### 333cf200d32Sopenharmony_ci# Wipe GPT table 334cf200d32Sopenharmony_ci##################################### 335cf200d32Sopenharmony_ciwipe_table() { 336cf200d32Sopenharmony_ci case $1 in 337cf200d32Sopenharmony_ci gdisk) 338cf200d32Sopenharmony_ci $GDISK_BIN $TEMP_DISK << EOF 339cf200d32Sopenharmony_cix 340cf200d32Sopenharmony_ci$OPT_ZAP 341cf200d32Sopenharmony_ciY 342cf200d32Sopenharmony_ciY 343cf200d32Sopenharmony_ciEOF 344cf200d32Sopenharmony_ci ;; 345cf200d32Sopenharmony_ci 346cf200d32Sopenharmony_ci sgdisk) 347cf200d32Sopenharmony_ci $SGDISK_BIN $TEMP_DISK -${OPT_ZAP} 348cf200d32Sopenharmony_ci esac 349cf200d32Sopenharmony_ci 350cf200d32Sopenharmony_ci # verify that the table is empty (just one partition): 351cf200d32Sopenharmony_ci # only the columns should appear in the table 352cf200d32Sopenharmony_ci verify_part "Code" "Name" "Wipe GPT table" 353cf200d32Sopenharmony_ci echo "" 354cf200d32Sopenharmony_ci} 355cf200d32Sopenharmony_ci 356cf200d32Sopenharmony_ci##################################### 357cf200d32Sopenharmony_ci# Test stdin EOF 358cf200d32Sopenharmony_ci##################################### 359cf200d32Sopenharmony_cieof_stdin() { 360cf200d32Sopenharmony_ci $SGDISK_BIN $TEMP_DISK << EOF 361cf200d32Sopenharmony_ci^D 362cf200d32Sopenharmony_ciEOF 363cf200d32Sopenharmony_ci pretty_print "SUCCESS" "EOF successfully exit gdisk" 364cf200d32Sopenharmony_ci} 365cf200d32Sopenharmony_ci 366cf200d32Sopenharmony_ci################################### 367cf200d32Sopenharmony_ci# Main 368cf200d32Sopenharmony_ci################################### 369cf200d32Sopenharmony_ci 370cf200d32Sopenharmony_ci# create a file to simulate a real device 371cf200d32Sopenharmony_cidd if=/dev/zero of=$TEMP_DISK bs=1024 count=$TEMP_DISK_SIZE > /dev/null 2>&1 372cf200d32Sopenharmony_ci 373cf200d32Sopenharmony_ciif [ -s $TEMP_DISK ] 374cf200d32Sopenharmony_cithen 375cf200d32Sopenharmony_ci pretty_print "SUCCESS" "Temp disk sucessfully created" 376cf200d32Sopenharmony_cielse 377cf200d32Sopenharmony_ci pretty_print "FAILED" "Unable to create temp disk !" 378cf200d32Sopenharmony_ci exit 1 379cf200d32Sopenharmony_cifi 380cf200d32Sopenharmony_ci 381cf200d32Sopenharmony_ci# test gdisk and sgdisk 382cf200d32Sopenharmony_cifor binary in gdisk sgdisk 383cf200d32Sopenharmony_cido 384cf200d32Sopenharmony_ci echo "" 385cf200d32Sopenharmony_ci printf "\033[0;34m**Testing $binary binary**\033[m\n" 386cf200d32Sopenharmony_ci echo "" 387cf200d32Sopenharmony_ci create_table "$binary" 388cf200d32Sopenharmony_ci create_partition "$binary" 389cf200d32Sopenharmony_ci change_partition_name "$binary" 390cf200d32Sopenharmony_ci change_partition_type "$binary" 391cf200d32Sopenharmony_ci backup_table "$binary" 392cf200d32Sopenharmony_ci delete_partition "$binary" 393cf200d32Sopenharmony_ci restore_table # only with gdisk 394cf200d32Sopenharmony_ci change_disk_uid "$binary" 395cf200d32Sopenharmony_ci wipe_table "$binary" 396cf200d32Sopenharmony_ci eof_stdin # only with gdisk 397cf200d32Sopenharmony_cidone 398cf200d32Sopenharmony_ci 399cf200d32Sopenharmony_ci# remove temp files 400cf200d32Sopenharmony_cirm -f $TEMP_DISK $GPT_BACKUP_FILENAME 401cf200d32Sopenharmony_ci 402cf200d32Sopenharmony_ciexit 0 403