385 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			385 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
 | 
						|
## Gestion des informations sur l'hôte local
 | 
						|
##@cooked nocomments
 | 
						|
##@require base
 | 
						|
uprovide sysinfos
 | 
						|
urequire base
 | 
						|
 | 
						|
################################################################################
 | 
						|
## Informations sur le système local
 | 
						|
 | 
						|
## type de système
 | 
						|
# attention: dans SYSNAMES et *_SYSDISTS, les noms doivent être ordonnés du
 | 
						|
# moins spécifique au plus spécifique
 | 
						|
SYSNAMES=(linux linux64 linux32 linuxppc64 linuxppc32 linuxarm macosx)
 | 
						|
linux_SYSDISTS=(debianlike debian ubuntu redhatlike rhel fedora centos suse gentoo)
 | 
						|
linux32_SYSDISTS=(debianlike debian ubuntu redhatlike rhel fedora centos suse gentoo)
 | 
						|
linux64_SYSDISTS=(debianlike debian ubuntu redhatlike rhel fedora centos suse gentoo)
 | 
						|
linuxppc32_SYSDISTS=(debianlike debian ubuntu redhatlike fedora)
 | 
						|
linuxppc64_SYSDISTS=(debianlike debian ubuntu redhatlike fedora)
 | 
						|
linuxarm_SYSDISTS=(debianlike debian ubuntu)
 | 
						|
macosx_SYSDISTS=(lion snowleopard leopard tiger panther)
 | 
						|
SYSDIST_ALIASES=(
 | 
						|
    10.7=lion 10.6=snowleopard 10.5=leopard 10.4=tiger 10.3=panther
 | 
						|
)
 | 
						|
# attention: dans *_SYSVERS, les noms doivent être ordonnés du plus récent au
 | 
						|
# moins récent
 | 
						|
debianlike_SYSVERS=()
 | 
						|
debian_SYSVERS=(wheezy squeeze lenny etch)
 | 
						|
ubuntu_SYSVERS=(oneiric natty maverick lucid karmic jaunty intrepid hardy)
 | 
						|
redhatlike_SYSVERS=()
 | 
						|
rhel_SYSVERS=(rhel6 rhel5 rhel4 redhat6 redhat5 redhat4)
 | 
						|
fedora_SYSVERS=(fedora14 fedora13 fedora12 fedora11)
 | 
						|
centos_SYSVERS=(centos6 centos5 centos4 redhat6 redhat5 redhat4)
 | 
						|
suse_SYSVERS=()
 | 
						|
gentoo_SYSVERS=()
 | 
						|
SYSVER_ALIASES=(
 | 
						|
    7=wheezy 6=squeeze 5=lenny 4=etch
 | 
						|
    11.10=oneiric 11.04=natty 10.10=maverick 10.04=lucid 9.10=karmic 9.04=jaunty 8.10=intrepid 8.04=hardy
 | 
						|
)
 | 
						|
 | 
						|
function __setup_ALL_SYSvars() {
 | 
						|
    local s ds d fs f
 | 
						|
    ALL_SYSDISTS=()
 | 
						|
    for s in "${SYSNAMES[@]}"; do
 | 
						|
        array_copy ds "${s}_SYSDISTS"
 | 
						|
        for d in "${ds[@]}"; do
 | 
						|
            array_set ALL_SYSDISTS "$d"
 | 
						|
        done
 | 
						|
    done
 | 
						|
    ALL_SYSVERS=()
 | 
						|
    for d in "${ALL_SYSDISTS[@]}"; do
 | 
						|
        array_copy fs "${d}_SYSVERS"
 | 
						|
        for f in "${fs[@]}"; do
 | 
						|
            # les valeurs sont poussés vers la fin si elles existent déjà
 | 
						|
            array_contains ALL_SYSVERS "$f" && array_del ALL_SYSVERS "$f"
 | 
						|
            array_add ALL_SYSVERS "$f"
 | 
						|
        done
 | 
						|
    done
 | 
						|
}
 | 
						|
