LINUX.ORG.RU

аля dkms для Gentoo

 ,


0

1

есть ли это в этих ваших гентах?
гуголь не колется, eix тоже, zugaina лежит
сижу от нефиг делать пилю - но не велик ли я придумал?
module-rebuild не предлагать - это совсем не то

★★★★
Ответ на: комментарий от carasin

реализовал, правда костыльно...
бойся

#!/bin/bash

. /etc/init.d/functions.sh

DB="/var/db/pkg/"
KERNEL="$(uname -r)"
DKMS_DB="/var/lib/portage/dkms_db"
DKMS_TMP="/tmp/dkms_tmp"
DKMS_FAILED="/var/log/dkms_failed-${KERNEL}"

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
##### version of current_kernel's module
		MOD_VER="$( modinfo "${MOD_FILE}" | awk '/^version/ {print $2}' )"
##### version of pkg's module
		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
##### rebuilding broken modules for current kernel
	  FAILED_ATOMS="$(echo -e "${FAILED// /\n}" | sort -u)"
	  for ATOM in ${FAILED_ATOMS};do
		DB_PKG="$(find ${DB} -maxdepth 2 -name "${ATOM#*/}*")"
		echo "${ATOM} $(stat -c %Y $DB_PKG)" >> ${DKMS_TMP}
	  done
	  eselect kernel set linux-${KERNEL}
	  emerge -1 ${FAILED_ATOMS} \
	  && rm -f "${DKMS_FAILED}" || \
	  while read atom mtime;do
		if (( "$(stat -c %Y ${DB_PKG})" == "${mtime}" ));then
		  echo "${atom}" >> "${DKMS_FAILED}"
		fi
	  done < ${DKMS_TMP}
	  rm -f ${DKMS_TMP}
	else
	  rm -f "${DKMS_FAILED}"
	fi
  else
	echo -e "dkms_db not found!\nyou need run:\ndkms-gentoo --db" && return 1
  fi
  }
  check;;

--db ) db_rebuild(){

  db_create(){
##### list of all installed modules by packages
  TARGETS="$(grep "/lib/modules/.*.ko\>" ${DB}*/*/CONTENTS)"
  while read line;do
	MODULE="$(awk '{print $2}' <<< ${line})"
	KO="${MODULE#/*/*/*/}"
	PKG_FULL="${line%/CONTENTS*}"
##### get ${CATEGORY}/${PN}
	export "$(bzgrep "declare -x CATEGORY=" ${PKG_FULL}/environment.bz2 | awk '{print $3}')"
	export "$(bzgrep "declare -x PN=" ${PKG_FULL}/environment.bz2 | awk '{print $3}')"
##### creating database
	DATA+="${CATEGORY//'"'/}/${PN//'"'/} ${KO} ${MODULE}\n"
  done <<< "${TARGETS}"
	echo -e "${DATA%\\n}" | column -t > ${DKMS_DB}
  eend 0
  }

  if [ -f "${DKMS_DB}" ];then
##### rebuild db if dkms's database older then pkg's database
	DKMS_TIMESTAMP="$(stat -c %Y ${DKMS_DB})"
	DB_TIMESTAMP="$(stat -c %Y ${DB}*/ ${DB}*/*/ | sort | tail -n1)"
	if (( "${DB_TIMESTAMP}" > "${DKMS_TIMESTAMP}" ));then
	  db_create
	  eend $?
	else
	  eend 0
	fi
  else
	db_create
	eend $?
  fi
  }
  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

megabaks ★★★★
() автор топика
Ответ на: комментарий от megabaks

Ну, мне-то бояться нечего ;)
Это ж ты использовать будешь :D

Запилил бы ещё каменты, чтоб хоть как-то понятно стало.

carasin ★★★★★
()
Ответ на: комментарий от carasin

лол - ему не нравится echo с параметром в несколько строк :3 т.е.

echo "qwerty" 
нормально, а вот
echo "qwe
rty"
уже нет )

megabaks ★★★★
() автор топика
Ответ на: комментарий от megabaks

Ещё фичу придумал.

  1. При первом запуске скрипт спрашивает, в каком режиме ему работать:
    • в том, в каком он сейчас у тебя реализован;
    • с регистрацией фейла и последующим пропуском сборки сфейлившегося модуля;
    Соответственно, создаётся конфиг где-нибудь в /etc.
  2. При последующих запусках проверяется наличие конфига и, если конфиг есть, скрипт работает в соответствии с ним; если нет, то goto п. 1.
carasin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.