#!/bin/bash
# -*- ENCODING: UTF-8 -*-

# pica-ie-rev
#
# Erase an external (removable) device.
#
# Copyright (c) 2013-2026: Alexis Puente Montiel   < pica (a) picalibre.org >
#
# Licensed according to GNU AGPL version 3.0.
#
# It is libre/free software; you can use, redistribute and/or modify it according to the terms of GNU AGPL as published by GNU, version 3.0, 19 November 2007.
#
# It is distributed in the hope that it will be useful, but without any warranty. Read GNU AGPL version 3.0 for additional details.
#
# A copy of GNU AGPL version 3.0 is available at /usr/share/doc/<software-package-name>/agpl-3.0.txt (additionally on Internet as text at https://www.gnu.org/licenses/agpl-3.0.txt and as HTML at https://www.gnu.org/licenses/agpl-3.0-standalone.html ).
#
# Note: Additionally to the official e-mails, picalibre.org is strictly the only official site for this software project, please consider using it to download, report bugs and contribute.
#
# Depends: bash, coreutils, dialog | yad | yad-pica | zenity, dosfstools, findutils, gawk | mawk | original-awk, gparted | parted | partitionmanager | util-linux (<<2.29.2-3) | fdisk, grep, lsof, mount | pmount, procps, sed, util-linux
# Recommends: lxterminal | sakura | xfce4-terminal, menu, pica-skel, x11-xkb-utils


### SCRIPT VARIABLES ########################################

CNAME="pica-ie-rev"
VERSION="1.3.1"
TITLE="Pica-IE-Rev"
ICON="/usr/share/icons/pica-ie-rev.png"

# Location of dependent lib files
LIBDEP=/usr/share/pica-ie

# Translations
if [ "$LANG" = "" ] ; then export $(cat /etc/default/locale | grep -a 'LANG=') ; fi
TEXTDOMAIN=pica-ie
TEXTDOMAINDIR=/usr/share/locale/

# Write errors to log
ERRORLOG="$HOME/.${CNAME}.log"
if [ -e "$ERRORLOG" ] ; then
	mv -f $ERRORLOG ${ERRORLOG}.ant
fi
if [ -e "$ERRORLOG" ] ; then rm -rf "$ERRORLOG" ; fi

for i in /etc/pica-global.dist /etc/pica-global.orig /etc/pica-global /etc/pica-global.local ~/.pica-global ~/pica-global ; do
	if [ -f "$i" ] ; then
	cat "$i"
	source "$i"
	source <(cat $i | sed -e "s/=\(YES\|Yes\|yes\|y\|SÍ\|SI\|Sí\|Si\|sí\|si\|S\|s\)/=Y/g" -e "s/=\(No\|no\|n\)/=N/g" -e "s/=\"\(YES\|Yes\|yes\|y\|SÍ\|SI\|Sí\|Si\|sí\|si\|S\|s\)\"/=Y/g" -e "s/=\"\(No\|no\|n\)\"/=N/g")
	fi
done
if [ "$DEBUG" = "Y" ] ; then
	set -xv
	DEBUG="Y"
else
	ERRORLOG="/tmp/.${CNAME}_$(id -nu).log"
	if [ -e "$ERRORLOG" ] ; then mv -f $ERRORLOG ${ERRORLOG}.ant ; fi
	if [ -e "$ERRORLOG" ] ; then rm -rf "$ERRORLOG" ; fi
fi
#if [ "$DEBUG" = "" ] ; then DEBUG="N" ; fi
if [ "$DEBUG" != "N" ] ; then
exec > >(tee -a "$ERRORLOG") 2>&1
echo "$0" "$*" >> "$ERRORLOG"
echo "$CNAME" "$VERSION" >> "$ERRORLOG"
echo $(date +%Y-%m-%d_%H:%M:%S) $"Start" >> "$ERRORLOG"
echo "env:" >> "$ERRORLOG"
env >> "$ERRORLOG"
echo "set:" >> "$ERRORLOG"
set >> "$ERRORLOG"
#else
#exec 2>>"$ERRORLOG"
fi

# Description:
BDESCRIP=$"Erase an external (removable) device."
LDESCRIP=$"$TITLE is a tool to erase an SD card or USB device, leaving it as a 'clean' SD card or USB device."

# Documentation:
docu_info () {
echo "$CNAME ($VERSION) - $BDESCRIP"
echo 
echo $"Usage:" $CNAME [$"OPTIONS"]
echo 
echo $"Options:"
echo -e "$ODESCRIP"
echo 
echo $"'man $CNAME' for more information."
echo 
}
ODESCRIP=" -t""\t"$"Use terminal interface.""\n"" -k""\t"$"Use 'kdialog' if possible.""\n"" -y""\t"$"Use 'yad' if possible (by default in graphical sessions).""\n"" -z""\t"$"Use 'zenity' if possible.""\n"" -x""\t"$"Show help documentation."

while getopts tkyzx OPTION ; do
	case $OPTION in
		t )   T="Y" ; G="N"      ;;
		k )   SDIALOG="kdialog"  ;;
		y )   SDIALOG="yad"      ;;
		z )   SDIALOG="zenity"   ;;
		x )   docu_info ; exit 0 ;;
	esac
done


### DIALOG ########################################

#DEFAULTDIALOGLIST="yad zenity kdialog"
DEFAULTDIALOGLIST="yad zenity"

