Example #1
0
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;
			}
		}
	}
Example #2
0
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);
    }
}
Example #3
0
void CTestSignals::ReadComplete(TInt /*aStatus*/)
	{
	DoSignals(EAllOff);
	}