diff options
-rw-r--r-- | src/main/java/io/github/jshipit/BlobDownloader.java | 9 | ||||
-rw-r--r-- | src/main/java/io/github/jshipit/SysUtils.java | 29 | ||||
-rw-r--r-- | src/main/java/io/github/jshipit/TarManager.java | 74 |
3 files changed, 24 insertions, 88 deletions
diff --git a/src/main/java/io/github/jshipit/BlobDownloader.java b/src/main/java/io/github/jshipit/BlobDownloader.java index 7303cd3..ea8b09c 100644 --- a/src/main/java/io/github/jshipit/BlobDownloader.java +++ b/src/main/java/io/github/jshipit/BlobDownloader.java @@ -98,13 +98,8 @@ public class BlobDownloader extends Thread { if (extracted.exists()) { extracted.delete(); } - TarManager tarManager = new TarManager(); - try { - tarManager.untar(tmpdir + "/" + digest.replace("sha256:", "") + ".tar.gz", extracted); - } catch (IOException e) { - System.out.println("Failed to extract blob "+digest); - e.printStackTrace(); - } + SysUtils tarManager = new SysUtils(); + tarManager.untar(tmpdir + "/" + digest.replace("sha256:", "") + ".tar.gz", tmpdir + "/" + digest.replace("sha256:", "")); File tar = new File(tmpdir + "/" + digest.replace("sha256:", "") + ".tar.gz"); if (tar.exists()) { tar.delete(); diff --git a/src/main/java/io/github/jshipit/SysUtils.java b/src/main/java/io/github/jshipit/SysUtils.java index 3ea48fb..877b61e 100644 --- a/src/main/java/io/github/jshipit/SysUtils.java +++ b/src/main/java/io/github/jshipit/SysUtils.java @@ -1,19 +1,34 @@ package io.github.jshipit; -import com.sun.jna.Library; -import com.sun.jna.Native; import com.sun.jna.Platform; +import java.io.File; + public class SysUtils { - interface CLibrary extends Library { - public int chmod(String path, int mode); + public void chmod(String path, int mode) { + ProcessBuilder pb = new ProcessBuilder("chmod", Integer.toString(mode), path); + pb.inheritIO(); + try { + Process p = pb.start(); + p.waitFor(); + } catch (Exception e) { + throw new RuntimeException(e); + } } - public void chmod(String path, int mode) { - CLibrary libc = (CLibrary) Native.load("c", CLibrary.class); - libc.chmod(path, mode); + public void untar(String in, String out) { + new File(out).mkdirs(); + ProcessBuilder pb = new ProcessBuilder("tar", "-xf", in, "-C", out); + pb.inheritIO(); + try { + Process p = pb.start(); + p.waitFor(); + } catch (Exception e) { + throw new RuntimeException(e); + } } + public void overlayMount(String[] lower, String upper, String target, String work) { if (Platform.isLinux()) { diff --git a/src/main/java/io/github/jshipit/TarManager.java b/src/main/java/io/github/jshipit/TarManager.java deleted file mode 100644 index 41577a9..0000000 --- a/src/main/java/io/github/jshipit/TarManager.java +++ /dev/null @@ -1,74 +0,0 @@ -package io.github.jshipit; - -import org.apache.commons.compress.archivers.tar.TarArchiveEntry; -import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; -import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; -import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; -import org.apache.commons.compress.utils.IOUtils; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; - -public class TarManager { - - public TarManager() { - - } - - public void tar(String name, File... files) throws IOException { - try (TarArchiveOutputStream out = getTarArchiveOutputStream(name)){ - for (File file : files){ - addToArchive(out, file, "."); - } - } - } - - public void untar(String in, File out) throws IOException { - SysUtils chmod = new SysUtils(); - try (TarArchiveInputStream fin = new TarArchiveInputStream(new GzipCompressorInputStream(new FileInputStream(in)))){ - TarArchiveEntry entry; - while ((entry = fin.getNextTarEntry()) != null) { - if (entry.isDirectory()) { - continue; - } - File curfile = new File(out, entry.getName()); - File parent = curfile.getParentFile(); - if (!parent.exists()) { - parent.mkdirs(); - } - chmod.chmod(curfile.getPath(), entry.getMode()); - IOUtils.copy(fin, new FileOutputStream(curfile)); - } - } - } - - private TarArchiveOutputStream getTarArchiveOutputStream(String name) throws IOException { - TarArchiveOutputStream taos = new TarArchiveOutputStream(new FileOutputStream(name)); - taos.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_STAR); - taos.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); - taos.setAddPaxHeadersForNonAsciiNames(true); - return taos; - } - - private void addToArchive(TarArchiveOutputStream out, File file, String dir) throws IOException { - String entry = dir + File.separator + file.getName(); - if (file.isFile()){ - out.putArchiveEntry(new TarArchiveEntry(file, entry)); - try (FileInputStream in = new FileInputStream(file)){ - IOUtils.copy(in, out); - } - out.closeArchiveEntry(); - } else if (file.isDirectory()) { - File[] children = file.listFiles(); - if (children != null){ - for (File child : children){ - addToArchive(out, child, entry); - } - } - } else { - System.out.println(file.getName() + " is not supported"); - } - } -}
\ No newline at end of file |