##@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=(stretch jessie wheezy squeeze lenny etch) ubuntu_SYSVERS=(oneiric natty maverick lucid karmic jaunty intrepid hardy) redhatlike_SYSVERS=() rhel_SYSVERS=(rhel7 rhel6 rhel5 rhel4 redhat7 redhat6 redhat5 redhat4) fedora_SYSVERS=(fedora14 fedora13 fedora12 fedora11) centos_SYSVERS=(centos7 centos6 centos5 centos4 redhat7 redhat6 redhat5 redhat4) suse_SYSVERS=() gentoo_SYSVERS=() SYSVER_ALIASES=( 9=stretch 8=jessie 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 "$(//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_ }