#! /bin/bash
#
Encoding=UTF-8

#############################################################################
#																			#
# Author D.M-Wilhelm aka Leiche <kellerleicheorig@aol.com> at Oct 29 2017	#
# Website <kellerleiche.bplaced.net> 										#
# Designed for PCLinuxOS'17 												#
# Release 2017-2023  														#
# License GPL2																#
# Co Writer Ken <lxgator at gmail.com>	at Mar 25 2020						#
# - add using polkit instead of gksu										#
#############################################################################
				

# i18n - Internationalization - Internationalisierung
export TEXTDOMAIN=mygrub-editor
export TEXTDOMAINDIR="/usr/share/locale"

# run as root 
script_dir="$( cd "$( dirname "$0" )" && pwd )"
script="`basename $0`"
script_path_n_name="${script_dir}/${script}"
GUI_SU="pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY"
if [ "$UID" != "0" ]; then
$GUI_SU bash $script_path_n_name; exit;
fi

# remove old tmp dir
if test -d /tmp/defaultGRUBeditor ; then
rmdir /tmp/defaultGRUBeditor
fi
# create tmp dir
if ! test -d /tmp/mygrub-editor ; then
mkdir -p /tmp/mygrub-editor
fi
# to get the default grub file
cp /etc/default/grub /tmp/mygrub-editor/grub.cfg

# some variables
TITLE=$"MyGrub-Editor"
OLDTITLE="mygrub-editor"
WICON="$OLDTITLE"
TMP_DIR="/tmp/mygrub-editor"

#
if [ `cat /etc/default/grub | grep -c "GRUB_CMDLINE_LINUX_DEFAULT"` == 1 ]; then
	GRUB_CMDLINE_LINUX_DEFAULT=`cat /etc/default/grub | grep "GRUB_CMDLINE_LINUX_DEFAULT" | cut -d = -f2-10`
	GRB_CMD='<vbox><entry editable="true"><variable>GRUB_CMDLINE_LINUX_DEFAULT1</variable><default>'$GRUB_CMDLINE_LINUX_DEFAULT'</default></entry></vbox>'
	else
	echo "mygrub-editor: missing grub cmdline linux default"
fi	
#
if [ `cat /etc/default/grub | grep -c "GRUB_DISABLE_OS_PROBER"` == 1 ]; then
	GRUB_DISABLE_OS_PROBER=`cat /etc/default/grub | grep "GRUB_DISABLE_OS_PROBER" | cut -d = -f2`
	GRB_DSB='<hbox><text><label>GRUB_DISABLE_OS_PROBER:</label></text><entry><variable>GRUB_DISABLE_OS_PROBER1</variable><default>'$GRUB_DISABLE_OS_PROBER'</default></entry></hbox>'
	else
	echo "mygrub-editor: missing grub disable os prober"
fi	
#
if [ `cat /etc/default/grub | grep -c "GRUB_DISABLE_RECOVERY"` == 1 ]; then
	GRUB_DISABLE_RECOVERY=`cat /etc/default/grub | grep "GRUB_DISABLE_RECOVERY" | cut -d = -f2`
	GRB_RCV='<hbox><text><label>GRUB_DISABLE_RECOVERY:</label></text><entry><variable>GRUB_DISABLE_RECOVERY1</variable><default>'$GRUB_DISABLE_RECOVERY'</default></entry></hbox>'
	else
	echo "mygrub-editor: missing grub disable recovery"
fi	
#
if [ `cat /etc/default/grub | grep -c "GRUB_TERMINAL_OUTPUT"` == 1 ]; then
	GRUB_TERMINAL_OUTPUT=`cat /etc/default/grub | grep "GRUB_TERMINAL_OUTPUT" | cut -d = -f2`
	GRB_TMN='<hbox><text><label>GRUB_TERMINAL_OUTPUT:</label></text><entry><variable>GRUB_TERMINAL_OUTPUT1</variable><default>'$GRUB_TERMINAL_OUTPUT'</default></entry></hbox>	'
	else
	echo "mygrub-editor: missing grub terminal output"
fi	
#
if [ `cat /etc/default/grub | grep -c "GRUB_DISABLE_SUBMENU"` == 1 ]; then
	GRUB_DISABLE_SUBMENU=`cat /etc/default/grub | grep "GRUB_DISABLE_SUBMENU" | cut -d = -f2`
	GRB_SBM='<hbox><text><label>GRUB_DISABLE_SUBMENU:</label></text><entry><variable>GRUB_DISABLE_SUBMENU1</variable><default>'$GRUB_DISABLE_SUBMENU'</default></entry></hbox>'
	else
	echo "mygrub-editor: missing grub disable submenu"
