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

# picats
#
# Set the time.
#
# 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, debconf, dpkg, gawk | mawk | original-awk, grep, sed, tzdata, util-linux, util-linux (<<2.38-1) | util-linux-extra
# Recommends: lxterminal | sakura | xfce4-terminal, menu, pica-skel, x11-xkb-utils
# Suggests: chrony | ntpsec


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

CNAME="picats"
VERSION="1.3.1"
TITLE="PicaTS"
ICON="/usr/share/icons/picats.png"

# Translations
if [ "$LANG" = "" ] ; then export $(cat /etc/default/locale | grep -a 'LANG=') ; fi
TEXTDOMAIN=picats
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=$"Set the time."
LDESCRIP=$"$TITLE is a tool to set the time."

# 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


### 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
	picats_general
	return 1
else
	$REFUN
fi

}


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

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

$DIALOG $WICON $WTITLE "$TITLE" $INFO  $WTEXT $"Welcome to $TITLE.\n\n$TITLE is a tool to set the time.\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


### CLOCK CHECK ########################################

YMD="$(date +%Y-%m-%d)"
if [ "$(date +%Y)" -lt 2025 ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $WM    $WTEXT $"The clock seems to be in the past: $YMD \nIf it is a computer with a button battery to keep time, then the button battery probably needs to be replaced (if this is not the first time this computer is turned on), to prevent the clock reverting to the past every time the computer loses power." $H $W
fi


### INTERNET TEST ########################################

internet_test () {

ping -c 3 ftp.fau.de 1>/dev/null 2>&1 || ping -c 3 mirrorservice.org 1>/dev/null 2>&1 || ping -c 3 ftp.ch.debian.org 1>/dev/null 2>&1

if [ "$?" -eq 0 ] ; then
	TESTINTERNET="Y"
else
	echo "No PING (no ICMP). Pass-through test..."
	wget http://ftp.fau.de -O /dev/null || wget http://mirrorservice.org -O /dev/null || wget http://ftp.ch.debian.org -O /dev/null
	if [ "$?" -eq 0 ] ; then
		echo "WGET (TCP connections) works. Internet OK."
		TESTINTERNET="Y"
	else
		echo $"No Internet connection."
		TESTINTERNET="N"
	fi
fi

}


### SEL ########################################

s_date () {
DATE=$($DIALOG $WICON $WTITLE "$TITLE" $DATEFORMAT $CALENDAR $WTEXT $"Please select:" $H $W)
	if [ "$?" -ne 0 ] ; then
		picats_general
		return 1
	fi

	if [ "$DATE" = "" ] ; then
		REFUN=s_date
		input_error ; return
	fi
}

s_time () {

if [ "$(echo $DIALOG | awk '{print $1}')" = "dialog" ] ; then

	TIME=$($DIALOG $WICON $WTITLE "$TITLE" $TIMEFORMAT $WTIME $WTEXT $"Please select:" $H $W)

elif [ "$(echo $DIALOG | awk '{print $1}')" = "yad" ] ; then

	TIME=$(echo $($DIALOG $WICON $WTITLE "$TITLE" $TIMEFORMAT $WTIME $WTEXT $"Please select:" $H $W     $FORMCLPRE $"Hour:"${FORMCLPOST} "$(seq -w -s \! 00 23)"     $FORMCLPRE $"Minute:"${FORMCLPOST} "$(seq -w -s \! 00 59)"     $FORMCLPRE $"Second:"${FORMCLPOST} "$(seq -w -s \! 00 59)") | sed 's| |:|g')

elif [ "$(echo $DIALOG | awk '{print $1}')" = "zenity" ] ; then

	TIME=$($DIALOG $WICON $WTITLE "$TITLE" $TIMEFORMAT $WTIME $WTEXT $"Please select:" $H $W     $FORMCLPRE $"Hour:" $FORMCLPOST "$(seq -w -s \| 00 23)"     $FORMCLPRE $"Minute:" $FORMCLPOST "$(seq -w -s \| 00 59)"     $FORMCLPRE $"Second:" $FORMCLPOST "$(seq -w -s \| 00 59)")

else

	TIME=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE  $WTEXT $"Please write the time in 'HH:MM' or 'HH:MM:SS' format, where 'HH' is the hour (0 to 23), 'MM' is the minute (0 to 59) and 'SS' is the second (0 to 59, the second will set to '00' if only 'HH:MM' is specified)." $H $W $PREWRITE "$(date +%H:%M:%S)")

fi

	if [ "$?" -ne 0 ] ; then
		picats_general
		return 1
	fi

	if [ "$TIME" = "" ] ; then
		REFUN=s_time
		input_error ; return
	fi
}


