package com.it_jaros.jscanner; import java.util.HashSet; import java.util.Set; public class CliParser { public ScanOptions parseArgs(String[] args) { if (args.length < 1 || args[0].trim().equals("")) { throw new IllegalArgumentException("No argument given"); } Set hostsArgv = new HashSet<>(); int socketLimit = CliDefaults.SOCKET_LIMIT; int delayInMillis = CliDefaults.DELAY_IN_MILLIS; int timeoutInMillis = CliDefaults.TIMEOUT_IN_MILLIS; int maxWorkersPerHost = CliDefaults.MAX_WORKERS_PER_HOST; int maxHostsLimit = CliDefaults.MAX_HOSTS_LIMIT; String ports = CliDefaults.PORTS; boolean showFilteredPorts = CliDefaults.SHOW_FILTERED_PORTS; boolean disableOnlineCheck = CliDefaults.DISABLE_HOST_CHECK; boolean quiet = CliDefaults.QUIET; String hostsFile = null; for (int i = 0; i < args.length; i++) { final String currentArg = args[i]; if (!currentArg.startsWith("-")) { hostsArgv.add(currentArg); continue; } switch (currentArg) { case "--help", "-h": usageAndExit(); break; case "--socketLimit", "-sl": socketLimit = parseIntOption(args, ++i, currentArg); break; case "--delay", "-d": delayInMillis = parseIntOption(args, ++i, currentArg); break; case "--timeout", "-t": timeoutInMillis = parseIntOption(args, ++i, currentArg); break; case "--maxWorkersPerHost", "-mh": maxWorkersPerHost = parseIntOption(args, ++i, currentArg); break; case "--maxHostsLimit", "-m": maxHostsLimit = parseIntOption(args, ++i, currentArg); break; case "--ports", "-p": ports = requireValue(args, ++i, currentArg); break; case "--showFilteredPorts", "-sf": showFilteredPorts = true; break; case "--disableOnlineCheck", "-do": disableOnlineCheck = true; break; case "--input", "-i": hostsFile = requireValue(args, ++i, currentArg); break; case "--quiet", "-q": quiet = true; break; default: throw new IllegalArgumentException("No such param " + currentArg); } } System.out.printf( "Parsed arguments: hostsArgv('%s'), ports(%s), socketLimit(%s), delayInMillis(%s), timeoutInMillis(%s), maxWorkersPerHost(%s), maxHostsLimit(%s), showFilteredPorts(%s), disableOnlineCheck(%s), file(%s), quiet(%b) %n", hostsArgv, ports, socketLimit, delayInMillis, timeoutInMillis, maxWorkersPerHost, maxHostsLimit, showFilteredPorts, disableOnlineCheck, hostsFile, quiet); return new ScanOptions(hostsArgv.stream().toList(), socketLimit, delayInMillis, timeoutInMillis, maxWorkersPerHost, maxHostsLimit, ports, showFilteredPorts, disableOnlineCheck, hostsFile, quiet); } private String requireValue(String[] args, int index, String option) { if (index >= args.length) { throw new IllegalArgumentException(String.format("Missing argument for option %s", option)); } return args[index]; } private int parseIntOption(String[] args, int index, String option) { String value = requireValue(args, index, option); try { return Integer.parseInt(value); } catch (NumberFormatException e) { throw new IllegalArgumentException(String.format("Invalid argument %s for option %s", value, option)); } } public void usageAndExit() { StringBuilder usage = new StringBuilder(); usage.append(""" Usage: java -jar jscanner.jar [OPTIONS] [,...] Options: """); usage.append(""" --delay, -d:\t\tWaiting period in millis for connection attempts for a host (Default: %d) --disableOnlineCheck, -do:\tDon't check if Host is reachable (Default: %b) --input, -i:\t\tRead file to get host targets to scan (Default: null) --maxHostsLimit, -m:\tMax number of hosts that are scanned at the same time (Default: %d) --maxWorkersPerHost, -mh:\tVirtual Worker Threads run per Host. Higher doesn't mean necessarily faster. But the more you use the more RAM is required (Default: %d) --ports, -p:\t\tDefine ports to be scanned (Default: %s) --quiet, -q:\t\tDo not output progress bar (Default: %b) --showFilteredPorts, -sf:\tShow also filtered ports (Default: %b) --socketLimit, -sl:\t\tSocket limit in total. You can not scan more ports than allowed here (Default: %d) --timeout, -t:\t\tTimeout in millis per connection attempt, 0 means infinite (Default: %d) """.formatted(CliDefaults.DELAY_IN_MILLIS, CliDefaults.DISABLE_HOST_CHECK, CliDefaults.MAX_HOSTS_LIMIT, CliDefaults.MAX_WORKERS_PER_HOST, CliDefaults.PORTS, CliDefaults.QUIET, CliDefaults.SHOW_FILTERED_PORTS, CliDefaults.SOCKET_LIMIT, CliDefaults.TIMEOUT_IN_MILLIS) ); usage.append(""" Examples: java -jar jscanner.jar localhost java -jar jscanner.jar fd00::1 """); System.err.println(usage); System.exit(0); } }