Skip to content

Instantly share code, notes, and snippets.

@pierrehenri220
Created November 14, 2016 10:02
Show Gist options
  • Save pierrehenri220/e4ba58e01f1e6780b602e284e25cec64 to your computer and use it in GitHub Desktop.
Save pierrehenri220/e4ba58e01f1e6780b602e284e25cec64 to your computer and use it in GitHub Desktop.
Microsoft TrueType core fonts installation helper for Fedora Linux
#!/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
@pierrehenri220
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment