697 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			697 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
 | 
						|
## Gestion des services de webobjects (démarrage/arrêt), et de leur configuration
 | 
						|
##@cooked nocomments
 | 
						|
##@require base
 | 
						|
##@require sysinfos
 | 
						|
##@require javaproperties
 | 
						|
uprovide webobjects
 | 
						|
urequire base sysinfos javaproperties
 | 
						|
 | 
						|
################################################################################
 | 
						|
# Préfixes
 | 
						|
 | 
						|
__webobjects_prefixes=
 | 
						|
function __compute_webobjects_prefixes() {
 | 
						|
    [ -n "$__webobjects_prefixes" ] && return
 | 
						|
    if check_sysinfos -s darwin; then
 | 
						|
        # valeurs par défaut de NEXT_ROOT, WOROOT et LOCALROOT sur MacOS X
 | 
						|
        DEFAULT_NEXT_ROOT=
 | 
						|
        function get_default_woroot_prefix() { echo "$NEXT_ROOT/System"; }
 | 
						|
        function get_default_localroot_prefix() { echo "$NEXT_ROOT"; }
 | 
						|
    else
 | 
						|
        # valeurs par défaut de NEXT_ROOT, WOROOT et LOCALROOT sur les autres Unix
 | 
						|
        DEFAULT_NEXT_ROOT=/opt/Apple
 | 
						|
        function get_default_woroot_prefix() { echo "$NEXT_ROOT"; }
 | 
						|
        function get_default_localroot_prefix() { echo "$NEXT_ROOT/Local"; }
 | 
						|
    fi
 | 
						|
    
 | 
						|
    NEXT_ROOT="${NEXT_ROOT:-$DEFAULT_NEXT_ROOT}"
 | 
						|
    WOROOT="${WOROOT:-$(get_default_woroot_prefix)}"
 | 
						|
    LOCALROOT="${LOCALROOT:-$(get_default_localroot_prefix)}"
 | 
						|
    SYSTEMFRAMEWORKS="$WOROOT/Library/Frameworks"
 | 
						|
    WOEXTENSIONS="$LOCALROOT/Library/WebObjects/Extensions"
 | 
						|
    WOFRAMEWORKS="$LOCALROOT/Library/WebObjects/Applications/Frameworks"
 | 
						|
    WOAPPLICATIONS="$LOCALROOT/Library/WebObjects/Applications"
 | 
						|
    WOCONFIGURATION="$LOCALROOT/Library/WebObjects/Configuration"
 | 
						|
    WOAUTOSTART="$WOCONFIGURATION/AutoStart.txt"
 | 
						|
    WOLOGS="/var/log/WebObjects"
 | 
						|
    local versionfile="$SYSTEMFRAMEWORKS/JavaWebObjects.framework/Resources/version.plist"
 | 
						|
    [ -f "$versionfile" ] && WOVERSION="$(grep -A 1 CFBundleShortVersionString "$versionfile" | tail -1 | sed 's/^.*<string>\(.*\)<\/string>.*$/\1/')" || WOVERSION=
 | 
						|
    __webobjects_prefixes=1
 | 
						|
}
 | 
						|
 | 
						|
UTOOLS_PREFIXES=("${UTOOLS_PREFIXES[@]}" NEXT_ROOT WOROOT LOCALROOT SYSTEMFRAMEWORKS WOEXTENSIONS WOFRAMEWORKS WOAPPLICATIONS WOCONFIGURATION WOAUTOSTART WOLOGS WOVERSION)
 | 
						|
 | 
						|
function compute_webobjects_prefixes() {
 | 
						|
    __compute_webobjects_prefixes
 | 
						|
}
 | 
						|
 | 
						|
function recompute_webobjects_prefixes() {
 | 
						|
    __webobjects_prefixes=
 | 
						|
    __compute_webobjects_prefixes
 | 
						|
}
 | 
						|
 | 
						|
function get_NEXT_ROOT_prefix() {
 | 
						|
    __compute_webobjects_prefixes
 | 
						|
    echo "$NEXT_ROOT"
 | 
						|
}
 | 
						|
function get_WOROOT_prefix() {
 | 
						|
    __compute_webobjects_prefixes
 | 
						|
    echo "$WOROOT"
 | 
						|
}
 | 
						|
function get_LOCALROOT_prefix() {
 | 
						|
    __compute_webobjects_prefixes
 | 
						|
    echo "$LOCALROOT"
 | 
						|
}
 | 
						|
function get_SYSTEMFRAMEWORKS_prefix() {
 | 
						|
    __compute_webobjects_prefixes
 | 
						|
    echo "$SYSTEMFRAMEWORKS"
 | 
						|
}
 | 
						|
function get_WOEXTENSIONS_prefix() {
 | 
						|
    __compute_webobjects_prefixes
 | 
						|
    echo "$WOEXTENSIONS"
 | 
						|
}
 | 
						|