__setup_ALL_SYSvars
 | 
						|
unset -f __setup_ALL_SYSvars
 | 
						|
 | 
						|
MYSYSNAME=()
 | 
						|
MYBITS=
 | 
						|
MYSYSDIST=()
 | 
						|
MYSYSVER=()
 | 
						|
if [ "$UNAME_SYSTEM" == "Linux" ]; then
 | 
						|
    case "$UNAME_MACHINE" in
 | 
						|
    x86_64)
 | 
						|
        MYSYSNAME=(linux64 linux)
 | 
						|
        MYBITS=64
 | 
						|
        ;;
 | 
						|
    i386|i586|i686)
 | 
						|
        MYSYSNAME=(linux32 linux)
 | 
						|
        MYBITS=32
 | 
						|
        ;;
 | 
						|
    ppc)
 | 
						|
        MYSYSNAME=(linuxppc32 linuxppc linux)
 | 
						|
        MYBITS=32
 | 
						|
        ;;
 | 
						|
    ppc64)
 | 
						|
        MYSYSNAME=(linuxppc64 linuxppc linux)
 | 
						|
        MYBITS=64
 | 
						|
        ;;
 | 
						|
    arm*)
 | 
						|
        MYSYSNAME=(linuxarm linux)
 | 
						|
        ;;
 | 
						|
    *)
 | 
						|
        MYSYSNAME=(linux)
 | 
						|
        ;;
 | 
						|
    esac
 | 
						|
 | 
						|
    if [ -f /etc/debian_version ]; then
 | 
						|
        case "$(</etc/debian_version)" in
 | 
						|
        7*|wheezy*) MYSYSDIST=(debian debianlike); MYSYSVER=(wheezy);;
 | 
						|
        6*|squeeze*) MYSYSDIST=(debian debianlike); MYSYSVER=(squeeze);;
 | 
						|
        5*) MYSYSDIST=(debian debianlike); MYSYSVER=(lenny);;
 | 
						|
        4*) MYSYSDIST=(debian debianlike); MYSYSVER=(etch);;
 | 
						|
        *) MYSYSDIST=(debianlike);;
 | 
						|
        esac
 | 
						|
    elif [ -f /etc/gentoo-release ]; then
 | 
						|
        MYSYSDIST=(gentoo)
 | 
						|
    elif [ -f /etc/redhat-release ]; then
 | 
						|
        case "$(</etc/redhat-release)" in
 | 
						|
        Fedora*) MYSYSDIST=(fedora redhatlike);;
 | 
						|
        Red*Hat*Enterprise*Linux*) MYSYSDIST=(rhel redhatlike);;
 | 
						|
        CentOS*) MYSYSDIST=(centos redhatlike);;
 | 
						|
        *) MYSYSDIST=(redhatlike);;
 | 
						|
        esac
 | 
						|
        case "$(</etc/redhat-release)" in
 | 
						|
        Fedora*14*) MYSYSVER=(fedora14);;
 | 
						|
        Fedora*13*) MYSYSVER=(fedora13);;
 | 
						|
        Fedora*12*) MYSYSVER=(fedora12);;
 | 
						|
        Fedora*11*) MYSYSVER=(fedora11);;
 | 
						|
        Red*Hat*Enterprise*Linux*release\ 6*) MYSYSVER=(rhel6 redhat6);;
 | 
						|
        Red*Hat*Enterprise*Linux*release\ 5*) MYSYSVER=(rhel5 redhat5);;
 | 
						|
        Red*Hat*Enterprise*Linux*release\ 4*) MYSYSVER=(rhel4 redhat4);;
 | 
						|
        CentOS*release\ 6*) MYSYSVER=(centos6 redhat6);;
 | 
						|
        CentOS*release\ 5*) MYSYSVER=(centos5 redhat5);;
 | 
						|
        CentOS*release\ 4*) MYSYSVER=(centos4 redhat4);;
 | 
						|
        esac
 | 
						|
    fi
 | 
						|