fi	
#
if [ `cat /etc/default/grub | grep -c "GRUB_DISTRIBUTOR"` == 1 ]; then
	GRUB_DISTRIBUTOR=`cat /etc/default/grub | grep "GRUB_DISTRIBUTOR" | cut -d = -f2`
	GRB_DST='<hbox><text><label>GRUB_DISTRIBUTOR:</label></text><entry><variable>GRUB_DISTRIBUTOR1</variable><default>'$GRUB_DISTRIBUTOR'</default></entry></hbox>'
	else
	echo "mygrub-editor: missing grub distributor"
fi
#
if [ `cat /etc/default/grub | grep -c "GRUB_GFXMODE"` == 1 ]; then
	GRUB_GFXMODE=`cat /etc/default/grub | grep "GRUB_GFXMODE" | cut -d = -f2`
	GRB_GFX='<hbox><text><label>GRUB_GFXMODE:</label></text><entry><variable>GRUB_GFXMODE1</variable><default>'$GRUB_GFXMODE'</default></entry></hbox>'
	else
	echo "mygrub-editor: missing grub gfxmode"
fi
#
if [ `cat /etc/default/grub | grep -c "GRUB_GFXPAYLOAD_LINUX"` == 1 ]; then
	GRUB_GFXPAYLOAD_LINUX=`cat /etc/default/grub | grep "GRUB_GFXPAYLOAD_LINUX" | cut -d = -f2`
	GRB_GFP='<hbox><text><label>GRUB_GFXPAYLOAD_LINUX:</label></text><entry><variable>GRUB_GFXPAYLOAD_LINUX1</variable><default>'$GRUB_GFXPAYLOAD_LINUX'</default></entry></hbox>'
	else
	echo "mygrub-editor: missing grub gfxpayload linux"
fi	
#
if [ `cat /etc/default/grub | grep -c "GRUB_TIMEOUT"` == 1 ]; then
	GRUB_TIMEOUT=`cat /etc/default/grub | grep "GRUB_TIMEOUT" | cut -d = -f2`
	GRB_TMT='<hbox><text><label>GRUB_TIMEOUT:</label></text><entry><variable>GRUB_TIMEOUT1</variable><default>'$GRUB_TIMEOUT'</default></entry></hbox>'
	else
	echo "mygrub-editor: missing grub timeout"
fi	
#
if [ `cat /etc/default/grub | grep -c "GRUB_THEME"` == 1 ]; then
	GRUB_THEME=`cat /etc/default/grub | grep "GRUB_THEME" | cut -d = -f2`
	GRB_THM='<hbox><text><label>GRUB_THEME:</label></text><entry><variable>GRUB_THEME1</variable><default>'$GRUB_THEME'</default></entry></hbox>'
	else
	echo "mygrub-editor: missing grub theme"
fi	
#
if [ `cat /etc/default/grub | grep -c "GRUB_DEFAULT"` == 1 ]; then
	GRUB_DEFAULT=`cat /etc/default/grub | grep "GRUB_DEFAULT" | cut -d = -f2`
	GRB_DFL='<hbox><text><label>GRUB_DEFAULT:</label></text><entry><variable>GRUB_DEFAULT1</variable><default>'$GRUB_DEFAULT'</default></entry></hbox>'
	else
	echo "mygrub-editor: missing grub default"
fi	
#
if [ `cat /etc/default/grub | grep -c "GRUB_SAVEDEFAULT"` == 1 ]; then
	GRUB_SAVEDEFAULT=`cat /etc/default/grub | grep "GRUB_SAVEDEFAULT" | cut -d = -f2`
	GRB_SVD='<hbox><text><label>GRUB_SAVEDEFAULT:</label></text><entry><variable>GRUB_SAVEDEFAULT1</variable><default>'$GRUB_SAVEDEFAULT'</default></entry></hbox>'
	else
	echo "mygrub-editor: missing grub savedefault"
fi	
###############################################################################

# what is it
export WHAT='
<window window_position="1" width-request="500" height-request="400" allow-shrink="true" title="'$OLDTITLE'"  icon-name="'$WICON'">
	<vbox>
		<vbox scrollable="true" >
			<frame>
				<text use-markup="True">
				<label>"'$"MyGrub-Editor

edit the default grub config file.


 Designed for PCLinuxOS
 Author:	 	Daniel Meiß-Wilhelm
 Co Writer:  	Ken (lxgator at gmail.com)
 Website: 	 	www.pclinuxos.com/forum
 Release: 	 	2017-2023
 License: 	 	GPL2 
 
