diff --git a/pom.xml b/pom.xml index 6b6b208..3e16ee4 100644 --- a/pom.xml +++ b/pom.xml @@ -14,6 +14,111 @@ UTF-8 + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + ${maven.compiler.source} + ${maven.compiler.target} + + + + org.apache.maven.plugins + maven-shade-plugin + 1.4 + + + package + + shade + + + + + + + *:* + + module-info.class + JDOMAbout*class + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + + ru.kirillius.mktbk.App + + + + true + + shaded + + + + + + com.akathist.maven.plugins.launch4j + launch4j-maven-plugin + 2.1.2 + + + l4j-wrapper + package + + launch4j + + + console + https://aws.amazon.com/ru/corretto/ + target/mktbk.exe + + ${project.build.directory}/${project.artifactId}-${project.version}-shaded.jar + + + + ru.kirillius.mktbk.App + false + anything + + + + ./data + ${maven.compiler.source} + + + + + ${project.version} + ${project.version} + mktbk + copy left + ${project.version} + ${project.version} + mktbk + Y U SO SRS? + mktbk + mktbk.exe + ENGLISH_US + + + + + + + + + + + kirillius diff --git a/src/main/java/ru/kirillius/mktbk/App.java b/src/main/java/ru/kirillius/mktbk/App.java index 928e68b..f3d8461 100644 --- a/src/main/java/ru/kirillius/mktbk/App.java +++ b/src/main/java/ru/kirillius/mktbk/App.java @@ -1,14 +1,12 @@ package ru.kirillius.mktbk; import me.legrange.mikrotik.MikrotikApiException; -import net.schmizz.sshj.sftp.SFTPException; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; import org.apache.commons.compress.archivers.tar.TarConstants; import ru.kirillius.utils.logging.SystemLogger; import java.io.*; -import java.rmi.RemoteException; import java.util.Collections; import java.util.List; import java.util.logging.Level; @@ -115,10 +113,10 @@ public class App { var layerFile = new File(container.getGuid()); var outputFile = new File("backup_of_" + container.getComment() + ".tar"); - if (!layerFile.exists()) { - var files = findFiles(container); - downloadFiles(container, files, layerFile); - } + + var files = findFiles(container); + downloadFiles(container, files, layerFile); + SystemLogger.message("Building docker image " + outputFile.getName(), LOG_CONTEXT); var builder = new DockerImageBuilder(container); @@ -141,10 +139,11 @@ public class App { } private void downloadFiles(ContainerMetadata container, List files, File outputFile) throws IOException { + SystemLogger.message("Building image layer from remote files", LOG_CONTEXT); var sftp = deviceContext.getSftpClient(); try (var outputStream = new FileOutputStream(outputFile)) { try (var tar = new TarArchiveOutputStream(outputStream)) { - tar.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); + tar.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX); var status = new DownloadStatus("Downloading", files.size()); for (var file : files) { try { @@ -190,26 +189,14 @@ public class App { private List findFiles(ContainerMetadata container) throws IOException, InterruptedException { SystemLogger.message("Reading container filesystem metadata...", LOG_CONTEXT); - var filterContents = List.of("/sys/", "/proc/", "/dev/", "/mnt/", "/run/", "/tmp/"); - var files = deviceContext.listFilesystem(container).stream().filter(f -> filterContents.contains(f.getPath()) || filterContents.stream().noneMatch(s -> f.getPath().startsWith(s))).toList(); + var systemDirs = List.of("/sys/", "/proc/", "/dev/", "/mnt/", "/run/", "/tmp/"); + var filterFiles = List.of("/.type"); + var files = deviceContext.listFilesystem(container).stream().filter(fileMetadata -> !filterFiles.contains(fileMetadata.getPath())).filter(f -> systemDirs.contains(f.getPath()) || systemDirs.stream().noneMatch(s -> f.getPath().startsWith(s))).toList(); SystemLogger.message("Found " + files.size() + " files", LOG_CONTEXT); return files; } -// private void openSSH() throws TransportException, ConnectionException { -// session = client.startSession(); -// } - - -// private void openSFTP() throws IOException { -// sftpClient = client.newSFTPClient(); -// for (var info : sftpClient.ls("/")) { -// System.out.println(info.getPath()); -// } -// -// } - private DeviceContext deviceContext; private void auth() { diff --git a/src/main/java/ru/kirillius/mktbk/DeviceContext.java b/src/main/java/ru/kirillius/mktbk/DeviceContext.java index d609578..d2db4d7 100644 --- a/src/main/java/ru/kirillius/mktbk/DeviceContext.java +++ b/src/main/java/ru/kirillius/mktbk/DeviceContext.java @@ -8,11 +8,10 @@ import net.schmizz.sshj.sftp.SFTPClient; import net.schmizz.sshj.transport.verification.PromiscuousVerifier; import ru.kirillius.utils.logging.SystemLogger; -import java.io.*; +import java.io.Closeable; +import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.StringJoiner; -import java.util.function.Predicate; import java.util.regex.Pattern; public class DeviceContext implements Closeable { @@ -94,7 +93,10 @@ public class DeviceContext implements Closeable { String line; String directory = null; while ((line = reader.readLine()) != null) { - if (line.startsWith(LIST_COMMAND)) { + if (line.trim().endsWith(LIST_COMMAND)) { + continue; + } + if (line.contains(BEGIN_PATTERN)) { continue; } if (line.endsWith(END_PATTERN)) { diff --git a/src/main/java/ru/kirillius/mktbk/DownloadStatus.java b/src/main/java/ru/kirillius/mktbk/DownloadStatus.java index 48f877f..3a4d1b6 100644 --- a/src/main/java/ru/kirillius/mktbk/DownloadStatus.java +++ b/src/main/java/ru/kirillius/mktbk/DownloadStatus.java @@ -41,18 +41,18 @@ public class DownloadStatus { if (bytes < 1024) { return bytes + " B"; } else if (bytes < 1048576L) { - return Math.floor((float) bytes / 1024L) + " KB"; + return Math.floor((float) bytes / 102.4f) / 10f + " KB"; } else if (bytes < 1073741824L) { - return Math.floor((float) bytes / 1048576L) + " MB"; + return Math.floor((float) bytes / 104857.6f) / 10f + " MB"; } else if (bytes < 1099511627776L) { - return Math.floor((float) bytes / 1073741824L) + " GB"; + return Math.floor((float) bytes / 107374182.4f) / 10f + " GB"; } else { - return Math.floor((float) bytes / 1099511627776L) + " TB"; + return Math.floor((float) bytes / 109951162777.6f) / 10f + " TB"; } } public void update() { - if (System.currentTimeMillis() - lastUpdate < 1000) { + if (System.currentTimeMillis() - lastUpdate < 250) { return; } clear(); @@ -69,7 +69,7 @@ public class DownloadStatus { } } - public void finish(){ + public void finish() { lastUpdate = 0; update(); }