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