"'"</label>
			</text>
			</frame>		
		</vbox>
		<hbox><vbox>	 
			<button>
				<label>OK</label>
				<variable>WHAT</variable>
				<action type="closewindow">WHAT</action>
			</button>
		</vbox></hbox>
	</vbox>			
</window>
'	
# about grub/help
export ABOUT='
<window window_position="1" width-request="500" height-request="400" allow-shrink="true" title="'$OLDTITLE'"  icon-name="'$WICON'">
	<vbox>
		<vbox scrollable="true"  width="600" >
			<frame>
				<notebook labels="'$"Grub2-EN|Grub2-DE"'" space-fill="true">
					<vbox>
						<text use-markup="true">
							<input file>/usr/share/doc/'$OLDTITLE'/grub2_read.txt</input>
						</text>
					</vbox>
					<vbox>	
						<text use-markup="true">
							<input file>/usr/share/doc/'$OLDTITLE'/grub2_lesen.txt</input>
						</text>
					</vbox>
				</notebook>	
			</frame>		
		</vbox>
		<hbox><vbox>	 
			<button>
				<label>OK</label>
				<variable>ABOUT</variable>
				<action type="closewindow">ABOUT</action>
			</button>
		</vbox></hbox>
	</vbox>			
</window>
'	
# changelog
export CHANGELOG='
<window window_position="1" width-request="500" height-request="400" allow-shrink="true" title="'$OLDTITLE'"  icon-name="'$WICON'">
	<vbox>
		<vbox scrollable="true"  width="600" >
			<text use-markup="false">
				<input file>/usr/share/doc/'$OLDTITLE'/Changelog</input>
			</text>
		</vbox>			
		<hbox><vbox>	 
			<button>
				<label>OK</label>
					<variable>CHANGELOG</variable>
					<action type="closewindow">CHANGELOG</action>
			</button>
		</vbox></hbox>		
	</vbox>
</window>
'	

# grub file from /etc/default
export CONF='
<window window_position="1" width-request="600"  title="'$OLDTITLE'"  icon-name="'$WICON'">
	<vbox wrap-mode="1">
		<frame>
			<text use-markup="true" xalign="0" wrap-mode="0">
				<input file>/etc/default/grub</input>
			</text>
		</frame>	
		<vbox><hbox>  
			<button>
				<label>OK</label>
				<variable>CONF</variable>
				<action type="closewindow">CONF</action>
			</button>
		</hbox></vbox>
	</vbox>		
</window>
'

# info display
export INFO='
<window window_position="1" width-request="600"  title="'$OLDTITLE'"  icon-name="'$WICON'">
	<vbox wrap-mode="1">
		<frame>
			<text use-markup="true" xalign="0" wrap-mode="0"><label>'$"All settings are done... Program will now closed."'</label></text>
			<text use-markup="true" xalign="0" wrap-mode="0"><label>'$"If you want to check the settings, restart the application."'</label></text>
		</frame>	
		<vbox><hbox>  
			<button>
				<label>OK</label>
				<variable>INFO</variable>
				<action type="closewindow">INFO</action>
				<action type="closewindow">CHANGE</action>
			</button>
		</hbox></vbox>
	</vbox>		
</window>
'
function do_settings () {
	export CHANGE='
<window title=" '$TITLE' " window_position="1" resizable="false"  icon-name="'$WICON'">
	<vbox>
		<frame '$"Log"'>
			<vbox scrollable="true" width="600" height="300">
				<text><input file>'$TMP_DIR'/grub.log</input></text> 
				<variable>CHANGE</variable>
			</vbox>
		</frame>
		<hbox>
			<button>
				<label>'$"Run"'</label>
				<action>bash -c echo ''mv /etc/default/grub /etc/default/grub.bak ; mv '$TMP_DIR'/grub.cfg /etc/default/grub; chown -R root:root /etc/default/grub ; xterm -e update-grub''</action>
				<action type="launch">INFO</action>
			</button>
			<button>
				<label>'$"Exit"'</label>
				<action type="closewindow">CHANGE</action>
			</button>
		</hbox>
	</vbox>
</window>
'
export GUI="`echo "$CHANGE" | sed -e 's/##.*//'`" 
gtkdialog -p GUI
}

