/*
* Copyright (C) 2015 The Pennsylvania State University and the University of Wisconsin
* Systems and Internet Infrastructure Security Laboratory
*
* Author: Damien Octeau
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package edu.psu.cse.siis.ic3;
import org.apache.commons.cli.ParseException;
import edu.psu.cse.siis.coal.CommandLineArguments;
/**
* Command line arguments for IC3.
*/
public class Ic3CommandLineArguments extends CommandLineArguments {
private static final String DEFAULT_SSH_PROPERTIES_PATH = "/db/ssh.properties";
private static final String DEFAULT_DATABASE_PROPERTIES_PATH = "/db/cc.properties";
private static final int DEFAULT_LOCAL_PORT = 3369;
private static final String DEFAULT_COMPILED_MODEL_PATH = "/res/icc.cmodel";
private static final String DEFAULT_DB_NAME = "cc";
private String manifest;
private String db;
private String ssh;
private String iccStudy;
private int dbLocalPort = DEFAULT_LOCAL_PORT;
private boolean computeComponents;
private String dbName;
private String protobufDestination;
private boolean binary;
private String sample;
public String getDbName() {
return dbName != null ? dbName : DEFAULT_DB_NAME;
}
/**
* Gets the path to the manifest or .apk file.
*
* @return The path to the manifest or .apk file.
*/
public String getManifest() {
return manifest;
}
/**
* Gets the path to the database properties file.
*
* @return The path to the database properties file if IC3 should output its results to a
* database, null otherwise.
*/
public String getDb() {
return db;
}
/**
* Gets the path to the SSH properties file.
*
* @return The path to the SSH properties file if an SSH connection is requested, null otherwise.
*/
public String getSsh() {
return ssh;
}
public String getIccStudy() {
return iccStudy;
}
/**
* Gets the local port to which the database connection should be done.
*
* @return The local port to connect to.
*/
public int getDbLocalPort() {
return dbLocalPort;
}
/**
* Determines if mappings between ICC-sending locations and the components that contain them
* should be computed.
*
* @return True if the components that contain ICC-sending locations should be determined.
*/
public boolean computeComponents() {
return computeComponents;
}
/**
* Returns the destination protocol buffer file path.
*
* @return The destination path if any, otherwise null.
*/
public String getProtobufDestination() {
return protobufDestination;
}
/**
* Determines if the output should be binary, in the case of a protobuf output.
*
* @return True if the output should be binary.
*/
public boolean binary() {
return binary;
}
/**
* Returns the name of the sample.
*
* @return The sample name, if any, otherwise null.
*/
public String getSample() {
return sample;
}
/**
* Process the command line arguments after initial parsing. This should be called be actually
* using the arguments contained in this class.
*/
public void processCommandLineArguments() {
manifest = getOptionValue("apkormanifest");
if (getCompiledModel() == null && getModel() == null) {
setCompiledModel(DEFAULT_COMPILED_MODEL_PATH);
}
iccStudy = getOptionValue("iccstudy");
if (hasOption("db")) {
db = getOptionValue("db", DEFAULT_DATABASE_PROPERTIES_PATH);
}
if (hasOption("ssh")) {
ssh = getOptionValue("ssh", DEFAULT_SSH_PROPERTIES_PATH);
}
if (hasOption("localport")) {
try {
dbLocalPort = ((Number) getParsedOptionValue("localport")).intValue();
} catch (ParseException e) {
e.printStackTrace();
}
}
if (hasOption("dbname")) {
dbName = getOptionValue("dbname", DEFAULT_DB_NAME);
}
computeComponents = hasOption("computecomponents") || db != null;
if (hasOption("protobuf")) {
protobufDestination = getOptionValue("protobuf");
}
computeComponents = hasOption("computecomponents") || db != null || protobufDestination != null;
binary = hasOption("binary");
sample = getOptionValue("sample");
}
}