DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T o

⟦32cbf3d39⟧ TextFile

    Length: 10559 (0x293f)
    Types: TextFile
    Names: »osilog.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦e83f91978⟧ »EurOpenD22/isode/osimis-2.0.tar.Z« 
        └─⟦d846658bd⟧ 
            └─⟦this⟧ »osimis/smap/osilog.c« 

TextFile

/*
 * Copyright (c) 1988 University College London
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation,
 * advertising materials, and other materials related to such
 * distribution and use acknowledge that the software was developed
 * by the Department of Computer Science, University College London.
 * The name of the University may not be used to
 * endorse or promote products derived from this software without
 * specific prior written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */

/* Event logger (osilog) main program */

/*
 * By George Pavlou, October 1988
 */

#include <stdio.h>
#include <errno.h>
#include <signal.h>
#include "isode/psap.h"
#include "isode/rosap.h"
#include "msap.h"
#include "objectS.h"
#include "report.h"
#include "config.h"
#include "defs.h"



char *progname = "osilog";

int  terminate(), setpoll();            /* signal handlers */


T_EntityInvocationS  *parseTEntityInvocation();
T_ConnectionEndpointS  *parseTConnectionEndpoint();


extern int  errno;

int  msd[MAXHOSTS];			/* management connection fds */
int  logtype;

int  mask, nfds;
int  poll;

char  host[HOSTLEN+1];			/* local host name */

char *hosts[MAXHOSTS];			/* hosts where SMAs run */
int   NofHosts;				/* how many */


T_EntityInvocationS  *Einv;



/* MAIN */

main (argc, argv)
int  argc;
char **argv;
{
    isodesetailor("./smaptailor");

    if (getconfig(hosts, &NofHosts) == NOTOK)
	advise(NULLCP, "Warning: failed to read configuration file");

    if ((logtype = parse_args(argc, argv)) == NOTOK)
	error(NULLCP, "host %s not supported", host);

    if (logtype == HOST)                /* open management connections */
	initialise_host(host, msd);
    else        /* ALL */
	initialise_all(hosts, msd);

    log_listen(logtype, msd);           /* listen for event reports... */

    terminate(OK);
}


static  initialise_host (host, msd)
char *host;
int  msd[];
{
    int i = host2indx(host, hosts, NofHosts);

    fprintf(stdout, "connecting to the SMA...\n");

    if ((msd[i] = m_init(host)) == NOTOK)
	error(NULLCP, "can't get connection to %s\n", host);

    mask |= 1 << msd[i];
    nfds  = msd[i] + 1;

    /*  set reports: TEinvReport, rcid 2, TCeptReport, rcid 3 */

    if (ReportSetRequest(TEINV_REP, m_addValue, msd[i]) == NOTOK ||
		ReportSetRequest(TCEPT_REP, m_addValue, msd[i]) == NOTOK) {
	m_term(msd[i]);
	error(NULLCP, "ReportSetRequest failed");
    }
}


static  initialise_all (hosts, msd)
char *hosts[];
int  msd[];
{
    int  i, now;
    char *evtime;

    time(&now);
    evtime = ctime(&now) + 11;
    *(evtime+8) = '\0';

    fprintf(stderr, "%s : ECP started - connecting to the SMAs...\n", evtime);

    for (i = 0; i < NofHosts; i++) {
	if ((msd[i] = m_init(hosts[i])) == NOTOK) {
	    fprintf(stderr, "can't get connection to %s\n", hosts[i]);
	    continue;
	}
	fprintf(stderr, "connected to %s\n", hosts[i]);

	mask |= 1 << msd[i];
	if (nfds < msd[i] + 1)
	    nfds = msd[i] + 1;

	/*  set reports: TEinvReport, rcid 2, TCeptReport, rcid 3 */

	if (ReportSetRequest(TEINV_REP, m_addValue, msd[i]) == NOTOK ||
		ReportSetRequest(TCEPT_REP, m_addValue, msd[i]) == NOTOK) {
	    close_connections(msd, NofHosts);
	    error(NULLCP, "ReportSetRequest failed");
	}
    }
}


static  terminate (sig)
int  sig;
{
    char *evtime;
    int now;

    if (sig != NOTOK) {
	unset_reports(msd);
	close_connections(msd, NofHosts);
    }

    time(&now);
    evtime = ctime(&now) + 11;
    *(evtime+8) = '\0';
    fprintf(stderr, "%s : %s exits after signal # %d\n",
					progname, evtime, sig);
    fflush(stdout);
    fflush(stderr);

    exit(sig);
}


static  unset_reports (msd)
int  msd[];
{
    int  i;

    for (i = 0; i < NofHosts; i++)
	if (msd[i] > 0) {
	    ReportSetRequest(TCEPT_REP, m_removeValue, msd[i]);
	    ReportSetRequest(TEINV_REP, m_removeValue, msd[i]);
	}
}


static  log_listen (logtype, msd)
int  logtype, msd[];
{
    struct MSAPindication  mis;
    int  ifds, i;

    signal (SIGHUP,  terminate);
    signal (SIGINT,  terminate);
    signal (SIGQUIT, terminate);
    signal (SIGTERM, terminate);
    signal (SIGALRM, setpoll);

    if (logtype == ALL)
	alarm(WAIT);

    fprintf(stderr, "listening for reports...\n");
    fflush(stderr);

    /* check management connections */

    for (EVER) {
	if (poll)
	    do_poll(msd);

	ifds = mask;
	switch (xselect(nfds, &ifds, NULLIP, NULLIP, 1)) {
	    case OK:
		continue;

	    case NOTOK:
		if (errno != EINTR) {
		    advise(NULLCP, "xselect failed");
		    terminate(NOTOK);
		}
		continue;               /* select interrupted by signal */

	    default:
		break;
	}


	for (i = 0; i < NofHosts; i++)
	    if (msd[i] > 0 && ifds & (1 << msd[i])) {
		if (M_WaitReq(msd[i], NOTOK, &mis) == NOTOK) {
		    char *evtime; int now;

		    if (nfds == msd[i] + 1)
			nfds--;
		    mask &= ~(1 << msd[i]);
		    msd[i] = -1;

		    time(&now);
		    evtime = ctime(&now) + 11;
		    *(evtime+8) = '\0';
		    fprintf(stderr, "%s : lost connection to %s\n",
					evtime, hosts[i]);
		    fflush(stderr);
		    continue;
		}

		switch (mis.mi_type) {
		    case MI_EVENT_REP:
			process_evreport(&mis.mi_eventrepv, i);
			break;

		    default:
			advise(NULLCP, "unknown mi_type = %d", mis.mi_type);
			continue;
		}
		mifree(&mis);
	    }
    }
}


