Déplacé variable GATEWAY dans script de configuration de carte réseau
[hvlinux.git] / functions-update
index cb7a7e8..d56e2bf 100644 (file)
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 
 LFS_PKG_BASE="$(dirname $(pwd))/packages"
 LFS_PKG_DIR="${LFS_PKG_BASE}/${LFS_STAGE}"
@@ -18,12 +18,14 @@ HV_PATCHES_URL="${HV_BASE_URL}/patches"
 
 LFS_PACKAGES_URL="ftp://ftp.osuosl.org/pub/lfs/lfs-packages/conglomeration"
 HV_PACKAGES_URL="${HV_BASE_URL}/packages"
-SOURCEFORGE_URL="http://internap.dl.sourceforge.net/sourceforge"
+SOURCEFORGE_URL="http://cdnetworks-us-1.dl.sourceforge.net"
 GNOME_URL="http://ftp.gnome.org/pub/gnome/sources"
 GNU_URL="http://ftp.gnu.org/pub/gnu"
 TETEX_URL="http://www.tug.org/ftp/tex-archive/systems/unix/teTeX"
+BLFS_XORG_URL="http://anduin.linuxfromscratch.org/files/BLFS/svn/xorg"
+XORG_URL="http://xorg.freedesktop.org/releases/individual"
 
-WGETCMD="wget --directory-prefix=${LFS_PKG_DIR} --timeout=5 --tries=3 -nc -c -o ${WGET_LOG_FILE}"
+WGETCMD="wget --directory-prefix=${LFS_PKG_DIR} --timeout=15 --tries=3 -nc --continue --no-check-certificate --no-verbose --output-file=${WGET_LOG_FILE}"
 
 LFS_PATCHES_LIST=${LFS_PKG_DIR}/patches-list-lfs.html
 BLFS_PATCHES_LIST=${LFS_PKG_DIR}/patches-list-blfs.html
@@ -38,6 +40,10 @@ static_fetch_patches_list()
     PATCHES_LIST_FILENAME=${2}
 
     ${WGETCMD} "${PATCHES_URL}/" &&
+
+    # Append log to global log file
+    cat ${WGET_LOG_FILE} >> ${LFS_LOG_FILE} &&
+
     mv ${LFS_PKG_DIR}/index.html ${PATCHES_LIST_FILENAME}
 }
 