function get_WOFRAMEWORKS_prefix() {
 | 
						|
    __compute_webobjects_prefixes
 | 
						|
    echo "$WOFRAMEWORKS"
 | 
						|
}
 | 
						|
function get_WOAPPLICATIONS_prefix() {
 | 
						|
    __compute_webobjects_prefixes
 | 
						|
    echo "$WOAPPLICATIONS"
 | 
						|
}
 | 
						|
function get_WOCONFIGURATION_prefix() {
 | 
						|
    __compute_webobjects_prefixes
 | 
						|
    echo "$WOCONFIGURATION"
 | 
						|
}
 | 
						|
function get_WOAUTOSTART_prefix() {
 | 
						|
    __compute_webobjects_prefixes
 | 
						|
    echo "$WOAUTOSTART"
 | 
						|
}
 | 
						|
function get_WOLOGS_prefix() {
 | 
						|
    __compute_webobjects_prefixes
 | 
						|
    echo "$WOLOGS"
 | 
						|
}
 | 
						|
function get_WOVERSION_prefix() {
 | 
						|
    __compute_webobjects_prefixes
 | 
						|
    echo "$WOVERSION"
 | 
						|
}
 | 
						|
 | 
						|
################################################################################
 | 
						|
# Bundles
 | 
						|
 | 
						|
function is_wobundle() {
 | 
						|
    # Tester si $1 a un nom de bundle valide, c'est à dire avec l'extension .woa
 | 
						|
    # ou .framework
 | 
						|
    local bundle="$(basename "$(abspath "$1")")"
 | 
						|
    [ "${bundle%.woa}" != "$bundle" -o "${bundle%.framework}" != "$bundle" ]
 | 
						|
}
 | 
						|
 | 
						|
function is_woappdir() {
 | 
						|
    # Tester si $1 est un répertoire d'application webobjects. Le test est
 | 
						|
    # effectué sur le contenu du bundle, pas sur le nom (utiliser is_wobundle()
 | 
						|
    # pour cela)
 | 
						|
 | 
						|
    # existence du répertoire
 | 
						|
    [ -d "$1" ] || return 1
 | 
						|
    # répertoires de resources
 | 
						|
    [ -d "$1/Contents/Resources" ] || return 1
 | 
						|
    # répertoires de classpath
 | 
						|
    [ -d "$1/Contents/UNIX" ] || return 1
 | 
						|
    [ -d "$1/Contents/MacOS" ] || return 1
 | 
						|
    [ -d "$1/Contents/Windows" ] || return 1
 | 
						|
    # fin des tests
 | 
						|
    return 0
 | 
						|
}
 | 
						|
 | 
						|
function is_wofwkdir() {
 | 
						|
    # Tester si $1 est un répertoire de framework webobjects. Le test est
 | 
						|
    # effectué sur le contenu du bundle, pas sur le nom (utiliser is_wobundle()
 | 
						|
    # pour cela)
 | 
						|
    
 | 
						|
    # existence du répertoire
 | 
						|
    [ -d "$1" ] || return 1
 | 
						|
    # répertoires de resource
 | 
						|
    [ -d "$1/Resources" -o -d "$1/WebServerResources" ] || return 1
 | 
						|
    # fin des tests
 | 
						|
    return 0
 | 
						|
}
 | 
						|
 | 
						|