export MAIN='
<window window_position="1" title="'$TITLE'" resizable="false"  width-request="700"  icon-name="'$WICON'">
	<vbox>
		<menubar>
			<menu use-underline="true">
				<menuitem stock-id="gtk-quit" accel-key="0x51" accel-mods="4">
					<action>exit:Quit</action>
				</menuitem>
				<label>'$"_File"'</label>
			</menu>
			<menu>
				<menuitem icon-name="gtk-preferences"> 
					<label>'$"Grubfile"'</label>
					<action type="launch">CONF</action>
				</menuitem> 
				<label>'$"Edit"'</label>
			</menu>
			<menu>
				<menuitem>
					<label>'$"Info"'</label>
					<action type="launch">WHAT</action>
				</menuitem>
				<menuitem>
					<label>'$"About Grub"'</label>
					<action type="launch">ABOUT</action>
				</menuitem>
				<menuitem>
					<label>'$"Changelog"'</label>
					<action type="launch">CHANGELOG</action>
				</menuitem>
					<label>'$"Help"'</label>
			</menu>
		</menubar>	
		<frame Editor>
			<vbox>
				<entry has-frame="false" editable="false" text="GRUB_CMDLINE_LINUX_DEFAULT:">
				</entry>
			</vbox>
			'$GRB_CMD'
			'$GRB_DSB'
			'$GRB_RCV'
			'$GRB_TMN'
			'$GRB_SBM'	
			'$GRB_DST'	
			'$GRB_GFX'
			'$GRB_GFP'
			'$GRB_TMT'
			'$GRB_THM'
			'$GRB_DFL'
			'$GRB_SVD'
		</frame>		
		<hbox>
			<vbox tooltip-text="'$"If You want only update the grub file."'">
				<button>
					<label>'$"Update GRUB"'</label>
					<action>xterm -e update-grub</action>
					<action type="launch">INFO</action>
				</button>
			</vbox>	
			<button>
				<label>'$"Save"'</label>
				<action type="exit">save</action>
			</button>
			<button>
				<label>'$"Exit"'</label>
				<action type="exit">cancel</action>
			</button>
		</hbox>
	</vbox>
</window>
'
#

