home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / sbin / update-initramfs < prev    next >
Encoding:
Text File  |  2006-07-12  |  5.1 KB  |  346 lines

  1. #!/bin/sh
  2.  
  3. STATEDIR=/var/lib/initramfs-tools
  4. BOOTDIR=/boot
  5.  
  6. set -e
  7.  
  8. usage()
  9. {
  10.     if [ -n "${1}" ]; then
  11.         printf "${@}\n\n" >&2
  12.     fi
  13.     cat >&2 << EOF
  14. Usage: ${0} [OPTION]...
  15.  
  16. Options:
  17.  -k [version]    Specify kernel version or all
  18.  -c        Create a new initramfs
  19.  -u        Update an existing initramfs
  20.  -d        Remove an existing initramfs
  21.  -t        Take over a custom initramfs with this one
  22.  -b        Set alternate boot directory
  23.  -v        Be verbose
  24.  -h        This message
  25.  
  26. EOF
  27.     exit 1
  28. }
  29.  
  30. mild_panic()
  31. {
  32.     if [ -n "${1}" ]; then
  33.         printf "${@}\n" >&2
  34.     fi
  35.     exit 0
  36. }
  37.  
  38. panic()
  39. {
  40.     if [ -n "${1}" ]; then
  41.         printf "${@}\n" >&2
  42.     fi
  43.     exit 1
  44. }
  45.  
  46. verbose()
  47. {
  48.     if [ "${verbose}" = 1 ]; then
  49.         printf "${@}\n"
  50.     fi
  51. }
  52.  
  53. version_exists()
  54. {
  55.     [ -e "${STATEDIR}/${1}" ]
  56.     return $?
  57. }
  58.  
  59. set_initramfs()
  60. {
  61.     initramfs="${BOOTDIR}/initrd.img-${version}"
  62. }
  63.  
  64. generate_initramfs()
  65. {
  66.     echo "update-initramfs: Generating ${initramfs}"
  67.     OPTS="-o"
  68.     if [ "${verbose}" = 1 ]; then
  69.         OPTS="-v $OPTS"
  70.     fi
  71.     if mkinitramfs "${OPTS}" "${initramfs}" "${version}"; then
  72.         set_sha1
  73.     else
  74.         mkinitramfs_return="$?"
  75.         if [ "$mkinitramfs_return" = "2" ]; then
  76.             # minversion wasn't met, exit 0
  77.             exit 0
  78.         fi
  79.         verbose "mkinitramfs failed for ${initramfs}"
  80.         exit $mkinitramfs_return
  81.     fi
  82. }
  83.  
  84. # only run lilo if no grub is around
  85. run_bootloader()
  86. {
  87.     if [ -x /sbin/grub -o -e /boot/grub/menu.lst ]; then
  88.         if [ -e /etc/lilo.conf ]; then
  89.             echo
  90.             echo "WARNING: grub and lilo installed."
  91.             echo "If you use grub as bootloader everything is fine."
  92.             echo "If you use lilo as bootloader you must run lilo!"
  93.             echo
  94.         fi
  95.         return 0
  96.     fi
  97.     if [ -e /etc/lilo.conf ]; then
  98.         lilo -t > /dev/null
  99.         if [ $? -eq 0 ]; then
  100.             lilo
  101.         fi
  102.     fi
  103. }
  104.  
  105. compare_sha1()
  106. {
  107.     sha1sum "${initramfs}" | diff "${STATEDIR}/${version}" - >/dev/null 2>&1
  108.     return $?
  109. }
  110.  
  111. # Note that this must overwrite so that updates work.
  112. set_sha1()
  113. {
  114.     sha1sum "${initramfs}" > "${STATEDIR}/${version}"
  115. }
  116.  
  117. delete_sha1()
  118. {
  119.     rm -f "${STATEDIR}/${version}"
  120. }
  121.  
  122. get_sorted_versions()
  123. {
  124.     version_list=""
  125.  
  126.     for gsv_x in "${STATEDIR}"/*; do
  127.         gsv_x="$(basename "${gsv_x}")"
  128.         if [ "${gsv_x}" = '*' ]; then
  129.             return 0
  130.         fi
  131.         worklist=""
  132.         for gsv_i in $version_list; do
  133.             if dpkg --compare-versions "${gsv_x}" '>' "${gsv_i}"; then
  134.                 worklist="${worklist} ${gsv_x} ${gsv_i}"
  135.                 gsv_x=""
  136.             else
  137.                 worklist="${worklist} ${gsv_i}"
  138.             fi
  139.         done
  140.         if [ "${gsv_x}" != "" ]; then
  141.             worklist="${worklist} ${gsv_x}"
  142.         fi
  143.         version_list="${worklist}"
  144.     done
  145.  
  146.     verbose "Available versions: ${version_list}"
  147. }
  148.  
  149. set_current_version()
  150. {
  151.     if [ -f /boot/initrd.img-`uname -r` ]; then
  152.         version=`uname -r`
  153.     fi
  154. }
  155.  
  156. set_linked_version()
  157. {
  158.     if [ -L /initrd.img ]; then
  159.         linktarget="$(basename "$(readlink /initrd.img)")"
  160.     fi
  161.  
  162.     if [ -L /boot/initrd.img ]; then
  163.         linktarget="$(basename "$(readlink /boot/initrd.img)")"
  164.     fi
  165.  
  166.     if [ -z "${linktarget}" ]; then
  167.         return
  168.     fi
  169.  
  170.     version="${linktarget##initrd.img-}"
  171. }
  172.  
  173. set_highest_version()
  174. {
  175.     get_sorted_versions
  176.     set - ${version_list}
  177.     version=${1}
  178. }
  179.  
  180. create()
  181. {
  182.     if [ -z "${version}" ]; then
  183.         usage "Create mode requires a version argument"
  184.     fi
  185.  
  186.     set_initramfs
  187.  
  188.     if [ "${takeover}" = 0 ]; then
  189.         if version_exists "${version}"; then
  190.             panic "Cannot create version ${version}: already exists"
  191.         fi
  192.     
  193.         if [ -e "${initramfs}" ]; then
  194.             panic "${initramfs} already exists, cannot create."
  195.         fi
  196.     fi
  197.  
  198.     generate_initramfs
  199. }
  200.  
  201. update()
  202. {
  203.     if [ -z "${version}" ]; then
  204.         set_linked_version
  205.     fi
  206.  
  207.     if [ -z "${version}" ]; then
  208.         set_highest_version
  209.     fi
  210.  
  211.     if [ -z "${version}" ]; then
  212.         set_current_version
  213.     fi
  214.  
  215.     if [ -z "${version}" ]; then
  216.         verbose "Nothing to do, exiting."
  217.         exit 0
  218.     fi
  219.  
  220.     if [ "${version}" = "all" ]; then
  221.         : FIXME check for --yes, and if not ask are you sure
  222.         get_sorted_versions
  223.         if [ -z "${version_list}" ]; then
  224.             verbose "Nothing to do, exiting."
  225.             exit 0
  226.         fi
  227.         for u_version in ${version_list}; do
  228.             if [ "${verbose}" = "1" ]; then
  229.                 vflag="-v"
  230.             fi
  231.             # Don't stop if one version doesn't work.
  232.             set +e
  233.             "${0}" -u -k "${u_version}" ${vflag}
  234.             set -e
  235.         done
  236.         exit 0
  237.     fi
  238.  
  239.     set_initramfs
  240.  
  241.     altered_check
  242.  
  243.     generate_initramfs
  244.  
  245.     run_bootloader
  246.  
  247. }
  248.  
  249. delete()
  250. {
  251.     if [ -z "${version}" ]; then
  252.         usage "Delete mode requires a version argument"
  253.     fi
  254.  
  255.     set_initramfs
  256.  
  257.     if [ ! -e "${initramfs}" ]; then
  258.         panic "Cannot delete ${initramfs}, doesn't exist."
  259.     fi
  260.     
  261.     if ! version_exists "${version}"; then
  262.         panic "Cannot delete version ${version}: Not created by this utility."
  263.     fi
  264.  
  265.     altered_check
  266.  
  267.     delete_sha1
  268.  
  269.     rm -f "${initramfs}"
  270. }
  271.  
  272.  
  273. altered_check()
  274. {
  275.     if [ "${takeover}" = 0 ]; then
  276.         if ! compare_sha1; then
  277.             delete_sha1
  278.             mild_panic "${initramfs} has been altered.  Cannot update."
  279.         fi
  280.     fi
  281. }
  282.  
  283. # Defaults
  284. verbose=0
  285. yes=0
  286. # We default to takeover=1 in Ubuntu, but not Debian
  287. takeover=1
  288.  
  289. ##
  290.  
  291. while getopts "k:cudyvtb:h?" flag; do
  292.     case "${flag}" in
  293.     k)
  294.         version="${OPTARG}"    
  295.         ;;
  296.     c)
  297.         mode="c"
  298.         ;;
  299.     d)
  300.         mode="d"
  301.         ;;
  302.     u)
  303.         mode="u"
  304.         ;;
  305.     v)
  306.         verbose="1"
  307.         ;;
  308.     y)
  309.         yes="1"
  310.         ;;
  311.     t)
  312.         takeover="1"
  313.         ;;
  314.     b)
  315.         BOOTDIR="${OPTARG}"
  316.         if [ ! -d "${BOOTDIR}" ]; then
  317.             echo "Error: ${BOOTDIR} is not a directory."
  318.             exit 1
  319.         fi
  320.         ;;
  321.     h|?)
  322.         usage
  323.         ;;
  324.     esac
  325. done
  326.  
  327. # Validate arguments
  328.  
  329. if [ -z "${mode}" ]; then
  330.     usage "You must specify at least one of -c, -u, or -d."
  331. fi
  332.  
  333. case "${mode}" in
  334.     c)
  335.         create
  336.         ;;
  337.     d)
  338.         delete
  339.         ;;
  340.     u)
  341.         update
  342.         ;;
  343. esac
  344.  
  345.  
  346.