function get_app_winclspth() {
 | 
						|
    # calculer la valeur de Contents/Windows/CLSSPATH.txt pour l'application $1
 | 
						|
    local found
 | 
						|
    if [ ! -f "$1/Contents/Windows/CLSSPATH.txt" ]; then
 | 
						|
        local clspth
 | 
						|
        array_from_lines clspth "$(list_files "$1/Contents/Windows" | grep -i clsspath.txt)"
 | 
						|
        if [ ${#clspth[*]} -eq 1 ]; then
 | 
						|
            echo "Contents/Windows/$clspth"
 | 
						|
            found=1
 | 
						|
        fi
 | 
						|
    fi
 | 
						|
    # pas trouvé, prendre la valeur par défaut
 | 
						|
    [ -n "$found" ] || echo Contents/Windows/CLSSPATH.txt
 | 
						|
}
 | 
						|
 | 
						|
function get_infofile() {
 | 
						|
    # Obtenir le chemin vers le fichier Info.plist dans le répertoire de
 | 
						|
    # resource du bundle $1
 | 
						|
    local bundle="$(abspath "$1")" resdir
 | 
						|
    if endswith "$bundle" .woa; then
 | 
						|
        resdir="$bundle/Contents"
 | 
						|
    elif endswith "$bundle" .framework; then
 | 
						|
        resdir="$bundle/Resources"
 | 
						|
    else
 | 
						|
        # on a donné directement resdir
 | 
						|
        resdir="$bundle"
 | 
						|
    fi
 | 
						|
    echo "$resdir/Info.plist"
 | 
						|
}
 | 
						|
 | 
						|
function read_infofile() {
 | 
						|
    # Lire la version et le numéro de release dans le fichier $1 (chemin vers
 | 
						|
    # Info.plist) et les placer dans les variables $2(=version) et $3(=release)
 | 
						|
    # Retourner 1 si un erreur s'est produite, par exemple si le fichier $1
 | 
						|
    # n'existe pas ou n'est pas accessible en lecture
 | 
						|
    [ -f "$1" -a -r "$1" ] || return 1
 | 
						|
    set_var "${2:-version}" "$(grep -A 1 CFBundleShortVersionString "$1" | tail -1 | sed 's/^.*<string>\(.*\)<\/string>.*$/\1/')"
 | 
						|
    set_var "${3:-release}" "$(grep -A 1 CFBundleVersion "$1" | tail -1 | sed 's/^.*<string>\(.*\)<\/string>.*$/\1/')"
 | 
						|
}
 | 
						|
 | 
						|
function write_infofile() {
 | 
						|
    # Ecrire $2 (la version) et $3 (le numéro de release) dans le fichier $1
 | 
						|
    # (chemin vers Info.plist)
 | 
						|
    # Retourner 1 si un erreur s'est produite, par exemple si le fichier $1
 | 
						|
    # n'existe pas
 | 
						|
    local status tmpfile
 | 
						|
    ac_set_tmpfile tmpfile
 | 
						|
    <"$1" >"$tmpfile" cawkrun version="$2" release="$3" '
 | 
						|
      /<key>CFBundleShortVersionString<\/key>/ {
 | 
						|
        print; getline
 | 
						|
        sub(/<string>.*<\/string>/, "<string>" version "</string>")
 | 
						|
        print; next
 | 
						|
      }
 | 
						|
      /<key>CFBundleVersion<\/key>/ {
 | 
						|
        print; getline
 | 
						|
        sub(/<string>.*<\/string>/, "<string>" release "</string>")
 | 
						|
        print; next
 | 
						|
      }
 | 
						|
      { print }
 | 
						|
    ' && cat "$tmpfile" >"$1"
 | 
						|
    status=$?
 | 
						|
    ac_clean "$tmpfile"
 | 
						|
    return $status
 | 
						|
}
 | 
						|
 | 
						|
function get_jawotoolsfile() {
 | 
						|
    # Obtenir le chemin vers le fichier jawotools.properties dans le bundle $1
 | 
						|
    local default="$1/jawotools.properties" file
 | 
						|
    for file in "$default" "$1/build_infos.txt"; do
 | 
						|
        if [ -f "$file" ]; then
 | 
						|
            echo "$file"
 | 
						|
            return
 | 
						|
        fi
 | 
						|
    done
 | 
						|
    echo "$default"
 | 
						|
}
 | 
						|
 | 
						|
function read_jawotoolsfile() {
 | 
						|
    # lire le fichier de propriété $1 et placer les valeurs dans les variables
 | 
						|
    # $2(=version), $3(=releaseDate), $4(=description)
 | 
						|
    local filename="$(basename "$1")"
 | 
						|
    if [ "$filename" == "build_infos.txt" ]; then
 | 
						|
        # legacy
 | 
						|
        read_property "$1" version "${2:-version}"
 | 
						|
        read_property "$1" date "${3:-releaseDate}"
 | 
						|
        read_property "$1" desc "${4:-description}"
 | 
						|
    else
 | 
						|
        read_property "$1" version "${2:-version}"
 | 
						|
        read_property "$1" releaseDate "${3:-releaseDate}"
 | 
						|
        read_property "$1" description "${4:-description}"
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
function save_jawotoolsfile() {
 | 
						|
    # écrire le fichier de propriété $1 avec les valeurs version ($2),
 | 
						|
    # releaseDate ($3) et description ($4)
 | 
						|
    [ -e "$1" ] || touch "$1"
 | 
						|
    write_property "$1" version "$2"
 | 
						|
    write_property "$1" releaseDate "$3"
 | 
						|
    write_property "$1" description "$4"
 | 
						|
}
 | 
						|
 | 
						|
function get_versionfile() {
 | 
						|
    # Obtenir le chemin vers le fichier VERSION.txt dans le répertoire de
 | 
						|
    # resource du bundle $1
 | 
						|
    local bundle="$(abspath "$1")" resdir
 | 
						|
    if endswith "$bundle" .woa; then
 | 
						|
        resdir="$bundle/Contents/Resources"
 | 
						|
    elif endswith "$bundle" .framework; then
 | 
						|
        resdir="$bundle/Resources"
 | 
						|
    else
 | 
						|
        # on a donné directement resdir
 | 
						|
        resdir="$bundle"
 | 
						|
    fi
 | 
						|
    local default="$resdir/VERSION.txt" file
 | 
						|
    for file in "$default" "$1/version.txt"; do
 | 
						|
        if [ -f "$file" ]; then
 | 
						|
            echo "$file"
 | 
						|
            return
 | 
						|
        fi
 | 
						|
    done
 | 
						|
    echo "$default"
 | 
						|
}
 | 
						|
 | 
						|
function get_configfile() {
 | 
						|
    # obtenir le chemin vers le fichier de configuration du répertoire de
 | 
						|
    # resource du bundle
 | 
						|
    # $1=bundle ou resdir (appdir/Contents/Resources ou fwkdir/Resources)
 | 
						|
    local bundle="$(abspath "$1")" resdir
 | 
						|
    if endswith "$bundle" .woa; then
 | 
						|
        resdir="$bundle/Contents/Resources"
 | 
						|
    elif endswith "$bundle" .framework; then
 | 
						|
        resdir="$bundle/Resources"
 | 
						|
    else
 | 
						|
        # on a donné directement resdir
 | 
						|
        resdir="$bundle"
 | 
						|
    fi
 | 
						|
    local configs
 | 
						|
    array_lsfiles configs "$resdir" "*.config"
 | 
						|
    if [ ${#configs[*]} -eq 0 ]; then
 | 
						|
        array_lsfiles configs "$resdir" "config.xml"
 | 
						|
    fi
 | 
						|
    echo "${configs:-$resdir/Properties}"
 | 
						|
}
 | 
						|
 | 
						|
function searchreplace_classpath() {
 | 
						|
    # Dans les fichiers classpath de l'application $1, remplacer $2 par $3. Si
 | 
						|
    # $3 est vide, la ligne est supprimée
 | 
						|
    local bundle="$1" search="$2" replace="$3" scriptunx scriptwin clspth
 | 
						|
 | 
						|
    [ -n "$search" ] || return 1
 | 
						|
    search="${search//\//\\/}"; replace="${replace//\//\\/}"
 | 
						|
    if [ -n "$replace" ]; then
 | 
						|
        scriptunx="s/${search}/${replace}/g"
 | 
						|
    else
 | 
						|
        scriptunx="/${search}/d"
 | 
						|
    fi
 | 
						|
    search="${search//\\\//\\\\}"; replace="${replace//\\\//\\\\}"
 | 
						|
    if [ -n "$replace" ]; then
 | 
						|
        scriptwin="s/${search}/${replace}/g"
 | 
						|
    else
 | 
						|
        scriptwin="/${search}/d"
 | 
						|
    fi
 | 
						|
 | 
						|
    clspth="$bundle/Contents/UNIX/UNIXClassPath.txt"
 | 
						|
    nl2lf "$clspth"; sedi "$scriptunx" "$clspth"
 | 
						|
    clspth="$bundle/Contents/MacOS/MacOSClassPath.txt"
 | 
						|
    nl2lf "$clspth"; sedi "$scriptunx" "$clspth"
 | 
						|
    clspth="$bundle/$(get_app_winclspth "$bundle")"
 | 
						|
    nl2lf "$clspth"; sedi "$scriptwin" "$clspth"; nl2crlf "$clspth"
 | 
						|
}
 | 
						|
 | 
						|
function dump_jars() {
 | 
						|
    # Afficher les jars des frameworks utilisés par l'application $1
 | 
						|
    local clspth
 | 
						|
    if [ "$UNAME_SYSTEM" == "Darwin" ]; then
 | 
						|
        clspth="Contents/MacOS/MacOSClassPath.txt"
 | 
						|
    else
 | 
						|
        clspth="Contents/UNIX/UNIXClassPath.txt"
 | 
						|
    fi
 | 
						|
    cat "$1/$clspth" | _nl2lf | grep '\.framework' | grep -v "^#" | grep -v "APPROOT/" | grep -v "WOROOT/" | awk '{
 | 
						|
      if (match($0, /[^\/]*\.framework/) != 0) {
 | 
						|
        print
 | 
						|
      }
 | 
						|
    }' | sort -u
 | 
						|
}
 | 
						|
 | 
						|
function dump_frameworks() {
 | 
						|
    # Afficher les frameworks utilisés par l'application $1
 | 
						|
    dump_jars "$1" | awk '{
 | 
						|
      if (match($0, /[^\/]*\.framework/) != 0) {
 | 
						|
        print substr($0, RSTART, RLENGTH)
 | 
						|
      }
 | 
						|
    }'
 | 
						|
}
 | 
						|
 | 
						|
function remove_framework() {
 | 
						|
    # supprimer le framework $2 (nom de base) des fichiers de classpath du
 | 
						|
    # bundle d'application $1
 | 
						|
    local bundle="$1" framework="$2" frameworks
 | 
						|
 | 
						|
    endswith "$framework" .framework || framework="$framework.framework"
 | 
						|
    array_from_lines frameworks "$(dump_frameworks "$bundle")"
 | 
						|
    if array_contains frameworks "$framework"; then
 | 
						|
        searchreplace_classpath "$bundle" "^LOCALROOT/.*/$framework/"
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
function add_framework() {
 | 
						|
    # s'il n'y existe pas déjà, ajouter le framework $2 (nom de base ou chemin
 | 
						|
    # absolu) aux fichiers de classpath du bundle d'application $1
 | 
						|
    local bundle="$1" framework="$2" frameworks jars jar line
 | 
						|
    local winclspth="$(get_app_winclspth "$bundle")"
 | 
						|
 | 
						|
    endswith "$framework" .framework || framework="$framework.framework"
 | 
						|
    array_from_lines frameworks "$(dump_frameworks "$bundle")"
 | 
						|
    if ! array_contains frameworks "$framework"; then
 | 
						|
        if beginswith "$framework" /; then
 | 
						|
            # on a donné un chemin absolu
 | 
						|
            array_lsfiles jars "$framework/Resources/Java" "*.jar"
 | 
						|
            if [ -z "${jars[*]}" ]; then
 | 
						|
                eerror "Impossible de trouver les fichiers du framework $framework
 | 
						|
dans $WOFRAMEWORKS"
 | 
						|
                return 1
 | 
						|
            else
 | 
						|
                for jar in "${jars[@]}"; do
 | 
						|
                    echo "$jar" >>"$bundle/Contents/UNIX/UNIXClassPath.txt"
 | 
						|
                    echo "$jar" >>"$bundle/Contents/MacOS/MacOSClassPath.txt"
 | 
						|
                    echo "${jar//\//\\}" >>"$bundle/$winclspth"
 | 
						|
                done
 | 
						|
            fi
 | 
						|
        else
 | 
						|
            # on a donné juste le nom du framework
 | 
						|
            array_from_lines jars "$(list_files "$WOFRAMEWORKS/$framework/Resources/Java" "*.jar")"
 | 
						|
            if [ -z "${jars[*]}" ]; then
 | 
						|
                eerror "Impossible de trouver les fichiers du framework $framework
 | 
						|
dans $WOFRAMEWORKS"
 | 
						|
                return 1
 | 
						|
            else
 | 
						|
                for jar in "${jars[@]}"; do
 | 
						|
                    line="LOCALROOT/Library/WebObjects/Applications/Frameworks/$framework/Resources/Java/$jar"
 | 
						|
                    echo "$line" >>"$bundle/Contents/UNIX/UNIXClassPath.txt"
 | 
						|
                    echo "$line" >>"$bundle/Contents/MacOS/MacOSClassPath.txt"
 | 
						|
                    echo "${line//\//\\}" >>"$bundle/$winclspth"
 | 
						|
                done
 | 
						|
            fi
 | 
						|
        fi
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
function fix_jars_case() {
 | 
						|
    # Vérifier que la casse des jars de tous les frameworks utilisés par
 | 
						|
    # l'application $1 est conforme au système de fichier
 | 
						|
    local bundle="$1" clspth jars jar fwkdir fwkname jarname jarnamefs
 | 
						|
    if [ "$UNAME_SYSTEM" == "Darwin" ]; then
 | 
						|
        clspth="Contents/MacOS/MacOSClassPath.txt"
 | 
						|
    else
 | 
						|
        clspth="Contents/UNIX/UNIXClassPath.txt"
 | 
						|
    fi
 | 
						|
    array_from_lines jars "$(dump_jars "$bundle")"
 | 
						|
    for jar in "${jars[@]}"; do
 | 
						|
        { endswith "$jar" .jar || endswith "$jar" .zip; } || continue
 | 
						|
 | 
						|
        if beginswith "$jar" LOCALROOT; then
 | 
						|
            fwkname="${jar##*/Frameworks/}"; fwkname="${fwkname%%/*}"
 | 
						|
            fwkdir="$WOFRAMEWORKS"
 | 
						|
        else
 | 
						|
            fwkdir="${jar%/*.framework/*}"
 | 
						|
            fwkname="${jar##/*.framework/}";
 | 
						|
            fwkname="${jar:0:$((${#jar}-${#fwkname}-1))}"; fwkname="${fwkname##*/}"
 | 
						|
        fi
 | 
						|
        jarname="${jar##*/}"
 | 
						|
 | 
						|
        if [ ! -d "$fwkdir/$fwkname" ]; then
 | 
						|
            eerror "$(basename "$bundle"): $fwkname: ce framework n'existe pas"
 | 
						|
            continue
 | 
						|
        fi
 | 
						|
 | 
						|
        array_from_lines jarnamefs "$(list_files "$fwkdir/$fwkname/Resources/Java" "*.jar" | grep -i "^$jarname")"
 | 
						|
        if [ ${#jarnamefs[*]} -eq 0 ]; then
 | 
						|
            eerror "$(basename "$bundle"): $fwkname: $jarname n'existe pas"
 | 
						|
        elif [ ${#jarnamefs[*]} -gt 1 ]; then
 | 
						|
            eerror "$(basename "$bundle"): $fwkname: il existe plusieurs jars $jarname"
 | 
						|
        else
 | 
						|
            if [ "$jarname" != "$jarnamefs" ]; then
 | 
						|
                einfo "$(basename "$bundle"): $fwkname: $jarnamefs"
 | 
						|
                searchreplace_classpath "$bundle" "$fwkname/Resources/Java/$jarname" "$fwkname/Resources/Java/$jarnamefs"
 | 
						|
            fi
 | 
						|
        fi
 | 
						|
    done
 | 
						|
}
 | 
						|
 | 
						|
function verifix_bundle() {
 | 
						|
    # vérifier et corriger le bundle $1. Pour une application, on vérifie que le
 | 
						|
    # script est exécutable. Pour un framework, on vérifie que le framework est
 | 
						|
    # conforme au modèle des framework générés par WebObjects.
 | 
						|
    local bundle="$1"
 | 
						|
    if is_woappdir "$bundle"; then
 | 
						|
        local script="$bundle/$(basename "$bundle" .woa)"
 | 
						|
        if [ ! -x "$script" ]; then
 | 
						|
            chmod +x "$script"
 | 
						|
        fi
 | 
						|
 | 
						|
    elif is_wofwkdir "$bundle"; then
 | 
						|
        [ -L "$bundle/Resources" ] && return
 | 
						|
 | 
						|
        local filename
 | 
						|
 | 
						|
        if [ ! -L "$bundle/Resources" ]; then
 | 
						|
            rm -rf "$bundle/Versions/A/Resources"
 | 
						|
            cpdir "$bundle/Resources" "$bundle/Versions/A/Resources"
 | 
						|
            rm -rf "$bundle/Resources"
 | 
						|
        fi
 | 
						|
        if [ ! -L "$bundle/WebServerResource" ]; then
 | 
						|
            rm -rf "$bundle/Versions/A/WebServerResources"
 | 
						|
            cpdir "$bundle/WebServerResources" "$bundle/Versions/A/WebServerResources"
 | 
						|
            rm -rf "$bundle/WebServerResources"
 | 
						|
        fi
 | 
						|
        local cwd="$(pwd)"
 | 
						|
        cd "$bundle/Versions"
 | 
						|
        if [ -e Current ]; then
 | 
						|
            if [ ! -L Current -a -d Current ]; then
 | 
						|
                rm -rf Current
 | 
						|
            else
 | 
						|
                rm -f Current
 | 
						|
            fi
 | 
						|
        fi
 | 
						|
        ln -s A Current
 | 
						|
        cd ..
 | 
						|
        ln -s Versions/Current/Resources Resources
 | 
						|
        ln -s Versions/Current/WebServerResources WebServerResources
 | 
						|
        cd "$cwd"
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
function compute_fapps() {
 | 
						|
    # Placer dans le tableau $1(=fappnames) la liste des noms de bundle
 | 
						|
    # d'applications qui dépendent du framework $2
 | 
						|
    # Cette opération est faite à partir des informations sur le système de
 | 
						|
    # fichier. Elle ne peut donc concerner qu'une installation locale.
 | 
						|
    local -a __cf_fappnames
 | 
						|
    local __cf_fwknames __cf_fwkname __cf_appnames __cf_appname
 | 
						|
 | 
						|
    __cf_fwkname="$2"
 | 
						|
    [ "${__cf_fwkname%.framework}" != "$__cf_fwkname" ] || __cf_fwkname="$__cf_fwkname.framework"
 | 
						|
    __cf_fwkname="$(basename "$__cf_fwkname")"
 | 
						|
 | 
						|
    array_from_lines __cf_appnames "$(list_dirs "$WOAPPLICATIONS" "*.woa")"
 | 
						|
    for __cf_appname in "${__cf_appnames[@]}"; do
 | 
						|
        array_from_lines __cf_fwknames "$(dump_frameworks "$WOAPPLICATIONS/$__cf_appname")"
 | 
						|
        if array_contains __cf_fwknames "$__cf_fwkname"; then
 | 
						|
            array_set __cf_fappnames "$__cf_appname"
 | 
						|
        fi
 | 
						|
    done
 | 
						|
    array_copy "${1:-fappnames}" __cf_fappnames
 | 
						|
}
 | 
						|
 | 
						|
################################################################################
 | 
						|
# Applications et instances
 | 
						|
 | 
						|
WORAURL_USE_PROXY= # faut-il passer par un proxy?
 | 
						|
WORAURL_DATA=
 | 
						|
function woraurl() {
 | 
						|
    # Faire une requête avec la méthode $1 sur l'url $2 avec le payload $3 (par
 | 
						|
    # exemple pour la méthode POST). la réponse est disponible dans le fichier
 | 
						|
    # $WORAURL_DATA, $4(=http_code) contient le code de réponse.
 | 
						|
    # Retourner 0 en cas de succès, ou une valeur différente de zéro si un
 | 
						|
    # erreur se produit (typiquement, 3 pour une erreur du serveur, 1 pour une
 | 
						|
    # réponse applicative, comme par exemple si l'application n'existe pas)
 | 
						|
    # Les codes de réponse 2xx et 417 sont des succès
 | 
						|
    # Les autres codes (à priori 4xx ou 5xx) sont des erreurs
 | 
						|
    # note: le code 417 est utilisé par le moniteur pour répondre "Non", par
 | 
						|
    # opposition à 200 utilisé pour répondre "OUI"
 | 
						|
    local _status _http_code _args
 | 
						|
    [ -n "$WORAURL_DATA" ] || ac_set_tmpfile WORAURL_DATA
 | 
						|
    _args=(-s -X "${1:-GET}" ${3:+-d "$3"} -w '%{http_code}' -o "$WORAURL_DATA")
 | 
						|
    [ -z "$WORAURL_USE_PROXY" ] && _args=("${_args[@]}" -x "")
 | 
						|
    _http_code="$(curl "${_args[@]}" "$2")"
 | 
						|
    case "$_http_code" in
 | 
						|
    2*|417) _status=0;;
 | 
						|
    4*) _status=1;;
 | 
						|
    5*) _status=3;;
 | 
						|
    *) _status=11;;
 | 
						|
    esac
 | 
						|
    set_var "${4:-http_code}" "$_http_code"
 | 
						|
    return $_status
 | 
						|
}
 | 
						|
function wogeturl() { woraurl GET "$@"; }
 | 
						|
 | 
						|
function splitins() {
 | 
						|
    # Analyser le nom $1, qui peut être de forme '', 'Name.woa',
 | 
						|
    # 'Name.framework', 'App' ou 'Instance-N' (où N est un nombre), et
 | 
						|
    # initialiser les variables $2(=type) et $3(=name)
 | 
						|
    # Si $1=="", type=all et name=""
 | 
						|
    # Si $1==Name.woa, type=woa et name=Name.woa
 | 
						|
    # Si $1==Name.framework, type=fwk et name=Name.framework
 | 
						|
    # Si $1==App, type=app et name=App
 | 
						|
    # si $1==App-N, type=ins et name=App-N
 | 
						|
    if [ -z "$1" ]; then
 | 
						|
        set_var "${2:-type}" all
 | 
						|
        set_var "${3:-name}"
 | 
						|
    elif [ "${1%.woa}" != "$1" ]; then
 | 
						|
        set_var "${2:-type}" woa
 | 
						|
        set_var "${3:-name}" "$1"
 | 
						|
    elif [ "${1%.framework}" != "$1" ]; then
 | 
						|
        set_var "${2:-type}" fwk
 | 
						|
        set_var "${3:-name}" "$1"
 | 
						|
    elif [[ "$1" == *-* ]]; then
 | 
						|
        local __si_name __si_num
 | 
						|
        __si_name="${1%-*}"
 | 
						|
        __si_num="${1##*-}"
 | 
						|
        if [ -z "${__si_num//[0-9]/}" ]; then
 | 
						|
            set_var "${2:-type}" ins
 | 
						|
            set_var "${3:-name}" "$1"
 | 
						|
        else
 | 
						|
            set_var "${2:-type}" app
 | 
						|
            set_var "${3:-name}" "$1"
 | 
						|
        fi
 | 
						|
    elif [ -n "$1" ]; then
 | 
						|
        set_var "${2:-type}" app
 | 
						|
        set_var "${3:-name}" "$1"
 | 
						|
    fi        
 | 
						|
}
 | 
						|
 | 
						|
################################################################################
 | 
						|
# Environnement
 | 
						|
 | 
						|
function create_wodirs_maybe() {
 | 
						|
    mkdir -p "$WOAPPLICATIONS"
 | 
						|
    mkdir -p "$WOFRAMEWORKS"
 | 
						|
}
 | 
						|
 | 
						|
function check_autostart() {
 | 
						|
    # vérifier la présence du fichier $WOAUTOSTART. Si ce n'est pas le cas, le
 | 
						|
    # créer avec le contenu du tableau $1
 | 
						|
    if [ ! -f "$WOAUTOSTART" -a -n "$1" ]; then
 | 
						|
        array_to_lines "$1" | csort >"$WOAUTOSTART" || return 1
 | 
						|
        enote "Le fichier $(ppath "$WOAUTOSTART") a été créé avec la liste suivante:
 | 
						|
$(<"$WOAUTOSTART")"
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
function get_autostart_order() {
 | 
						|
    # Initialiser le tableau $1 avec la liste donnée dans le fichier
 | 
						|
    # $WOAUTOSTART
 | 
						|
    array_from_lines "$1" "$(<"$WOAUTOSTART" filter_comment)"
 | 
						|
}
 | 
						|
 | 
						|
function apply_autostart_order() {
 | 
						|
    # Réordonner les valeurs $3..* selon la liste donnée dans le tableau $2,
 | 
						|
    # puis placer le résultat dans le tableau $1. $2 doit être construit avec
 | 
						|
    # get_autostart_order(). Si $2 n'est pas spécifié, la liste est construite
 | 
						|
    # localement.
 | 
						|
    # Si le tableau contient des lignes de délai @N, replacer les délais après
 | 
						|
    # les applications appropriées
 | 
						|
    local __aa_reverse
 | 
						|
    if [ "$1" == "-r" ]; then
 | 
						|
        __aa_reverse=1
 | 
						|
        shift
 | 
						|
    fi
 | 
						|
    local -a __aa_oapps __aa_src
 | 
						|
    local __aa_dest="$1" __aa_oapp; shift
 | 
						|
    local __found
 | 
						|
    if [ -n "$1" ]; then
 | 
						|
        array_copy __aa_oapps "$1"
 | 
						|
    else
 | 
						|
        get_autostart_order __aa_oapps
 | 
						|
    fi
 | 
						|
    shift
 | 
						|
    set_array __aa_src @ "$@"
 | 
						|
    array_new "$__aa_dest"
 | 
						|
    for __aa_oapp in "${__aa_oapps[@]}"; do
 | 
						|
        if [[ "$__aa_oapp" == @* ]]; then
 | 
						|
            # Si on trouve une ligne @N, et que la précédente ligne a été
 | 
						|
            # sélectionnée, alors inclure le délai aussi dans la liste des
 | 
						|
            # valeurs à prendre en compte
 | 
						|
            [ -n "$__aa_found" ] && array_add "$__aa_dest" "$__aa_oapp"
 | 
						|
            __aa_found=
 | 
						|
        elif array_contains __aa_src "$__aa_oapp"; then
 | 
						|
            array_add "$__aa_dest" "$__aa_oapp"
 | 
						|
            array_del __aa_src "$__aa_oapp"
 | 
						|
            __aa_found=1
 | 
						|
        else
 | 
						|
            __aa_found=
 | 
						|
        fi
 | 
						|
    done
 | 
						|
    array_extend "$__aa_dest" __aa_src
 | 
						|
    [ -n "$__aa_reverse" ] && array_reverse "$__aa_dest"
 | 
						|
}
 | 
						|
 | 
						|
function __unix_woservices() {
 | 
						|
    if [ -x /etc/init.d/WOServices ]; then
 | 
						|
        /etc/init.d/WOServices "$@"
 | 
						|
    else
 | 
						|
        eerror "Ce script ne sait pas piloter wotaskd/javamonitor sur cette plateforme"
 | 
						|
        return 1
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
SERVICE_OVERRIDE_wotaskd_stop=wotaskd_stop
 | 
						|
function wotaskd_stop() {
 | 
						|
    if [ "$UNAME_SYSTEM" == "Darwin" ]; then
 | 
						|
        launchctl unload /System/Library/LaunchDaemons/com.apple.wotaskd.plist
 | 
						|
    else
 | 
						|
        __unix_woservices stop
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
SERVICE_OVERRIDE_wotaskd_start=wotaskd_start
 | 
						|
function wotaskd_start() {
 | 
						|
    if [ "$UNAME_SYSTEM" == "Darwin" ]; then
 | 
						|
        launchctl load /System/Library/LaunchDaemons/com.apple.wotaskd.plist
 | 
						|
    else
 | 
						|
        __unix_woservices start
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
SERVICE_OVERRIDE_javamonitor_stop=javamonitor_stop
 | 
						|
SERVICE_OVERRIDE_womonitor_stop=javamonitor_stop
 | 
						|
function javamonitor_stop() {
 | 
						|
    if [ "$UNAME_SYSTEM" == "Darwin" ]; then
 | 
						|
        launchctl unload /System/Library/LaunchDaemons/com.apple.womonitor.plist
 | 
						|
    else
 | 
						|
        __unix_woservices stop
 | 
						|
    fi
 | 
						|
}
 | 
						|
function womonitor_stop() { javamonitor_stop "$@"; }
 | 
						|
 | 
						|
SERVICE_OVERRIDE_javamonitor_start=javamonitor_start
 | 
						|
SERVICE_OVERRIDE_womonitor_start=javamonitor_start
 | 
						|
function javamonitor_start() {
 | 
						|
    if [ "$UNAME_SYSTEM" == "Darwin" ]; then
 | 
						|
        launchctl load /System/Library/LaunchDaemons/com.apple.womonitor.plist
 | 
						|
    else
 | 
						|
        __unix_woservices start
 | 
						|
    fi
 | 
						|
}
 | 
						|
function womonitor_start() { javamonitor_start "$@"; }
 | 
						|
 | 
						|
SERVICE_OVERRIDE_woservices_stop=woservices_stop
 | 
						|
function woservices_stop() {
 | 
						|
    if [ "$UNAME_SYSTEM" == "Darwin" ]; then
 | 
						|
        javamonitor_stop
 | 
						|
        wotaskd_stop
 | 
						|
    else
 | 
						|
        __unix_woservices stop
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
SERVICE_OVERRIDE_woservices_start=woservices_start
 | 
						|
function woservices_start() {
 | 
						|
    if [ "$UNAME_SYSTEM" == "Darwin" ]; then
 | 
						|
        wotaskd_start
 | 
						|
        javamonitor_start
 | 
						|
    else
 | 
						|
        __unix_woservices start
 | 
						|
    fi
 | 
						|
}
 |