#if [ -t 0 ] ; then
if [ "$(setxkbmap 1>/dev/null 2>&1 ; echo $? )" -ne 0 ] ; then
	G="N" ; T="Y"
fi

if [ "$G" != "N" ] ; then
	
	if   [ "$SDIALOG" = "kdialog" ] ; then
		DIALOGLIST="kdialog yad zenity"
	elif [ "$SDIALOG" = "yad" ] ; then
		DIALOGLIST="yad zenity kdialog"
	elif [ "$SDIALOG" = "zenity" ] ; then
		DIALOGLIST="zenity yad kdialog"
	else
		DIALOGLIST="$DEFAULTDIALOGLIST"
	fi
	
	if [ "$DIALOGLIST" = "" ] ; then
		if [ "$DEFAULTDIALOGLIST" != "" ] ; then
			DIALOGLIST="$DEFAULTDIALOGLIST"
		else
			DIALOGLIST="yad zenity kdialog"
		fi
	fi
	
	if [ "$(command -v $DIALOGLIST)" = "" ] ; then
		G="N" ; T="Y"
	fi

fi


if [ "$G" = "N" ] ; then

	if [ "$(command -v dialog)" = "" ] ; then
		echo $"ERROR: No supported dialog is installed. $TITLE cannot continue."
		exit 1
	else
		
		DIALOG="dialog --cr-wrap --keep-window --output-fd 1"
		#DIALOG="dialog --cr-wrap --keep-window --output-fd 1 --no-lines --no-shadow"
		if [ "$TITLE" != "" ] ; then
			WICON="--backtitle $(echo $TITLE | sed 's| |-|g')"
		fi
		WTITLE="--title"
		WTEXT=""
		H="0"
		W="0"
		LH="0"
		CALENDAR="--calendar"
		DATEFORMAT="--date-format %Y-%m-%d"
		WTIME="--timebox"
		TIMEFORMAT="--time-format %H:%M:%S"
		DSEL="--dselect"
		FSEL="--fselect"
		WRITE="--inputbox"
		PREWRITE=""
		COLUMN=""
		PRINTCOLUMN1=""
		PRINTCOLUMN2=""
		HIDECOLUMN1=""
		HIDECOLUMN2=""
		#INPUTSEPARATOR="--column-separator"
		#OUTPUTSEPARATOR="--separate-output"
		MONOLIST="--menu"
		#MONOLIST="--radiolist"
		MULTIPLELIST="--separate-output --checklist"
		PRE=""
		POST="off"
		PRES=""
		POSTS="on"

		INFO="--msgbox"
		WAIT="--infobox"

		QYN="--yesno"
		QYNC="--yesno"
		WYN="--yesno"
		WCC="--yesno"
		WYNC="--yesno"
		WM="--msgbox"
		ERROR="--msgbox"

		FORM="--form"
		FORMT=""
		FORMSELPRE=""
		FORMSELPOST=""
		#FORMCALPRE=""
		#FORMCALPOST=""
		#FORMCLPRE=""
		#FORMCLPOST=""
		PRELAB1="1 1"
		POSTLAB1="1 10 999 0"
		PRELAB2="2 1"
		POSTLAB2="2 10 999 0"
		PRELAB3="3 1"
		POSTLAB3="3 10 999 0"

		YES="--yes-label"
		NO="--no-label"
		OK="--ok-label"
		CONTINUE="--ok-label"
		CANCEL="--cancel-label"
		EXTRABUTTON="--extra-button --extra-label"
	
	fi

