158 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
 | 
						|
 | 
						|
function __lf_get_age() {
 | 
						|
    y=$(date "+%Y")
 | 
						|
    dy=$(date "+%j"); while [ ${dy#0} != $dy ]; do dy=${dy#0}; done
 | 
						|
    h=$(date "+%H"); while [ ${h#0} != $h ]; do h=${h#0}; done
 | 
						|
    echo $((($y * 365 + $dy) * 24 + $h))
 | 
						|
}
 | 
						|
 | 
						|
function lockfile_set() {
 | 
						|
    # USAGE
 | 
						|
    #     lockfile_set [-h max_hours] /path/to/lockfile
 | 
						|
    # OPTIONS
 | 
						|
    #     lockfile
 | 
						|
    #         fichier qui doit contenir le verrou
 | 
						|
    #     -h max_hours
 | 
						|
    #         Nombre d'heures (par défaut 4) au bout duquel on retourne 2
 | 
						|
    #         Sinon, on retourne 1.
 | 
						|
    # Retourne 0 si le verrou a été placé correctement. Le fichier sera supprimé
 | 
						|
    # automatiquement en fin de script.
 | 
						|
    # Retourne 1 si le verrou n'a pas pu être placé
 | 
						|
    # Retourne 2 si le verrou n'a pas pu être placé au bout de max_hours heures
 | 
						|
    local OENC="$UTF8"
 | 
						|
    local end_of_options lockfile max_hours=4
 | 
						|
    while [ -n "$1" ]; do
 | 
						|
        case "$1" in
 | 
						|
        -h)
 | 
						|
            shift
 | 
						|
            max_hours="$1"
 | 
						|
            ;;
 | 
						|
        --)
 | 
						|
            shift
 | 
						|
            end_of_options=1
 | 
						|
            ;;
 | 
						|
 | 
						|
        -*)
 | 
						|
            if ! set_verbosity "$1" -v; then
 | 
						|
                ewarn "option non reconnue: $1"
 | 
						|
            fi
 | 
						|
            ;;
 | 
						|
 | 
						|
        *)
 | 
						|
            end_of_options=1
 | 
						|
            ;;
 | 
						|
        esac
 | 
						|
        [ -n "$end_of_options" ] && break
 | 
						|
        shift
 | 
						|
    done
 | 
						|
 | 
						|
    lockfile="$1"
 | 
						|
    [ -n "$lockfile" ] || return 1
 | 
						|
 | 
						|
    local now="$(__lf_get_age)"
 | 
						|
    if [ -f "$lockfile" ]; then
 | 
						|
        local prev=$(<"$lockfile") diff="$(($now - $prev))"
 | 
						|
        [ "$diff" -gt "$max_hours" ] && return 2 || return 1
 | 
						|
    fi
 | 
						|
    touch "$lockfile" || return 1
 | 
						|
    autoclean "$lockfile"
 | 
						|
    echo "$now" >"$lockfile"
 | 
						|
}
 | 
						|
 | 
						|
function pidfile_set() {
 | 
						|
    # USAGE
 | 
						|
    #     pidfile_set [-p pid] /path/to/pidfile
 | 
						|
    # OPTIONS
 | 
						|
    #     pidfile
 | 
						|
    #         fichier qui doit contenir le pid du script
 | 
						|
    #     -p pid
 | 
						|
    #         spécifier le pid. par défaut, utiliser $$
 | 
						|
    #     -r
 | 
						|
    #         si pidfile existe mais que le processus ne tourne plus, faire
 | 
						|
    #         comme si le fichier n'existe pas.
 | 
						|
    # Retourner 0 si le pid a été correctement écrit dans le fichier. Ce fichier
 | 
						|
    # sera supprimmé automatiquement en fin de script
 | 
						|
    # Retourner 1 si le fichier existe déjà et que le processus est en train de
 | 
						|
    # tourner.
 | 
						|
    # Retourner 2 si le fichier existe déjà mais que le processus ne tourne
 | 
						|
    # plus.
 | 
						|
    # Retourner 10 si autre erreur grave s'est produite (par exemple, s'il manque
 | 
						|
    # le chemin vers pidfile, ou si le fichier n'est pas accessible en
 | 
						|
    # écriture.)
 | 
						|
    local OENC="$UTF8"
 | 
						|
    local end_of_options pidfile pid=$$ replace=
 | 
						|
    while [ -n "$1" ]; do
 | 
						|
        case "$1" in
 | 
						|
        -p)
 | 
						|
            shift
 | 
						|
            pid="$1"
 | 
						|
            ;;
 | 
						|
        -r)
 | 
						|
            replace=1
 | 
						|
            ;;
 | 
						|
        --)
 | 
						|
            shift
 | 
						|
            end_of_options=1
 | 
						|
            ;;
 | 
						|
 | 
						|
        -*)
 | 
						|
            if ! set_verbosity "$1" -v; then
 | 
						|
                ewarn "option non reconnue: $1"
 | 
						|
            fi
 | 
						|
            ;;
 | 
						|
 | 
						|
        *)
 | 
						|
            end_of_options=1
 | 
						|
            ;;
 | 
						|
        esac
 | 
						|
        [ -n "$end_of_options" ] && break
 | 
						|
        shift
 | 
						|
    done
 | 
						|
 | 
						|
    pidfile="$1"
 | 
						|
    [ -n "$pidfile" ] || return 10
 | 
						|
 | 
						|
    if [ -f "$pidfile" ]; then
 | 
						|
        local curpid="$(<"$pidfile")"
 | 
						|
        if is_running "$curpid"; then
 | 
						|
            return 1
 | 
						|
        elif [ -n "$replace" ]; then
 | 
						|
            /bin/rm -f "$pidfile" || return 10
 | 
						|
        else
 | 
						|
            return 2
 | 
						|
        fi
 | 
						|
    fi
 | 
						|
 | 
						|
    echo_ "$pid" >"$pidfile" || return 10
 | 
						|
    autoclean "$pidfile"
 | 
						|
    return 0
 | 
						|
}
 | 
						|
 | 
						|
function read_mainClasses() {
 | 
						|
    # USAGE
 | 
						|
    #     read_mainClasses scriptName /path/to/mainClasses
 | 
						|
    # Lire le fichier mainClasses et initialiser les variables correspondant à
 | 
						|
    # scriptName.
 | 
						|
    # Retourner 1 si une erreur quelconque se produit: l'entrée correspondant à
 | 
						|
    # scriptName n'a pas été trouvée, il manque des arguments, ou le fichier
 | 
						|
    # mainClasses n'existe pas.
 | 
						|
    # Les lignes dans le fichier mainClasses doivent être de la forme
 | 
						|
    #     scriptName:mainClass[;var0=value0;...]
 | 
						|
    local OENC="$UTF8"
 | 
						|
    local scriptname_="$1" mainClasses_="$2"
 | 
						|
    [ -n "$scriptname_" -a -n "$mainClasses_" ] || return 1
 | 
						|
 | 
						|
    local line_="$(grep "^$scriptname_:" "$mainClasses_")" || return 1
 | 
						|
    [ -n "$line_" ] || return 1
 | 
						|
 | 
						|
    #scriptname="${line_%%:*}"
 | 
						|
    line_="${line_#*:}"
 | 
						|
    mainClass="${line_%%;*}"
 | 
						|
    line_="${line_#*;}"
 | 
						|
    if [ "$line_" != "$mainClass" ]; then
 | 
						|
        # Evaluer les variables
 | 
						|
        eval "$line_"
 | 
						|
    fi
 | 
						|
}
 |