Beispiel #1
0
 def setUp(self):
     warnings.simplefilter("ignore", ResourceWarning)
     self.gmp = SSHConnection(hostname=self.hostname,
                              port=22,
                              timeout=5,
                              ssh_user='******',
                              ssh_password='',
                              shell_mode=True)
Beispiel #2
0
    def testSSHConnection(self):
        gmp = SSHConnection(hostname=self.hostname,
                            port=22,
                            timeout=5,
                            ssh_user='******',
                            ssh_password='',
                            shell_mode=False)

        version = gmp.get_version()
        gmp.close()
        self.assertEqual(version, self.answer_ok)
Beispiel #3
0
def connection_over_ssh(xml, args):
    gvm = SSHConnection(
        hostname=args.hostname, port=args.port, timeout=args.timeout,
        ssh_user=args.ssh_user, ssh_password='')
    gvm.authenticate(args.gmp_username, args.gmp_password)
    gvm.send(xml)

    result = gvm.read()
    print(result)
    gvm.close()
Beispiel #4
0
    def testSSHConnectionWithWrongSSHPassword(self):

        try:
            SSHConnection(hostname='localhost',
                          port=22,
                          timeout=5,
                          ssh_user='******',
                          ssh_password='******',
                          shell_mode=False)
        except Exception as e:
            self.assertEqual(str(e), 'Authentication failed.')
Beispiel #5
0
    def testSSHConnectionWithWrongHostname(self):

        try:
            SSHConnection(hostname='42.42.42.42',
                          port=22,
                          timeout=5,
                          ssh_user='******',
                          ssh_password='',
                          shell_mode=False)
        except Exception as e:
            self.assertEqual(str(e), 'timed out')
Beispiel #6
0
    def testSSHConnectionWithWrongPort(self):

        try:
            SSHConnection(hostname='localhost',
                          port=23,
                          timeout=5,
                          ssh_user='******',
                          ssh_password='',
                          shell_mode=False)
        except Exception as e:
            self.assertEqual(
                str(e), '[Errno None] Unable to connect to port \
23 on 127.0.0.1 or ::1')
Beispiel #7
0
def connect(hostname, port):
    '''Connect to gvm

    According due the chosen connection type, this method will connect
    to the manager.

    Arguments:
        hostname {string} -- Hostname or ip
        port {int} -- Port

    Returns:
        GVMConnection -- Instance from GVMConnection class
    '''
    if 'socket' in args.connection_type:
        try:
            return UnixSocketConnection(sockpath=args.sockpath,
                                        shell_mode=True,
                                        timeout=args.timeout)
        except OSError as e:
            end_session('GMP CRITICAL:  %s: %s' % (str(e), args.sockpath),
                        NAGIOS_CRITICAL)

    elif 'tls' in args.connection_type:
        try:
            return TLSConnection(hostname=args.hostname,
                                 port=args.port,
                                 timeout=args.timeout,
                                 shell_mode=True)
        except OSError as e:
            end_session(
                'GMP CRITICAL:  %s: Host: %s Port: %s' %
                (str(e), args.hostname, args.port), NAGIOS_CRITICAL)

    elif 'ssh' in args.connection_type:
        try:
            return SSHConnection(hostname=args.hostname,
                                 port=args.port,
                                 timeout=args.timeout,
                                 ssh_user=args.ssh_user,
                                 ssh_password='',
                                 shell_mode=True)
        except Exception as e:
            end_session(
                'GMP CRITICAL:  %s: Host: %s Port: %s' %
                (str(e), args.hostname, args.port), NAGIOS_CRITICAL)
Beispiel #8
0
class GMPTest(unittest.TestCase):
    hostname = 'localhost'
    CURRENT_VERSION = '8.0'
    AUTHENTICATION_ERR_MSG = 'Authentication failed'
    STATUS_TEXT_OK = 'OK'

    def setUp(self):
        warnings.simplefilter("ignore", ResourceWarning)
        self.gmp = SSHConnection(hostname=self.hostname,
                                 port=22,
                                 timeout=5,
                                 ssh_user='******',
                                 ssh_password='',
                                 shell_mode=True)

    def tearDown(self):
        self.gmp.close()

    def test_Authenticate_WrongUsernameAs1stParam_ExceptionThrown(self):
        with self.assertRaises(GMPError) as context:
            self.gmp.authenticate('amin', 'admin')

        self.assertEqual(self.AUTHENTICATION_ERR_MSG, str(context.exception))

    def test_Authenticate_WrongPasswordAs2stParam_ExceptionThrown(self):
        with self.assertRaises(GMPError) as context:
            self.gmp.authenticate('admin', 'admn')

        self.assertEqual(self.AUTHENTICATION_ERR_MSG, str(context.exception))

    def test_Authenticate_RightCredentialsWithCorrectCommand_CorrectVersionNumber(
            self):
        result = self.gmp.authenticate('admin', 'admin', '<get_version/>')
        version = result.xpath('get_version_response/version/text()')[0]

        self.assertEqual(self.CURRENT_VERSION, version)

    def test_Authenticate_RightCredentials_OKAsStatustext(self):

        result = self.gmp.authenticate('admin', 'admin')
        status_text = result.xpath('@status_text')[0]
        self.assertEqual(self.STATUS_TEXT_OK, status_text)
Beispiel #9
0
def main():

    parser = argparse.ArgumentParser(prog='gvm-cli',
                                     description=help_text,
                                     formatter_class=RawTextHelpFormatter,
                                     add_help=False,
                                     epilog="""
usage: gvm-cli [-h] [--version] [connection_type] ...
   or: gvm-cli connection_type --help""")

    subparsers = parser.add_subparsers(metavar='[connection_type]')
    subparsers.required = True
    subparsers.dest = 'connection_type'

    parser.add_argument('-h',
                        '--help',
                        action='help',
                        help='Show this help message and exit.')

    parent_parser = argparse.ArgumentParser(add_help=False)
    parent_parser.add_argument(
        '-c',
        '--config',
        nargs='?',
        const='~/.config/gvm-tools.conf',
        help='Configuration file path. Default: ~/.config/gvm-tools.conf')
    args, remaining_args = parent_parser.parse_known_args()

    defaults = {'gmp_username': '', 'gmp_password': ''}

    # Retrieve data from config file
    if args.config:
        try:
            config = configparser.SafeConfigParser()
            path = os.path.expanduser(args.config)
            config.read(path)
            defaults = dict(config.items('Auth'))
        except Exception as e:
            print(str(e))

    parent_parser.set_defaults(**defaults)

    parent_parser.add_argument(
        '--timeout',
        required=False,
        default=60,
        type=int,
        help='Wait <seconds> for response or if value -1, then wait '
        'continuously. Default: 60')
    parent_parser.add_argument(
        '--log',
        nargs='?',
        dest='loglevel',
        const='INFO',
        choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
        help='Activates logging. Default level: INFO.')
    parent_parser.add_argument('--gmp-username', help='GMP username.')
    parent_parser.add_argument('--gmp-password', help='GMP password.')
    parent_parser.add_argument('-X', '--xml', help='The XML request to send.')
    parent_parser.add_argument('infile',
                               nargs='?',
                               type=open,
                               default=sys.stdin)
    parser_ssh = subparsers.add_parser(
        'ssh',
        help='Use SSH connection for gmp service.',
        parents=[parent_parser])
    parser_ssh.add_argument('--hostname',
                            required=True,
                            help='Hostname or IP-Address.')
    parser_ssh.add_argument('--port',
                            required=False,
                            default=22,
                            help='Port. Default: 22.')
    parser_ssh.add_argument('--ssh-user',
                            default='gmp',
                            help='SSH Username. Default: gmp.')

    parser_tls = subparsers.add_parser(
        'tls',
        help='Use TLS secured connection for gmp service.',
        parents=[parent_parser])
    parser_tls.add_argument('--hostname',
                            required=True,
                            help='Hostname or IP-Address.')
    parser_tls.add_argument('--port',
                            required=False,
                            default=9390,
                            help='Port. Default: 9390.')

    parser_socket = subparsers.add_parser(
        'socket',
        help='Use UNIX-Socket connection for gmp service.',
        parents=[parent_parser])
    parser_socket.add_argument(
        '--sockpath',
        nargs='?',
        default='/usr/local/var/run/gvmd.sock',
        help='UNIX-Socket path. Default: /usr/local/var/run/gvmd.sock.')

    parser.add_argument(
        '-V',
        '--version',
        action='version',
        version='%(prog)s {version}'.format(version=__version__),
        help='Show program\'s version number and exit')

    args = parser.parse_args(remaining_args)

    # Sets the logging
    if args.loglevel is not None:
        level = logging.getLevelName(args.loglevel)
        logging.basicConfig(filename='gvm-cli.log', level=level)

    # If timeout value is -1, then the socket has no timeout for this session
    if args.timeout == -1:
        args.timeout = None

    xml = ''

    if args.xml is not None:
        xml = args.xml
    else:
        # If this returns False, then some data are in sys.stdin
        if not args.infile.isatty():
            try:
                xml = args.infile.read()
            except (EOFError, BlockingIOError) as e:
                print(e)

    # If no command was given, program asks for one
    if len(xml) == 0:
        xml = input()

    # Remove all newlines if the commands come from file
    xml = xml.replace('\n', '').replace('\r', '')

    # Ask for password if none are given
    if args.gmp_username and not args.gmp_password:
        args.gmp_password = getpass.getpass('Enter password for ' +
                                            args.gmp_username + ': ')

    # Open the right connection. SSH at last for default
    try:
        if 'socket' in args.connection_type:
            gvm = UnixSocketConnection(sockpath=args.sockpath,
                                       timeout=args.timeout)
        elif 'tls' in args.connection_type:
            gvm = TLSConnection(hostname=args.hostname,
                                port=9390,
                                timeout=args.timeout)
        else:
            gvm = SSHConnection(hostname=args.hostname,
                                port=args.port,
                                timeout=args.timeout,
                                ssh_user=args.ssh_user,
                                ssh_password='')
    except Exception as e:
        print(e)
        sys.exit(1)

    if args.gmp_username:
        gvm.authenticate(args.gmp_username, args.gmp_password)

    gvm.send(xml)

    result = gvm.read()
    print(result)
    gvm.close()

    sys.exit(0)
Beispiel #10
0
def main():
    parser = argparse.ArgumentParser(prog='gvm-pyshell',
                                     description=help_text,
                                     formatter_class=RawTextHelpFormatter,
                                     add_help=False,
                                     epilog="""
usage: gvm-pyshell [-h] [--version] [connection_type] ...
   or: gvm-pyshell connection_type --help""")
    subparsers = parser.add_subparsers(metavar='[connection_type]')
    subparsers.required = True
    subparsers.dest = 'connection_type'

    parser.add_argument('-h',
                        '--help',
                        action='help',
                        help='Show this help message and exit.')

    parent_parser = argparse.ArgumentParser(add_help=False)

    parent_parser.add_argument(
        '-c',
        '--config',
        nargs='?',
        const='~/.config/gvm-tools.conf',
        help='Configuration file path. Default: ~/.config/gvm-tools.conf')
    args_before, remaining_args = parent_parser.parse_known_args()

    defaults = {'gmp_username': '', 'gmp_password': ''}

    # Retrieve data from config file
    if args_before.config:
        try:
            config = configparser.SafeConfigParser()
            path = os.path.expanduser(args_before.config)
            config.read(path)
            defaults = dict(config.items('Auth'))
        except Exception as e:
            print(str(e))

    parent_parser.set_defaults(**defaults)

    parent_parser.add_argument(
        '--timeout',
        required=False,
        default=60,
        type=int,
        help='Wait <seconds> for response or if value -1, then wait '
        'continuously. Default: 60')
    parent_parser.add_argument(
        '--log',
        nargs='?',
        dest='loglevel',
        const='INFO',
        choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
        help='Activates logging. Default level: INFO.')
    parent_parser.add_argument('-i',
                               '--interactive',
                               action='store_true',
                               default=False,
                               help='Start an interactive Python shell.')
    parent_parser.add_argument('--gmp-username', help='GMP username.')
    parent_parser.add_argument('--gmp-password', help='GMP password.')
    parent_parser.add_argument(
        'script', nargs='*', help='Preload gmp script. Example: myscript.gmp.')

    parser_ssh = subparsers.add_parser(
        'ssh',
        help='Use SSH connection for gmp service.',
        parents=[parent_parser])
    parser_ssh.add_argument('--hostname',
                            required=True,
                            help='Hostname or IP-Address.')
    parser_ssh.add_argument('--port',
                            required=False,
                            default=22,
                            help='Port. Default: 22.')
    parser_ssh.add_argument('--ssh-user',
                            default='gmp',
                            help='SSH Username. Default: gmp.')

    parser_tls = subparsers.add_parser(
        'tls',
        help='Use TLS secured connection for gmp service.',
        parents=[parent_parser])
    parser_tls.add_argument('--hostname',
                            required=True,
                            help='Hostname or IP-Address.')
    parser_tls.add_argument('--port',
                            required=False,
                            default=9390,
                            help='Port. Default: 9390.')

    parser_socket = subparsers.add_parser(
        'socket',
        help='Use UNIX-Socket connection for gmp service.',
        parents=[parent_parser])
    parser_socket.add_argument(
        '--sockpath',
        nargs='?',
        default='/usr/local/var/run/gvmd.sock',
        help='UNIX-Socket path. Default: /usr/local/var/run/gvmd.sock.')

    parser.add_argument(
        '-V',
        '--version',
        action='version',
        version='%(prog)s {version}'.format(version=__version__),
        help='Show program\'s version number and exit')

    global args
    args = parser.parse_args(remaining_args)

    # Sets the logging
    if args.loglevel is not None:
        level = logging.getLevelName(args.loglevel)
        logging.basicConfig(filename='gvm-pyshell.log', level=level)

    # If timeout value is -1, then the socket has no timeout for this session
    if args.timeout == -1:
        args.timeout = None

    # Open the right connection. SSH at last for default
    global gmp
    if 'socket' in args.connection_type:
        try:
            gmp = UnixSocketConnection(sockpath=args.sockpath,
                                       shell_mode=True,
                                       timeout=args.timeout)
        except OSError as e:
            print('{0}: {1}'.format(e, args.sockpath))
            sys.exit(1)

    elif 'tls' in args.connection_type:
        try:
            gmp = TLSConnection(hostname=args.hostname,
                                port=args.port,
                                timeout=args.timeout,
                                shell_mode=True)
        except OSError as e:
            print('{0}: Host: {1} Port: {2}'.format(e, args.hostname,
                                                    args.port))
            sys.exit(1)
    else:
        try:
            gmp = SSHConnection(hostname=args.hostname,
                                port=args.port,
                                timeout=args.timeout,
                                ssh_user=args.ssh_user,
                                ssh_password='',
                                shell_mode=True)
        except Exception as e:
            print('{0}: Host: {1} Port: {2}'.format(e, args.hostname,
                                                    args.port))
            sys.exit(1)

    # Ask for login credentials if none are given
    if not args.gmp_username:
        while True:
            args.gmp_username = input('Enter username: '******'Enter password for ' +
                                            args.gmp_username + ': ')

    try:
        gmp.authenticate(args.gmp_username, args.gmp_password)
    except Exception as e:
        print('Please check your credentials!')
        print(e)
        sys.exit(1)

    with_script = args.script and len(args.script) > 0
    no_script_no_interactive = not args.interactive and not with_script
    script_and_interactive = args.interactive and with_script
    only_interactive = not with_script and args.interactive
    only_script = not args.interactive and with_script

    if no_script_no_interactive:
        enterInteractiveMode()

    if only_interactive:
        enterInteractiveMode()

    if script_and_interactive:
        load(args.script[0])
        enterInteractiveMode()

    if only_script:
        load(args.script[0])

    gmp.close()
Beispiel #11
0
def main():
    parser = argparse.ArgumentParser(prog='gvm-dialog',
                                     add_help=False,
                                     epilog="""
usage: gvm-dialog [-h] [--version] [connection_type] ...
   or: gvm-dialog connection_type --help""")
    subparsers = parser.add_subparsers(metavar='[connection_type]')
    subparsers.required = True
    subparsers.dest = 'connection_type'

    parser.add_argument('-h',
                        '--help',
                        action='help',
                        help='Show this help message and exit.')

    parent_parser = argparse.ArgumentParser(add_help=False)
    parent_parser.add_argument(
        '--timeout',
        required=False,
        default=60,
        type=int,
        help='Wait <seconds> for response or if value -1, then wait '
        'continuously. Default: 60')
    parent_parser.add_argument(
        '--log',
        nargs='?',
        dest='loglevel',
        const='INFO',
        choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
        help='Activates logging. Default level: INFO.')
    parent_parser.add_argument('-i',
                               '--interactive',
                               action='store_true',
                               default=False,
                               help='Start an interactive Python shell.')
    parent_parser.add_argument('--gmp-username', help='GMP username.')
    parent_parser.add_argument('--gmp-password', help='GMP password.')

    parser_ssh = subparsers.add_parser(
        'ssh',
        help='Use SSH connection for gmp service.',
        parents=[parent_parser])
    parser_ssh.add_argument('--hostname',
                            required=True,
                            help='Hostname or IP-Address.')
    parser_ssh.add_argument('--port',
                            required=False,
                            default=22,
                            help='Port. Default: 22.')
    parser_ssh.add_argument('--ssh-user',
                            default='gmp',
                            help='SSH Username. Default: gmp.')

    parser_tls = subparsers.add_parser(
        'tls',
        help='Use TLS secured connection for gmp service.',
        parents=[parent_parser])
    parser_tls.add_argument('--hostname',
                            required=True,
                            help='Hostname or IP-Address.')
    parser_tls.add_argument('--port',
                            required=False,
                            default=9390,
                            help='Port. Default: 9390.')

    parser_socket = subparsers.add_parser(
        'socket',
        help='Use UNIX-Socket connection for gmp service.',
        parents=[parent_parser])
    parser_socket.add_argument(
        '--sockpath',
        nargs='?',
        default='/usr/local/var/run/gvmd.sock',
        help='UNIX-Socket path. Default: /usr/local/var/run/gvmd.sock.')

    parser.add_argument(
        '-V',
        '--version',
        action='version',
        version='%(prog)s {version}'.format(version=__version__),
        help='Show program\'s version number and exit')

    args = parser.parse_args()

    # Sets the logging
    if args.loglevel is not None:
        level = logging.getLevelName(args.loglevel)
        logging.basicConfig(filename='gvm-dialog.log', level=level)

    # If timeout value is -1, then the socket has no timeout for this session
    if args.timeout == -1:
        args.timeout = None

    # Open the right connection. SSH at last for default
    global gmp
    if 'socket' in args.connection_type:
        try:
            gmp = UnixSocketConnection(sockpath=args.sockpath,
                                       shell_mode=True,
                                       timeout=args.timeout)
        except OSError as e:
            print('{0}: {1}'.format(e, args.sockpath))
            sys.exit(1)

    elif 'tls' in args.connection_type:
        try:
            gmp = TLSConnection(hostname=args.hostname,
                                port=args.port,
                                timeout=args.timeout,
                                shell_mode=True)
        except OSError as e:
            print('{0}: Host: {1} Port: {2}'.format(e, args.hostname,
                                                    args.port))
            sys.exit(1)
    else:
        try:
            gmp = SSHConnection(hostname=args.hostname,
                                port=args.port,
                                timeout=args.timeout,
                                ssh_user=args.ssh_user,
                                ssh_password='',
                                shell_mode=True)
        except Exception as e:
            print('{0}: Host: {1} Port: {2}'.format(e, args.hostname,
                                                    args.port))
            sys.exit(1)

    d = Dialog(dialog="dialog")
    # Dialog.set_background_title() requires pythondialog 2.13 or later
    d.set_background_title("gvm-dialog")

    code, credentials = d.mixedform(
        'Please enter credentials:',
        [
            # ('Hostname', 1, 1, '127.0.0.1', 1, 20, 15, 32, 0),
            ('Username', 1, 1, '', 1, 20, 15, 32, 0),
            ('Password', 2, 1, '', 2, 20, 15, 32, 1)
        ],
        insecure=True)

    gmp.authenticate(credentials[0], credentials[1])

    code, tag = d.menu("What do you want to do?",
                       choices=[("(1)", "Show Tasks"), ("(2)", "Exit")])
    if code == d.OK:
        # 'tag' is now either "(1)" or "(2)"

        if tag in '(1)':

            task_list = gmp.get_tasks()
            names = []
            tasks = dict()

            for task in task_list.xpath('task'):
                name = task.xpath('name/text()')[0]
                names.append((name, ''))
                tasks[name] = etree.tostring(task,
                                             pretty_print=True).decode('utf-8')

            while (True):
                code, tag = d.menu("Tasks", choices=names)

                if 'cancel' in code:
                    break
                d.msgbox(tasks[tag], 60, 90)
        else:
            pass

    gmp.close()
Beispiel #12
0
    def testCheckInvalidCommandStatus(self):
        gmp = SSHConnection(hostname=self.hostname,
                            port=22,
                            timeout=5,
                            ssh_user='******',
                            ssh_password='',
                            shell_mode=False)

        xml_invalid = '<get_version_response status="400" status_text="ERROR">\
<version>8.0</version></get_version_response>'

        try:
            gmp.checkCommandStatus(xml_invalid)
        except GMPError as e:
            self.assertEqual(str(e), 'ERROR')

        try:
            gmp.checkCommandStatus(0)
        except GMPError as e:
            self.assertEqual(str(e), 'XML Command is empty')

        try:
            gmp.checkCommandStatus(None)
        except GMPError as e:
            self.assertEqual(str(e), 'XML Command is empty')

        try:
            gmp.checkCommandStatus('')
        except Exception as e:
            self.assertIsInstance(e, lxml.etree.XMLSyntaxError)
        gmp.close()