elif [ "$UNAME_SYSTEM" == "Darwin" ]; then
 | 
						|
    function get_macosx_version() {
 | 
						|
        local i
 | 
						|
        for i in /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/version.plist /System/Library/Frameworks/CoreServices.framework/Resources/version.plist; do
 | 
						|
            if [ -f "$i" ]; then
 | 
						|
                grep -A 1 CFBundleShortVersionString "$i" | grep string | sed 's/.*<string>//g
 | 
						|
s/<\/string>.*$//g'
 | 
						|
                break
 | 
						|
            fi
 | 
						|
        done
 | 
						|
    }
 | 
						|
    MYSYSNAME=(macosx darwin)
 | 
						|
    case "$(get_macosx_version)" in
 | 
						|
    10.7*) MYSYSDIST=(lion);;
 | 
						|
    10.6*) MYSYSDIST=(snowleopard);;
 | 
						|
    10.5*) MYSYSDIST=(leopard);;
 | 
						|
    10.4*) MYSYSDIST=(tiger);;
 | 
						|
    10.3*) MYSYSDIST=(panther);;
 | 
						|
    esac
 | 
						|
fi
 | 
						|
if [ -n "$UTOOLS_CHROOT" ]; then
 | 
						|
    # Dans un chroot, il est possible de forcer les valeurs
 | 
						|
    [ -n "$UTOOLS_SYSNAME" ] && eval "MYSYSNAME=($UTOOLS_SYSNAME)"
 | 
						|
    [ -n "$UTOOLS_BITS" ] && eval "MYBITS=$UTOOLS_BITS"
 | 
						|
    [ -n "$UTOOLS_SYSDIST" ] && eval "MYSYSDIST=($UTOOLS_SYSDIST)"
 | 
						|
    [ -n "$UTOOLS_SYSVER" ] && eval "MYSYSVER=($UTOOLS_SYSVER)"
 | 
						|
fi
 | 
						|
 | 
						|
function __get_sysdist_alias() {
 | 
						|
    if ! array_contains ALL_SYSDISTS "$1"; then
 | 
						|
        local nd n d
 | 
						|
        for nd in "${SYSDIST_ALIASES[@]}"; do
 | 
						|
            splitvar "$nd" n d
 | 
						|
            if [ "$n" == "$1" ]; then
 | 
						|
                echo "$d"
 | 
						|
                return
 | 
						|
            fi
 | 
						|
        done
 | 
						|
    fi
 | 
						|
    echo "$1"
 | 
						|
}
 | 
						|
 | 
						|
function __get_sysver_alias() {
 | 
						|
    if ! array_contains ALL_SYSVERS "$1"; then
 | 
						|
        local nv n v
 | 
						|
        for nv in "${SYSVER_ALIASES[@]}"; do
 | 
						|
            splitvar "$nv" n v
 | 
						|
            if [ "$n" == "$1" ]; then
 | 
						|
                echo "$v"
 | 
						|
                return
 | 
						|
            fi
 | 
						|
        done
 | 
						|
    fi
 | 
						|
    echo "$1"
 | 
						|
}
 | 
						|
 | 
						|