else

	for i in $DIALOGLIST ; do

		if [ "$(command -v $i)" != "" ] ; then
	
			if [ "$i" = "yad" ] ; then
		
				if [ "$(yad --version | tail -n 1 | cut -d ' ' -f 1 | cut -d '.' -f 1)" -lt 2 ] ; then
					DIALOG="yad --center"  # --selectable-labels (bug in Yad < 2.0) https://github.com/v1cont/yad/blob/master/NEWS
				else
					DIALOG="yad --center --selectable-labels"  # --on-top
				fi
				if [ "$ICON" != "" ] ; then
					WICON="--window-icon $ICON"
				fi
				WTITLE="--title"
				WTEXT="--text"
				H=""
				if [ "$(yad --version | tail -n 1 | grep -aE ^'7.2')" != "" ] ; then
					W="--width=640"
				else
					W="--width=640 --text-width=640 --fixed"  # https://github.com/v1cont/yad/issues/107  https://github.com/v1cont/yad/issues/140
				fi
				LH=""
				CALENDAR="--calendar"
				DATEFORMAT="--date-format %Y-%m-%d"
				WTIME="--separator=\n --columns 3 --form"
				#TIMEFORMAT="--time-format %H:%M:%S"
				DSEL="--file --directory --filename"  # Deleted *-selection alias for --file in Yad 4.0
				FSEL="--file --filename"              # Deleted *-selection alias for --file in Yad 4.0
				WRITE="--entry"
				PREWRITE="--entry-text"
				COLUMN="--column="
				PRINTCOLUMN1="--print-column=01"
				PRINTCOLUMN2="--print-column=02"
				HIDECOLUMN1="--hide-column=01"
				HIDECOLUMN2="--hide-column=02"
				#INPUTSEPARATOR="--item-separator"
				#OUTPUTSEPARATOR="--separator="
				#MONOLIST="--entry"
				MONOLIST="--separator=\n --list --search-column=1 --no-headers"
				MONOLISTH="--separator=\n --list --search-column=1"
				MULTIPLELIST="--separator= --list --checklist --search-column=2 --no-headers"
				MULTIPLELISTH="--separator= --list --checklist --search-column=2"
				PRE="FALSE"
				POST=""
				PRES="TRUE"
				POSTS=""
				# standard gtk keybindings for next and previous search are ctrl+g and ctrl+shift+g while you can redefine them in gtk-keys.css for your theme  # https://github.com/v1cont/yad/issues/127
			
				INFO="--image=/usr/share/icons/picalibre/rm/play.png --button="$"OK"
				WAIT="--image=/usr/share/icons/picalibre/rm/play.png --no-buttons"
			
				QYN="--image=/usr/share/icons/picalibre/rm/question.png --button="$"Yes"":0 --button="$"No"":1"
				QYNC="--image=/usr/share/icons/picalibre/rm/question.png --button="$"Yes"":0 --button="$"No"":1 --button="$"Cancel"":1"
				WYN="--image=/usr/share/icons/picalibre/rm/warning.png --button="$"Yes"":0 --button="$"No"":1"
				WCC="--image=/usr/share/icons/picalibre/rm/warning.png --button="$"Continue"":0 --button="$"Cancel"":1"
				WYNC="--image=/usr/share/icons/picalibre/rm/warning.png --button="$"Yes"":0 --button="$"No"":1 --button="$"Cancel"":1"
				WM="--image=/usr/share/icons/picalibre/rm/warning.png --button="$"OK"
				ERROR="--image=/usr/share/icons/picalibre/rm/error.png --button="$"OK"
			
				FORM="--separator=\n --form"
				FORMT="--field"
				FORMSELPRE="--field"
				FORMSELPOST=":FL"
				FORMCALPRE="--field"
				FORMCALPOST=":DT"
				FORMCLPRE="--field"
				FORMCLPOST=":CB"
				PRELAB1=""
				POSTLAB1=""
				PRELAB2=""
				POSTLAB2=""
				PRELAB3=""
				POSTLAB3=""
			
				YES="--button"
				NO="--button"
				OK="--button"
				CONTINUE="--button"
				CANCEL="--button"
				EXTRABUTTON="--button"
		
			elif [ "$i" = "zenity" ] ; then
		
				DIALOG="zenity"
				if [ "$ICON" != "" ] ; then
					WICON="--window-icon $ICON"
				fi
				WTITLE="--title"
				WTEXT="--text"
				H=""
				W="--width=640"
				LH=""
				CALENDAR="--calendar"
				DATEFORMAT="--date-format %Y-%m-%d"
				WTIME="--separator : --forms"
				#TIMEFORMAT="--time-format %H:%M:%S"
				DSEL="--file-selection --directory --filename"
				FSEL="--file-selection --filename"
				WRITE="--entry"
				PREWRITE="--entry-text"
				COLUMN="--column="
				PRINTCOLUMN1="--print-column=01"
				PRINTCOLUMN2="--print-column=02"
				HIDECOLUMN1="--hide-column=01"
				HIDECOLUMN2="--hide-column=02"
				#INPUTSEPARATOR=""
				#OUTPUTSEPARATOR="--separator=\n"
				MONOLIST="--separator=\n --list --hide-header"
				MONOLISTH="--separator=\n --list"
				MULTIPLELIST="--separator=\n --list --checklist --hide-header"
				MULTIPLELISTH="--separator=\n --list --checklist"
				PRE="FALSE"
				POST=""
				PRES="TRUE"
				POSTS=""
			
				INFO="--info"
				WAIT="--info"
			
				QYN="--question"
				QYNC="--question"
				WYN="--question"
				WCC="--question"
				WYNC="--question"
				WM="--warning"
				ERROR="--error"
			
				FORM="--forms"
				FORMT="--add-entry"
				FORMSELPRE="--add-entry"
				FORMSELPOST=""
				FORMCALPRE="--add-calendar"
				FORMCALPOST=""
				if [ "$(zenity --version | cut -d '.' -f 1 )" -ge 3 ] || [ "$(zenity --version | sed 's|\.||g')" -ge 3102 ] ; then
					FORMCLPOST="--combo-values"
					FORMCLPRE="--add-combo"
				fi
				PRELAB1=""
				POSTLAB1=""
				PRELAB2=""
				POSTLAB2=""
				PRELAB3=""
				POSTLAB3=""
			
				# Zenity <3 does not support custom buttons.
				if [ "$(zenity --version | cut -d '.' -f 1 )" -ge 3 ] ; then
					YES="--ok-label"
					NO="--cancel-label"
					OK="--ok-label"
					CONTINUE="--ok-label"
					CANCEL="--cancel-label"
					#EXTRABUTTON=""
				fi
		
#			elif [ "$i" = "kdialog" ] ; then
#		
#				# CAUTION: All 'kdialog' (TDE, KDE Plasma 4, KDE Plasma 5, KDE Plasma 6,...) are included here!
#			
#				DIALOG="kdialog"
#				if [ "$ICON" != "" ] ; then
#					WICON="--icon $ICON"
#				fi
#				WTITLE="--title"
#				WTEXT=""
#				H=""
#				W=""
#				LH=""
#				# No "--calendar" in TDE-kdialog + No "--date-format" both TDE and Plasma = There is no usable version of kdialog for calendars
#				#CALENDAR="--calendar"
#				#DATEFORMAT="--date-format %Y-%m-%d"
#				#WTIME="--timebox"
#				#TIMEFORMAT="--time-format %H:%M:%S"
#				DSEL="--getexistingdirectory"
#				FSEL="--getsavefilename"
#				#FSEL="--getopenfilename"
#				WRITE="--inputbox"
#				PREWRITE=""
#				COLUMN=""
#				PRINTCOLUMN1=""
#				PRINTCOLUMN2=""
#				HIDECOLUMN1=""
#				HIDECOLUMN2=""
#				#INPUTSEPARATOR=""
#				#OUTPUTSEPARATOR="--separate-output"
#				MONOLIST="--menu"
#				#MONOLIST="--combobox"
#				#MONOLIST="--radiolist"
#				MULTIPLELIST="--separate-output --checklist"
#				PRE=""
#				POST="off"
#				PRES=""
#				POSTS="on"
#			
#				INFO="--msgbox"
#				WAIT="--msgbox"
#			
#				QYN="--yesno"
#				QYNC="--yesnocancel"
#				WYN="--warningyesno"
#				WCC="--warningcontinuecancel"
#				WYNC="--warningyesnocancel"
#				WM="--sorry"
#				ERROR="--error"
#			
#				# No "--form" in any kdialog version
#				#FORM="--form"
#				#FORMT=""
#				#FORMSELPRE=""
#				#FORMSELPOST=""
#				#FORMCALPRE=""
#				#FORMCALPOST=""
#				#FORMCLPRE=""
#				#FORMCLPOST=""
#				#PRELAB1=""
#				#POSTLAB1=""
#				#PRELAB2=""
#				#POSTLAB2=""
#				#PRELAB3=""
#				#POSTLAB3=""
#			
#				# TDE-kdialog does not support custom buttons.
#				if [ "$(kdialog --version | grep -a Qt | grep -aEo "[0-9]" | head -n 1)" -ge 4 ] || [ "$(kdialog --version | grep -aEi kdialog | grep -aEo "[0-9]" | head -n 1)" -gt 1 ] ; then
#					YES="--yes-label"
#					NO="--no-label"
#					OK="--continue-label"
#					CONTINUE="--continue-label"
#					CANCEL="--cancel-label"
#					EXTRABUTTON="--cancel-label"
#				fi
		
			else
		
				true
		
			fi
		
		if [ "$DIALOG" != "" ] ; then break ; fi
		
		fi

	done

fi

if [ "$DIALOG" = "" ] ; then
	echo $"ERROR: No supported dialog is installed. $TITLE cannot continue."
	exit 1
fi


### TERMINAL SELECTION ########################################

if [ "$G" != "N" ] && [ "$(command -v lxterminal sakura xfce4-terminal)" = "" ] ; then $DIALOG $WICON $WTITLE "$TITLE" $WM    $WTEXT $"WARNING: Neither 'lxterminal', nor 'sakura' nor 'xfce4-terminal' are installed, $TITLE might fail." $H $W ; fi

TERMINAL () {
if [ "$G" = "N" ] ; then
	if [ "$TT" != "$TITLE" ] ; then echo "$TT" ; sleep 1 ; fi
	$COM
else
	if [ "$(command -v sakura)" != "" ] ; then
#		sakura -t "$TT" -e "$COM"  # https://bugs.debian.org/782396
		sakura -t "$TT" -x "$COM"  # sakura '-e' bug en Debian 13 "Trixie": Segment violation
	elif [ "$(command -v lxterminal)" != "" ] ; then
		lxterminal -t "$TT" -e "$COM"
	elif [ "$(command -v xfce4-terminal)" != "" ] ; then
		xfce4-terminal -T "$TT" -e "$COM"
	else
		x-terminal-emulator -t "$TT" -e "$COM"
	fi
fi
}


### ROOT CHECK ########################################

##if [ "$(cat /etc/passwd | grep -aE ^$(whoami): | cut -d ':' -f 3 )" -ne 0 ] ; then
#if [ "$(id -u)" -ne 0 ] ; then
#	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"$TITLE must be launched as SuperUser.\n\nCannot continue." $H $W
#	exit 1
#fi
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/trinity/bin

## SuperUser must NOT run this script
## if [ "$(cat /etc/passwd | grep -aE ^$(whoami): | cut -d ':' -f 3 )" -eq 0 ] ; then
#if [ "$(id -u)" -eq 0 ] ; then
#	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"$TITLE must be launched by normal user (not SuperUser)."  $H $W
#	exit 1
#fi


### BASICFUN ########################################

check_exit () {

TAILERRORLOG=$(cat "$ERRORLOG" | grep -aE "[a-zA-Z0-9\=\[]" | tail -n 10 )

echo $(date +%Y-%m-%d_%H:%M:%S)

#if [ "$(cat /etc/passwd | grep -aE ^$(whoami): | cut -d ':' -f 3 )" -eq 0 ] ; then
if [ "$(id -u)" -eq 0 ] && [ "$DEBUG" = "Y" ] ; then
	RECERRORLOG="$ERRORLOG"
	for i in $(cat /etc/passwd | awk -F ':' '{print $3,$1}' | sort -n | grep -aEi "00[0-9] " | awk '{print $2}') ; do AUSER=$(users | sed 's| |\n|g' | grep -aE "^$i$" | head -n 1) ; if [ "$AUSER" != "" ] ; then
		HOMEERRORLOG=/home/$i/.${CNAME}.log
		RECERRORLOG="$RECERRORLOG $HOMEERRORLOG "
		cp -v --remove-destination $ERRORLOG $HOMEERRORLOG
		if [ "$(id -nu $i)" != "" ] ; then chown $(id -nu $i):$(id -ng $i) $HOMEERRORLOG ; else chown 1000:1000 $HOMEERRORLOG ; fi
		chmod 600 $HOMEERRORLOG ; if [ "$(stat -c %U $HOMEERRORLOG)" != "$i" ] ; then chmod 666 $HOMEERRORLOG ; fi
		break
	fi ; done
fi

$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"Stop due to error.\n\n$TAILERRORLOG\n" $H $W

exit 1

}

