From b04330c78c888f3ae40a2dffd5cea1cee835a6c1 Mon Sep 17 00:00:00 2001
From: Alain Takoudjou <alain.takoudjou@nexedi.com>
Date: Tue, 17 Dec 2019 18:36:17 +0100
Subject: [PATCH] create pwrrt service

---
 .../proviewR/instance-proview-r.cfg.jinja2.in |  36 ++++-
 software/proviewR/instance.cfg                |   1 +
 software/proviewR/pwrp_profile.in             |  17 +--
 software/proviewR/pwrrt.in                    | 137 ++++++++++++++++++
 software/proviewR/software.cfg                |   9 +-
 5 files changed, 188 insertions(+), 12 deletions(-)
 create mode 100644 software/proviewR/pwrrt.in

diff --git a/software/proviewR/instance-proview-r.cfg.jinja2.in b/software/proviewR/instance-proview-r.cfg.jinja2.in
index 3b67fd053..24f8e20c0 100644
--- a/software/proviewR/instance-proview-r.cfg.jinja2.in
+++ b/software/proviewR/instance-proview-r.cfg.jinja2.in
@@ -15,10 +15,23 @@ scripts = ${:etc}/run
 services = ${:etc}/service
 ssl = ${:etc}/ssl
 auth = ${:tmp}/auth
-pwrp = ${buildout:directory}/pwrp
 ca-dir = ${:srv}/ssl
 novnc-conf = ${:etc}/novnc
 prerm = ${:etc}/prerm
+pwrp = ${buildout:directory}/pwrp
+common = ${:pwrp}/common
+x86-64-linux = ${:pwrp}/x86_64_linux
+inc = ${:common}/inc
+load = ${:common}/load
+log = ${:common}/log
+loghist = ${:common}/loghist
+db = ${:common}/db
+web = ${:common}/web
+exe = ${:x86-64-linux}/exe
+lib = ${:x86-64-linux}/lib
+obj = ${:x86-64-linux}/obj
+lis = ${:x86-64-linux}/lis
+
 
 [certificate-authority]
 recipe = slapos.cookbook:certificate_authority
@@ -123,6 +136,7 @@ input = inline:#!/bin/bash
   export PWR_BUS_ID=999
   export DISPLAY=${xserver:display}
   export LD_LIBRARY_PATH={{ ld_library_path }}
+  export TMPDIR=${directory:tmp}
 
   if [ "$PS1" ]; then
     eval `dircolors -b`
@@ -165,6 +179,25 @@ context =
   raw pwr_bus_id 999
   raw java_location {{ java_location }}
 
+
+[pwrrt-wrapper]
+recipe = slapos.recipe.template:jinja2
+rendered = ${directory:bin}/pwrrt
+extensions = jinja2.ext.do
+mode = 0744
+template = {{ template_pwrrt }}
+context =
+  key tmp_directory directory:tmp
+  key pwrp_profile pwrp-profile:rendered
+
+[pwrrt-service]
+recipe = slapos.cookbook:wrapper
+command-line = ${pwrrt-wrapper:rendered} start
+wrapper-path = ${directory:services}/pwrrt
+hash-existing-files = ${buildout:directory}/software_release/buildout.cfg
+environment = 
+  LD_LIBRARY_PATH={{ ld_library_path }}
+
 [request-slave-frontend]
 recipe = slapos.cookbook:requestoptional
 server-url = ${slap-connection:server-url}
@@ -206,6 +239,7 @@ parts =
   novnc-promise
   proview-environment
   bash-profile
+  pwrrt-service
 
 # Complete parts with sections
   {{ part_list | join('\n  ') }}
diff --git a/software/proviewR/instance.cfg b/software/proviewR/instance.cfg
index 2c11d9f15..382ad1c9c 100644
--- a/software/proviewR/instance.cfg
+++ b/software/proviewR/instance.cfg
@@ -43,6 +43,7 @@ extra-context =
   raw proview_compile_dir ${pwr:location}__compile__/pwr
   raw ld_library_path ${pwr:ld-library-path}
   raw pwrp_profile ${template-pwrp-profile:location}/${template-pwrp-profile:filename}
+  raw template_pwrrt ${template-pwrrt:location}/${template-pwrrt:filename}
 mode = 0644
 
 [slap-configuration]