function __fix_sysinfos_upward() {
 | 
						|
    local sysname_ sysdists_ sysdist_ sysvers_ sysver_
 | 
						|
    if [ -z "${!sysnamevar_}" ]; then
 | 
						|
        if [ -z "${!sysdistvar_}" ]; then
 | 
						|
            [ -z "${!sysvervar_}" ] && return
 | 
						|
            # essayer de déterminer !sysdistvar_ à partir de !sysvervar_
 | 
						|
            for sysname_ in "${SYSNAMES[@]}"; do
 | 
						|
                array_copy sysdists_ "${sysname_}_SYSDISTS"
 | 
						|
                for sysdist_ in "${sysdists_[@]}"; do
 | 
						|
                    array_copy sysvers_ "${sysdist_}_SYSVERS"
 | 
						|
                    for sysver_ in "${sysvers_[@]}"; do
 | 
						|
                        if [ "$sysver_" == "${!sysvervar_}" ]; then
 | 
						|
                            set_var "$sysdistvar_" "$sysdist_"
 | 
						|
                            set_var "$sysnamevar_" "$sysname_"
 | 
						|
                            return
 | 
						|
                        fi
 | 
						|
                    done
 | 
						|
                done
 | 
						|
            done
 | 
						|
        fi
 | 
						|
        [ -z "${!sysdistvar_}" ] && return 0
 | 
						|
        # essayer de déterminer !sysnamevar_ à partir de !sysdistvar_
 | 
						|
        for sysname_ in "${SYSNAMES[@]}"; do
 | 
						|
            array_copy sysdists_ "${sysname_}_SYSDISTS"
 | 
						|
            for sysdist_ in "${sysdists_[@]}"; do
 | 
						|
                if [ "$sysdist_" == "${!sysdistvar_}" ]; then
 | 
						|
                    set_var "$sysnamevar_" "$sysname_"
 | 
						|
                    return
 | 
						|
                fi
 | 
						|
            done
 | 
						|
        done
 | 
						|
    fi
 | 
						|
}
 | 
						|
function __fix_sysinfos_downward() {
 | 
						|
    local sysname_ sysdist_ sysver_
 | 
						|
 | 
						|
    # si !sysnamevar_ n'est pas défini, on ne peut rien faire
 | 
						|
    [ -z "${!sysnamevar_}" ] && return
 | 
						|
 | 
						|
    if [ -z "${!sysdistvar_}" ]; then
 | 
						|
        # essayer de déterminer !sysdistvar_ à partir de !sysnamevar_
 | 
						|
        array_copy sysdists_ "${!sysnamevar_}_SYSDISTS"
 | 
						|
        for sysdist_ in "${sysdists_[@]}"; do
 | 
						|
            set_var "$sysdistvar_" "$sysdist_"
 | 
						|
            break
 | 
						|
        done
 | 
						|
    fi
 | 
						|
    [ -z "${!sysdistvar_}" ] && return
 | 
						|
 | 
						|
    if [ -z "${!sysvervar_}" ]; then
 | 
						|
        # essayer de déterminer !sysvervar_ à partir de !sysdistvar_
 | 
						|
        array_copy sysvers_ "${sysdistvar_}_SYSVERS"
 | 
						|
        for sysver_ in "${sysvers_[@]}"; do
 | 
						|
            set_var "$sysvervar_" "$sysver_"
 | 
						|
            break
 | 
						|
        done
 | 
						|
    fi
 | 
						|
    #[ -z "${!sysvervar_}" ] && return
 | 
						|
}
 | 
						|
function ensure_sysinfos() {
 | 
						|
    # Essayer de déterminer les valeurs des variables $1(=SYSNAME), $2(=SYSDIST)
 | 
						|
    # et $3(=SYSVER) en fonction des valeurs des autres. Cette fonction est à
 | 
						|
    # utiliser quand on récupère cette information de la part de l'utilisateur,
 | 
						|
    # et qu'il faut compléter
 | 
						|
    local sysnamevar_="${1:-SYSNAME}"
 | 
						|
    local sysdistvar_="${2:-SYSDIST}"
 | 
						|
    local sysvervar_="${3:-SYSVER}"
 | 
						|
    [ -n "${!sysdistvar_}" ] && set_var "$sysdistvar_" "$(__get_sysdist_alias "${!sysdistvar_}")"
 | 
						|
    [ -n "${!sysvervar_}" ] && set_var "$sysvervar_" "$(__get_sysver_alias "${!sysvervar_}")"
 | 
						|
    __fix_sysinfos_upward
 | 
						|
    __fix_sysinfos_downward
 | 
						|
}
 | 
						|
 | 
						|
