package com.it_jaros.network_scanner; 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 targets = new HashSet<>(); int socketLimit = 1000; int delayInMillis = 0; int timeoutInMillis = 1000; int maxWorkersPerHost = 1000; int maxTargetsLimit = 10; String ports = "1-1024"; for (int i = 0; i < args.length; i++) { final String currentArg = args[i]; if (!currentArg.startsWith("-")) { targets.add(currentArg); continue; } try { switch (currentArg) { case "--help", "-h": usageAndExit(); break; case "--socketLimit", "-sl": socketLimit = Integer.parseInt(args[++i]); break; case "--delay", "-d": delayInMillis = Integer.parseInt(args[++i]); break; case "--timeout", "-t": timeoutInMillis = Integer.parseInt(args[++i]); break; case "--maxWorkersPerHost", "-wh": maxWorkersPerHost = Integer.parseInt(args[++i]); break; case "--maxTargetsLimit", "-tl": maxTargetsLimit = Integer.parseInt(args[++i]); break; case "--ports", "-p": ports = args[++i]; break; default: throw new IllegalArgumentException("No such param " + currentArg); } } catch (IndexOutOfBoundsException | NumberFormatException e) { System.out.printf("Missing or wrong argument for option %s", currentArg); System.exit(2); } } System.out.printf( "Parsed arguments: targets('%s'), ports(%s), socketLimit(%s), delayInMillis(%s), timeoutInMillis(%s), maxWorkersPerHost(%s), maxTargetsLimit(%s) %n", targets, ports, socketLimit, delayInMillis, timeoutInMillis, maxWorkersPerHost, maxTargetsLimit); return new ScanOptions(targets.stream().toList(), socketLimit, delayInMillis, timeoutInMillis, maxWorkersPerHost, maxTargetsLimit, ports); } public void usageAndExit() { System.err.println(""" Usage: java -jar scanner.jar [OPTIONS] Options: --delay, -d:\t\tWaiting period in millis for connection attempts for a host (Default: 0) --socketLimit, -sl:\t\tSocket Connection limit for a host (Default: 1000) --timeout, -t:\t\tTimeout per connection attempt, 0 means infinite (Default: 1000) --ports, -p:\t\tPorts to be scanned --maxWorkersPerHost, -wh:\tVirtual Worker Threads run per target. Higher doesn't mean necessarily faster. But the more you use the more RAM is required (Default: 1000) --maxTargetsLimit, -tl:\\tMax number of targets that are scanned at the same time (Default: 10) Examples: java -jar scanner.jar localhost java -jar scanner.jar fd00::1 """); System.exit(1); } }