Completed
Push — master ( 4758e6...21bc65 )
by Juan José
16s queued 10s
created

gvmtools.cli.main()   D

Complexity

Conditions 12

Size

Total Lines 65
Code Lines 40

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 40
dl 0
loc 65
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.protocols.latest import Gmp, Osp
24
from gvm.transforms import CheckCommandTransform
25
26
from gvmtools.parser import create_parser, create_connection, PROTOCOL_OSP
27
28
logger = logging.getLogger(__name__)
29
30
HELP_TEXT = """
31
    Command line tool to access services via GMP (Greenbone Management Protocol) and OSP (Open Scanner Protocol)
32
33
    Examples:
34
      gvm-cli socket --help
35
      gvm-cli tls --help
36
      gvm-cli ssh --help
37
38
      gvm-cli socket --xml "<get_version/>"
39
      gvm-cli socket --xml "<commands><authenticate><credentials><username>myuser</username><password>mypass</password></credentials></authenticate><get_tasks/></commands>"
40
      gvm-cli socket --gmp-username foo --gmp-password foo < myfile.xml
41
42
    The protocol specifications for GMP and OSP are available at:
43
      https://docs.greenbone.net/index.html#api_documentation"""
44
45
46
def main():
47
    parser = create_parser(description=HELP_TEXT, logfilename='gvm-cli.log')
48
49
    parser.add_protocol_argument()
50
51
    parser.add_argument('-X', '--xml', help='XML request to send')
52
    parser.add_argument(
53
        '-r', '--raw', help='Return raw XML', action='store_true', default=False
54
    )
55
    parser.add_argument('infile', nargs='?', type=open, default=sys.stdin)
56
57
    args = parser.parse_args()
58
59
    # If timeout value is -1, then the socket has no timeout for this session
60
    if args.timeout == -1:
61
        args.timeout = None
62
63
    xml = ''
64
65
    if args.xml is not None:
66
        xml = args.xml
67
    else:
68
        # If this returns False, then some data are in sys.stdin
69
        if not args.infile.isatty():
70
            try:
71
                xml = args.infile.read()
72
            except (EOFError, BlockingIOError) as e:
73
                print(e)
74
75
    # If no command was given, program asks for one
76
    if len(xml) == 0:
77
        xml = input()
78
79
    connection = create_connection(**vars(args))
80
81
    if args.raw:
82
        transform = None
83
    else:
84
        transform = CheckCommandTransform()
85
86
    if args.protocol == PROTOCOL_OSP:
87
        protocol = Osp(connection, transform=transform)
88
    else:
89
        protocol = Gmp(connection, transform=transform)
90
91
        # Ask for password if none are given
92
        if args.gmp_username and not args.gmp_password:
93
            args.gmp_password = getpass.getpass(
94
                'Enter password for ' + args.gmp_username + ': '
95
            )
96
97
        if args.gmp_username:
98
            protocol.authenticate(args.gmp_username, args.gmp_password)
99
100
    try:
101
        result = protocol.send_command(xml)
102
103
        print(result)
104
    except Exception as e:  # pylint: disable=broad-except
105
        print(e)
106
        sys.exit(1)
107
108
    protocol.disconnect()
109
110
    sys.exit(0)
111
112
113
if __name__ == '__main__':
114
    main()
115