diff options
author | Sérgio Almeida <mephx@thedude.(none)> | 2009-06-17 18:45:31 +0100 |
---|---|---|
committer | Sérgio Almeida <mephx@thedude.(none)> | 2009-06-17 18:45:31 +0100 |
commit | 5e561c1bb476977119fb947a4e21fe6dd4e3c314 (patch) | |
tree | edc9261465523b884f869145aa97a0b7dd9ccd2b /modules | |
download | uselect-5e561c1bb476977119fb947a4e21fe6dd4e3c314.tar.gz uselect-5e561c1bb476977119fb947a4e21fe6dd4e3c314.tar.bz2 uselect-5e561c1bb476977119fb947a4e21fe6dd4e3c314.zip |
Initial Universal Select Tool Commit
Diffstat (limited to 'modules')
-rw-r--r-- | modules/env.uselect | 325 | ||||
-rw-r--r-- | modules/gcc.uselect | 41 | ||||
-rw-r--r-- | modules/kernel.uselect | 24 | ||||
-rw-r--r-- | modules/one.uselect | 44 | ||||
-rw-r--r-- | modules/python.uselect | 21 |
5 files changed, 455 insertions, 0 deletions
diff --git a/modules/env.uselect b/modules/env.uselect new file mode 100644 index 0000000..effed56 --- /dev/null +++ b/modules/env.uselect @@ -0,0 +1,325 @@ +# Copyright 1999-2009 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# env.uselect mephx.x@gmail.com + +module env { + description "Manage environment variables set in /etc/env.d/" + version "0.1" + author "mephx.x@gmail.com" +} env + + +user action update + description "Collect environment variables from all scripts in /etc/env.d/" + parameters "<makelinks> <noldconfig>" + options { + "makelinks : Specify \"makelinks\" to force updating of links" + "noldconfig : Do not alter the ld.so cache or configuration." + } + type runnable + + file env-update.bash { + #!/bin/bash + # Classes of env-vars + + source /usr/share/eselect/libs/tests.bash + source /usr/share/eselect/libs/core.bash + source /usr/share/eselect/libs/path-manipulation.bash + + source /usr/share/eselect/libs/config.bash + source /usr/share/eselect/libs/multilib.bash + + SPACE_CLASS="CONFIG_PROTECT + CONFIG_PROTECT_MASK" + PATH_CLASS="ADA_INCLUDE_PATH + ADA_OBJECT_PATH + CLASSPATH + INFODIR + INFOPATH + KDEDIRS + LDPATH + MANPATH + PATH + PKG_CONFIG_PATH + PRELINK_PATH + PRELINK_PATH_MASK + PYTHONPATH + ROOTPATH" + + # Recognized file formats: + MIME_WHITELIST="text/plain text/x-makefile" + + # Configuration files + ENVPROFILE="${ROOT}/etc/profile.env" + LDCONFIG="${ROOT}/etc/ld.so.conf" + PRELINK="${ROOT}/etc/prelink.conf" + LDMTIMEDB="${ROOT}/var/lib/eselect/env/ld-mtimedb" + + # Keep all stored LDPATHS + ESELECT_LDPATH=( ) + + # is_envd_file() + # Return successfuly when file can be sourced. + is_envfile() { + local mime envfile=${1} + + # Make sure it is a file and no backup file + [[ -f ${envfile} ]] || return 1 + [[ -n ${envfile##*~} ]] || return 1 + [[ ${envfile##*.} != bak ]] || return 1 + + mime=$(POSIXLY_CORRECT=1 file -i ${envfile} \ + | cut -d ' ' -f 2 | sed -e 's/;$//') + if ! has ${mime} ${MIME_WHITELIST} ; then + echo "Skipping non-text file ${envfile}." + return 1 + fi + + return 0 + } + + # update_envvar_classes() + # Update the contents of *_CLASS based on env,d files. + update_envvar_classes() { + local -a envfiles + local value + envfiles=( ${ROOT}/etc/env.d/* ) + + for envfile in ${envfiles[@]} ; do + is_envfile ${envfile} || continue + + value=$(load_config ${envfile} COLON_SEPARATED) + for x in ${value} ; do + has ${x} ${PATH_CLASS} && continue + PATH_CLASS="${PATH_CLASS} ${x}" + done + + value=$(load_config ${envfile} SPACE_SEPARATED) + for x in ${value} ; do + has ${x} ${SPACE_CLASS} && continue + SPACE_CLASS="${SPACE_CLASS} ${x}" + done + done + } + + # create_profile_env() + # Create profile.env file + create_profile_env() { + local -a envfiles + local vars store items tmpprofile + envfiles=( ${ROOT}/etc/env.d/* ) + + # Blank the file first! + tmpprofile="$(mktemp ${ROOT}/tmp/profile.XXXXXX)" + [[ $? = 0 ]] || die "Couldn't create temporary file!" + + # Gather ye classes while ye may! + update_envvar_classes + + # Parse all files in env.d + for envfile in ${envfiles[@]} ; do + is_envfile ${envfile} || continue + + # Which vars are to be loaded? + # TODO: Change to bash magic? + vars=$(sed \ + -e '/^#/d' -e '/^\s*$/d' -e '/^.*=/s/^\([^=]*\)=.*/\1/' \ + ${envfile}) + [[ -z ${vars} ]] && continue + for var in ${vars} ; do + # Colon separated?... + if has ${var} ${PATH_CLASS} ; then + store=$(load_config ${tmpprofile} ${var}) + if [[ -z ${store} ]] ; then + store=$(load_config ${envfile} ${var}) + else + items="$(load_config ${envfile} ${var})" + items=( ${items//:/ } ) + for item in ${items[@]} ; do + has ${item} ${store//:/ } && continue + store="${store}:${item}" + done + fi + store_config ${tmpprofile} ${var} "${store#:}" + continue + fi + # Space separated!... + if has ${var} ${SPACE_CLASS} ; then + store=( $(load_config ${tmpprofile} ${var}) ) + if [[ -z ${store[@]} ]] ; then + store=( $(load_config ${envfile} ${var}) ) + else + items=( $(load_config ${envfile} ${var}) ) + for item in ${items[@]} ; do + has ${item} ${store[@]} && continue + store=( ${store[@]} ${item} ) + done + fi + store_config ${tmpprofile} ${var} "${store[@]}" + continue + fi + # Ok, just a non-cummultative var. + store_config \ + ${tmpprofile} \ + ${var} \ + "$(load_config ${envfile} ${var})" + done + + has LDPATH ${vars} || continue + # Store LDPATH for later processing + items=$(load_config ${envfile} LDPATH) + items=( ${items//:/ } ) + for item in ${items[@]} ; do + has ${item} ${LDPATH[@]} && continue + ESELECT_LDPATH=( ${ESELECT_LDPATH[@]} ${item} ) + done + done + + # Move new file onto old one + ENVPROFILE=$(canonicalise ${ENVPROFILE}) + chmod a+r ${tmpprofile} + mv ${tmpprofile} ${ENVPROFILE} \ + || die "Couldn't move ${tmpprofile} to ${ENVPROFILE}!\n + Original profile.env remains unchanged." + } + + # create_ld_so_conf() + # Create ld.so.conf file based upon gathered LDPATHs + create_ld_so_conf() { + [[ -z ${ESELECT_LDPATH[@]} ]] && die -q 'No LDPATHs found in ${ROOT}/etc/env.d/*' + + local str + str="# ld.so.conf autogenerated by eselect\n" + str="${str}# Make all changes to /etc/env.d files\n" + for x in ${ESELECT_LDPATH[@]} ; do + str="${str}${x}\n" + done + echo -e "${str}" > $(canonicalise ${LDCONFIG}) + } + + # create_prelink_conf() + # Create prelink.conf file based upon existing profile.env + create_prelink_conf() { + [[ -z ${ESELECT_LDPATH[@]} ]] && die -q 'No LDPATHs found in ${ROOT}/etc/env.d/*' + local str + str="# prelink.conf autogenerated by eselect\n" + str="${str}# Make all changes to /etc/env.d files\n" + # Add default items + for x in /bin /sbin /usr/bin /usr/sbin ; do + str="${str}-l ${x}\n" + done + for x in $(list_libdirs) ; do + [[ -e ${ROOT}/${x} ]] && str="${str}-l /${x}\n" + [[ -e ${ROOT}/usr/${x} ]] && str="${str}-l /usr/${x}\n" + done + prelink_mask=$(load_config ${ENVPROFILE} PRELINK_PATH_MASK) + prelink_mask=( ${prelink_mask//:/ } ) + prelink="$(load_config ${ENVPROFILE} PATH)" + prelink="${prelink} $(load_config ${ENVPROFILE} PRELINK_PATH)" + prelink=( ${prelink//:/ } ${ESELECT_LDPATH[@]} ) + for x in ${prelink[@]} ; do + has ${x} ${prelink_mask} && continue + [[ -z ${x##*/} ]] || x="${x}/" + str="${str}-h ${x}\n" + done + for x in ${prelink_mask[@]} ; do + str="${str}-b ${x}\n" + done + echo -e "${str}" > $(canonicalise ${PRELINK}) + } + + # need_links() + # Returns true if any item of ${LDPATH} has been modified. + need_links() { + local ret=1 + for x in ${ESELECT_LDPATH[@]} ; do + y=${x//\//_} + y=${y//-/_} + y=${y//./_} + y=${y//+/_} + oldmtime=$(load_config ${LDMTIMEDB} "mtime${y}") + newmtime=$(stat -c %Y ${x} 2> /dev/null) + if [[ ${oldmtime} != ${newmtime} ]] ; then + ret=0 + store_config ${LDMTIMEDB} "mtime${y}" ${newmtime} + fi + done + return ${ret} + } + + # update_ldcache() + # Update ld.so.cache using ldconfig + update_ldcache() { + case $(uname -s) in + FreeBSD | DragonFly) + echo "Regenerating ${ROOT}/var/run/ld-elf.so.hints..." + ( + cd / + ldconfig -elf -i -f "${ROOT:-/}var/run/ld-elf.so.hints" \ + "${ROOT:-/}etc/ld.so.conf" + ) + ;; + *) + echo "Regenerating ${ROOT}/etc/ld.so.cache..." + ( + cd / + ldconfig ${1} -r ${ROOT:-/} + ) + ;; + esac + } + + ### update action + + + + + do_update() { + local makelinks ldconfig=1 + while [[ ${#@} -gt 0 ]] ; do + case ${1} in + makelinks) + makelinks="-X" + ;; + noldconfig) + ldconfig=0 + ;; + *) + die -q "Unknown option '${1}'" + ;; + esac + shift + done + + if [[ -e ${ROOT}/etc/profile.env ]] ; then + [[ -w ${ROOT}/etc/profile.env ]] \ + || die -q "You need to be root!" + else + touch ${ROOT}/etc/profile.env + fi + + # Create configuration files + create_profile_env + if [[ ${ldconfig} == 1 ]] ; then + create_ld_so_conf + [[ -e ${ROOT}/usr/sbin/prelink ]] && create_prelink_conf + need_links && makelinks="-X" + update_ldcache ${makelinks} + fi + + # fix up ${ENVPROFILE} + cp ${ENVPROFILE} ${ENVPROFILE/.env/.csh} + sed -i \ + -e "s/^\(.*\)=\"\(.*\)\"/export \1='\2'/" \ + $(canonicalise ${ENVPROFILE}) + sed -i \ + -e "s/^\(.*\)=\"\(.*\)\"/setenv \1 '\2'/" \ + $(canonicalise ${ENVPROFILE/.env/.csh}) + } + + do_update $@ + + } env-update.bash +} update + +# vim: ft=eselect diff --git a/modules/gcc.uselect b/modules/gcc.uselect new file mode 100644 index 0000000..10a1fad --- /dev/null +++ b/modules/gcc.uselect @@ -0,0 +1,41 @@ +module gcc{ + description "GCC Version Switcher" + version "0.1" + author "mephx.x@gmail.com" +} gcc + +system action profile { + description "Change GCC's /usr/bin/gcc Version" + type runnable + parameters "<target>" + usage "<target> Target GCC profile." + file moo.bash { + #!/bin/bash + do_moo() { + if [ -z $1 ] + then + gcc-config -l + else + gcc-config $@ + fi + } + do_moo $@ + } moo.bash +} profile + +system action bin { + description "Print path where binaries of the given/current profile are located." + type runnable + file moo.bash { + #!/bin/bash + do_moo() { + if [ -z $1 ] + then + gcc-config -B + else + gcc-config -B + fi + } + do_moo $@ + } moo.bash +} bin diff --git a/modules/kernel.uselect b/modules/kernel.uselect new file mode 100644 index 0000000..646730a --- /dev/null +++ b/modules/kernel.uselect @@ -0,0 +1,24 @@ +# Copyright 1999-2009 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# kernel.uselect mephx.x@gmail.com + +module kernel { + description "Kernel Switcher" + version "0.1" + author "mephx.x@gmail.com" +} kernel + +system action src { + description "Change current kernel source target" + type sym + sym linux /usr/src/linux /usr/src/ (.*)-(.*$) * +} src + +system action boot { + description "Change current kernel boot target" + type sym + sym vmlinuz /boot/vmlinuz /boot/ vmlinuz-(.*$) * +} boot + + + diff --git a/modules/one.uselect b/modules/one.uselect new file mode 100644 index 0000000..91e3709 --- /dev/null +++ b/modules/one.uselect @@ -0,0 +1,44 @@ +# Copyright 1999-2009 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# one.uselect mephx.x@gmail.com + +module one { + description "Example Module description" + version "0.2" + author "mephx.x@gmail.com" +} one + +user action moo { + description "Example Module will moo for any user" + parameters "<integer>" + usage "<integer> - number of moos" + type runnable + file moo.bash { + #!/bin/bash + do_moo() { + if [ -z $1 ] + then + # print options + echo "1 - moo one time" + echo "2 - moo two times" + echo "3 - moo three times" + echo "x - moo x times" + else + for((i=0;$i<$1;i=$(($i+1))));do + echo moo + done + fi + } + do_moo $@ + } moo.bash +} moo + +system action foo { + description "Example Simple symlinking Action" + usage "moo <option>" + type sym + sym /usr/moo /usr/share/ moo-(\w+) /bin/moo +} foo + + + diff --git a/modules/python.uselect b/modules/python.uselect new file mode 100644 index 0000000..79df588 --- /dev/null +++ b/modules/python.uselect @@ -0,0 +1,21 @@ +# Copyright 1999-2009 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# python.uselect mephx.x@gmail.com + +module python { + description "Python Version Switcher" + version "0.1" + author "mephx.x@gmail.com" +} python + +user action bin { + description "Change Python's Version" + type sym + sym python /usr/bin/python /usr/bin/ python([0-9]+\.[0-9]+$) * +} bin + +system action config { + description "Change Python's /usr/bin/python-config Version" + type sym + sym python /usr/bin/python-config /usr/bin/ python([0-9]+\.[0-9]+)-config($) * +} config |