### SCRIPT ########################################

picats_general () {

SYSTIME=$(echo $(date +%F' '%T' '%:z)  \($(date +%A' '%d' '%B' '%Y', '%T' '%:z)\))
HWCLOCK=$(hwclock --show)
# hwclock new --show format since v2.28 (Debian 9 "Stretch") https://mirrors.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes

if [ ! -e "/etc/adjtime" ] ; then
cat > /etc/adjtime <<EOF
0.0 0 0.0
0
LOCAL
EOF
fi

ADJTIME=$(cat /etc/adjtime | grep -aEi "^UTC|^LOCAL")
ADJTIMEINFO=$"('LOCAL' is recommended if more than one operating system with different time settings are installed on the computer, otherwise you can set to 'UTC'. If you change this, it is recommended to reboot next.)"
if   [ "$(echo $ADJTIME | grep -aEi LOCAL )" != "" ] ; then
	ADJTIMETEXT=$"Set the internal clock to UTC"
elif [ "$(echo $ADJTIME | grep -aEi UTC )" != "" ] ; then
	ADJTIMETEXT=$"Set the internal clock to LOCAL"
else
	cat /etc/adjtime
	echo "ADJTIME=$ADJTIME"
fi

if [ -e "/etc/timezone" ] ; then
	CONTINENT=$(cat /etc/timezone | cut -d '/' -f 1 )
	CAPITAL=$(cat /etc/timezone | cut -d '/' -f 2 )
	TZDATAINFO=$"The time zone of the operating system is continent: $CONTINENT, capital: $CAPITAL"
else
	TZDATAINFO=$"Time zone is not set."
fi

NTPINST=$(echo $(dpkg -l | grep -aEi "^ii|^hi" | awk '{print $2}' | sed "s|:.*||g" | grep -aEi "^chrony$|^ntp$|^ntpsec$|^openntpd$"))
if	[ "$NTPINST" = "" ] ; then
	NTPINSTINFO=$"No NTP/NTS package is installed"
elif	[ "$(echo $NTPINST | wc -w)" -eq 1 ] ; then
	NTPINSTINFO=$"$NTPINST is installed"
elif	[ "$(echo $NTPINST | wc -w)" -gt 1 ] ; then
	NTPINSTINFO=$"$NTPINST are installed"
else
	echo "NTPINSTINFO=$NTPINSTINFO"
	check_exit
fi

if [ "$NTPINST" = "" ] ; then
	OPT=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"The operating system time is '$SYSTIME' \n\nThe time of the internal clock is '$HWCLOCK' (expressed in local time) \n\nThe internal clock is set to $ADJTIME $ADJTIMEINFO \n\n$TZDATAINFO\n\n$NTPINSTINFO (NTP/NTS automatically sets the operating system time using the Internet)\n\n\nPlease select an option\n(Note: changes may take a while to be displayed on the desktop clock.)" $H $W $LH $COLUMN $COLUMN \
	$"Set the time zone" " " \
	"$ADJTIMETEXT" " " \
	$"Install NTP/NTS" " " \
	$"Set the operating system time using the Internet" " " \
	$"Set manually the operating system time" " " \
	$"Set manually the time of the internal clock" " " \
	$"Set the time of the internal clock using the operating system time" " " \
	$"Set the operating system time using the time of the internal clock" " " \
	$"Set the operating system time by changing the time zone" " " \
	$"Close" " " \
	| head -n 1 )
else
	OPT=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"The operating system time is '$SYSTIME' \n\nThe time of the internal clock is '$HWCLOCK' (expressed in local time) \n\nThe internal clock is set to $ADJTIME $ADJTIMEINFO \n\n$TZDATAINFO\n\n$NTPINSTINFO (NTP/NTS automatically sets the operating system time using the Internet)\n\n\nPlease select an option\n(Note: changes may take a while to be displayed on the desktop clock.)" $H $W $LH $COLUMN $COLUMN \
	$"Set the time zone" " " \
	"$ADJTIMETEXT" " " \
	$"Set the operating system time using the Internet" " " \
	$"Set manually the operating system time" " " \
	$"Set manually the time of the internal clock" " " \
	$"Set the time of the internal clock using the operating system time" " " \
	$"Set the operating system time using the time of the internal clock" " " \
	$"Set the operating system time by changing the time zone" " " \
	$"Close" " " \
	| head -n 1 )
