Fixes & improvements
[anna.git] / example / diameter / launcher / resources / scripts / operation_signal.sh
index 3c928ce..04684bd 100755 (executable)
@@ -16,16 +16,19 @@ _exit() {
 
 usage() {
   echo
-  echo "Usage: $0 [-h|--help] [-t|--timeout <value>] [-f|--file] <data>"
+  echo "Usage: $0 [-h|--help] [-t|--timeout <value>] [-f|--file] [-p|--ping] <data>"
   echo
   echo "       -h|--help:     this usage help."
   echo "       -t|--timeout:  timeout for operation in seconds."
-  echo "                      Defaults to 2 seconds if not provided."
+  echo "                      Defaults to $TIMEOUT__dflt seconds if not provided."
   echo
   echo "       -f|--file:     the parameter 'data' will be interpreted as a file"
   echo "                      with one operation per line. If missing, it will be"
   echo "                      a single operation string."
   echo
+  echo "       -p|--ping:     Check the target process id."
+  echo "                      Returns 1 (dead) or 0 (alive)."
+  echo
   echo "       data:          operation string or file with several operations."
   echo
   echo "       For example:"
@@ -40,6 +43,7 @@ parse_arguments() {
   is_file=
   timeout=$TIMEOUT__dflt
   data=
+  ping=
 
   while [ $# -gt 0 ]; do
     case $1 in
@@ -61,6 +65,10 @@ parse_arguments() {
         shift
       ;;
 
+      -p|--ping)
+        ping=yes
+      ;;
+
       *)
         first=$(echo $1 | cut -c1)
         [ "$first" = "-" ] && _exit "Unsupported script option: $1. Type '$SCR_BN -h' (or --help) to print the available options."
@@ -70,13 +78,13 @@ parse_arguments() {
     shift
   done
 
-  [ -z "$data" ] && _exit "Missing data value"
+  [ -z "$ping" -a -z "$data" ] && _exit "Missing data value"
 }
 
 # $1: pid to check
 check_pid() {
   kill -0 $1 2>/dev/null
-  [ $? -ne 0 ] && _exit "Operation error: missing process with pid $1"
+  return $?
 }
 
 #############
@@ -91,38 +99,44 @@ PID=`cat .pid`
 [ "$1" = "" -o "$1" = "--help" -o "$1" = "-h" ] && usage
 parse_arguments $@
 
+# Check pid:
+check_pid $PID
+res=$?
+[ -n "$ping" ] && exit $res
+[ $res -ne 0 ] && _exit "Operation error: missing process with pid $PID"
+
 # Send operation:
 if [ -n "$is_file" ]
 then
-  grep -v "^#" $data | sed '/^[ \t]*$/d' > sigusr2.in
+  cp $data sigusr2.in
 else
   echo $data > sigusr2.in
 fi
-0> sigusr2.out
+0>sigusr2.out
 check_pid $PID
 kill -s SIGUSR2 $PID
 
 # Detect EOF and print all except that last line:
-sleep $timeout &
-timerPid=$!
-rm -f .operation_eof
-tail -n0 -F --pid=$timerPid sigusr2.out | while read line 
-do
-  if echo $line | grep "^EOF" >/dev/null; then
-    touch .operation_eof
-    # stop the timer
-    kill -13 $timerPid
+count=$((10*timeout))                                                      
+expired=yes
+while [ $count -gt 0 ]                                           
+do                                                                               
+  sleep 0.1                                                                      
+  count=$((count-1))                                                             
+  if tail -1 sigusr2.out | grep "^EOF" >/dev/null; then
+    expired=
+    break;
   fi
-done
+done                                                                             
 
-if [ -f .operation_eof ]
+if [ -z "$expired" ]
 then
   head --lines=-1 sigusr2.out
 else
   _exit "Operation error: timeout expired ($timeout seconds)"
 fi
 
-exception=$(grep exception sigusr2.out)
-[ $? -eq 0 -a "$data" != "help" ] && _exit "(detected 'exception' within operation output)"
+exception=$(grep "^Operation processed with exception: " sigusr2.out)
+[ $? -eq 0 ] && _exit "(detected 'exception' within operation output: see 'launcher.trace')"
 exit 0