Skip to content
This repository was archived by the owner on Apr 1, 2025. It is now read-only.

Commit 4193592

Browse files
committed
adding ftp interface
1 parent 7eeca09 commit 4193592

File tree

1 file changed

+118
-105
lines changed

1 file changed

+118
-105
lines changed

Solution/app.py

Lines changed: 118 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -6,116 +6,129 @@
66

77
def execute_command():
88
command = st.session_state.command_input.strip()
9-
if command:
10-
# Procesar el comando
11-
cmd_parts = command.split()
12-
cmd = cmd_parts[0].upper()
13-
args = cmd_parts[1:] if len(cmd_parts) > 1 else []
14-
15-
try:
16-
if cmd in ["LIST", "RETR", "STOR", "APPE", "NLST"]:
17-
# Enviar el comando PASV y obtener la respuesta
18-
response = st.session_state.ftp_client.send_command("PASV")
19-
st.session_state.client_responses.insert(0, response)
20-
21-
if not response.startswith("227"):
22-
st.session_state.client_responses.insert(0, "Error: No se pudo entrar en modo pasivo")
23-
else:
24-
# Extraer la dirección IP y el puerto de la respuesta
25-
match = re.search(r'(\d+),(\d+),(\d+),(\d+),(\d+),(\d+)', response)
26-
if not match:
27-
st.session_state.client_responses.insert(0, "Error: No se pudo extraer la dirección IP y el puerto")
28-
else:
29-
# Construir la dirección IP y el puerto
30-
ip = ".".join(match.groups()[:4])
31-
port = (int(match.group(5)) << 8) + int(match.group(6))
32-
33-
# Crear un nuevo socket para la conexión de datos
34-
data_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
35-
data_sock.connect((ip, port))
36-
37-
try:
38-
if cmd == "LIST" or cmd == "NLST":
39-
path = args[0] if args else '.'
40-
response = st.session_state.ftp_client.send_command_multiresponse(cmd, path)
41-
st.session_state.client_responses.insert(0, response)
42-
if "150" in response:
43-
data = data_sock.recv(8192).decode()
44-
st.session_state.client_responses.insert(0, data)
45-
data_sock.close() # Cerrar el socket de datos
46-
47-
elif cmd in ["RETR", "STOR", "APPE"]:
48-
if len(args) < 1:
49-
st.session_state.client_responses.insert(0, f"Uso: {cmd} <filename>")
50-
else:
51-
filename = args[0]
52-
if cmd == "STOR":
53-
if os.path.exists(filename):
54-
response = st.session_state.ftp_client.send_stor_command(data_sock, "STOR", filename)
55-
st.session_state.client_responses.insert(0, response)
56-
else:
57-
st.session_state.client_responses.insert(0, "Archivo no encontrado")
58-
59-
elif cmd == "RETR":
60-
response = st.session_state.ftp_client.send_command_multiresponse("RETR", filename)
61-
st.session_state.client_responses.insert(0, response)
62-
if "150" in response:
63-
if st.session_state.ftp_client.receive_file(data_sock, filename):
64-
st.session_state.client_responses.insert(0, "Archivo recibido exitosamente")
65-
else:
66-
st.session_state.client_responses.insert(0, "Error al recibir archivo")
67-
68-
elif cmd == "APPE":
69-
if os.path.exists(filename):
70-
response = st.session_state.ftp_client.send_stor_command(data_sock, "APPE", filename)
71-
st.session_state.client_responses.insert(0, response)
72-
else:
73-
st.session_state.client_responses.insert(0, "Archivo no encontrado")
74-
finally:
75-
data_sock.close() # Cerrar el socket de datos
76-
77-
# Manejo de comandos que no requieren modo pasivo
78-
else:
79-
response = st.session_state.ftp_client.send_command(cmd, *args)
80-
st.session_state.client_responses.insert(0, response)
81-
if cmd == "QUIT":
82-
st.session_state.client_responses.insert(0, "Conexión cerrada.")
83-
st.session_state.ftp_client.close()
9+
if not command:
10+
return
11+
12+
cmd_parts = command.split()
13+
cmd = cmd_parts[0].upper()
14+
args = cmd_parts[1:] if len(cmd_parts) > 1 else []
15+
16+
try:
17+
if cmd in ["LIST", "RETR", "STOR", "APPE", "NLST"]:
18+
handle_passive_commands(cmd, args)
19+
else:
20+
handle_non_passive_commands(cmd, args)
21+
except Exception as e:
22+
st.session_state.client_responses.insert(0, f"Error: {e}")
23+
24+
def handle_passive_commands(cmd, args):
25+
response = st.session_state.ftp_client.sendCommand("PASV")
26+
st.session_state.client_responses.insert(0, response)
27+
28+
if not response.startswith("227"):
29+
st.session_state.client_responses.insert(0, "Error: No se pudo entrar en modo pasivo")
30+
return
31+
32+
match = re.search(r'(\d+),(\d+),(\d+),(\d+),(\d+),(\d+)', response)
33+
if not match:
34+
st.session_state.client_responses.insert(0, "Error: No se pudo extraer la dirección IP y el puerto")
35+
return
8436

