parent
f4a6ff6d43
commit
52af80fb7f
@ -0,0 +1,89 @@
|
||||
package io.zhile.research.ja.netfilter.commons;
|
||||
|
||||
import io.zhile.research.ja.netfilter.utils.StringUtils;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class ConfigDetector {
|
||||
private static final String CONFIG_FILENAME = "janf_config.txt";
|
||||
|
||||
public static File detect(String currentDirectory, String args) {
|
||||
File configFile = tryFile(args); // by javaagent argument
|
||||
|
||||
if (null == configFile) {
|
||||
configFile = tryFile(System.getenv("JANF_CONFIG")); // by env
|
||||
}
|
||||
|
||||
if (null == configFile) {
|
||||
configFile = tryFile(System.getProperty("janf.config")); // by -D argument
|
||||
}
|
||||
|
||||
if (null == configFile) {
|
||||
configFile = searchDirectory(currentDirectory); // in the same dir as the jar
|
||||
}
|
||||
|
||||
String userHome = System.getProperty("user.home");
|
||||
if (null == configFile) {
|
||||
configFile = searchDirectory(userHome, "." + CONFIG_FILENAME); // $HOME/.janf_config.txt
|
||||
}
|
||||
|
||||
if (null == configFile) {
|
||||
configFile = searchDirectory(userHome + File.pathSeparator + ".config"); // $HOME/.config/janf_config.txt
|
||||
}
|
||||
|
||||
if (null == configFile) {
|
||||
configFile = searchDirectory(userHome + File.pathSeparator + ".local" + File.pathSeparator + "/etc"); // $HOME/.local/etc/janf_config.txt
|
||||
}
|
||||
|
||||
if (null == configFile) {
|
||||
configFile = searchDirectory("/usr/local/etc"); // /usr/local/etc/janf_config.txt
|
||||
}
|
||||
|
||||
if (null == configFile) {
|
||||
configFile = searchDirectory("/etc"); // /etc/janf_config.txt
|
||||
}
|
||||
|
||||
return configFile;
|
||||
}
|
||||
|
||||
private static File searchDirectory(String dirPath) {
|
||||
return searchDirectory(dirPath, CONFIG_FILENAME);
|
||||
}
|
||||
|
||||
private static File searchDirectory(String dirPath, String filename) {
|
||||
if (StringUtils.isEmpty(dirPath)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
File dirFile = new File(dirPath);
|
||||
if (!dirFile.isDirectory()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return tryFile(new File(dirFile, filename));
|
||||
}
|
||||
|
||||
private static File tryFile(String filePath) {
|
||||
if (StringUtils.isEmpty(filePath)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return tryFile(new File(filePath));
|
||||
}
|
||||
|
||||
private static File tryFile(File file) {
|
||||
if (!file.exists()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!file.isFile()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!file.canRead()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return file;
|
||||
}
|
||||
}
|
@ -0,0 +1,90 @@
|
||||
package io.zhile.research.ja.netfilter.commons;
|
||||
|
||||
import io.zhile.research.ja.netfilter.models.FilterRule;
|
||||
import io.zhile.research.ja.netfilter.utils.StringUtils;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class ConfigParser {
|
||||
public static Map<String, List<FilterRule>> parse(File file) throws Exception {
|
||||
Map<String, List<FilterRule>> map = new HashMap<>();
|
||||
|
||||
if (null == file) {
|
||||
return map;
|
||||
}
|
||||
|
||||
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
|
||||
int lineNumber = 0;
|
||||
String line, lastSection = null;
|
||||
|
||||
while (null != (line = reader.readLine())) {
|
||||
lineNumber++;
|
||||
line = line.trim();
|
||||
if (StringUtils.isEmpty(line)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int len = line.length();
|
||||
switch (line.charAt(0)) {
|
||||
case '[':
|
||||
if (']' != line.charAt(len - 1)) {
|
||||
throw new Exception("Invalid section! Line: " + lineNumber);
|
||||
}
|
||||
|
||||
String section = line.substring(1, len - 1);
|
||||
if (StringUtils.isEmpty(section)) {
|
||||
throw new Exception("Empty section name! Line: " + lineNumber);
|
||||
}
|
||||
|
||||
lastSection = section;
|
||||
map.put(lastSection, new ArrayList<>());
|
||||
break;
|
||||
case '#':
|
||||
case ';':
|
||||
break; // comment
|
||||
case '/':
|
||||
if (len > 1 && '/' == line.charAt(1)) {
|
||||
break; // comment
|
||||
}
|
||||
throw new Exception("Invalid character! Line: " + lineNumber);
|
||||
default:
|
||||
if (null == lastSection) {
|
||||
break; // ignore rules without section
|
||||
}
|
||||
|
||||
String[] parts = line.split(",", 2);
|
||||
if (2 != parts.length) {
|
||||
throw new Exception("Invalid rule! Line: " + lineNumber);
|
||||
}
|
||||
|
||||
String type = parts[0].trim();
|
||||
String content = parts[1].trim();
|
||||
if (StringUtils.isEmpty(type) || StringUtils.isEmpty(content)) {
|
||||
throw new Exception("Invalid rule! Line: " + lineNumber);
|
||||
}
|
||||
|
||||
if (!Character.isAlphabetic(type.charAt(0))) {
|
||||
throw new Exception("Invalid rule! Line: " + lineNumber);
|
||||
}
|
||||
|
||||
FilterRule rule = FilterRule.of(type, content);
|
||||
if (null == rule) {
|
||||
throw new Exception("Invalid rule type! Line: " + lineNumber);
|
||||
}
|
||||
|
||||
map.get(lastSection).add(rule);
|
||||
DebugInfo.output("Add section: " + lastSection + ", rule: " + rule);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
package io.zhile.research.ja.netfilter.models;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class FilterConfig {
|
||||
private static FilterConfig current;
|
||||
|
||||
private final Map<String, List<FilterRule>> data;
|
||||
|
||||
public FilterConfig(Map<String, List<FilterRule>> data) {
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
public static FilterConfig getCurrent() {
|
||||
return current;
|
||||
}
|
||||
|
||||
public static void setCurrent(FilterConfig current) {
|
||||
FilterConfig.current = current;
|
||||
}
|
||||
|
||||
public static List<FilterRule> getBySection(String section) {
|
||||
do {
|
||||
if (null == current) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (null == current.data) {
|
||||
break;
|
||||
}
|
||||
|
||||
List<FilterRule> list = current.data.get(section);
|
||||
if (null == list) {
|
||||
break;
|
||||
}
|
||||
|
||||
return list;
|
||||
} while (false);
|
||||
|
||||
return new ArrayList<>();
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package io.zhile.research.ja.netfilter.utils;
|
||||
|
||||
public class StringUtils {
|
||||
public static boolean isEmpty(String str) {
|
||||
return null == str || str.isEmpty();
|
||||
}
|
||||
}
|
Loading…
Reference in new issue