Skip to content

Commit

Permalink
fix: killall should really kill all ;-)
Browse files Browse the repository at this point in the history
  • Loading branch information
manatlan committed Oct 8, 2023
1 parent df61c1b commit 9874a55
Showing 1 changed file with 39 additions and 13 deletions.
52 changes: 39 additions & 13 deletions htagweb/server/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
# #############################################################################

import asyncio,traceback,os
import signal
import redys
import redys.v2
import os,sys,importlib,inspect
Expand Down Expand Up @@ -71,7 +72,7 @@ def __init__(self,hid:str):
self.event_response = "response_"+hid
self.event_response_update = self.event_response+"_update"

self.key_sesprovider = "sesprovider_"+hid
self.key_sesinfo = "sesprovider_"+hid

@staticmethod
def create(uid:str,fqn:str):
Expand Down Expand Up @@ -113,12 +114,6 @@ def suicide():

last_mod_time=os.path.getmtime(inspect.getfile(klass))

# register hid in redys "apps"
await bus.sadd(KEYAPPS,str(hid))

# save sesprovider for this hid
await bus.set(hid.key_sesprovider, FactorySession.__name__)


session = FactorySession(hid.uid)

Expand All @@ -130,6 +125,12 @@ def suicide():

log(f"Start with params:",init)

# register hid in redys "apps"
await bus.sadd(KEYAPPS,str(hid))

# save sesprovider for this hid
await bus.set(hid.key_sesinfo, dict(sesprovider=FactorySession.__name__, pid=pid))

# subscribe for interaction
await bus.subscribe( hid.event_interact )

Expand Down Expand Up @@ -205,7 +206,7 @@ async def update(actions):
await bus.srem(KEYAPPS,str(hid))

# delete sesprovider for this hid
await bus.delete(hid.key_sesprovider)
await bus.delete(hid.key_sesinfo)

#consume all pending events
await bus.unsubscribe( hid.event_interact )
Expand All @@ -221,14 +222,38 @@ async def update(actions):


async def killall():
""" killall running hrprocess (soft and hard if it can't)"""
bus=redys.v2.AClient()

# try to send a EXIT CMD to all running ps
running_hids = await bus.get(KEYAPPS) or []
while running_hids:
for hid in running_hids:
await bus.publish(Hid(hid).event_interact,dict(cmd=CMD_PS_EXIT))
while 1:
running_hids = await bus.get(KEYAPPS) or []
if not running_hids:
break
else:
for hid in running_hids:
# try a soft kill (tell him to suicide itself)
can = await bus.publish(Hid(hid).event_interact,dict(cmd=CMD_PS_EXIT))
if not can:
# force kill by using its pid
sesinfo = await bus.get(hid.key_sesinfo)
pid=sesinfo["pid"]
print("killall() FORCE KILL",hid,"on pid",pid, flush=True)
try:
os.kill(pid, signal.SIGKILL)

# remove hid in redys "apps"
await bus.srem(KEYAPPS,str(hid))

# delete sesprovider for this hid
await bus.delete(hid.key_sesinfo)

#consume all pending events
await bus.unsubscribe( hid.event_interact )

except ProcessLookupError:
pass

await asyncio.sleep(0.1)


Expand All @@ -254,7 +279,8 @@ async def killall(self):

async def session(self,hid:Hid) -> dict:
""" get session for hid"""
sesprovidername=await self._bus.get(hid.key_sesprovider)
sesinfo=await self._bus.get(hid.key_sesinfo)
sesprovidername=sesinfo["sesprovider"]
FactorySession=importFactorySession(sesprovidername)
return FactorySession(hid.uid)

Expand Down

0 comments on commit 9874a55

Please sign in to comment.