#!/bin/bash # # Copyright (c) 1997-2001 SuSE Gmbh Nuernberg, Germany. All rights reserved. # Copyright (c) 2004 SuSE LINUX AG, Germany. All rights reserved. # Copyright (c) 2007-2009 SuSE LINUX Products GmbH, Nuernberg, Germany. # Copyright (c) 2011 SuSE LINUX Products GmbH, Nuernberg, Germany. # # Please submit bugfixes or comments via http://bugs.opensuse.org/ # # Author: Werner Fink, 1997-2012 # typeset -r OLDIFS="$IFS" typeset -i rc=0 : ${VERBOSE=true} test -r /etc/sysconfig/suseconfig && . /etc/sysconfig/suseconfig unset ${!LC_*} LANG=POSIX MKTEXLSR=true export LANG MKTEXLSR mkdir -p /var/run/texlive test $? -gt 0 && exit 0 trap 'rm -rf /var/run/texlive' EXIT rotator () { local -i i=0 local -a elements=('|' '/' '-' '\') while read -s -n 1 ; do printf "\r[${elements[((i++%4))]}]" done echo } if test $VERBOSE = true ; then exec 4> >(rotator) else exec 4> /dev/null fi type -p mktexlsr &> /dev/null || exit 0 type -p kpsewhich &> /dev/null || exit 0 type -p updmap-sys &> /dev/null || exit 0 type -p find &> /dev/null || { echo "${0##*/}: No find in PATH ... skipping"; exit 0 ; } type -p sort &> /dev/null || { echo "${0##*/}: No sort in PATH ... skipping"; exit 0 ; } type -p env &> /dev/null || { echo "${0##*/}: No env in PATH ... skipping"; exit 0 ; } type -p sed &> /dev/null || { echo "${0##*/}: No sed in PATH ... skipping"; exit 0 ; } type -p tr &> /dev/null || { echo "${0##*/}: No tr in PATH ... skipping"; exit 0 ; } type -p grep &> /dev/null || { echo "${0##*/}: No grep in PATH ... skipping"; exit 0 ; } type -p ed &> /dev/null || { echo "${0##*/}: No ed in PATH ... skipping"; exit 0 ; } # Be sure that configuring in /etc/texmf will work even if # there are files relative to /etc/texmf ... unset KPSE_DOT || true : ${TEXMFMAIN:=$(kpsewhich --expand-path='$TEXMFMAIN' 2> /dev/null)} : ${TEXMFDIST:=$(kpsewhich --expand-path='$TEXMFDIST' 2> /dev/null)} : ${TEXMFVAR:=$(kpsewhich --var-value=TEXMFVAR 2> /dev/null)} : ${TEXMFCNF:=$(kpsewhich texmf.cnf 2> /dev/null)} : ${TEXMFSYSCONFIG:=$(kpsewhich --expand-path='$TEXMFSYSCONFIG' 2> /dev/null)} : ${TEXMFLSR:=$(kpsewhich --show-path=ls-R 2> /dev/null)} : ${WEB2C:=$TEXMFVAR/web2c} size=$(find /etc/texmf/ls-R -follow -printf '%s') test $size -lt 80 && > /var/run/texlive/run-mktexlsr tcfmgr () { ${TEXMFMAIN}/texconfig/tcfmgr ${1+"$@"} 2> /dev/null } enablemaps () { updmap-sys --quiet --nohash --listmaps < /dev/null 2> /dev/null | \ sed -n -r 's@(#![[:space:]])(Mixed)?Map[[:space:]]*@@gp' | \ xargs -r kpsewhich --format=map 2> /dev/null | \ sed -r 's@.*/([^/]*)@\1@g' } # # Straightforward ... here we go # if test -e /var/run/texlive/run-mktexlsr; then test $VERBOSE = true && echo -e "\r[ ]Updating TeX hash data base." mktexlsr < /dev/null 1>&4 2>&4 let rc+=$? rm -f /var/run/texlive/run-mktexlsr fi if test -e /var/run/texlive/run-fmtutil; then test $VERBOSE = true && echo -e "\r[ ]Updating TeX formats." fmtutil-sys --missing < /dev/null 1>&4 2>&4 let rc+=$? rm -f /var/run/texlive/run-fmtutil fi if test -e /var/run/texlive/run-updmap; then test $VERBOSE = true && echo -e "\r[ ]Updating TeX font mappings." updmap-sys --nohash < /dev/null 1>&4 2>&4 rm -f /var/run/texlive/run-updmap else typeset -i n=0 cfg=$(tcfmgr --cmd find --file updmap.cfg) if test -e ${cfg} ; then updmap-sys --nohash --nomkmap --syncwithtrees < /dev/null 1>&4 2>&4 let rc+=$? enablemaps | \ while read line ; do ((n++ == 0)) && test $VERBOSE = true && echo -e "\r[ ]Updating TeX font mappings." line='^#![[:space:]]*((Mixed)?Map)[[:space:]]*('$line')' emap=$(sed -n -r "s/$line/\1=\3/p" ${cfg}) updmap-sys --nohash --nomkmap --enable $emap < /dev/null 1>&4 2>&4 let rc+=$? done updmap-sys < /dev/null 1>&4 2>&4 let rc+=$? fi fi # # If texmf.cnf has changed it may contain changed memory sizes # of various programs. # type -p readlink &> /dev/null || exit 0 type -p texconfig-sys &> /dev/null || exit 0 test -L "$TEXMFCNF" && TEXMFCNF="$(readlink -f "$TEXMFCNF" 2> /dev/null)" # # Configuration broken # if test ! -e "$TEXMFCNF" ; then echo "${0##*/}: Configuration of texlive installation not found." exit 0 fi init=false for f in $(find ${WEB2C}/ -name '*.fmt' -name '*.mem' -o -name '*.base') ; do test -e "$f" || continue test -L "$f" && continue test "$TEXMFCNF" -nt "$f" && init=true test -s "$f" && touch "$f" done if test $init = true ; then test $VERBOSE = true && echo -e "\r[ ]Initialize TeX configuration and font mappings." updmap-sys --syncwithtrees < /dev/null 1>&4 2>&4 let rc+=$? texconfig-sys init < /dev/null 1>&4 2>&4 let rc+=$? fi # # These are required. # type -p md5sum &> /dev/null || exit 0 # # We need a check for an already modified texlive configuration: # therefore we use md5 check sums. # if test -z "$MD5DIR" ; then LIBDIR=/var/lib/texmf MD5DIR=$LIBDIR/md5 fi mkdir -p $MD5DIR test $? -gt 0 && exit 0 # # The main configuration files of TeXLive. # type -p fmtutil-sys &> /dev/null || exit 0 cnf_mfont=$(tcfmgr --cmd find --file mktex.cnf) cnf_xdvi=$(tcfmgr --cmd find --file XDvi) cnf_dvips=$(tcfmgr --cmd find --file config.ps) cnf_lang=$(TEXMF=$TEXMFSYSCONFIG kpsewhich language.dat 2> /dev/null) cnf_base=$(TEXMF=$TEXMF kpsewhich language.us 2> /dev/null) test -n "${cnf_mfont}" || exit 0 test -n "${cnf_xdvi}" || exit 0 test -n "${cnf_dvips}" || exit 0 test -n "${cnf_lang}" || exit 0 md5_mfont=${MD5DIR}${cnf_mfont} md5_xdvi=${MD5DIR}${cnf_xdvi} md5_dvips=${MD5DIR}${cnf_dvips} md5_lang=${MD5DIR}${cnf_lang} md5_cups=${MD5DIR}/cups # # Is this a full TeXLive system? # test -e ${cnf_mfont} || exit 0 # Default MetaFont mode test -e ${cnf_xdvi} || exit 0 # Default xdvi resolution test -e ${cnf_dvips} || exit 0 # Default printer mode test -e ${cnf_lang} || exit 0 # Default hyphenation # # Current MD5 sums # set -- $(md5sum < ${cnf_mfont}) ; md5modes="$1" set -- $(md5sum < ${cnf_xdvi} ) ; md5xdvi="$1" set -- $(md5sum < ${cnf_dvips}) ; md5dvips="$1" set -- $(md5sum < ${cnf_lang} ) ; md5lang="$1" # # Previous md5 sums # omd5lang=0 if test -e ${md5_lang} -a -r ${md5_lang} ; then test ${md5_lang} -nt ${cnf_lang} && md5_nt_lang="yes" set -- $(cat ${md5_lang}) ; omd5lang="$1" elif test ! -d ${md5_lang%/*} ; then mkdir -p ${md5_lang%/*} fi # # Create new formats for new language.dat if needed # if test $omd5lang = 0 -o \ \( $md5lang != $omd5lang -o "$md5_nt_lang" != "yes" \) then test $VERBOSE = true && echo -e "\r[ ]Handle language setups." set -- $(md5sum < ${cnf_lang}) echo $1 > ${md5_lang} fmtutil-sys --byhyphen ${cnf_lang} < /dev/null 1>&4 2>&4 let rc+=$? fi # # The main system printer. # lp="" if type -p lpoptions &>/dev/null && lpstat -r &>/dev/null ; then dev=PS size=a4 dpi=300 color=mono IFS=$'\n' lpopt=($(lpoptions -l 2> /dev/null)) IFS="$OLDIFS" shopt -s extglob for line in "${lpopt[@]}" ; do case "$line" in PageSize*) set -- $line while test -n "$1" ; do case "$1" in \**) size="${1:1}"; break esac shift done ;; Resolution*) set -- $line reg='?(\*)@(+([0-9])|+([0-9])x+([0-9]))dpi' cur=0 while test -n "$1" ; do case "$1" in $reg) cur=${1%%+([[:alpha:]])} esac cur="${cur#\*}" case "$1" in *Color*) color=color esac shift test "${cur%x*}" -gt "${dpi%x*}" && dpi=$cur done ;; ColorCorrection*) set -- $line while test -n "$1" ; do case "$1" in \*RGB|\*CMYK) color=color; break esac shift done ;; esac done shopt -u extglob lp="lp|${dev}-$(echo ${size}-auto-${color}-${dpi}|tr '[:upper:]' '[:lower:]')" elif test -r /etc/printcap -a -d /var/lib/apsfilter/ ; then lp=$(grep -E '^lp\|' /etc/printcap) elif test -r /etc/printcap -a -x /usr/lib/lpdfilter/bin/readpc ; then lp=$(/usr/lib/lpdfilter/bin/readpc lp || true) fi test -n "$lp" || exit 0 # No (configured) filter system: nothing to do if type -p lpoptions &>/dev/null && lpstat -r &>/dev/null ; then omd5cups=0 if test -r ${md5_cups} ; then set -- $(cat ${md5_cups}) ; omd5cups=$1 elif test ! -d ${md5_cups%/*} ; then mkdir -p ${md5_cups%/*} fi set -- $(lpoptions -l 2> /dev/null | md5sum) ; md5cups=$1 if test ${omd5cups} != ${md5cups} ; then prtcap_nt_mfont="yes" prtcap_nt_xdvi="yes" prtcap_nt_dvips="yes" echo ${md5cups} > ${md5_cups} fi else test /etc/printcap -nt ${cnf_mfont} && prtcap_nt_mfont="yes" test /etc/printcap -nt ${cnf_xdvi} && prtcap_nt_xdvi="yes" test /etc/printcap -nt ${cnf_dvips} && prtcap_nt_dvips="yes" fi # # Previous md5 sums # omd5modes=0 omd5xdvi=0 omd5dvips=0 if test -e ${md5_mfont} -a -r ${md5_mfont} ; then test ${md5_mfont} -nt ${cnf_mfont} && md5_nt_mfont="yes" set -- $(cat ${md5_mfont}) ; omd5modes="$1" elif test ! -d ${md5_mfont%/*} ; then mkdir -p ${md5_mfont%/*} fi if test -e ${md5_xdvi} -a -r ${md5_xdvi} ; then test ${md5_xdvi} -nt ${cnf_xdvi} && md5_nt_xdvi="yes" set -- $(cat ${md5_xdvi}) ; omd5xdvi="$1" elif test ! -d ${md5_xdvi%/*} ; then mkdir -p ${md5_xdvi%/*} fi if test -e ${md5_dvips} -a -r ${md5_dvips} ; then test ${md5_dvips} -nt ${cnf_dvips} && md5_nt_dvips="yes" set -- $(cat ${md5_dvips}) ; omd5dvips="$1" elif test ! -d ${md5_dvips%/*} ; then mkdir -p ${md5_dvips%/*} fi # # Convert YaST2 configured printer for apsfilter or lpdfilter # case "$lp" in *\|*.upp--*) lp="" upp=${lp##*|} IFS="-$IFS" for upp in $upp ; do break; done IFS="$OLDIFS" if test -s /etc/gs.upp/$upp ; then while read line ; do case "$line" in -sDEVICE=*) dev="${line#*=}" ;; @*.upp) dev="${line#@}" ;; -r*) dpi="${line#-r}" ;; -sPAPERSIZE=*) psz="${line#*=}" ;; -sCOLOR=*) col="${line#*=}" ;; *) ;; esac done < /etc/gs.upp/$upp lp="lp|${dev}-${psz}-auto-${col}-${dpi}" fi ;; *:cm=lpdfilter*:) entry="$lp" lp="" IFS=":" for e in $entry ; do case "$e" in cm=lpdfilter*) eval "${e#cm=lpdfilter}" ;; esac done IFS="$OLDIFS" if test "$drv" = "upp" -a -s /etc/lpdfilter/lp/upp ; then while read line ; do case "$line" in -sDEVICE=*) drv="${line#*=}" ;; # Overwrite driver! -r*) dpi="${line#-r}" ;; -dDEVICEXRESOLUTION=*) xres="${line#*=}" ;; -dDEVICEYRESOLUTION=*) yres="${line#*=}" ;; -sPAPERSIZE=*) size="${line#*=}" ;; -sCOLOR=*) color="${line#*=}" ;; -sPOSTFILTER=\"*\") eval post="${line#*=}" ;; @*) upp="${line#@}" ;; esac done < /etc/lpdfilter/lp/upp fi if test -n "$upp" && type -p gs &> /dev/null ; then drv=${upp##*/} upp=$(echo "($upp) findlibfile { pop print } { pop } ifelse" | \ gs -sDEVICE=nullpage -q -dNOPAUSE - -c quit) fi if test -r "$upp" ; then while read line ; do case "$line" in -r*) dpi="${line#-r}" ;; esac done < $upp fi if test -z "$dpi" ; then test -n "$xres" && dpi=$xres test -n "$yres" && dpi=${dpi+"${dpi}x"}$yres fi lp="lp|${drv}-${size}-${method}-${color}-${dpi}" ;; esac # # Parse the configured system main printer # Ghostscript/PS <-> Metafont mode and paper size # (UNTESTED, Sorry I've *not* enough printers around) # function get_paper () { ( . /etc/sysconfig/language &> /dev/null h=($(LANG=$RC_LANG locale -k LC_PAPER)) case "${h[0]}" in height=297) echo a4 ;; *) echo letter ;; esac ) } case "$lp" in *-letter-*) XDVISIZE=us ; DVIPSSIZE=letter ;; *-legal-*) XDVISIZE=legal ; DVIPSSIZE=legal ;; *-ledger-*) XDVISIZE=a3r ; DVIPSSIZE=ledger ;; *-tabloid-*) XDVISIZE=a3 ; DVIPSSIZE=tabloid ;; *-a3-*) XDVISIZE=a3 ; DVIPSSIZE=a3 ;; *-a4-*) XDVISIZE=a4 ; DVIPSSIZE=a4 ;; *) case "$(get_paper)" in a4) XDVISIZE=a4 ; DVIPSSIZE=a4 ;; *) XDVISIZE=us ; DVIPSSIZE=letter ;; esac ;; esac case "$lp" in *\|PS*) PRINTER=ljfour ;; *\|bj10e*) PRINTER=bjtenex ;; *\|bj200*) PRINTER=bjtzzex ;; *\|bjc600*) PRINTER=canonbjc ;; *\|bjc800*) PRINTER=canonbjc ;; *\|bjc610a*) PRINTER=canonbjc ;; # *\|bjc610b*) PRINTER=canonbjc ;; *\|cdeskjet*600) PRINTER=ljfour ;; *\|deskjet*600) PRINTER=ljfour ;; *\|cdeskjet*) PRINTER=deskjet ;; *\|deskjet*) PRINTER=deskjet ;; *\|cdj6*) PRINTER=ljfour ;; *\|cdj8*) PRINTER=ljfour ;; *\|hpdj*) PRINTER=ljfour ;; *\|cdj*600) PRINTER=ljfour ;; *\|djet*600) PRINTER=ljfour ;; *\|cdj*) PRINTER=deskjet ;; *\|djet*) PRINTER=deskjet ;; *\|laserjet*) PRINTER=cx ;; *\|ljetplus*) PRINTER=cx ;; *\|ljet2*) PRINTER=cx ;; *\|ljet3*) PRINTER=jetiiisi ;; *\|ljet4l*) PRINTER=cx ;; *\|ljet4*) PRINTER=ljfour ;; *\|lj4*) PRINTER=ljfour ;; *\|lj5*) PRINTER=ljfive ;; # *\|lj5*) PRINTER=ljfivemp ;; *\|stcolor*720) PRINTER=esphi ;; *\|stcolor*) PRINTER=epstylus ;; *\|st800*720) PRINTER=esphi ;; *\|st800*) PRINTER=epstylus ;; *\|stc800*720) PRINTER=esphi ;; *\|stc800*) PRINTER=epstylus ;; *\|stc600*) PRINTER=epscszz ;; *\|stc_h*) PRINTER=esphi ;; *\|stc*) PRINTER=epstypro ;; *) PRINTER=ljfour prtcap_nt_dvips="manual" ;; esac # # Run texconfig if no one has update the TeXLive system # or parts of it. # if test $omd5modes = 0 -o \ \( $md5modes = $omd5modes -a "$prtcap_nt_mfont" = "yes" -a "$md5_nt_mfont" = "yes" \) then test $VERBOSE = true && echo -e "\r[ ]Set MetaFont mode." env -i MKTEXLSR=true PATH=$PATH LANG=$LANG texconfig-sys mode $PRINTER < /dev/null 1>&4 2>&4 let rc+=$? set -- $(md5sum < ${cnf_mfont}) echo $1 > ${md5_mfont} fi if test $omd5xdvi = 0 -o \ \( $md5xdvi = $omd5xdvi -a "$prtcap_nt_xdvi" = "yes" -a "$md5_nt_xdvi" = "yes" \) then test $VERBOSE = true && echo -e "\r[ ]Set XDvi paper size." env -i MKTEXLSR=true PATH=$PATH LANG=$LANG texconfig-sys xdvi paper $XDVISIZE < /dev/null 1>&4 2>&4 let rc+=$? set -- $(md5sum < ${cnf_xdvi}) echo $1 > ${md5_xdvi} fi if test $omd5dvips = 0 -o \ \( $md5dvips = $omd5dvips -a "$prtcap_nt_dvips" = "yes" -a "$md5_nt_dvips" = "yes" \) then test $VERBOSE = true && echo -e "\r[ ]Set dvips mode and paper size." env -i MKTEXLSR=true PATH=$PATH LANG=$LANG texconfig-sys dvips mode $PRINTER < /dev/null 1>&4 2>&4 let rc+=$? env -i MKTEXLSR=true PATH=$PATH LANG=$LANG texconfig-sys dvips paper $DVIPSSIZE < /dev/null 1>&4 2>&4 let rc+=$? set -- $(md5sum < ${cnf_dvips}) echo $1 > ${md5_dvips} fi if test "$prtcap_nt_dvips" = "manual" -a \ \( $md5dvips = $omd5dvips -o $omd5dvips = 0 \) then echo -e "\n${0##*/}: Unknown default printer, use texconfig to setup dvips manually." if test -n "$MAIL_REPORTS_TO" ; then echo "${0##*/}: Unknown default printer, use texconfig to setup dvips manually." | \ mail -s "${0##*/}" $MAIL_REPORTS_TO fi fi if test $VERBOSE = true ; then exec 4>&- fi ## exit $rc