#------------------------------------------------------------------------
{
I=$IFS; IFS=""
for STATEMENT in  $(gtkdialog --center --program=MAIN); do
	eval $STATEMENT
done
IFS=$I
	
	
# Process variables if dialog exit status == save
if [ "$EXIT" == "save" ];then
GRUB_CMDLINE_LINUX_DEFAULT2=`echo $GRUB_CMDLINE_LINUX_DEFAULT1 | sed 's/^/"/;s/$/"/'`
if [ ! "$GRUB_CMDLINE_LINUX_DEFAULT" == "$GRUB_CMDLINE_LINUX_DEFAULT2" ]; then	
	sed -i '/GRUB_CMDLINE_LINUX_DEFAULT/d' $TMP_DIR/grub.cfg
	sed -i -e 1c"GRUB_CMDLINE_LINUX_DEFAULT=$GRUB_CMDLINE_LINUX_DEFAULT2" $TMP_DIR/grub.cfg
	echo $"changed GRUB_CMDLINE_LINUX_DEFAULT $GRUB_CMDLINE_LINUX_DEFAULT to $GRUB_CMDLINE_LINUX_DEFAULT2" > $TMP_DIR/grub.log
fi

if [ ! $GRUB_DISABLE_OS_PROBER == $GRUB_DISABLE_OS_PROBER1 ]; then	
	sed -i "s/GRUB_DISABLE_OS_PROBER=$GRUB_DISABLE_OS_PROBER/GRUB_DISABLE_OS_PROBER=$GRUB_DISABLE_OS_PROBER1/" $TMP_DIR/grub.cfg
	echo $"changed GRUB_DISABLE_OS_PROBER $GRUB_DISABLE_OS_PROBER to $GRUB_DISABLE_OS_PROBER1" >> $TMP_DIR/grub.log
fi

if [ ! $GRUB_DISABLE_RECOVERY == $GRUB_DISABLE_RECOVERY1 ]; then	
	sed -i "s/GRUB_DISABLE_RECOVERY=$GRUB_DISABLE_RECOVERY/GRUB_DISABLE_RECOVERY=$GRUB_DISABLE_RECOVERY1/" $TMP_DIR/grub.cfg
	echo $"GRUB_DISABLE_RECOVERY $GRUB_DISABLE_RECOVERY to $GRUB_DISABLE_RECOVERY1" >> $TMP_DIR/grub.log
fi
	
if [ ! $GRUB_TERMINAL_OUTPUT == $GRUB_TERMINAL_OUTPUT1 ]; then	
	sed -i "s/GRUB_TERMINAL_OUTPUT=$GRUB_TERMINAL_OUTPUT/GRUB_TERMINAL_OUTPUT=$GRUB_TERMINAL_OUTPUT1/" $TMP_DIR/grub.cfg
	echo $"changed GRUB_TERMINAL_OUTPUT $GRUB_TERMINAL_OUTPUT to $GRUB_TERMINAL_OUTPUT1" >> $TMP_DIR/grub.log
fi
	
if [ ! $GRUB_DISABLE_SUBMENU == $GRUB_DISABLE_SUBMENU1 ]; then	
	sed -i "s/GRUB_DISABLE_SUBMENU=$GRUB_DISABLE_SUBMENU/GRUB_DISABLE_SUBMENU=$GRUB_DISABLE_SUBMENU1/" $TMP_DIR/grub.cfg
	echo $"changed GRUB_DISABLE_SUBMENU $GRUB_DISABLE_SUBMENU to $GRUB_DISABLE_SUBMENU1" >> $TMP_DIR/grub.log
fi

if [ ! $GRUB_DISTRIBUTOR == $GRUB_DISTRIBUTOR1 ]; then	
	sed -i "s/GRUB_DISTRIBUTOR=$GRUB_DISTRIBUTOR/GRUB_DISTRIBUTOR=$GRUB_DISTRIBUTOR1/" $TMP_DIR/grub.cfg
	echo $"changed GRUB_DISTRIBUTOR $GRUB_DISTRIBUTOR to $GRUB_DISTRIBUTOR1" >> $TMP_DIR/grub.log
fi

if [ ! $GRUB_GFXMODE == $GRUB_GFXMODE1 ]; then	
	sed -i "s/GRUB_GFXMODE=$GRUB_GFXMODE/GRUB_GFXMODE=$GRUB_GFXMODE1/" $TMP_DIR/grub.cfg
	echo $"changed GRUB_GFXMODE $GRUB_GFXMODE to $GRUB_GFXMODE1" >> $TMP_DIR/grub.log
fi

if [ ! $GRUB_GFXPAYLOAD_LINUX == $GRUB_GFXPAYLOAD_LINUX1 ]; then	
	sed -i "s/GRUB_GFXPAYLOAD_LINUX=$GRUB_GFXPAYLOAD_LINUX/GRUB_GFXPAYLOAD_LINUX=$GRUB_GFXPAYLOAD_LINUX1/" $TMP_DIR/grub.cfg
	echo $"changed GRUB_GFXPAYLOAD_LINUX $GRUB_GFXPAYLOAD_LINUX to $GRUB_GFXPAYLOAD_LINUX1" >> $TMP_DIR/grub.log
fi

if [ ! $GRUB_TIMEOUT == $GRUB_TIMEOUT1 ]; then	
	sed -i "s/GRUB_TIMEOUT=$GRUB_TIMEOUT/GRUB_TIMEOUT=$GRUB_TIMEOUT1/" $TMP_DIR/grub.cfg
	echo $"changed GRUB_TIMEOUT $GRUB_TIMEOUT to $GRUB_TIMEOUT1" >> $TMP_DIR/grub.log
fi

if [ ! $GRUB_THEME == $GRUB_THEME1 ]; then	
	sed -i "s/GRUB_THEME=$GRUB_THEME/GRUB_THEME=$GRUB_THEME1/" $TMP_DIR/grub.cfg
	echo $"changed GRUB_THEME $GRUB_THEME to $GRUB_THEME1" >> $TMP_DIR/grub.log
fi

if [ ! $GRUB_DEFAULT == $GRUB_DEFAULT1 ]; then	
	sed -i "s/GRUB_DEFAULT=$GRUB_DEFAULT/GRUB_DEFAULT=$GRUB_DEFAULT1/" $TMP_DIR/grub.cfg
	echo $"changed GRUB_DEFAULT $GRUB_DEFAULT to $GRUB_DEFAULT1" >> $TMP_DIR/grub.log
fi

if [ ! $GRUB_SAVEDEFAULT == $GRUB_SAVEDEFAULT1 ]; then	
	sed -i "s/GRUB_SAVEDEFAULT=$GRUB_SAVEDEFAULT/GRUB_SAVEDEFAULT=$GRUB_SAVEDEFAULT1/" $TMP_DIR/grub.cfg
	echo $"changed GRUB_SAVEDEFAULT5 $GRUB_SAVEDEFAULT to $GRUB_SAVEDEFAULT1" >> $TMP_DIR/grub.log
fi

	do_settings
	else
#do nothing		
	echo mygrub-editor: $"Settings are not changed, exiting!"
fi

}
rm -r $TMP_DIR/grub.cfg > /dev/null 2>&1
rm -r $TMP_DIR/grub.log > /dev/null 2>&1
