Completed
Push — master ( 8404d4...c28027 )
by
unknown
13s queued 11s
created

gvmtools.cli.main()   D

Complexity

Conditions 12

Size

Total Lines 72
Code Lines 46

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 46
dl 0
loc 72
rs 4.8
c 0
b 0
f 0
cc 12
nop 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Complexity

Complex classes like gvmtools.cli.main() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
# -*- coding: utf-8 -*-
2
# Copyright (C) 2018 Greenbone Networks GmbH
3
#
4
# SPDX-License-Identifier: GPL-3.0-or-later
5
#
6
# This program is free software: you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation, either version 3 of the License, or
9
# (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful,
12
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
# GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
19
import getpass
20
import logging
21
import sys
22
23
from gvm.errors import GvmError
24
from gvm.protocols.latest import Gmp, Osp
25
from gvm.transforms import CheckCommandTransform
26
from gvm.xml import validate_xml_string
27
28
from gvmtools.helper import do_not_run_as_root
29
from gvmtools.parser import create_parser, create_connection, PROTOCOL_OSP
30
31
logger = logging.getLogger(__name__)
32
33
HELP_TEXT = """
34
    Command line tool to access services via GMP (Greenbone Management Protocol) and OSP (Open Scanner Protocol)
35
36
    Examples:
37
      gvm-cli socket --help
38
      gvm-cli tls --help
39
      gvm-cli ssh --help
40
41
      gvm-cli socket --xml "<get_version/>"
42
      gvm-cli socket --xml "<commands><authenticate><credentials><username>myuser</username><password>mypass</password></credentials></authenticate><get_tasks/></commands>"
43
      gvm-cli socket --gmp-username foo --gmp-password foo < myfile.xml
44
45
    The protocol specifications for GMP and OSP are available at:
46
      https://docs.greenbone.net/index.html#api_documentation"""
47
48
49
def _load_infile(filename=None):
50
    if not filename:
51
        return None
52
53
    with open(filename) as f:
54
        return f.read()
55
56
57
def main():
58
    do_not_run_as_root()
59
60
    parser = create_parser(description=HELP_TEXT, logfilename='gvm-cli.log')
61
62
    parser.add_protocol_argument()
63
64
    parser.add_argument('-X', '--xml', help='XML request to send')
65
    parser.add_argument(
66
        '-r', '--raw', help='Return raw XML', action='store_true', default=False
67
    )
68
    parser.add_argument(
69
        'infile', nargs='?', help='File to read XML commands from.'
70
    )
71
72
    args = parser.parse_args()
73
74
    # If timeout value is -1, then the socket has no timeout for this session
75
    if args.timeout == -1:
76
        args.timeout = None
77
78
    if args.xml is not None:
79
        xml = args.xml
80
    else:
81
        try:
82
            xml = _load_infile(args.infile)
83
        except IOError as e:
84
            print(e, file=sys.stderr)
85
            sys.exit(1)
86
87
    # If no command was given, program asks for one
88
    if len(xml) == 0:
89
        xml = input()
90
91
    try:
92
        validate_xml_string(xml)
93
    except GvmError as e:
94
        print(e, file=sys.stderr)
95
        sys.exit(1)
96
97
    connection = create_connection(**vars(args))
98
99
    if args.raw:
100
        transform = None
101
    else:
102
        transform = CheckCommandTransform()
103
104
    if args.protocol == PROTOCOL_OSP:
105
        protocol = Osp(connection, transform=transform)
106
    else:
107
        protocol = Gmp(connection, transform=transform)
108
109
        # Ask for password if none are given
110
        if args.gmp_username and not args.gmp_password:
111
            args.gmp_password = getpass.getpass(
112
                'Enter password for ' + args.gmp_username + ': '
113
            )
114
115
        if args.gmp_username:
116
            protocol.authenticate(args.gmp_username, args.gmp_password)
117
118
    try:
119
        result = protocol.send_command(xml)
120
121
        print(result)
122
    except Exception as e:  # pylint: disable=broad-except
123
        print(e, file=sys.stderr)
124
        sys.exit(1)
125
126
    protocol.disconnect()
127
128
    sys.exit(0)
129
130
131
if __name__ == '__main__':
132
    main()
133