-
Notifications
You must be signed in to change notification settings - Fork 2
/
snmp-get.lisp
73 lines (64 loc) · 2.96 KB
/
snmp-get.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
;;;; -*- Mode: Lisp -*-
;;;; $Id$
(in-package :snmp)
;;; RFC 3416: 4.2.3. The GetBulkRequest-PDU
(defun generate-table (vars vbs non-repeaters max-repetitions)
(declare (type fixnum non-repeaters max-repetitions))
(let* ((var-number (list-length vars))
(n (min non-repeaters var-number))
(m max-repetitions)
(r (max (- var-number n) 0))
(real-vbs (mapcar #'(lambda (x) (coerce x 'list))
(coerce vbs 'list)))
result-table)
;; non-repeaters
(dotimes (i n)
(push (pop real-vbs) result-table))
;; table
(when (and (plusp m) (plusp r))
(dotimes (i m)
(push (let (record)
(dotimes (j r (nreverse record))
(push (pop real-vbs) record)))
result-table)))
(values (nreverse result-table)
(mapcar #'oid vars))))
(defgeneric snmp-bulk (object vars &key &allow-other-keys)
(:documentation "SNMP Get Bulk"))
(defmethod snmp-bulk ((host string) vars &key context
(non-repeaters 0) (max-repetitions 1))
(when vars
(with-open-session (s host)
(snmp-bulk s vars
:non-repeaters non-repeaters
:max-repetitions max-repetitions
:context context))))
(defmethod snmp-bulk ((session session) (vars list) &key context
(non-repeaters 0) (max-repetitions 1))
(when vars
(let ((vb (mapcar #'(lambda (x) (list (oid x) nil)) vars)))
;; Get a report first if the session is new created
(when (and (= +snmp-version-3+ (version-of session))
(need-report-p session))
(snmp-report session))
(let ((message (make-instance (gethash (type-of session) *session->message*)
:session session
:pdu (make-instance 'bulk-pdu
:non-repeaters non-repeaters
:max-repetitions max-repetitions
:variable-bindings vb)
:context (or context *default-context*))))
(let ((reply (send-snmp-message session message)))
(when reply
(generate-table vars
(variable-bindings-of (pdu-of reply))
non-repeaters max-repetitions)))))))
(defmethod snmp-bulk ((host session) (var string) &key context)
(multiple-value-bind (table header) (snmp-bulk host (list var) :context context)
(values (car table) (car header))))
(defmethod snmp-bulk ((host session) (var object-id) &key context)
(multiple-value-bind (table header) (snmp-bulk host (list var) :context context)
(values (car table) (car header))))
(defmethod snmp-bulk ((host session) (var vector) &key context)
(multiple-value-bind (table header) (snmp-bulk host (list var) :context context)
(values (car table) (car header))))