See whether this works for you.
#!/bin/sh
set -eu
LIGHTDM_CONF="/usr/local/etc/lightdm/lightdm.conf"
LIGHTDM_CONF_DIR="$(dirname "$LIGHTDM_CONF")"
WRAPPER="/usr/local/libexec/lightdm-slick-greeter-tz"
BACKUP_SUFFIX="$(date +%Y%m%d%H%M%S).bak"
find_slick_greeter() {
for path in \
/usr/local/sbin/slick-greeter \
/usr/local/bin/slick-greeter \
/usr/sbin/slick-greeter \
/usr/bin/slick-greeter
do
if [ -x "$path" ]; then
printf '%s\n' "$path"
return 0
fi
done
if command -v slick-greeter >/dev/null 2>&1; then
command -v slick-greeter
return 0
fi
echo "error: could not find slick-greeter in common locations or PATH" >&2
exit 1
}
require_root() {
if [ "$(id -u)" -ne 0 ]; then
echo "error: please run as root" >&2
exit 1
fi
}
detect_timezone() {
LOCALTIME_TARGET=""
if command -v realpath >/dev/null 2>&1; then
LOCALTIME_TARGET="$(realpath /etc/localtime 2>/dev/null || true)"
fi
if [ -z "$LOCALTIME_TARGET" ] && command -v readlink >/dev/null 2>&1; then
LOCALTIME_TARGET="$(readlink /etc/localtime 2>/dev/null || true)"
fi
case "$LOCALTIME_TARGET" in
/zoneinfo/)
printf '%s\n' "${LOCALTIME_TARGET##*/zoneinfo/}"
return 0
;;
esac
if [ -f /var/db/zoneinfo ]; then
TZ_VALUE="$(tr -d '\n' < /var/db/zoneinfo 2>/dev/null || true)"
if [ -n "$TZ_VALUE" ]; then
printf '%s\n' "$TZ_VALUE"
return 0
fi
fi
echo "error: could not determine timezone from /etc/localtime or /var/db/zoneinfo" >&2
exit 1
}
write_wrapper() {
TZ_VALUE="$1"
SLICK_GREETER_BIN="$2"
mkdir -p "$(dirname "$WRAPPER")"
cat > "$WRAPPER" <<EOF
#!/bin/sh
export TZ='$TZ_VALUE'
exec '$SLICK_GREETER_BIN' "\$@"
EOF
chmod 755 "$WRAPPER"
echo "wrote wrapper: $WRAPPER"
}
ensure_lightdm_conf_exists() {
mkdir -p "$LIGHTDM_CONF_DIR"
if [ ! -f "$LIGHTDM_CONF" ]; then
cat > "$LIGHTDM_CONF" <<EOF
[Seat:*]
greeter-session=$WRAPPER
EOF
echo "created $LIGHTDM_CONF"
fi
}
update_lightdm_conf() {
ensure_lightdm_conf_exists
cp "$LIGHTDM_CONF" "$LIGHTDM_CONF.$BACKUP_SUFFIX"
echo "backup created: $LIGHTDM_CONF.$BACKUP_SUFFIX"
if grep -q '^[[:space:]]greeter-session=' "$LIGHTDM_CONF"; then
sed -i '' "s|^[[:space:]]greeter-session=.*|greeter-session=$WRAPPER|" "$LIGHTDM_CONF"
echo "updated greeter-session in $LIGHTDM_CONF"
return 0
fi
if grep -q '[Seat:*]' "$LIGHTDM_CONF"; then
awk -v wrapper="$WRAPPER" '
BEGIN { added=0 }
/[Seat:*]/ {
print
print "greeter-session=" wrapper
added=1
next
}
{ print }
END {
if (!added) {
print ""
print "[Seat:]"
print "greeter-session=" wrapper
}
}
' "$LIGHTDM_CONF" > "$LIGHTDM_CONF.tmp"
mv "$LIGHTDM_CONF.tmp" "$LIGHTDM_CONF"
echo "added greeter-session under [Seat:] in $LIGHTDM_CONF"
return 0
fi
cat >> "$LIGHTDM_CONF" <<EOF
[Seat:]
greeter-session=$WRAPPER
EOF
echo "appended [Seat:] section to $LIGHTDM_CONF"
}
show_slick_greeter_hint() {
SLICK_CONF="/usr/local/etc/lightdm/slick-greeter.conf"
echo ""
echo "optional verification step:"
echo "set the clock format to include the timezone abbreviation"
echo ""
echo "file: $SLICK_CONF"
echo ""
echo "[Greeter]"
echo "show-clock=true"
echo "clock-format=%Y-%m-%d %H:%M %Z"
}
print_summary() {
TZ_VALUE="$1"
SLICK_GREETER_BIN="$2"
echo ""
echo "done"
echo "timezone detected: $TZ_VALUE"
echo "slick-greeter path: $SLICK_GREETER_BIN"
echo "wrapper path: $WRAPPER"
echo ""
echo "restart LightDM or reboot to test."
echo ""
echo "likely command:"
echo "service lightdm restart"
show_slick_greeter_hint
}
main() {
require_root
TZ_VALUE="$(detect_timezone)"
SLICK_GREETER_BIN="$(find_slick_greeter)"
write_wrapper "$TZ_VALUE" "$SLICK_GREETER_BIN"
update_lightdm_conf
print_summary "$TZ_VALUE" "$SLICK_GREETER_BIN"
}
main "$@"