diff --git a/software/proviewR/pwrp_profile.in b/software/proviewR/pwrp_profile.in
index 36f77cf76..6083ed061 100644
--- a/software/proviewR/pwrp_profile.in
+++ b/software/proviewR/pwrp_profile.in
@@ -1,10 +1,10 @@
 
 bus_id="{{ pwr_bus_id }}"
-if [ -e /etc/proview.cnf ]; then
-  bus_id=`eval cat /etc/proview.cnf | grep "\\bqcomBusId\\b" | awk '{print $2}'`
+if [ -e {{ base_directory }}/etc/proview.cnf ]; then
+  bus_id=`eval cat {{ base_directory }}/etc/proview.cnf | grep "\\bqcomBusId\\b" | awk '{print $2}'`
 fi
-if [ -e /etc/proview.cnf ]; then
-  web_dir=`eval cat /etc/proview.cnf | grep "\\bwebDirectory\\b" | awk '{print $2}'`
+if [ -e {{ base_directory }}/etc/proview.cnf ]; then
+  web_dir=`eval cat {{ base_directory }}/etc/proview.cnf | grep "\\bwebDirectory\\b" | awk '{print $2}'`
 fi
 
 export PWR_BUS_ID=$bus_id
@@ -39,11 +39,10 @@ export jdk_home={{ java_location }}/bin
 PATH=$PATH:$pwr_exe:$pwrp_exe:$jdk_home
 
 #symbols to define start/stop commands for PWR
-alias pwr_stop='/etc/init.d/pwr stop'
-alias pwr_stop.sh="/etc/init.d/pwr stop"
-alias pwr_start="/etc/init.d/pwr start"
-alias pwr="/etc/init.d/pwr"
-alias boot="/usr/bin/sudo /sbin/reboot"
+alias pwr_stop='{{ base_directory }}/bin/pwr stop'
+alias pwr_stop.sh="{{ base_directory }}/bin/pwr stop"
+alias pwr_start="{{ base_directory }}/bin/pwr start"
+alias pwr="{{ base_directory }}/bin/pwr"
 
 if [ -e $pwrp_exe/profile ]; then
   source $pwrp_exe/profile
