/* Copyright 2019-2020 Dmitry Isaenko This file is part of NS-USBloader. NS-USBloader is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. NS-USBloader is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with NS-USBloader. If not, see . */ package nsusbloader.cli; import nsusbloader.COM.NET.NETCommunications; import java.io.File; import java.util.ArrayList; import java.util.List; public class TinfoilNetCli { private final String[] arguments; private String nsIp; private String hostIp = ""; private String hostPortNum = ""; //private String hostExtras = ""; // TODO: Add 'don't serve requests' option or remove this private int parseFileSince = 1; private List filesList; TinfoilNetCli(String[] arguments) throws InterruptedException, IncorrectSetupException{ this.arguments = arguments; checkArguments(); parseNsIP(); parseHostSettings(); parseFilesArguments(); runTinfoilNetBackend(); } private void checkArguments() throws IncorrectSetupException{ if (arguments == null || arguments.length == 0) { throw new IncorrectSetupException("No arguments.\n" + "Try 'ns-usbloader -n help' for more information."); } if (arguments.length == 1){ if (isHelpDirective(arguments[0])){ showHelp(); return; } else throw new IncorrectSetupException("Not enough arguments.\n" + "Try 'ns-usbloader -n help' for more information."); } if (arguments.length == 2 && arguments[1].startsWith("hostip=")) { throw new IncorrectSetupException("Not enough arguments.\n" + "Try 'ns-usbloader -n help' for more information."); } } private boolean isHelpDirective(String argument){ return argument.equals("help"); } private void showHelp() throws IncorrectSetupException{ throw new IncorrectSetupException("Usage:\n" + "\tns-usbloader -n nsip= [hostip=] FILE1 ...\n" + "\tns-usbloader --tfn nsip= [hostip=] FILE1 ..." + "\n\nOptions:" + "\n\tnsip=\t\tDefine NS IP address (mandatory)" + "\n\thostip=\tDefine this host IP address. Will be obtained automatically if not set."); } private void parseNsIP() throws IncorrectSetupException{ String argument1 = arguments[0]; if (! argument1.startsWith("nsip=")) { throw new IncorrectSetupException("First argument must be 'nsip='\n" + "Try 'ns-usbloader -n help' for more information."); } nsIp = argument1.replaceAll("^nsip=", ""); if (nsIp.isEmpty()) { throw new IncorrectSetupException("No spaces allowed before or after 'nsip=' argument.\n" + "Try 'ns-usbloader -n help' for more information."); } } private void parseHostSettings(){ String argument2 = arguments[1]; if (! argument2.startsWith("hostip=")) return; parseFileSince = 2; hostIp = argument2.replaceAll("(^hostip=)|(:.+?$)|(:$)", ""); if (argument2.contains(":")) hostPortNum = argument2.replaceAll("(^.+:)", ""); // hostPortNum = argument2.replaceAll("(^.+:)|(/.+?$)|(/$)", ""); //if (argument2.contains("/")) // hostExtras = argument2.replaceAll("^[^/]*/", ""); } private void parseFilesArguments() throws IncorrectSetupException{ filesList = new ArrayList<>(); File file; for (; parseFileSince < arguments.length; parseFileSince++) { file = new File(arguments[parseFileSince]); if (file.exists()) filesList.add(file); } if (filesList.size() == 0) { throw new IncorrectSetupException("File(s) doesn't exist.\n" + "Try 'ns-usbloader -n help' for more information."); } } private void runTinfoilNetBackend() throws InterruptedException{ NETCommunications netCommunications = new NETCommunications( filesList, nsIp, false, hostIp, hostPortNum, ""); Thread netCommThread = new Thread(netCommunications); netCommThread.setDaemon(true); netCommThread.start(); netCommThread.join(); } }