ja-netfilter/src/main/java/com/janetfilter/core/Launcher.java

103 lines
3.2 KiB
Java

package com.janetfilter.core;
import com.janetfilter.core.attach.VMLauncher;
import com.janetfilter.core.attach.VMSelector;
import com.janetfilter.core.commons.DebugInfo;
import com.janetfilter.core.utils.WhereIsUtils;
import java.io.File;
import java.lang.instrument.Instrumentation;
import java.net.URI;
import java.util.jar.JarFile;
public class Launcher {
public static final String ATTACH_ARG = "--attach";
public static final String VERSION = "2022.2.0";
public static final int VERSION_NUMBER = 202201000;
private static boolean loaded = false;
public static void main(String[] args) {
URI jarURI;
try {
jarURI = WhereIsUtils.getJarURI();
} catch (Throwable e) {
DebugInfo.error("Can not locate `ja-netfilter` jar file.", e);
return;
}
String jarPath = jarURI.getPath();
if (args.length > 1 && args[0].equals(ATTACH_ARG)) {
VMLauncher.attachVM(jarPath, args[1], args.length > 2 ? args[2] : null);
return;
}
printUsage();
try {
new VMSelector(new File(jarPath)).select();
} catch (Throwable e) {
System.err.println(" ERROR: Select virtual machine failed.");
e.printStackTrace(System.err);
}
}
public static void premain(String args, Instrumentation inst) {
premain(args, inst, false);
}
public static void agentmain(String args, Instrumentation inst) {
if (null == System.getProperty("janf.debug")) {
System.setProperty("janf.debug", "1");
}
if (null == System.getProperty("janf.output")) {
System.setProperty("janf.output", "3");
}
premain(args, inst, true);
}
private static void premain(String args, Instrumentation inst, boolean attachMode) {
if (loaded) {
DebugInfo.warn("You have multiple `ja-netfilter` as javaagent.");
return;
}
printUsage();
URI jarURI;
try {
loaded = true;
jarURI = WhereIsUtils.getJarURI();
} catch (Throwable e) {
DebugInfo.error("Can not locate `ja-netfilter` jar file.", e);
return;
}
File agentFile = new File(jarURI.getPath());
try {
inst.appendToBootstrapClassLoaderSearch(new JarFile(agentFile));
} catch (Throwable e) {
DebugInfo.error("Can not access `ja-netfilter` jar file.", e);
return;
}
Initializer.init(new Environment(inst, agentFile, args, attachMode)); // for some custom UrlLoaders
}
private static void printUsage() {
String content = "\n ============================================================================ \n" +
"\n" +
" ja-netfilter " + VERSION +
"\n\n" +
" A javaagent framework :)\n" +
"\n" +
" https://github.com/ja-netfilter/ja-netfilter\n" +
"\n" +
" ============================================================================ \n\n";
System.out.print(content);
}
}