Author: ctian
Date: Mon Apr 2 14:11:13 2007
New Revision: 10
Modified:
trunk/classes.lisp
trunk/constants.lisp
Log:
* add +asn-counter32+ type
* add snmp-msg-get-list method to request more than one snmp var at once.
Modified: trunk/classes.lisp
==============================================================================
--- trunk/classes.lisp (original)
+++ trunk/classes.lisp Mon Apr 2 14:11:13 2007
@@ -40,38 +40,63 @@
(progn
(setf c-oids (foreign-alloc 'c-oid :count +max-oid-len+)
c-oid-len (foreign-alloc 'c-size-type :initial-element +max-oid-len+))
- (if (eq (elt name 0) #\.)
+ (if (and (> (length name) 0)
+ (eq (elt name 0) #\.))
(c-read-objid name c-oids c-oid-len)
(c-get-node name c-oids c-oid-len))
(setf length (mem-ref c-oid-len 'c-size-type)))))
(defmethod snmp-msg-get ((s snmp-session) (o oid))
+ (car (snmp-msg-get-list s (list o))))
+
+(defmethod snmp-msg-get ((s snmp-session) (o string))
+ (snmp-msg-get s (make-instance 'oid :name o)))
+
+(defmethod snmp-msg-get ((s string) (o string))
+ (snmp-msg-get (make-instance 'snmp-session :peername s) o))
+
+(defmethod snmp-msg-get-list ((s snmp-session) (oids list))
(let ((ss (c-snmp-open (slot-value s 'c-session)))
(pdu (c-snmp-pdu-create +snmp-msg-get+))
(response (foreign-alloc :pointer :initial-element (null-pointer)))
- value)
+ values)
(progn
- (c-snmp-add-null-var pdu
- (slot-value o 'c-oids)
- (mem-ref (slot-value o 'c-oid-len) 'c-size-type))
+ ;; 1. fill oids into request pdu
+ (dolist (o oids)
+ (let ((real-o (typecase o
+ (oid o)
+ (string (make-instance 'oid :name o))
+ (t (make-instance 'oid :name "")))))
+ (c-snmp-add-null-var pdu
+ (slot-value real-o 'c-oids)
+ (mem-ref (slot-value real-o 'c-oid-len) 'c-size-type))))
+ ;; 2. get results from response pdu
(let ((status (c-snmp-synch-response ss pdu response)))
- (if (and (= status +snmp-stat-success+)
- (= (foreign-slot-value (mem-aref response :pointer) 'c-snmp-pdu 'c-errstat)
- +snmp-err-noerror+))
- (let ((vars (foreign-slot-value (mem-aref response :pointer)
- 'c-snmp-pdu 'c-variables)))
- (if (= (foreign-slot-value vars 'c-variable-list 'c-type) +asn-octet-str+)
- (setf value (foreign-string-to-lisp
- (foreign-slot-value vars 'c-variable-list 'c-val)
- (foreign-slot-value vars 'c-variable-list 'c-val-len)))
- (setf value "(not a string, unsupport yet..)")))))
+ (setf values
+ (if (and (= status +snmp-stat-success+)
+ (= (foreign-slot-value (mem-aref response :pointer) 'c-snmp-pdu 'c-errstat)
+ +snmp-err-noerror+))
+ (loop for vars = (foreign-slot-value (mem-aref response :pointer)
+ 'c-snmp-pdu 'c-variables)
+ then (foreign-slot-value vars 'c-variable-list 'c-next-variable)
+ until (null-pointer-p vars)
+ collect (snmp-var->value vars)))))
(c-snmp-pdu-free (mem-aref response :pointer))
(c-snmp-close ss)
- value)))
-
-(defmethod snmp-msg-get ((s snmp-session) (o string))
- (snmp-msg-get s (make-instance 'oid :name o)))
+ values)))
-(defmethod snmp-msg-get ((s string) (o string))
- (snmp-msg-get (make-instance 'snmp-session :peername s) o))
+(defmethod snmp-msg-get-list ((s string) (oids list))
+ (snmp-msg-get-list (make-instance 'snmp-session :peername s) oids))
+(defmacro snmp-var->value (var)
+ (let ((v (gensym)))
+ `(let ((,v ,var))
+ (case (foreign-slot-value ,v 'c-variable-list 'c-type)
+ (,+asn-octet-str+
+ (foreign-string-to-lisp
+ (foreign-slot-value ,v 'c-variable-list 'c-val)
+ (foreign-slot-value ,v 'c-variable-list 'c-val-len)))
+ (,+asn-counter32+
+ (mem-ref (foreign-slot-value ,v 'c-variable-list 'c-val)
+ :uint32))
+ (otherwise :others)))))
Modified: trunk/constants.lisp
==============================================================================
--- trunk/constants.lisp (original)
+++ trunk/constants.lisp Mon Apr 2 14:11:13 2007
@@ -16,6 +16,7 @@
(defconstant +asn-object-id+ #x06)
(defconstant +asn-sequence+ #x10)
(defconstant +asn-set+ #x11)
+(defconstant +asn-counter32+ #x41)
(defconstant +asn-universal+ #b00000000)
(defconstant +asn-application+ #b01000000)