Python-GVM | i can't init a instance of gvm

Hi everyone,

I coded the following:

import sys
from argparse import ArgumentParser, Namespace, RawTextHelpFormatter

from gvm.connections import UnixSocketConnection  # Importa la clase UnixSocketConnection desde gvm.connections
from gvm.protocols.gmp import Gmp  # Importa la clase Gmp desde gvm.protocols.gmp
from gvmtools.helper import Table  # Importa la clase Table desde gvmtools.helper
from gvm.errors import GvmError  # Importa la clase GvmError desde gvm.errors


class GvmdClient:
    def __init__(self, socket, username, password):
        """
        Inicializa la clase GvmdClient.

        Args:
        - socket (str): Ruta al socket de Unix para la conexión con GVMD.
        - username (str): Nombre de usuario para autenticarse en GVMD.
        - password (str): Contraseña para autenticarse en GVMD.
        """
        self.socket = socket
        self.username = username
        self.password = password
        self.gmp = None  # Inicializa como None; se asignará una instancia de Gmp después de la conexión
    
    def connect(self):
        """
        Establece la conexión con GVMD y autentica al usuario.

        Raises:
        - GvmError: Si ocurre un error durante la conexión o autenticación.
        """
        connection = UnixSocketConnection(path=self.socket)  # Crea una conexión UnixSocketConnection
        
        try:
            with Gmp(connection) as gmp:  # Crea una instancia de Gmp y la usa dentro de un contexto 'with'
                if gmp.is_connected():  # Verifica si la conexión con Gmp está establecida
                    print("\nConnection successfully established with GVMD.\n")
                    gmp.authenticate(self.username, self.password)  # Intenta autenticarse con el nombre de usuario y la contraseña
                    print(f"Connected as {self.username}\n")  # Imprime un mensaje de conexión exitosa
                    self.gmp = gmp  # Guarda la instancia de Gmp para su uso posterior
        except GvmError as e:
            # Maneja errores específicos que pueden ocurrir durante la conexión o autenticación
            if "Failed to connect" in str(e):
                print(f"Failed to connect: {e}")
            elif "AuthenticationError" in str(e):
                print(f"Authentication failed: {e}")
            elif "ConnectionError" in str(e):
                print(f"Connection error: {e}")
            else:
                print(f"An unknown error occurred during connection: {e}")
            raise  # Eleva la excepción para manejarla en niveles superiores

    def get_reports_list(self):
        """
        Obtiene la lista de informes disponibles desde GVMD.

        Returns:
        - response (list): Lista de informes obtenidos.

        Raises:
        - Exception: Si no está conectado a GVMD. Conectar primero.
        - GvmError: Si ocurre un error al obtener los informes.
        """
        if not self.gmp:
            raise Exception("Not connected. Please connect first.")
        
        try:
            response = self.gmp.get_reports()  # Intenta obtener la lista de informes utilizando Gmp
            return response  # Devuelve la respuesta obtenida
        except GvmError as e:
            # Maneja errores específicos que pueden ocurrir al intentar obtener los informes
            print(f"Error fetching reports: {e}")
            if "RemoteException" in str(e):
                print(f"Remote exception occurred: {e}")
            elif "MissingElementError" in str(e):
                print(f"Missing element in the response: {e}")
            elif "XmlError" in str(e):
                print(f"XML error occurred: {e}")
            else:
                print(f"An unknown error occurred: {e}")
            raise  # Eleva la excepción para manejarla en niveles superiores
        

def main():
    """
    Función principal para la ejecución del programa.
    """
    path = ''  # Ruta al socket de Unix de GVMD
    username = ''  # Nombre de usuario para autenticación en GVMD
    password = ''  # Contraseña para autenticación en GVMD
    
    client = GvmdClient(socket=path, username=username, password=password)

    try:
        client.connect()
        reports = client.get_reports_list()
        if reports:
            print("Available Reports:")
    except (GvmError) as e:
        print(f"An error occurred: {e}")

if __name__ == "__main__":
    main()
        

but when i try run this, the message is clear:

<gmp_response status="400" status_text="Only command GET_VERSION is allowed before AUTHENTICATE"/>

Why is this happening? Can somebody help me? please

For using python-gvm, you should start here at the introduction and read carefully. Quite simply, the GET_VERSION function is the only command that can be executed without authentication. How to authenticate is stated in the documentation here.

1 Like