function check_sysinfos() {
 | 
						|
    # Tester si le système courant ($MYSYSNAME, $MYSYSDIST, $MYSYSVER, $MYBITS)
 | 
						|
    # correspond à au moins un des arguments.
 | 
						|
    # Les options -s, -d, -v, -b permettent respectivement de vérifier le
 | 
						|
    # système, la distribution, la version et le nombre de bits. Il est possible
 | 
						|
    # de spécifier plusieurs tests à effectuer, e.g.:
 | 
						|
    #     check_sysinfos -d debian ubuntu -b 64
 | 
						|
    # pour tester si l'on est sur une distribution debian ou ubuntu *et* sur un
 | 
						|
    # système 64 bits
 | 
						|
    # Avec l'option -v, il est possible de suffixer la valeur avec + ou - selon
 | 
						|
    # que l'on veut toutes les versions situées après ou avant la version
 | 
						|
    # spécifiée. Attention, à cause d'une limitation de l'implémentation, il
 | 
						|
    # faut alors impérativement filtrer aussi sur la distribution, e.g:
 | 
						|
    #     check_sysinfo -d debian -v lenny+
 | 
						|
    # pour tester si on est en lenny ou en squeeze.
 | 
						|
    # De même, l'option -d accepte aussi de suffixer la valeur avec + ou -, mais
 | 
						|
    # cela n'a actuellement de sens qu'avec les version de MacOS X. Il faut
 | 
						|
    # aussi impérativement filtrer sur le système, e.g:
 | 
						|
    #     check_sysinfos -s macosx -d 10.5+
 | 
						|
    local sysnamevar_="MYSYSNAME"
 | 
						|
    local sysdistvar_="MYSYSDIST"
 | 
						|
    local sysvervar_="MYSYSVER"
 | 
						|
    local bitsvar_="MYBITS"
 | 
						|
    local check_=sysname r_=0
 | 
						|
    while [ -n "$1" ]; do
 | 
						|
        if [[ "$1" == -* ]]; then
 | 
						|
            [ "$1" == "-S" ] && { sysnamevar_="$2"; shift 2; continue; }
 | 
						|
            [ "$1" == "-D" ] && { sysdistvar_="$2"; shift 2; continue; }
 | 
						|
            [ "$1" == "-V" ] && { sysvervar_="$2"; shift 2; continue; }
 | 
						|
            [ "$1" == "-B" ] && { bitsvar_="$2"; shift 2; continue; }
 | 
						|
            [ "$r_" == "1" ] && break
 | 
						|
            [ "$1" == "-s" ] && check_=sysname
 | 
						|
            [ "$1" == "-d" ] && check_=sysdist
 | 
						|
            [ "$1" == "-v" ] && check_=sysver
 | 
						|
            [ "$1" == "-b" ] && check_=bits
 | 
						|
            r_=1
 | 
						|
            shift
 | 
						|
            continue
 | 
						|
        fi
 | 
						|
        if [ "$check_" == "sysname" ]; then
 | 
						|
            if array_contains "$sysnamevar_" "$1"; then
 | 
						|
                r_=0
 | 
						|
                check_=skip
 | 
						|
            fi
 | 
						|
 | 
						|
        elif [ "$check_" == "sysdist" ]; then
 | 
						|
            local mode_=exact value_="$1"
 | 
						|
            if [ "${value_%+}" != "$value_" ]; then
 | 
						|
                mode_=after
 | 
						|
                value_="${value_%+}"
 | 
						|
            elif [ "${value_%-}" != "$value_" ]; then
 | 
						|
                mode_=before
 | 
						|
                value_="${value_%-}"
 | 
						|
            fi
 | 
						|
            value_="$(__get_sysdist_alias "$value_")"
 | 
						|
            if [ "$mode_" == "exact" ]; then
 | 
						|
                if array_contains "$sysdistvar_" "$value_"; then
 | 
						|
                    r_=0
 | 
						|
                    check_=skip
 | 
						|
                fi
 | 
						|
            elif [ "$mode_" == "after" ]; then
 | 
						|
                local sysdist_
 | 
						|
                for sysdist_ in "${ALL_SYSDISTS[@]}"; do
 | 
						|
                    if array_contains "$sysdistvar_" "$sysdist_"; then
 | 
						|
                        r_=0
 | 
						|
                        check_=skip
 | 
						|
                    elif [ "$sysdist_" == "$value_" ]; then
 | 
						|
                        break
 | 
						|
                    fi
 | 
						|
                done
 | 
						|
            elif [ "$mode_" == "before" ]; then
 | 
						|
                local sysdist_ found_
 | 
						|
                for sysdist_ in "${ALL_SYSDISTS[@]}"; do
 | 
						|
                    [ "$sysdist_" == "$value_" ] && found_=1
 | 
						|
                    if [ -n "$found_" ]; then
 | 
						|
                        if array_contains "$sysdistvar_" "$sysdist_"; then
 | 
						|
                            r_=0
 | 
						|
                            check_=skip
 | 
						|
                            break
 | 
						|
                        fi
 | 
						|
                    fi
 | 
						|
                done
 | 
						|
            fi
 | 
						|
 | 
						|
        elif [ "$check_" == "sysver" ]; then
 | 
						|
            local mode_=exact value_="$1"
 | 
						|
            if [ "${value_%+}" != "$value_" ]; then
 | 
						|
                mode_=after
 | 
						|
                value_="${value_%+}"
 | 
						|
            elif [ "${value_%-}" != "$value_" ]; then
 | 
						|
                mode_=before
 | 
						|
                value_="${value_%-}"
 | 
						|
            fi
 | 
						|
            value_="$(__get_sysver_alias "$value_")"
 | 
						|
            if [ "$mode_" == "exact" ]; then
 | 
						|
                if array_contains "$sysvervar_" "$value_"; then
 | 
						|
                    r_=0
 | 
						|
                    check_=skip
 | 
						|
                fi
 | 
						|
            elif [ "$mode_" == "after" ]; then
 | 
						|
                local sysver_
 | 
						|
                for sysver_ in "${ALL_SYSVERS[@]}"; do
 | 
						|
                    if array_contains "$sysvervar_" "$sysver_"; then
 | 
						|
                        r_=0
 | 
						|
                        check_=skip
 | 
						|
                    elif [ "$sysver_" == "$value_" ]; then
 | 
						|
                        break
 | 
						|
                    fi
 | 
						|
                done
 | 
						|
            elif [ "$mode_" == "before" ]; then
 | 
						|
                local sysver_ found_
 | 
						|
                for sysver_ in "${ALL_SYSVERS[@]}"; do
 | 
						|
                    [ "$sysver_" == "$value_" ] && found_=1
 | 
						|
                    if [ -n "$found_" ]; then
 | 
						|
                        if array_contains "$sysvervar_" "$sysver_"; then
 | 
						|
                            r_=0
 | 
						|
                            check_=skip
 | 
						|
                            break
 | 
						|
                        fi
 | 
						|
                    fi
 | 
						|
                done
 | 
						|
            fi
 | 
						|
 | 
						|
        elif [ "$check_" == "bits" ]; then
 | 
						|
            if [ "$1" == "${!bitsvar_}" ]; then
 | 
						|
                r_=0
 | 
						|
                check_=skip
 | 
						|
            fi
 | 
						|
        fi
 | 
						|
        shift
 | 
						|
    done
 | 
						|
    return $r_
 | 
						|
}
 |