понедельник, 2 апреля 2012 г.

dkms-2

Перепилил предыдущий вариант
теперь проверяются и версии модулей
да, базу надо будет пересоздать, т.к. формат несколько изменился

#!/bin/bash

. /etc/init.d/functions.sh

DKMS_DB="/var/lib/portage/dkms_db"
KERNEL="$(uname -r)"

case ${1} in

--check ) check(){
  if [ -f "${DKMS_DB}" ];then
 while read PKG MOD PKG_FILE;do
   MOD_FILE="/lib/modules/${KERNEL}/${MOD}"
   if [ -f "${MOD_FILE}" ];then
  MOD_VER="$( modinfo "${MOD_FILE}" | awk '/^version/ {print $2}' )"
  PKG_VER="$( modinfo "${PKG_FILE}" | awk '/^version/ {print $2}' )"
  if [ "${PKG_VER}" != "${MOD_VER}" ];then
    FAILED+=" ${PKG}" 
    echo "${MOD#*/}" && eend 1
  else
    echo "${MOD#*/}" && eend 0
  fi
   else
  FAILED+=" ${PKG}" 
  echo "${MOD#*/}" && eend 1
   fi
 done < ${DKMS_DB}
 if [ -n "${FAILED}" ];then
   eselect kernel set linux-${KERNEL}
   emerge -1 $(echo -e "${FAILED// /\n}" | sort -u) && rm -f /var/tmp/dkms_failed || touch /var/tmp/dkms_failed
 fi
  else
 echo -e "dkms_db not found!\nyou need run:\ndkms-gentoo --db" && return 1
  fi
 }
check;;

--db ) db_rebuild(){
  DB="/var/db/pkg/"
  TARGETS="$(grep "/lib/modules/.*.ko\>" ${DB}*/*/CONTENTS)"

  while read line;do
 MODULE="$(awk '{print $2}' <<< ${line})"
 KO="${MODULE#/*/*/*/}"
 PKG_FULL="${line%/CONTENTS*}"
 export "$(bzgrep "declare -x CATEGORY=" ${PKG_FULL}/environment.bz2 | awk '{print $3}')"
 export "$(bzgrep "declare -x PN=" ${PKG_FULL}/environment.bz2 | awk '{print $3}')"
 DATA+="${CATEGORY//'"'/}/${PN//'"'/} ${KO} ${MODULE}\n"
  done <<< "${TARGETS}"

  echo -e "${DATA%\\n}" | column -t > ${DKMS_DB}
  }
db_rebuild;;

--list )
  if [ -f "${DKMS_DB}" ];then
 awk '{print $1,$2}' ${DKMS_DB} | column -t
  else
 echo "database not found!"
  fi;;

* ) echo \
"Usage: dkms-gentoo [option]
available options:
--db     rebuild database.
--list   display database.
--check  check modules.";;

esac