Update of /project/snmp1/cvsroot/snmp1
In directory clnet:/tmp/cvs-serv8719
Modified Files:
ber.lisp snmp.lisp snmp1.asd tests.lisp
Added Files:
common-mib.dat
Log Message:
Added dependency to split-string
Added symbolic mib translations. Included mib data for the common mibs
There is a change to top level interface. Some functions return the
translated names. Started using triples of oid, type, value to
rebresent varbinds.
--- /project/snmp1/cvsroot/snmp1/ber.lisp 2007/01/02 23:49:58 1.1
+++ /project/snmp1/cvsroot/snmp1/ber.lisp 2007/01/20 15:55:08 1.2
@@ -19,18 +19,10 @@
(in-package "SNMP1")
(defun oid-string-to-oid (oid-string)
- "Convert string in form .1.3.5.6.7.333.233 to oid"
- (let ((from 0)
- to
- (result (make-array 0 :fill-pointer 0)))
- (loop for x across oid-string
- while from
- do
- (setf to (position #\. oid-string :start (1+ from)))
- #|(display from to (subseq oid-string from to))|#
- (vector-push-extend (read-from-string (remove #\. (subseq oid-string from to))) result)
- (setf from to)
- )
+ "Convert string in form .1.3.5.6.7.333.233 to oid #(1 3 5 6 7 333 233)"
+ (let ((result (make-array 0 :fill-pointer 0)))
+ (loop for subidentifier in (split-sequence:split-sequence #\. oid-string :remove-empty-subseqs t)
+ do (vector-push-extend (read-from-string subidentifier) result))
result))
(defun oid-to-oid-string (oid)
@@ -296,12 +288,9 @@
(push (reverse container) result)))
((integer-type-p tag) (push (list tag (ber-decode-integer-value buffer start-value end-value)) result))
((octet-string-type-p tag)
- (push (list tag
- ;; return octet array if impossible to convert to string
- (handler-case (octets-to-string #1=(subseq buffer start-value end-value))
- (t () #1#))) result))
+ (push (list tag (subseq buffer start-value end-value)) result))
((object-identifier-type-p tag)
- (push (list tag (oid-to-oid-string (ber-decode-object-identifier-value buffer start-value end-value))) result))
+ (push (list tag (ber-decode-object-identifier-value buffer start-value end-value)) result))
)
(setf start end-value)
while (< start input-end))
--- /project/snmp1/cvsroot/snmp1/snmp.lisp 2007/01/02 23:49:58 1.1
+++ /project/snmp1/cvsroot/snmp1/snmp.lisp 2007/01/20 15:55:08 1.2
@@ -18,6 +18,111 @@
|#
(in-package "SNMP1")
+(defparameter *community* "public")
+(defparameter *agent-ip* #(127 0 0 1))
+(defparameter *agent-port* 161)
+(defparameter *wait* 1)
+(defparameter *retries* 3)
+
+(defun ip-string-to-ip-octets (dotted-quad)
+ (let ((list (split-sequence:split-sequence #\. dotted-quad))
+ (vector (make-array 4)))
+ (loop for n from 0 for component in list do (setf (aref vector n) (parse-integer component)))
+ vector))
+
+(defun ip-string-to-numeric (dotted-quad)
+ (let ((octets (ip-string-to-ip-octets dotted-quad))
+ (ip-numeric 0))
+ (loop for octet across octets do
+ (setf ip-numeric (+ (* ip-numeric 256) octet)))
+ ip-numeric))
+
+(defun ip-numeric-to-ip-octets (ip-numeric)
+ (apply #'vector (reverse (loop for x from 1 to 4
+ collect (ldb (byte 8 0) ip-numeric)
+ do (setf ip-numeric (truncate ip-numeric 256))))))
+
+(defun ip-octets-to-ip-string (ip-octets)
+ (format nil "~{~d.~d.~d.~d~}" (loop for o across ip-octets collect o)))
+
+(defun ip-numeric (ip-some-form)
+ (typecase ip-some-form
+ (simple-vector (ip-string-to-numeric (ip-octets-to-ip-string ip-some-form)))
+ (string (ip-string-to-numeric ip-some-form))
+ (otherwise ip-some-form)))
+
+(defun ip-octets (ip-some-form)
+ (typecase ip-some-form
+ (integer (ip-numeric-to-ip-octets ip-some-form))
+ (string (ip-string-to-ip-octets ip-some-form))
+ (otherwise ip-some-form)))
+
+(defun ip-string (ip-some-form)
+ (typecase ip-some-form
+ (simple-vector (ip-octets-to-ip-string ip-some-form))
+ (integer (ip-octets-to-ip-string (ip-numeric-to-ip-octets ip-some-form)))
+ (otherwise ip-some-form)))
+
+
+;; (defun oid-less (a-in b-in)
+;; (cond ((null a-in) nil)
+;; ((null b-in) t)
+;; (t (loop for a-sub across (oid-string-to-oid a-in)
+;; for b-sub across (oid-string-to-oid b-in)
+;; when (not (= a-sub b-sub)) do (return-from oid-less (< a-sub b-sub)))))
+;; )
+
+
+
+(defun pdu-from-message (decoded-message)
+ (fourth decoded-message))
+
+(defun value-from-encoding (encoding)
+ (second encoding))
+
+(defun request-id (decoded-message)
+ (value-from-encoding (second (pdu-from-message decoded-message))))
+
+;; (defun nreplace-request-id (new-value decoded-message)
+;; ;;(888 copied-tree)
+;; (let ((interesting-cons (last (second (pdu-from-message decoded-message)))))
+;; (rplaca interesting-cons new-value)
+;; decoded-message)
+;; )
+
+(defun varbind-list% (decoded-pdu)
+ (fifth decoded-pdu))
+
+(defun varbind-list (message)
+ (varbind-list% (pdu-from-message message)))
+
+;; (defun oid-and-value (varbind)
+;; (let ((oid-encoding (second varbind))
+;; (value-encoding (third varbind)))
+;; (list (value-from-encoding oid-encoding) (value-from-encoding value-encoding))))
+
+(defun compose-varbind-list (oids)
+ "Create a varbind-list suitable for ber-encode from a list of oids
+ignore eny null oids"
+ (let ((vars (loop for oid in (remove nil oids) collect `(:sequence (:object-identifier ,oid) (:null)))))
+ (push :sequence vars)))
+
+(defun varbind-to-triple (varbind)
+ (let ((requested-oid (second (second varbind)))
+ (tag (first (third varbind)))
+ (value (second (third varbind))))
+ (list requested-oid tag value)))
+
+(defun triples-from-decoded-message (decoded-message)
+ (let ((varbind-list (varbind-list decoded-message)))
+ (loop for pair in (cdr varbind-list) collect (varbind-to-triple pair))))
+
+;; (defun oids-and-values-from-message (message)
+;; (let ((varbind-list (varbind-list message)))
+;; ;;(mapcar #'oid-and-value varbinds)
+;; (loop for pair in (cdr varbind-list) collect (oid-and-value pair) )
+;; ))
+
(defun udp-send-and-receive (host port timeout repetitions message)
"send one pqcket and receive one packet"
(let ((socket (make-instance 'sb-bsd-sockets:inet-socket :protocol :udp :type :datagram))
@@ -41,72 +146,210 @@
))
-(defun snmpgetnext (ip community oid)
- (let* ((seq (random 1000))
- (pdu `(:getnext (:integer ,seq)
- (:integer 0)
- (:integer 0)
- (:sequence
- (:sequence (:object-identifier ,oid) (:null)))))
- (req `(:sequence (:integer 0) ; version 1
- (:octet-string ,community)
- ,pdu))
- (request-buffer (ber-encode req))
- (response-buffer (udp-send-and-receive
- ip
- 161
- 1
- 3
- request-buffer)))
- ;;(display response-buffer)
- (let* ((response (ber-decode response-buffer 0 (length response-buffer)))
- (varbinds (fifth (fourth response)))
- (varbind (second varbinds)))
- ;;(display response)
- ;;(display varbinds)
- ;;(display varbind)
- (values (second varbind) (third varbind)))
+(defun snmp-get-many- (oids &optional (request-id (random 1000)))
+ "Constructs the get pdu, inserts a random request-id if none is
+spplied, checks the request-id, decodes the answer"
+ (let* ((*agent-ip* (if (stringp *agent-ip* )(ip-string-to-ip-octets *agent-ip*) *agent-ip*))
+ (varbind-list (compose-varbind-list oids))
+ (un-encoded-message `(:sequence (:integer 0) ; version 1
+ (:octet-string ,*community*)
+ (:get (:integer ,request-id)
+ (:integer 0)
+ (:integer 0)
+ ,varbind-list)))
+
+ (response-buffer (udp-send-and-receive
+ *agent-ip*
+ *agent-port*
+ *wait*
+ *retries*
+ (ber-encode un-encoded-message)))
+ (decoded-message (ber-decode response-buffer 0 (length response-buffer))))
+ ;;(print un-encoded-message netelements::*stdout*)
+ (when (eql request-id (request-id decoded-message))
+ (triples-from-decoded-message decoded-message))))
+(defun oid-basic-form (oid)
+ "Convert an oid in diverse symbolic forms, string or already basic form
+to the basic form, which is an array"
+ (cond
+ ;; ".2.3.4.5.4.5"
+ ((and (stringp oid) (every #'(lambda (char) (or (digit-char-p char) (char= #\. char))) oid))
+ (oid-string-to-oid oid))
+ ;; "sysObjectID"
+ ((and (stringp oid) (not (position #\. oid)))
+ (oid-from-trailing-subidentifier oid))
+ ;; "sysObjectID.0"
+ ((and (stringp oid) (= (count #\. oid) 1))
+ (let ((point-pos (position #\. oid)))
+ (let* ((symbolic-part (subseq oid 0 point-pos))
+ (trailing-digits (subseq oid (1+ point-pos)))
+ (symbolic-part-oid (oid-from-trailing-subidentifier symbolic-part)))
+ ;; if tests dont succed, resturn nil
+ (when (and symbolic-part-oid (every #'digit-char-p trailing-digits))
+ (scalar symbolic-part-oid (parse-integer trailing-digits))))))
+ ((stringp oid)
+ (let* ((last-dot (position #\. oid :from-end t))
+ (partial-oid (subseq oid 0 last-dot))
+ (trailing-digits (subseq oid (1+ last-dot))))
+ (if (every #'digit-char-p trailing-digits)
+ ;;".iso.org.dod.internet.mgmt.mib-2.system.sysObjectID.0"
+ (let ((translated-part (oid-from-symbolic-oid partial-oid)))
+ ;; return 0 if oid not found in hash
+ (when translated-part
+ (scalar translated-part (parse-integer trailing-digits))))
+ ;;".iso.org.dod.internet.mgmt.mib-2.system.sysObjectID"
+ (oid-from-symbolic-oid oid))))
+ ;;#(1 2 3)
+ (t oid)))
+
+(defun snmp-get- (oid)
+ (let ((triple-list (snmp-get-many- (list (oid-basic-form oid)))))
+ (first triple-list)))
+
+
+
+
+
+
+
+;; (defun snmp-getnext (ip community oid)
+;; (let* ((seq (random 1000))
+;; (pdu `(:getnext (:integer ,seq)
+;; (:integer 0)
+;; (:integer 0)
+;; (:sequence
+;; (:sequence (:object-identifier ,oid) (:null)))))
+;; (req `(:sequence (:integer 0) ; version 1
+;; (:octet-string ,community)
+;; ,pdu))
+;; (request-buffer (ber-encode req))
+;; (response-buffer (udp-send-and-receive
+;; ip
+;; 161
+;; 1
+;; 3
+;; request-buffer)))
+;; ;;(display response-buffer)
+;; (let* ((response (ber-decode response-buffer 0 (length response-buffer)))
+;; (varbinds (fifth (fourth response)))
+;; (varbind (second varbinds)))
+;; ;;(display response)
+;; ;;(display varbinds)
+;; ;;(display varbind)
+;; (values (second varbind) (third varbind)))
- ))
+;; ))
+
+;; (defun snmp-getnext2 (ip community oid)
+;; (let ((response-buffer (udp-send-and-receive
+;; ip
+;; 161
+;; 1
+;; 3
+;; (ber-encode `(:sequence (:integer 0) ; version 1
+;; (:octet-string ,community)
+;; (:getnext (:integer 12345)
+;; (:integer 0)
+;; (:integer 0)
+;; (:sequence (:sequence (:object-identifier ,oid) (:null)))))))))
+;; (ber-decode response-buffer 0 (length response-buffer))))
+
+
+;; (defun snmp-walk (ip community &optional (start-oid #(0 0)) )
+;; (let ((next-oid start-oid)
+;; response-oid
+;; value)
+;; (loop
+;; while next-oid
+;; do
+;; (multiple-value-setq (response-oid value) (snmp-getnext ip community next-oid))
+;; until (equal next-oid (second response-oid))
+;; do
+;; (setf next-oid (second response-oid))
+;; (format t "~s ~s~%" response-oid value))))
+
+
+
+;; (defun triple-to-varbind (triple)
+;; (if (third triple)
+;; `(:sequence (:object-identifier ,(first triple))
+;; (,(second triple) ,(third triple)))
+;; ;; f.ex (#(1 2 3 4 5) :null nil)
+;; `(:sequence (:object-identifier ,(first triple))
+;; (,(second triple)))))
+
+
+(defun translate-triple (triple)
+ (let ((translated-oid (symbolic-oid-from-oid (first triple)))
+ (tag (second triple))
+ (value (third triple)))
+ (cond ((object-identifier-type-p tag)
+ (list translated-oid tag (symbolic-oid-from-oid value)))
+ ((octet-string-type-p tag)
+ (let ((translated-value
+ (handler-case (octets-to-string value)
+ (t () value))))
+ (list translated-oid tag translated-value)))
+ ((integer-type-p tag)
+ (let ((maybe-translated-value value)
+ (enum-alist (gethash (first triple) *mib-enums*)))
+ (unless enum-alist
+ (setf enum-alist (gethash
+ (subseq (first triple) 0 (- (length (first triple)) 1))
+ *mib-enums*)))
+ (when enum-alist
+ (setf maybe-translated-value (cdr (assoc value enum-alist))))
+ (list translated-oid tag maybe-translated-value))
+ )
+ (t (list translated-oid tag value)))))
+
+
+(defun snmp-get-many (oid-list)
+ (let ((triple-list (snmp-get-many- (mapcar #'oid-basic-form oid-list))))
+ (loop for triple in triple-list collect (translate-triple triple))))
+
+(defun snmp-get-many-safe- (oid-list identifying-oid in-identifier)
+ (let ((result+identifier (snmp-get-many- (mapcar #'oid-basic-form (cons identifying-oid oid-list)))))
+ (let* ((read-identifier-triple (translate-triple (first result+identifier)))
+ (result (rest result+identifier)))
+ (when (equal (third read-identifier-triple) in-identifier)
+ result))))
+
+(defun snmp-get-many-safe (oid-list identifying-oid in-identifier)
+ (let ((result+identifier (snmp-get-many- (mapcar #'oid-basic-form (cons identifying-oid oid-list)))))
+ (let ((read-identifier-triple (translate-triple (first result+identifier)))
+ (result (rest result+identifier)))
+ (when (equal (third read-identifier-triple) in-identifier)
+ (mapcar #'translate-triple result)))))
+
+
+(defun snmp-get (oid)
+ "Returns a single value from the agent
+It is presented in its most decoded form,
+string-form of oid, string form of octet string, and symbolic
+value in case of enumeration
+The parameter is an oid in array form, dotted-numeric-form, symbolic form
+or a trailing subidentifier"
+ (let ((triple (snmp-get- oid)))
+ (translate-triple triple)))
+
+
+
+
+;; (defun snmp-get-% (ip community oid)
+;; ""
+;; (let ((response-buffer (udp-send-and-receive
+;; ip
+;; 161
+;; 1
+;; 3
+;; (ber-encode `(:sequence (:integer 0) ; version 1
+;; (:octet-string ,community)
+;; (:get (:integer 12345)
+;; (:integer 0)
+;; (:integer 0)
+;; (:sequence (:sequence (:object-identifier ,oid) (:null)))))))))
+;; (ber-decode response-buffer 0 (length response-buffer))))
-(defun snmpwalk (ip community &optional (start-oid #(0 0)) )
- (let ((next-oid start-oid)
- response-oid
- value)
- (loop
- while next-oid
- do
- (multiple-value-setq (response-oid value) (snmpgetnext ip community next-oid))
- until (equal next-oid (second response-oid))
- do
- (setf next-oid (second response-oid))
- (format t "~s ~s~%" response-oid value))))
-(defun snmpget (ip community oid)
- (let ((response-buffer (udp-send-and-receive
- ip
- 161
- 1
- 3
- (ber-encode `(:sequence (:integer 0) ; version 1
- (:octet-string ,community)
- (:get (:integer 12345)
- (:integer 0)
- (:integer 0)
- (:sequence (:sequence (:object-identifier ,oid) (:null)))))))))
- (ber-decode response-buffer 0 (length response-buffer))))
-
-(defun snmpgetnext2 (ip community oid)
- (let ((response-buffer (udp-send-and-receive
- ip
- 161
- 1
- 3
- (ber-encode `(:sequence (:integer 0) ; version 1
- (:octet-string ,community)
- (:getnext (:integer 12345)
- (:integer 0)
- (:integer 0)
- (:sequence (:sequence (:object-identifier ,oid) (:null)))))))))
- (ber-decode response-buffer 0 (length response-buffer))))
--- /project/snmp1/cvsroot/snmp1/snmp1.asd 2007/01/03 01:32:05 1.2
+++ /project/snmp1/cvsroot/snmp1/snmp1.asd 2007/01/20 15:55:08 1.3
@@ -18,6 +18,7 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|#
+;; (asdf:operate 'asdf:load-op :split-sequence)
;; (asdf:operate 'asdf:load-op :snmp1)
(require 'sb-bsd-sockets)
(defsystem :snmp1
@@ -28,6 +29,8 @@
:components ((:file "package")
(:file "display")
(:file "ber")
- (:file "snmp")))
+ (:file "mib")
+ (:file "snmp"))
+ :depends-on ("split-sequence"))
--- /project/snmp1/cvsroot/snmp1/tests.lisp 2007/01/02 23:49:58 1.1
+++ /project/snmp1/cvsroot/snmp1/tests.lisp 2007/01/20 15:55:08 1.2
@@ -19,6 +19,15 @@
(in-package "SNMP1")
+(defparameter *example-decoded-response*
+ '(:SEQUENCE (:INTEGER 0) (:OCTET-STRING "public")
+ (:RESPONSE (:INTEGER 12345) (:INTEGER 0) (:INTEGER 0)
+ (:SEQUENCE
+ (:SEQUENCE (:OBJECT-IDENTIFIER ".1.3.6.1.2.1.1.2.0")
+ (:OBJECT-IDENTIFIER ".1.3.6.1.4.1.8072.3.2.10")))))
+ "Used in tests")
+
+
(defun make-buffer ()
(make-array 300 :element-type '(unsigned-byte 8):fill-pointer 0))
@@ -26,10 +35,6 @@
(:method ((a vector) (b vector))
(and (= (length a) (length b)) (every #'= a b))))
-(defun beiv (xx)
- (let ((buffer (make-buffer)))
- (ber-encode-integer-value xx buffer)))
-
(defun test-01 ()
(format t "obs long value~%")
(let ((buffer (make-buffer))
@@ -89,12 +94,6 @@
#(1 3 6 3255))))
-(defun test-10 ()
- (== #(1 3 5 6 7 333 233) (oid-string-to-oid ".1.3.5.6.7.333.233")))
-
-(defun test-11 ()
- (equal ".1.3.5.6.7.333.233" (oid-to-oid-string #(1 3 5 6 7 333 233))))
-
(defun test-12 ()
(let ((buffer #(5 0)))
@@ -181,19 +180,19 @@
(display (subseq buffer 29 53))
(ber-decode buffer 0 (length buffer))))
-(defun test-snmpgetnext ()
- (snmpgetnext #(127 0 0 1) "public" #(0 0)))
+;;(defun test-snmpgetnext ()
+;; (snmpgetnext #(127 0 0 1) "public" #(0 0)))
-(defun test-snmpgetnext2 ()
- (snmpgetnext2 #(127 0 0 1) "public" #(0 0)))
+;;(defun test-snmpgetnext2 ()
+;; (snmpgetnext2 #(127 0 0 1) "public" #(0 0)))
-(defun test-snmpwalk ()
- (snmpwalk #(127 0 0 1) "public"))
+;;(defun test-snmpwalk ()
+;; (snmpwalk #(127 0 0 1) "public"))
-(defun test-snmpget ()
- (let ((r1 (snmpget #(127 0 0 1) "public" ".1.3.6.1.2.1.1.2.0"))
- (r2 (snmpget #(127 0 0 1) "public" ".1.3.6.1.2.1.1.5.0")))
- (display r1 r2)))
+;;(defun test-snmpget ()
+;; (let ((r1 (snmpget #(127 0 0 1) "public" ".1.3.6.1.2.1.1.2.0"))
+;; (r2 (snmpget #(127 0 0 1) "public" ".1.3.6.1.2.1.1.5.0")))
+;; (display r1 r2)))
(defun expose-bit-7 (octets)
@@ -202,37 +201,169 @@
octets))
-(lambda (sym-a sym-b)
- (let* ((a (symbol-name sym-a))
- (b (symbol-name sym-b))
- (numeric-a (parse-integer a :start 5 :junk-allowed t))
- (numeric-b (parse-integer b :start 5 :junk-allowed t)))
- (cond ((and numeric-a numeric-b)
- (< numeric-a numeric-b))
- ((and (not numeric-a) (not numeric-b))
- (string< a b))
- ((identity a) t)
- (t nil)
- )))
-
-
-(defun compute-sort-key (sym)
- (let ((number (parse-integer (symbol-name sym) :start 5 :junk-allowed t)))
- (format nil "~5d~a" (if number number 99999) (symbol-name sym))))
+(defun test-30-pdu-from-message ()
+ (tree-equal (pdu-from-message *example-decoded-response*)
+ '(:RESPONSE (:INTEGER 12345) (:INTEGER 0) (:INTEGER 0)
+ (:SEQUENCE
+ (:SEQUENCE (:OBJECT-IDENTIFIER ".1.3.6.1.2.1.1.2.0")
+ (:OBJECT-IDENTIFIER ".1.3.6.1.4.1.8072.3.2.10"))))
+ :test #'equal))
+
+(defun test-31-value-from-encoding ()
+ (and (eql 9 (value-from-encoding '(:integer 9)))
+ (equal ".1.3.6.1.4.1.8072.3.2.10"
+ (value-from-encoding '(:OBJECT-IDENTIFIER ".1.3.6.1.4.1.8072.3.2.10")))))
+
+
+(defun test-32-request-id ()
+ (let ((copied-tree (copy-tree *example-decoded-response*))
+ (expected '(:SEQUENCE (:INTEGER 0) (:OCTET-STRING "public")
+ (:RESPONSE (:INTEGER 888) (:INTEGER 0) (:INTEGER 0)
+ (:SEQUENCE
+ (:SEQUENCE (:OBJECT-IDENTIFIER ".1.3.6.1.2.1.1.2.0")
+ (:OBJECT-IDENTIFIER ".1.3.6.1.4.1.8072.3.2.10")))))))
+ (and (eql 12345 (request-id *example-decoded-response*))
+ (tree-equal expected (nreplace-request-id 888 copied-tree) :test #'equal))))
+
+(defun test-40-oid-conversions ()
+ (and (equalp #(1 3 5 6 7 333 233) (oid-string-to-oid ".1.3.5.6.7.333.233"))
+ (equal ".1.3.5.6.7.333.233" (oid-to-oid-string #(1 3 5 6 7 333 233)))
+ (equalp #(2 3 4) (oid-basic-form ".2.3.4"))
+ (equalp #(2 3 4) (oid-basic-form #(2 3 4)))
+ (equalp #(1 3 6 1 2 1 1 2) (oid-basic-form ".iso.org.dod.internet.mgmt.mib-2.system.sysObjectID"))
+ (equalp #(1 3 6 1 2 1 1 2) (oid-basic-form "sysObjectID"))
+ (equalp #(1 3 6 1 2 1 1 2 0) (oid-basic-form ".iso.org.dod.internet.mgmt.mib-2.system.sysObjectID.0"))
+ (equalp #(1 3 6 1 2 1 1 2 0) (oid-basic-form "sysObjectID.0"))
+ (equal ".iso.org.dod.internet.mgmt.mib-2.system.sysObjectID"
+ (symbolic-oid-from-oid #(1 3 6 1 2 1 1 2)))
+ (equal ".iso.org.dod.internet.mgmt.mib-2.system.sysObjectID.0"
+ (symbolic-oid-from-oid #(1 3 6 1 2 1 1 2 0)))
+ (equal ".iso.org.dod.internet.mgmt.mib-2.system.77.0"
+ (symbolic-oid-from-oid #(1 3 6 1 2 1 1 77 0)))
+ (equal ".77.6.1.2.1.1.2.0" (symbolic-oid-from-oid #(2 77 6 1 2 1 1 2 0)))
+ (equal ".iso.2.3.4.5" (symbolic-oid-from-oid #(1 2 3 4 5)))))
+
+
+
+
+
+
+;; (defun test-60-snmpget ()
+;; (and )
+;; (snmp-get ".1.3.6.1.2.1.1.2.0"))
+
+
+
+(defun test-33-varbind-list ()
+ (let ((pdu (pdu-from-message *example-decoded-response*))
+ (expected '(:SEQUENCE
+ (:SEQUENCE (:OBJECT-IDENTIFIER ".1.3.6.1.2.1.1.2.0")
+ (:OBJECT-IDENTIFIER ".1.3.6.1.4.1.8072.3.2.10")))))
+ (and (tree-equal expected (varbind-list% pdu) :test #'equal)
+ (tree-equal expected (varbind-list *example-decoded-response*) :test #'equal))))
+
+
+(defun test-100-mib-grep ()
+ (equal ".iso.org.dod.internet.mgmt.mib-2.ianaifType"
+ (mib-grep "ianaifType")))
+
+(defun test-101-mib-grep-hashed ()
+ (let ((expected '(".iso.org.dod.internet.mgmt.mib-2.ianaifType"
+ ".iso.org.dod.internet.mgmt.mib-2.interfaces.ifTable.ifEntry.ifType")))
+ (and (equal expected (mib-grep-hashed "ifType"))
+ (equal expected (mib-grep-hashed "ifType")))))
+
+(defun test-102-scalar ()
+ (and (equalp #(1 2 3 4 5 6 0) (scalar #(1 2 3 4 5 6)))
+ (equalp #(1 2 3 4 5 6 77) (scalar #(1 2 3 4 5 6) 77))))
+
+
+(defun test-103-subidentifiers ()
+ (and (equalp #("a" "b" "c") (subidentifiers ".a.b.c"))
+ (equalp #("a" "b" "c") (subidentifiers "a.b.c"))
+ (equalp #("a" 5 "c" 7) (subidentifiers ".a.5.c.7"))
+ (equalp #("a" 5 "c" 7) (subidentifiers "a.5.c.7"))))
+
+(defun test-104-triple ()
+ (and
+ (equalp '(#(1 2 3) :integer 66)
+ (varbind-to-triple '(:sequence ( :object-identifier #(1 2 3)) (:integer 66))))
+ (equalp '(#(3 4 5) :octet-string #(6 7 8))
+ (varbind-to-triple '(:sequence (:object-identifier #(3 4 5)) (:octet-string #(6 7 8)))))
+ (equalp '(#(3 4 5) :null nil )
+ (varbind-to-triple '(:sequence (:object-identifier #(3 4 5)) (:null))))
+ (equalp '(#(3 4 5) nil nil )
+ (varbind-to-triple '(:sequence (:object-identifier #(3 4 5)))))
+ (equalp '(:sequence (:object-identifier #(3 4 5)) (:octet-string #(6 7 8)))
+ (triple-to-varbind '(#(3 4 5) :octet-string #(6 7 8))))
+ (equalp '(:sequence (:object-identifier #(3 4 5)) (:null))
+ (triple-to-varbind '(#(3 4 5) :null nil )))))
+
+
+(defun test-250-snmp-get-many- ()
+ (let ((expected '((#(1 3 6 1 2 1 1 9 1 2 2) :object-identifier #(1 3 6 1 6 3 1))
+ (#(1 3 6 1 2 1 1 9 1 2 6) :object-identifier #(1 3 6 1 6 3 16 2 2 1)))))
+ (equalp expected
+ (snmp-get-many- '(#(1 3 6 1 2 1 1 9 1 2 2)
+ #( 1 3 6 1 2 1 1 9 1 2 6))
+ 12345))))
+
+(defun test-350-snmp-get- ()
+ (and (equalp '(#(1 3 6 1 2 1 1 9 1 2 3):object-identifier #(1 3 6 1 2 1 49))
+ (snmp-get- #(1 3 6 1 2 1 1 9 1 2 3)))
+ (equalp '(#(1 3 6 1 2 1 1 9 1 2 6) :object-identifier #(1 3 6 1 6 3 16 2 2 1))
+ (snmp-get- #(1 3 6 1 2 1 1 9 1 2 6)))
+ ))
+
+(defun test-450-snmp-get ()
+ (and (equalp '(".iso.org.dod.internet.mgmt.mib-2.system.sysORTable.sysOREntry.sysORID.2"
+ :OBJECT-IDENTIFIER
+ ".iso.org.dod.internet.snmpV2.snmpModules.snmpMIB")
+ (snmp-get
+ ".iso.org.dod.internet.mgmt.mib-2.system.sysORTable.sysOREntry.sysORID.2"))
+ (equalp '(".iso.org.dod.internet.mgmt.mib-2.system.sysORTable.sysOREntry.sysORID.6"
+ :OBJECT-IDENTIFIER
+ ".iso.org.dod.internet.snmpV2.snmpModules.snmpVacmMIB.vacmMIBConformance.vacmMIBGroups.vacmBasicGroup")
+ (snmp-get ".1.3.6.1.2.1.1.9.1.2.6"))))
+
+(defun test-451-get-wrong-oid ()
+ ;; shuould not crash randomly. The oid will be nil here
+ (null (snmp-get "sysObjectOD.0")))
+
+
+
+(defun compute-sort-keys (sym)
+ (let ((name (symbol-name sym)))
+ (multiple-value-bind (int eaten) (parse-integer (subseq name 5) :junk-allowed t)
+ (let ((alfa (subseq name (+ 5 eaten))))
+ (values int alfa)))))
+
+
+
+(defun test-symbol-less (sym-a sym-b)
+ (multiple-value-bind (int-a alf-a) (compute-sort-keys sym-a)
+ (multiple-value-bind (int-b alf-b) (compute-sort-keys sym-b)
+ (if (eql int-a int-b)
+ (string< alf-a alf-b)
+ (< int-a int-b)))))
(defun run-tests ()
;; All symbols in this package beginning with test and which is a function
- (let (test-funcs)
+ (let (test-funcs
+ (totres t))
(loop for s being each present-symbol do
- (let ((res (search "TEST-" (symbol-name s))))
- (when (and res (= 0 res) (parse-integer (symbol-name s) :start 5 :junk-allowed t) (fboundp s))
- (push s test-funcs))))
-
- (setf test-funcs (sort test-funcs #'string<
- :key #'compute-sort-key))
+ (let ((res (search "TEST-" (symbol-name s))))
+ (when (and res (= 0 res)
+ (parse-integer (symbol-name s) :start 5 :junk-allowed t)
+ (fboundp s))
+ (push s test-funcs))))
+
+ (setf test-funcs (sort test-funcs #'test-symbol-less))
(loop for sym in test-funcs do
- (let ((res (funcall sym)))
- (format t "~a: ~a~%" sym (if res "PASSED" "FAILED")))
- )
- )
-)
\ No newline at end of file
+ (let ((res (funcall sym)))
+ (format t "~a: ~a~%" sym (if res "PASSED" "FAILED"))
+ (unless res (setf totres nil))))
+ totres))
+
+(define-symbol-macro tt (run-tests))
+
--- /project/snmp1/cvsroot/snmp1/common-mib.dat 2007/01/20 15:55:08 NONE
+++ /project/snmp1/cvsroot/snmp1/common-mib.dat 2007/01/20 15:55:08 1.1
+--iso(1)
|
+--org(3)
|
+--dod(6)
|
+--internet(1)
|
+--directory(1)
|
+--mgmt(2)
| |
| +--mib-2(1)
| |
| +--system(1)
| | |
| | +-- -R-- String sysDescr(1)
| | | Textual Convention: DisplayString
| | | Size: 0..255
| | +-- -R-- ObjID sysObjectID(2)
| | +-- -R-- TimeTicks sysUpTime(3)
| | +-- -RW- String sysContact(4)
| | | Textual Convention: DisplayString
| | | Size: 0..255
| | +-- -RW- String sysName(5)
| | | Textual Convention: DisplayString
| | | Size: 0..255
| | +-- -RW- String sysLocation(6)
| | | Textual Convention: DisplayString
| | | Size: 0..255
| | +-- -R-- INTEGER sysServices(7)
| | | Range: 0..127
| | +-- -R-- TimeTicks sysORLastChange(8)
| | | Textual Convention: TimeStamp
| | |
| | +--sysORTable(9)
| | |
| | +--sysOREntry(1)
| | | Index: sysORIndex
| | |
| | +-- ---- INTEGER sysORIndex(1)
| | | Range: 1..2147483647
| | +-- -R-- ObjID sysORID(2)
| | +-- -R-- String sysORDescr(3)
| | | Textual Convention: DisplayString
| | | Size: 0..255
| | +-- -R-- TimeTicks sysORUpTime(4)
| | Textual Convention: TimeStamp
| |
| +--interfaces(2)
| | |
| | +-- -R-- INTEGER ifNumber(1)
| | |
| | +--ifTable(2)
| | |
| | +--ifEntry(1)
| | | Index: ifIndex
| | |
| | +-- -R-- INTEGER ifIndex(1)
| | +-- -R-- String ifDescr(2)
| | | Textual Convention: DisplayString
| | | Size: 0..255
| | +-- -R-- EnumVal ifType(3)
| | | Values: other(1), regular1822(2), hdh1822(3), ddn-x25(4), rfc877-x25(5), ethernet-csmacd(6), iso88023-csmacd(7), iso88024-tokenBus(8), iso88025-tokenRing(9), iso88026-man(10), starLan(11), proteon-10Mbit(12), proteon-80Mbit(13), hyperchannel(14), fddi(15), lapb(16), sdlc(17), ds1(18), e1(19), basicISDN(20), primaryISDN(21), propPointToPointSerial(22), ppp(23), softwareLoopback(24), eon(25), ethernet-3Mbit(26), nsip(27), slip(28), ultra(29), ds3(30), sip(31), frame-relay(32)
| | +-- -R-- INTEGER ifMtu(4)
| | +-- -R-- Gauge ifSpeed(5)
| | +-- -R-- String ifPhysAddress(6)
| | | Textual Convention: PhysAddress
| | +-- -RW- EnumVal ifAdminStatus(7)
| | | Values: up(1), down(2), testing(3)
| | +-- -R-- EnumVal ifOperStatus(8)
| | | Values: up(1), down(2), testing(3)
| | +-- -R-- TimeTicks ifLastChange(9)
| | +-- -R-- Counter ifInOctets(10)
| | +-- -R-- Counter ifInUcastPkts(11)
| | +-- -R-- Counter ifInNUcastPkts(12)
| | +-- -R-- Counter ifInDiscards(13)
| | +-- -R-- Counter ifInErrors(14)
| | +-- -R-- Counter ifInUnknownProtos(15)
| | +-- -R-- Counter ifOutOctets(16)
| | +-- -R-- Counter ifOutUcastPkts(17)
| | +-- -R-- Counter ifOutNUcastPkts(18)
| | +-- -R-- Counter ifOutDiscards(19)
| | +-- -R-- Counter ifOutErrors(20)
| | +-- -R-- Gauge ifOutQLen(21)
| | +-- -R-- ObjID ifSpecific(22)
| |
| +--at(3)
| | |
| | +--atTable(1)
| | |
| | +--atEntry(1)
| | | Index: atIfIndex, atNetAddress
| | |
| | +-- -RW- INTEGER atIfIndex(1)
| | +-- -RW- String atPhysAddress(2)
| | | Textual Convention: PhysAddress
| | +-- -RW- NetAddr atNetAddress(3)
| |
| +--ip(4)
| | |
| | +-- -RW- EnumVal ipForwarding(1)
| | | Values: forwarding(1), not-forwarding(2)
| | +-- -RW- INTEGER ipDefaultTTL(2)
| | +-- -R-- Counter ipInReceives(3)
| | +-- -R-- Counter ipInHdrErrors(4)
| | +-- -R-- Counter ipInAddrErrors(5)
| | +-- -R-- Counter ipForwDatagrams(6)
| | +-- -R-- Counter ipInUnknownProtos(7)
| | +-- -R-- Counter ipInDiscards(8)
| | +-- -R-- Counter ipInDelivers(9)
| | +-- -R-- Counter ipOutRequests(10)
| | +-- -R-- Counter ipOutDiscards(11)
| | +-- -R-- Counter ipOutNoRoutes(12)
| | +-- -R-- INTEGER ipReasmTimeout(13)
| | +-- -R-- Counter ipReasmReqds(14)
| | +-- -R-- Counter ipReasmOKs(15)
| | +-- -R-- Counter ipReasmFails(16)
| | +-- -R-- Counter ipFragOKs(17)
| | +-- -R-- Counter ipFragFails(18)
| | +-- -R-- Counter ipFragCreates(19)
| | |
| | +--ipAddrTable(20)
| | | |
| | | +--ipAddrEntry(1)
| | | | Index: ipAdEntAddr
| | | |
| | | +-- -R-- IpAddr ipAdEntAddr(1)
[4251 lines skipped]