2013-08-27 15:14:44 +04:00
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
######################################################################
# Gestion des processus
function wo_pidof() {
# obtenir le(s) pid de l'instance $1
# attention! on doit avoir un ps non legacy (cf sysinc/system_caps)
ps_all | grep "\-[W]OApplicationName $1 " | awk '{ print $1 }'
# note: on met [W] entre crochet pour que le processus associé à grep ne
# soit pas pris dans la liste
# note: on met un espace après le nom de l'application pour ne matcher que
# celle-là.
}
######################################################################
# Services basés sur le parcours du fichier SiteConfig.xml
AWK_FUNCTIONS='
function get_value(line) {
match(line, /^[^<]*<[^<>]*>/); line = substr(line, RSTART + RLENGTH)
match(line, /<.*$/); line = substr(line, 1, RSTART - 1)
return line
}
function get_attr_value(attr, line) {
match(line, attr "=\""); line = substr(line, RSTART + RLENGTH)
match(line, /".*$/); line = substr(line, 1, RSTART - 1)
return line
}
'
function siteconf_dump_hosts() {
# Retourner la liste des hôtes configurés
# Chaque ligne est de la forme:
# host type
[ -f "$WOCONFIGURATION/SiteConfig.xml" ] || return 1
awk <"$WOCONFIGURATION/SiteConfig.xml" "$AWK_FUNCTIONS"'
BEGIN {
in_hosts = 0
}
!in_hosts && $0 ~ /<hostArray / { in_hosts = 1 }
in_hosts && $0 ~ /<\/hostArray>/ { in_hosts = 0 }
in_hosts && $0 ~ /<element / {
name = ""
type = ""
}
in_hosts && $0 ~ /<\/element>/ {
print name " " type
}
in_hosts && $0 ~ /<name / { name = get_value($0) }
in_hosts && $0 ~ /<type / { type = get_value($0) }
'
}
function get_pathName() {
local system pathName
for system in Linux SunOS; do
[ "$system" == "$SYSTEM_NAME" ] && pathName=unixPath
done
for system in Darwin; do
[ "$system" == "$SYSTEM_NAME" ] && pathName=macPath
done
for system in Cygwin Mingw; do
[ "$system" == "$SYSTEM_NAME" ] && pathName=windowsPath
done
[ -n "$pathName" ] && echo "$pathName"
}
function siteconf_dump_applications() {
# Retourner la liste des mapplications configurées
# Chaque ligne est de la forme:
# name autoRecover debuggingEnabled path
[ -f "$WOCONFIGURATION/SiteConfig.xml" ] || return 1
pathName="$(get_pathName)"
awk -v pathName="$pathName" <"$WOCONFIGURATION/SiteConfig.xml" "$AWK_FUNCTIONS"'
BEGIN {
in_applications = 0
}
!in_applications && $0 ~ /<applicationArray / { in_applications = 1 }
in_applications && $0 ~ /<\/applicationArray>/ { in_applications = 0 }
in_applications && $0 ~ /<element / {
name = ""
autoRecover = ""
debuggingEnabled = ""
path = ""
}
in_applications && $0 ~ /<\/element>/ {
print name " " autoRecover " " debuggingEnabled " " path
}
in_applications && $0 ~ /<name / { name = get_value($0) }
in_applications && $0 ~ /<autoRecover / { autoRecover = get_value($0) }
in_applications && $0 ~ /<debuggingEnabled / { debuggingEnabled = get_value($0) }
in_applications && $0 ~ "<" pathName " " { path = get_value($0) }
'
}
function siteconf_dump_instances() {
# Retourner la liste des minstances configurées
# Chaque ligne est de la forme:
# applicationName id hostName port autoRecover debuggingEnabled path
[ -f "$WOCONFIGURATION/SiteConfig.xml" ] || return 1
awk -v pathName="$pathName" <"$WOCONFIGURATION/SiteConfig.xml" "$AWK_FUNCTIONS"'
BEGIN {
in_instances = 0
}
!in_instances && $0 ~ /<instanceArray / { in_instances = 1 }
in_instances && $0 ~ /<\/instanceArray>/ { in_instances = 0 }
in_instances && $0 ~ /<element / {
applicationName = ""
id = ""
hostName = ""
port = ""
autoRecover = ""
debuggingEnabled = ""
path = ""
}
in_instances && $0 ~ /<\/element>/ {
print applicationName " " id " " hostName " " port " " autoRecover " " debuggingEnabled " " path
}
in_instances && $0 ~ /<applicationName / { applicationName = get_value($0) }
in_instances && $0 ~ /<id / { id = get_value($0) }
in_instances && $0 ~ /<hostName / { hostName = get_value($0) }
in_instances && $0 ~ /<port / { port = get_value($0) }
in_instances && $0 ~ /<autoRecover / { autoRecover = get_value($0) }
in_instances && $0 ~ /<debuggingEnabled / { debuggingEnabled = get_value($0) }
in_instances && $0 ~ /<path / { path = get_value($0) }
'
}
function get_instances_for_woa() {
# lister les instances qui correspondent à l'application $1
# $1 peut être de la forme App.woa ou /path/to/App.woa
if [[ "$1" == /* ]]; then
local path="$1"
else
local path="$WOAPPLICATIONS/$(basename "$1")"
fi
local app="$(basename "$path")"
local appname="$(basename "$app" .woa)"
local appscript="$path/$appname"
2015-08-20 07:58:17 +04:00
siteconf_dump_applications | uawk -v appscript="$appscript" '$4 == appscript { print $1 }'
2013-08-27 15:14:44 +04:00
}
function get_instances_for_framework() {
# lister les instances qui correspondent aux applications qui utilisent le framework $1
# $1 doit être de la forme Fw.framework
local fwname="$(basename "$1")" fwnames appnames appname app
appnames="$(list_dirs "$WOAPPLICATIONS" "*.woa")"
while next_arg appnames appname; do
app="$WOAPPLICATIONS/$appname"
array_from_lines fwnames "$(dump_frameworks "$app")"
if array_contains fwnames "$fwname"; then
get_instances_for_woa "$app"
fi
done
}
function siteconf_get_monitor_password() {
# Lire le mot de passe dans le fichier SiteConfig.xml
[ -f "$WOCONFIGURATION/SiteConfig.xml" ] || return 1
awk <"$WOCONFIGURATION/SiteConfig.xml" '
$0 ~ /<password/ {
#print gensub("^.*>([^<]*)<.*$", "\\1", 1)
match($0, /^[^<]*<[^<>]*>/); $0 = substr($0, RSTART + RLENGTH)
match($0, /<.*$/); $0 = substr($0, 1, RSTART - 1)
print
}
'
}
function siteconf_get_instance_data_for_updateWotaskd() {
# obtenir les informations au format XML pour les instances données, à
# utiliser avec <updateWotaskd>
# Les informations sont retournées pour chaque minstance, une par ligne.
[ -f "$WOCONFIGURATION/SiteConfig.xml" ] || return 1
[ -n "$*" ] || return 1
script='
BEGIN {
found_instances = 0
found_element = 0
}
$0 ~ /<instanceArray/ {
found_instances = 1
}
found_instances && $0 ~ /<element/ {
found_element = 1
name = ""
data = ""
next
}
found_element && $0 ~ /<applicationName/ {
#name = gensub("^.*>([^<]*)<.*$", "\\1", 1)
name = $0
match(name, /^[^<]*<[^<>]*>/); name = substr(name, RSTART + RLENGTH)
match(name, /<.*$/); name = substr(name, 1, RSTART - 1)
}
found_element && $0 ~ /<\/element/ {
if ('
local instance notfirst=
for instance in "$@"; do
2017-03-01 22:34:59 +04:00
script="$script${notfirst:+|| }name == $(qawk "$instance")"
2013-08-27 15:14:44 +04:00
notfirst=1
done
script="$script"') {
print data
}
found_element = 0
next
}
found_element {
match($0, /^[\t]*/)
$0 = substr($0, RSTART + RLENGTH)
data = data $0
}
found_instances && $0 ~ /<\/instanceArray/ {
found_element = 0
found_instances = 0
}
'
awk <"$WOCONFIGURATION/SiteConfig.xml" "$script"
}
function siteconf_get_instance_data_for_commandWotaskd() {
# obtenir les informations au format XML pour les instances données, à
# utiliser avec <commandWotaskd>
# Les informations sont retournées pour chaque minstance, une par ligne.
[ -f "$WOCONFIGURATION/SiteConfig.xml" ] || return 1
script='
BEGIN {
found_instances = 0
found_element = 0
}
$0 ~ /<instanceArray/ {
found_instances = 1
}
found_instances && $0 ~ /<element/ {
found_element = 1
id = ""
port = ""
name = ""
hostName = ""
next
}
found_element && $0 ~ /<id/ {
#id = gensub("^.*>([^<]*)<.*$", "\\1", 1)
id = $0
match(id, /^[^<]*<[^<>]*>/); id = substr(id, RSTART + RLENGTH)
match(id, /<.*$/); id = substr(id, 1, RSTART - 1)
}
found_element && $0 ~ /<port/ {
#port = gensub("^.*>([^<]*)<.*$", "\\1", 1)
port = $0
match(port, /^[^<]*<[^<>]*>/); port = substr(port, RSTART + RLENGTH)
match(port, /<.*$/); port = substr(port, 1, RSTART - 1)
}
found_element && $0 ~ /<applicationName/ {
#name = gensub("^.*>([^<]*)<.*$", "\\1", 1)
name = $0
match(name, /^[^<]*<[^<>]*>/); name = substr(name, RSTART + RLENGTH)
match(name, /<.*$/); name = substr(name, 1, RSTART - 1)
}
found_element && $0 ~ /<hostName/ {
#hostName = gensub("^.*>([^<]*)<.*$", "\\1", 1)
hostName = $0
match(hostName, /^[^<]*<[^<>]*>/); hostName = substr(hostName, RSTART + RLENGTH)
match(hostName, /<.*$/); hostName = substr(hostName, 1, RSTART - 1)
}
found_element && $0 ~ /<\/element/ {
if ('
local instance notfirst=
for instance in "$@"; do
2017-03-01 22:34:59 +04:00
script="$script${notfirst:+|| }name == $(qawk "$instance")"
2013-08-27 15:14:44 +04:00
notfirst=1
done
script="$script"') {
print "<id type=\"NSNumber\">" id "</id><port type=\"NSNumber\">" port "</port><applicationName type=\"NSString\">" name "</applicationName><hostName type=\"NSString\">" hostName "</hostName>"
}
found_element = 0
next
}
found_element {
match($0, /^[\t]*/)
$0 = substr($0, RSTART + RLENGTH)
data = data $0
}
found_instances && $0 ~ /<\/instanceArray/ {
found_element = 0
found_instances = 0
}
'
awk <"$WOCONFIGURATION/SiteConfig.xml" "$script"
}
function get_autostart() {
# Afficher le chemin vers le fichier $WOCONFIGURATION/AutoStart.txt
echo "$WOCONFIGURATION/AutoStart.txt"
}
function apply_autostart_order() {
# Reordonner les instances du tableau $1 selon la liste données dans le
# fichier $WOCONFIGURATION/AutoStart.txt
local autostart_="$(get_autostart)"
[ -r "$autostart_" ] || return
local -a oinsts_ srcname_ dest_
local oinst_
array_from_lines oinsts_ "$(<"$autostart_" filter_conf)"
srcname_="$1"
for oinst_ in "${oinsts_[@]}"; do
if array_contains "$srcname_" "$oinst_"; then
array_add dest_ "$oinst_"
array_del "$srcname_" "$oinst_"
fi
done
array_extend dest_ "$srcname_"
array_copy "$srcname_" dest_
}
######################################################################
# Services basés sur wotaskd, sans mot de passe
function wotaskd_dump_woconfig() {
# afficher la configuration de wotaskd sur l'hôte $1 (par défaut
# $FQDNHOST). Il s'agit de la liste, pour chacune des instances, des
# minstances qui tournent actuellement.
# cette fonction n'a pas besoin de mot de passe pour fonctionner.
local host="${1:-$FQDNHOST}"
dumpurl -X "http://$host:1085/cgi-bin/WebObjects/wotaskd.woa/wa/woconfig"
}
function wotaskd_dump_running_instances() {
wotaskd_dump_woconfig | awk "$AWK_FUNCTIONS"'
BEGIN {
in_application = 0
}
!in_application && $0 ~ /<application / {
in_application = 1
name = get_attr_value("name", $0)
id = ""
port = ""
host = ""
}
in_application && $0 ~ /<\/application>/ { in_application = 0 }
in_application && $0 ~ /<instance / {
id = get_attr_value("id", $0)
port = get_attr_value("port", $0)
host = get_attr_value("host", $0)
print name " " id " " port " " host
}'
}
function wotaskd_get_running_instances() {
# Obtenir la liste des instances (une par ligne) qui tournent actuellement
# sur l'hôte $1 (par défaut $FQDNHOST).
# cette fonction n'a pas besoin de mot de passe pour fonctionner.
wotaskd_dump_woconfig "$1" | awk '
$0 ~ /<application/ {
#print gensub("^.*name=\"([^\"]*)\".*$", "\\1", 1)
match($0, /^.*name="/); $0 = substr($0, RSTART + RLENGTH)
match($0, /".*$/); $0 = substr($0, 1, RSTART - 1)
print
}
'
}
######################################################################
# Services basés sur wotaskd, avec mot de passe
# note: pour le fonctions de cette section, si un mot de passe est configuré
# pour le moniteur, la fonction doit être appelée avec le bon mot de passe
# (option -P). Pour obtenir le mot de passe, on peut utiliser la fonction
# siteconf_get_monitor_password()
function _getopt_host_and_password() {
# obtenir du code qui initialise l'hôte et le mot de passe à partir des
# arguments de la ligne de commande. Il faut utiliser ce code de cette
# manière:
# eval "$(_getopt_host_and_password)"
# l'option -h permet de spécifier l'hôte ($FQDNHOST par défaut)
# l'option -P permet de spécifier le mot de passe
# l'option -o permet de spécifier un fichier de sortie
echo '
local done= host="$FQDNHOST" password="$(siteconf_get_monitor_password)" outputfile="/dev/null"
while [ -n "$1" ]; do
case "$1" in
--)
shift
done=1
;;
-h)
shift
host="$1"
;;
-P)
shift
password="$1"
;;
-o)
shift
outputfile="$1"
;;
-*)
#ewarn "option non reconnue: $1"
;;
*)
done=1
;;
esac
[ -n "$done" ] && break
shift
done
'
}
function wotaskd_command() {
# lancer une commande wotask $1 avec le mot de passe $2 sur l'hôte $3
dumpurl -X -m POST "$1" ${2:+-H password "$2"} "http://$3:1085/cgi-bin/WebObjects/wotaskd.woa/wa/monitorRequest" ||
echo "ERROR: mot de passe incorrect ou dumpurl non disponible"
}
function wotaskd_dump_instances() {
# afficher la configuration des mapplications (instances) de wotaskd sur un
# hôte. Il s'agit de la liste des instances qui sont configurées.
eval "$(_getopt_host_and_password)"
wotaskd_command '<monitorRequest type="NSDictionary"><queryWotaskd type="NSString">APPLICATION</queryWotaskd></monitorRequest>' "$password" "$host"
}
function wotaskd_dump_minstances() {
# afficher la configuration des minstances de wotaskd sur un hôte. Il
# s'agit de la liste des instances qui sont configurées
eval "$(_getopt_host_and_password)"
wotaskd_command '<monitorRequest type="NSDictionary"><queryWotaskd type="NSString">INSTANCE</queryWotaskd></monitorRequest>' "$password" "$host"
}
function dump_minstances_stats_from_stdin() {
# Afficher les statistiques pour les instances de la ligne de commande à
# partir de la sortie de wotaskd_dump_minstances
# Les lignes affichées sont de la forme:
# applicationName id port runningState activeSessions transactions startedAt avgTransactionTime averageIdlePeriod
script="$AWK_FUNCTIONS"'
BEGIN {
in_instances = 0
}
!in_instances && $0 ~ /<instanceResponse / { in_instances = 1 }
in_instances && $0 ~ /<\/instanceResponse>/ { in_instances = 0 }
in_instances && $0 ~ /<element / {
applicationName = ""
id = ""
port = ""
runningState = ""
activeSessions = ""
transactions = ""
startedAt = ""
avgTransactionTime = ""
averageIdlePeriod = ""
}
in_instances && $0 ~ /<\/element>/ {
if (applicationName != ""'
local mapp filter
for mapp in "$@"; do
filter="${filter:+$filter || }applicationName == \"$mapp\""
done
[ -n "$filter" ] && filter="&& ($filter)"
script="$script$filter"') {
print applicationName " " id " " port " " runningState " " activeSessions " " transactions " " startedAt " " avgTransactionTime " " averageIdlePeriod
}
}
in_instances && $0 ~ /<applicationName / { applicationName = get_value($0) }
in_instances && $0 ~ /<id / { id = get_value($0) }
in_instances && $0 ~ /<port / { port = get_value($0) }
in_instances && $0 ~ /<runningState / { runningState = get_value($0) }
in_instances && $0 ~ /<activeSessions / { activeSessions = get_value($0) }
in_instances && $0 ~ /<transactions / { transactions = get_value($0) }
in_instances && $0 ~ /<startedAt / { startedAt = get_value($0) }
in_instances && $0 ~ /<avgTransactionTime / { avgTransactionTime = get_value($0) }
in_instances && $0 ~ /<averageIdlePeriod / { averageIdlePeriod = get_value($0) }
'
uawk -v minst="$1" "$script"
}
function wotaskd_get_configured_instances() {
# afficher la liste des instances configurées sur un hôte.
eval "$(_getopt_host_and_password)"
wotaskd_dump_instances -h "$host" -P "$password" | awk '
$0 ~ /<name/ {
#print gensub("^.*>([^<]*)<.*$", "\\1", 1)
match($0, /^[^<]*<[^<>]*>/); $0 = substr($0, RSTART + RLENGTH)
match($0, /<.*$/); $0 = substr($0, 1, RSTART - 1)
print
}
'
}
function wotaskd_command_instances_from_stdin() {
# lancer une commande pour les instances avec les lignes lues sur stdin
eval "$(_getopt_host_and_password)"
local COMMAND="$1"; shift
wotaskd_command "$(
echo '<monitorRequest type="NSDictionary"><commandWotaskd type="NSArray"><element type="NSString">'"$COMMAND"'</element>'
while read element; do
echo '<element type="NSDictionary">'"$element"'</element>'
done
echo '</commandWotaskd></monitorRequest>'
)" "$password" "$host" >&"$outputfile"
}
function wotaskd_update_instances_from_stdin() {
# Metttre à jour les instances avec les lignes lues sur stdin
eval "$(_getopt_host_and_password)"
wotaskd_command "$(
echo '<monitorRequest type="NSDictionary"><updateWotaskd type="NSDictionary"><configure type="NSDictionary"><instanceArray type="NSArray">'
while read element; do
echo '<element type="NSDictionary">'"$element"'</element>'
done
echo '</instanceArray></configure></updateWotaskd></monitorRequest>'
)" "$password" "$host" >&"$outputfile"
}