fi

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

case $OPT in

$"Close" )
	exit 0
;;

$"Set manually the operating system time" )
	OPT=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"You can manually write the time or use a wizard to avoid typing errors:" $H $W $LH $COLUMN $COLUMN $"Manually write the time" " " $"Use a wizard" " " | head -n 1 )

	if [ "$?" -ne 0 ] || [ "$OPT" = "" ] ; then
		picats_general
		return 1
	fi

	case $OPT in

	$"Manually write the time" )
		DATETIME=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"Please write the date/time in 'YYYY-mm-dd HH:MM:SS', 'YYYY-mm-dd HH:MM' or simple 'HH:MM' format, where 'YYYY' is the year, 'mm' is the month (1 to 12), 'dd' is the day (1 to 31), 'HH' is the hour (0 to 23), 'MM' is the minute (0 to 59) and 'SS' is the second (0 to 59, the second will set to '00' if none is specified). If no date (no year, month and day) is specified then only the time will be changed." $H $W $PREWRITE "$(date +%Y-%m-%d' '%H:%M:%S)")
	
		if [ "$?" -ne 0 ] ; then
			picats_general
			return 1
		fi

		if [ "$DATETIME" = "" ] ; then
			picats_general
			return 1
		fi
		
		date --set "$DATETIME"
		
		if [ "$?" -ne 0 ] ; then
			$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"It seems that the date/time was written incorrectly." $H $W
		fi
	
		picats_general
	;;

	$"Use a wizard")
		s_date ; s_time ; DATETIME=$(echo $DATE $TIME)
	
		date --set "$DATETIME"
	
		if [ "$?" -ne 0 ] ; then
			$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"It seems that the date/time was written incorrectly." $H $W
		fi
	
		picats_general
	;;

	* )
		echo "OPT=$OPT"
		picats_general
	;;

	esac
;;

$"Set manually the time of the internal clock" )
	OPT=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"You can manually write the time or use a wizard to avoid typing errors:" $H $W $LH $COLUMN $COLUMN $"Manually write the time" " " $"Use a wizard" " " | head -n 1 )

	if [ "$?" -ne 0 ] || [ "$OPT" = "" ] ; then
		picats_general
		return 1
	fi

	case $OPT in

	$"Manually write the time" )
		DATETIME=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"Please write the date/time in 'YYYY-mm-dd HH:MM:SS', 'YYYY-mm-dd HH:MM' or simple 'HH:MM' format, where 'YYYY' is the year, 'mm' is the month (1 to 12), 'dd' is the day (1 to 31), 'HH' is the hour (0 to 23), 'MM' is the minute (0 to 59) and 'SS' is the second (0 to 59, the second will set to '00' if none is specified). If no date (no year, month and day) is specified then only the time will be changed." $H $W $PREWRITE "$(date +%Y-%m-%d' '%H:%M:%S)")
	
		if [ "$?" -ne 0 ] ; then
			picats_general
			return 1
		fi

		if [ "$DATETIME" = "" ] ; then
			picats_general
			return 1
		fi
	
		hwclock --set --date "$DATETIME"
	
		if [ "$?" -ne 0 ] ; then
			$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"It seems that the date/time was written incorrectly." $H $W
		fi
	
		picats_general
	;;

	$"Use a wizard")
		s_date ; s_time ; DATETIME=$(echo $DATE $TIME)
	
		hwclock --set --date "$DATETIME"
	
		if [ "$?" -ne 0 ] ; then
			$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"It seems that the date/time was written incorrectly." $H $W
		fi
	
		picats_general
	;;

	* )
		echo "OPT=$OPT"
		picats_general
	;;

	esac
;;

$"Set the time of the internal clock using the operating system time" )
	hwclock --systohc
	picats_general
;;

$"Set the operating system time using the time of the internal clock" )
	hwclock --hctosys
	picats_general
;;

$"Set the operating system time by changing the time zone" )
	hwclock --systz
	picats_general
;;

