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