From 0eb5a1bb10410099e5ce877cb9f9aae3b3b45790 Mon Sep 17 00:00:00 2001 From: onefang Date: Wed, 18 Aug 2021 01:25:38 +1000 Subject: Sim stop tweaks. If there's actual people on the sim, warn them, but don't shut it down. Only close the other windows if -a given. --- src/sledjchisl/sledjchisl.c | 159 +++++++++++++++++++++++++++----------------- 1 file changed, 99 insertions(+), 60 deletions(-) diff --git a/src/sledjchisl/sledjchisl.c b/src/sledjchisl/sledjchisl.c index 4f9fa7c..79a3b57 100644 --- a/src/sledjchisl/sledjchisl.c +++ b/src/sledjchisl/sledjchisl.c @@ -1114,7 +1114,7 @@ struct _simData int locX, locY, sizeX, sizeY, sizeZ, portH, portU, maxPrims; char *name, *tab, *UUID, *regionType, *estate, *owner; char *paneID; - int window, pane; + int window, pane, users; }; typedef struct _simList simList; @@ -1813,16 +1813,40 @@ void stopSim(simData *simd, char *sim, char *type, int count, int window, int pa if (checkSimIsRunning(simd->tab)) { // Leave empty panes as is. -// TODO - should check if there's people there, but don't count NPCs. alert them, wait a while, or just abort the stop. -/* show users - -Agents connected: 1 - -Firstname Lastname Agent ID child/NPC/root Region Position -Baby Barby 3548202e-1659-4055-b406-d578ef728fe0 NPC Naughtie Nautical <623.2795, 178.0885, 103.8343> + V("Attempting to shut down sim %s.", simd->tab); + sendTmuxCmd(simd->paneID, "show users"); + sleep(1); + char *cmd = xmprintf("%s %s/%s capture-pane -Jt '%s' -p | grep -E '^Agents connected: [[:digit:]]*[[:space:]]*$' | tail -n 1 | cut -d ' ' -f 3 >%s/STOP_%s", + Tcmd, scRun, Tsocket, simd->paneID, scTemp, simd->tab); + int i = system(cmd); + if (WIFEXITED(i)) + { + free(cmd); + cmd = xmprintf("%s/STOP_%s", scTemp, simd->tab); + char *r = (char *) qfile_load(cmd, NULL); + if (r) + { + if ('0' == r[0]) + sendTmuxCmd(simd->paneID, "quit"); + else + { + r[strlen(r) - 1] = '\0'; + simd->users = atoi(r); + sendTmuxCmd(simd->paneID, "alert Shutting down this sim, please leave."); + sendTmuxCmd(simd->paneID, "region restart bluebox \"Shutting down this sim, please leave.\" 300"); + sendTmuxCmd(simd->paneID, "region restart notice \"Shutting down this sim, please leave.\" 300"); + sendTmuxCmd(simd->paneID, "region restart abort \"Shutting down this sim, please leave.\""); + W("Not shutting down %s coz %d people are still on it. They have been warned.", simd->tab, simd->users); + } + free(r); + } + else + E("Problem with shutting down sim %s - Failed to read file %s", simd->tab, cmd); + } + else + E("Problem with shutting down sim %s - Failed to run command \n %s", simd->tab, cmd); + free(cmd); -*/ - sendTmuxCmd(simd->paneID, "quit"); // There's three things that might happen - // Sim will quit, tmux pane will go away before we can see the shutdown message. // pane-exited hook might be useful here. @@ -2006,11 +2030,19 @@ void stopSims(simData *simd, char *sim, char *type, int count, int window, int p // NOTE - these sleeps are guesses, seems to work on my super desktop during testing. if (checkSimIsRunning(simd->tab)) T("Tmux tab [%d:%s](pane %d) tmux ID %s, from %s/sim%d - %s has NOT stopped YET.", window, type, pane, simd->paneID, scTemp, count, simd->name); - while (checkSimIsRunning(simd->tab)) - usleep(100000); - usleep(10000); - doTmuxCmd("kill-pane -t %s", simd->paneID); - I("Tmux tab [%d:%s](pane %d) tmux ID %s, from %s/sim%d - %s has stopped.", window, type, pane, simd->paneID, scTemp, count, simd->name); + if (simd->users) + { + ourSims->doIt = 0; + W("Not shutting down %s coz %d people are still on it. They have been warned.", simd->tab, simd->users); + } + else + { + while (checkSimIsRunning(simd->tab)) + usleep(100000); + usleep(10000); + doTmuxCmd("kill-pane -t %s", simd->paneID); + I("Tmux tab [%d:%s](pane %d) tmux ID %s, from %s/sim%d - %s has stopped.", window, type, pane, simd->paneID, scTemp, count, simd->name); + } } @@ -8109,60 +8141,67 @@ jit library is loaded or the JIT compiler will not be activated. if ((STOP == currentMode) && (NULL == ourSims->target)) { // Stop all the sims. + ourSims->doIt = 1; forEachSim(NULL, stopSims, NULL); - if (checkSimIsRunning("ROBUST")) + if (ourSims->doIt) { - sendTmuxCmd("@0.%0", "quit"); - while (checkSimIsRunning("ROBUST")) - usleep(100000); - usleep(100000); - sendTmuxCmd("@0.%0", "exit"); - usleep(100000); - sendTmuxCmd("@0.%0", "exit"); - I("ROBUST has stopped in tmux ID @0.%%0."); - } + if (checkSimIsRunning("ROBUST")) + { + sendTmuxCmd("@0.%0", "quit"); + while (checkSimIsRunning("ROBUST")) + usleep(100000); + usleep(100000); + sendTmuxCmd("@0.%0", "exit"); + usleep(100000); + sendTmuxCmd("@0.%0", "exit"); + I("ROBUST has stopped in tmux ID @0.%%0."); + } - I("Closing all the other windows."); - // First figure out what panes and windows are left. - snprintf(toybuf, sizeof(toybuf), "echo 'IDs={' >%s/IDs_ALL.lua", scTemp); - system(toybuf); - doTmuxCmd("list-panes -s -F '\"#{window_id}.#{pane_id}\",' >> %s/IDs_ALL.lua", scTemp); - snprintf(toybuf, sizeof(toybuf), "echo '}\nreturn IDs' >>%s/IDs_ALL.lua", scTemp); - system(toybuf); - snprintf(toybuf, sizeof(toybuf), "%s/IDs_ALL.lua", scTemp); - qtreetbl_t *IDs = Lua2tree(toybuf, "IDs"); - - char *c = xmprintf("rm -fr %s/*", scTemp); - if (!WIFEXITED(system(c))) - E("rm command failed! %s", c); - free(c); + if (FLAG(a)) + { + I("Closing all the other windows."); + // First figure out what panes and windows are left. + snprintf(toybuf, sizeof(toybuf), "echo 'IDs={' >%s/IDs_ALL.lua", scTemp); + system(toybuf); + doTmuxCmd("list-panes -s -F '\"#{window_id}.#{pane_id}\",' >> %s/IDs_ALL.lua", scTemp); + snprintf(toybuf, sizeof(toybuf), "echo '}\nreturn IDs' >>%s/IDs_ALL.lua", scTemp); + system(toybuf); + snprintf(toybuf, sizeof(toybuf), "%s/IDs_ALL.lua", scTemp); + qtreetbl_t *IDs = Lua2tree(toybuf, "IDs"); + + char *c = xmprintf("rm -fr %s/*", scTemp); + if (!WIFEXITED(system(c))) + E("rm command failed! %s", c); + free(c); + + qtreetbl_obj_t obj0; + memset((void*)&obj0, 0, sizeof(obj0)); + IDs->lock(IDs); + while(IDs->getnext(IDs, &obj0, false) == true) + { + qLua *q0 = obj0.data; - qtreetbl_obj_t obj0; - memset((void*)&obj0, 0, sizeof(obj0)); - IDs->lock(IDs); - while(IDs->getnext(IDs, &obj0, false) == true) - { - qLua *q0 = obj0.data; + if ('0' != q0->v.s[1]) + doTmuxCmd("kill-pane -t %s", q0->v.s); + } + IDs->unlock(IDs); - if ('0' != q0->v.s[1]) - doTmuxCmd("kill-pane -t %s", q0->v.s); - } - IDs->unlock(IDs); + I("Closing the original window."); + memset((void*)&obj0, 0, sizeof(obj0)); + IDs->lock(IDs); + while(IDs->getnext(IDs, &obj0, false) == true) + { + qLua *q0 = obj0.data; - I("Closing the original window."); - memset((void*)&obj0, 0, sizeof(obj0)); - IDs->lock(IDs); - while(IDs->getnext(IDs, &obj0, false) == true) - { - qLua *q0 = obj0.data; + if ('0' == q0->v.s[1]) + doTmuxCmd("kill-pane -t %s", q0->v.s); + } + IDs->unlock(IDs); - if ('0' == q0->v.s[1]) - doTmuxCmd("kill-pane -t %s", q0->v.s); + freeLuaTree(IDs); + } } - IDs->unlock(IDs); - - freeLuaTree(IDs); } else if (START == currentMode) { -- cgit v1.1