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