summaryrefslogtreecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/util/ImageWrapper.java
diff options
context:
space:
mode:
Diffstat (limited to 'dozentenmodul/src/main/java/org/openslx/dozmod/util/ImageWrapper.java')
-rw-r--r--dozentenmodul/src/main/java/org/openslx/dozmod/util/ImageWrapper.java93
1 files changed, 93 insertions, 0 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/util/ImageWrapper.java b/dozentenmodul/src/main/java/org/openslx/dozmod/util/ImageWrapper.java
new file mode 100644
index 00000000..c86ddfa9
--- /dev/null
+++ b/dozentenmodul/src/main/java/org/openslx/dozmod/util/ImageWrapper.java
@@ -0,0 +1,93 @@
+package org.openslx.dozmod.util;
+
+import org.apache.log4j.Logger;
+
+import org.openslx.dozmod.Branding;
+import org.openslx.dozmod.gui.Gui;
+import org.openslx.dozmod.gui.helper.MessageType;
+import org.openslx.dozmod.model.ContainerDefinition;
+import org.openslx.thrifthelper.TConst;
+import org.openslx.util.vm.DiskImage;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+
+public class ImageWrapper {
+
+ private static final Logger LOGGER = Logger.getLogger(ImageWrapper.class);
+
+ /**
+ * @param virtualizerId string constant defined in @link org.openslx.thrifthelper.TConst
+ * @param tmpDiskFile dont no!
+ * @param imageName The name of that image in the list.
+ * @param destDir Destination directory on the local host.
+ * @param osId Operating system identifier of the selected image.
+ * @param virtualizerConfig raw byte array of virtualizerconfig in imageversion table. Only the Image knows
+ * how to use it.
+ */
+ public static void unpack(String virtualizerId, File tmpDiskFile, String imageName, File destDir,
+ int osId, byte[] virtualizerConfig) {
+
+ // after the whole image is downloaded and persisted as a .part file,
+ // this will be executed to unpack it.
+ // TODO Move into new Class (implements TransferEventListener)
+
+ DiskImage diskImage = null;
+ String ext = virtualizerId;
+
+ // unwrap each image individually
+ // TODO In future maybe this is a check to distinguish between VM-Image and Container Image
+ if (virtualizerId.equals(TConst.VIRT_DOCKER)) {
+
+ ContainerDefinition conDef = ContainerDefinition.fromByteArray(virtualizerConfig);
+ conDef.saveLocal(destDir);
+
+ try {
+ // delete image file, unused in container Context.
+ Files.delete(tmpDiskFile.toPath());
+
+ } catch (IOException e) {
+ Gui.asyncMessageBox("Konnte temporäre Download Datei nicht löschen", MessageType.WARNING, LOGGER,
+ e);
+ }
+
+ } else {
+ try {
+ diskImage = new DiskImage(tmpDiskFile);
+ } catch (IOException | DiskImage.UnknownImageFormatException e) {
+ LOGGER.warn("Could not open downloaded image for analyze step", e);
+ }
+
+ if (diskImage != null) {
+ if (diskImage.format != null) {
+ ext = diskImage.format.extension;
+ }
+ if (diskImage.isCompressed) {
+ String msg = "<html>Die heruntergeladene VM '" + imageName + "' ist ein komprimiertes "
+ + "Abbild.<br>Sie müssen das Abbild dekomprimieren, bevor Sie es verändern "
+ + "können.<br> Die VM wird lokal voraussichtlich nicht startfähig sein!"
+ + "<br><br>Bitte lesen Sie die Hinweise unter " + "<a href=\""
+ + Branding.getServiceFAQWebsite() + "\">" + "VMDK Disk Types</a>";
+
+ Gui.asyncMessageBox(msg, MessageType.WARNING, null, null);
+ }
+ }
+ File destImage = new File(destDir.getAbsolutePath(), VmWrapper.generateFilename(imageName, ext));
+
+ destImage.delete();
+
+ if (!tmpDiskFile.renameTo(destImage)) {
+ destImage = tmpDiskFile; // Must be Windows...
+ }
+ try {
+ VmWrapper.wrapVm(destImage, imageName, virtualizerConfig, virtualizerId, osId, diskImage);
+
+ } catch (VmWrapper.MetaDataMissingException | IOException e) {
+ Gui.asyncMessageBox("Zur heruntergeladenen VM konnte keine vmx-Datei angelegt werden."
+ + "\nSie können versuchen, das Abbild manuell in den VMWare-Player zu importieren.",
+ MessageType.WARNING, LOGGER, e);
+ }
+ }
+ }
+}