📄 snmp.c
字号:
/* +----------------------------------------------------------------------+ | PHP Version 4 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf <rasmus@php.net> | | Mike Jackson <mhjack@tscnet.com> | | Steven Lawrance <slawrance@technologist.com> | | Harrie Hazewinkel <harrie@lisanza.net> | | Johann Hanne <jonny@nurfuerspam.de> | +----------------------------------------------------------------------+*//* $Id: snmp.c,v 1.70.2.22.2.2 2007/01/01 09:46:47 sebastian Exp $ */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "php.h"#include "ext/standard/info.h"#include "php_snmp.h"#if HAVE_SNMP#include <sys/types.h>#ifdef PHP_WIN32#include <winsock.h>#include <errno.h>#include <process.h>#include "win32/time.h"#elif defined(NETWARE)#ifdef USE_WINSOCK/*#include <ws2nlm.h>*/#include <novsock2.h>#else#include <sys/socket.h>#endif#include <errno.h>/*#include <process.h>*/#ifdef NEW_LIBC#include <sys/timeval.h>#else#include "netware/time_nw.h"#endif#else#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#ifndef _OSD_POSIX#include <sys/errno.h>#else#include <errno.h> /* BS2000/OSD uses <errno.h>, not <sys/errno.h> */#endif#include <netdb.h>#endif#ifdef HAVE_UNISTD_H#include <unistd.h>#endif#ifndef __P#ifdef __GNUC__#define __P(args) args#else#define __P(args) ()#endif#endif#ifdef HAVE_NET_SNMP#include <net-snmp/net-snmp-config.h>#include <net-snmp/net-snmp-includes.h>#else#ifdef HAVE_DEFAULT_STORE_H#include "default_store.h"#endif#include "asn1.h"#include "snmp_api.h"#include "snmp_client.h"#include "snmp_impl.h"#include "snmp.h"#include "snmpv3.h"#include "keytools.h"#include "parse.h"#include "mib.h"#include "version.h"#include "transform_oids.h"#endif/* Ugly macro, since the length of OIDs in UCD-SNMP and NET-SNMP * is different and this way the code is not full of 'ifdef's. */#define OIDSIZE(p) (sizeof(p)/sizeof(oid))/* For really old ucd-snmp versions.. */#ifndef HAVE_SNMP_PARSE_OID#define snmp_parse_oid read_objid#endif/* ucd-snmp 3.3.1 changed the name of a few #defines... They've been changed back to the original ones in 3.5.3! */#ifndef SNMP_MSG_GET#define SNMP_MSG_GET GET_REQ_MSG#define SNMP_MSG_GETNEXT GETNEXT_REQ_MSG#endif#define SNMP_VALUE_LIBRARY 0#define SNMP_VALUE_PLAIN 1#define SNMP_VALUE_OBJECT 2ZEND_DECLARE_MODULE_GLOBALS(snmp)/* constant - can be shared among threads */static oid objid_mib[] = {1, 3, 6, 1, 2, 1};/* {{{ snmp_functions[] */function_entry snmp_functions[] = { PHP_FE(snmpget, NULL) PHP_FE(snmpwalk, NULL) PHP_FE(snmprealwalk, NULL) PHP_FALIAS(snmpwalkoid, snmprealwalk, NULL) PHP_FE(snmp_get_quick_print, NULL) PHP_FE(snmp_set_quick_print, NULL)#ifdef HAVE_NET_SNMP PHP_FE(snmp_set_enum_print, NULL) PHP_FE(snmp_set_oid_numeric_print, NULL)#endif PHP_FE(snmpset, NULL) PHP_FE(snmp2_get, NULL) PHP_FE(snmp2_walk, NULL) PHP_FE(snmp2_real_walk, NULL) PHP_FE(snmp2_set, NULL) PHP_FE(snmp3_get, NULL) PHP_FE(snmp3_walk, NULL) PHP_FE(snmp3_real_walk, NULL) PHP_FE(snmp3_set, NULL) PHP_FE(snmp_set_valueretrieval, NULL) PHP_FE(snmp_get_valueretrieval, NULL) {NULL,NULL,NULL}};/* }}} *//* {{{ snmp_module_entry */zend_module_entry snmp_module_entry = { STANDARD_MODULE_HEADER, "snmp", snmp_functions, PHP_MINIT(snmp), NULL, NULL, NULL, PHP_MINFO(snmp), NO_VERSION_YET, STANDARD_MODULE_PROPERTIES};/* }}} */#ifdef COMPILE_DL_SNMPZEND_GET_MODULE(snmp)#endif/* THREAD_LS snmp_module php_snmp_module; - may need one of these at some point *//* {{{ php_snmp_init_globals */static void php_snmp_init_globals(zend_snmp_globals *snmp_globals){ snmp_globals->valueretrieval = 0;}/* }}} *//* {{{ PHP_MINIT_FUNCTION */PHP_MINIT_FUNCTION(snmp){ init_snmp("snmpapp"); ZEND_INIT_MODULE_GLOBALS(snmp, php_snmp_init_globals, NULL); REGISTER_LONG_CONSTANT("SNMP_VALUE_LIBRARY", SNMP_VALUE_LIBRARY, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SNMP_VALUE_PLAIN", SNMP_VALUE_PLAIN, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SNMP_VALUE_OBJECT", SNMP_VALUE_OBJECT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SNMP_BIT_STR", ASN_BIT_STR, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SNMP_OCTET_STR", ASN_OCTET_STR, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SNMP_OPAQUE", ASN_OPAQUE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SNMP_NULL", ASN_NULL, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SNMP_OBJECT_ID", ASN_OBJECT_ID, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SNMP_IPADDRESS", ASN_IPADDRESS, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SNMP_COUNTER", ASN_GAUGE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SNMP_UNSIGNED", ASN_UNSIGNED, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SNMP_TIMETICKS", ASN_TIMETICKS, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SNMP_UINTEGER", ASN_UINTEGER, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SNMP_INTEGER", ASN_INTEGER, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SNMP_COUNTER64", ASN_COUNTER64, CONST_CS | CONST_PERSISTENT); return SUCCESS;}/* }}} *//* {{{ PHP_MINFO_FUNCTION */PHP_MINFO_FUNCTION(snmp){ php_info_print_table_start();#ifdef HAVE_NET_SNMP php_info_print_table_row(2, "NET-SNMP Support", "enabled"); php_info_print_table_row(2, "NET-SNMP Version", netsnmp_get_version());#else php_info_print_table_row(2, "UCD-SNMP Support", "enabled"); php_info_print_table_row(2, "UCD-SNMP Version", VersionInfo);#endif php_info_print_table_end();}/* }}} */static void php_snmp_getvalue(struct variable_list *vars, zval *snmpval TSRMLS_DC){ zval *val;#if I64CHARSZ > 2047 char buf[I64CHARSZ + 1];#else char buf[2048];#endif buf[0] = 0; if (SNMP_G(valueretrieval) == 0) {#ifdef HAVE_NET_SNMP snprint_value(buf, sizeof(buf), vars->name, vars->name_length, vars);#else sprint_value(buf,vars->name, vars->name_length, vars);#endif ZVAL_STRING(snmpval, buf, 1); return; } MAKE_STD_ZVAL(val); switch (vars->type) { case ASN_BIT_STR: /* 0x03, asn1.h */ ZVAL_STRINGL(val, vars->val.bitstring, vars->val_len, 1); break; case ASN_OCTET_STR: /* 0x04, asn1.h */ case ASN_OPAQUE: /* 0x44, snmp_impl.h */ ZVAL_STRINGL(val, vars->val.string, vars->val_len, 1); break; case ASN_NULL: /* 0x05, asn1.h */ ZVAL_NULL(val); break; case ASN_OBJECT_ID: /* 0x06, asn1.h */#ifdef HAVE_NET_SNMP snprint_objid(buf, sizeof(buf), vars->val.objid, vars->val_len / sizeof(oid));#else sprint_objid(buf, vars->val.objid, vars->val_len / sizeof(oid));#endif ZVAL_STRING(val, buf, 1); break; case ASN_IPADDRESS: /* 0x40, snmp_impl.h */ snprintf(buf, sizeof(buf)-1, "%d.%d.%d.%d", (vars->val.string)[0], (vars->val.string)[1], (vars->val.string)[2], (vars->val.string)[3]); buf[sizeof(buf)-1]=0; ZVAL_STRING(val, buf, 1); break; case ASN_COUNTER: /* 0x41, snmp_impl.h */ case ASN_GAUGE: /* 0x42, snmp_impl.h */ /* ASN_UNSIGNED is the same as ASN_GAUGE */ case ASN_TIMETICKS: /* 0x43, snmp_impl.h */ case ASN_UINTEGER: /* 0x47, snmp_impl.h */ snprintf(buf, sizeof(buf)-1, "%lu", *vars->val.integer); buf[sizeof(buf)-1]=0; ZVAL_STRING(val, buf, 1); break; case ASN_INTEGER: /* 0x02, asn1.h */ snprintf(buf, sizeof(buf)-1, "%ld", *vars->val.integer); buf[sizeof(buf)-1]=0; ZVAL_STRING(val, buf, 1); break; case ASN_COUNTER64: /* 0x46, snmp_impl.h */ printU64(buf, vars->val.counter64); ZVAL_STRING(val, buf, 1); break; default: ZVAL_STRING(val, "Unknown value type", 1); break; } if (SNMP_G(valueretrieval) == 1) { *snmpval = *val; zval_copy_ctor(snmpval); } else { object_init(snmpval); add_property_long(snmpval, "type", vars->type); add_property_zval(snmpval, "value", val); }}/* {{{ php_snmp_internal** Generic SNMP object fetcher (for all SNMP versions)** st=1 snmpget() - query an agent and return a single value.* st=2 snmpwalk() - walk the mib and return a single dimensional array * containing the values.* st=3 snmprealwalk() and snmpwalkoid() - walk the mib and return an * array of oid,value pairs.* st=5-8 ** Reserved *** st=11 snmpset() - query an agent and set a single value**/static void php_snmp_internal(INTERNAL_FUNCTION_PARAMETERS, int st, struct snmp_session *session, char *objid, char type, char* value) { struct snmp_session *ss; struct snmp_pdu *pdu=NULL, *response; struct variable_list *vars; oid name[MAX_NAME_LEN]; size_t name_length; oid root[MAX_NAME_LEN]; size_t rootlen = 0; int gotroot = 0; int status, count; char buf[2048]; char buf2[2048]; int keepwalking=1; char *err; zval *snmpval = NULL; if (st >= 2) { /* walk */ rootlen = MAX_NAME_LEN; if (strlen(objid)) { /* on a walk, an empty string means top of tree - no error */ if (snmp_parse_oid(objid, root, &rootlen)) { gotroot = 1; } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid object identifier: %s", objid); } } if (!gotroot) { memmove((char *) root, (char *) objid_mib, sizeof(objid_mib)); rootlen = sizeof(objid_mib) / sizeof(oid); gotroot = 1; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -