#!/bin/bash ####################################### # Inspiration from bug #34921 # Thanks to Paul Varner # Distributed under the GPL v2 # Written by John Mylchreest (johnm@gentoo.org) # Copyright Gentoo Linux R_VERSION="0.1" R_MODULES="${ROOT}/usr/share/module-rebuild/moduledb" R_PORTAGEQ="`which portageq 2>/dev/null`" [[ -n ${R_PORTAGEQ} ]] && R_PORTDIR=`${R_PORTAGEQ} portdir` if [[ -z ${R_PORTDIR} ]]; then echo "** FATAL: Unable to find portdir." exit 1 fi package_valid() { local package=${1} [[ -z ${package} ]] && return 1 [[ -z ${package/*\/*} ]] && return 0 || return 1 } package_valid_strict() { local package=${1} package_valid ${package} && [[ -z ${package//*-[0-9]*} ]] && return 0 || return 1 } package_exists() { local package=${1} package=${package//-[0-9]*} if $(${R_PORTAGEQ} has_version / ${package}); then return 0 else return 1 fi } db_module_exists() { local line package=${1} for line in `<${R_MODULES}`; do [[ -z ${line/*${package}*} ]] && return 0 done return 1 } db_module_toggle() { local package=${1} toggleto=${2} togglefrom line if db_module_exists ${package}; then line=`grep ${package} ${R_MODULES}` togglefrom=${line#*:} togglefrom=${togglefrom/:*} [[ -z ${toggleto} ]] && [[ ${togglefrom} = 0 ]] && toggleto=1 || toggleto=0 echo "** Setting ${package}; rebuild=${toggleto}." sed -ie "s:\(.\:\)\([01]\)\(\:${package}\):\1${toggleto}\3:g" ${R_MODULES} else echo "** ${package} not found in moduledb." fi } db_module_add() { local package=${1} if db_module_exists ${package}; then echo "** Module already exists in moduledb." db_module_toggle ${package} 1 return 0 else if package_exists ${package}; then echo "** Adding ${package} to moduledb." echo "m:1:${package}" >> ${R_MODULES} return 0 else echo "** Unable to locate an available ebuild for ${package}." echo "** Please manually emerge ${package} first." fi fi return 1 } db_module_del() { local package=${1} if db_module_exists ${package}; then echo "** Removing ${package} from moduledb." sed -ie "/.*${package/\//\\/}.*/d" ${R_MODULES} return 0 else echo "** ${package} not found in moduledb." return 1 fi } db_module_list() { local line autoload pkg a=0 b=0 for line in `<${R_MODULES}`; do mode=${line:0:1} pkg=${line#*:} autoload=${pkg/:*} pkg=${pkg/*:} package_valid_strict ${pkg} && pkg="=${pkg}" if [[ ${autoload} = 1 ]]; then tomerge[${a}]=${pkg} a=$((${a} + 1)) else toignore[${b}]=${pkg} b=$((${b} + 1)) fi done pkg="${tomerge[@]}${toignore[@]}" if [[ -z ${pkg} ]]; then echo "** There are no known modules. Quitting." exit 1 fi echo "** Packages which I will emerge are:" for pkg in ${tomerge[@]}; do echo -e "\t${pkg}" done echo "** Packages which I will ignore are:" for pkg in ${toignore[@]}; do echo -e "\t${pkg}" done } db_module_merge() { local i pad echo "** Preparing to merge modules:" db_module_list >/dev/null echo "** Packages which I will emerge are:" for pkg in ${tomerge[@]}; do echo -e "\t${pkg}" done for((i=1;i<6;i++)); do echo -n "$((6 - ${i})) " sleep 1 done emerge ${tomerge[@]} } phelp() { cat << EOF module-rebuild action [category/package] Version: ${R_VERSION} Where action is one of: add - Add package to moduledb. del - Delete a package from moduledb. toggle - Toggle auto-rebuild of Package. list - List packages to auto-rebuild. rebuild - Rebuild packages. EOF } if [[ `id -u` != 0 ]]; then echo "This application must be ran as root." exit 1 fi if [[ ! -f ${ROOT}/usr/share/module-rebuild/moduledb ]]; then [[ ! -d ${ROOT}/usr/share/module-rebuild/ ]] && mkdir ${ROOT}/usr/share/module-rebuild/ touch ${ROOT}/usr/share/module-rebuild/moduledb fi check_validity() { local package=${1} strict=${2:-0} ret=1 [[ ${strict} = 0 ]] && package_valid ${package} && ret=0 [[ ${strict} = 1 ]] && package_valid_strict ${package} && ret=0 if [[ ${ret} != 0 ]]; then echo "** Please pass the fully qualified package. For example:" echo "** media-video/nvidia-kernel-1.0.7174" exit 1 fi } method="${1}" case ${method} in add) check_validity ${2} 1; db_module_add ${2};; del) check_validity ${2}; db_module_del ${2};; toggle) check_validity ${2}; db_module_toggle ${2};; list) db_module_list;; rebuild) db_module_merge;; *) phelp;; esac