/* * construct() method * * define <term> node <skill>("<translator>",[<binding>])[:<text>] * * <translator> - name of translator file * <binding> - port_number or "interface_address[:port_number]" * <text> - flag keywords * trace - display input packets * dump - display dump of syslog packets * silent - don't echo generated NodeBrain commands * * define syslog node syslog.server("syslog.nbx"); * define syslog node syslog.server("syslog.nbx"):dump,silent; * define syslog node syslog.server("syslog.nbx","127.0.0.1"); * define syslog node syslog.server("syslog.nbx",50162); * define syslog node syslog.server("syslog.nbx","127.0.0.1:50162"); * define syslog node syslog.server("syslog.nbx","127.0.0.1:50162"):silent; */ void *serverConstruct(nbCELL context,void *skillHandle,nbCELL arglist,char *text){ NB_MOD_Server *server; nbCELL cell=NULL; nbSET argSet; char *cursor=text,*delim,saveDelim; double r,d; char interfaceAddr[512]; unsigned int port=514; int type,trace=0,dump=0,echo=1; int len; char *str; char *transfilename; nbCELL translator; char *uri="";; *interfaceAddr=0; argSet=nbListOpen(context,arglist); cell=nbListGetCellValue(context,&argSet); if(cell==NULL){ nbLogMsg(context,0,'E',"Translator configuration file required as first argument"); return(NULL); } type=nbCellGetType(context,cell); if(type!=NB_TYPE_STRING){ nbLogMsg(context,0,'E',"First argument must be string identifying translator configuration file"); return(NULL); } transfilename=nbCellGetString(context,cell); translator=nbTranslatorCompile(context,0,transfilename); if(translator==NULL){ nbLogMsg(context,0,'E',"Unable to load translator '%s'",transfilename); return(NULL); } cell=nbListGetCellValue(context,&argSet); if(cell!=NULL){ type=nbCellGetType(context,cell); if(type==NB_TYPE_STRING){ str=nbCellGetString(context,cell); uri=strdup(str); if(!uri) nbExit("serverConstruct: Out of memory - terminating"); if(strncmp(str,"udp://",6)==0) str+=6; // allow for uri delim=strchr(str,':'); if(delim==NULL) len=strlen(str); else len=delim-str; if(len>15 && *str>='0' && *str<='9'){ nbLogMsg(context,0,'E',"Inteface IP address may not be greater than 15 characters"); nbCellDrop(context,cell); return(NULL); } if(len>sizeof(interfaceAddr)-1){ nbLogMsg(context,0,'E',"Socket specification too long for buffer at--->%s",str); nbCellDrop(context,cell); return(NULL); } strncpy(interfaceAddr,str,len); *(interfaceAddr+len)=0; if(delim!=NULL){ delim++; port=(unsigned int)atoi(delim); } nbCellDrop(context,cell); } else if(type==NB_TYPE_REAL){ r=nbCellGetReal(context,cell); nbCellDrop(context,cell); port=(unsigned int)r; d=port; if(d!=r || d==0){ nbLogMsg(context,0,'E',"Expecting non-zero integer UDP port number"); return(NULL); } } else{ nbLogMsg(context,0,'E',"Expecting (\"file\") or (\"address[:port]\") or (port) as argument list"); return(NULL); } cell=nbListGetCellValue(context,&argSet); if(cell!=NULL){ nbLogMsg(context,0,'E',"The syslog skill only accepts two argument."); return(NULL); } } while(*cursor==' ') cursor++; while(*cursor!=';' && *cursor!=0){ delim=strchr(cursor,' '); if(delim==NULL) delim=strchr(cursor,','); if(delim==NULL) delim=strchr(cursor,';'); if(delim==NULL) delim=cursor+strlen(cursor); saveDelim=*delim; *delim=0; if(strcmp(cursor,"trace")==0){trace=1;} else if(strcmp(cursor,"dump")==0){trace=1;dump=1;} else if(strcmp(cursor,"silent")==0) echo=0; *delim=saveDelim; cursor=delim; if(*cursor==',') cursor++; while(*cursor==' ' || *cursor==',') cursor++; } server=nbAlloc(sizeof(NB_MOD_Server)); server->uri=uri; server->socket=0; strcpy(server->interfaceAddr,interfaceAddr); server->port=port; server->translator=translator; server->trace=trace; server->dump=dump; server->echo=echo; nbLogMsg(context,0,'I',"calling nbListenerEnableOnDaemon"); nbListenerEnableOnDaemon(context); // sign up to enable when we daemonize return(server); }
/* * construct() method * * define <term> node <skill>[(<args>)][:<text>] * * define <term> node audit("<filename>","<translator>",<schedule>); */ static void *auditConstruct(nbCELL context,void *skillHandle,nbCELL arglist,char *text){ nbAudit *audit; nbCELL fileNameCell,translatorNameCell,scheduleCell,nullCell; nbSET argSet; int type; char *fileName,*translatorName; nbCELL translatorCell; //nbLogMsg(context,0,'T',"auditConstruct: called"); argSet=nbListOpen(context,arglist); fileNameCell=nbListGetCellValue(context,&argSet); if(fileNameCell==NULL){ nbLogMsg(context,0,'E',"Expecting string file name as first parameter"); return(NULL); } type=nbCellGetType(context,fileNameCell); if(type!=NB_TYPE_STRING){ nbLogMsg(context,0,'E',"Expecting string file name as first parameter"); return(NULL); } fileName=nbCellGetString(context,fileNameCell); translatorNameCell=nbListGetCellValue(context,&argSet); if(translatorNameCell==NULL){ nbLogMsg(context,0,'E',"Expecting string translator name as second parameter"); return(NULL); } type=nbCellGetType(context,translatorNameCell); if(type!=NB_TYPE_STRING){ nbLogMsg(context,0,'E',"Expecting string translator name as second parameter"); return(NULL); } translatorName=nbCellGetString(context,translatorNameCell); scheduleCell=nbListGetCell(context,&argSet); // get schedule cell - not value nullCell=nbListGetCellValue(context,&argSet); if(nullCell!=NULL){ nbLogMsg(context,0,'E',"The audit skill only accepts three parameters."); return(NULL); } translatorCell=nbTranslatorCompile(context,0,translatorName); if(translatorCell==NULL){ nbLogMsg(context,0,'E',"Unable to load translator '%s'",translatorName); return(NULL); } audit=nbAlloc(sizeof(struct NB_MOD_AUDIT)); audit->file=NULL; audit->pos=0; audit->fileNameCell=fileNameCell; audit->fileName=fileName; audit->translatorNameCell=translatorNameCell; audit->translatorName=translatorName; audit->translatorCell=nbCellGrab(context,translatorCell); audit->scheduleCell=scheduleCell; audit->synapseCell=NULL; audit->trace=0; nbListenerEnableOnDaemon(context); // sign up to enable when we daemonize if(audit->trace) nbLogMsg(context,0,'T',"auditConstruct: returning"); return(audit); }