# "try again or exit" dialog window
input_error () {

echo $(date +%Y-%m-%d_%H:%M:%S)

$DIALOG $WICON $WTITLE "$TITLE" $WYN   $WTEXT $"Something went wrong.\n\nDo you want to try again?" $H $W

if [ "$?" -ne 0 ] ; then
	exit 1
else
	$REFUN
fi

}


### ALREADY RUNNING ########################################

if [ "$CNAME" != "" ] && [ "$(lsof /usr/bin/$CNAME 2>>$ERRORLOG | grep -ai -c $CNAME)" -gt 1 ] ; then

	REPE=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"$CNAME seems to be already working. Having $CNAME working multiple times at the same time may cause problems.\n\nStop them all is recommended.\n\nPlease select an option:" $H $W $LH $COLUMN $COLUMN \
	$"Continue" " " \
	$"Stop now" " " \
	$"Stop them all" " " \
	| head -n 1 )

	if [ "$?" -ne 0 ] || [ "$REPE" = "" ] ; then
		exit 0
	fi

	case $REPE in

		$"Continue" )
			true
		;;

		$"Stop now" )
			exit 0
		;;

		$"Stop them all" )
			clean
			kill $(echo $(ps aux | grep -a "$CNAME" | grep -av 'grep ' | awk '{print $2}'))
		;;

	esac

fi


### WELCOME ########################################

if [ "$WELCOME" != "N" ] ; then

$DIALOG $WICON $WTITLE "$TITLE" $INFO  $WTEXT $"Welcome to $TITLE.\n\n$TITLE is a tool to erase an SD card or USB device, leaving it as a 'clean' SD card or USB device.\n\n$TITLE is libre/free software, licensed according to 'GNU AGPL version 3.0'.\n\nIt is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY.\n\nMore information at www.picalibre.org\n" $H $W

if [ "$?" -ne 0 ] ; then
	exit 0
fi

fi


$DIALOG $WICON $WTITLE "$TITLE" $WYN   $WTEXT $"All the content of the SD card or USB device will be ERASED. Please copy the existing files (documents, photos,...) on the SD card or USB device that you want to keep to another disk before continuing.\n\nDo you want to continue?\nPlease cancel if you don't want to do it! \n" $H $W

if [ "$?" -ne 0 ] ; then
	exit 0
fi


### SEL DEV ########################################

echo "### lsblk ##########"
lsblk -o NAME,KNAME,RM,SIZE,RO,TYPE,FSTYPE,MOUNTPOINT,LABEL,UUID
echo "### blkid ##########"
blkid
echo "### by-id ##########"
ls -l /dev/disk/by-id/
echo "#############"


sel_dopt () {

DOPT=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"The SD card or USB device must be physically plugged to the computer but NOT be mounted (you can do it now before continuing, if it is plugged and mounted $TITLE will try to unmount it).\n\nIf you want you can open the partition manager now.\n" $H $W $LH $COLUMN $COLUMN \
$"Continue" " " \
$"Open the partition manager" " " \
$"Stop now" " " \
| head -n 1 )

if [ "$?" -ne 0 ] || [ "$DOPT" = "" ] ; then
	exit 0
fi

