1""" Runs all unit tests for the netsnmp package.   """
2# Copyright (c) 2006 Andy Gross.  See LICENSE.txt for details.
3
4import os
5import unittest
6import netsnmp
7
8def snmp_dest(**kwargs):
9    """Return information about how to communicate with snmpd"""
10    dest = {
11        'Version':    1,
12        'DestHost':   'localhost:' + str(os.environ.get("SNMP_SNMPD_PORT", 161)),
13         # Both the community strings "public" and "private"
14         # cannot be used to set variables using "snmpset"
15         # operations. Run the "snmpset" tests after replacing
16         # the following 'Community' string with any other
17         # configured community string from the snmpd.conf file.
18        'Community':  'public',
19    }
20    for key, value in kwargs.items():
21        dest[key] = value
22    return dest
23
24def setup_v1():
25    return netsnmp.Session(**snmp_dest())
26
27def setup_v2():
28    sess = netsnmp.Session(**snmp_dest(Version=2))
29    sess.UseEnums = 1
30    sess.UseLongNames = 1
31    return sess
32
33def setup_v3():
34    sess = netsnmp.Session(**snmp_dest(Version=3,
35                                       SecLevel='authPriv',
36                                       SecName='initial',
37                                       PrivPass='priv_pass',
38                                       AuthPass='auth_pass'))
39    sess.UseSprintValue = 1
40    return sess
41
42class BasicTests(unittest.TestCase):
43    """Basic unit tests for the Net-SNMP Python interface"""
44    def test_varbind_creation(self):
45        var = netsnmp.Varbind('sysDescr.0')
46        self.assertEqual(var.tag, 'sysDescr')
47        self.assertEqual(var.iid, '0')
48
49        var = netsnmp.Varbind('sysDescr', '0')
50        self.assertEqual(var.tag, 'sysDescr')
51        self.assertEqual(var.iid, '0')
52
53        var = netsnmp.Varbind(
54            '.iso.org.dod.internet.mgmt.mib-2.system.sysDescr', '0')
55        self.assertEqual(var.tag,
56                         '.iso.org.dod.internet.mgmt.mib-2.system.sysDescr')
57        self.assertEqual(var.iid, '0')
58
59        var = netsnmp.Varbind(
60            '.iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0')
61        self.assertEqual(var.tag,
62                         '.iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0')
63        self.assertEqual(var.iid, None)
64
65        var = netsnmp.Varbind('.1.3.6.1.2.1.1.1.0')
66        self.assertEqual(var.tag, '.1.3.6.1.2.1.1.1.0')
67        self.assertEqual(var.iid, '')
68
69    def test_v1_get(self):
70        print("\n")
71        print("---v1 GET tests -------------------------------------\n")
72        var = netsnmp.Varbind('.1.3.6.1.2.1.1.1', '0')
73        res = netsnmp.snmpget(var, **snmp_dest())
74
75        print("v1 snmpget result: ", res, "\n")
76        self.assertEqual(len(res), 1)
77
78        print("v1 get var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
79        self.assertEqual(var.tag, 'sysDescr')
80        self.assertEqual(var.iid, '0')
81        self.assertEqual(var.val, res[0])
82        self.assertEqual(var.type, 'OCTETSTR')
83
84    def test_v1_getnext(self):
85        print("\n")
86        print("---v1 GETNEXT tests-------------------------------------\n")
87        var = netsnmp.Varbind('.1.3.6.1.2.1.1.1', '0')
88        res = netsnmp.snmpgetnext(var, **snmp_dest())
89
90        print("v1 snmpgetnext result: ", res, "\n")
91        self.assertEqual(len(res), 1)
92
93        print("v1 getnext var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
94        self.assertTrue(var.tag is not None)
95        self.assertTrue(var.iid is not None)
96        self.assertTrue(var.val is not None)
97        self.assertTrue(var.type is not None)
98
99    def test_v1_set(self):
100        print("\n")
101        print("---v1 SET tests-------------------------------------\n")
102        # snmpset fails for the 'sysLocation' variable,
103        # as the syslocation token is configured in the
104        # snmpd.conf file, which disables write access
105        # to the variable.
106        # Hence using the 'sysName' variable for the set tests.
107        var = netsnmp.Varbind('sysName', '0', 'my new name')
108        res = netsnmp.snmpset(var, **snmp_dest())
109
110        print("v1 snmpset result: ", res, "\n")
111        self.assertEqual(res, 1)
112
113        print("v1 set var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
114        self.assertEqual(var.tag, 'sysName')
115        self.assertEqual(var.iid, '0')
116        self.assertEqual(var.val, 'my new name')
117        self.assertTrue(var.type is None)
118
119    def test_v1_walk(self):
120        print("\n")
121        print("---v1 walk tests-------------------------------------\n")
122        varlist = netsnmp.VarList(netsnmp.Varbind('system'))
123
124        print("v1 varlist walk in: ")
125        for var in varlist:
126            print("  ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
127
128        res = netsnmp.snmpwalk(varlist, **snmp_dest())
129        print("v1 snmpwalk result: ", res, "\n")
130        self.assertTrue(len(res) > 0)
131
132        for var in varlist:
133            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
134
135    def test_v1_walk_2(self):
136        print("\n")
137        print("---v1 walk 2-------------------------------------\n")
138
139        print("v1 varbind walk in: ")
140        var = netsnmp.Varbind('system')
141        self.assertEqual(var.tag, 'system')
142        self.assertEqual(var.iid, '')
143        self.assertEqual(var.val, None)
144        self.assertEqual(var.type, None)
145        res = netsnmp.snmpwalk(var, **snmp_dest())
146        print("v1 snmpwalk result (should be = orig): ", res, "\n")
147        self.assertTrue(len(res) > 0)
148
149        print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
150        self.assertEqual(var.tag, 'system')
151        self.assertEqual(var.iid, '')
152        self.assertEqual(var.val, None)
153        self.assertEqual(var.type, None)
154
155    def test_v1_mv_get(self):
156        print("\n")
157        print("---v1 multi-varbind test-------------------------------------\n")
158        sess = setup_v1()
159
160        varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0),
161                                  netsnmp.Varbind('sysContact', 0),
162                                  netsnmp.Varbind('sysLocation', 0))
163        vals = sess.get(varlist)
164        print("v1 sess.get result: ", vals, "\n")
165        self.assertTrue(len(vals) > 0)
166
167        for var in varlist:
168            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
169
170        vals = sess.getnext(varlist)
171        print("v1 sess.getnext result: ", vals, "\n")
172        self.assertTrue(len(vals) > 0)
173
174        for var in varlist:
175            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
176
177        varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime'),
178                                  netsnmp.Varbind('sysORLastChange'),
179                                  netsnmp.Varbind('sysORID'),
180                                  netsnmp.Varbind('sysORDescr'),
181                                  netsnmp.Varbind('sysORUpTime'))
182
183        vals = sess.getbulk(2, 8, varlist)
184        print("v1 sess.getbulk result: ", vals, "\n")
185        self.assertEqual(vals, None) # GetBulk is not supported for v1
186
187        for var in varlist:
188            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
189
190    def test_v1_set_2(self):
191        print("\n")
192        print("---v1 set2-------------------------------------\n")
193
194        sess = setup_v1()
195        # snmpset fails for the 'sysLocation' variable,
196        # as the syslocation token is configured in the
197        # snmpd.conf file, which disables write access
198        # to the variable.
199        # Hence using the 'sysName' variable for the set tests.
200        varlist = netsnmp.VarList(
201            netsnmp.Varbind('sysName', '0', 'my newer name'))
202        res = sess.set(varlist)
203        print("v1 sess.set result: ", res, "\n")
204
205    def test_v1_walk_3(self):
206        print("\n")
207        print("---v1 walk3-------------------------------------\n")
208
209        sess = setup_v1()
210        varlist = netsnmp.VarList(netsnmp.Varbind('system'))
211
212        vals = sess.walk(varlist)
213        print("v1 sess.walk result: ", vals, "\n")
214        self.assertTrue(len(vals) > 0)
215
216        for var in varlist:
217            print("  ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
218
219    def test_v2c_get(self):
220        print("\n")
221        print("---v2c get-------------------------------------\n")
222
223        sess = setup_v2()
224        varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0),
225                                  netsnmp.Varbind('sysContact', 0),
226                                  netsnmp.Varbind('sysLocation', 0))
227        vals = sess.get(varlist)
228        print("v2 sess.get result: ", vals, "\n")
229        self.assertEqual(len(vals), 3)
230
231    def test_v2c_getnext(self):
232        print("\n")
233        print("---v2c getnext-------------------------------------\n")
234
235        sess = setup_v2()
236        varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0),
237                                  netsnmp.Varbind('sysContact', 0),
238                                  netsnmp.Varbind('sysLocation', 0))
239        for var in varlist:
240            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
241        print("\n")
242
243        vals = sess.getnext(varlist)
244        print("v2 sess.getnext result: ", vals, "\n")
245        self.assertTrue(len(vals) > 0)
246
247        for var in varlist:
248            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
249        print("\n")
250
251    def test_v2c_getbulk(self):
252        print("\n")
253        print("---v2c getbulk-------------------------------------\n")
254
255        sess = setup_v2()
256        varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime'),
257                                  netsnmp.Varbind('sysORLastChange'),
258                                  netsnmp.Varbind('sysORID'),
259                                  netsnmp.Varbind('sysORDescr'),
260                                  netsnmp.Varbind('sysORUpTime'))
261
262        vals = sess.getbulk(2, 8, varlist)
263        print("v2 sess.getbulk result: ", vals, "\n")
264        self.assertTrue(len(vals) > 0)
265
266        for var in varlist:
267            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
268        print("\n")
269
270    def test_v2c_set(self):
271        print("\n")
272        print("---v2c set-------------------------------------\n")
273
274        sess = setup_v2()
275        # snmpset fails for the 'sysLocation' variable,
276        # as the syslocation token is configured in the
277        # snmpd.conf file, which disables write access
278        # to the variable.
279        # Hence using the 'sysName' variable for the set tests.
280        varlist = netsnmp.VarList(
281            netsnmp.Varbind('sysName', '0', 'my even newer name'))
282
283        res = sess.set(varlist)
284        print("v2 sess.set result: ", res, "\n")
285        self.assertEqual(res, 1)
286
287    def test_v2c_walk(self):
288        print("\n")
289        print("---v2c walk-------------------------------------\n")
290
291        sess = setup_v2()
292
293        varlist = netsnmp.VarList(netsnmp.Varbind('system'))
294
295        vals = sess.walk(varlist)
296        print("v2 sess.walk result: ", vals, "\n")
297        self.assertTrue(len(vals) > 0)
298
299        for var in varlist:
300            print("  ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
301
302    def test_v3_get(self):
303        print("\n")
304        sess = setup_v3();
305        varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0),
306                                  netsnmp.Varbind('sysContact', 0),
307                                  netsnmp.Varbind('sysLocation', 0))
308        print("---v3 get-------------------------------------\n")
309        vals = sess.get(varlist)
310        print("v3 sess.get result: ", vals, "\n")
311        self.assertTrue(len(vals) > 0)
312
313        for var in varlist:
314            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
315        print("\n")
316
317    def test_v3_getnext(self):
318        print("\n")
319        print("---v3 getnext-------------------------------------\n")
320
321        sess = setup_v3();
322        varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0),
323                                  netsnmp.Varbind('sysContact', 0),
324                                  netsnmp.Varbind('sysLocation', 0))
325        vals = sess.getnext(varlist)
326        print("v3 sess.getnext result: ", vals, "\n")
327        self.assertTrue(len(vals) > 0)
328
329        for var in varlist:
330            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
331        print("\n")
332
333    def test_v3_getbulk(self):
334        sess = setup_v3();
335        varlist = netsnmp.VarList(netsnmp.Varbind('sysUpTime'),
336                                  netsnmp.Varbind('sysORLastChange'),
337                                  netsnmp.Varbind('sysORID'),
338                                  netsnmp.Varbind('sysORDescr'),
339                                  netsnmp.Varbind('sysORUpTime'))
340
341        vals = sess.getbulk(2, 8, varlist)
342        print("v3 sess.getbulk result: ", vals, "\n")
343        self.assertTrue(len(vals) > 0)
344
345        for var in varlist:
346            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
347        print("\n")
348
349    def test_v3_set(self):
350        print("\n")
351        print("---v3 set-------------------------------------\n")
352
353        sess = setup_v3();
354        # snmpset fails for the 'sysLocation' variable,
355        # as the syslocation token is configured in the
356        # snmpd.conf file, which disables write access
357        # to the variable.
358        # Hence using the 'sysName' variable for the set tests.
359        varlist = netsnmp.VarList(
360            netsnmp.Varbind('sysName', '0', 'my final name'))
361        res = sess.set(varlist)
362        print("v3 sess.set result: ", res, "\n")
363        self.assertEqual(res, 1)
364
365    def test_v3_walk(self):
366        print("\n")
367        print("---v3 walk-------------------------------------\n")
368        sess = setup_v3();
369        varlist = netsnmp.VarList(netsnmp.Varbind('system'))
370
371        vals = sess.walk(varlist)
372        print("v3 sess.walk result: ", vals, "\n")
373        self.assertTrue(len(vals) > 0)
374
375        for var in varlist:
376            print("  ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
377
378
379class SetTests(unittest.TestCase):
380    """SNMP set tests for the Net-SNMP Python interface"""
381    def testFuncs(self):
382        """Test code"""
383        print("\n-------------- SET Test Start ----------------------------\n")
384
385        var = netsnmp.Varbind('sysUpTime', '0')
386        res = netsnmp.snmpget(var, **snmp_dest())
387        print("uptime = ", res[0])
388        self.assertEqual(len(res), 1)
389
390
391        var = netsnmp.Varbind('versionRestartAgent', '0', 1)
392        res = netsnmp.snmpset(var, **snmp_dest())
393        self.assertEqual(res, 1)
394
395        var = netsnmp.Varbind('sysUpTime', '0')
396        res = netsnmp.snmpget(var, **snmp_dest())
397        print("uptime = ", res[0])
398        self.assertEqual(len(res), 1)
399
400        var = netsnmp.Varbind('nsCacheEntry')
401        res = netsnmp.snmpgetnext(var, **snmp_dest())
402        print("var = ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
403        self.assertEqual(len(res), 1)
404
405        var.val = 65
406        res = netsnmp.snmpset(var, **snmp_dest())
407        self.assertEqual(res, 1)
408        res = netsnmp.snmpget(var, **snmp_dest())
409        print("var = ", var.tag, var.iid, "=", var.val, '(', var.type, ')')
410        self.assertEqual(len(res), 1)
411        self.assertEqual(res[0], '65');
412
413        sess = setup_v1()
414
415        varlist = netsnmp.VarList(
416            netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.2.116.101.115.116', '', '.1.3.6.1.6.1.1'),
417            netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.3.116.101.115.116', '', '1234'),
418            netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.9.116.101.115.116', '', 4))
419        res = sess.set(varlist)
420
421        print("res = ", res)
422        self.assertEqual(res, 1)
423
424        varlist = netsnmp.VarList(netsnmp.Varbind('snmpTargetAddrTDomain'),
425                                  netsnmp.Varbind('snmpTargetAddrTAddress'),
426                                  netsnmp.Varbind('snmpTargetAddrRowStatus'))
427
428        res = sess.getnext(varlist)
429        self.assertEqual(len(res), 3)
430        self.assertEqual(varlist[0].tag, 'snmpTargetAddrTDomain')
431        self.assertEqual(varlist[0].iid, '116.101.115.116')
432        self.assertEqual(varlist[0].val, '.1.3.6.1.6.1.1')
433        self.assertEqual(varlist[1].tag, 'snmpTargetAddrTAddress')
434        self.assertEqual(varlist[1].iid, '116.101.115.116')
435        self.assertEqual(varlist[1].val, '1234')
436        self.assertEqual(varlist[2].tag, 'snmpTargetAddrRowStatus')
437        self.assertEqual(varlist[2].iid, '116.101.115.116')
438        self.assertEqual(varlist[2].val, '3')
439
440        for var in varlist:
441            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
442        print("\n")
443
444        varlist = netsnmp.VarList(
445            netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.9.116.101.115.116', '', 6))
446
447        res = sess.set(varlist)
448
449        print("res = ", res)
450        self.assertEqual(res, 1)
451
452        varlist = netsnmp.VarList(netsnmp.Varbind('snmpTargetAddrTDomain'),
453                                  netsnmp.Varbind('snmpTargetAddrTAddress'),
454                                  netsnmp.Varbind('snmpTargetAddrRowStatus'))
455
456        res = sess.getnext(varlist)
457        self.assertEqual(len(res), 3)
458        self.assertNotEqual(varlist[0].tag, 'snmpTargetAddrTDomain')
459        self.assertNotEqual(varlist[1].tag, 'snmpTargetAddrTAddress')
460        self.assertNotEqual(varlist[2].tag, 'snmpTargetAddrRowStatus')
461
462        for var in varlist:
463            print(var.tag, var.iid, "=", var.val, '(', var.type, ')')
464        print("\n")
465
466        print("\n-------------- SET Test End ----------------------------\n")
467
468
469if __name__ == '__main__':
470    unittest.main()
471