441ded2d91
desktop login managers. PR: bin/154686 Submitted by: kmoore Approved by: kib (mentor, implicit)
541 lines
13 KiB
Bash
Executable File
541 lines
13 KiB
Bash
Executable File
#!/bin/sh
|
|
#-
|
|
# Copyright (c) 2010 iXsystems, Inc. All rights reserved.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
# SUCH DAMAGE.
|
|
#
|
|
# $FreeBSD$
|
|
|
|
# Functions which runs commands on the system
|
|
|
|
. ${BACKEND}/functions.sh
|
|
. ${BACKEND}/functions-parse.sh
|
|
|
|
|
|
# Function which localizes a FreeBSD install
|
|
localize_freebsd()
|
|
{
|
|
sed -i.bak "s/lang=en_US/lang=${LOCALE}/g" ${FSMNT}/etc/login.conf
|
|
rm ${FSMNT}/etc/login.conf.bak
|
|
};
|
|
|
|
localize_x_desktops() {
|
|
|
|
# Check for and customize KDE lang
|
|
##########################################################################
|
|
|
|
# Check if we can localize KDE via skel
|
|
if [ -e "${FSMNT}/usr/share/skel/.kde4/share/config/kdeglobals" ] ; then
|
|
sed -i '' "s/Country=us/Country=${COUNTRY}/g" ${FSMNT}/usr/share/skel/.kde4/share/config/kdeglobals
|
|
sed -i '' "s/Country=us/Country=${COUNTRY}/g" ${FSMNT}/root/.kde4/share/config/kdeglobals
|
|
sed -i '' "s/Language=en_US/Language=${SETLANG}:${LOCALE}/g" ${FSMNT}/usr/share/skel/.kde4/share/config/kdeglobals
|
|
fi
|
|
|
|
# Check if we have a KDE root config
|
|
if [ -e "${FSMNT}/root/.kde4/share/config/kdeglobals" ] ; then
|
|
sed -i '' "s/Language=en_US/Language=${SETLANG}:${LOCALE}/g" ${FSMNT}/root/.kde4/share/config/kdeglobals
|
|
fi
|
|
|
|
# Check for KDM
|
|
if [ -e "${FSMNT}/usr/local/kde4/share/config/kdm/kdmrc" ] ; then
|
|
sed -i '' "s/Language=en_US/Language=${LOCALE}.UTF-8/g" ${FSMNT}/usr/local/kde4/share/config/kdm/kdmrc
|
|
fi
|
|
|
|
# Check for and customize GNOME / GDM lang
|
|
##########################################################################
|
|
|
|
# See if GDM is enabled and customize its lang
|
|
cat ${FSMNT}/etc/rc.conf 2>/dev/null | grep "gdm_enable=\"YES\"" >/dev/null 2>/dev/null
|
|
if [ "$?" = "0" ] ; then
|
|
echo "gdm_lang=\"${LOCALE}.UTF-8\"" >> ${FSMNT}/etc/rc.conf
|
|
fi
|
|
|
|
};
|
|
|
|
# Function which localizes a PC-BSD install
|
|
localize_pcbsd()
|
|
{
|
|
# Check if we have a localized splash screen and copy it
|
|
if [ -e "${FSMNT}/usr/local/share/pcbsd/splash-screens/loading-screen-${SETLANG}.pcx" ]
|
|
then
|
|
cp ${FSMNT}/usr/local/share/pcbsd/splash-screens/loading-screen-${SETLANG}.pcx ${FSMNT}/boot/loading-screen.pcx
|
|
fi
|
|
|
|
};
|
|
|
|
localize_x_keyboard()
|
|
{
|
|
KEYMOD="$1"
|
|
KEYLAY="$2"
|
|
KEYVAR="$3"
|
|
COUNTRY="$4"
|
|
OPTION="grp:alt_shift_toggle"
|
|
SETXKBMAP=""
|
|
|
|
if [ "${COUNTRY}" = "NONE" -o "${COUNTRY}" = "us" -o "${COUNTRY}" = "C" ] ; then
|
|
#In this case we don't need any additional language
|
|
COUNTRY=""
|
|
OPTION=""
|
|
else
|
|
COUNTRY=",${COUNTRY}"
|
|
fi
|
|
|
|
if [ "${KEYMOD}" != "NONE" ]
|
|
then
|
|
SETXKBMAP="-model ${KEYMOD}"
|
|
KXMODEL="${KEYMOD}"
|
|
else
|
|
KXMODEL="pc104"
|
|
fi
|
|
|
|
if [ "${KEYLAY}" != "NONE" ]
|
|
then
|
|
localize_key_layout "$KEYLAY"
|
|
SETXKBMAP="${SETXKBMAP} -layout ${KEYLAY}"
|
|
KXLAYOUT="${KEYLAY}"
|
|
else
|
|
KXLAYOUT="us"
|
|
fi
|
|
|
|
if [ "${KEYVAR}" != "NONE" ]
|
|
then
|
|
SETXKBMAP="${SETXKBMAP} -variant ${KEYVAR}"
|
|
KXVAR="(${KEYVAR})"
|
|
else
|
|
KXVAR=""
|
|
fi
|
|
|
|
# Setup .xprofile with our setxkbmap call now
|
|
if [ ! -z "${SETXKBMAP}" ]
|
|
then
|
|
if [ ! -e "${FSMNT}/usr/share/skel/.xprofile" ]
|
|
then
|
|
echo "#!/bin/sh" >${FSMNT}/usr/share/skel/.xprofile
|
|
fi
|
|
|
|
# Save the keyboard layout for user / root X logins
|
|
echo "setxkbmap ${SETXKBMAP}" >>${FSMNT}/usr/share/skel/.xprofile
|
|
chmod 755 ${FSMNT}/usr/share/skel/.xprofile
|
|
cp ${FSMNT}/usr/share/skel/.xprofile ${FSMNT}/root/.xprofile
|
|
|
|
# Save it for KDM
|
|
if [ -e "${FSMNT}/usr/local/kde4/share/config/kdm/Xsetup" ] ; then
|
|
echo "setxkbmap ${SETXKBMAP}" >>${FSMNT}/usr/local/kde4/share/config/kdm/Xsetup
|
|
fi
|
|
fi
|
|
|
|
# Create the kxkbrc configuration using these options
|
|
if [ -d "${FSMNT}/usr/share/skel/.kde4/share/config" ] ; then
|
|
echo "[Layout]
|
|
DisplayNames=${KXLAYOUT}${COUNTRY}
|
|
IndicatorOnly=false
|
|
LayoutList=${KXLAYOUT}${KXVAR}${COUNTRY}
|
|
Model=${KXMODEL}
|
|
Options=${OPTION}
|
|
ResetOldOptions=true
|
|
ShowFlag=true
|
|
ShowSingle=false
|
|
SwitchMode=WinClass
|
|
Use=true " >${FSMNT}/usr/share/skel/.kde4/share/config/kxkbrc
|
|
fi
|
|
|
|
};
|
|
|
|
localize_key_layout()
|
|
{
|
|
|
|
KEYLAYOUT="$1"
|
|
|
|
# Set the keylayout in rc.conf
|
|
case ${KEYLAYOUT} in
|
|
am) KEYLAYOUT_CONSOLE="hy.armscii-8" ;;
|
|
ch) KEYLAYOUT_CONSOLE="swissgerman.iso" ;;
|
|
cz) KEYLAYOUT_CONSOLE="cz.iso2" ;;
|
|
de) KEYLAYOUT_CONSOLE="german.iso" ;;
|
|
dk) KEYLAYOUT_CONSOLE="danish.iso" ;;
|
|
ee) KEYLAYOUT_CONSOLE="estonian.iso" ;;
|
|
es) KEYLAYOUT_CONSOLE="spanish.iso" ;;
|
|
fi) KEYLAYOUT_CONSOLE="finnish.iso" ;;
|
|
is) KEYLAYOUT_CONSOLE="icelandic.iso" ;;
|
|
jp) KEYLAYOUT_CONSOLE="jp.106" ;;
|
|
nl) KEYLAYOUT_CONSOLE="dutch.iso.acc" ;;
|
|
no) KEYLAYOUT_CONSOLE="norwegian.iso" ;;
|
|
pl) KEYLAYOUT_CONSOLE="pl_PL.ISO8859-2" ;;
|
|
ru) KEYLAYOUT_CONSOLE="ru.koi8-r" ;;
|
|
sk) KEYLAYOUT_CONSOLE="sk.iso2" ;;
|
|
se) KEYLAYOUT_CONSOLE="swedish.iso" ;;
|
|
tr) KEYLAYOUT_CONSOLE="tr.iso9.q" ;;
|
|
gb) KEYLAYOUT_CONSOLE="uk.iso" ;;
|
|
*) if [ ! -z "${KEYLAYOUT}" ]
|
|
then
|
|
KEYLAYOUT_CONSOLE="${KEYLAYOUT}.iso"
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
if [ ! -z "${KEYLAYOUT_CONSOLE}" ]
|
|
then
|
|
echo "keymap=\"${KEYLAYOUT_CONSOLE}\"" >>${FSMNT}/etc/rc.conf
|
|
fi
|
|
|
|
};
|
|
|
|
# Function which prunes other l10n files from the KDE install
|
|
localize_prune_langs()
|
|
{
|
|
get_value_from_cfg localizeLang
|
|
KEEPLANG="$VAL"
|
|
if [ -z "$KEEPLANG" ] ; then
|
|
KEEPLANG="en"
|
|
fi
|
|
export KEEPLANG
|
|
|
|
echo_log "Pruning other l10n files, keeping ${KEEPLANG}"
|
|
|
|
# Create the script to do uninstalls
|
|
echo '#!/bin/sh
|
|
|
|
for i in `pkg_info | grep "kde-l10n" | cut -d " " -f 1`
|
|
do
|
|
echo "$i" | grep "${KEEPLANG}-kde"
|
|
if [ "$?" != "0" ] ; then
|
|
pkg_delete ${i}
|
|
fi
|
|
done
|
|
' > ${FSMNT}/.pruneLangs.sh
|
|
|
|
chmod 755 ${FSMNT}/.pruneLangs.sh
|
|
chroot ${FSMNT} /.pruneLangs.sh >/dev/null 2>/dev/null
|
|
rm ${FSMNT}/.pruneLangs.sh
|
|
|
|
};
|
|
|
|
# Function which sets COUNTRY SETLANG and LOCALE based upon $1
|
|
localize_get_codes()
|
|
{
|
|
TARGETLANG="${1}"
|
|
# Setup the presets for the specific lang
|
|
case $TARGETLANG in
|
|
af)
|
|
COUNTRY="C"
|
|
SETLANG="af"
|
|
LOCALE="af_ZA"
|
|
;;
|
|
ar)
|
|
COUNTRY="C"
|
|
SETLANG="ar"
|
|
LOCALE="en_US"
|
|
;;
|
|
az)
|
|
COUNTRY="C"
|
|
SETLANG="az"
|
|
LOCALE="en_US"
|
|
;;
|
|
ca)
|
|
COUNTRY="es"
|
|
SETLANG="es:ca"
|
|
LOCALE="ca_ES"
|
|
;;
|
|
be)
|
|
COUNTRY="be"
|
|
SETLANG="be"
|
|
LOCALE="be_BY"
|
|
;;
|
|
bn)
|
|
COUNTRY="bn"
|
|
SETLANG="bn"
|
|
LOCALE="en_US"
|
|
;;
|
|
bg)
|
|
COUNTRY="bg"
|
|
SETLANG="bg"
|
|
LOCALE="bg_BG"
|
|
;;
|
|
cs)
|
|
COUNTRY="cz"
|
|
SETLANG="cs"
|
|
LOCALE="cs_CZ"
|
|
;;
|
|
da)
|
|
COUNTRY="dk"
|
|
SETLANG="da"
|
|
LOCALE="da_DK"
|
|
;;
|
|
de)
|
|
COUNTRY="de"
|
|
SETLANG="de"
|
|
LOCALE="de_DE"
|
|
;;
|
|
en_GB)
|
|
COUNTRY="gb"
|
|
SETLANG="en_GB:cy"
|
|
LOCALE="en_GB"
|
|
;;
|
|
el)
|
|
COUNTRY="gr"
|
|
SETLANG="el:gr"
|
|
LOCALE="el_GR"
|
|
;;
|
|
es)
|
|
COUNTRY="es"
|
|
SETLANG="es"
|
|
LOCALE="es_ES"
|
|
;;
|
|
es_LA)
|
|
COUNTRY="us"
|
|
SETLANG="es:en_US"
|
|
LOCALE="es_ES"
|
|
;;
|
|
et)
|
|
COUNTRY="ee"
|
|
SETLANG="et"
|
|
LOCALE="et_EE"
|
|
;;
|
|
fr)
|
|
COUNTRY="fr"
|
|
SETLANG="fr"
|
|
LOCALE="fr_FR"
|
|
;;
|
|
he)
|
|
COUNTRY="il"
|
|
SETLANG="he:ar"
|
|
LOCALE="he_IL"
|
|
;;
|
|
hr)
|
|
COUNTRY="hr"
|
|
SETLANG="hr"
|
|
LOCALE="hr_HR"
|
|
;;
|
|
hu)
|
|
COUNTRY="hu"
|
|
SETLANG="hu"
|
|
LOCALE="hu_HU"
|
|
;;
|
|
it)
|
|
COUNTRY="it"
|
|
SETLANG="it"
|
|
LOCALE="it_IT"
|
|
;;
|
|
ja)
|
|
COUNTRY="jp"
|
|
SETLANG="ja"
|
|
LOCALE="ja_JP"
|
|
;;
|
|
ko)
|
|
COUNTRY="kr"
|
|
SETLANG="ko"
|
|
LOCALE="ko_KR"
|
|
;;
|
|
nl)
|
|
COUNTRY="nl"
|
|
SETLANG="nl"
|
|
LOCALE="nl_NL"
|
|
;;
|
|
nn)
|
|
COUNTRY="no"
|
|
SETLANG="nn"
|
|
LOCALE="en_US"
|
|
;;
|
|
pa)
|
|
COUNTRY="pa"
|
|
SETLANG="pa"
|
|
LOCALE="en_US"
|
|
;;
|
|
pl)
|
|
COUNTRY="pl"
|
|
SETLANG="pl"
|
|
LOCALE="pl_PL"
|
|
;;
|
|
pt)
|
|
COUNTRY="pt"
|
|
SETLANG="pt"
|
|
LOCALE="pt_PT"
|
|
;;
|
|
pt_BR)
|
|
COUNTRY="br"
|
|
SETLANG="pt_BR"
|
|
LOCALE="pt_BR"
|
|
;;
|
|
ru)
|
|
COUNTRY="ru"
|
|
SETLANG="ru"
|
|
LOCALE="ru_RU"
|
|
;;
|
|
sl)
|
|
COUNTRY="si"
|
|
SETLANG="sl"
|
|
LOCALE="sl_SI"
|
|
;;
|
|
sk)
|
|
COUNTRY="sk"
|
|
SETLANG="sk"
|
|
LOCALE="sk_SK"
|
|
;;
|
|
sv)
|
|
COUNTRY="se"
|
|
SETLANG="sv"
|
|
LOCALE="sv_SE"
|
|
;;
|
|
uk)
|
|
COUNTRY="ua"
|
|
SETLANG="uk"
|
|
LOCALE="uk_UA"
|
|
;;
|
|
vi)
|
|
COUNTRY="vn"
|
|
SETLANG="vi"
|
|
LOCALE="en_US"
|
|
;;
|
|
zh_CN)
|
|
COUNTRY="cn"
|
|
SETLANG="zh_CN"
|
|
LOCALE="zh_CN"
|
|
;;
|
|
zh_TW)
|
|
COUNTRY="tw"
|
|
SETLANG="zh_TW"
|
|
LOCALE="zh_TW"
|
|
;;
|
|
*)
|
|
COUNTRY="C"
|
|
SETLANG="${TARGETLANG}"
|
|
LOCALE="en_US"
|
|
;;
|
|
esac
|
|
|
|
export COUNTRY SETLANG LOCALE
|
|
|
|
};
|
|
|
|
# Function which sets the timezone on the system
|
|
set_timezone()
|
|
{
|
|
TZONE="$1"
|
|
cp ${FSMNT}/usr/share/zoneinfo/${TZONE} ${FSMNT}/etc/localtime
|
|
};
|
|
|
|
# Function which enables / disables NTP
|
|
set_ntp()
|
|
{
|
|
ENABLED="$1"
|
|
if [ "$ENABLED" = "yes" -o "${ENABLED}" = "YES" ]
|
|
then
|
|
cat ${FSMNT}/etc/rc.conf 2>/dev/null | grep 'ntpd_enable="YES"' >/dev/null 2>/dev/null
|
|
if [ "$?" != "0" ]
|
|
then
|
|
echo 'ntpd_enable="YES"' >>${FSMNT}/etc/rc.conf
|
|
echo 'ntpd_sync_on_start="YES"' >>${FSMNT}/etc/rc.conf
|
|
fi
|
|
else
|
|
cat ${FSMNT}/etc/rc.conf 2>/dev/null | grep 'ntpd_enable="YES"' >/dev/null 2>/dev/null
|
|
if [ "$?" != "0" ]
|
|
then
|
|
sed -i.bak 's|ntpd_enable="YES"||g' ${FSMNT}/etc/rc.conf
|
|
fi
|
|
fi
|
|
};
|
|
|
|
# Starts checking for localization directives
|
|
run_localize()
|
|
{
|
|
KEYLAYOUT="NONE"
|
|
KEYMOD="NONE"
|
|
KEYVAR="NONE"
|
|
|
|
while read line
|
|
do
|
|
# Check if we need to do any localization
|
|
echo $line | grep "^localizeLang=" >/dev/null 2>/dev/null
|
|
if [ "$?" = "0" ]
|
|
then
|
|
|
|
# Set our country / lang / locale variables
|
|
get_value_from_string "$line"
|
|
localize_get_codes ${VAL}
|
|
|
|
get_value_from_string "$line"
|
|
# If we are doing PC-BSD install, localize it as well as FreeBSD base
|
|
if [ "${INSTALLTYPE}" != "FreeBSD" ]
|
|
then
|
|
localize_pcbsd "$VAL"
|
|
fi
|
|
|
|
# Localize FreeBSD
|
|
localize_freebsd "$VAL"
|
|
|
|
# Localize any X pkgs
|
|
localize_x_desktops "$VAL"
|
|
fi
|
|
|
|
# Check if we need to do any keylayouts
|
|
echo $line | grep "^localizeKeyLayout=" >/dev/null 2>/dev/null
|
|
if [ "$?" = "0" ] ; then
|
|
get_value_from_string "$line"
|
|
KEYLAYOUT="$VAL"
|
|
fi
|
|
|
|
# Check if we need to do any key models
|
|
echo $line | grep "^localizeKeyModel=" >/dev/null 2>/dev/null
|
|
if [ "$?" = "0" ] ; then
|
|
get_value_from_string "$line"
|
|
KEYMOD="$VAL"
|
|
fi
|
|
|
|
# Check if we need to do any key variant
|
|
echo $line | grep "^localizeKeyVariant=" >/dev/null 2>/dev/null
|
|
if [ "$?" = "0" ] ; then
|
|
get_value_from_string "$line"
|
|
KEYVAR="$VAL"
|
|
fi
|
|
|
|
|
|
# Check if we need to set a timezone
|
|
echo $line | grep "^timeZone=" >/dev/null 2>/dev/null
|
|
if [ "$?" = "0" ] ; then
|
|
get_value_from_string "$line"
|
|
set_timezone "$VAL"
|
|
fi
|
|
|
|
# Check if we need to set a timezone
|
|
echo $line | grep "^enableNTP=" >/dev/null 2>/dev/null
|
|
if [ "$?" = "0" ] ; then
|
|
get_value_from_string "$line"
|
|
set_ntp "$VAL"
|
|
fi
|
|
done <${CFGF}
|
|
|
|
if [ "${INSTALLTYPE}" != "FreeBSD" ] ; then
|
|
# Do our X keyboard localization
|
|
localize_x_keyboard "${KEYMOD}" "${KEYLAYOUT}" "${KEYVAR}" "${COUNTRY}"
|
|
fi
|
|
|
|
# Check if we want to prunt any other KDE lang files to save some disk space
|
|
get_value_from_cfg localizePrune
|
|
if [ "${VAL}" = "yes" -o "${VAL}" = "YES" ] ; then
|
|
localize_prune_langs
|
|
fi
|
|
|
|
# Update the login.conf db, even if we didn't localize, its a good idea to make sure its up2date
|
|
run_chroot_cmd "/usr/bin/cap_mkdb /etc/login.conf" >/dev/null 2>/dev/null
|
|
|
|
};
|