void CTestSignals::KeyComplete(TKeyCode aKey) { switch (aKey) { case EKeyEscape: Halt(); break; default: switch (iState) { case EAllOff: DoSignals(ERtsOn); break; case ERtsOn: DoSignals(EDtrOn); break; case EDtrOn: DoSignals(EAllOn); break; case EAllOn: DoSignals(EAllOff); break; default: break; } } }
void DoProcessCheck(struct Process *pp,struct Item *procdata) { char line[CF_BUFSIZE]; int matches=0,dosignals=true; mode_t maskval; struct stat statbuf; struct Item *killlist = NULL; matches = FindMatches(pp,procdata,&killlist); if (matches > 0) { Verbose("Defining classes %s\n",pp->defines); AddMultipleClasses(pp->defines); } else { Verbose("Defining classes %s\n",pp->elsedef); AddMultipleClasses(pp->elsedef); } if (pp->matches >= 0) { if (pp->action == 'm') { dosignals = false; } switch (pp->comp) { case '=': if (matches != (int)pp->matches) { snprintf(g_output,CF_BUFSIZE*2, "%d processes matched %s (should be %d)\n", matches,pp->expr,pp->matches); CfLog(cferror,g_output,""); if (pp->action == 'm') { dosignals = true; } } break; case '>': if (matches < (int)pp->matches) { snprintf(g_output,CF_BUFSIZE*2, "%d processes matched %s (should be >=%d)\n", matches,pp->expr,pp->matches); CfLog(cferror,g_output,""); if (pp->action == 'm') { dosignals = true; } } break; case '<': if (matches > (int)pp->matches) { snprintf(g_output,CF_BUFSIZE*2, "%d processes matched %s (should be <=%d)\n", matches,pp->expr,pp->matches); CfLog(cferror,g_output,""); if (pp->action == 'm') { dosignals = true; } } } } if (dosignals) { DoSignals(pp,killlist); } DeleteItemList(killlist); if ((pp->action == 'm') && !dosignals && (matches != 0)) { Verbose("%s: Process matches found for %s - no restart necessary\n", g_vprefix,pp->expr); return; } if (strlen(pp->restart) != 0) { char argz[256]; Verbose("Existing restart sequence found (%s)\n",pp->restart); if ((matches != 0) && (pp->signal != cfkill) && (pp->signal != cfterm)) { Verbose("%s: Process matches found for %s - " "no restart necessary\n", g_vprefix,pp->expr); return; } sscanf(pp->restart,"%255s",argz); if ((stat(argz,&statbuf) != -1) && (statbuf.st_mode & 0111 == 0)) { snprintf(g_output, CF_BUFSIZE, "Restart sequence %s could not be executed " "(mode=%o), while searching (%s)", pp->restart, statbuf.st_mode & 7777, pp->expr); CfLog(cferror,g_output,""); return; } snprintf(g_output, CF_BUFSIZE*2, "Executing shell command: %s\n", pp->restart); CfLog(cfinform,g_output,""); if (g_dontdo) { return; } Verbose ("(Setting umask to %o)\n",pp->umask); maskval = umask(pp->umask); if (pp->umask == 0) { snprintf(g_output,CF_BUFSIZE*2, "Programming %s running with umask 0! Use umask= to set\n", pp->restart); CfLog(cfsilent,g_output,""); } if (pp->useshell == 'y') { if ((PIPE = cfpopen_shsetuid(pp->restart,"r", pp->uid,pp->gid,pp->chdir,pp->chroot)) == NULL) { snprintf(g_output,CF_BUFSIZE*2, "Process restart execution failed on %s\n",pp->restart); CfLog(cferror,g_output,"popen"); return; } } else { if ((PIPE = cfpopensetuid(pp->restart,"r",pp->uid,pp->gid, pp->chdir,pp->chroot)) == NULL) { snprintf(g_output,CF_BUFSIZE*2, "Process restart execution failed on %s\n",pp->restart); CfLog(cferror,g_output,"popen"); return; } } DEADLOCK = false; while (!feof(PIPE)) { /* dumb shell */ if (pp->useshell == 'd') { fgets(line,1,PIPE); break; } ReadLine(line,CF_BUFSIZE,PIPE); if (feof(PIPE) || ferror(PIPE)) { break; } if (strstr(line,"cfengine-die")) { break; } /* patch for ERESTARTSYSTEM bug in popen */ if (strstr(line,"cfd: start") || DEADLOCK) { break; } snprintf(g_output,CF_BUFSIZE*2,"Restart: %s",line); CfLog(cfinform,g_output,""); } if (pp->useshell == 'y') { pclose(PIPE); } else { cfpclose(PIPE); } snprintf(g_output,CF_BUFSIZE*2,"(Done with %s)\n",pp->restart); CfLog(cfinform,g_output,""); umask(maskval); } }
void CTestSignals::ReadComplete(TInt /*aStatus*/) { DoSignals(EAllOff); }