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
 | |
| }
 |