case $DOPT in

	$"Stop now" )
		exit 0
	;;

	$"Continue" )
		true
	;;

	$"Open the partition manager" )
		if [ "$G" = "N" ] ; then
			exec >/dev/tty
			if [ "$(command -v parted)" != "" ] ; then
				parted
			elif [ "$(command -v cfdisk)" != "" ] ; then
				cfdisk
			else
				REFUN=sel_dopt
				input_error ; return
			fi
			if [ "$DEBUG" != "N" ] ; then
				exec > >(tee -a "$ERRORLOG") 2>&1
			fi
		else
			if [ "$(command -v gparted)" != "" ] ; then
				su-to-root -X -c gparted
			elif [ "$(command -v partitionmanager)" != "" ] ; then
				su-to-root -X -c partitionmanager
			elif [ -e /usr/share/applications/gparted.desktop ] ; then
				$(cat /usr/share/applications/gparted.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
			elif [ -e /usr/share/applications/partitionmanager.desktop ] ; then
				$(cat /usr/share/applications/partitionmanager.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
			elif [ -e /usr/share/applications/org.kde.partitionmanager.desktop ] ; then
				$(cat /usr/share/applications/org.kde.partitionmanager.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
			else
				REFUN=sel_dopt
				input_error ; return
			fi
		fi
	;;

esac

}

sel_dopt


check_mounted () {

	if [ "$(command -v pumount)" != "" ] ; then
		lsblk -r -n -o KNAME $DEV | while read i ; do pumount /dev/$i ; done
	fi

	lsblk -r -n -o KNAME $DEV | while read i ; do umount /dev/$i ; done

	MOUNTEST=$(lsblk -r -n -o MOUNTPOINT "$DEV" | grep -aE "[a-zA-Z0-9/]" | head -n 1 )
#	MOUNTEST1=$(cat /etc/mtab | grep -aE "^$DEV" | awk '{print $1}')
#	#MOUNTEST1=$(cat /proc/mounts | grep -aE "^$DEV" | awk '{print $1}')
#
#	for i in $(lsblk -r -n -o UUID $DEV | grep -aE "[a-zA-Z0-9]") ; do
#		MOUNTEST2=$(cat /etc/mtab | grep -a "$i " | awk '{print $1}')
#		if [ "$MOUNTEST2" != "" ] ; then break ; fi
#	done
#
#	for i in $(for j in $(lsblk -r -n -o KNAME $DEV) ; do find -L /dev/disk/ -samefile /dev/$j ; done) ; do
#		MOUNTEST3=$(cat /etc/mtab | grep -aE "^$i " | awk '{print $1}')
#		if [ "$MOUNTEST3" != "" ] ; then break ; fi
#	done
#
#	if [ "$MOUNTEST1" != "" ] || [ "$MOUNTEST2" != "" ] || [ "$MOUNTEST3" != "" ] ; then
	if [ "$MOUNTEST" != "" ] ; then
	
		$DIALOG $WICON $WTITLE $"Device is mounted" $WYN   $WTEXT $"Device $DEV is mounted.\n\nDo you want to select another SD card or USB device?" $H $W
	
		if [ "$?" -eq 0 ] ; then
			selector
		else
			exit 1
		fi
		
	fi

}


check_fstab () {

	FSTABTEST1=$(cat /etc/fstab | grep -aEiv "^#" | grep -aE "^$DEV" | awk '{print $1}')

	for i in $(lsblk -r -n -o UUID $DEV | grep -aE "[a-zA-Z0-9]") ; do
		FSTABTEST2=$(cat /etc/fstab | grep -aEiv "^#" | grep -a "$i " | awk '{print $1}')
		if [ "$FSTABTEST2" != "" ] ; then break ; fi
	done

	for i in $(for j in $(lsblk -r -n -o KNAME $DEV) ; do find -L /dev/disk/ -samefile /dev/$j ; done) ; do
		FSTABTEST3=$(cat /etc/fstab | grep -aEiv "^#" | grep -aE "^$i " | awk '{print $1}')
		if [ "$FSTABTEST3" != "" ] ; then break ; fi
	done

	if [ "$FSTABTEST1" != "" ] || [ "$FSTABTEST2" != "" ] || [ "$FSTABTEST3" != "" ] ; then
	
		$DIALOG $WICON $WTITLE $"$DEV in /etc/fstab" $WYN   $WTEXT $"$DEV seems to be configured in /etc/fstab.\n\nDo you want to select another SD card or USB device?" $H $W
	
		if [ "$?" -eq 0 ] ; then
			selector
		else
			exit 1
		fi
		
	fi

}


# Some removable devices are incorrectly identified as non-removable.
selectorall () {

DEVLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE | grep -aEi ' disk' | awk '{print $1"\t"$3}' | sort -u )
DEVLISTEXTRAINFO=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE | grep -aEi ' disk' | while read i ; do KNINFO=$(echo "$i" | awk '{print $1}' | sed "s|sd.*|&\t|g"); RM=$(echo "$i" | awk '{print $2}') ; if [ "$RM" -eq 0 ] ; then RMINFO="I" ; elif [ "$RM" -eq 1 ] ; then RMINFO="E" ; else RMINFO=" " ; fi ; SINFO=$(echo "$i" | awk '{print $3}'); DT=$(cat /var/log/syslog | grep -a $KNINFO | tail -n 1 ) ; if [ "$DT" != "" ] ; then TINFO=$(echo $DT | awk '{if ($1 ~ /^20/) print $1 ; else print $3,"h" }') ; fi ; printf "$KNINFO\t$RMINFO\t$SINFO\t$TINFO\n" ; done)

if [ "$(echo "$DEVLISTEXTRAINFO" | grep -a -c ^)" -gt 10 ] ; then
	DEVLISTEXTRAINFO=""
fi

if [ "$DEVLISTSIZE" = "" ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"No device detected.\n\nCannot continue." $H $W
	check_exit
fi

unset PREDEV DEV

PREDEV=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"Detected devices:\n\n$DEVLISTEXTRAINFO \n\n(1 GB = 1000 MB; 1 GiB = 1024 MiB)\n\nPlease select the device:" $H $W $LH $COLUMN $COLUMN $DEVLISTSIZE | head -n 1 )

	if [ "$?" -ne 0 ] || [ "$PREDEV" = "" ] ; then
		exit 0
	fi

}


