diff --git a/.editorconfig b/.editorconfig index b54631302..5f8702cf8 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,13 +4,9 @@ root = true # Unix-style newlines with a newline ending every file -[*.go] +[*] end_of_line = lf insert_final_newline = true charset = utf-8 -indent_style = tab -indent_size = 2 - -[{*.java, *.gradle, *.yml, app/*package.json}] indent_style = space indent_size = 2 diff --git a/README.alpha.md b/README.alpha.md index fd3dea54e..ae59a15de 100644 --- a/README.alpha.md +++ b/README.alpha.md @@ -6,9 +6,25 @@ $ ./gradlew build nativeCompile &&\ build/native/nativeCompile/dns-proxy-server ``` + +## Run a container for testing + +``` +docker run --rm -it --hostname nginx.dev -e 'HOSTNAMES=nginx.com.br' nginx:1.15 bash +``` ## x ```bash docker-compose -f docker-compose-alpha.yml rm &&\ docker-compose -f docker-compose-alpha.yml build &&\ docker-compose -f docker-compose-alpha.yml run -T --rm arm7x86 ``` + +Generate json reflect for all project + +``` +$ ./gradlew shadowJar + +$ mkdir reflect &&\ + $JAVA_HOME/bin/java -agentlib:native-image-agent=config-output-dir=./reflect -jar build/libs/dns-proxy-server*all.jar +``` + diff --git a/build.gradle b/build.gradle index fbf7cc5c4..e8965c24f 100644 --- a/build.gradle +++ b/build.gradle @@ -8,6 +8,7 @@ buildscript { plugins { id "java" id 'org.graalvm.buildtools.native' version '0.9.19' + id "com.github.johnrengelman.shadow" version "7.1.2" } repositories { @@ -44,15 +45,24 @@ dependencies { compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.+' annotationProcessor group: 'org.projectlombok', name: 'lombok', version: '1.18.+' - compileOnly(group: "com.mageddo.nativeimage", name: "reflection-config-generator", version: "2.3.+") - annotationProcessor(group: "com.mageddo.nativeimage", name: "reflection-config-generator", version: "2.3.+") + + implementation 'com.google.dagger:dagger:2.44.+' + annotationProcessor 'com.google.dagger:dagger-compiler:2.44.+' implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.+' - implementation group: 'com.mageddo.tinyserver', name: 'tinyserver', version: '1.0.+' implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.14.+' implementation group: "ch.qos.logback", name: "logback-classic", version: "1.2.+" + + implementation group: 'com.mageddo.tinyserver', name: 'tinyserver', version: '1.0.+' + implementation group: 'dnsjava', name: 'dnsjava', version: '3.5.2' + implementation group: 'com.github.docker-java', name: 'docker-java-core', version: '3.2.14' + implementation group: 'com.github.docker-java', name: 'docker-java-transport-httpclient5', version: '3.2.14' + + compileOnly(group: "com.mageddo.nativeimage", name: "reflection-config-generator", version: "2.4.+") + annotationProcessor(group: "com.mageddo.nativeimage", name: "reflection-config-generator", version: "2.4.+") + testCompileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.+' testAnnotationProcessor group: 'org.projectlombok', name: 'lombok', version: '1.18.+' testImplementation(group: "org.junit.jupiter", name: "junit-jupiter", version: "5.8.+") @@ -65,3 +75,21 @@ test { events "passed", "skipped", "failed" } } + + +def mainClassName = "com.mageddo.dnsproxyserver.App" + +jar { + manifest { + attributes( + "Main-Class": mainClassName + ) + } +} + +shadowJar { + mergeServiceFiles() + transform(com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer) { + mergeStrategy = "append" + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/App.java b/src/main/java/com/mageddo/dnsproxyserver/App.java index 74de405ad..6385f17ab 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/App.java +++ b/src/main/java/com/mageddo/dnsproxyserver/App.java @@ -1,17 +1,23 @@ package com.mageddo.dnsproxyserver; -public class App { - public static void main(String[] args) { - System.out.println("Hello World"); +import com.mageddo.dnsproxyserver.dagger.Factory; - // start webserver +public class App { + public static void main(String[] args) throws InterruptedException { + final var factory = Factory.factory(); // start dns server + factory.dnsServerStarter().start(); + + // start webserver // configurations // setup as default dns + // install as service + Thread.currentThread().join(); + } } diff --git a/src/main/java/com/mageddo/dnsproxyserver/config/Configs.java b/src/main/java/com/mageddo/dnsproxyserver/config/Configs.java new file mode 100644 index 000000000..bcbca5d3a --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/config/Configs.java @@ -0,0 +1,20 @@ +package com.mageddo.dnsproxyserver.config; + +import com.mageddo.dnsproxyserver.server.dns.solver.RemoteSolverConfig; +import com.mageddo.dnsproxyserver.server.dns.SimpleServer; + +public class Configs { + public static int findDnsServerPort() { + return 8053; + } + + public static SimpleServer.Protocol findDnsServerProtocol() { + return SimpleServer.Protocol.BOTH; + } + + public static RemoteSolverConfig findRemoverSolverConfig() { + return new RemoteSolverConfig() + .setIp(new byte[]{8, 8, 8, 8}) + .setPort((short) 53); + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/dagger/DockerModule.java b/src/main/java/com/mageddo/dnsproxyserver/dagger/DockerModule.java new file mode 100644 index 000000000..4af26f3c1 --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/dagger/DockerModule.java @@ -0,0 +1,46 @@ +package com.mageddo.dnsproxyserver.dagger; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.core.DefaultDockerClientConfig; +import com.github.dockerjava.core.DockerClientImpl; +import com.github.dockerjava.httpclient5.ApacheDockerHttpClient; +import com.mageddo.dnsproxyserver.docker.DockerRepository; +import com.mageddo.dnsproxyserver.docker.DockerRepositoryDefault; +import dagger.Binds; +import dagger.Module; +import dagger.Provides; + +import java.time.Duration; + +@Module +public interface DockerModule { + + + @Binds + DockerRepository bind(DockerRepositoryDefault m); + + @Provides + static DockerClient dockerClient() { + final var config = DefaultDockerClientConfig.createDefaultConfigBuilder() + .withDockerHost("unix:///var/run/docker.sock") + .withDockerTlsVerify(false) +// .withDockerCertPath("/home/user/.docker") +// .withRegistryUsername(registryUser) +// .withRegistryPassword(registryPass) +// .withRegistryEmail(registryMail) +// .withRegistryUrl(registryUrl) + .build(); + + final var httpClient = new ApacheDockerHttpClient.Builder() + .dockerHost(config.getDockerHost()) + .sslConfig(config.getSSLConfig()) + .maxConnections(5) + .connectionTimeout(Duration.ofMillis(300)) + .responseTimeout(Duration.ofSeconds(3)) + .build(); + + return DockerClientImpl.getInstance(config, httpClient); + } + + +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/dagger/Factory.java b/src/main/java/com/mageddo/dnsproxyserver/dagger/Factory.java new file mode 100644 index 000000000..1d4b9a84f --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/dagger/Factory.java @@ -0,0 +1,24 @@ +package com.mageddo.dnsproxyserver.dagger; + +import com.mageddo.dnsproxyserver.server.dns.ServerStarter; +import com.mageddo.dnsproxyserver.server.dns.solver.Solver; +import dagger.Component; + +import javax.inject.Singleton; +import java.util.Set; + +@Singleton +@Component(modules = {MainModule.class, DockerModule.class}) +public interface Factory { + + ServerStarter dnsServerStarter(); + + Set solvers(); + + static Factory factory() { + return DaggerFactory + .builder() + .build() + ; + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/dagger/MainModule.java b/src/main/java/com/mageddo/dnsproxyserver/dagger/MainModule.java new file mode 100644 index 000000000..4f3aa135c --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/dagger/MainModule.java @@ -0,0 +1,30 @@ +package com.mageddo.dnsproxyserver.dagger; + +import com.mageddo.dnsproxyserver.config.Configs; +import com.mageddo.dnsproxyserver.server.dns.solver.DockerSolver; +import com.mageddo.dnsproxyserver.server.dns.solver.RemoteSolver; +import com.mageddo.dnsproxyserver.server.dns.solver.Solver; +import dagger.Module; +import dagger.Provides; +import dagger.multibindings.ElementsIntoSet; +import org.xbill.DNS.Resolver; +import org.xbill.DNS.SimpleResolver; + +import java.util.Set; + +@Module +public interface MainModule { + + @ElementsIntoSet + @Provides + static Set solvers( + RemoteSolver a, DockerSolver b + ) { + return Set.of(a, b); + } + + @Provides + static Resolver simpleResolver() { + return new SimpleResolver(Configs.findRemoverSolverConfig().toSocketAddress()); + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/docker/Docker.java b/src/main/java/com/mageddo/dnsproxyserver/docker/Docker.java new file mode 100644 index 000000000..4d472aa23 --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/docker/Docker.java @@ -0,0 +1,41 @@ +package com.mageddo.dnsproxyserver.docker; + +import com.github.dockerjava.api.model.ContainerConfig; +import org.apache.commons.lang3.StringUtils; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Set; +import java.util.stream.Collectors; + +public class Docker { + + public static final String HOSTNAME_ENV = "HOSTNAMES="; + + public static String findContainerHostname(ContainerConfig config) { + final var hostname = config.getHostName(); + if (StringUtils.isBlank(hostname)) { + return null; + } + final var domainName = config.getDomainName(); + if (StringUtils.isBlank(domainName)) { + return hostname; + } + return String.format("%s.%s", hostname, domainName); + } + + public static Set findHostnameFromEnv(String[] envs) { + if (envs == null) { + return Collections.emptySet(); + } + for (String env : envs) { + if (env.startsWith(HOSTNAME_ENV)) { + final var hosts = env.substring(HOSTNAME_ENV.length()).split("\s,\s"); + return Arrays + .stream(hosts) + .collect(Collectors.toSet()); + } + } + return Collections.emptySet(); + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/docker/DockerNetworks.java b/src/main/java/com/mageddo/dnsproxyserver/docker/DockerNetworks.java new file mode 100644 index 000000000..c43d65487 --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/docker/DockerNetworks.java @@ -0,0 +1,23 @@ +package com.mageddo.dnsproxyserver.docker; + +import com.github.dockerjava.api.command.InspectContainerResponse; +import lombok.extern.slf4j.Slf4j; + +import java.util.Arrays; + +@Slf4j +public class DockerNetworks { + public static String findBestIpMatching(InspectContainerResponse c, String... networksNames) { + final var networks = c.getNetworkSettings().getNetworks(); + for (final var name : networksNames) { + if (!networks.containsKey(name)) { + continue; + } + final var ip = networks.get(name).getIpAddress(); + log.debug("status=foundIp, network={}, container={}, ip={}", name, c.getName(), ip); + return ip; + } + log.debug("status=noIpFound, searchedNetworks={}, container={}", Arrays.toString(networksNames), c.getName()); + return null; + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/docker/DockerRepository.java b/src/main/java/com/mageddo/dnsproxyserver/docker/DockerRepository.java new file mode 100644 index 000000000..a97a8ac05 --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/docker/DockerRepository.java @@ -0,0 +1,11 @@ +package com.mageddo.dnsproxyserver.docker; + +public interface DockerRepository { + /** + * + * @param host + * @return the host ip + */ + String findHostIp(String host); + +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/docker/DockerRepositoryDefault.java b/src/main/java/com/mageddo/dnsproxyserver/docker/DockerRepositoryDefault.java new file mode 100644 index 000000000..bf109b501 --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/docker/DockerRepositoryDefault.java @@ -0,0 +1,59 @@ +package com.mageddo.dnsproxyserver.docker; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.InspectContainerResponse; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.time.StopWatch; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.util.Objects; +import java.util.Set; +import java.util.function.Predicate; + +import static com.mageddo.dnsproxyserver.docker.Docker.findContainerHostname; +import static com.mageddo.dnsproxyserver.docker.Docker.findHostnameFromEnv; + +@Slf4j +@Singleton +@AllArgsConstructor(onConstructor = @__({@Inject})) +public class DockerRepositoryDefault implements DockerRepository { + + public static final String RUNNING_STATUS = "running"; + private final DockerClient dockerClient; + + @Override + public String findHostIp(String host) { + final var stopWatch = StopWatch.createStarted(); + final var activeContainers = this.dockerClient + .listContainersCmd() + .withStatusFilter(Set.of(RUNNING_STATUS)) + .withLimit(1024) +// .withNetworkFilter() + .exec(); + + final var foundIp = activeContainers + .stream() + .map(it -> this.dockerClient.inspectContainerCmd(it.getId()).exec()) + .filter(matchingHostName(host)) + .map(c -> DockerNetworks.findBestIpMatching(c, buildNetworks(c))) + .findFirst() + .orElse(null); + log.debug("status=findDone, host={}, found={}, time={}", host, foundIp, stopWatch.getTime()); + return foundIp; + } + + String[] buildNetworks(InspectContainerResponse c) { + return new String[]{"bridge"}; + } + + static Predicate matchingHostName(String host) { + return it -> { + if (Objects.equals(findContainerHostname(it.getConfig()), host)) { + return true; + } + return findHostnameFromEnv(it.getConfig().getEnv()).contains(host); + }; + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/docker/DockerRepositoryMock.java b/src/main/java/com/mageddo/dnsproxyserver/docker/DockerRepositoryMock.java new file mode 100644 index 000000000..367142b07 --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/docker/DockerRepositoryMock.java @@ -0,0 +1,19 @@ +package com.mageddo.dnsproxyserver.docker; + +import lombok.AllArgsConstructor; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.util.Objects; + +@Singleton +@AllArgsConstructor(onConstructor = @__({@Inject})) +public class DockerRepositoryMock implements DockerRepository { + @Override + public String findHostIp(String host) { + if (Objects.equals("acme.com", host)) { + return "192.168.0.1"; + } + return null; + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/Messages.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/Messages.java new file mode 100644 index 000000000..3bc3c91bf --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/Messages.java @@ -0,0 +1,9 @@ +package com.mageddo.dnsproxyserver.server.dns; + +import org.xbill.DNS.Message; + +public class Messages { + public static String simplePrint(Message message){ + return message.toString().substring(0, 10); + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/README.md b/src/main/java/com/mageddo/dnsproxyserver/server/dns/README.md new file mode 100644 index 000000000..ae45f851a --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/README.md @@ -0,0 +1,4 @@ +``` +nslookup -po=8053 google.com 127.0.0.1 +-Djava.net.preferIPv4Stack=true +``` \ No newline at end of file diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/ServerStarter.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/ServerStarter.java new file mode 100644 index 000000000..85b95ee02 --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/ServerStarter.java @@ -0,0 +1,34 @@ +package com.mageddo.dnsproxyserver.server.dns; + +import com.mageddo.dnsproxyserver.config.Configs; +import com.mageddo.dnsproxyserver.server.dns.solver.Solver; +import com.mageddo.dnsproxyserver.server.dns.solver.Solvers; +import lombok.Getter; +import lombok.experimental.Accessors; + +import javax.inject.Inject; +import java.util.List; +import java.util.Set; + +@Getter +@Accessors(fluent = true) +public class ServerStarter { + private final List solvers; + private final SimpleServer server; + + @Inject + public ServerStarter(Set solvers, SimpleServer server) { + this.solvers = Solvers.sorted(solvers); + this.server = server; + } + + public ServerStarter start(){ + this.server.start( + Configs.findDnsServerPort(), + Configs.findDnsServerProtocol(), + this.solvers, + null + ); + return this; + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/SimpleServer.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/SimpleServer.java new file mode 100644 index 000000000..5d2bc1555 --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/SimpleServer.java @@ -0,0 +1,33 @@ +package com.mageddo.dnsproxyserver.server.dns; + +import com.mageddo.dnsproxyserver.server.dns.solver.Solver; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import javax.inject.Inject; +import java.net.InetAddress; +import java.util.List; + +@Slf4j +@AllArgsConstructor(onConstructor = @__({@Inject})) +public class SimpleServer { + + public SimpleServer start( + int port, Protocol protocol, List solvers, InetAddress bindAddress + ) { + + // fixme create tcp server + final var udpServer = new UDPServer(); + solvers.forEach(udpServer::bind); + udpServer.start(port, bindAddress); + + return new SimpleServer(); + } + + public enum Protocol { + UDP, + TCP, + BOTH + } + +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/UDPServer.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/UDPServer.java new file mode 100644 index 000000000..f4028f261 --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/UDPServer.java @@ -0,0 +1,92 @@ +package com.mageddo.dnsproxyserver.server.dns; + +import com.mageddo.dnsproxyserver.server.dns.solver.Solver; +import com.mageddo.dnsproxyserver.threads.ThreadPool; +import com.mageddo.dnsproxyserver.utils.Classes; +import lombok.extern.slf4j.Slf4j; +import org.xbill.DNS.Message; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutorService; + +import static com.mageddo.dnsproxyserver.server.dns.Messages.simplePrint; + +@Slf4j +public class UDPServer { + public static final short BUFFER_SIZE = 512; + private final List solvers; + private final ExecutorService pool; + + public UDPServer() { + this.solvers = new ArrayList<>(); + this.pool = ThreadPool.create(5); + } + + public UDPServer bind(Solver solver) { + this.solvers.add(solver); + return this; + } + + public void start(int port, InetAddress bindAddress) { + this.pool.submit(() -> this.start0(port, bindAddress)); + log.info("status=starting.., port={}, bindAddress={}", port, bindAddress); + } + + private void start0(int port, InetAddress bindAddress) { + try { + final var server = new DatagramSocket(port, bindAddress); + final byte[] buff = new byte[BUFFER_SIZE]; + while (!server.isClosed()) { + + final var in = new DatagramPacket(buff, 0, buff.length); + server.receive(in); + final var reqMsg = new Message(in.getData()); + + this.pool.submit(() -> this.res(server, this.solve(reqMsg), in.getAddress(), in.getPort())); + + } + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + Message solve(Message reqMsg) { + for (final var solver : this.solvers) { + final var solverName = Classes.findSimpleName(solver); + try { + final var reqStr = simplePrint(reqMsg); + log.debug("status=trySolve, solver={}, req={}", solverName, reqStr); + final var res = solver.handle(reqMsg); + if(res == null){ + log.debug("status=notSolved, solver={}, req={}", solverName, reqStr); + continue; + } + log.debug("status=solved, solver={}, req={}, res={}", solverName, reqStr, simplePrint(res)); + return res; + } catch (Exception e) { + log.warn("status=solverFailed, solver={}, msg={}", solverName, e.getMessage(), e); + } + } + return null; + } + + void res(DatagramSocket server, Message handle, InetAddress address, int port) { + try { + final var response = handle.toWire(); + final var out = new DatagramPacket(response, response.length); + out.setAddress(address); + out.setPort(port); + + server.send(out); + + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/DockerSolver.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/DockerSolver.java new file mode 100644 index 000000000..8a3d7ac74 --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/DockerSolver.java @@ -0,0 +1,103 @@ +package com.mageddo.dnsproxyserver.server.dns.solver; + +import com.mageddo.dnsproxyserver.docker.DockerRepository; +import com.mageddo.dnsproxyserver.utils.Ips; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.xbill.DNS.ARecord; +import org.xbill.DNS.DClass; +import org.xbill.DNS.Message; +import org.xbill.DNS.Section; + +import javax.inject.Inject; + +@Slf4j +@AllArgsConstructor(onConstructor = @__({@Inject})) +public class DockerSolver implements Solver { + + private final DockerRepository dockerRepository; + + @Override + public Message handle(Message reqMsg) { + +// questionName := question.Name[:len(question.Name)-1] + final var question = reqMsg.getQuestion(); + final var questionName = question.getName().toString(true); + +// for _, host := range getAllHosts("." + questionName) { +// if s.c.ContainsKey(host) { +// return s.doSolve(ctx, host, question) +// } +// } + for (final var host : Wildcards.buildHostAndWildcards(questionName)) { + final var ip = this.dockerRepository.findHostIp(host); + if (ip == null) { + return null; + } + return this.toMsg(reqMsg, ip); + } + + +// func (s DockerDnsSolver) doSolve(ctx context.Context, k string, q dns.Question) (*dns.Msg, error) { +// logging.Debugf("solver=docker, status=solved-key, question=%s, hostname=%s, ip=%+v", ctx, q.Name, k, s.c.Get(k)) +// return s.getMsg(k, q), nil +// } +// +// func NewDockerSolver(c cache.Cache) DockerDnsSolver { +// return DockerDnsSolver{c} +// } +// +// func (s DockerDnsSolver) getMsg(key string, question dns.Question) *dns.Msg { +// ip := s.c.Get(key).(string) +// ipArr := strings.Split(ip, ".") +// i1, _ := strconv.Atoi(ipArr[0]) +// i2, _ := strconv.Atoi(ipArr[1]) +// i3, _ := strconv.Atoi(ipArr[2]) +// i4, _ := strconv.Atoi(ipArr[3]) +// +// rr := &dns.A{ +// Hdr: dns.RR_Header{Name: question.Name, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 0}, +// A: net.IPv4(byte(i1), byte(i2), byte(i3), byte(i4)), +// } +// +// m := new(dns.Msg) +// m.Answer = append(m.Answer, rr) +// return m +// } + + + return null; + } + + Message toMsg(Message reqMsg, String ip) { + final var res = new Message(reqMsg.getHeader().getID()); +// = Record.newRecord(reqMsg.getQuestion().getName(), Type.A, DClass.IN, 30, Ips.toBytes(ip)); + final var answer = new ARecord(reqMsg.getQuestion().getName(), DClass.IN, 30L, Ips.toAddress(ip)); + res.addRecord(answer, Section.ANSWER); + return res; + } + +// func (s DockerDnsSolver) getMsg(key string, question dns.Question) *dns.Msg { +// ip := s.c.Get(key).(string) +// ipArr := strings.Split(ip, ".") +// i1, _ := strconv.Atoi(ipArr[0]) +// i2, _ := strconv.Atoi(ipArr[1]) +// i3, _ := strconv.Atoi(ipArr[2]) +// i4, _ := strconv.Atoi(ipArr[3]) +// +// rr := &dns.A{ +// Hdr: dns.RR_Header{Name: question.Name, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 0}, +// A: net.IPv4(byte(i1), byte(i2), byte(i3), byte(i4)), +// } +// +// m := new(dns.Msg) +// m.Answer = append(m.Answer, rr) +// return m +// } + + + @Override + public byte priority() { + return Priority.ZERO; + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Priority.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Priority.java new file mode 100644 index 000000000..0d122ec19 --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Priority.java @@ -0,0 +1,11 @@ +package com.mageddo.dnsproxyserver.server.dns.solver; + +public class Priority { + public static final byte ZERO = 1; + + public static final byte ONE = 1; + public static final byte TWO = 2; + public static final byte THREE = 3; + + public static final byte FOUR = 4; +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/RemoteSolver.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/RemoteSolver.java new file mode 100644 index 000000000..bc1f53127 --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/RemoteSolver.java @@ -0,0 +1,28 @@ +package com.mageddo.dnsproxyserver.server.dns.solver; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.xbill.DNS.Message; +import org.xbill.DNS.Resolver; + +import javax.inject.Inject; +import java.io.IOException; +import java.io.UncheckedIOException; + +@Slf4j +@AllArgsConstructor(onConstructor = @__({@Inject})) +public class RemoteSolver implements Solver { + + private final Resolver delegate; + + @Override + public Message handle(Message req) { + try { + final var res = this.delegate.send(req); + log.info("status=handled, req={}, res={}", req, res); + return res; + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/RemoteSolverConfig.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/RemoteSolverConfig.java new file mode 100644 index 000000000..f5926b2ba --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/RemoteSolverConfig.java @@ -0,0 +1,18 @@ +package com.mageddo.dnsproxyserver.server.dns.solver; + +import com.mageddo.dnsproxyserver.utils.Ips; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.net.InetSocketAddress; + +@Data +@Accessors(chain = true) +public class RemoteSolverConfig { + private byte[] ip; + private short port; + + public InetSocketAddress toSocketAddress() { + return new InetSocketAddress(Ips.toAddress(this.ip), this.port); + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Solver.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Solver.java new file mode 100644 index 000000000..1269c9274 --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Solver.java @@ -0,0 +1,11 @@ +package com.mageddo.dnsproxyserver.server.dns.solver; + +import org.xbill.DNS.Message; + +public interface Solver { + Message handle(Message reqMsg); + + default byte priority(){ + return Byte.MAX_VALUE; + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Solvers.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Solvers.java new file mode 100644 index 000000000..0c5597b44 --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Solvers.java @@ -0,0 +1,14 @@ +package com.mageddo.dnsproxyserver.server.dns.solver; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Set; + +public class Solvers { + public static List sorted(Set source) { + final var solvers = new ArrayList<>(source); + solvers.sort(Comparator.comparing(Solver::priority)); + return solvers; + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Wildcards.java b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Wildcards.java new file mode 100644 index 000000000..544ec689b --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/server/dns/solver/Wildcards.java @@ -0,0 +1,26 @@ +package com.mageddo.dnsproxyserver.server.dns.solver; + +import java.util.ArrayList; +import java.util.List; + +public class Wildcards { + public static List buildHostAndWildcards(String hostname) { + + final var query = "." + hostname; + final var hostnames = new ArrayList(); + hostnames.add(query.substring(1)); + + int fromIndex = 0, actual = 0; + while (true) { + final var str = query.substring(fromIndex); + actual = str.indexOf('.'); + + if (actual == -1 || actual + 1 >= str.length()) { + break; + } + hostnames.add(str.substring(actual)); + fromIndex += actual + 1; + } + return hostnames; + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/threads/ThreadPool.java b/src/main/java/com/mageddo/dnsproxyserver/threads/ThreadPool.java new file mode 100644 index 000000000..0e0805c0e --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/threads/ThreadPool.java @@ -0,0 +1,23 @@ +package com.mageddo.dnsproxyserver.threads; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; + +public class ThreadPool { + private static final ScheduledExecutorService pool = create(5); + + public static ScheduledExecutorService create(int size) { + return Executors.newScheduledThreadPool( + size, + ThreadPool::createDaemonThread + ); + } + public static Thread createDaemonThread(Runnable r) { + final var t = new Thread(r); + t.setDaemon(true); + return t; + } + public static ScheduledExecutorService main() { + return pool; + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/utils/Classes.java b/src/main/java/com/mageddo/dnsproxyserver/utils/Classes.java new file mode 100644 index 000000000..534ae5164 --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/utils/Classes.java @@ -0,0 +1,7 @@ +package com.mageddo.dnsproxyserver.utils; + +public class Classes { + public static String findSimpleName(Object o) { + return o.getClass().getSimpleName(); + } +} diff --git a/src/main/java/com/mageddo/dnsproxyserver/utils/Ips.java b/src/main/java/com/mageddo/dnsproxyserver/utils/Ips.java new file mode 100644 index 000000000..a42abd9ae --- /dev/null +++ b/src/main/java/com/mageddo/dnsproxyserver/utils/Ips.java @@ -0,0 +1,31 @@ +package com.mageddo.dnsproxyserver.utils; + +import org.apache.commons.lang3.Validate; + +import java.io.UncheckedIOException; +import java.net.InetAddress; +import java.net.UnknownHostException; + +public class Ips { + public static byte[] toBytes(String ip) { + final var tokens = ip.split("\\."); + Validate.isTrue(tokens.length == 4, "Wrong number of tokens: %d", tokens.length); + final var bytes = new byte[4]; + for (int i = 0; i < tokens.length; i++) { + bytes[i] = (byte)Integer.parseInt(tokens[i]); + } + return bytes; + } + + public static InetAddress toAddress(String ip) { + return toAddress(toBytes(ip)); + } + + public static InetAddress toAddress(byte[] ip) { + try { + return InetAddress.getByAddress(ip); + } catch (UnknownHostException e) { + throw new UncheckedIOException(e); + } + } +} diff --git a/src/main/resources/META-INF/native-image/graal-generated/jni-config.json b/src/main/resources/META-INF/native-image/graal-generated/jni-config.json new file mode 100644 index 000000000..8b4e41703 --- /dev/null +++ b/src/main/resources/META-INF/native-image/graal-generated/jni-config.json @@ -0,0 +1,6 @@ +[ +{ + "name":"java.lang.Boolean", + "methods":[{"name":"getBoolean","parameterTypes":["java.lang.String"] }] +} +] diff --git a/src/main/resources/META-INF/native-image/graal-generated/reflect-config.json b/src/main/resources/META-INF/native-image/graal-generated/reflect-config.json new file mode 100644 index 000000000..41b2ebd2d --- /dev/null +++ b/src/main/resources/META-INF/native-image/graal-generated/reflect-config.json @@ -0,0 +1,520 @@ +[ +{ + "name":"[Lcom.fasterxml.jackson.databind.deser.BeanDeserializerModifier;" +}, +{ + "name":"[Lcom.github.dockerjava.api.model.Bind;" +}, +{ + "name":"[Lcom.github.dockerjava.api.model.Capability;" +}, +{ + "name":"[Lcom.github.dockerjava.api.model.ContainerPort;" +}, +{ + "name":"[Lcom.github.dockerjava.api.model.Device;" +}, +{ + "name":"[Lcom.github.dockerjava.api.model.ExposedPort;" +}, +{ + "name":"[Lcom.github.dockerjava.api.model.Link;" +}, +{ + "name":"[Lcom.github.dockerjava.api.model.LxcConf;" +}, +{ + "name":"[Lcom.github.dockerjava.api.model.PortBinding;" +}, +{ + "name":"[Lcom.github.dockerjava.api.model.Ports$Binding;" +}, +{ + "name":"[Lcom.github.dockerjava.api.model.Ulimit;" +}, +{ + "name":"[Lcom.github.dockerjava.api.model.VolumeBind;" +}, +{ + "name":"[Lcom.github.dockerjava.api.model.VolumeRW;" +}, +{ + "name":"[Lcom.github.dockerjava.api.model.VolumesFrom;" +}, +{ + "name":"[Ljava.lang.String;" +}, +{ + "name":"ch.qos.logback.classic.encoder.PatternLayoutEncoder", + "queryAllPublicMethods":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.classic.pattern.DateConverter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.classic.pattern.LevelConverter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.classic.pattern.LineOfCallerConverter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.classic.pattern.LineSeparatorConverter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.classic.pattern.LoggerConverter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.classic.pattern.MessageConverter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.classic.pattern.MethodOfCallerConverter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.classic.pattern.ThreadConverter", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.core.ConsoleAppender", + "queryAllPublicMethods":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"ch.qos.logback.core.OutputStreamAppender", + "methods":[{"name":"setEncoder","parameterTypes":["ch.qos.logback.core.encoder.Encoder"] }] +}, +{ + "name":"ch.qos.logback.core.encoder.LayoutWrappingEncoder", + "methods":[ + {"name":"setCharset","parameterTypes":["java.nio.charset.Charset"] }, + {"name":"setParent","parameterTypes":["ch.qos.logback.core.spi.ContextAware"] } + ] +}, +{ + "name":"ch.qos.logback.core.pattern.PatternLayoutEncoderBase", + "methods":[{"name":"setPattern","parameterTypes":["java.lang.String"] }] +}, +{ + "name":"com.fasterxml.jackson.databind.ext.Java7HandlersImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.fasterxml.jackson.databind.ext.Java7SupportImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.github.dockerjava.api.command.GraphData", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.github.dockerjava.api.command.GraphDriver", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.github.dockerjava.api.command.HealthState", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.command.HealthStateLog", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.command.InspectContainerResponse", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.github.dockerjava.api.command.InspectContainerResponse$ContainerState", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "queryAllPublicConstructors":true, + "methods":[{"name":"","parameterTypes":["com.github.dockerjava.api.command.InspectContainerResponse"] }] +}, +{ + "name":"com.github.dockerjava.api.command.InspectContainerResponse$Mount", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.github.dockerjava.api.command.InspectContainerResponse$Node", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "queryAllPublicConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.AccessMode", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true +}, +{ + "name":"com.github.dockerjava.api.model.Bind", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.BindOptions", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.BindPropagation", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true +}, +{ + "name":"com.github.dockerjava.api.model.Binds", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"fromPrimitive","parameterTypes":["java.lang.String[]"] }] +}, +{ + "name":"com.github.dockerjava.api.model.BlkioRateDevice", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.BlkioWeightDevice", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.Capability", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true +}, +{ + "name":"com.github.dockerjava.api.model.Container", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.github.dockerjava.api.model.ContainerConfig", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.github.dockerjava.api.model.ContainerHostConfig", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.github.dockerjava.api.model.ContainerMount", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.github.dockerjava.api.model.ContainerNetwork", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.github.dockerjava.api.model.ContainerNetwork$Ipam", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.ContainerNetworkSettings", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.github.dockerjava.api.model.ContainerPort", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.github.dockerjava.api.model.Device", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.DeviceRequest", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.DockerObject", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true +}, +{ + "name":"com.github.dockerjava.api.model.Driver", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.ExposedPort", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.ExposedPorts", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"fromPrimitive","parameterTypes":["java.util.Map"] }] +}, +{ + "name":"com.github.dockerjava.api.model.HealthCheck", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.HostConfig", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.github.dockerjava.api.model.InternetProtocol", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true +}, +{ + "name":"com.github.dockerjava.api.model.Isolation", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "methods":[{"name":"fromValue","parameterTypes":["java.lang.String"] }] +}, +{ + "name":"com.github.dockerjava.api.model.Link", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.Links", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.LogConfig", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[ + {"name":"","parameterTypes":[] }, + {"name":"setType","parameterTypes":["com.github.dockerjava.api.model.LogConfig$LoggingType"] } + ] +}, +{ + "name":"com.github.dockerjava.api.model.LogConfig$LoggingType", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "methods":[{"name":"fromValue","parameterTypes":["java.lang.String"] }] +}, +{ + "name":"com.github.dockerjava.api.model.LxcConf", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.Mount", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.MountType", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true +}, +{ + "name":"com.github.dockerjava.api.model.NetworkSettings", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.github.dockerjava.api.model.Ports", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"fromPrimitive","parameterTypes":["java.util.Map"] }] +}, +{ + "name":"com.github.dockerjava.api.model.Ports$Binding", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.PropagationMode", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true +}, +{ + "name":"com.github.dockerjava.api.model.RestartPolicy", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.github.dockerjava.api.model.SELContext", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true +}, +{ + "name":"com.github.dockerjava.api.model.TmpfsOptions", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.Ulimit", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.Volume", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["java.lang.String"] }] +}, +{ + "name":"com.github.dockerjava.api.model.VolumeBind", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.VolumeBinds", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.VolumeOptions", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.VolumeRW", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.VolumesFrom", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.github.dockerjava.api.model.VolumesRW", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true +}, +{ + "name":"com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"java.io.FilePermission" +}, +{ + "name":"java.io.Serializable", + "queryAllDeclaredMethods":true +}, +{ + "name":"java.lang.RuntimePermission" +}, +{ + "name":"java.net.NetPermission" +}, +{ + "name":"java.net.SocketPermission" +}, +{ + "name":"java.net.URLPermission", + "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String"] }] +}, +{ + "name":"java.net.UnixDomainSocketAddress", + "methods":[{"name":"of","parameterTypes":["java.lang.String"] }] +}, +{ + "name":"java.security.AllPermission" +}, +{ + "name":"java.security.SecureRandomParameters" +}, +{ + "name":"java.security.SecurityPermission" +}, +{ + "name":"java.util.PropertyPermission" +}, +{ + "name":"javax.management.ObjectName" +}, +{ + "name":"sun.security.provider.NativePRNG", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.NativePRNG$NonBlocking", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.SHA", + "methods":[{"name":"","parameterTypes":[] }] +} +] diff --git a/src/main/resources/META-INF/native-image/native-image.properties b/src/main/resources/META-INF/native-image/native-image.properties new file mode 100644 index 000000000..bda581df0 --- /dev/null +++ b/src/main/resources/META-INF/native-image/native-image.properties @@ -0,0 +1,10 @@ +Args=-H:ReflectionConfigurationResources=${.}/reflection-config.json \ + -H:ReflectionConfigurationResources=${.}/reflection-docker-java-command.json,${.}/reflection-docker-java-model.json \ + -H:ReflectionConfigurationResources=${.}/graal-generated/jni-config.json \ + -H:ReflectionConfigurationResources=${.}/graal-generated/reflect-config.json \ + -H:IncludeResources=.*.yml|.*.properties|cacerts|logback.xml|org/apache/hc/client5/version.properties|org/slf4j/impl/StaticLoggerBinder.class \ + -H:+AddAllCharsets \ + -H:EnableURLProtocols=http,https \ + --enable-all-security-services \ + -Dfile.encoding=UTF-8 \ + -Djavax.net.ssl.trustStore=cacerts diff --git a/src/main/resources/META-INF/native-image/reflection-config.json b/src/main/resources/META-INF/native-image/reflection-config.json new file mode 100644 index 000000000..98f24c30f --- /dev/null +++ b/src/main/resources/META-INF/native-image/reflection-config.json @@ -0,0 +1,7 @@ +[ + { + "name": "ch.qos.logback.core.ConsoleAppender", + "allDeclaredConstructors": true, + "allPublicConstructors": true + } +] diff --git a/src/main/resources/META-INF/native-image/reflection-docker-java-command.json b/src/main/resources/META-INF/native-image/reflection-docker-java-command.json new file mode 100644 index 000000000..13de6a1e7 --- /dev/null +++ b/src/main/resources/META-INF/native-image/reflection-docker-java-command.json @@ -0,0 +1,272 @@ +[ + { + "name" : "com.github.dockerjava.api.command.PullImageResultCallback", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.PushImageCmd$1", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.CreateContainerResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.HealthState", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.InspectContainerResponse$ContainerState", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.CreateSecretResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.GraphData", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.InspectExecResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.CreateImageResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.InspectContainerResponse$Node", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.CreateConfigResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.InspectExecResponse$Container", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.InspectContainerResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.ExecCreateCmdResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.InspectVolumeResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.CreateNetworkResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.ListVolumesResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.HealthStateLog", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.GraphDriver", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.InspectContainerResponse$Mount", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.InspectImageResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.TopContainerResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.RootFS", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.CreateServiceResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.InspectExecResponse$ProcessConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.CreateVolumeResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.DelegatingDockerCmdExecFactory", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.LoadImageCallback", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.BuildImageResultCallback", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.command.WaitContainerResultCallback", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + } +] diff --git a/src/main/resources/META-INF/native-image/reflection-docker-java-model.json b/src/main/resources/META-INF/native-image/reflection-docker-java-model.json new file mode 100644 index 000000000..212061034 --- /dev/null +++ b/src/main/resources/META-INF/native-image/reflection-docker-java-model.json @@ -0,0 +1,1568 @@ +[ + { + "name" : "com.github.dockerjava.api.model.DockerObject", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ResponseItem", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.GenericResource", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ClusterInfo", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.NetworkSettings", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Node", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ServiceUpdateStatus", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Link", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmOrchestration", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ServiceReplicatedModeOptions", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ServiceSpec", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmNodeSpec", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.NetworkAttachmentConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.UpdateConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Ulimit", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.PidsStatsConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ResponseItem$AuxDetail", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.BlkioWeightDevice", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ConfigSpec", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.AuthConfigurations", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ContainerNetworkSettings", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.DeviceRequest", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Secret", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ContainerSpecPrivileges", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmNodeEngineDescription", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ContainerNetwork$Ipam", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ExternalCA", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.EventActor", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Statistics", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Endpoint", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ContainerSpecSecret", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmNodePlatform", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.WaitResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.InfoRegistryConfig$IndexConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ContainerMount", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ContainerSpecFile", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Version", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.DriverStatus", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmVersion", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Device", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ResourceSpecs", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmNodePluginDescription", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ObjectVersion", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ResourceVersion", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ContainerConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.TmpfsOptions", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.EndpointVirtualIP", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.HostConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.StatisticNetworksConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmNode", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.BlkioStatEntry", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Service", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ContainerHostConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ThrottlingDataConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.MemoryStatsConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ErrorDetail", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.VersionPlatform", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ServiceRestartPolicy", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmCAConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmNodeResources", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.VolumeBind", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Network", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Network$Ipam", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.StatsConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.TaskDefaults", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmNodeVersion", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.InfoRegistryConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ContainerNetwork", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ResponseItem$ProgressDetail", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Ports$Binding", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Task", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.PortConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ServiceGlobalModeOptions", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Container", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmNodeStatus", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmSpec", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmJoinTokens", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.PeerNode", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Mount", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SecretSpec", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.TaskSpec", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ServicePlacement", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Network$ContainerNetworkConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmDispatcherConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.PortBinding", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Identifier", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.BlkioStatsConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ResourceRequirements", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ResponseItem$ErrorDetail", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmNodeManagerStatus", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Network$Ipam$Config", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmNodeDescription", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SearchItem", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.EndpointSpec", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.RestartPolicy", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.TaskStatus", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.HealthCheck", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Config", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ContainerPort", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Repository", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmInfo", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Info", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Bind", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ChangeLog", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.VolumeOptions", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ServiceModeConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.VersionComponent", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.TaskStatusContainerStatus", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Frame", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.BindOptions", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Driver", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.AuthConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Event", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.BlkioRateDevice", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ContainerSpecPrivilegesSELinuxContext", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.LogConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.CpuUsageConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.CpuStatsConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ContainerDNSConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.AuthResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Image", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ContainerSpec", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmRaftConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ContainerSpecPrivilegesCredential", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ContainerSpecConfig", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.LxcConf", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.PruneResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.BuildResponseItem", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.PullResponseItem", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.PushResponseItem", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.LoadResponseItem", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.UpdateContainerResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ServiceRestartCondition", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmNodeRole", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.EndpointResolutionMode", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.UpdateFailureAction", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.StreamType", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ExternalCAProtocol", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.PortConfigProtocol", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Reachability", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Isolation", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.PropagationMode", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.TaskState", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.InternetProtocol", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.UpdateOrder", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.LogConfig$LoggingType", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.MountType", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SELContext", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.AccessMode", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.BindPropagation", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmNodeAvailability", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.SwarmNodeState", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.PruneType", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Capability", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.PortConfig$PublishMode", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ServiceMode", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.LocalNodeState", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.EventType", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ServiceUpdateState", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.NamedResourceSpec", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.DiscreteResourceSpec", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Swarm", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.VolumesRW", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.VolumesFrom", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ExposedPort", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Volumes", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Volume", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Links", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ExposedPorts", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.VolumeRW", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.VolumeBinds", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Ports", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.ErrorResponse", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + }, + { + "name" : "com.github.dockerjava.api.model.Binds", + "allDeclaredConstructors" : true, + "allPublicConstructors" : true, + "allDeclaredMethods" : true, + "allPublicMethods" : true, + "allPublicFields" : true, + "allDeclaredFields" : true + } +] diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index eb5eef987..36f2398bc 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -1,17 +1,20 @@ - - - - ${log_pattern} - utf8 - - + + + + ${log_pattern} + utf8 + + - - - + + + + + + diff --git a/src/main/resources/native-image/native-image.properties b/src/main/resources/native-image/native-image.properties deleted file mode 100644 index afc0da321..000000000 --- a/src/main/resources/native-image/native-image.properties +++ /dev/null @@ -1,7 +0,0 @@ -Args=-H:ReflectionConfigurationResources=${.}/reflection-config.json \ - -H:IncludeResources=.*.yml|.*.properties|cacerts \ - -H:+AddAllCharsets \ - -H:EnableURLProtocols=http,https \ - --enable-all-security-services \ - -Dfile.encoding=UTF-8 \ - -Djavax.net.ssl.trustStore=cacerts diff --git a/src/main/resources/native-image/reflection-config.json b/src/main/resources/native-image/reflection-config.json deleted file mode 100644 index fe51488c7..000000000 --- a/src/main/resources/native-image/reflection-config.json +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/src/test/java/com/mageddo/dnsproxyserver/dns/server/solver/WildcardsTest.java b/src/test/java/com/mageddo/dnsproxyserver/dns/server/solver/WildcardsTest.java new file mode 100644 index 000000000..7d08c0bd1 --- /dev/null +++ b/src/test/java/com/mageddo/dnsproxyserver/dns/server/solver/WildcardsTest.java @@ -0,0 +1,23 @@ +package com.mageddo.dnsproxyserver.dns.server.solver; + +import org.junit.jupiter.api.Test; + +import static com.mageddo.dnsproxyserver.server.dns.solver.Wildcards.buildHostAndWildcards; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class WildcardsTest { + @Test + void mustGenerateHostsAndWildcardsTo(){ + // arrange + final var hostname = "bookmarks.mageddo.com"; + + // act + final var result = buildHostAndWildcards(hostname); + + // assert + assertEquals( + "[bookmarks.mageddo.com, .bookmarks.mageddo.com, .mageddo.com, .com]", + result.toString() + ); + } +}