Microsoft TrueType core fonts installation helper for Fedora 15 Lovelock (and above)

This page provides a bash script for an easier installation of the Microsoft TrueType core web fonts. I think it is useful because the MS core web fonts are not included in the main repositories (licensing issues). And IMHO, it is a bit extreme to install rpm-build plus create a package just to install a few fonts. See the main article for details:

Open a terminal and run the following commands to download and execute it (copy and paste recommended):

wget "http://blog.andreas-haerter.com/_export/code/2011/07/01/install-msttcorefonts-fedora.sh?codeblock=1" -O "/tmp/install-msttcorefonts-fedora.sh"
chmod a+rx "/tmp/install-msttcorefonts-fedora.sh"
su -c "/tmp/install-msttcorefonts-fedora.sh"
install-msttcorefonts-fedora.sh
#!/bin/bash
 
################################################################################
# Microsoft TrueType core fonts installation helper for Fedora Linux
#
# This script is installing the fonts without any untrustworthy 3rd-party RPMs
# or build-hazzle. I think it is useful because the MS core web fonts are not
# included in the main repositories (licensing issues). And (IMHO), it is a bit
# extreme to build a package on your own just to install a few fonts. This
# script is inspired by
# <http://corefonts.sourceforge.net/msttcorefonts-2.0-1.spec>.
#
# Tested on the following Fedora versions:
# - Fedora 15 Lovelock
#
# I don't have the time to test *every* version out there. Therefore it does not
# mean that this script does not work if your version is not listed above. Just
# try it out and check for an update of this script after a new version of
# Fedora is released:
# <http://blog.andreas-haerter.com/2011/07/01/install-msttcorefonts-fedora.sh>
#
# Usage:
# 1) Call this script with SUPERUSER privileges (->su -c, sudo ...)
# 2) If something fails, correct the thing which prevents the successful
#    execution and call it again. This script is designed in a way that
#    re-calling it should be no problem.
#
# Please note that the yum/RPM database is bypassed, so you can't uninstall
# the fonts by using "yum erase/remove". But you may run the following commands
# to get rid of the fonts:
# 1) su -c 'rm -rf "/usr/share/fonts/msttcorefonts/"'
# 2) fc-cache -fv
#
# Please read the MS end user license agreement (<http://j.mp/iAUdxT>, Mirror:
# <http://j.mp/kt8uiE>) for all the rules that govern the use of the fonts.
# Anyone can download and install these fonts for their own use but there are
# some things to follow. See the mentioned EULA and/or Microsoft's permissions
# site and/or <http://en.wikipedia.org/wiki/Core_fonts_for_the_Web> for details.
#
#
# LICENSE: This file (NOT THE FONTS) is open source software (OSS) and may be
#          copied under certain conditions. See the links below for details or
#          try to contact the author(s) of this file in doubt.
#
# @author Andreas Haerter <development@andreas-haerter.com>
# @copyright 2011, Andreas Haerter
# @license GPLv2 (http://www.gnu.org/licenses/gpl2.html)
# @license New/3-clause BSD (http://opensource.org/licenses/bsd-license.php)
# @link http://blog.andreas-haerter.com/2011/07/01/install-microsoft-core-fonts-on-fedora
# @link http://blog.andreas-haerter.com/2011/07/01/install-msttcorefonts-fedora.sh
# @link http://andreas-haerter.com
# @link http://en.wikipedia.org/wiki/Core_fonts_for_the_Web
# @link http://corefonts.sourceforge.net
# @version 2011-07-01
################################################################################
 
 
################################################################################
# Configuration
################################################################################
 