@@ -45,6 +51,10 @@ static_fetch_patches_list()
 #          slash is absolutely necessary for this to work.
 update_packages_init()
 {
+    # Execute a return statement instead of exit, to be able to continue with
+    # downloading other packages
+    export RCMD_NO_EXIT=1
+
     # First create log directory if it does not exists.
     if [ ! -d ${LFS_LOG_DIR} ]; then
        install -m755 -d ${LFS_LOG_DIR} || exit 1
@@ -86,11 +96,17 @@ static_checkpatch()
     local PATCHES_LIST=${2}
     local PATCHES_URL=${3}
 
-    local PATCHES_FOUND=$(cat ${PATCHES_LIST} | grep "${PACK}-" | sed "s/.*\(${PACK}-.*\.patch\).*/\1/")
+    # Remplace les "+" par "%2B"
+    local PACK_URL=$(echo $PACK | sed s!\+!%2B!g)
+
+    local PATCHES_FOUND=$(cat ${PATCHES_LIST} | grep "${PACK_URL}-" | sed "s/.*\(${PACK_URL}-.*\.patch\).*/\1/")
     if [ -n "${PATCHES_FOUND}" ]; then
        for p in ${PATCHES_FOUND}; do
-           if [ ! -f ${LFS_PKG_DIR}/${p} ]; then
-               rcmd "Fetching ${p} from ${PATCHES_URL}" ${WGETCMD} ${PATCHES_URL}/${p}
+            # Remplace les "%2B" par "+"
+            PATCH_NAME=$(echo ${p} | sed s!%2B!\+!g)
+
+           if [ ! -f ${LFS_PKG_DIR}/${PATCH_NAME} ]; then
+               rcmd "Fetching ${PATCH_NAME} from ${PATCHES_URL}" ${WGETCMD} ${PATCHES_URL}/${p}
            fi
        done
     fi
@@ -182,8 +198,10 @@ detect_file_not_found()
     # HTTP: will return error code 404.
     # FTP: will say "File not found"
     if grep "404" ${WGET_LOG_FILE} 1> /dev/null 2>&1; then
+        echo "404 NOTFOUND"
         return 0
     elif grep "No such file" ${WGET_LOG_FILE} 1> /dev/null 2>&1; then
+        echo "No such file"
         return 0
     else
         return 1
@@ -193,38 +211,58 @@ detect_file_not_found()
 # Get package if it is not in the repository
 # Arg. #1: Package name and version
 # Arg. #2: URL
+# Arg. #3: Optional extension
 static_getpkg()
 {
-    PACK=${1}
-    URL=${2}
+    local PACK=${1}
+    local URL=${2}
+    local MY_ARCH_EXT=${3}
 
     # Checking for correct number of arguments
-    if [ $# -ne 2 ]; then
+    if [ $# -ne 2 -a $# -ne 3 ]; then
        echo "${FUNCNAME}(), wrong number of arguments: ${*}"
        return 1
     fi
 
-    if [ -z "${ARCH_EXT}" ]; then
+    if [ -z "${MY_ARCH_EXT}" ]; then
         # List of default archive extensions to try
-        ARCH_EXT="tar.bz2 tar.gz tgz .tar.Z"
+        MY_ARCH_EXT="tar.bz2 tar.gz tgz tar.Z"
     fi
 
-    for arch_ext in ${ARCH_EXT}; do
+    for arch_ext in ${MY_ARCH_EXT}; do
+        # Don't take any chance: remove any partially downloaded file.
+        # If we arrive here, it means the final destination file was not found
+        # so we can safely remove any file prior to trying to download it.
+        rm -f ${LFS_PKG_DIR}/${PACK}.${arch_ext}
+
+        echo "Trying to fetch ${PACK}.${arch_ext}"
+
         ${WGETCMD} ${URL}/${PACK}.${arch_ext}
+        wget_status=$?
+
+        # Append log to global log file
+        cat ${WGET_LOG_FILE} >> ${LFS_LOG_FILE}
 
-        # Failure: if it was a connection timeout, don't try for other file extensions.
+        # Failure: if it was a connection timeout, don't try for other file
+        # extensions.
         if grep "failed: Connection timed out" ${WGET_LOG_FILE} 1> /dev/null 2>&1; then
             echo "Error, wget reported: Connection timed out"
             return 1
         fi
 
         if detect_file_not_found; then
-            # Try next archive extension if web server reported that file is not found.
+            # Try next archive extension if web server reported that file is not
+            # found.
             continue;
         fi
 
-        # If we arrive here, it means we were able to download the file.
-        if [ "x${arch_ext}" != "xtar.bz2" ]; then
+        if [ ${wget_status} -ne 0 ]; then
+            echo "Error fetching package ${PACK}.${arch_ext}"
+            return 1
+        fi
+
+        # If we arrive here, it means we were able to successfully download the file.
+        if [ "x${arch_ext}" = "xtar.gz" -o "x${arch_ext}" = "xtgz" -o "x${arch_ext}" = "xtar.Z" ]; then
            gztobz2 ${LFS_PKG_DIR}/${PACK}.${arch_ext}
         fi
         return $?
@@ -237,10 +275,47 @@ static_getpkg()
 # Get package if it is not in the repository
 # Arg. #1: Package name and version
 # Arg. #2: URL
+# Options:
+#   -e     File extension (default is tar.bz2)
+#   -d     Fetch directory (default is LFS_PKG_DIR)
+#   -f     Filename on server (default is PACKAGE)
+#   -h     Display this help and returns
+#   -s     Subdirectory on server
 fpkg()
 {
-    PACK=${1}
-    URL=${2}
+    local FILE_EXT=""
+    local DEST_DIR=""
+    local SRC_FILENAME=""
+    local SRC_DIR=""
+
+    while getopts "e:d:f:hs:" flag ;do
+        case ${flag} in
+           e)
+                # File extension
+                FILE_EXT=${OPTARG}
+               ;;
+           d)
+                # Fetch directory (where to put file)
+                DEST_DIR=${OPTARG}
+               ;;
+           f)
+                # Filename if different than package name
+                SRC_FILENAME=${OPTARG}
+               ;;
+           s)
+               SRC_DIR=${OPTARG}
+                ;;
+           ?)
+               echo "${FUNCNAME}(): Invalid option: ${OPTARG}."
+               return 1
+               ;;
+        esac
+    done
+    shift `expr "${OPTIND}" - 1`
+
+    unset OPTSTRING
+    unset OPTIND
+    unset OPTARG
 
     # Checking for correct number of arguments
     if [ $# -ne 2 ]; then
@@ -248,50 +323,76 @@ fpkg()
        return 1
     fi
 
-    if [ ! -f ${LFS_PKG_DIR}/${PACK}.tar.bz2 ]; then
-       rcmd "Fetching ${PACK}" static_getpkg ${PACK} ${URL}
+    local PACK=${1}
+    local URL=${2}
+    local FETCH_STRING="Fetching ${PACK}"
+
+    if [ -z "${SRC_FILENAME}" ]; then
+        # Default source filename = name of package
+        SRC_FILENAME=${PACK}
     fi
 
-    # Check if a patch is available.
-    static_getpatch ${PACK}
-}
+    if [ -n "${FILE_EXT}" ]; then
+        FETCH_STRING="${FETCH_STRING}.${FILE_EXT}"
+    fi
 
