. $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@\@@g' Makefile.in && sedit 's@\@@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 } #------------------------------------------------------------------------- ## Returns the kernel version checks linux then linux-new (for now) and ## then uname for the kernel version #------------------------------------------------------------------------- function get_kernel_version() { local KVER=$(installed_version linux) if [[ $KVER ]] ; then echo $KVER else KVER=$(installed_version linux-new) if [[ $KVER ]] ; then echo $KVER else KVER=$(grep version /usr/src/linux/.config | cut -d: -f2 | cut -d ' ' -f2) if [ $KVER ] && [ -d "/lib/modules/${KVER}/build" ] ; then echo $KVER else KVER=$(uname -r) echo $KVER fi fi fi } #--------------------------------------------------------------------------- ## 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 } #----------------------------------------------------------------------- ## Get the kernel config status of the kernel option specified by $2. ## Kernel version is given by $1. ## ## If a configure file is found print the requested config status (if ## any) and return 0, otherwise return 1. ##----------------------------------------------------------------------- function get_kernel_config_ver() { local i for i in /proc/config /boot/config-"$1" /lib/modules/"$1"/build/.config do if [ -f "$i" ]; then cat "$i" && break elif [ -f "$i.gz" ]; then zcat "$i.gz" && break elif [ -f "$i.bz2" ]; then bzcat "$i.bz2" && break elif [ -f "$i.xz" ]; then xzcat "$i.xz" && break elif [ -f "$i.lzma" ]; then xzcat "$i.lzma" && break fi done | grep "^$2=" | awk -F= '{ if ($2) { print $2 }; exit (!$2) }' } #----------------------------------------------------------------------- ## Get the running kernel config status of the running kernel option ## given by $1. ## ## See also: get_specified_kernel_config #----------------------------------------------------------------------- function get_running_kernel_config() { get_kernel_config_ver $(get_running_kernel_version) "$1" } #------------------------------------------------------------------------- ## Get the config status of some part of the kernel sorcery says is ## installed. Used by spells that have linux triggers. ## ## $1 string Config var to look for #------------------------------------------------------------------------- function get_sorcery_kernel_config() { get_kernel_config_ver $(get_kernel_version) || echo "-1" } #------------------------------------------------------------------------- ## 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]}" != "em64t" ]] && [[ "${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 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 get_kernel_config_ver "$KVER" "$1" 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 get_kernel_config_ver "$USE_KERNEL_VERSION" "$1" else get_sorcery_kernel_config "$1" || get_running_kernel_config "$1" fi }