#Download mirrors
MSTTF_DLMIRRORS[(${#MSTTF_DLMIRRORS[@]})]="http://heanet.dl.sourceforge.net/sourceforge/corefonts/"
MSTTF_DLMIRRORS[(${#MSTTF_DLMIRRORS[@]})]="http://switch.dl.sourceforge.net/sourceforge/corefonts/"
MSTTF_DLMIRRORS[(${#MSTTF_DLMIRRORS[@]})]="http://dfn.dl.sourceforge.net/sourceforge/corefonts/"
MSTTF_DLMIRRORS[(${#MSTTF_DLMIRRORS[@]})]="http://kent.dl.sourceforge.net/sourceforge/corefonts/"
MSTTF_DLMIRRORS[(${#MSTTF_DLMIRRORS[@]})]="http://mesh.dl.sourceforge.net/sourceforge/corefonts/"
 
 
#Files to download + checksums
MSTTF_DLFILES[(${#MSTTF_DLFILES[@]})]="andale32.exe"
MSTTF_CHKMD5[(${#MSTTF_CHKMD5[@]})]="cbdc2fdd7d2ed0832795e86a8b9ee19a"
MSTTF_CHKSHA1[(${#MSTTF_CHKSHA1[@]})]="c4db8cbe42c566d12468f5fdad38c43721844c69"
MSTTF_CHKSHA256[(${#MSTTF_CHKSHA256[@]})]="0524fe42951adc3a7eb870e32f0920313c71f170c859b5f770d82b4ee111e970"
 
MSTTF_DLFILES[(${#MSTTF_DLFILES[@]})]="arial32.exe"
MSTTF_CHKMD5[(${#MSTTF_CHKMD5[@]})]="9637df0e91703179f0723ec095a36cb5"
MSTTF_CHKSHA1[(${#MSTTF_CHKSHA1[@]})]="6d75f8436f39ab2da5c31ce651b7443b4ad2916e"
MSTTF_CHKSHA256[(${#MSTTF_CHKSHA256[@]})]="85297a4d146e9c87ac6f74822734bdee5f4b2a722d7eaa584b7f2cbf76f478f6"
 
MSTTF_DLFILES[(${#MSTTF_DLFILES[@]})]="arialb32.exe"
MSTTF_CHKMD5[(${#MSTTF_CHKMD5[@]})]="c9089ae0c3b3d0d8c4b0a95979bb9ff0"
MSTTF_CHKSHA1[(${#MSTTF_CHKSHA1[@]})]="d45cdab84b7f4c1efd6d1b369f50ed0390e3d344"
MSTTF_CHKSHA256[(${#MSTTF_CHKSHA256[@]})]="a425f0ffb6a1a5ede5b979ed6177f4f4f4fdef6ae7c302a7b7720ef332fec0a8"
 
MSTTF_DLFILES[(${#MSTTF_DLFILES[@]})]="comic32.exe"
MSTTF_CHKMD5[(${#MSTTF_CHKMD5[@]})]="2b30de40bb5e803a0452c7715fc835d1"
MSTTF_CHKSHA1[(${#MSTTF_CHKSHA1[@]})]="2371d0327683dcc5ec1684fe7c275a8de1ef9a51"
MSTTF_CHKSHA256[(${#MSTTF_CHKSHA256[@]})]="9c6df3feefde26d4e41d4a4fe5db2a89f9123a772594d7f59afd062625cd204e"
 
MSTTF_DLFILES[(${#MSTTF_DLFILES[@]})]="courie32.exe"
MSTTF_CHKMD5[(${#MSTTF_CHKMD5[@]})]="4e412c772294403ab62fb2d247d85c60"
MSTTF_CHKSHA1[(${#MSTTF_CHKSHA1[@]})]="06a745023c034f88b4135f5e294fece1a3c1b057"
MSTTF_CHKSHA256[(${#MSTTF_CHKSHA256[@]})]="bb511d861655dde879ae552eb86b134d6fae67cb58502e6ff73ec5d9151f3384"
 
MSTTF_DLFILES[(${#MSTTF_DLFILES[@]})]="georgi32.exe"
MSTTF_CHKMD5[(${#MSTTF_CHKMD5[@]})]="4d90016026e2da447593b41a8d8fa8bd"
MSTTF_CHKSHA1[(${#MSTTF_CHKSHA1[@]})]="90e4070cb356f1d811acb943080bf97e419a8f1e"
MSTTF_CHKSHA256[(${#MSTTF_CHKSHA256[@]})]="2c2c7dcda6606ea5cf08918fb7cd3f3359e9e84338dc690013f20cd42e930301"
 
MSTTF_DLFILES[(${#MSTTF_DLFILES[@]})]="impact32.exe"
MSTTF_CHKMD5[(${#MSTTF_CHKMD5[@]})]="7907c7dd6684e9bade91cff82683d9d7"
MSTTF_CHKSHA1[(${#MSTTF_CHKSHA1[@]})]="86b34d650cfbbe5d3512d49d2545f7509a55aad2"
MSTTF_CHKSHA256[(${#MSTTF_CHKSHA256[@]})]="6061ef3b7401d9642f5dfdb5f2b376aa14663f6275e60a51207ad4facf2fccfb"
 
MSTTF_DLFILES[(${#MSTTF_DLFILES[@]})]="times32.exe"
MSTTF_CHKMD5[(${#MSTTF_CHKMD5[@]})]="ed39c8ef91b9fb80f76f702568291bd5"
MSTTF_CHKSHA1[(${#MSTTF_CHKSHA1[@]})]="20b79e65cdef4e2d7195f84da202499e3aa83060"
MSTTF_CHKSHA256[(${#MSTTF_CHKSHA256[@]})]="db56595ec6ef5d3de5c24994f001f03b2a13e37cee27bc25c58f6f43e8f807ab"
 
MSTTF_DLFILES[(${#MSTTF_DLFILES[@]})]="trebuc32.exe"
MSTTF_CHKMD5[(${#MSTTF_CHKMD5[@]})]="0d7ea16cac6261f8513a061fbfcdb2b5"
MSTTF_CHKSHA1[(${#MSTTF_CHKSHA1[@]})]="50aab0988423efcc9cf21fac7d64d534d6d0a34a"
MSTTF_CHKSHA256[(${#MSTTF_CHKSHA256[@]})]="5a690d9bb8510be1b8b4fe49f1f2319651fe51bbe54775ddddd8ef0bd07fdac9"
 
MSTTF_DLFILES[(${#MSTTF_DLFILES[@]})]="webdin32.exe"
MSTTF_CHKMD5[(${#MSTTF_CHKMD5[@]})]="230a1d13a365b22815f502eb24d9149b"
MSTTF_CHKSHA1[(${#MSTTF_CHKSHA1[@]})]="2fb4a42c53e50bc70707a7b3c57baf62ba58398f"
MSTTF_CHKSHA256[(${#MSTTF_CHKSHA256[@]})]="64595b5abc1080fba8610c5c34fab5863408e806aafe84653ca8575bed17d75a"
 
MSTTF_DLFILES[(${#MSTTF_DLFILES[@]})]="verdan32.exe"
MSTTF_CHKMD5[(${#MSTTF_CHKMD5[@]})]="12d2a75f8156e10607be1eaa8e8ef120"
MSTTF_CHKSHA1[(${#MSTTF_CHKSHA1[@]})]="f5b93cedf500edc67502f116578123618c64a42a"
MSTTF_CHKSHA256[(${#MSTTF_CHKSHA256[@]})]="c1cb61255e363166794e47664e2f21af8e3a26cb6346eb8d2ae2fa85dd5aad96"
 
MSTTF_DLFILES[(${#MSTTF_DLFILES[@]})]="wd97vwr32.exe" #contains tahoma in Vierwer1.cab
MSTTF_CHKMD5[(${#MSTTF_CHKMD5[@]})]="efa72d3ed0120a07326ce02f051e9b42"
MSTTF_CHKSHA1[(${#MSTTF_CHKSHA1[@]})]="8edf758f92513094a94e50b7826cd6f2b7696b8c"
MSTTF_CHKSHA256[(${#MSTTF_CHKSHA256[@]})]="f61126a6d17b2d126a7f31b142504dce4934f7989c55f1c13c6477b3fe80b3d2"
 
 
#target path
MSTTF_INSTTARGETDIR="/usr/share/fonts/msttcorefonts"
 
 
################################################################################
# Process
################################################################################
#welcome user
clear
echo "###############################################################################"
echo "# Microsoft TTF Core Fonts installation helper"
echo "# Found OS: $(cat /etc/fedora-release)"
echo "#"
echo "# Have a look at <http://corefonts.sourceforge.net> and/or"
echo "# <http://blog.andreas-haerter.com/2011/07/01/install-msttcorefonts-fedora.sh>"
echo "# for more information."
echo "#"
echo "# Please read the end user license agreement (EULA) (<http://j.mp/iAUdxT>, "
echo "# <http://j.mp/kt8uiE>) and/or Microsoft's permissions site and/or"
echo "# <http://en.wikipedia.org/wiki/Core_fonts_for_the_Web> for details and"
echo "# font copying plus license information."
echo "#"
echo "# Note: internet connection is mandatory!"
echo "###############################################################################"
#check: are we root?
if [ $(id -u) -ne 0 ]
then
	echo ""
	echo "Superuser privileges needed. E.g. call this script using 'su -c'." 1>&2
	exit 1
fi
echo -n "Start? [y|n]: "
read INPUT
if [ ! "${INPUT}" == "y" ] &&
   [ ! "${INPUT}" == "Y" ] &&
   [ ! "${INPUT}" == "j" ] &&
   [ ! "${INPUT}" == "J" ]
then
	echo "Operation canceled by user"
	exit 0
fi
 
 
#check if required tools are installed
echo ""
echo "Checking if all helper programs are available (this may take some time)..."
hash wget > /dev/null 2>&1
if [ $? -ne 0 ]
then
	echo "wget is missing, trying to install it..."
	yum -y install wget
	if [ $? -ne 0 ]
	then
		echo "Could not install missing wget" 1>&2
		exit 1
	fi
fi
hash cabextract > /dev/null 2>&1
if [ $? -ne 0 ]
then
	echo "cabextract is missing, trying to install it..."
	yum -y install cabextract
	if [ $? -ne 0 ]
	then
		echo "Could not install missing cabextract" 1>&2
		exit 1
	fi
fi
hash ttmkfdir > /dev/null 2>&1
if [ $? -ne 0 ]
then
	echo "ttmkfdir is missing, trying to install it..."
	yum -y install ttmkfdir
	if [ $? -ne 0 ]
	then
		echo "Could not install missing ttmkfdir" 1>&2
		exit 1
	fi
fi
echo "All needed programs found. Let's go!"
echo ""
 
 
 
 
#Download
MSTTF_TMPDIR=$(mktemp -d "/tmp/msttf.XXXXXXXXXXXXX") #prevent symlink race condition...
RND=${#MSTTF_DLMIRRORS[@]} #we need this temp var, [@] would not work (-> subshell problem: http://www.tldp.org/LDP/abs/html/subshells.html#PARVIS)
RND=$((RANDOM % ${RND}))
MSTTF_DLMIRROR=${MSTTF_DLMIRRORS[${RND}]}
echo "Setting download mirror to ${MSTTF_DLMIRROR}"
echo ""
DLTRY=0
for ((i=0; i < ${#MSTTF_DLFILES[@]}; i++))
do
	echo "Downloading '${MSTTF_DLFILES[${i}]}'..."
	mkdir -p "${MSTTF_TMPDIR}" > /dev/null 2>&1
	wget -nv --timeout=30 "${MSTTF_DLMIRROR}${MSTTF_DLFILES[${i}]}" -O "${MSTTF_TMPDIR}/${MSTTF_DLFILES[${i}]}"
	if [ $? -ne 0 ]
	then
		echo "Download failed, trying another mirror..."
		RND=${#MSTTF_DLMIRRORS[@]} #we need this temp var, [@] would not work (-> subshell problem: http://www.tldp.org/LDP/abs/html/subshells.html#PARVIS)
		RND=$((RANDOM % ${RND}))
		MSTTF_DLMIRROR=${MSTTF_DLMIRRORS[${RND}]}
		echo "Setting download mirror to ${MSTTF_DLMIRROR}"
		sleep 3
		wget -nv --timeout=90 "${MSTTF_DLMIRROR}${MSTTF_DLFILES[${i}]}" -O "${MSTTF_TMPDIR}/${MSTTF_DLFILES[${i}]}"
		if [ $? -ne 0 ]
		then
			echo "Download of ${MSTTF_DLFILES[${i}]} failed again, please check your connection and try again." 1>&2
			#clean up
			rm --preserve-root -rf "${MSTTF_TMPDIR}/" > /dev/null 2>&1
			exit 1
		fi
	fi
 
	echo "Download was successful, checking file..."
	MSTTF_TMPMD5=$(md5sum "${MSTTF_TMPDIR}/${MSTTF_DLFILES[${i}]}")
	MSTTF_TMPMD5=$(basename ${MSTTF_TMPMD5})
	MSTTF_TMPSHA1=$(sha1sum "${MSTTF_TMPDIR}/${MSTTF_DLFILES[${i}]}")
	MSTTF_TMPSHA1=$(basename ${MSTTF_TMPSHA1})
	MSTTF_TMPSHA256=$(sha256sum "${MSTTF_TMPDIR}/${MSTTF_DLFILES[${i}]}")
	MSTTF_TMPSHA256=$(basename ${MSTTF_TMPSHA256})
	if [ ! "${MSTTF_TMPMD5}" == "${MSTTF_CHKMD5[${i}]}" ] ||
	   [ ! "${MSTTF_TMPSHA1}" == "${MSTTF_CHKSHA1[${i}]}" ] ||
	   [ ! "${MSTTF_TMPSHA256}" == "${MSTTF_CHKSHA256[${i}]}" ]
	then
		echo "${MSTTF_DLFILES[${i}]} is corrupted, trying again (using random mirror)..."
		RND=${#MSTTF_DLMIRRORS[@]} #we need this temp var, [@] would not work (-> subshell problem: http://www.tldp.org/LDP/abs/html/subshells.html#PARVIS)
		RND=$((RANDOM % ${RND}))
		MSTTF_DLMIRROR=${MSTTF_DLMIRRORS[${RND}]}
		echo "Setting download mirror to ${MSTTF_DLMIRROR}."
		sleep 3
		let DLTRY=${DLTRY}+1
		if [ ${DLTRY} -gt 1 ]
		then
			echo "${MSTTF_DLFILES[${i}]} is corrupted again, please check your connection and try again." 1>&2
			echo "Expected MD5: ${MSTTF_CHKMD5[${i}]}" 1>&2
			echo "Found MD5:    ${MSTTF_TMPMD5}" 1>&2
			echo "Expected SHA1: ${MSTTF_CHKSHA1[${i}]}" 1>&2
			echo "Found SHA1:    ${MSTTF_TMPSHA1}" 1>&2
			echo "Expected SHA256: ${MSTTF_CHKSHA256[${i}]}" 1>&2
			echo "Found SHA256:    ${MSTTF_TMPSHA256}" 1>&2
			#clean up
			rm --preserve-root -rf "${MSTTF_TMPDIR}/" > /dev/null 2>&1
			exit 1
		fi
		let i=${i}-1
	else
		echo "${MSTTF_DLFILES[${i}]} is OK, going on."
		DLTRY=0
	fi
	echo ""
done
 
#extract
mkdir -p "${MSTTF_TMPDIR}/archive-contents" > /dev/null 2>&1
mkdir -p "${MSTTF_TMPDIR}/fonts" > /dev/null 2>&1
cd "${MSTTF_TMPDIR}"
for ((i=0; i < ${#MSTTF_DLFILES[@]}; i++))
do
	cabextract --lowercase --directory="${MSTTF_TMPDIR}/archive-contents" "${MSTTF_TMPDIR}/${MSTTF_DLFILES[${i}]}"
	if [ $? -ne 0 ]
	then
		echo "Could not extract contents of '${MSTTF_TMPDIR}/${MSTTF_DLFILES[${i}]}'." 1>&2
		exit 1
	fi
done
#wd97vwr32.exe contains tahoma within Vierwer1.cab
cabextract --lowercase --directory="${MSTTF_TMPDIR}/archive-contents" "${MSTTF_TMPDIR}/archive-contents/viewer1.cab"
if [ $? -ne 0 ]
then
	echo "Could not extract contents of '${MSTTF_TMPDIR}/archive-contents/viewer1.cab'." 1>&2
	exit 1
fi
cp "${MSTTF_TMPDIR}/archive-contents/"*.ttf "${MSTTF_TMPDIR}/fonts"
if [ $? -ne 0 ]
then
	echo "It seems that there are no TTF files in '${MSTTF_TMPDIR}/archive-contents/'?!" 1>&2
	exit 1
fi
#ttmkfdir is a tool to create valid and complete fonts.dir files from TrueType fonts
echo "Creating fonts.dir and font.scale file..."
cd "${MSTTF_TMPDIR}/fonts"
ttmkfdir > fonts.dir
if [ $? -ne 0 ]
then
	echo "Could not create fonts.dir and font.scale." 1>&2
	exit 1
fi
echo "Installing fonts..."
mkdir -p "${MSTTF_INSTTARGETDIR}" > /dev/null 2>&1
if [ $? -ne 0 ]
then
	echo "Could not create '${MSTTF_INSTTARGETDIR}' dir." 1>&2
	exit 1
fi
cp -f "${MSTTF_TMPDIR}/fonts/"*.ttf "${MSTTF_TMPDIR}/fonts/fonts.dir" "${MSTTF_TMPDIR}/fonts/fonts.scale" "${MSTTF_INSTTARGETDIR}"
if [ $? -ne 0 ]
then
	echo "Could not copy needed files into '${MSTTF_INSTTARGETDIR}'." 1>&2
	exit 1
else 
	echo "SUCCESS. Fonts installed."
	echo ""
fi
#clean up
rm --preserve-root -rf "${MSTTF_TMPDIR}/" > /dev/null 2>&1
echo "Re-building the system's font cache now..."
fc-cache -fv
if [ $? -ne 0 ]
then
	echo "Updating the system's font cache failed. However, the fonts were installed" 1>&2
	echo "successfully. You may try to update the cache by yourtself with 'fc-cache -fv'" 1>&2
	exit 1
fi
 
 
#finished
echo ""
echo ""
echo "###############################################################################"
echo "# Font installation done."
echo "###############################################################################"
echo "You should reboot to make everything work as expected."
echo -n "Reboot now ? [y|n]: "
read INPUT
if [ "${INPUT}" == "y" ] ||
   [ "${INPUT}" == "Y" ] ||
   [ "${INPUT}" == "j" ] ||
   [ "${INPUT}" == "J" ]
then
	echo ""
	echo "!!!System will reboot in 5 seconds. Press CTRL+C to prevent this!!!"
	echo ""
	sleep 5
	reboot
	exit 0
fi
exit 0

Copying/License

The source code of the script is dual-licensed under GPLv2 and New/3-clause BSD. Please read the end user license agreement (Mirror) for all the rules that govern the use of the fonts. Anyone can download and install these fonts for their own use but there are some things to follow. See the mentioned EULA and/or Microsoft's permissions site and/or Wikipedia for details.

I'm no native speaker (English)
Please let me know if you find any errors (I want to improve my English skills). Thank you!
QR Code: URL of current page
QR Code: URL of current page 2011:07:01:install-msttcorefonts-fedora.sh (generated for current page)