$"Set the time zone" )
	exec >/dev/tty
	TT="$TITLE" ; COM="dpkg-reconfigure tzdata" ; TERMINAL
	if [ "$DEBUG" != "N" ] ; then
		exec > >(tee -a "$ERRORLOG") 2>&1
	fi
	picats_general
;;

$"Set the internal clock to UTC" )
	#cp -av /etc/adjtime /etc/adjtime_$(date +%Y%m%d_%H%M%S)
	sed -i 's|LOCAL|UTC|g' /etc/adjtime
	picats_general
;;

$"Set the internal clock to LOCAL" )
	#cp -av /etc/adjtime /etc/adjtime_$(date +%Y%m%d_%H%M%S)
	sed -i "s|^UTC.*|LOCAL|g" /etc/adjtime
	picats_general
;;

$"Install NTP/NTS" )
	$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
	PIDDIALOGINST=$( echo $! )

	internet_test

	if [ "$TESTINTERNET" = "N" ] ; then
		
		kill $PIDDIALOGINST 2>/dev/null
		$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"No Internet connection." $H $W
		
	else
		
		apt-get update -y
		CHRONYVERS=$(apt-cache madison chrony | grep -aEio " [0-9]" | sort -n | tail -n 1)
		NTPSECVERS=$(apt-cache madison ntpsec | grep -aEio " [0-9].*" | sed "s|+dfsg.*||g" | sed "s|+de.*||g" | sed "s|\.||g" | sort -n | tail -n 1)
		if [ "$CHRONYVERS" -ge 4 ] ; then
			apt-get install --reinstall --no-install-recommends -y -o Dpkg::Options::="--force-confmiss" -o Dpkg::Options::="--force-confnew" chrony
		elif [ "$NTPSECVERS" -ge 114 ] ; then
			apt-get install --reinstall --no-install-recommends -y -o Dpkg::Options::="--force-confmiss" -o Dpkg::Options::="--force-confnew" ntpsec ntpsec-ntpdate
		else
			apt-get install --reinstall --no-install-recommends -y -o Dpkg::Options::="--force-confmiss" -o Dpkg::Options::="--force-confnew" chrony
		fi
		if [ "$(command -v postinst)" != "" ] ; then postinst ; fi

		kill $PIDDIALOGINST 2>/dev/null
	
	fi
	
	picats_general
;;

$"Set the operating system time using the Internet" )
	$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
	PIDDIALOGNTP=$( echo $! )

	internet_test

	if [ "$TESTINTERNET" = "N" ] ; then
		
		kill $PIDDIALOGNTP 2>/dev/null
		$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"No Internet connection." $H $W
		
	else
		
		date --set "$(wget -qSO- --max-redirect=0 ftp.fau.de 2>&1 | sed -n 's|.*Date: ||p')" || date --set "$(wget -qSO- --max-redirect=0 mirrorservice.org 2>&1 | sed -n 's|.*Date: ||p')" || date --set "$(wget -qSO- --max-redirect=0 ftp.ch.debian.org 2>&1 | sed -n 's|.*Date: ||p')"
		if [ "$(command -v chronyc)" != "" ] ; then
			chronyc makestep
		elif [ "$(command -v ntpdate)" != "" ] ; then
			cat /etc/ntpsec/ntp.conf | grep -aEi ^server | awk '{print $2}' | while read i ; do
				ntpdate -b -u $i
				if [ "$?" -eq 0 ] ; then
					break
				fi
			done
		elif [ "$(command -v ntpdig)" != "" ] ; then
			cat /etc/ntpsec/ntp.conf | grep -aEi ^server | awk '{print $2}' | while read i ; do
				ntpdig -S $i
				if [ "$?" -eq 0 ] ; then
					break
				fi
			done
		elif [ "$(command -v sntp)" != "" ] ; then
			cat /etc/ntpsec/ntp.conf | grep -aEi ^server | awk '{print $2}' | while read i ; do
				sntp -S $i
				if [ "$?" -eq 0 ] ; then
					break
				fi
			done
		else
			echo "No NTP"
		fi
		
		kill $PIDDIALOGNTP 2>/dev/null
		
	fi
	
	picats_general
;;

* )
	echo "OPT=$OPT"
	REFUN=picats_general
	input_error ; return
;;

esac

}

picats_general


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

#$DIALOG $WICON $WTITLE "$TITLE" $INFO  $WTEXT $"$TITLE finished.\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
