diff options
author | George Sherwood | 2008-10-21 15:29:13 -0500 |
---|---|---|
committer | George Sherwood | 2008-10-21 15:29:13 -0500 |
commit | 3f8edd3fc622e2a98f201f14a0529e3a3bfd4138 (patch) | |
tree | 074b1bd595198a9d54ad1d6d893e60a8fd423f38 /FUNCTIONS | |
parent | 619db77afefec7bbb038d49a46bd6a16bb6fd889 (diff) |
Added grimoire files from z-rejected.
Diffstat (limited to 'FUNCTIONS')
-rwxr-xr-x | FUNCTIONS | 617 |
1 files changed, 617 insertions, 0 deletions
diff --git a/FUNCTIONS b/FUNCTIONS new file mode 100755 index 0000000..979f710 --- /dev/null +++ b/FUNCTIONS @@ -0,0 +1,617 @@ +. $GRIMOIRE/libaccount +. $GRIMOIRE/libgcc + +#--------------------------------------------------------------------- +## Replaces sorcerys default_pre_build with a custom version using +## the invoke_gcc function from libgcc #10641 +#--------------------------------------------------------------------- +function default_pre_build () { + invoke_gcc && + real_default_pre_build +} + +#--------------------------------------------------------------------- +## @return 0 if glibc was compiled with NPTL +## @return 1 otherwise +## +## Detects if the current glibc includes NPTL support. +## +#--------------------------------------------------------------------- +function glibc_is_nptl () +{ + if getconf GNU_LIBPTHREAD_VERSION | grep -q NPTL; then + return 0 + fi + return 1 +} + +#--------------------------------------------------------------------- +# Runs update-desktop-database if it is installed +#--------------------------------------------------------------------- +function update_desktop_database () +{ + if test -x /usr/bin/update-desktop-database; then + message "${MESSAGE_COLOR}Updating application mime type database.${DEFAULT_COLOR}" + /usr/bin/update-desktop-database + fi +} + +#--------------------------------------------------------------------- +## this function installs the *.desktop, start* files and qingy links +## this function is intended to be used by spells for windowmanagers +#--------------------------------------------------------------------- +function install_wmfiles () +{ + local wm_desktopfile_dir="${INSTALL_ROOT}/usr/share/xsessions" + local wm_startwm_dir="${INSTALL_ROOT}/usr/bin" + + # install the start* file for the windowmanager if it's not + # installed already + if [ -f ${SCRIPT_DIRECTORY}/start${SPELL} ] ; then + if ! [ -e ${wm_startwm}/start${SPELL} ] ; then + install -m 755 ${SCRIPT_DIRECTORY}/start${SPELL} \ + ${wm_startwm_dir} + fi + fi + + # making sure the destination directory exists + if ! [ -d ${wm_desktopfile_dir} ] ; then + mkdir ${wm_desktopfile_dir} + fi && + + # install the windowmanagers desktop file + if [ -f ${SCRIPT_DIRECTORY}/${SPELL}.desktop ] ; then + if ! [ -e ${wm_desktopfile_dir}/${SPELL}.desktop ]; then + install -m 755 ${SCRIPT_DIRECTORY}/${SPELL}.desktop \ + ${wm_desktopfile_dir} + fi + fi + + if ( spell_ok qingy ); then + if [ -x ${wm_startwm_dir}/start${SPELL} ] ; then + if [ ! -d ${INSTALL_ROOT}/etc/qingy/xsessions ]; then + install -d -m 755 ${INSTALL_ROOT}/etc/qingy/xsessions + fi && + ln -s ${wm_startwm_dir}/start${SPELL} \ + ${INSTALL_ROOT}/etc/qingy/xsessions/${SPELL} + fi + fi +} + +#--------------------------------------------------------------------- +## Sets the current script to run only one make job +#--------------------------------------------------------------------- + +function make_single () +{ + JOBS_PER_HOST=0 && + MAKE_NJOBS=1 +} + +#--------------------------------------------------------------------- +## Re-enables the normal Sorcery make (cancels single_make) +#--------------------------------------------------------------------- + +function make_normal () +{ + source $COMPILE_CONFIG +} + +#--------------------------------------------------------------------- +## @param shellname +## @param full path to shell +## +## Adds a shell to /etc/shells and optionally to qingy's sessions +#--------------------------------------------------------------------- +function install_shell () +{ + local qingy_session_dir="${INSTALL_ROOT}/etc/qingy/sessions" + + if [ -z "$1" ] ; then + message "${PROBLEM_COLOR}no shell name specified, aborting${DEFAULT_COLOR}" + return 1 + fi && + if [ ! -e "$2" ] ; then + message "${PROBLEM_COLOR} $2 isn't executable, no use adding it as a shell${DEFAULT_COLOR}" + return 1 + fi && + + #installing shell into /etc/shells + message "installing $1 into /etc/shells" + if ! ( grep -q "^${2}$" ${INSTALL_ROOT}/etc/shells ) ; then + echo "$2" >> ${INSTALL_ROOT}/etc/shells + fi || return 1 + + #installing shell into qingy's session dir if it's installed + if ( spell_ok qingy ) && ! [ -f ${qingy_session_dir}/$1 ] ; then + message "installing $1 into $qingy_session_dir" + echo "$2" > ${qingy_session_dir}/$1 && + chmod 0755 ${qingy_session_dir}/$1 + fi +} + +#--------------------------------------------------------------------- +## @param shellname +## @param full path to shell +## +## Removes a shell from /etc/shells and optionally from qingy's sessions +#--------------------------------------------------------------------- +function remove_shell () +{ + local qingy_session_dir="${INSTALL_ROOT}/etc/qingy/sessions" + + if [ -z "$1" ] ; then + message "${PROBLEM_COLOR}no shell name specified, aborting${DEFAULT_COLOR}" + return 1 + fi && + if [ -z "$2" ] ; then + message "${PROBLEM_COLOR}no shell path specified, aborting${DEFAULT_COLOR}" + return 1 + fi && + + #removing shell from /etc/shells + if [ -f /etc/shells ] ; then + sedit "\:^$2$:d" /etc/shells + fi + + # and optionally from qingy's session dir + if [ -f ${qingy_session_dir}/$1 ] ; then + message "removing $1 from $qingy_session_dir" + rm -f ${qingy_session_dir}/$1 + fi +} + + +#--------------------------------------------------------------------- +## replacement for config_query_string to work around a short timeout +## when entering long strings (hostnames, organisation names) +#--------------------------------------------------------------------- +function config_query_long_string() { + local ANSWER + local DELAY=5 + if config_get_option "$1" ANSWER; then + # option allready answered in config + echo -e "[[ ${QUERY_COLOR}$2${DEFAULT} -> '${QUERY_COLOR}$ANSWER${DEFAULT}' ]]" + else + query_string ANSWER "$2" "$3" + read -t $DELAY -n 1 ANSWER_first + if [[ $ANSWER_first ]] ; then + read ANSWER_rest + fi + ANSWER="${ANSWER_first}${ANSWER_rest}" + config_set_option "$1" "$ANSWER" + fi + return 0 +} + +#--------------------------------------------------------------------- +## @param Directory with files we might want to install +## @param Destination directory (optional) +## +## Installs files to WWW_DEST ($INSTALL_ROOT/usr/share/www/$SPELL) and +## sets up proper www-data permissions +## Optionally the second parameter will override WWW_DATA (and make +## sure INSTALL_ROOT exists only once in the WWW_DATA) +#--------------------------------------------------------------------- +function install_www_files () +{ + if [ ! -z $2 ]; then + # + # Just in case the destination already includes INSTALL_ROOT, remove it + # + local WWW_DEST="$INSTALL_ROOT/${2/\$INSTALL_ROOT/}" + else + local WWW_DEST="$INSTALL_ROOT/usr/share/www/$SPELL" + fi && + + # + # Make sure WWW_DEST exists + # + if [ ! -d "$WWW_DEST" ]; then + if [ ! -d "${WWW_DEST/\/$SPELL/}" ]; then + mkdir -p "${WWW_DEST/\/$SPELL/}" && + chmod 0755 "${WWW_DEST/\/$SPELL/}" && + chown www-data:www-data "${WWW_DEST/\/$SPELL/}" + fi && + + mkdir -p "$WWW_DEST" && + chmod 0755 "$WWW_DEST" && + chown www-data:www-data "$WWW_DEST" + fi && + + # find $@ | while read file; do install ... $file ...; done + # find $1 -type -f | while read file; do + for www_file in `find $1 -type f`; do + if install_config_file "$www_file" "$WWW_DEST/$www_file"; then + chmod 0644 "$WWW_DEST/$www_file" && + chown www-data:www-data "$WWW_DEST/$www_file" + fi + done + # + # Warning message about new location for www files + # Remove around 2005-08-02 (one month in test, another in stable, supposedly) + # + message "${MESSAGE_COLOR}Your web files have been moved out of the" \ + "APACHE specific locations (apache2/htdocs, httpd/htdocs, etc.)" \ + "and into a shared, non-DocumentRoot $INSTALL_ROOT/usr/share/www" \ + "directory. You can modify your web server to point there for" \ + "these files now.${DEFAULT_COLOR}" +} + +#--------------------------------------------------------------------- +## Removes traces of NSPR and NSS from Mozilla-based software +## TODO move patch to a central place +#--------------------------------------------------------------------- +function mozilla_remove_nspr_nss() { + message 'Checking Mozilla source code...' && + [[ "$(basename $(pwd))" == mozilla ]] && + message 'Checking the spell...' && + [[ -f $SCRIPT_DIRECTORY/security_manager_makefile.diff ]] && + patch -p1 < $SCRIPT_DIRECTORY/security_manager_makefile.diff && + rm -fr dbm nsprpub security/nss && + # exclude DBM for top-level modules and don't build it + sedit 's@\<dbm\>@@g' Makefile.in && + sedit 's@\<dbm\>@@g' build/unix/modules.mk && + # don't define NSS libraries as dependencies and don't look for them in the tree + sedit 's@$(DIST)/lib/$(LIB_PREFIX)\(crmf\|dbm\|nss3\|softokn3\|smime3\|ssl3\)\.$(LIB_SUFFIX)@-l\1@g' config/config.mk && + sedit 's@NSS_DEP_LIBS\s*=@__undefine_\0@g' config/config.mk && + # align the makefile-s + find -name Makefile.in | while read __MAKEFILE; do + # use system NSPR's and NSS's headers + # option `--with-system-nspr' doesn't do it everywhere + sedit 's@-I\S*\(nss\|nspr\)\>@-I/usr/include/\1@g' $__MAKEFILE + done +} + +#--------------------------------------------------------------------------- +## Invokes the unamechange spell any spell that uses this should depend on +## unamechange otherwise this function does nothing. +## to use this function simply call then change the variables listed ro have +## any call to uname return that value +#-------------------------------------------------------------------------- +function invoke_uname_change() +{ + if [[ $(installed_version unamechange) ]] ; then + export UNAME_CHANGE_SYSNAME=$(uname -s) + export UNAME_CHANGE_NODENAME=$(uname -n) + export UNAME_CHANGE_RELEASE=$(uname -r) + export UNAME_CHANGE_VERSION=$(uname -v) + export UNAME_CHANGE_MACHINE=$(uname -m) + export UNAME_CHANGE_DOMAINNAME=$(uname -o) + + export LD_PRELOAD="${LD_PRELOAD} /usr/lib/unamechange.so" + fi +} + +#------------------------------------------------------------------------- +## Returns the state of the system back to normal after calling +## invoke_uname_change unset's all environmental vars and returns +## LD_PRELOAD back to normal +#------------------------------------------------------------------------- +function devoke_uname_change() +{ + if [[ $(installed_version unamechange) ]] ; then + unset UNAME_CHANGE_SYSNAME + unset UNAME_CHANGE_NODENAME + unset UNAME_CHANGE_RELEASE + unset UNAME_CHANGE_VERSION + unset UNAME_CHANGE_MACHINE + unset UNAME_CHANGE_DOMAINNAME + + export LD_PRELOAD="${LD_PRELOAD/\/usr\/lib\/unamechange.so/}" + fi +} + +#------------------------------------------------------------------------- +## Compatibility code for gracefully failing if the user uses an older +## version of sorcery with a spell that calls unpack_file. +#------------------------------------------------------------------------- +declare -f unpack_file &> /dev/null || +function unpack_file() { + message "This spell uses a function only available in sorcery 1.12.2 or newer, please update." + return 1 +} + +#------------------------------------------------------------------------- +## Default build for Python spell. +#------------------------------------------------------------------------- +function default_build_python() { + python setup.py build +} + +#------------------------------------------------------------------------- +## Default install for Python spell. +## INSTALL_ROOT is used here only if not empty, because some spells can't +## install with "--root '/'" option. +#------------------------------------------------------------------------- +function default_install_python() { + python setup.py install ${INSTALL_ROOT:+--root "$INSTALL_ROOT/"} +} + +#------------------------------------------------------------------------- +## Compatibility code for gracefully failing if the user uses an older +## version of sorcery with a spell that calls unpack_file. +#------------------------------------------------------------------------- +declare -f unpack_file &> /dev/null || +function unpack_file() { + message "This spell uses a function only available in sorcery 1.12.2 or newer, please update." + return 1 +} + +#------------------------------------------------------------------------- +## compatibility code for stable and test sorcery +## this should be removed when SMGL_COMPAT_ARCHS reaches stable sorcery +#------------------------------------------------------------------------- +if [[ -z $SMGL_COMPAT_ARCHS ]] ; then + local SPECFILE + local specdir + for specdir in ${ARCH_SPECS[@]} ; do + SPECFILE=$(find -L ${specdir} -perm -400 -type f -name "$ARCHITECTURE" -print -quit 2>/dev/null); + [ $SPECFILE ] && break + done + explode "${SPECFILE#$specdir/}" '/' SMGL_COMPAT_ARCHS + + unset ARCHITECTURE + # Reverse the array so that the most specific arch is first + j=0 + for(( i=${#SMGL_COMPAT_ARCHS[@]}-1; i>=0; i--)) ; do + ARCHITECTURE[j++]=${SMGL_COMPAT_ARCHS[i]} + done +fi + + +#--- +## disable_pic +## A function to smartly disable -DPIC and -fPIC flags +## has one optional parameter: force which forces disable +#--- + +disable_pic() { + if [[ "${SMGL_COMPAT_ARCHS[1]}" != "x86_64" ]] && + [[ "${SMGL_COMPAT_ARCHS[1]}" != "alpha" ]] || + [[ "$1" == "force" ]] + then + CFLAGS=${CFLAGS/-fPIC} && + CFLAGS=${CFLAGS/-DPIC} && + CXXFLAGS=${CXXFLAGS/-fPIC} && + CXXFLAGS=${CXXFLAGS/-DPIC} + fi +} +# +## Function to check if we're using xorg-modular libs or not +# + +function check_if_xorg_modular_libs() +{ + if [[ "$(get_spell_provider ${1:-$SPELL} X11-LIBS)" == "xorg-server" ]] || + [[ "$(get_spell_provider ${1:-$SPELL} X11-LIBS)" == "xorg-libs" ]] + then + return 0 + fi + return 1 +} + +# +## Function to check if we're using xorg-modular server or not +# + +function check_if_xorg_modular_server() +{ + if [[ "$(get_spell_provider ${1:-$SPELL} X11-SERVER)" == "xorg-server" ]] + then + return 0 + fi + return 1 +} + +#--- +## @Synopsis a parse_iw clone function +#--- + +function grimoire_parse_iw() { + local INPUT=$1 + + # it is EXTREMELY IMPORTANT that this variable contains an actual + # tab character and not some number of spaces. Otherwise BAD THINGS + # will happen. + local TAB=" " + OMIT_IN="${TAB}rename\|${TAB}symlink\|${TAB}unlink" + + grep -v "$OMIT_IN" $INPUT | cut -f3 | grep "^/" + cat $INPUT | cut -f4 | grep "^/" +} + +#--- +## @Synopsis an exists clone function +#--- +function grimoire_exists() { + while read ITEM; do [ -e "$ITEM" ] && echo "$ITEM"; done; +} + +#--- +## @Synopsis default_games_build function to replace +## @Synopsis all the duplication of the same stuff in games-grimoire +#--- + +function default_games_build() { + OPTS="$OPTS --bindir=${INSTALL_ROOT}/usr/games \ + --datadir=${INSTALL_ROOT}/usr/share/games \ + --localstatedir=${INSTALL_ROOT}/var/games" && + default_build +} + +#--- +## @Synopsis A function to find all dirs and files and set them to +## @Synopsis proper permissions. +#--- + +function find_and_scam() { + find ./ -type d -print0 | xargs -r -0 -n 1 chmod 0750 + find ./ -type d -print0 | xargs -r -0 -n 1 chown root:games + find ./ -type f -print0 | xargs -r -0 -n 1 chmod 0640 + find ./ -type f -print0 | xargs -r -0 -n 1 chown root:games +} + +#--- +## @Synopsis games_make_proper_binary function to make all +## @Synopsis binaries in /usr/games chown root:games and +## @Synopsis chmod 0750. +#--- + +function games_make_proper_binary() { +if grep -q "usr/games/" $IW_LOG > /dev/null 2>&1 +then + grimoire_parse_iw $IW_LOG | grimoire_exists | sort | grep "usr/games/" | xargs -r -n 1 chmod -f 0750 + grimoire_parse_iw $IW_LOG | grimoire_exists | sort | grep "usr/games/" | xargs -r -n 1 chown -f root:games +elif [[ $STAGED_INSTALL == on ]] +then + echo "doing the stage root thing" + find $STAGE_DIRECTORY/TRANSL/ | sed "s#$STAGE_DIRECTORY/##" | grep '^TRANSL/usr/games' | xargs -r -n 1 chmod -f 0750 + find $STAGE_DIRECTORY/TRANSL/ | sed "s#$STAGE_DIRECTORY/##" | grep '^TRANSL/usr/games' | xargs -r -n 1 chown -f root:games +else +message "${QUERY_COLOR}If you see this message and you're not \n \ +installing a data spell then report this at the following url: \n \ +http://bugs.sourcemage.org/enter_bug.cgi?product=Codex&bug_status=NEW&version=games%20grimoire&component=games%20grimoire&re +p_platform=Other&op_sys=other&priority=P2&bug_severity=minor&assigned_to=games%40sourcemage.org&cc=&bug_file_loc=http%3A%2F% +2F&short_desc=${SPELL}%20not%20installing%20binaries%20properly&comment=&dependson=&blocked=9312&maketemplate=Remember%20val +ues%20as%20bookmarkable%20template&form_name=enter_bug \ +${DEFAULT_COLOR}" +fi +} + +#--- +## @Synopsis default_games_post_install function to +## @Synopsis clean out any empty share/games/SPELL dirs +## @Synopsis clean out any empty gather docs dirs +## @Synopsis and run the real_default_post_install afterwards +#--- + +function default_games_post_install() { + games_make_proper_binary && + if [[ $STAGED_INSTALL == on ]]; then + rmdir --ignore-fail-on-non-empty ${STAGE_DIRECTORY}/TRANSL/usr/share/games/${SPELL} && + rmdir --ignore-fail-on-non-empty ${STAGE_DIRECTORY}/TRANSL/usr/share/games && + rmdir --ignore-fail-on-non-empty ${STAGE_DIRECTORY}/TRANSL/usr/share/doc/${SPELL} && + rmdir --ignore-fail-on-non-empty ${STAGE_DIRECTORY}/TRANSL/usr/share/doc && + rmdir --ignore-fail-on-non-empty ${STAGE_DIRECTORY}/TRANSL/usr/share + else + rmdir --ignore-fail-on-non-empty ${INSTALL_ROOT}/usr/share/games/${SPELL} && + rmdir --ignore-fail-on-non-empty ${INSTALL_ROOT}/usr/share/games && + rmdir --ignore-fail-on-non-empty ${INSTALL_ROOT}/usr/share/doc/${SPELL} && + rmdir --ignore-fail-on-non-empty ${INSTALL_ROOT}/usr/share/doc && + rmdir --ignore-fail-on-non-empty ${INSTALL_ROOT}/usr/share + fi + real_default_post_install +} + +#------------------------------------------------------------------------- +## Print the version of the running kernel. +#------------------------------------------------------------------------- +function get_running_kernel_version() +{ + # Try the proc interface first because it returns the version of the + # running kernel even when unamechange is invoked. + [[ -f /proc/sys/kernel/osrelease ]] && cat /proc/sys/kernel/osrelease || + uname -r +} + +#------------------------------------------------------------------------- +## Print the version of the installed linux spell or, lacking that, "-1". +## This is just a wrapper for 'installed_version linux' with the exception +## that this will always print something and not return false. +#------------------------------------------------------------------------- +function get_sorcery_kernel_version() +{ + installed_version linux || echo "-1" +} + +#------------------------------------------------------------------------- +## Print the version of the kernel defined in USE_KERNEL_VERSION or, +## lacking that, the version of either the installed linux spell or the +## running kernel. +#------------------------------------------------------------------------- +function get_kernel_version() +{ + if [[ $USE_KERNEL_VERSION ]] + then + echo "$USE_KERNEL_VERSION" + else + installed_version linux || get_running_kernel_version + fi +} + +#----------------------------------------------------------------------- +## Print the kernel config status of the running kernel for the option +## defined in $1. +## If a configure file is found print the requested config status (if +## any) and return 0, otherwise return 1. +#----------------------------------------------------------------------- +function get_running_kernel_config() +{ + if [[ -f /proc/config.gz ]] + then + zgrep "^$1=" /proc/config.gz | cut -d= -f2 + else + local KVER="$(get_running_kernel_version)" + if [[ -f "/boot/config-$KVER" ]] + then + grep "^$1=" "/boot/config-$KVER" | cut -d= -f2 + elif [[ -f "/usr/src/linux-$KVER/.config" ]] + then + grep "^$1=" "/usr/src/linux-$KVER/.config" | cut -d= -f2 + else + return 1 + fi + fi +} + +#----------------------------------------------------------------------- +## Print the kernel config status of the installed linux spell for the +## option defined in $1. +## If the linux spell is installed and a configure file is found print +## the requested config status (if any) and return 0, otherwise return +## 1. +#----------------------------------------------------------------------- +function get_sorcery_kernel_config() +{ + local KVER="$(installed_version linux)" + if [[ $KVER ]] + then + if [[ -f "/boot/config-$KVER" ]] + then + grep "^$1=" "/boot/config-$KVER" | cut -d= -f2 + elif [[ -f "/usr/src/linux-$KVER/.config" ]] + then + grep "^$1=" "/usr/src/linux-$KVER/.config" | cut -d= -f2 + else + return 1 + fi + else + return 1 + fi +} + +#----------------------------------------------------------------------- +## Print the kernel config status for the option defined in $1 from the +## kernel defined in USE_KERNEL_VERSION or, lacking that, from either +## the installed linux spell or the running kernel. +## If a configure file is found print the requested config status (if +## any) and return 0, otherwise return 1. +#----------------------------------------------------------------------- +function get_kernel_config() +{ + if [[ $USE_KERNEL_VERSION ]] + then + if [[ -f "/boot/config-$USE_KERNEL_VERSION" ]] + then + grep "^$1=" "/boot/config-$USE_KERNEL_VERSION" | cut -d= -f2 + elif [[ -f "/usr/src/linux-$USE_KERNEL_VERSION/.config" ]] + then + grep "^$1=" "/usr/src/linux-$USE_KERNEL_VERSION/.config" | cut -d= -f2 + else + return 1 + fi + else + get_sorcery_kernel_config "$1" || get_running_kernel_config "$1" + fi +} |