selector () {

DEVLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE | grep -aEi " 1 |^mmc" | grep -aEi ' disk' | awk '{print $1"\t"$3}' | sort -u )
DEVLISTEXTRAINFO=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE | grep -aEi " 1 |^mmc" | grep -aEi ' disk' | while read i ; do KNINFO=$(echo "$i" | awk '{print $1}' | sed "s|sd.*|&\t|g"); RM=$(echo "$i" | awk '{print $2}') ; if [ "$RM" -eq 0 ] ; then RMINFO="I" ; elif [ "$RM" -eq 1 ] ; then RMINFO="E" ; else RMINFO=" " ; fi ; SINFO=$(echo "$i" | awk '{print $3}'); DT=$(cat /var/log/syslog | grep -a $KNINFO | tail -n 1 ) ; if [ "$DT" != "" ] ; then TINFO=$(echo $DT | awk '{if ($1 ~ /^20/) print $1 ; else print $3,"h" }') ; fi ; printf "$KNINFO\t$RMINFO\t$SINFO\t$TINFO\n" ; done)

if [ "$(echo "$DEVLISTEXTRAINFO" | grep -a -c ^)" -gt 10 ] ; then
	DEVLISTEXTRAINFO=""
fi

#if [ "$DEVLISTSIZE" = "" ] ; then
#	REFUN=selector
#	input_error ; return
#fi

ALLDEVS=$"List all devices (only for experts)"

unset PREDEV DEV

PREDEV=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"Detected SD cards and USB devices:\n\n$DEVLISTEXTRAINFO \n\n(1 GB = 1000 MB; 1 GiB = 1024 MiB)\n\nPlease select the device:" $H $W $LH $COLUMN $COLUMN $DEVLISTSIZE "$ALLDEVS" " " | head -n 1 )

	if [ "$?" -ne 0 ] || [ "$PREDEV" = "" ] ; then
		exit 0
	fi

	if [ "$PREDEV" = "$ALLDEVS" ] ; then
		selectorall
	fi

if [ ! -e "/dev/$PREDEV" ] ; then
	REFUN=selector
	input_error ; return
fi

DEV=$(echo "/dev/$PREDEV")
DEVID=$(find -L /dev/disk/by-id/ -samefile $DEV | sort | tail -n 1 )

#check_space
check_mounted
check_fstab

echo "DEV=$DEV"
echo "DEVID=$DEVID"

}

selector


#if [ ! -e "$DEV" ] ; then
if [ ! -e "$DEV" ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The device $DEV ($DEVID) does not exist." $H $W
	check_exit
fi


### ERASING AND PARTITIONING ########################################

DEVSIZEB=$(lsblk -r -n -b -o SIZE $DEV | head -n 1 )
DEVSIZEM=$(expr $DEVSIZEB / 1024 / 1024 )
DEVSIZE=$(lsblk -r -n -o SIZE $DEV | head -n 1 )
DEVMINMIN=$(expr $DEVSIZEM / 8 / 60)
DEVMINMAX=$(expr $DEVSIZEM / 2 / 60)

VOPT=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"Please select an option:\n\n'Complete' will take approximately $DEVMINMIN to $DEVMINMAX minutes.\n\n'Fast' will take a few minutes and is usually sufficient in most cases.\n\nImportant note: A broken or damaged USB device can make $TITLE hang and never end. If this occurs, reboot the computer and discard the USB device.\n" $H $W $LH $COLUMN $COLUMN \
$"Fast" " " \
$"Complete" " " \
$"Stop now" " " \
| head -n 1 )

if [ "$?" -ne 0 ] || [ "$VOPT" = "" ] || [ "$VOPT" = $"Stop now" ] ; then
	exit 0
fi

$DIALOG $WICON $WTITLE "$TITLE" $QYN   $WTEXT $"The erasing of $DEV ($DEVSIZE) ($DEVID) will start if you continue. All existing content in this device will be ERASED.\n\nDo you want to continue?\nPlease cancel if you don't want to do it! \n" $H $W

if [ "$?" -ne 0 ] ; then
	exit 0
fi


check_format () {

	if [ "$(command -v parted)" != "" ] ; then
		PARTFAT=$(parted -s $DEV print | grep -aEi "[0-9]" | awk '{print $1,$6}' | grep -aEi " fat| vfat| exfat| ntfs" | tail -n 1 | awk '{print $1}' )
	else
		PARTFAT=$(lsblk -r -n -o KNAME,RM,FSTYPE $DEV | grep -aEi " fat| vfat| exfat| ntfs" | tail -n 1 | awk '{print $1}' )
	fi
	
	if [ "$PARTFAT" = "" ] ; then
		
		$DIALOG $WICON $WTITLE "$TITLE" $WYN   $WTEXT $"There is no partition formatted in FAT32 (or NTFS) as file system.\n\nDo you want to open the partition manager?\n" $H $W

		if [ "$?" -eq 0 ] ; then
			NOAUTOPARTED="Y"
			format ; return
		else
			true
		fi

	fi

}


format () {

	$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
	PIDDIALOGZ=$( echo $! )

for n in {1..9} ; do wipefs -f -a $DEV ; done

if [ "$VOPT" = $"Fast" ] ; then
dd if=/dev/zero of=$DEV oflag=sync bs=1M count=10
	kill $PIDDIALOGZ 2>/dev/null
elif [ "$VOPT" = $"Complete" ] ; then
	kill $PIDDIALOGZ 2>/dev/null
TT=$"Please wait..." ; COM="dd if=/dev/zero of=$DEV oflag=sync bs=1M status=progress" ; TERMINAL
#echo "dd if=/dev/zero of=$DEV oflag=sync bs=1M status=progress" > /tmp/pica-ie-rev ; chmod +x /tmp/pica-ie-rev ; TT=$"Please wait..." ; COM="bash /tmp/pica-ie-rev" ; TERMINAL ; rm -f /tmp/pica-ie-rev
else
	kill $PIDDIALOGZ 2>/dev/null
check_exit
fi

		$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
		PIDDIALOGSS=$( echo $! )
sync
blockdev --rereadpt $DEV
partprobe $DEV
REPET=0 ; while [ "$(lsblk -r -n $DEV )" = "" ] && [ "$REPET" -lt 120 ] ; do REPET=$(expr $REPET + 1) ; sleep 1 ; done
#sleep 30
		kill $PIDDIALOGSS 2>/dev/null

if [ "$(command -v parted)" != "" ] && [ "$NOAUTOPARTED" = "" ] ; then

		$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
		PIDDIALOGAUTOPART=$( echo $! )
	parted -s $DEV print
	parted -s $DEV unit B print
	# A new partition table (msdos for compatibility)
	printf "Yes\n" | parted -s $DEV mklabel msdos
	# A new partition
	printf "Y\nI\n" | parted -s -a optimal $DEV mkpart primary fat32 0G 100%
	blockdev --rereadpt $DEV
	partprobe $DEV
	REPET=0 ; while [ "$(lsblk -r -n $DEV )" = "" ] && [ "$REPET" -lt 120 ] ; do REPET=$(expr $REPET + 1) ; sleep 1 ; done
	mkfs.vfat -F 32 ${DEV}1
	dosfslabel ${DEV}1 "PICALIBRE"
		kill $PIDDIALOGAUTOPART 2>/dev/null

elif [ "$(command -v sfdisk)" != "" ] && [ "$NOAUTOPARTED" = "" ] ; then

		$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
		PIDDIALOGAUTOPART=$( echo $! )
	sfdisk -l $DEV
	# A new partition table (msdos for compatibility)
	echo "label: dos" | sfdisk $DEV
	# A new partition
	echo " - + - - " | sfdisk $DEV
	blockdev --rereadpt $DEV
	partprobe $DEV
	REPET=0 ; while [ "$(lsblk -r -n $DEV )" = "" ] && [ "$REPET" -lt 120 ] ; do REPET=$(expr $REPET + 1) ; sleep 1 ; done
	mkfs.vfat -F 32 ${DEV}1
	dosfslabel ${DEV}1 "PICALIBRE"
		kill $PIDDIALOGAUTOPART 2>/dev/null

else

	$DIALOG $WICON $WTITLE "$TITLE" $INFO  $WTEXT $"The partition manager will open now. Please select the SD card or USB device '$DEV' which will appear as 'unallocated' space, create a new partition and format it in FAT32 as file system. Do not forget to click 'Apply' and close the partition manager once it finishes." $H $W
	
		if [ "$G" = "N" ] ; then
			exec >/dev/tty
			if [ "$(command -v parted)" != "" ] ; then
				parted
			elif [ "$(command -v cfdisk)" != "" ] ; then
				cfdisk
			else
				REFUN=format
				input_error ; return
			fi
			if [ "$DEBUG" != "N" ] ; then
				exec > >(tee -a "$ERRORLOG") 2>&1
			fi
		else
			if [ "$(command -v gparted)" != "" ] ; then
				su-to-root -X -c gparted
			elif [ "$(command -v partitionmanager)" != "" ] ; then
				su-to-root -X -c partitionmanager
			elif [ -e /usr/share/applications/gparted.desktop ] ; then
				$(cat /usr/share/applications/gparted.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
			elif [ -e /usr/share/applications/partitionmanager.desktop ] ; then
				$(cat /usr/share/applications/partitionmanager.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
			elif [ -e /usr/share/applications/org.kde.partitionmanager.desktop ] ; then
				$(cat /usr/share/applications/org.kde.partitionmanager.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
			else
				REFUN=format
				input_error ; return
			fi
		fi
	
fi

check_format

}

format


### END ########################################

$DIALOG $WICON $WTITLE "$TITLE" $INFO  $WTEXT $"$TITLE finished. Device ready.\n\nThank you very much for using PicaLibre. Visit the website www.picalibre.org for more information.\n" $H $W

echo $(date +%Y-%m-%d_%H:%M:%S) $"End" >> "$ERRORLOG"

#if [ "$(cat /etc/passwd | grep -aE ^$(whoami): | cut -d ':' -f 3 )" -eq 0 ] ; then
if [ "$(id -u)" -eq 0 ] && [ "$DEBUG" = "Y" ] ; then
	RECERRORLOG="$ERRORLOG"
	for i in $(cat /etc/passwd | awk -F ':' '{print $3,$1}' | sort -n | grep -aEi "00[0-9] " | awk '{print $2}') ; do AUSER=$(users | sed 's| |\n|g' | grep -aE "^$i$" | head -n 1) ; if [ "$AUSER" != "" ] ; then
		HOMEERRORLOG=/home/$i/.${CNAME}.log
		RECERRORLOG="$RECERRORLOG $HOMEERRORLOG "
		cp -v --remove-destination $ERRORLOG $HOMEERRORLOG
		if [ "$(id -nu $i)" != "" ] ; then chown $(id -nu $i):$(id -ng $i) $HOMEERRORLOG ; else chown 1000:1000 $HOMEERRORLOG ; fi
		chmod 600 $HOMEERRORLOG ; if [ "$(stat -c %U $HOMEERRORLOG)" != "$i" ] ; then chmod 666 $HOMEERRORLOG ; fi
		break
	fi ; done
fi

exit 0