static int  process_evreport (EventReport, sysid)
struct MSAPeventrepv  *EventReport;
int  sysid;
{
    struct event_rep_arg  *eventrep = &EventReport->args;
    OID  evtype = eventrep->ea_type.mid_global;
    MO_ID * inst;
    DN  dn;
    int  event, pid, fd = 0;
    long now;
    ManagedObjectS  mobj;
    char *evtime, *tim, *utct2disptime(), *secs2disptime();

    dn_decode(eventrep->ea_inst.mn_dn);
    inst = dn2moid(eventrep->ea_inst.mn_dn);
    if (oid_cmp(eventrep->ea_class.mid_global, str2oid("2.37.1.4")) == 0) {
	if (oid_cmp(evtype, str2oid("2.37.2.3")) == 0)
	    event = CRFAILIN_THLD_EVENT;
	else
	if (oid_cmp(evtype, str2oid("2.37.2.4")) == 0)
	    event = CRFAILOUT_THLD_EVENT;
	else
	if (oid_cmp(evtype, str2oid("2.37.2.5")) == 0)
	    event = CRCONGST_THLD_EVENT;
	else
	if (oid_cmp(evtype, str2oid("2.37.2.6")) == 0)
	    event = CRCONFERR_THLD_EVENT;
	else
	if (oid_cmp(evtype, str2oid("2.37.2.7")) == 0)
	    event = CRPROTERR_THLD_EVENT;
	else
	if (oid_cmp(evtype, str2oid("2.37.2.8")) == 0)
	    event = CKSUMERR_THLD_EVENT;
	else
	    return OK;		/* ignore TEinvCreation and Shutdown events */

	if (objinst2id(inst, T_EINV, NULLIP, &pid) == NOTOK) {
	    advise(NULLCP, "process_evrep_host: bad obj_inst");
	    return NOTOK;
	}

	if (parse_Report_TEinvReport(eventrep->ea_info,
				1, NULLIP, NULLVP, &mobj.einv)
		== NOTOK) {
	    advise(NULLCP, "parse_Report_TEinvReport failed");
	    return NOTOK;
	}
    }
    else
    if (oid_cmp(eventrep->ea_class.mid_global, str2oid("2.37.1.5")) == 0) {
	if (oid_cmp(evtype, str2oid("2.37.2.14")) == 0)
	    event = TCEPT_CREATION_EVENT;
	else
	if (oid_cmp(evtype, str2oid("2.37.2.15")) == 0)
	    event = TCEPT_SHUTDOWN_EVENT;
	else
	    return OK;		/* ignore TCept PDU Thld Events */

	if (objinst2id(inst, T_CEPT, NULLIP, &pid, &fd) == NOTOK) {
	    advise(NULLCP, "process_evreport: bad obj_inst");
	    return NOTOK;
	}

	if (parse_Report_TCeptReport(eventrep->ea_info,
				1, NULLIP, NULLVP, &mobj.cept) == NOTOK) {
	    advise(NULLCP, "parse_Report_TCeptReport failed");
	    return NOTOK;
	}
    }
    moid_free(inst);
    time(&now);
    evtime = ctime(&now) + 11;
    *(evtime+8) = '\0';

    tim = utct2disptime(str2utct(eventrep->ea_time, 12));
    tim = tim+7;
    *(tim+8) = '\0';

    switch (event) {
	case TCEPT_CREATION_EVENT:
	{   char *cept2rhost(), *tprot2str();

	    fprintf(stdout, "%s %s  CeptCreation  id= %d %d  EvTime= %s\n\
rhost= %s  prot= %s\n\n",
			hosts[sysid], evtime, pid, fd, tim,
			cept2rhost(mobj.cept, hosts[sysid]),
			tprot2str(mobj.cept->tProtocol));
	    free(mobj.cept);
	}
	    break;

	case TCEPT_SHUTDOWN_EVENT:
	    fprintf(stdout, "%s %s  CeptShutdown  id= %d %d  EvTime= %s\n\
Ps= %d  Pr= %d  Prs= %d  Bs= %d  Br= %d  Brs= %d\n\n",
			hosts[sysid], evtime, pid, fd, tim,
			mobj.cept->numberTPDUSent,
			mobj.cept->numberTPDUReceived,
			mobj.cept->numberTPDURetransmitted,
			mobj.cept->numberBytesSent,
			mobj.cept->numberBytesReceived,
			mobj.cept->numberBytesRetransmitted);
	    free(mobj.cept);
	    break;

	case CRFAILIN_THLD_EVENT:
	    fprintf(stdout, "%s %s  CrFailIn  id= %d %d  EvTime= %s\n\n",
			hosts[sysid], evtime, pid, fd, eventrep->ea_time);
	    free(Einv);
	    break;

	case CRFAILOUT_THLD_EVENT:
	    fprintf(stdout, "%s %s  CrFailOut  id= %d %d  EvTime= %s\n\n",
			hosts[sysid], evtime, pid, fd, eventrep->ea_time);
	    free(Einv);
	    break;

	case CRCONGST_THLD_EVENT:
	    fprintf(stdout, "%s %s  CrCongst  id= %d %d  EvTime= %s\n\n",
			hosts[sysid], evtime, pid, fd, eventrep->ea_time);
	    free(Einv);
	    break;

	case CRCONFERR_THLD_EVENT:
	    fprintf(stdout, "%s %s  CrConfErr  id= %d %d  EvTime= %s\n\n",
			hosts[sysid], evtime, pid, fd, eventrep->ea_time);
	    free(Einv);
	    break;

	case CRPROTERR_THLD_EVENT:
	    fprintf(stdout, "%s %s  ProtErr  id= %d %d  EvTime= %s\n\n",
			hosts[sysid], evtime, pid, fd, eventrep->ea_time);
	    free(Einv);
	    break;

	case CKSUMERR_THLD_EVENT:
	    fprintf(stdout, "%s %s  CkSumErr  id= %d %d  EvTime= %s\n\n",
			hosts[sysid], evtime, pid, fd, eventrep->ea_time);
	    free(Einv);
	    break;
    }

    fflush(stdout);
    return OK;
}


static  setpoll ()
{
    poll = YES;
    alarm(WAIT);
}


static  do_poll (msd)
int  msd[];
{
    int  i;

    poll = NO;

    for (i = 0; i < NofHosts; i++)
	if (msd[i] == -1 && (msd[i] = m_init(hosts[i])) != NOTOK) {
	    char *evtime; int now;

	    /* update mask */
	    mask |= 1 << msd[i];
	    if (nfds < msd[i] + 1)
		nfds = msd[i] + 1;

	    /*  set reports: TEinvReport, rcid 2, TCeptReport, rcid 3 */
	    if (ReportSetRequest(TEINV_REP, m_addValue, msd[i]) == NOTOK ||
		    ReportSetRequest(TCEPT_REP, m_addValue, msd[i]) == NOTOK) {
		close_connections(msd);
		error(NULLCP, "ReportSetRequest failed");
	    }

	    time(&now);
	    evtime = ctime(&now) + 11;
	    *(evtime+8) = '\0';
	    fprintf(stderr, "%s : got connection to %s\n",
					evtime, hosts[i]);
	    fflush(stderr);
	}
}