1# 2# This file is part of snmpclitools software. 3# 4# Copyright (c) 2005-2018, Ilya Etingof <etingof@gmail.com> 5# License: http://snmplabs.com/snmpclitools/license.html 6# 7import sys 8from pysnmp.smi import view 9from snmpclitools.cli import base 10from pysnmp import error 11from snmpclitools import __version__ as pysnmpAppsVersion 12 13try: 14 from pysnmp import __version__ as pysnmpVersion 15except ImportError: 16 pysnmpVersion = 'N/A' 17 18try: 19 from pysmi import __version__ as pysmiVersion 20except ImportError: 21 pysmiVersion = 'N/A' 22 23try: 24 from pyasn1 import __version__ as pyasn1Version 25except ImportError: 26 pyasn1Version = 'N/A' 27 28try: 29 from pysnmp import debug 30except ImportError: 31 debug = None 32 33 34def getUsage(): 35 return """\ 36Command-line SNMP tools version %s, written by Ilya Etingof <etingof@gmail.com> 37Foundation libraries: pysmi %s, pysnmp %s, pyasn1 %s 38Python interpreter: %s 39Software documentation and support at http://snmplabs.com 40 -h display this help message 41 -V software release information 42 -d dump raw packets 43 -D category enable debugging [%s] 44""" % (pysnmpAppsVersion, 45 pysmiVersion, 46 pysnmpVersion, 47 pyasn1Version, 48 sys.version.replace('\n', ''), 49 debug and ','.join(debug.flagMap.keys()) or "") 50 51 52# Scanner 53 54class MainScannerMixIn: 55 def t_help(self, s): 56 r' -h|--help ' 57 self.rv.append(base.ConfigToken('help')) 58 59 def t_versioninfo(self, s): 60 r' -V|--version ' 61 self.rv.append(base.ConfigToken('versioninfo')) 62 63 def t_dump(self, s): 64 r' -d ' 65 self.rv.append(base.ConfigToken('dump')) 66 67 def t_debug(self, s): 68 r' -D|--debug ' 69 self.rv.append(base.ConfigToken('debug')) 70 71# Parser 72 73 74class MainParserMixIn: 75 initialSymbol = 'Cmdline' 76 77 def error(self, token): 78 raise error.PySnmpError( 79 'Command-line parser error at token %s\n' % token 80 ) 81 82 def p_cmdline(self, args): 83 ''' 84 Cmdline ::= Options Agent whitespace Params 85 ''' 86 87 def p_cmdlineExt(self, args): 88 ''' 89 Options ::= Option whitespace Options 90 Options ::= Option 91 Options ::= 92 93 Option ::= Help 94 Option ::= VersionInfo 95 Option ::= DebugOption 96 97 Help ::= help 98 99 VersionInfo ::= versioninfo 100 101 DebugOption ::= Dump 102 DebugOption ::= Debug 103 Dump ::= dump 104 Debug ::= debug string 105 Debug ::= debug whitespace string 106 ''' 107 108# Generator 109 110 111class __MainGenerator(base.GeneratorTemplate): 112 # SNMPv1/v2 113 def n_VersionInfo(self, cbCtx, node): 114 raise error.PySnmpError() 115 116 def n_Help(self, cbCtx, node): 117 raise error.PySnmpError() 118 119 def n_Dump(self, cbCtx, node): 120 if debug: 121 debug.setLogger(debug.Debug('io')) 122 123 def n_Debug(self, cbCtx, node): 124 if debug: 125 if len(node) > 2: 126 f = node[2].attr 127 else: 128 f = node[1].attr 129 debug.setLogger(debug.Debug(*f.split(','))) 130 131 132def generator(cbCtx, ast): 133 snmpEngine, ctx = cbCtx 134 ctx['mibViewController'] = view.MibViewController( 135 snmpEngine.getMibBuilder() 136 ) 137 return __MainGenerator().preorder((snmpEngine, ctx), ast) 138