#!/bin/bash # Copyright 1999-2006 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Id$ ############################################ ############################################ # ENVIRONMENT SETUP ############################################ if [[ ${EUID} -ne 0 ]] ; then echo "$0: must be root." exit 1 fi # Make sure our environment is sane if [[ ! -z "${MAKELINKS}" ]] ; then export MAKELINKS=0 else export MAKELINKS=1 fi export ROOT="${ROOT:=/}" [[ ${ROOT} == */ ]] || export ROOT="${ROOT}/" export ENVDIR="${ROOT}etc/env.d" mkdir -p ${ENVDIR} chmod 755 ${ENVDIR} specials=" KDEDIRS PATH CLASSPATH LDPATH MANPATH INFODIR INFOPATH ROOTPATH CONFIG_PROTECT CONFIG_PROTECT_MASK PRELINK_PATH PYTHONPATH PRELINK_PATH_MASK ADA_INCLUDE_PATH ADA_OBJECTS_PATH" colon_separated=" ADA_INCLUDE_PATH ADA_OBJECTS_PATH LDPATH PATH MANPATH ROOTPATH PRELINK_PATH PRELINK_PATH_MASK PYTHON_PATH" export LDSOCONF="${ROOT}etc/ld.so.conf" export PRELINKCONF="${ROOT}etc/prelink.conf" defaultprelinkpaths=":/bin:/sbin:/usr/bin:/usr/sbin:/lib:/usr/lib" export PROFILEENV="${ROOT}etc/profile.env" export CSHENV="${ROOT}etc/csh.env" # make sure we aren't tricked with previous 'my_envd_' variables unset $(set | grep '^my_envd_' | cut -d= -f1) ############################################ ############################################ # ENV.D PARSING ############################################ do_has() { local x local me="$1" shift for x in "$@" ; do [[ ${x} == ${me} ]] && return 0 done return 1 } has() { local ret local ifs="${IFS}" unset IFS do_has $1 ${!2} ret=$? export IFS="${ifs}" return ${ret} } is_special() { has $1 specials } is_colon_separated() { has $1 colon_separated } for envd in $(ls ${ENVDIR} | sort) ; do # make sure file is a vaild env'd entry and not a backup file num="${envd:0:2}" if [[ ! -z ${num//[0-9]} ]] ; then continue elif [[ ${envd} == *~ || ${envd} == *.bak ]] ; then continue fi # use bash to make sure the file is valid envd="${ENVDIR}/${envd}" if ! (source "${envd}") ; then echo "!!! Error parsing ${envd}!" exit 1 fi # parse env.d entries cnfvars="$(grep '^[[:alpha:]_][[:alnum:]_]*=' "${envd}")" export IFS=$'\n' for cnfv in ${cnfvars} ; do var="${cnfv/=*}" val="${cnfv:${#var}+1}" if [ "${val:0:1}" == "\"" ] ; then val="${val:1:${#val}-2}" fi myvar="my_envd_${var}" if is_special ${var} ; then if [[ ! -z "${!myvar}" ]] ; then if is_colon_separated ${var} ; then sep=":" else sep=" " fi else sep="" fi export ${myvar}="${!myvar}${sep}${val}" else export ${myvar}="${val}" fi done unset IFS done ############################################ ############################################ # LD.SO.CONF HANDLING ############################################ # create a : sep list from ld.so.conf export OLD_LDPATH="" if [ -s "${LDSOCONF}" ] ; then while read line ; do if [[ "${line:0:1}" == "#" ]] ; then continue fi export OLD_LDPATH="${OLD_LDPATH}:${line}" done < ${LDSOCONF} export OLD_LDPATH="${OLD_LDPATH:1}" fi # has the ldpath changed ? if so, recreate if [[ "${OLD_LDPATH}" != "${my_envd_LDPATH}" ]] ; then cat << EOF > ${LDSOCONF} # ld.so.conf autogenerated by env-update; make all changes to # contents of /etc/env.d directory ${my_envd_LDPATH//:/ } EOF fi ############################################ ############################################ # HANDLE PRELINK PATHS ############################################ if prelink --version >& /dev/null ; then # we assume LDPATH and PATH aren't empty ... if they were, we got other problems envdprelinkcheckpaths="${my_envd_LDPATH}:${my_envd_PATH}" if [[ ! -z "${my_envd_PRELINK_PATH}" ]] ; then envdprelinkcheckpaths="${envdprelinkcheckpaths}:${my_envd_PRELINK_PATH}" fi if [[ ! -z "${my_envd_PRELINK_PATH_MASK}" ]] ; then export prelink_mask=":${PRELINK_PATH_MASK}:" envdprelinkpaths="" export IFS=":" for dir in ${envdprelinkcheckpaths} ; do if [[ ${dir:0-1} == / ]] ; then noslashdir="${dir:0:${#dir}-1}" else dir="${dir}/" noslashdir="${dir}" fi if [[ ${prelink_mask/:${dir}:/} == ${prelink_mask} \ && ${prelink_mask/:${noslashdir}:/} == ${prelink_mask} ]] ; then envdprelinkpaths="${envdprelinkpaths}:${dir}" fi done unset IFS else envdprelinkpaths=":${envdprelinkcheckpaths}" fi cat << EOF > ${PRELINKCONF} # prelink.conf autogenerated by env-update; make all changes to # contents of /etc/env.d directory ${defaultprelinkpaths//:/ -l } ${envdprelinkpaths//:/ -h } EOF fi unset my_envd_LDPATH ############################################ ############################################ # RUN EXTERNAL PROGRAMS NOW ############################################ echo ">>> Regenerating ${ROOT}etc/ld.so.cache..." if [[ ${MAKELINKS} -eq 0 ]] ; then (cd / ; /sbin/ldconfig -X -r ${ROOT} >& /dev/null) else (cd / ; /sbin/ldconfig -r ${ROOT} >& /dev/null) fi cat << EOF > ${PROFILEENV} # THIS FILE IS AUTOMATICALLY GENERATED BY env-update. # DO NOT EDIT THIS FILE. CHANGES TO STARTUP PROFILES # GO INTO /etc/profile NOT /etc/profile.env $(set | grep '^my_envd_' | sed -e 's:^my_envd_:export :') EOF cat << EOF > ${CSHENV} # THIS FILE IS AUTOMATICALLY GENERATED BY env-update. # DO NOT EDIT THIS FILE. CHANGES TO STARTUP PROFILES # GO INTO /etc/csh.cshrc NOT /etc/csh.env $(set | grep '^my_envd_' | sed -e 's:^my_envd_\([[:alpha:]_][[:alnum:]_]*\)=:setenv \1 :') EOF