snmp file 配置流程.docx_第1页
snmp file 配置流程.docx_第2页
snmp file 配置流程.docx_第3页
snmp file 配置流程.docx_第4页
snmp file 配置流程.docx_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本次我将以 snmp 代理端的 file 配置进行相应的实例说明。文档网站:/dev/agent/group_handler.html#gacc092f27f7c4203fe20665c8341023c8 文档网站:/man/5/snmpd.conf1. file 配置如下:file path size /path 文件代表路径, size 代表大小单位是KB 如:file/tmp/snmpd.log10 (当文件/tmp/snmpd.log 大于10KB时,代理端会发送trap到指定的服务器端)trap 报文如下:2. 配置文件的解析 1)就file 的配置而言,它会有一个单独的文件来处理这个配置(文件位置:agent/mibgroup/ucd-snmp/file.c附录中有对该文件的说明), 2)函数说明 snmpd_register_config_handler(file,file_parse_config,file_free_config,filemaxsize); /file_parse_config 会把解析的内容放置到fileTable 中(structfilestatfileTableMAXFILEMAXFILE默认为20,意思为最大可以监测20个文件); 该函数的作用是:注册配置名字,解析函数和 相应的释放函数。 一下我来跟踪一下该函数:(函数的位置:agent/agent_read_config.c, 因为具体的函数内容较多,所以贴出来内容将从简) voidsnmpd_register_config_handler(constchar*token,void(*parser)(constchar*,char*),void(*releaser)(void),constchar*help) -register_app_config_handler(token,parser,releaser,help); (函数位置:snmplib/read_config.c) - register_config_handler(NULL,token,parser,releaser,help) (函数位置:snmplib/read_config.c) -internal_register_config_handler(type,token,parser,releaser,help,NORMAL_CONFIG)(函数位置:snmplib/read_config.c) 最终注册的内容会在函数internal_register_config_handler中,执行相应的操作并把注册的参数放置到结构体config_line 中,结构体内容如下: structconfig_line (结构体位置:include/net-snmp/library/read_config.h) char*config_token;/*Labelforeachlineparser*inthegivenfile.*/ void(*parse_line)(constchar*,char*); void(*free_func)(void); structconfig_line*next; charconfig_time;/*NORMAL,PREMIB,EITHER_CONFIG*/ char*help; ; snmpd_register_config_handler每注册一个解析函数都会形成一个config_line ,所有的config_line 通过结构体config_files 连接在一起 structconfig_files char*fileHeader;/*Labelforentirefile.*/ structconfig_line*start; structconfig_files*next; ; structconfig_files*config_files=NULL; 该指针是一个全局的指针,它指向config_files的链表; 至此配置的解析跟踪完毕。3. trap的发送 structvariable2file_table= /file 表:以下每一个条目会在mib 中注册一个节点,每一个节点对应一个处理函数(附录中:会有相应的简要说明) FILE_INDEX,ASN_INTEGER,RONLY,var_file_table,1,1, FILE_NAME,ASN_OCTET_STR,RONLY,var_file_table,1,2,生成的相应的mib 节点如下: FILE_SIZE,ASN_INTEGER,RONLY,var_file_table,1,3, FILE_MAX,ASN_INTEGER,RONLY,var_file_table,1,4, FILE_ERROR,ASN_INTEGER,RONLY,var_file_table,1,100, FILE_MSG,ASN_OCTET_STR,RONLY,var_file_table,1,101生成的mib节点如下: ; 1)mib 节点的注册 REGISTER_MIB(ucd-snmp/file,file_table,variable2,file_variables_oid);/处理函数 及 表是通过本函数进行注册的(注册oid及相应的处理函数)。 #defineREGISTER_MIB(descr,var,vartype,theoid) -register_mib(descr,(structvariable*)var,sizeof(structvartype), sizeof(var)/sizeof(structvartype),theoid,sizeof(theoid)/sizeof(oid) -register_mib_priority(moduleName,var,varsize,numvars,mibloc,mibloclen,DEFAULT_MIB_PRIORITY); -register_mib_range(moduleName,var,varsize,numvars,mibloc,mibloclen,priority,0,0,NULL); -register_mib_context(moduleName,var,varsize,numvars,mibloc,mibloclen,priority,range_subid,range_ubound,ss,-1,0); -netsnmp_register_old_api(moduleName,var,varsize,numvars, mibloc,mibloclen,priority,range_subid,range_ubound,ss,context,timeout,flags); (在该函数中填充了一个结构体reginfo,其中有一个操作为reginfo-handler=get_old_api_handler(); ) -get_old_api_handler() -netsnmp_create_handler(old_api,netsnmp_old_api_helper) /绑定了一个处理函数agent/agent_handler.c -netsnmp_old_api_helper(netsnmp_mib_handler*handler, netsnmp_handler_registration*reginfo, netsnmp_agent_request_info*reqinfo, netsnmp_request_info*requests)agent/helpers/old_api.c (snmp_set_var_typed_valuesnmplib/snmp_client.c) 从file中返回的信息可以在以上的snmp_log 打印出来(trap 发送的内容:/tmp/snmpd.log . ), 该函数会逐个调用request的处理函数(就file来说会调用var_file_table); -netsnmp_register_handler(reginfo)agent/agent_handler.c -netsnmp_register_mib(reginfo-handlerName,NULL,0,0,reginfo-rootoid,reginfo-rootoid_len,reginfo-priority,reginfo-range_subid,reginfo-range_ubound,NULL,reginfo-contextName,reginfo-timeout,flags,reginfo,1); /agent/agent_registry.c 2)事件监听 file 的监控是通过配置:defaultMonitorsyes 来完成的(对应解析,在文件:agent/mibgroup/disman/mteTriggerTable.c中) 以下是defaultMonitors 对应的解析函数。而fileTable 保存了file配置的相应的内容(fileTable定义在在file.c中),此意为每六秒钟检测一下fileTable。 如同file一样它的相应的注册函数为:-parse_default_monitors(constchar*token,char*line)-#defineMTE_PROCESS_LINE(line) snprintf(buf,SPRINT_MAX_LEN,-u%s%s,mte_default_user,line);parse_simple_monitor(monitor,buf); 这是file 配置对应的buf (意思:每 6 秒钟 检测一次,如果标志位 fileErrorFlag 不为 0 的话,就发送 fileErrorMsg 信息,具体的执行请看附录) -parse_simple_monitor(constchar*token,char*line) -mte_enable_trigger(structmteTriggerTable_data*item) -snmp_alarm_register(item-mteTriggerFrequency,SA_REPEAT,mte_run_trigger,item);/snmplib/snmp_alarm.c -mte_run_trigger是定时器的回调函数,其中存在发送trap的函数(agent/mibgroup/disman/mteTriggerTable.c) -sa_update_entry(*sa_pptr);/内部存在定时器 -set_an_alarm() /启动alarm的函数 -signal(SIGALRM,alarm_handler); /当接收到警告时,就启动函数alarm_handler -alarm_handler -run_alarms();set_an_alarm(); /内有定时器,会循环的调用函数注:从以上的函数显示,监听是通过定时器来完成的。run_alarms的部分内容:if(a-t_next.tv_sect_next.tv_sec=t_now.tv_sec)&(a-t_next.tv_usecclientreg;DEBUGMSGTL(snmp_alarm,runalarm%dn,clientreg);(*(a-thecallback)(clientreg,a-clientarg);if(a=sa_find_specific(clientreg)!=NULL)a-t_last.tv_sec=t_now.tv_sec;a-t_last.tv_usec=t_now.tv_usec;a-t_next.tv_sec=0;a-t_next.tv_usec=0;sa_update_entry(a); 1)snmptarp和snmptarpd的基本流程为: 1.初始化session(snmp_sess_init) 2.打开session(snmp_open) 3.打开trap客户端或者服务端(netsnmp_transport_open_client or netsnmp_transport_open_server) 4.客户端发送trap pdu。服务端等待接收trap 5.关闭应用程序(snmp_shutdown) 2)file.c 程序说明: /*Portionsofthisfilearesubjecttothefollowingcopyrights.See*theNet-SNMPsCOPYINGfileformoredetailsandothercopyrights*thatmayapply:*/*Copyright?2003SunMicrosystems,Inc.Allrightsreserved.*UseissubjecttolicensetermsspecifiedintheCOPYINGfile*distributedwiththeNet-SNMPpackage.*/#include#include#include#ifTIME_WITH_SYS_TIME#ifdefWIN32#include#else#include#endif#include#else#ifHAVE_SYS_TIME_H#include#else#include#endif#endif#ifHAVE_WINSOCK_H#include#endif#ifHAVE_STRING_H#include#endif#ifHAVE_STRING_H#include#endif#include#include#includestruct.h#includefile.h#includeutil_funcs.h#defineMAXFILE20/最大监控的文件数structfilestatfileTableMAXFILE;/存储文件信息intfileCount;voidinit_file(void)structvariable2file_table= 索引,类型,读写权限,处理函数,底层ID层数,具体的底层IDFILE_INDEX,ASN_INTEGER,RONLY,var_file_table,1,1,FILE_NAME,ASN_OCTET_STR,RONLY,var_file_table,1,2,FILE_SIZE,ASN_INTEGER,RONLY,var_file_table,1,3,FILE_MAX,ASN_INTEGER,RONLY,var_file_table,1,4,FILE_ERROR,ASN_INTEGER,RONLY,var_file_table,1,100,FILE_MSG,ASN_OCTET_STR,RONLY,var_file_table,1,101;/*DefinetheOIDpointertothetopofthemibtreethatwere*registeringunderneath*/oidfile_variables_oid=NETSNMP_UCDAVIS_MIB,15,1;/对应的上层oid 号/*registerourselveswiththeagenttohandleourmibtree*/REGISTER_MIB(ucd-snmp/file,file_table,variable2,file_variables_oid);/注册mib 节点snmpd_register_config_handler(file,file_parse_config,file_free_config,filemaxsize);/注册解析函数voidfile_free_config(void)fileCount=0;voidfile_parse_config(constchar*token,char*cptr)/配置的解析函数char*cp;if(fileCount=FILE_NAME_MAX-1)config_perror(filenametoolong);return;if(cp)fileTablefileCount.max=strtoul(cp,NULL,10);elsefileTablefileCount.max=-1;fileCount+;voidupdateFile(intiindex)/跟新文件状态信息structstatsb;if(stat(fileT,&sb)=0)fileTableiindex.size=sb.st_size10;/*OIDfunctions*/u_char*var_file_table(structvariable*vp,oid*name,size_t*length,intexact,size_t*var_len,WriteMethod*write_method)/节点的处理函数staticlonglong_ret;staticcharerror256;intiindex;structfilestat*file;if(header_simple_table(vp,name,length,exact,var_len,write_method,fileCount)return(NULL);iindex=nam

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论