85-
except Exception as e:
86-
st.session_state.client_responses.insert(0, f"Error: {e}")
37+
ip = ".".join(match.groups()[:4])
38+
port = (int(match.group(5)) << 8) + int(match.group(6))
39+
40+
data_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
41+
data_sock.connect((ip, port))
42+
43+
try:
44+
if cmd in ["LIST", "NLST"]:
45+
handle_list_commands(cmd, args, data_sock)
46+
elif cmd in ["RETR", "STOR", "APPE"]:
47+
handle_file_transfer_commands(cmd, args, data_sock)
48+
finally:
49+
data_sock.close()
50+
51+
def handle_list_commands(cmd, args, data_sock):
52+
path = args[0] if args else '.'
53+
response = st.session_state.ftp_client.send_command_multiresponse(cmd, path)
54+
st.session_state.client_responses.insert(0, response)
55+
if "150" in response:
56+
data = data_sock.recv(8192).decode()
57+
st.session_state.client_responses.insert(0, data)
58+
59+
def handle_file_transfer_commands(cmd, args, data_sock):
60+
if len(args) < 1:
61+
st.session_state.client_responses.insert(0, f"Uso: {cmd} <filename>")
62+
return
63+
64+
filename = args[0]
65+
if cmd == "STOR":
66+
if os.path.exists(filename):
67+
response = st.session_state.ftp_client.send_stor_command(data_sock, "STOR", filename)
68+
st.session_state.client_responses.insert(0, response)
69+
else:
70+
st.session_state.client_responses.insert(0, "Archivo no encontrado")
71+
elif cmd == "RETR":
72+
response = st.session_state.ftp_client.send_command_multiresponse("RETR", filename)
73+
st.session_state.client_responses.insert(0, response)
74+
if "150" in response:
75+
if st.session_state.ftp_client.receive_file(data_sock, filename):
76+
st.session_state.client_responses.insert(0, "Archivo recibido exitosamente")
77+
else:
78+
st.session_state.client_responses.insert(0, "Error al recibir archivo")
79+
elif cmd == "APPE":
80+
if os.path.exists(filename):
81+
response = st.session_state.ftp_client.send_stor_command(data_sock, "APPE", filename)
82+
st.session_state.client_responses.insert(0, response)
83+
else:
84+
st.session_state.client_responses.insert(0, "Archivo no encontrado")
8785

86+
def handle_non_passive_commands(cmd, args):
87+
response = st.session_state.ftp_client.sendCommand(cmd, *args)
88+
st.session_state.client_responses.insert(0, response)
89+
if cmd == "QUIT":
90+
st.session_state.client_responses.insert(0, "Conexión cerrada.")
91+
st.session_state.ftp_client.close()
8892

8993
def main():
90-
st.title("FTP Client Interface")
91-
92-
host = st.text_input("FTP Server Host", "0.0.0.0")
93-
port = st.number_input("FTP Server Port", 21)
94-
95-
if st.button("Connect"):
96-
client = FTPClient(host, port)
97-
try:
98-
client.initialize()
99-
st.success("Connected to FTP server")
100-
except Exception as e:
101-
st.error(f"Connection failed: {e}")
102-
return
103-
104-
command = st.text_input("Enter FTP Command")
105-
if st.button("Send Command"):
106-
try:
107-
# response = client.sendCommand(command)
108-
execute_command
109-
# st.text_area("Response", response)
110-
# if 'client_responses' in st.session_state:
111-
st.text_area("Respuestas:", value="\n".join(st.session_state.client_responses))
112-
except Exception as e:
113-
st.error(f"Error sending command: {e}")
114-
94+
st.title("Cliente FTP")
95+
96+
if 'ftp_client' not in st.session_state:
97+
st.session_state.ftp_client = FTPClient("0.0.0.0",21) # Crea una instancia del cliente FTP
98+
st.session_state.ftp_client.initialize() # Inicia la conexión FTP
99+
100+
# Inicializar el valor del campo de texto si no existe
101+
if 'command_input' not in st.session_state:
102+
st.session_state.command_input = ""
115103

116-
if st.button("Disconnect"):
117-
client.finish()
118-
st.success("Disconnected from FTP server")
104+
# Inicializar la lista de respuestas si no existe
105+
if 'client_responses' not in st.session_state:
106+
st.session_state.client_responses = []
107+
108+
109+
# Crear dos columnas
110+
col1, col2 = st.columns(2)
119111

112+
with col1:
113+
# Entrada de comandos
114+
st.text_input(
115+
"Ingrese un comando FTP:",
116+
key="command_input",
117+
on_change=execute_command, # Ejecutar el comando al presionar Enter
118+
)
119+
if st.button("Borrar comando"):
120+
st.session_state.command_input = ""
121+
122+
123+
with col2:
124+
# Mostrar respuestas
125+
if 'client_responses' in st.session_state:
126+
st.text_area("Respuestas:", value="\n".join(st.session_state.client_responses), height=300)
127+
128+
if st.button("Resetear respuestas"):
129+
st.session_state.client_responses = []
130+
120131
if __name__ == "__main__":
121132
main()
133+
134+
baseDirectoryForDownloads = "/Users/mauriciosundejimenez/ProyectoFinalFTP/computer_networks_fall_2024/Solution"

0 commit comments

Comments
 (0)