int main (int argc, char **argv) { int c, errflg = 0; char *in, *out; int orbin, orbout; double maxpkts = VERY_LARGE_NUMBER ; int quit; char *pktmatch = strdup(".*/pf/evtinfo"), *reject = 0; int nmatch; int specified_after = 0; double after = 0.0, until = VERY_LARGE_NUMBER ; double start_time, end_time, delta_t ; double totpkts = 0, totbytes = 0; Flags flags; static int last_pktid = -1; static double last_pkttime = 0.0; char *statefile = 0; double last_burial = 0.0; double decent_interval = 300.0; int mode = PKT_NOSAMPLES; int rcode; char srcname[ORBSRCNAME_SIZE]; double pkttime = 0.0 ; int pktid; int nbytes; char *packet = 0; int packetsz = 0; Packet *unstuffed = 0; Pf *pf; Tbl *tbl; Arr *arr; char *arrkey; char *pffilename; Tbl *channels; char *net; char *sta; char *chan; char netstachan[ORBSRCNAME_SIZE]; Srcname parts; double maxtime,mintime,starttime,triggertime,duration,min_g,max_g,snr; char *datalogger; int evtfilesize,channelno,maxcts,mincts; char *errors,*evtfilename,*ft,*filter,*srcid; char *line; int i; Pf *pfnew; Dbptr db; int put_tests=0; char *chanmatch=0; Hook *hook=0; char *tdummy=0; char *match=malloc(100); memset (&flags, 0, sizeof (flags)); elog_init (argc, argv); elog_notify (0, "%s $Revision: 1.5 $ $Date: 2005/05/10 07:34:43 $\n", Program_Name); while ((c = getopt (argc, argv, "m:n:r:S:c:tvV")) != -1) { switch (c) { case 'm': match = optarg; sprintf(pktmatch,"%s/pf/evtinfo",match); break; case 'c': chanmatch = optarg; break; case 't': put_tests = 1; break; case 'n': maxpkts = atoi (optarg); break; case 'r': reject = optarg; break; case 'S': statefile = optarg; break; case 'v': flags.verbose++; break; case 'V': flags.verbose++; flags.verbose++; break; case '?': errflg++; } } if (errflg || argc - optind < 2 || argc - optind > 4) usage (); in = argv[optind++]; out = argv[optind++]; if (argc > optind) { after = str2epoch (argv[optind++]); specified_after = 1; if (argc > optind) { until = str2epoch (argv[optind++]); if (until < after) { until += after ; } } } if ((orbin = orbopen (in, "r&")) < 0) die (0, "Can't open input '%s'\n", in); if (statefile != 0) { char *s; if (exhume (statefile, &quit, RT_MAX_DIE_SECS, 0) != 0) { elog_notify (0, "read old state file\n"); } if (orbresurrect (orbin, &last_pktid, &last_pkttime) == 0) { elog_notify (0, "resurrection successful: repositioned to pktid #%d @ %s\n", last_pktid, s = strtime (last_pkttime)); free (s); } else { complain (0, "resurrection unsuccessful\n"); } } if ((orbout = orbopen (out, "w&")) < 0) { die (0, "Can't open output '%s'\n", out); } if (pktmatch) { nmatch = orbselect (orbin, pktmatch); } if (nmatch < 0) { die (1, "select '%s' returned %d\n", pktmatch, nmatch); } if (reject) { nmatch = orbreject (orbin, reject); } if (nmatch < 0) { elog_die (1, "reject '%s' returned %d\n", reject, nmatch); } else { if (flags.verbose) { elog_notify (1,"%d sources selected\n", nmatch); } } if (specified_after) { pktid = orbafter (orbin, after); if (pktid < 0) { char *s; elog_complain (1, "seek to %s failed\n", s = strtime (after)); free (s); pktid = forbtell (orbin); elog_complain (1,"pktid is still #%d\n", pktid); } else { if (flags.verbose) elog_notify (1,"new starting pktid is #%d\n", pktid); } } start_time = now (); db = dbtmp("rt1.0"); while (!quit && pkttime < until && totpkts < maxpkts) { rcode = orbreap (orbin, &pktid, srcname, &pkttime, &packet, &nbytes, &packetsz); switch (rcode) { case 0: totpkts++; totbytes += nbytes; if (flags.verbose>2) { showPkt (pktid, srcname, pkttime, packet, nbytes, stdout, mode); } if (statefile != 0 && last_pkttime - last_burial > decent_interval) { bury (); last_burial = pkttime; } if ((unstuffPkt (srcname, pkttime, packet, nbytes, &unstuffed))==Pkt_pf) { pf = unstuffed->pf; tbl= pfkeys(pf); arrkey= gettbl(tbl,0); pfget(pf,arrkey,&pfnew); datalogger= pfget_string(pfnew,"datalogger"); duration= pfget_double(pfnew,"duration"); errors= pfget_string(pfnew,"errors"); evtfilename= pfget_string(pfnew,"evtfilename"); evtfilesize= pfget_int(pfnew,"evtfilesize"); ft= pfget_string(pfnew,"ft"); starttime= pfget_double(pfnew,"time"); triggertime= pfget_double(pfnew,"triggertime"); channels=pfget_tbl(pfnew,"channels"); if (strcasecmp(ft,"no")==0 || put_tests == 1) { for (i=0; i<maxtbl(channels);i++) { line=gettbl(channels,i); sscanf(line,"%s %d %lf %d %lf %lf %d %lf", netstachan,&channelno,&maxtime,&maxcts,&max_g,&mintime,&mincts,&min_g); split_srcname(netstachan,&parts); strcpy(parts.src_suffix,"GENC"); join_srcname(&parts,netstachan); if (flags.verbose>1) printf("%s,%s\n", netstachan,tdummy=strtime(triggertime)); if (chanmatch == 0 || strmatches(parts.src_chan,chanmatch,&hook)) { if (flags.verbose) elog_notify(1,"putting detev for %s,%s\n", netstachan,tdummy=strtime(triggertime)); db=dblookup(db,0,"detev",0,"dbSCRATCH"); dbputv(db,0,"sta",parts.src_sta,"chan",parts.src_chan, "filter",K2_FILTER, "time", triggertime, "tron", starttime - triggertime, "troff", starttime - triggertime + duration, "iphase","K2", "snr",(max_g * 1000.0 - min_g * 1000.0)/2.0, 0); db2orbpkt(db,orbout); } else { if (flags.verbose>1) elog_notify(1,"ignoring %s,%s\n", netstachan,tdummy=strtime(triggertime)); } } } } last_pktid = pktid; last_pkttime = pkttime; } } if (statefile != 0) bury (); end_time = now (); delta_t = end_time - start_time; if (flags.verbose>1) { if (totpkts > 0) { elog_notify (1,"\n%.0f %.2f byte packets (%.1f kbytes) in %.3f seconds\n\t%10.3f kbytes/s\n\t%10.3f kbaud\n\t%10.3f pkts/s\n", totpkts, totbytes / totpkts, totbytes / 1024, delta_t, totbytes / delta_t / 1024, totbytes / delta_t / 1024 * 8, totpkts / delta_t); } else { elog_notify (1,"\nno packets read\n"); } } if (orbclose (orbin)) { elog_complain (1, "error closing read orb\n"); } if (orbclose (orbout)) { elog_complain (1, "error closing write orb\n"); } return 0; }
static PyObject * python_orbreap( PyObject *self, PyObject *args ) { char *usage = "Usage: _orbreap(orb)\n"; int orbfd; int pktid; char srcname[ORBSRCNAME_SIZE]; double pkttime; char *pkt = 0; int nbytes = 0; int bufsize = 0; PyObject *obj; int rc; if( ! PyArg_ParseTuple( args, "i", &orbfd ) ) { if( ! PyErr_Occurred() ) { PyErr_SetString( PyExc_RuntimeError, usage ); } return NULL; } rc = orbreap( orbfd, &pktid, srcname, &pkttime, &pkt, &nbytes, &bufsize ); if( rc < 0 ) { elog_flush( 1, 0 ); PyErr_SetString( PyExc_RuntimeError, "orbreap failed\n" ); return NULL; } obj = Py_BuildValue( "s#", pkt, nbytes ); free( pkt ); return Py_BuildValue( "isdOi", pktid, srcname, pkttime, obj, nbytes ); }
/* Input routine for db records for orbgenloc. Arguments: orb - input orb dbtmp - temporary database used by orbpkt2db hyp - returned data structure (see orbgenloc.h) last_pktid - if nonzero, call orbseek to start at that location opt - orbgenloc control structure (see orbgenloc.h) Returns: -1 = error, data returned is invalid 0 = aok 1 = inconsistency error. Data are certainly incomplete and should be ignored. IMPORTANT: this routine mallocs a single block of memory to hold the hyp->assocs structure. This MUST be freed externally. */ int orb_arrivals_in (int orb, Dbptr dbtmp, ORB_Hypocenter *hyp, int *last_pktid, RTlocate_Options opt) { int pktid, nbytes, bufsize=0; char *packet=NULL; char srcname[64]; double time; Dbptr db; char *table_name; int evid, orid, arid, prefor; char auth[64]; int n; int number_skipped; if (*last_pktid > -1) orbseek (orb, *last_pktid); /* The algorithm here is to the following sequence: (1) hunt for a db packet that is an event record. (2) if the event record is auth=orbassoc, start processing, otherwise ignore it. (3) next hunt for an origin record from orbassoc skipping any other embedded origin records (needed in case other locators are running) (4) Then grab interleaved assoc->arrival rows. The algorithm is smart and hunts for an arrival that matches the arid of the previous assoc record skipping any other db records that do not match. Important assumptions of this are that only one process is emitting assoc records into the orb. In addition, this program will block and wait forever if an error causes a missing arrival row to never appear that has an arid matching a previous output assoc row. We may need a timeout or skip count parameter to avoid this potential pitfall. */ /* This loop is part (1) of the algorithm */ while (1) { if(orbreap (orb, &pktid, srcname, &time, &packet, &nbytes, &bufsize)) { elog_log(0,"orbreap error at packet id %d\nContinuing\n",pktid); continue; } if (strncmp(srcname, "/db/", 4)) continue; db = orbpkt2db (packet, nbytes, dbtmp); dbquery (db, dbTABLE_NAME, &table_name); if (strcmp(table_name, "event")) continue; if (dbgetv (db, 0, "auth", hyp->auth, "evid", &(hyp->evid), "prefor", &prefor, 0) == dbINVALID) { elog_log(0, "orbin: dbgetv() error.\n"); return (-1); } if (strcmp(hyp->auth, "orbassoc")) continue; *last_pktid = pktid; /* This is part (2) */ while (1) { orbreap (orb, &pktid, srcname, &time, &packet, &nbytes, &bufsize); if (strncmp(srcname, "/db/", 4)) continue; db = orbpkt2db (packet, nbytes, dbtmp); dbquery (db, dbTABLE_NAME, &table_name); if (strcmp(table_name, "origin")) continue; if (dbgetv (db, 0, "auth", auth, "evid", &evid, "orid", &(hyp->orid), "nass", &(hyp->nass), "ndef", &(hyp->ndef), "time", &(hyp->time), "lat", &(hyp->lat), "lon", &(hyp->lon), "depth", &(hyp->depth), 0) == dbINVALID) { elog_log(0, "orbin: dbgetv() error.\n"); return (-1); } if (strcmp(auth, "orbassoc")) continue; if (evid != hyp->evid) continue; if (prefor > 0 && prefor != hyp->orid) continue; if (hyp->assocs == NULL || hyp->nass > hyp->assocs_size) { if (hyp->assocs) free (hyp->assocs); hyp->assocs = (Association *) malloc (hyp->nass*sizeof(Association)); if (hyp->assocs == NULL) { elog_log(1, "orbin: malloc() error.\n"); return (-1); } hyp->assocs_size = hyp->nass; } /* This is parts (3) and (4) for assoc->arrival */ n = 0; while (1) { orbreap (orb, &pktid, srcname, &time, &packet, &nbytes, &bufsize); if (strncmp(srcname, "/db/", 4)) continue; db = orbpkt2db (packet, nbytes, dbtmp); dbquery (db, dbTABLE_NAME, &table_name); if (strcmp(table_name, "assoc")) continue; if (dbgetv (db, 0, "orid", &orid, "arid", &(hyp->assocs[n].arid), "delta", &(hyp->assocs[n].delta), "seaz", &(hyp->assocs[n].seaz), "esaz", &(hyp->assocs[n].esaz), "timeres", &(hyp->assocs[n].timeres), "timedef", hyp->assocs[n].timedef, 0) == dbINVALID) { elog_log(0, "orbin: dbgetv() error.\n"); return (-1); } if (orid != hyp->orid) continue; /* This is the safe code to avoid an infinite loop */ number_skipped = 0; while (number_skipped <= opt.db_record_skip_timeout) { orbreap (orb, &pktid, srcname, &time, &packet, &nbytes, &bufsize); if (strncmp(srcname, "/db/", 4)) continue; db = orbpkt2db (packet, nbytes, dbtmp); dbquery (db, dbTABLE_NAME, &table_name); if (strcmp(table_name, "arrival")) { ++number_skipped; continue; } if (dbgetv (db, 0, "arid", &arid, "time", &(hyp->assocs[n].time), "sta", hyp->assocs[n].sta, "chan", hyp->assocs[n].chan, "iphase", hyp->assocs[n].iphase, 0) == dbINVALID) { elog_log(0, "orbin: dbgetv() error.\n"); return (-1); } if (arid == hyp->assocs[n].arid) break; } if(number_skipped >= opt.db_record_skip_timeout) { elog_log(0,"Record skipping limit reached while hunting for arrival row to match assoc row.\nResynching\nOne or more events were probably skipped\n"); return(1); } n++; if (n >= hyp->nass) break; } return (0); } } }
main( int argc, char **argv ) { thread_t tidHeartbeat; int nbytes_orb; int nbytes_tp; MSG_LOGO putlogo; /* logo of message */ int res; TracePacket tp; int pktid; char srcname[STRSZ]; double mytime; char *rawpkt = NULL; struct Packet *Pkt = NULL; struct PktChannel *pktchan = NULL; int ichan; int bufsize = 0; char *sitedb; int rc; if ( argc != 2 ) { fprintf( stderr, "Usage: orb2eworm <configfile>\n" ); exit( 0 ); } chdir_ewparams( "orb2eworm" ); elog_init( argc, argv ); orb2eworm_config( argv[1] ); logit_init( "orb2eworm", (short) MyModId, MAX_LOGMSG_SIZE, LogSwitch ); logit( "", "%s: Read command file <%s>\n", argv[0], argv[1] ); orb2eworm_lookup( ); if( ( sitedb = getenv( "SITE_DB" ) ) == NULL ) { fprintf(stderr, "Environment variable SITE_DB not defined; "); fprintf(stderr, "orb2eworm exiting.\n"); exit( -1 ); } read_site_db( sitedb ); OrbFd = orbopen( OrbName, "r&" ); if( OrbFd < 0 ) { logit( "e", "Failed to connect to orb %s--Bye\n", OrbName ); exit( -1 ); } else { logit( "", "Connected to orb %s\n", OrbName ); } if( ! STREQ( ChannelSelect, "" ) ) { orbselect( OrbFd, ChannelSelect ); } if( ! STREQ( ChannelReject, "" ) ) { orbreject( OrbFd, ChannelReject ); } tport_attach( &Region, RingKey ); logit( "", "orb2eworm: Attached to public memory region %s: %d\n", RingName, RingKey ); StartThread( Heartbeat, 0, &tidHeartbeat ); putlogo.instid = InstId; putlogo.mod = MyModId; putlogo.type = TypeTracebuf; for( ;; ) { terminate_if_requested(); /* Accept that heartbeats will be delayed for now while orbreap blocks */ rc = orbreap( OrbFd, &pktid, srcname, &mytime, &rawpkt, (int *)&nbytes_orb, &bufsize ); if( rc < 0 ) { elog_clear_register( 1 ); continue; } rc = unstuffPkt( srcname, mytime, rawpkt, nbytes_orb, &Pkt ); if( rc == 0 ) { logit( "et", "Unstuff failure in orb2eworm for %s\n", srcname ); elog_clear_register( 1 ); continue; } for( ichan = 0; ichan < Pkt->nchannels; ichan++ ) { pktchan = gettbl( Pkt->channels, ichan ); if( pktchan_to_tracebuf( pktchan, &tp, mytime, &nbytes_tp ) ) continue; res = tport_putmsg( &Region, &putlogo, nbytes_tp, tp.msg ); } } }