[cl-net-snmp-cvs] r12 - trunk

ctian at common-lisp.net ctian at common-lisp.net
Sun Apr 8 12:26:21 UTC 2007


Author: ctian
Date: Sun Apr  8 08:26:19 2007
New Revision: 12

Added:
   trunk/asn1.lisp
Modified:
   trunk/README
   trunk/changelog
   trunk/classes.lisp
   trunk/constants.lisp
   trunk/net-snmp.asd
   trunk/package.lisp
   trunk/snmp-api.lisp
Log:
* Release 0.10
* Add SNMPv3 (authNoPriv) support
* One time get multiple value (use snmp-msg-get-list)


Modified: trunk/README
==============================================================================
--- trunk/README	(original)
+++ trunk/README	Sun Apr  8 08:26:19 2007
@@ -6,15 +6,17 @@
 ;;;         NetEase.com, Inc. (http://corp.netease.com)
 
 ;;; This package only support:
-;;;   * Version: SNMPv1, SNMPv2c
-;;;   * PDU Type: GET
-;;;   * Just print the result to stdout...
+;;;   * Version: SNMPv1, SNMPv2c, SNMPv3(authNoPriv)
+;;;   * PDU Type: GET(single, multiple)
+;;;   * Return string or number.
 
 ;;; I use the CFFI for portable CL support, see http://common-lisp.net/project/cffi/
 ;;; Known work on: SBCL and CLISP
 
 ;;; Sample usage:
 
+(in-package :cl-user)
+
 (defun test ()
   (let ((s (make-instance 'snmp:snmp-session
 			  :peername "localhost"
@@ -22,3 +24,15 @@
 			  :version snmp:+snmp-version-2c+)))
     (snmp:snmp-msg-get s "sysDescr.0")
     (snmp:snmp-msg-get "localhost" ".1.3.6.1.2.1.1.1.0")))
+
+;;; SNMPv3 and GETs Example
+(defun v3-test ()
+  (let ((s (make-instance 'snmp:snmp-session
+			  :peername "binghe.people.163.org"
+			  :version snmp:+snmp-version-3+
+			  :security-name "binghe"
+			  :password "bBtB0bxs"
+			  :security-auth-proto :hmac-sha1)))
+    (snmp:snmp-msg-get-list s
+			    '("sysDescr.0" "sysContact.0"))))
+;; => ("Linux binghe.people.163.org 2.6.18-4-686 #1 SMP Wed Feb 21 16:06:54 UTC 2007 i686" "Chun Tian (binghe) <binghe at 163.org>")

Added: trunk/asn1.lisp
==============================================================================
--- (empty file)
+++ trunk/asn1.lisp	Sun Apr  8 08:26:19 2007
@@ -0,0 +1,36 @@
+(in-package :org.net-snmp)
+
+(eval-when (:compile-toplevel :load-toplevel :execute)
+  (defclass oid ()
+    ((name :type string :reader oid-name :initarg :name)
+     (length :type integer :reader oid-length)
+     c-oids
+     c-oid-len))
+
+  (defmethod shared-initialize :after ((instance oid) slot-names &rest initargs)
+    (declare (ignore slot-names initargs))
+    (with-slots (name length c-oids c-oid-len) instance
+      (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 (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)))))
+
+  (defmacro snmp-var->value (var)
+    (let ((v (gensym)))
+      `(let ((,v ,var))
+	 (case (foreign-slot-value ,v 'c-variable-list 'c-type)
+	   ;; ASN_OCTET_STR
+	   (,+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_COUNTER
+	   (,+asn-counter+
+	    (mem-ref (foreign-slot-value ,v 'c-variable-list 'c-val)
+		     :uint32))
+	   (otherwise :others))))))
+

Modified: trunk/changelog
==============================================================================
--- trunk/changelog	(original)
+++ trunk/changelog	Sun Apr  8 08:26:19 2007
@@ -1,3 +1,9 @@
+Sun Apr  8 20:11:52 CST 2007, ctian
+
+	* Release 0.10
+	* SNMPv3 Support (only authNoPriv, both MD5 and SHA1)
+	* Add a snmp-msg-get-list to request more than one variable per time
+
 Sat Mar 31 00:37:03 CST 2007, ctian
 	
 	* Release 0.01

Modified: trunk/classes.lisp
==============================================================================
--- trunk/classes.lisp	(original)
+++ trunk/classes.lisp	Sun Apr  8 08:26:19 2007
@@ -1,5 +1,17 @@
 (in-package :org.net-snmp)
 
+(eval-when (:compile-toplevel :load-toplevel :execute)
+  (let ((md5 (make-instance 'oid :name ".1.3.6.1.6.3.10.1.1.2"))
+	(sha1 (make-instance 'oid :name ".1.3.6.1.6.3.10.1.1.3")))
+    (defparameter +usm-hmac-md5-auth-protocol+ (slot-value md5 'c-oids))
+    (defparameter +usm-hmac-md5-auth-protocol-len+ (oid-length md5))
+    (defparameter +usm-hmac-sha1-auth-protocol+ (slot-value sha1 'c-oids))
+    (defparameter +usm-hmac-sha1-auth-protocol-len+ (oid-length sha1))))
+
+;;;
+;;; SNMP Session
+;;;
+
 (defclass snmp-session ()
   ((peername :reader snmp-peername
 	     :initarg :peername
@@ -13,38 +25,79 @@
 	      :initarg :community
 	      :type string
 	      :initform "public")
+   (security-name :reader snmp-security-name
+		  :initarg :security-name
+		  :type string)
+   (security-level :reader snmp-security-level
+		   :initarg :security-level
+		   :type string
+		   :initform +snmp-sec-level-authnopriv+)
+   (security-auth-proto :reader snmp-security-auth-proto
+			:initarg :security-auth-proto
+			:type (member :hmac-md5 :hmac-sha1)
+			:initform :hmac-md5)
+   (passphrase :initarg :passphrase
+	       :type string
+	       :initform "binghe")
    c-session))
 
 (defmethod shared-initialize :after ((instance snmp-session) slot-names &rest initargs)
   (declare (ignore slot-names initargs))
-  (with-slots (peername version community c-session) instance
+  (with-slots (peername version c-session) instance
     (progn
       (setf c-session (foreign-alloc 'c-snmp-session))
       (c-snmp-session-init c-session)
-      (with-foreign-slots ((c-peername c-version c-community c-community-len)
-			   c-session c-snmp-session)
-	(setf c-peername (foreign-string-alloc peername)
-	      c-version version
-	      c-community (foreign-string-alloc community)
-	      c-community-len (length community))))))
-
-(defclass oid ()
-  ((name :type string :reader oid-name :initarg :name)
-   (length :type integer :reader oid-length)
-   c-oids
-   c-oid-len))
-
-(defmethod shared-initialize :after ((instance oid) slot-names &rest initargs)
-  (declare (ignore slot-names initargs))
-  (with-slots (name length c-oids c-oid-len) instance
-    (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 (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)))))
+      (cond ((or (= version +snmp-version-1+)
+		 (= version +snmp-version-2c+))
+	     (with-slots (community) instance
+	       (with-foreign-slots ((c-peername c-version c-community c-community-len)
+				    c-session c-snmp-session)
+		 (setf c-peername (foreign-string-alloc peername)
+		       c-version version
+		       c-community (foreign-string-alloc community)
+		       c-community-len (length community)))))
+	    ;; SNMPv3 support
+	    ((= version +snmp-version-3+)
+	     (with-slots (security-name security-level security-auth-proto passphrase)
+		 instance
+	       (with-foreign-slots ((c-peername
+				     c-version
+				     c-security-name
+				     c-security-name-len
+				     c-security-level
+				     c-security-auth-proto
+				     c-security-auth-proto-len
+				     c-security-auth-key-len)
+				    c-session c-snmp-session)
+		 (progn
+		   (setf c-peername (foreign-string-alloc peername)
+			 c-version version
+			 c-security-name security-name
+			 c-security-name-len (length security-name)
+			 ;; we only support authNoPriv now
+			 c-security-level +snmp-sec-level-authnopriv+
+			 c-security-auth-key-len +usm-auth-ku-len+)
+		   (case security-auth-proto
+		     (:hmac-md5
+		      (setf c-security-auth-proto +usm-hmac-md5-auth-protocol+
+			    c-security-auth-proto-len +usm-hmac-md5-auth-protocol-len+))
+		     (:hmac-sha1
+		      (setf c-security-auth-proto +usm-hmac-sha1-auth-protocol+
+			    c-security-auth-proto-len +usm-hmac-sha1-auth-protocol-len+)))
+		   (let ((c-passphrase (foreign-string-alloc passphrase)))
+		     (if (/= (c-generate-ku c-security-auth-proto
+					    c-security-auth-proto-len
+					    c-passphrase
+					    (length passphrase)
+					    (foreign-slot-pointer c-session
+								  'c-snmp-session
+								  'c-security-auth-key)
+					    (foreign-slot-pointer c-session
+								  'c-snmp-session
+								  'c-security-auth-key-len))
+			     +snmp-err-success+)
+			 (error "Error generating Ku from authentication pass phrase.")))))))
+	    (t (error "unknown snmp version!"))))))
 
 (defmethod snmp-msg-get ((s snmp-session) (o oid))
   (car (snmp-msg-get-list s (list o))))
@@ -87,16 +140,3 @@
 
 (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	Sun Apr  8 08:26:19 2007
@@ -16,7 +16,6 @@
 (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)
@@ -26,6 +25,19 @@
 (defconstant +asn-primitive+	#b00000000)
 (defconstant +asn-constructor+	#b00100000)
 
+;; defined types (from the SMI, RFC 1157)
+(defconstant +asn-ipaddress+	(logior +asn-application+ 0))
+(defconstant +asn-counter+	(logior +asn-application+ 1))
+(defconstant +asn-gauge+	(logior +asn-application+ 2))
+(defconstant +asn-unsigned+	(logior +asn-application+ 2))
+(defconstant +asn-timeticks+	(logior +asn-application+ 3))
+(defconstant +asn-opaque+	(logior +asn-application+ 4))
+
+;; defined types (from the SMI, RFC 1442)
+(defconstant +asn-nsap+		(logior +asn-application+ 5))
+(defconstant +asn-counter64+	(logior +asn-application+ 6))
+(defconstant +asn-uinteger+	(logior +asn-application+ 7))
+
 ;;; from snmp.h
 (defconstant +snmp-version-1+ 0)
 (defconstant +snmp-version-2c+ 1)
@@ -76,6 +88,7 @@
 (defconstant +snmp-stat-error+ 1)
 (defconstant +snmp-stat-timeout+ 2)
 
+(defconstant +snmp-err-success+ 0)
 (defconstant +snmp-err-noerror+ 0)
 (defconstant +snmp-err-toobig+ 1)
 (defconstant +snmp-err-nosuchname+ 2)

Modified: trunk/net-snmp.asd
==============================================================================
--- trunk/net-snmp.asd	(original)
+++ trunk/net-snmp.asd	Sun Apr  8 08:26:19 2007
@@ -7,11 +7,12 @@
           
 (defsystem net-snmp
   :description "Common Lisp interface for Net-SNMP"
-  :version "0.01"
+  :version "0.10"
   :author "Chun Tian (binghe)"
   :depends-on (:cffi)
   :components ((:file "package")
 	       (:file "constants" :depends-on ("package"))
 	       (:file "typedefs" :depends-on ("package"))
+	       (:file "asn1" :depends-on ("constants" "typedefs"))
 	       (:file "snmp-api" :depends-on ("constants" "typedefs"))
 	       (:file "classes" :depends-on ("snmp-api"))))

Modified: trunk/package.lisp
==============================================================================
--- trunk/package.lisp	(original)
+++ trunk/package.lisp	Sun Apr  8 08:26:19 2007
@@ -11,7 +11,8 @@
    snmp-msg-get-list
    ;; constants
    +snmp-version-1+
-   +snmp-version-2c+))
+   +snmp-version-2c+
+   +snmp-version-3+))
 
 (in-package :org.net-snmp)
 

Modified: trunk/snmp-api.lisp
==============================================================================
--- trunk/snmp-api.lisp	(original)
+++ trunk/snmp-api.lisp	Sun Apr  8 08:26:19 2007
@@ -1,7 +1,5 @@
 (in-package :org.net-snmp)
 
-;;(defcvar ("usmHMACMD5AuthProtocol" *c-usm-hmac-md5-auth-protocol*) :pointer)
-
 (eval-when (:compile-toplevel :load-toplevel)
   (defcfun ("init_snmp" c-snmp-init) :void (type :string)))
 
@@ -75,3 +73,10 @@
   (objidlen :ulong)
   (variable :pointer))
 
+(defcfun ("generate_Ku" c-generate-ku) :int
+  (hashtype :pointer)
+  (hashtype-len :uint)
+  (p :pointer)
+  (pplen :ulong)
+  (ku :pointer)
+  (kulen :pointer))



More information about the Cl-net-snmp-cvs mailing list