/*
* Copyright (c) 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.geniso;
import com.emc.storageos.systemservices.impl.iso.ISOBuffer;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
/**
* Generate the ISO image that contains an 'empty' ovf-env.xml
*/
public class Main {
private static void usage() {
System.out.println("Usage: ");
System.out
.println("Main --label label [--header iso-header-filename --trailer iso-trailer-filename] [-f input-file -o output-file] config-filename config-file-size");
}
public static void main(String[] args) throws Exception {
if (args.length != 8) {
usage();
return;
}
String label = null;
String isoHeaderFileName = null;
String isoTrailerFileName = null;
String inputFileName = null;
String outputFileName = null;
String configFileName = null;
int size = 4096; // default 4K
for (int i = 0; i < args.length; i++) {
if (args[i].equals("--label")) {
i++;
label = args[i];
continue;
}
if (args[i].equals("--header")) {
i++;
isoHeaderFileName = args[i];
continue;
}
if (args[i].equals("--trailer")) {
i++;
isoTrailerFileName = args[i];
continue;
}
if (args[i].equals("-f")) {
i++;
inputFileName = args[i];
continue;
}
if (args[i].equals("-o")) {
i++;
outputFileName = args[i];
continue;
}
configFileName = args[i];
i++;
size = Integer.parseInt(args[i]);
}
if (isoHeaderFileName != null) {
generateISOHeaderAndTrailer(label, isoHeaderFileName, isoTrailerFileName, configFileName, size);
} else if (inputFileName != null) {
generateISOFile(label, inputFileName, outputFileName, configFileName, size);
}
}
private static void generateISOHeaderAndTrailer(String label, String isoHeader, String isoTrailer, String configFileName, int size) {
try (FileOutputStream header = new FileOutputStream(isoHeader);
FileOutputStream trailer = new FileOutputStream(isoTrailer)) {
byte[] dummyData = new byte[size];
ISOBuffer isoBuffer = new ISOBuffer();
isoBuffer.addFile(configFileName, dummyData);
byte[] data = isoBuffer.createISO(label);
int dataStartPosition = isoBuffer.getDataStartPosition();
int trailerOffset = isoBuffer.getDataEndPosition();
int trailerLength = data.length - trailerOffset;
System.out.println(String.format("ISO header size= %d ISO trailer offset=%d trailer length=%d",
dataStartPosition, trailerOffset, trailerLength));
header.write(data, 0, dataStartPosition);
trailer.write(data, trailerOffset, trailerLength);
} catch (IOException e) {
System.err.println(String.format("Failed to create the ISO header %s and trailer %s: %s",
isoHeader, isoTrailer, e.getMessage()));
return;
}
System.out.println("The ISO image header and trailer files have been created");
}
private static void generateISOFile(String label, String inputFileName, String outputFileName, String configFileName, int size)
throws Exception {
byte[] buffer = new byte[size];
try (FileInputStream input = new FileInputStream(inputFileName);
FileOutputStream out = new FileOutputStream(outputFileName)) {
int count = input.read(buffer);
Arrays.fill(buffer, count, buffer.length, (byte) ('\n'));
ISOBuffer isoBuffer = new ISOBuffer();
isoBuffer.addFile(configFileName, buffer);
byte[] data = isoBuffer.createISO(label);
out.write(data);
}
}
}