Script to wipe hdds content
This commit is contained in:
		
							parent
							
								
									0fdd709c4a
								
							
						
					
					
						commit
						a0d3b1a5b0
					
				|  | @ -0,0 +1,321 @@ | ||||||
|  | #!/bin/sh | ||||||
|  | # | ||||||
|  | # Purpose {{{ | ||||||
|  | # This script will try to clean the content of the two firsts hdd | ||||||
|  | #   1. Remove everything related to LVM | ||||||
|  | #   2. Remove partitions | ||||||
|  | # | ||||||
|  | # 2021-12-08 | ||||||
|  | # }}} | ||||||
|  | # Vars {{{ | ||||||
|  | readonly PROGNAME=$(basename "${0}") | ||||||
|  | readonly PROGDIR=$(readlink -m $(dirname "${0}")) | ||||||
|  | readonly ARGS="${*}" | ||||||
|  | readonly NBARGS="${#}" | ||||||
|  | [ -z "${DEBUG}" ] && DEBUG=1 | ||||||
|  | ## Export DEBUG for sub-script | ||||||
|  | export DEBUG | ||||||
|  | 
 | ||||||
|  | # Default values for some vars | ||||||
|  | #readonly MY_VAR_XY_DEFAULT="666" | ||||||
|  | 
 | ||||||
|  | ## Colors | ||||||
|  | readonly PURPLE='\033[1;35m' | ||||||
|  | readonly RED='\033[0;31m' | ||||||
|  | readonly RESET='\033[0m' | ||||||
|  | readonly COLOR_DEBUG="${PURPLE}" | ||||||
|  | # }}} | ||||||
|  | usage() {                                                       # {{{ | ||||||
|  | 
 | ||||||
|  | 	cat <<- EOF | ||||||
|  | usage: $PROGNAME [-d|-h] | ||||||
|  | 
 | ||||||
|  | Remove everything related to /dev/sda and /dev/sdb | ||||||
|  | 
 | ||||||
|  | EXAMPLES : | ||||||
|  |     - Remove sda and sdb partitions | ||||||
|  |         ${PROGNAME} | ||||||
|  | 
 | ||||||
|  | OPTIONS : | ||||||
|  |     -d,--debug | ||||||
|  |         Enable debug messages. | ||||||
|  | 
 | ||||||
|  |     -h,--help | ||||||
|  |         Print this help message. | ||||||
|  | 
 | ||||||
|  | 	EOF | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | # }}} | ||||||
|  | debug_message() {                                               # {{{ | ||||||
|  | 
 | ||||||
|  | 	local_message="${1}" | ||||||
|  | 
 | ||||||
|  | 	## Print message if DEBUG is enable (=0) | ||||||
|  | 	[ "${DEBUG}" -eq "0" ] && printf '\e[1;35m%-6b\e[m\n' "DEBUG − ${PROGNAME} : ${local_message}" | ||||||
|  | 
 | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  | # }}} | ||||||
|  | error_message() {                                               # {{{ | ||||||
|  | 
 | ||||||
|  | 	local_error_message="${1}" | ||||||
|  | 	local_error_code="${2}" | ||||||
|  | 
 | ||||||
|  | 	## Print message if DEBUG is enable (=0) | ||||||
|  | 	[ "${DEBUG}" -eq "0" ] && printf '%b\n' "ERROR − ${PROGNAME} : ${RED}${local_error_message}${RESET}" | ||||||
|  | 
 | ||||||
|  | 	exit "${local_error_code:=66}" | ||||||
|  | } | ||||||
|  | # }}} | ||||||
|  | install_dependencies() {                                        # {{{ | ||||||
|  | 
 | ||||||
|  | 	## Update APT repositories {{{ | ||||||
|  | 	## OR exit | ||||||
|  | 	debug_message "install_dependencies − \ | ||||||
|  | Update repositories…" | ||||||
|  | 	apt update > /dev/null \ | ||||||
|  | 		|| exit 1 | ||||||
|  | 	## }}} | ||||||
|  | 
 | ||||||
|  | 	## Install dependencies {{{ | ||||||
|  | 	## OR exit | ||||||
|  | 	debug_message "install_dependencies − \ | ||||||
|  | Install some packages…" | ||||||
|  | 	apt install -y coreutils e2fsprogs gawk lvm2 thin-provisioning-tools parted util-linux > /dev/null \ | ||||||
|  | 		|| exit 2 | ||||||
|  | 	## }}} | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | # }}} | ||||||
|  | is_vg_available() {                                             # {{{ | ||||||
|  | 
 | ||||||
|  | 	## Return False by default | ||||||
|  | 	return_is_vg_available="1" | ||||||
|  | 
 | ||||||
|  | 	## If at least 1 VG is available | ||||||
|  | 	if [ `vgs --noheadings | wc --line` -gt 0 ]; then | ||||||
|  | 		debug_message "is_vg_available − \ | ||||||
|  | At least one Volume Group is ${RED}available${COLOR_DEBUG}." | ||||||
|  | 		return_is_vg_available="0" | ||||||
|  | 	else | ||||||
|  | 		debug_message "is_vg_available − \ | ||||||
|  | ${RED}No${COLOR_DEBUG} Volume Group available on this host." | ||||||
|  | 		return_is_vg_available="1" | ||||||
|  | 	fi | ||||||
|  | 
 | ||||||
|  | 	return "${return_is_vg_available}" | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | # }}} | ||||||
|  | remove_vg() {                                                   # {{{ | ||||||
|  | 
 | ||||||
|  | 	local_vg_name="${1}" | ||||||
|  | 
 | ||||||
|  | 	## Return False by default | ||||||
|  | 	return_remove_vg="1" | ||||||
|  | 
 | ||||||
|  | 	## If the Volume Group is successfully removed | ||||||
|  | 	if vgremove "${local_vg_name}" ; then | ||||||
|  | 		debug_message "remove_vg − \ | ||||||
|  | ${local_vg_name} Volume Group was successfully ${RED}removed${COLOR_DEBUG}." | ||||||
|  | 		return_remove_vg="0" | ||||||
|  | 	else | ||||||
|  | 		debug_message "remove_vg − \ | ||||||
|  | Error with ${RED}vgremove${COLOR_DEBUG} command." | ||||||
|  | 		return_remove_vg="1" | ||||||
|  | 	fi | ||||||
|  | 
 | ||||||
|  | 	return "${return_remove_vg}" | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | # }}} | ||||||
|  | is_pv_available() {                                             # {{{ | ||||||
|  | 
 | ||||||
|  | 	## Return False by default | ||||||
|  | 	return_is_pv_available="1" | ||||||
|  | 
 | ||||||
|  | 	## If at least 1 PV is available | ||||||
|  | 	if [ `pvs --noheadings | wc --line` -gt 0 ]; then | ||||||
|  | 		debug_message "is_pv_available − \ | ||||||
|  | At least one Physical Volume is ${RED}available${COLOR_DEBUG}." | ||||||
|  | 		return_is_pv_available="0" | ||||||
|  | 	else | ||||||
|  | 		debug_message "is_pv_available − \ | ||||||
|  | ${RED}No${COLOR_DEBUG} Physical Volume available on this host." | ||||||
|  | 		return_is_pv_available="1" | ||||||
|  | 	fi | ||||||
|  | 
 | ||||||
|  | 	return "${return_is_pv_available}" | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | # }}} | ||||||
|  | remove_pv() {                                                   # {{{ | ||||||
|  | 
 | ||||||
|  | 	local_pv_path="${1}" | ||||||
|  | 
 | ||||||
|  | 	## Return False by default | ||||||
|  | 	return_remove_pv="1" | ||||||
|  | 
 | ||||||
|  | 	## If the Physical Volume is successfully removed | ||||||
|  | 	if pvremove "${local_pv_path}" ; then | ||||||
|  | 		debug_message "remove_pv − \ | ||||||
|  | ${local_pv_path} was successfully ${RED}removed${COLOR_DEBUG}." | ||||||
|  | 		return_remove_pv="0" | ||||||
|  | 	else | ||||||
|  | 		debug_message "remove_pv − \ | ||||||
|  | Error with ${RED}pvremove${COLOR_DEBUG} command." | ||||||
|  | 		return_remove_pv="1" | ||||||
|  | 	fi | ||||||
|  | 
 | ||||||
|  | 	return "${return_remove_pv}" | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | # }}} | ||||||
|  | 
 | ||||||
|  | main() {                                                        # {{{ | ||||||
|  | 
 | ||||||
|  | 	## Install dependencies | ||||||
|  | 	install_dependencies | ||||||
|  | 
 | ||||||
|  | 	## If a Volume Group is available {{{ | ||||||
|  | 	## AND Disable all Volume Group (and related Logical Volumes) | ||||||
|  | 	while is_vg_available; do | ||||||
|  | 		### Get first Volume Group name | ||||||
|  | 		vg_name=$(vgs --noheadings | awk '{ print $1; exit }') | ||||||
|  | 
 | ||||||
|  | 		### Ensure to disable all Volume Group | ||||||
|  | 		debug_message "main − \ | ||||||
|  | Disable all Volume Group and related Logical Volumes." | ||||||
|  | 		vgchange --quiet --activate n | ||||||
|  | 
 | ||||||
|  | 		### Try to remove the Volume Group | ||||||
|  | 		### OR exit | ||||||
|  | 		remove_vg "${vg_name}" \ | ||||||
|  | 			|| error_message "Error while trying to remove ${vg_name} Volume Group. Use --debug option for more informations." 3 | ||||||
|  | 	done | ||||||
|  | 	## }}} | ||||||
|  | 
 | ||||||
|  | 	## If a Physical Volume is available {{{ | ||||||
|  | 	while is_pv_available; do | ||||||
|  | 		### Get first Physical Volume path | ||||||
|  | 		pv_path=$(pvs --noheadings | awk '{ print $1; exit }') | ||||||
|  | 
 | ||||||
|  | 		debug_message "main − \ | ||||||
|  | Try to manage ${RED}${pv_path}${COLOR_DEBUG} Physical Volume." | ||||||
|  | 
 | ||||||
|  | 		### Try to remove the Physical Volume | ||||||
|  | 		### OR exit | ||||||
|  | 		remove_pv "${pv_path}" \ | ||||||
|  | 			|| error_message "Error while trying to remove ${pv_path} Physical Volume. Use --debug option for more informations." 4 | ||||||
|  | 	done | ||||||
|  | 	## }}} | ||||||
|  | 
 | ||||||
|  | 	## If a Physical Volume is available {{{ | ||||||
|  | 	while is_pv_available; do | ||||||
|  | 		### Get first Physical Volume path | ||||||
|  | 		pv_path=$(pvs --noheadings | awk '{ print $1; exit }') | ||||||
|  | 
 | ||||||
|  | 		debug_message "main − \ | ||||||
|  | Try to manage ${RED}${pv_path}${COLOR_DEBUG} Physical Volume." | ||||||
|  | 
 | ||||||
|  | 		### Try to remove the Physical Volume | ||||||
|  | 		### OR exit | ||||||
|  | 		remove_pv "${pv_path}" \ | ||||||
|  | 			|| error_message "Error while trying to remove ${pv_path} Physical Volume. Use --debug option for more informations." 4 | ||||||
|  | 	done | ||||||
|  | 	## }}} | ||||||
|  | 
 | ||||||
|  | 	# Remove all old partitions for sda and sdb {{{ | ||||||
|  | 	for hdd in /dev/sda /dev/sdb; do | ||||||
|  | 		## Start partition number to 32 | ||||||
|  | 		part_number="32" | ||||||
|  | 		while [ "${part_number}" -gt 0 ] | ||||||
|  | 		do | ||||||
|  | 			### If partition exists {{{ | ||||||
|  | 			if [ -b "${hdd}${part_number}" ]; then | ||||||
|  | 				debug_message "main − \ | ||||||
|  | Try to remove ${hdd}${part_number} partition." | ||||||
|  | 
 | ||||||
|  | 				parted "${hdd}" rm "${part_number}" \ | ||||||
|  | 					|| error_message "Can't remove ${hdd}${part_number} partition." 5 | ||||||
|  | 			fi | ||||||
|  | 			### }}} | ||||||
|  | 
 | ||||||
|  | 			### Decrease partition number | ||||||
|  | 			part_number=$(($part_number-1)) | ||||||
|  | 		done | ||||||
|  | 	done | ||||||
|  | 	## }}} | ||||||
|  | 
 | ||||||
|  | 	printf '%b\n' "All disks were successfully cleaned. \ | ||||||
|  | You can reboot the system to update mtab." | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | # }}} | ||||||
|  | 
 | ||||||
|  | # Manage arguments                                                # {{{ | ||||||
|  | # This code can't be in a function due to argument management | ||||||
|  | 
 | ||||||
|  | if [ ! "${NBARGS}" -eq "0" ]; then | ||||||
|  | 
 | ||||||
|  | 	manage_arg="0" | ||||||
|  | 
 | ||||||
|  | 	## If the first argument is not an option | ||||||
|  | 	if ! printf -- '%s' "${1}" | grep -q -E -- "^-+"; | ||||||
|  | 	then | ||||||
|  | 		## Print help message and exit | ||||||
|  | 		printf '%b\n' "${RED}Invalid option: ${1}${RESET}" | ||||||
|  | 		printf '%b\n' "---" | ||||||
|  | 		usage | ||||||
|  | 
 | ||||||
|  | 		exit 1 | ||||||
|  | 	fi | ||||||
|  | 
 | ||||||
|  | 	# Parse all options (start with a "-") one by one | ||||||
|  | 	while printf -- '%s' "${1}" | grep -q -E -- "^-+"; do | ||||||
|  | 
 | ||||||
|  | 	case "${1}" in | ||||||
|  | 		-d|--debug )                          ## debug | ||||||
|  | 			DEBUG=0 | ||||||
|  | 			;; | ||||||
|  | 		-h|--help )                           ## help | ||||||
|  | 			usage | ||||||
|  | 			## Exit after help informations | ||||||
|  | 			exit 0 | ||||||
|  | 			;; | ||||||
|  | 		#-v|--var )                            ## Define var with given arg | ||||||
|  | 			### Move to the next argument | ||||||
|  | 			#shift | ||||||
|  | 			### Define var | ||||||
|  | 			#readonly my_var_xy="${1}" | ||||||
|  | 			#;; | ||||||
|  | 		* )                                   ## unknow option | ||||||
|  | 			printf '%b\n' "${RED}Invalid option: ${1}${RESET}" | ||||||
|  | 			printf '%b\n' "---" | ||||||
|  | 			usage | ||||||
|  | 			exit 1 | ||||||
|  | 			;; | ||||||
|  | 	esac | ||||||
|  | 
 | ||||||
|  | 	debug_message "Arguments management − \ | ||||||
|  | ${RED}${1}${COLOR_DEBUG} option managed." | ||||||
|  | 
 | ||||||
|  | 	## Move to the next argument | ||||||
|  | 	shift | ||||||
|  | 	manage_arg=$((manage_arg+1)) | ||||||
|  | 
 | ||||||
|  | 	done | ||||||
|  | 
 | ||||||
|  | 	debug_message "Arguments management − \ | ||||||
|  | ${RED}${manage_arg}${COLOR_DEBUG} argument(s) successfully managed." | ||||||
|  | else | ||||||
|  | 	debug_message "Arguments management − \ | ||||||
|  | No arguments/options to manage." | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # }}} | ||||||
|  | 
 | ||||||
|  | main | ||||||
|  | 
 | ||||||
|  | exit 0 | ||||||
		Loading…
	
		Reference in New Issue