-# Get package if it is not in the repository.
-# This function is used if the source and target names for the
-# package are different (name mismatch).
-# Arg. #1: Target package name and version (on disk)
-# Arg. #2: Source package name and version (on internet)
-# Arg. #3: URL
-fpkg_mis()
-{
-    TARGET=${1}
-    SOURCE=${2}
-    URL=${3}
+    if [ -z "${FILE_EXT}" -o \
+        "x${FILE_EXT}" = "xtar.gz" -o \
+        "x${FILE_EXT}" = "xtgz" -o \
+        "x${FILE_EXT}" = "xtar.Z" -o \
+        "x${FILE_EXT}" = "xtar.bz2" \
+        ]; then
+        FINAL_EXT=tar.bz2
+    else
+        FINAL_EXT=${FILE_EXT}
+    fi
 
-    # Checking for correct number of arguments
-    if [ $# -ne 3 ]; then
-       echo "${FUNCNAME}(), wrong number of arguments: ${*}"
-       reurn 1
+    if [ -z "${DEST_DIR}" ]; then
+        # Default destination directory
+        DEST_DIR=${LFS_PKG_DIR}
     fi
 
-    if [ ! -f ${LFS_PKG_DIR}/${TARGET}.tar.bz2 ]; then
-       fpkg ${SOURCE} ${URL}
-       
-       if [ -f ${LFS_PKG_DIR}/${SOURCE}.tar.bz2 ]; then
-           mv ${LFS_PKG_DIR}/${SOURCE}.tar.bz2 ${LFS_PKG_DIR}/${TARGET}.tar.bz2
+    mkdir -v -p ${DEST_DIR} >> ${LFS_LOG_FILE} 2>&1
+
+    if [ -z "${SRC_DIR}" ]; then
+        # Default source subdirectory on server
+        SRC_DIR=""
+    else
+        URL=${URL}/${SRC_DIR}
+    fi
+
+    DEST_FILE=${DEST_DIR}/${PACK}.${FINAL_EXT}
+
+    if [ ! -f ${DEST_FILE} ]; then
+        rcmd "${FETCH_STRING}" static_getpkg ${SRC_FILENAME} ${URL} ${FILE_EXT}
+
+        # Move file if source filename is not equal to package name and/or destination
+        # directory is not the default:
+        DOWNLOADED_FILE=${LFS_PKG_DIR}/${SRC_FILENAME}.${FINAL_EXT}
+
+        if [ "${DEST_FILE}" != "${DOWNLOADED_FILE}" ]; then
+           mv ${DOWNLOADED_FILE} ${DEST_FILE}
        fi
     fi
 
-    # Check for available patches with TARGET name.
-    static_getpatch ${TARGET}
+    # Test integrity of archive if requested
+    if [ -f ${DEST_FILE} -a -n "${TEST_INTEGRITY}" -a "x${FINAL_EXT}" = "xtar.bz2" ]; then
+        rcmd "Testing integrity of ${PACK}.${FINAL_EXT}" bzip2 -t ${DEST_FILE}
+    fi
+
+    # Check for available patches with PACKAGE (TARGET) name.
+    static_getpatch ${PACK}
 
-    # Check for available patches with SOURCE name.
-    static_getpatch ${SOURCE}
+    if [ ${SRC_FILENAME} != ${PACK} ]; then
+        # Check for available patches with SRC_FILENAME name.
+        static_getpatch ${SRC_FILENAME}
 
-    # Rename any patch fetched (in fpkg call) and replace SOURCE by TARGET in
-    # patch name.
-    if ls ${LFS_PKG_DIR}/${SOURCE}-*.patch 1> /dev/null 2>&1; then
-       rename ${SOURCE} ${TARGET} ${LFS_PKG_DIR}/${SOURCE}-*.patch
+        # Rename any patch fetched (in fpkg call) and replace SOURCE by TARGET
+        # in patch name.
+        if ls ${LFS_PKG_DIR}/${SRC_FILENAME}-*.patch 1> /dev/null 2>&1; then
+            echo "CMD=${SRC_FILENAME} ${PACK} ${LFS_PKG_DIR}/${SRC_FILENAME}-*.patch"
+           rename ${SRC_FILENAME} ${PACK} ${LFS_PKG_DIR}/${SRC_FILENAME}-*.patch
+        fi
     fi
 }
 
@@ -300,7 +401,7 @@ fpkg_mis()
 # Arg. #2: Directory name (optional)
 fpkg_gnu()
 {
-    PACK=${1}
+    local PACK=${1}
 
     if [ $# -eq 2 ]; then
        NAME=${2}
@@ -401,6 +502,23 @@ fpkg_lfs()
     fi
 }
 
+# Get package if it is not in the repository
+# Arg. #1: Package name and version
+# Arg. #2: Subdirectory name (module name)
+fpkg_xorg()
+{
+    local PACK=${1}
+    local SUBDIR=${2}
+
+    # Checking for correct number of arguments
+    if [ $# -ne 2 ]; then
+       echo "${FUNCNAME}(), wrong number of arguments: ${*}"
+       return 1
+    fi
+
+    fpkg -d ${LFS_PKG_DIR}/${SUBDIR} -s ${SUBDIR} ${PACK} ${XORG_URL}
+}
+
 # Create a symbolic link to a package that is located in another stage
 # repository (to not have the same file twice).
 # Arg. #1: Source stage number (1, 2, 3, etc)