From 697f1cd407355c6fb6b35edc4b6ae407b071701e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=81ukasz=20Nowak?= <luke@nexedi.com>
Date: Fri, 4 Mar 2011 10:41:17 +0000
Subject: [PATCH]  - do singal translation for cloudooo, as paster is not
 killing children    on SIGTERM, but on SIGINT only

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@43965 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 .../erp5/src/slapos/recipe/erp5/__init__.py   |  6 ++--
 .../erp5/src/slapos/recipe/erp5/execute.py    | 29 +++++++++++++++++++
 2 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/slapos/recipe/erp5/src/slapos/recipe/erp5/__init__.py b/slapos/recipe/erp5/src/slapos/recipe/erp5/__init__.py
index 169dc9e023..5a49090eb5 100644
--- a/slapos/recipe/erp5/src/slapos/recipe/erp5/__init__.py
+++ b/slapos/recipe/erp5/src/slapos/recipe/erp5/__init__.py
@@ -316,9 +316,9 @@ class Recipe(BaseSlapRecipe):
           conversion_server_dict))
     self.path_list.append(config_file)
     self.path_list.extend(zc.buildout.easy_install.scripts([(name,
-      __name__ + '.execute', 'execute')], self.ws, sys.executable,
-      self.wrapper_directory, arguments=[self.options['ooo_paster'].strip(),
-        'serve', config_file]))
+      __name__ + '.execute', 'execute_with_signal_translation')], self.ws,
+      sys.executable, self.wrapper_directory,
+      arguments=[self.options['ooo_paster'].strip(), 'serve', config_file]))
     self.connection_dict.update(**{
       name + '_port': conversion_server_dict['port'],
       name + '_ip': conversion_server_dict['ip']
diff --git a/slapos/recipe/erp5/src/slapos/recipe/erp5/execute.py b/slapos/recipe/erp5/src/slapos/recipe/erp5/execute.py
index 78b34810dd..4386bbdd6e 100644
--- a/slapos/recipe/erp5/src/slapos/recipe/erp5/execute.py
+++ b/slapos/recipe/erp5/src/slapos/recipe/erp5/execute.py
@@ -1,5 +1,34 @@
+import sys
 import os
+import signal
+import subprocess
+import time
+
 def execute(args):
   """Portable execution with process replacement"""
   # Note: Candidate for slapos.lib.recipe
   os.execv(args[0], args)
+
+child_pg = None
+def sig_handler(signal, frame):
+  print 'Received signal %r, killing children and exiting' % signal
+  if child_pg is not None:
+    os.killpg(child_pg, signal.SIGHUP)
+    os.killpg(child_pg, signal.SIGTERM)
+  sys.exit(0)
+
+signal.signal(signal.SIGINT, sig_handler)
+signal.signal(signal.SIGQUIT, sig_handler)
+signal.signal(signal.SIGTERM, sig_handler)
+
+def execute_with_signal_translation(args):
+  """Run process as children and translate from SIGTERM to another signal"""
+  child = subprocess.Popen(args, close_fds=True, preexec_fn=os.setsid)
+  child_pg = child.pid
+  try:
+    while True:
+      print 'Running'
+      time.sleep(10)
+  finally:
+    os.killpg(child_pg, signal.SIGHUP)
+    os.killpg(child_pg, signal.SIGTERM)
-- 
2.30.9