diff --git a/software/proviewR/pwrrt.in b/software/proviewR/pwrrt.in
new file mode 100644
index 000000000..d6631ea25
--- /dev/null
+++ b/software/proviewR/pwrrt.in
@@ -0,0 +1,137 @@
+#
+# Start script for Proview runtime
+#
+
+TMPDIR={{ tmp_directory }}
+wrapper="{{ tmp_directory }}/rt_ini_wrapper"
+killer="{{ tmp_directory }}/pwr_killer"
+
+. {{ pwrp_profile }}
+umask 002
+
+create_wrapper()
+{
+  if [ ! -e $wrapper ] ; then
+    echo "#!/bin/bash" > $wrapper
+    echo "source {{ pwrp_profile }}" >> $wrapper
+    echo "umask 002" >> $wrapper
+    echo "\$pwr_exe/rt_ini \$* &" >> $wrapper
+    chmod a+rx $wrapper
+    if [ ! -e $wrapper ] ;then
+      echo "$wrapper not writable, check permissions"
+      exit
+    fi
+  fi
+}
+
+create_killer()
+{
+    echo "#!/bin/bash" > $killer
+    echo "source {{ pwrp_profile }}" >> $killer
+    echo "umask 002" >> $killer
+
+    echo "`ps ax | grep "rt_" | awk '{ print "kill -9 "$1}'`" >> $killer
+    echo "`ps ax | grep "rs_" | awk '{ print "kill -9 "$1}'`" >> $killer
+    echo "`ps ax | grep "ra_" | awk '{ print "kill -9 "$1}'`" >> $killer
+    echo "`ps ax | grep "sev_" | awk '{ print "kill -9 "$1}'`" >> $killer
+    echo "`ps ax | grep "opc_" | awk '{ print "kill -9 "$1}'`" >> $killer
+    echo "`ps ax | grep "plc_" | awk '{ print "kill -9 "$1}'`" >> $killer
+    echo "`ps ax | grep "jpwr.rt" | awk '{ print "kill -9 "$1}'`" >> $killer
+
+    echo "eval `ipcs -s|grep ^0x|grep "[ \t]pwrp[ \t]"|awk '{printf "ipcrm sem %s;", $2}'`" >> $killer
+    echo "eval `ipcs -q|grep ^0x|grep "[ \t]pwrp[ \t]"|awk '{printf "ipcrm msg %s;", $2}'`" >> $killer
+    echo "eval `ipcs -m|grep ^0x|grep "[ \t]pwrp[ \t]"|awk '{printf "ipcrm shm %s;", $2}'`" >> $killer
+    echo "if [ -e $pwrp_exe/pwrp_stop.sh ]; then" >> $killer
+    echo "  source $pwrp_exe/pwrp_stop.sh" >> $killer
+    echo "fi" >> $killer
+    echo "rm {{ tmp_directory }}/pwr*\$PWR_BUS_ID" >> $killer
+
+    chmod a+rx $killer
+    if [ ! -e $killer ] ;then
+      echo "$killer not writable, check permissions"
+      exit
+    fi
+}
+
+
+pwr_start()
+{
+  create_wrapper
+  $wrapper
+}
+
+pwr_stop()
+{
+  create_wrapper
+  $wrapper -s
+  if [ -e $pwrp_exe/pwrp_stop.sh ]; then
+    source $pwrp_exe/pwrp_stop.sh
+  fi
+  while [ "`ps aux | grep -v grep | grep rt_`" != "" ] ; do sleep 1; done  
+}
+
+pwr_reload()
+{
+  $pwr_exe/rt_ini_wrapper -r
+}
+
+pwr_kill()
+{
+  create_killer
+  $killer
+}
+
+case "$1"
+  in
+    start)
+        echo "Start Proview Runtime Environment."
+        pwr_start    
+        echo "Done."
+      ;;
+    stop)
+        echo "Stop Proveiw Runtime Environment."
+        pwr_stop
+        echo "Done."
+      ;;
+    restart)
+        echo "Restart Proview Runtime Environment."
+        echo "Closing down..."
+        pwr_stop
+        sleep 1
+        echo "Starting..."
+        pwr_start
+        echo "Done."
+        ;;
+    reload)
+        echo "Reload Proview Runtime Environment"
+        pwr_reload
+        echo "Done."
+        ;;
+    kill)
+        echo "Remove all processes and resources for Proview Runtime Environment"
+        pwr_kill
+        echo "Done."
+        ;;
+    reset)
+        echo "Remove all processes and resources for Proview Runtime Environment"
+        pwr_kill
+        echo "Done."
+        ;;
+    *)
+        echo "  pwr  Start and stop Proview Runtime Environment" >&2
+        echo "" >&2
+        echo "  Usage:" >&2
+        echo "  pwr start|stop|restart|reload|reset" >&2
+        echo "" >&2
+        echo "    start    Start Runtime environment" >&2
+        echo "    stop     Stop Runtime environment" >&2
+        echo "    restart  First stop and then start Runtime environment" >&2
+        echo "    reload   Soft restart of Runtime environment" >&2
+        echo "    reset    Remove all processes and resources" >&2
+        echo "" >&2
+
+        exit 1
+        ;;
+  esac
+
+exit 0
diff --git a/software/proviewR/software.cfg b/software/proviewR/software.cfg
index ce264e898..aa6c03fdd 100644
--- a/software/proviewR/software.cfg
+++ b/software/proviewR/software.cfg
@@ -44,14 +44,19 @@ mode = 0644
 
 [template-proview-r]
 <= download-base
-md5sum = 7811559de2118066e3da524e43bd5182
+md5sum = a104dfc928552d2fdb4af52108230b47
 filename = instance-proview-r.cfg.jinja2.in
 
 [template-pwrp-profile]
 <= download-base
-md5sum = 34b0c503d786fc59317a761175ddfc3f
+md5sum = f980d5a843b8e93287dc704b26e413f3
 filename = pwrp_profile.in
 
+[template-pwrrt]
+<= download-base
+md5sum = d53e00e3e2e249dd16fdba00e881ce01
+filename = pwrrt.in
+
 [versions]
 numpy = 1.16.4
 #websockify = 0.6.1
-- 
2.30.9