From 1bd3941798291b7b595a131c46803d1dd5f82337 Mon Sep 17 00:00:00 2001 From: Daniel <59575049+lumijiez@users.noreply.github.com> Date: Fri, 13 Dec 2024 00:41:36 +0200 Subject: [PATCH] working FTP --- SymphonyManager/pom.xml | 5 + .../java/io/github/lumijiez/FTPFetcher.java | 80 +++++++++++++++ .../main/java/io/github/lumijiez/Main.java | 2 + SymphonyProducer/pom.xml | 5 + .../github/lumijiez/FTPClientConnector.java | 98 +++++++++++++++++++ .../main/java/io/github/lumijiez/Main.java | 13 ++- docker-compose.yml | 16 +++ 7 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 SymphonyManager/src/main/java/io/github/lumijiez/FTPFetcher.java create mode 100644 SymphonyProducer/src/main/java/io/github/lumijiez/FTPClientConnector.java diff --git a/SymphonyManager/pom.xml b/SymphonyManager/pom.xml index f24c54e..07a78bc 100644 --- a/SymphonyManager/pom.xml +++ b/SymphonyManager/pom.xml @@ -49,6 +49,11 @@ logback-classic 1.4.12 + + commons-net + commons-net + 3.11.1 + ch.qos.logback diff --git a/SymphonyManager/src/main/java/io/github/lumijiez/FTPFetcher.java b/SymphonyManager/src/main/java/io/github/lumijiez/FTPFetcher.java new file mode 100644 index 0000000..307a0a6 --- /dev/null +++ b/SymphonyManager/src/main/java/io/github/lumijiez/FTPFetcher.java @@ -0,0 +1,80 @@ +package io.github.lumijiez; + +import org.apache.commons.net.ftp.FTPClient; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Timer; +import java.util.TimerTask; + +public class FTPFetcher { + String ftpServer = "ftp_server"; + int ftpPort = 21; + String ftpUser = "symphony"; + String ftpPass = "symphony"; + String ftpDir = "/uploads"; + + public FTPFetcher() { + Timer timer = new Timer(); + timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + fetchAndDeleteFilesFromFtp(ftpServer, ftpPort, ftpUser, ftpPass, ftpDir); + } + }, 0, 5000); + } + + public static void fetchAndDeleteFilesFromFtp(String ftpServer, int ftpPort, String ftpUser, String ftpPass, String ftpDir) { + FTPClient ftpClient = new FTPClient(); + + try { + ftpClient.connect(ftpServer, ftpPort); + ftpClient.setControlKeepAliveTimeout(300); + boolean login = ftpClient.login(ftpUser, ftpPass); + if (!login) { + System.out.println("FTP login failed."); + return; + } + + ftpClient.enterLocalPassiveMode(); + ftpClient.changeWorkingDirectory(ftpDir); + + String[] fileNames = ftpClient.listNames(); + if (fileNames == null || fileNames.length == 0) { + System.out.println("No files found in the directory."); + return; + } + + for (String fileName : fileNames) { + File localFile = new File("downloaded_" + fileName); + try (FileOutputStream fos = new FileOutputStream(localFile)) { + boolean success = ftpClient.retrieveFile(fileName, fos); + if (success) { + System.out.println("File downloaded: " + localFile.getName()); + } else { + System.out.println("Failed to download the file: " + fileName); + } + } + + boolean deleted = ftpClient.deleteFile(fileName); + if (deleted) { + System.out.println("File deleted from FTP server: " + fileName); + } else { + System.out.println("Failed to delete the file from FTP server: " + fileName); + } + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (ftpClient.isConnected()) { + ftpClient.logout(); + ftpClient.disconnect(); + } + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } +} diff --git a/SymphonyManager/src/main/java/io/github/lumijiez/Main.java b/SymphonyManager/src/main/java/io/github/lumijiez/Main.java index 0ab2345..12e1e2f 100644 --- a/SymphonyManager/src/main/java/io/github/lumijiez/Main.java +++ b/SymphonyManager/src/main/java/io/github/lumijiez/Main.java @@ -12,6 +12,8 @@ public class Main { public static void main(String[] args) { new Thread(BrokerConnector::connect, "RabbitMQ-Connection").start(); + new Thread(FTPFetcher::new, "FTP-Fetcher").start(); + Javalin app = Javalin.create(config -> { config.jsonMapper(new JavalinGson()); config.jetty.modifyWebSocketServletFactory(wsFactoryConfig -> { diff --git a/SymphonyProducer/pom.xml b/SymphonyProducer/pom.xml index c6c6c50..5fc09f7 100644 --- a/SymphonyProducer/pom.xml +++ b/SymphonyProducer/pom.xml @@ -15,6 +15,11 @@ amqp-client 5.23.0 + + commons-net + commons-net + 3.11.1 + com.google.code.gson diff --git a/SymphonyProducer/src/main/java/io/github/lumijiez/FTPClientConnector.java b/SymphonyProducer/src/main/java/io/github/lumijiez/FTPClientConnector.java new file mode 100644 index 0000000..0e43f1b --- /dev/null +++ b/SymphonyProducer/src/main/java/io/github/lumijiez/FTPClientConnector.java @@ -0,0 +1,98 @@ +package io.github.lumijiez; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import org.apache.commons.net.ftp.FTPClient; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Random; +import java.util.Timer; +import java.util.TimerTask; + +public class FTPClientConnector { + String ftpServer = "ftp_server"; + int ftpPort = 21; + String ftpUser = "symphony"; + String ftpPass = "symphony"; + String ftpDir = "/"; + + FTPClientConnector() { + Timer timer = new Timer(); + timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + uploadRandomJsonToFtp(ftpServer, ftpPort, ftpUser, ftpPass, ftpDir); + } + }, 0, 30000); + } + + public static void uploadRandomJsonToFtp(String ftpServer, int ftpPort, String ftpUser, String ftpPass, String ftpDir) { + JsonObject json = generateRandomJson(); + + Gson gson = new Gson(); + String jsonString = gson.toJson(json); + InputStream inputStream = new ByteArrayInputStream(jsonString.getBytes()); + + FTPClient ftpClient = new FTPClient(); + try { + ftpClient.connect(ftpServer, ftpPort); + boolean login = ftpClient.login(ftpUser, ftpPass); + if (!login) { + System.out.println("FTP login failed."); + return; + } + + ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); + ftpClient.enterLocalPassiveMode(); + + String subDir = "uploads"; + if (!ftpClient.changeWorkingDirectory(subDir)) { + System.out.println("Subdirectory does not exist. Creating: " + subDir); + boolean dirCreated = ftpClient.makeDirectory(subDir); + if (!dirCreated) { + System.out.println("Failed to create subdirectory: " + subDir); + System.out.println("Server reply: " + ftpClient.getReplyString()); + return; + } + ftpClient.changeWorkingDirectory(subDir); + } + + String filename = "file_" + System.currentTimeMillis() + ".json"; + boolean uploaded = ftpClient.storeFile(filename, inputStream); + if (uploaded) { + System.out.println("Successfully uploaded: " + filename); + } else { + System.out.println("Failed to upload: " + filename); + System.out.println("Server reply: " + ftpClient.getReplyString()); + } + + ftpClient.logout(); + } catch (IOException e) { + System.out.println("Error during FTP operation: " + e.getMessage()); + e.printStackTrace(); + } finally { + try { + inputStream.close(); + if (ftpClient.isConnected()) { + ftpClient.disconnect(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public static JsonObject generateRandomJson() { + Random rand = new Random(); + JsonObject json = new JsonObject(); + + json.addProperty("id", rand.nextInt(1000)); + json.addProperty("name", "RandomUser" + rand.nextInt(1000)); + json.addProperty("email", "user" + rand.nextInt(1000) + "@example.com"); + json.addProperty("active", rand.nextBoolean()); + + return json; + } +} diff --git a/SymphonyProducer/src/main/java/io/github/lumijiez/Main.java b/SymphonyProducer/src/main/java/io/github/lumijiez/Main.java index 07409b3..7a067c9 100644 --- a/SymphonyProducer/src/main/java/io/github/lumijiez/Main.java +++ b/SymphonyProducer/src/main/java/io/github/lumijiez/Main.java @@ -3,6 +3,17 @@ package io.github.lumijiez; public class Main { public static void main(String[] args) { - BrokerConnector.connect(); + Thread brokerThread = new Thread(BrokerConnector::connect); + brokerThread.start(); + + Thread ftpThread = new Thread(FTPClientConnector::new); + ftpThread.start(); + + try { + brokerThread.join(); + ftpThread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } } } \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 8af3b3f..4656c5a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -207,8 +207,24 @@ services: - symphony-network restart: always + ftp_server: + image: stilliard/pure-ftpd:hardened + container_name: ftp_server + ports: + - "21:21" + - "30000-30009:30000-30009" + environment: + FTP_USER_NAME: symphony + FTP_USER_PASS: symphony + FTP_USER_HOME: /home/symphony + networks: + - symphony-network + volumes: + - ftp_data:/home/symphony + volumes: grafana-storage: + ftp_data: networks: symphony-network: