Oops 0 2 июня, 2011 Опубликовано 2 июня, 2011 (изменено) · Жалоба Здрасти, здрасти!!! Имеется ОС Linux на которой поднят SNMP демон ( snmpd ). Я пишу библиотеку, которую подключает snmpd при старте и используя которую реагирует на команды. Библиотеку пишу на обычном С, пользуюсь помощью тут: http://www.net-snmp.org/wiki/index.php/TUT...oding_Tutorials . Понадобилось написать SNMP таблицу в кторой надо менять переменные. Работать с таблицей состоящей из одной строки - просто, вот пример: static oid ipConfTable_registration_oid[] = { 1, 3, 6, 1, 4, 1, 1958, 7, 2, 2, 3 }; // прикрепляем к таблици OID. int ipConfTable_handler (netsnmp_mib_handler *handler,netsnmp_handler_registration *reginfo,netsnmp_agent_request_info *reqinfo,netsnmp_request_info *requests); // объявляем функцию-обработчик обытий таблицы /// TABLE /// { netsnmp_table_data_set *table_set; netsnmp_table_row *row; table_set = netsnmp_create_table_data_set("Table"); table_set->allow_creation = 1; netsnmp_table_dataset_add_index(table_set, ASN_OCTET_STR); netsnmp_table_set_multi_add_default_row(table_set, // таблица из 5 колонок 1, ASN_IPADDRESS, 1, NULL, 0, 2, ASN_INTEGER, 1, NULL, 0, 3, ASN_IPADDRESS, 1, NULL, 0, 4, ASN_OCTET_STR, 1, NULL, 0, 5, ASN_IPADDRESS, 1, NULL, 0, 0 ); netsnmp_register_table_data_set(netsnmp_create_handler_registration ("Table",//NULL, ipConfTable_handler // прикрепляем фукцию обработчик, ipConfTable_registration_oid, OID_LENGTH(ipConfTable_registration_oid), HANDLER_CAN_RWRITE), table_set, NULL); row = netsnmp_create_table_data_row(); int index; index = 0; netsnmp_table_row_add_index(row, ASN_INTEGER, &index, sizeof(index)); ipConfAddress = 0x00000000; netsnmp_set_row_column(row, 1, ASN_IPADDRESS,(char*)&ipConfAddress, sizeof(ipConfAddress)); netsnmp_mark_row_column_writable(row, 1, 1); unsigned int num = 1; netsnmp_set_row_column(row, 2, ASN_INTEGER,(char*)&num, sizeof(num)); netsnmp_mark_row_column_writable(row, 2, 1); u_long ipConfNetMask = 0x00000000; netsnmp_set_row_column(row, 3, ASN_IPADDRESS, (char*)&ipConfNetMask,sizeof(ipConfNetMask)); netsnmp_mark_row_column_writable(row, 3, 1); netsnmp_set_row_column(row, 4, ASN_OCTET_STR, "eth0",strlen("eth0")); netsnmp_mark_row_column_writable(row, 4, 1); u_long gateway = 0x00000000; netsnmp_set_row_column(row, 5, ASN_IPADDRESS, (char*)&gateway,sizeof(gateway)); netsnmp_mark_row_column_writable(row, 5, 1); netsnmp_table_dataset_add_row(table_set, row); netsnmp_register_auto_data_table(table_set, NULL); } Далее в функции обработчике производим запись и чтение значений таблицы. int ipConfTable_handler(netsnmp_mib_handler *handler,netsnmp_handler_registration *reginfo,netsnmp_agent_request_info *reqinfo,netsnmp_request_info *requests) { u_long *ipConfAddress_cache = NULL; u_long *ipConfNetMask_cache = NULL; u_long *gateway_cache = NULL; netsnmp_variable_list *var; long int ret; netsnmp_request_info *request; netsnmp_table_request_info *table_info; long int variable; char i; for (request=requests; request; request=request->next) { var = request->requestvb; netsnmp_extract_iterator_context(request); table_info = netsnmp_extract_table_info(request); switch (reqinfo->mode) { case MODE_GET: if(key == 0){ readConfigEthernet(); key = 1;} switch (table_info->colnum) { case 1: snmp_set_var_typed_value(var, ASN_IPADDRESS,(u_char *) &ipConfAddress,sizeof( TYPE )); break; case 2: break; case 3: snmp_set_var_typed_value(var, ASN_IPADDRESS,(u_char *) &ipConfNetMask,sizeof( TYPE )); break; case 4: break; case 5: snmp_set_var_typed_value(var, ASN_IPADDRESS,(u_char *) &gateway,sizeof( TYPE )); break; default: break; } break; case MODE_SET_RESERVE1: switch (table_info->colnum) { case 1: if (requests->requestvb->type != ASN_IPADDRESS) { netsnmp_set_request_error(reqinfo, requests,SNMP_ERR_WRONGTYPE); return SNMP_ERR_WRONGTYPE; } break; case 3: if (requests->requestvb->type != ASN_IPADDRESS) { netsnmp_set_request_error(reqinfo, requests,SNMP_ERR_WRONGTYPE); return SNMP_ERR_WRONGTYPE; } break; case 5: if (requests->requestvb->type != ASN_IPADDRESS) { netsnmp_set_request_error(reqinfo, requests,SNMP_ERR_WRONGTYPE); return SNMP_ERR_WRONGTYPE; } break; default: break; } break; case MODE_SET_RESERVE2: switch (table_info->colnum) { case 1: memdup((u_char **) & ipConfAddress_cache, (u_char *) & ipConfAddress, sizeof(ipConfAddress)); if (ipConfAddress_cache == NULL) { netsnmp_set_request_error(reqinfo, requests,SNMP_ERR_RESOURCEUNAVAILABLE); return SNMP_ERR_RESOURCEUNAVAILABLE; } netsnmp_request_add_list_data(requests,netsnmp_create_data_list(DELAYED_INSTANCE_SET_NAME,ipConfAddress_cache, free)); break; case 3: memdup((u_char **) & ipConfNetMask_cache, (u_char *) & ipConfNetMask, sizeof(ipConfNetMask)); if (ipConfNetMask_cache == NULL) { netsnmp_set_request_error(reqinfo, requests,SNMP_ERR_RESOURCEUNAVAILABLE); return SNMP_ERR_RESOURCEUNAVAILABLE; } netsnmp_request_add_list_data(requests,netsnmp_create_data_list(DELAYED_INSTANCE_SET_NAME,ipConfNetMask_cache, free)); break; case 5: memdup((u_char **) & gateway_cache, (u_char *) & gateway, sizeof(gateway)); if (gateway_cache == NULL) { netsnmp_set_request_error(reqinfo, requests,SNMP_ERR_RESOURCEUNAVAILABLE); return SNMP_ERR_RESOURCEUNAVAILABLE; } netsnmp_request_add_list_data(requests,netsnmp_create_data_list(DELAYED_INSTANCE_SET_NAME,gateway_cache, free)); break; default: break; } break; case MODE_SET_ACTION: variable = 0; switch (table_info->colnum) { case 1: ipConfAddress = *(requests->requestvb->val.integer); break; case 3: ipConfNetMask = *(requests->requestvb->val.integer); break; case 5: gateway = *(requests->requestvb->val.integer); break; default: break; } break; case MODE_SET_UNDO: switch (table_info->colnum) { case 1: ipConfAddress = *((u_long *) netsnmp_request_get_list_data(requests,DELAYED_INSTANCE_SET_NAME)); break; case 3: ipConfNetMask = *((u_long *) netsnmp_request_get_list_data(requests,DELAYED_INSTANCE_SET_NAME)); break; case 5: gateway = *((u_long *) netsnmp_request_get_list_data(requests,DELAYED_INSTANCE_SET_NAME)); break; default: break; } break; case MODE_SET_COMMIT: case MODE_SET_FREE: break; } } return SNMP_ERR_NOERROR; } Подскажите как создать таблицу из нескольких строк? Как определить индекс строки к которой обратились из вне? Как создавать и удалять строки в таблице? Буду благодарен за простой понятный для новичка код на С. Помогите пожалуйста... Изменено 2 июня, 2011 пользователем Oops Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
psL 0 9 сентября, 2011 Опубликовано 9 сентября, 2011 · Жалоба Есть такой вот документ: NetSNMP subagent development manual Относительно таблиц вроде бы понятно все изложено. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 12 сентября, 2011 Опубликовано 12 сентября, 2011 · Жалоба ..Относительно таблиц вроде бы понятно все изложено. подождали бы ещё 4 месяца... была бы круглая дата бы (круглый) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться