├── .gitignore
├── README.md
├── compile.sh
├── compile
├── Windows.md
├── compile.bat
├── config_backup.xml
├── config_missing_net_static.xml
├── config_no_statics.xml
├── config_no_statics_hard.xml
├── config_no_subnets.xml
└── config_no_subnets_hard.xml
├── img
├── VideoThumb.png
├── Win1.png
├── Win21.png
├── Win3.png
├── Win4.png
├── WinGit1.png
├── WinVS1.png
├── WinVS2.png
├── WinVS3.png
└── WinVS4.png
├── pom.xml
└── src
└── main
├── java
└── com
│ └── simtechdata
│ ├── App.java
│ ├── data
│ └── StaticmapLocal.java
│ ├── enums
│ └── Mode.java
│ ├── migrate
│ ├── Message.java
│ └── Migrate.java
│ └── pojos
│ ├── Reservation.java
│ ├── Subnet4.java
│ └── Subnets.java
└── resources
└── version.properties
/.gitignore:
--------------------------------------------------------------------------------
1 | .mvn/
2 | .idea/
3 | build/
4 | graalvm/
5 | target/
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Migration
2 |
3 | Migration is a utility that will take your static IP address mappings in OPNsense and migrate them over to the Kea DHCP server that comes with OPNsense version 24.
4 |
5 | - **You must upgrade to OPNsense version 24 before using this utility**
6 |
7 | ### Here is a video tutorial if that works best for you
8 |
9 | [
](https://youtu.be/9yLQezDKVoY)
10 |
11 | ### This is a simple tool to use:
12 |
13 | 1) [Download the program](https://github.com/EasyG0ing1/Migration/releases/latest) for your operating system (they are native binaries, no need for a Java runtime environment).
14 | * Create a clean folder to put the program in
15 | 2) From your OPNsense interface, go to Services / Kea DHCP / Kea DHCPv4 Then Subnets on the right
16 | 3) Define all of your subnets and their IP Pools.
17 | * The tool uses those newly created subnets to automatically assign your current reservations to the correct subnet.
18 | 4) Apply those changes
19 | 5) Go to System / Configuration / Backups
20 | 6) Click on Download Configuration
21 | * Save the file as `config.xml` in the same folder you downloaded to tool into
22 | * Make a copy of it just in case
23 | 7) Open a shell (cmd.exe or terminal etc.) and go into that folder
24 | 8) run `migrate`
25 | - You should see that the file `new_config.xml` has been created
26 | - If you don't then you will see a description of some problem that was found which will help you understand what needs to be fixed in your config.xml file
27 | 9) Go back into OPNsense under backups and restore this new file.
28 | - Make sure you UNCKECK the box that says Reboot after restore
29 |
30 | Done!
31 |
32 | ### [Binaries](https://github.com/EasyG0ing1/Migration/releases/latest)
33 | The binaries were compiled and tested in these operating systems
34 |
35 | - Windows 11 (build 21996.1)
36 | - MacOS Sonoma 14.2.1
37 | - Ubuntu 22.0.4 LTS (Jammy Jellyfish)
38 |
39 | With MacOS or Linux you might need to set the program as executable
40 |
41 | ```bash
42 | chmod +x migrate
43 | ```
44 |
45 | No guarantees with older versions of these operating systems.
46 |
47 | ## Summary of what this utility does
48 | * Loads config.xml into memory
49 | * Loads existing static maps into memory from the `staticmap` xml node
50 | * Loads the Kea subnets from the `subnet4` xml node
51 | * Iterates through each static mapping
52 | * Compares each IP address with the Kea Subnets you created looking for a match
53 | * Creates a new Kea DHCP static mapping using the subnet UUID from the matched subnet
54 | * Assigns a new random UUID to the new static map for Kea
55 | * Converts the new mappings into xml under the node name `reservations`
56 | * Replaces the `reservations` xml node from the original `config.xml` file
57 | * Saves the modified xml to a new file named `new_config.xml`
58 |
59 | Every step along the way is checked for problems and if any are found, the program tells you exactly what you need to look for to settle the problem.
60 |
61 | # Compiling
62 |
63 | If you are a glutton for punishment and you want to compile the code yourself, these instructions will work.
64 |
65 | ## Windows
66 |
67 | [Click Here](compile/Windows.md) to learn how to setup the Windows build environment
68 |
69 | After following those instructions, you should have made the `github` folder off the root. If not:
70 |
71 | ```bash
72 | mkdir C:\github
73 | ```
74 |
75 | Next
76 |
77 | ```bash
78 | cd C:\github
79 | git clone https://github.com/EasyG0ing1/Migration.git
80 | cd Migration\compile
81 | compile.bat
82 | ```
83 |
84 | It could take anywhere from a minute to ten minutes or longer to compile the native image depending on your CPU and how
85 | much RAM you have. Be patient!
86 |
87 | The executable will be here `C:\github\Migration\target\migrate.exe`
88 |
89 | ## MacOS and Linux
90 |
91 | - First, install SDK Man
92 | ```shell
93 | curl -s "https://get.sdkman.io" | bash
94 | ```
95 | - It will give you a command to copy and paste into terminal that will source the config, or simply restart your terminal.
96 | - Next, install GraalVM v21
97 | ```shell
98 | sdk install java 21.0.2-graal
99 | ```
100 | (this takes about a minute-ish)
101 | - Install Maven
102 | - Pick a folder to hold the maven file tree
103 | - Go into that folder
104 | ```shell
105 | cd /My/Folder
106 | wget https://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.zip
107 | unzip apache-maven-3.9.6-bin.zip
108 | mv apache-maven-3.9.6 maven3.9.6
109 | ```
110 | - Edit whatever file you use to run exports when your shell starts and add
111 | ```shell
112 | export PATH="/My/Path/To/maven3.9.6/bin":$PATH
113 | ```
114 | - Run that command in your terminal too so that you don't need to restart terminal
115 | - Run this and expect the output shown here
116 | ```shell
117 | mvn --version
118 | ```
119 | Output
120 | ```text
121 | Apache Maven 3.9.6
122 | Maven home: /My/Path/To/maven3.9.6/libexec
123 | Java version: 21, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/graalvm-jdk-21+35.1/Contents/Home
124 | ```
125 |
126 | - If you're using MacOS and you DON'T have the xcode command line tools installed, run this
127 | ```shell
128 | xcode-select install
129 | ```
130 | - And it will take a LOOOONG time to finish - possibly up to 20 minutes or longer. Get some coffee or water or popcorn ...
131 | - If you're using Linux, then you need to install this
132 | ```shell
133 | sudo apt update
134 | sudo apt install build-essential libz-dev zlib1g-dev -y
135 | ```
136 | - This won't take too long to install
137 | - We're back to ALL OS's from here
138 | - Next, go into a folder you can clone this repository into then
139 | ```shell
140 | git clone https://github.com/EasyG0ing1/Migration.git
141 | cd Migration
142 | chmod +x compile.sh
143 | ./compile.sh
144 | ls -l target
145 | ```
146 |
147 | - It can take some time to build the native-image. On a 2019 MBP it takes about a minute. On older hardware it can take
148 | up to 10 minutes or more, it depends on your CPU and how much RAM you have. Just be patient, if there is a problem, it
149 | will throw an error and dump out so if that didn't happen, then it's working.
150 | - You should see the `migrate` binary in the target folder.
151 | - You may need to set it as executable
152 | ```shell
153 | chmod +x target/migrate
154 | ```
155 |
156 | # Issues
157 | If you have any problems that you can't figure out, create an issue and I will be happy to assist.
158 |
159 | ### Contributing
160 | Create an Issue or a Pull Request if you want to contribute to the project.
161 |
162 | ### Updates
163 |
164 | * 2.2.0
165 | * Cleaned up code to simplify
166 | * Removed unused pojos
167 | * Added enums Package
168 | * Added migrate Package
169 | * Added Migrate class
170 | * Cleaned up Message class and removed unused objects
171 | * Added Mode enum
172 |
173 | * 2.1.4
174 | * Modified handling of ISC DHCP mappings when no MAC address exists where a CID value is provided
175 | * Updated the static mapping error messages so that they include relevant details from the static map, making it easier to locate the record for correction
176 |
177 | * 2.1.3
178 | * Minor changes to code structure
179 |
180 | * 2.1.2
181 | * Fixed problem where xml tags were in the wrong case in the `new_config.xml`
182 |
183 | * 2.1.1
184 | * Added clear and expanded error messages so that any problems that might happen should always present the user with a clear and exact cause of the problem along with instructions explaining how to correct the problem
185 |
186 | * 2.1.0
187 | * Removed the need to run a check before doing the migration
188 | * Users will get specific feedback if there are any problems which will let them know exactly what is wrong if there are any problems with the migration.
189 |
190 | * 2.0.1
191 | * Minor enhancements
192 |
193 | * 2.0.0
194 | * Streamlined use of XML library, eliminating unnecessary calls.
195 | * Program now outputs a file that can be directly imported into OPNsense
196 |
197 | * 1.0.1
198 | * Added more detailed error reporting
199 |
200 | * 1.0.0
201 | * Initial Release
202 |
--------------------------------------------------------------------------------
/compile.sh:
--------------------------------------------------------------------------------
1 | G=graalvm
2 | T=target
3 | C=compile
4 | mvn clean package
5 | java --enable-preview -agentlib:native-image-agent=config-merge-dir=$G -jar $T/Migration-jar-with-dependencies.jar version
6 | cp $C/config_backup.xml ./config.xml
7 | java --enable-preview -agentlib:native-image-agent=config-merge-dir=$G -jar $T/Migration-jar-with-dependencies.jar graal
8 | cp $C/config_no_statics.xml ./config.xml
9 | java --enable-preview -agentlib:native-image-agent=config-merge-dir=$G -jar $T/Migration-jar-with-dependencies.jar graal
10 | cp $C/config_no_statics_hard.xml ./config.xml
11 | java --enable-preview -agentlib:native-image-agent=config-merge-dir=$G -jar $T/Migration-jar-with-dependencies.jar graal
12 | cp $C/config_no_subnets.xml ./config.xml
13 | java --enable-preview -agentlib:native-image-agent=config-merge-dir=$G -jar $T/Migration-jar-with-dependencies.jar graal
14 | cp $C/config_missing_net_static.xml ./config.xml
15 | java --enable-preview -agentlib:native-image-agent=config-merge-dir=$G -jar $T/Migration-jar-with-dependencies.jar graal
16 | cp $C/config_no_subnets_hard.xml ./config.xml
17 | java --enable-preview -agentlib:native-image-agent=config-merge-dir=$G -jar $T/Migration-jar-with-dependencies.jar graal
18 | rm ./config.xml
19 | rm ./new_config.xml
20 | mvn clean -Pnative native:compile
21 |
--------------------------------------------------------------------------------
/compile/Windows.md:
--------------------------------------------------------------------------------
1 | ## Windows Build Environment
2 |
3 | If you have the ability to use a virtual machine and a clean install of Windows, that would be your best option. That
4 | way, when were're finished, you just delete the VM after you have your binary file. If not, no worries; we'll have a
5 | clean up process when we're done to remove the build tools that you'll need to install to make this binary.
6 |
7 | You will need:
8 |
9 | * GraalVM with Java version 22 and you can download it [here](https://www.graalvm.org/downloads/#)
10 | Chose Java 22 and your Windows version then Download.
11 | * Apache Maven which you can [download here](https://maven.apache.org/download.cgi). Get the Binary zip archive under
12 | Link.
13 | * Visual Studio Build Tools (install steps below)
14 |
15 | Create a folder off of the root of C and call it graalvm.
16 |
17 | Next, extract the GraalVM downloaded zip file into that folder. This should end up with a path that looks similar to
18 | this: `C:\graalvm\graalvm-jdk-22.0.1+8.1`
19 |
20 | Next, extract the Maven zip file to the same folder which will give you path similar to
21 | this: `C:\graalvm\apache-maven-3.9.6`
22 |
23 | Next, you need to edit the environment variables so that the build tools know where to find Java and Maven.
24 |
25 | Right click on This PC, Properties, and then click on Advanced system settings. Then click on the button that says
26 | Environment
27 | Variables
28 |
29 | [
]()
30 |
31 | Next, you will need to create a new System environment variable named `JAVA_HOME`
32 |
33 | [
]()
34 |
35 | The path needs to be the path that you extracted the graalvm zip file and it should look similar to whats in the picture
36 | above.
37 |
38 | Next, you need to edit the Path environment variable under System variables by double clicking it, then click New and
39 | add a path to the `bin` folder of both GraalVM and Apache Maven and they should end up looking similar to this:
40 |
41 | [
]()
42 |
43 | Keep clicking OK to get out of those windows.
44 |
45 | ## Install Winget
46 |
47 | Open a Powershell as administrator by tapping the Windows key on your keyboard, then just type in powershell and click
48 | on the Run as Administarator oprion.
49 |
50 | [
]()
51 |
52 | Once powershell is open, run this:
53 |
54 | ```bash
55 | Add-AppxPackage -RegisterByFamilyName -MainPackage Microsoft.DesktopAppInstaller_8wekyb3d8bbwe
56 | ```
57 |
58 | You can close powershell now.
59 |
60 | But here's the thing ... I don't know why, but after you run that command, it takes some time for the `winget` program
61 | to actually install, and you won't see anything indicating that it is installing or that it was installed ... you just
62 | have to wait. In my case, I tried opening and re-opening a CMD shell (fastest way to do that is to hold down the Windows
63 | key, press `R` type `cmd` and hit enter) and typing `winget` to see if it was installed but
64 | after several minutes, it wasn't so I just went and did other stuff for a while then came back like 15 minutes later and
65 | opened a `CMD` shell,
66 | typed in `winget` and walla! There it was!
67 |
68 | Once that is working, you can install `git` like this:
69 |
70 | ```bash
71 | winget install --id Git.Git -e --source winget
72 | ```
73 |
74 | That install you will see happening in real time. Once it's installed, you need to exit out of the cmd shell and open a
75 | new one so that the changes it makes to the path are applied to the active shell.
76 |
77 | Once git is installed, we need to install the Visual Studio Tools. Start by installing the installer:
78 |
79 | ```bash
80 | winget install Microsoft.VisualStudio.2022.BuildTools --exact
81 | ```
82 |
83 | After that completes, open the installer by tapping the Windows key, then click on the installer.
84 |
85 | [
]()
86 |
87 | When that opens, click on these items in the order that they are numbered:
88 |
89 | [
]()
90 |
91 | 1) Workloads
92 | 2) Desktop Development with C++
93 | 3) Make sure all the same boxes are checked and if there are no exact matches, get the latest version of each option
94 | checked.
95 | 4) If your Internet connection is more than 50 megabits, chose `Install While Downloading` if less than that, chose the
96 | option to download first then install.
97 | 5) Click on `Modify`
98 |
99 | Go get some coffee ... or water ... nuke some popcorn ... this will take some time.
100 |
101 | You will see it downloading ...
102 |
103 | [
]()
104 |
105 | Then when you see this message
106 |
107 | [
]()
108 |
109 | You can close the installer.
110 |
111 | Now, open a new `CMD` window (again, the easiest way to do that is to hold down the Windows key on your keyboard and
112 | then
113 | press `R`; then type in `cmd` and hit enter)
114 |
115 | Next, create a github folder off the root
116 |
117 | ```bash
118 | mkdir C:\github
119 | cd C:\github
120 | ```
121 |
122 | type: `mvn --version` and hit enter. You should see something that looks like this:
123 |
124 | [
]()
125 |
126 | Go back to the [README](https://github.com/EasyG0ing1/Migration)
127 |
--------------------------------------------------------------------------------
/compile/compile.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 | set "C=%~dp0"
3 | set "C=%C:~0,-1%"
4 | for %%I in ("%C%") do set "P=%%~dpI"
5 | set "P=%P:~0,-1%"
6 | set "G=%P%\graalvm"
7 | set "T=%P%\target"
8 | rd /S /Q %G%
9 | cd %P%
10 | call mvn -f %P%\pom.xml clean package
11 | call java --enable-preview -agentlib:native-image-agent=config-output-dir=%G% -jar %T%\Migration-jar-with-dependencies.jar version
12 | echo F | xcopy %C%\config_backup.xml %P%\config.xml /Y
13 | call java --enable-preview -agentlib:native-image-agent=config-merge-dir=%G% -jar %T%\Migration-jar-with-dependencies.jar graal
14 | echo F | xcopy %C%\config_missing_net_static.xml %P%\config.xml /Y
15 | call java --enable-preview -agentlib:native-image-agent=config-merge-dir=%G% -jar %T%\Migration-jar-with-dependencies.jar graal
16 | echo F | xcopy %C%\config_no_statics.xml %P%\config.xml /Y
17 | call java --enable-preview -agentlib:native-image-agent=config-merge-dir=%G% -jar %T%\Migration-jar-with-dependencies.jar graal
18 | echo F | xcopy %C%\config_no_statics_hard.xml %P%\config.xml /Y
19 | call java --enable-preview -agentlib:native-image-agent=config-merge-dir=%G% -jar %T%\Migration-jar-with-dependencies.jar graal
20 | echo F | xcopy %C%\config_no_subnets.xml %P%\config.xml /Y
21 | call java --enable-preview -agentlib:native-image-agent=config-merge-dir=%G% -jar %T%\Migration-jar-with-dependencies.jar graal
22 | echo F | xcopy %C%\config_no_subnets_hard.xml %P%\config.xml /Y
23 | call java --enable-preview -agentlib:native-image-agent=config-merge-dir=%G% -jar %T%\Migration-jar-with-dependencies.jar graal
24 | del %P%\config.xml
25 | del %P%\new_config.xml
26 | cd %C%
27 | call mvn -f %P%\pom.xml clean -Pnative native:compile
28 |
--------------------------------------------------------------------------------
/compile/config_no_statics_hard.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | vicuna
4 |
5 | -
6 | Increase UFS read-ahead speeds to match the state of hard drives and NCQ.
7 | vfs.read_max
8 | default
9 |
10 | -
11 | Set the ephemeral port range to be lower.
12 | net.inet.ip.portrange.first
13 | default
14 |
15 | -
16 | Drop packets to closed TCP ports without returning a RST
17 | net.inet.tcp.blackhole
18 | default
19 |
20 | -
21 | Do not send ICMP port unreachable messages for closed UDP ports
22 | net.inet.udp.blackhole
23 | default
24 |
25 | -
26 | Randomize the ID field in IP packets
27 | net.inet.ip.random_id
28 | default
29 |
30 | -
31 |
32 | Source routing is another way for an attacker to try to reach non-routable addresses behind your box.
33 | It can also be used to probe for information about your internal networks. These functions come enabled
34 | as part of the standard FreeBSD core system.
35 |
36 | net.inet.ip.sourceroute
37 | default
38 |
39 | -
40 |
41 | Source routing is another way for an attacker to try to reach non-routable addresses behind your box.
42 | It can also be used to probe for information about your internal networks. These functions come enabled
43 | as part of the standard FreeBSD core system.
44 |
45 | net.inet.ip.accept_sourceroute
46 | default
47 |
48 | -
49 |
50 | This option turns off the logging of redirect packets because there is no limit and this could fill
51 | up your logs consuming your whole hard drive.
52 |
53 | net.inet.icmp.log_redirect
54 | default
55 |
56 | -
57 | Drop SYN-FIN packets (breaks RFC1379, but nobody uses it anyway)
58 | net.inet.tcp.drop_synfin
59 | default
60 |
61 | -
62 | Enable sending IPv6 redirects
63 | net.inet6.ip6.redirect
64 | default
65 |
66 | -
67 | Enable privacy settings for IPv6 (RFC 4941)
68 | net.inet6.ip6.use_tempaddr
69 | default
70 |
71 | -
72 | Prefer privacy addresses and use them over the normal addresses
73 | net.inet6.ip6.prefer_tempaddr
74 | default
75 |
76 | -
77 | Generate SYN cookies for outbound SYN-ACK packets
78 | net.inet.tcp.syncookies
79 | default
80 |
81 | -
82 | Maximum incoming/outgoing TCP datagram size (receive)
83 | net.inet.tcp.recvspace
84 | default
85 |
86 | -
87 | Maximum incoming/outgoing TCP datagram size (send)
88 | net.inet.tcp.sendspace
89 | default
90 |
91 | -
92 | Do not delay ACK to try and piggyback it onto a data packet
93 | net.inet.tcp.delayed_ack
94 | default
95 |
96 | -
97 | Maximum outgoing UDP datagram size
98 | net.inet.udp.maxdgram
99 | default
100 |
101 | -
102 | Handling of non-IP packets which are not passed to pfil (see if_bridge(4))
103 | net.link.bridge.pfil_onlyip
104 | default
105 |
106 | -
107 | Set to 1 to additionally filter on the physical interface for locally destined packets
108 | net.link.bridge.pfil_local_phys
109 | default
110 |
111 | -
112 | net.link.bridge.pfil_member
113 | 0
114 | Set to 0 to disable filtering on the incoming and outgoing member interfaces.
115 |
116 | -
117 | net.link.bridge.pfil_bridge
118 | 1
119 | Set to 1 to enable filtering on the bridge interface
120 |
121 | -
122 | Allow unprivileged access to tap(4) device nodes
123 | net.link.tap.user_open
124 | default
125 |
126 | -
127 | Randomize PID's (see src/sys/kern/kern_fork.c: sysctl_kern_randompid())
128 | kern.randompid
129 | default
130 |
131 | -
132 | Disable CTRL+ALT+Delete reboot from keyboard.
133 | hw.syscons.kbd_reboot
134 | default
135 |
136 | -
137 | Enable TCP extended debugging
138 | net.inet.tcp.log_debug
139 | default
140 |
141 | -
142 | Set ICMP Limits
143 | net.inet.icmp.icmplim
144 | default
145 |
146 | -
147 | TCP Offload Engine
148 | net.inet.tcp.tso
149 | default
150 |
151 | -
152 | UDP Checksums
153 | net.inet.udp.checksum
154 | default
155 |
156 | -
157 | Maximum socket buffer size
158 | kern.ipc.maxsockbuf
159 | default
160 |
161 | -
162 | Page Table Isolation (Meltdown mitigation, requires reboot.)
163 | vm.pmap.pti
164 | default
165 |
166 | -
167 | Disable Indirect Branch Restricted Speculation (Spectre V2 mitigation)
168 | hw.ibrs_disable
169 | default
170 |
171 | -
172 | Hide processes running as other groups
173 | security.bsd.see_other_gids
174 | default
175 |
176 | -
177 | Hide processes running as other users
178 | security.bsd.see_other_uids
179 | default
180 |
181 | -
182 | Enable/disable sending of ICMP redirects in response to IP packets for which a better,
183 | and for the sender directly reachable, route and next hop is known.
184 |
185 | net.inet.ip.redirect
186 | default
187 |
188 | -
189 |
190 | Redirect attacks are the purposeful mass-issuing of ICMP type 5 packets. In a normal network, redirects
191 | to the end stations should not be required. This option enables the NIC to drop all inbound ICMP
192 | redirect
193 | packets without returning a response.
194 |
195 | net.inet.icmp.drop_redirect
196 | 1
197 |
198 | -
199 | Maximum outgoing UDP datagram size
200 | net.local.dgram.maxdgram
201 | default
202 |
203 |
204 |
205 | normal
206 | OPNsense
207 | localdomain
208 | 1
209 |
210 | admins
211 | System Administrators
212 | system
213 | 1999
214 | 0
215 | page-all
216 |
217 |
218 | root
219 | System Administrator
220 | system
221 | admins
222 | $2y$10$jp/vIlkmXKHY4k1HcbRW4uAfX8HPtpsqNzl1DSPpvKb7P9I8zV6Ay
223 | 0
224 |
225 |
226 | $2y$11$GjAxbE45YjxJk2wSA9xq.OAVLbwIq9tMMRSJMpP74S7MRI5POFvHi
227 | user
228 | michael
229 | Michael Sims
230 |
231 |
232 |
233 | sims.mike@gmail.com
234 | 2000
235 | 6587b2632c429
236 |
237 | 2001
238 | 2000
239 | America/Los_Angeles
240 | 0.opnsense.pool.ntp.org 1.opnsense.pool.ntp.org 2.opnsense.pool.ntp.org 3.opnsense.pool.ntp.org
241 |
242 |
243 | http
244 | 652a77f30634b
245 |
246 |
247 |
248 |
249 |
250 | yes
251 | 1
252 | 1
253 | 1
254 | 1
255 | 1
256 | 1
257 |
258 | hadp
259 | hadp
260 | hadp
261 |
262 | monthly
263 |
264 | 1
265 | 1
266 |
267 | admins
268 | 1
269 | opt3,lan
270 |
271 |
272 |
273 |
274 |
275 | enabled
276 | 1
277 | 1
278 |
279 | -1
280 | -1
281 |
282 |
283 |
284 | os-ddclient,os-dmidecode,os-theme-vicuna,os-upnp,os-vmware,os-vnstat
285 |
286 |
287 | en_US
288 |
289 |
290 | none
291 | none
292 | none
293 | none
294 | none
295 | none
296 | none
297 | none
298 | 115200
299 | video
300 |
301 |
302 |
303 |
304 |
305 | igc0
306 | WAN
307 | 1
308 | 1
309 | 1
310 | dhcp
311 |
312 | 32
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 | SavedCfg
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 | dhcp6
329 | 0
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 | WAN_GW
358 |
359 |
360 | vmx0
361 | LAN
362 | 1
363 |
364 | 10.10.10.1
365 | 24
366 | FD00:BADE:0123:0001::1
367 | 64
368 |
369 |
370 | 1
371 | Loopback
372 | 1
373 | lo0
374 | 127.0.0.1
375 | ::1
376 | 8
377 | 128
378 | none
379 | 1
380 |
381 |
382 | igc1
383 | OPT1
384 | 1
385 |
386 |
387 |
388 | igc2
389 | OPT2
390 | 1
391 |
392 |
393 |
394 | bridge0
395 | Bridge
396 | 1
397 |
398 | 10.10.11.1
399 | 24
400 | FD00:BADE:0123:0002::100
401 | 64
402 |
403 |
404 | vmx1
405 | DMZ_NIC
406 | 1
407 |
408 | 10.10.12.1
409 | 24
410 |
411 |
412 |
413 |
414 | local
415 | hmac-md5
416 |
417 |
418 |
419 |
420 | 10.10.10.10
421 | 10.10.10.245
422 |
423 |
424 |
425 |
426 |
427 |
428 | local
429 | hmac-md5
430 |
431 |
432 |
433 |
434 | 10.10.11.100
435 | 10.10.11.254
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 | public
446 |
447 |
448 |
449 | hybrid
450 |
451 |
452 | Xbox_One_Console
453 |
454 |
455 | 1
456 |
457 |
458 |
459 | wan
460 |
461 |
462 |
463 |
464 | inet
465 |
466 | 0
467 | 1
468 | Xbox_Live_Port_50114
469 | tcp/udp
470 |
471 | root@10.10.10.13
472 |
473 | /firewall_nat_out_edit.php made changes
474 |
475 |
476 | root@10.10.10.13
477 |
478 | /firewall_nat_out_edit.php made changes
479 |
480 |
481 |
482 |
483 | Ubuntu_Desktop
484 |
485 |
486 | 1
487 |
488 |
489 |
490 | wan
491 |
492 |
493 |
494 |
495 | inet
496 |
497 | 0
498 | 1
499 | 3389
500 | tcp
501 |
502 | root@10.10.10.13
503 |
504 | /firewall_nat_out_edit.php made changes
505 |
506 |
507 | root@10.10.10.13
508 |
509 | /firewall_nat_out_edit.php made changes
510 |
511 |
512 |
513 |
514 | Ubuntu_Desktop_Temp
515 |
516 |
517 | 1
518 |
519 |
520 |
521 | wan
522 |
523 |
524 |
525 |
526 | inet
527 |
528 | 0
529 | 1
530 | 22
531 | tcp
532 |
533 | root@10.10.10.13
534 |
535 | /firewall_nat_out_edit.php made changes
536 |
537 |
538 | root@10.10.10.13
539 |
540 | /firewall_nat_out_edit.php made changes
541 |
542 |
543 |
544 |
545 | tcp/udp
546 | wan
547 |
548 | inet
549 |
550 |
551 |
552 |
553 | nat_653a28be978324.95074010
554 | Xbox_One_Console
555 | Xbox_Live_Port_50114
556 |
557 | 1
558 |
559 |
560 | wanip
561 | Xbox_Live_Port_50114
562 |
563 | purenat
564 |
565 | root@10.10.10.13
566 |
567 | /firewall_nat_edit.php made changes
568 |
569 |
570 | root@10.10.10.13
571 |
572 | /firewall_nat_edit.php made changes
573 |
574 |
575 |
576 | tcp/udp
577 | wan
578 |
579 | inet
580 |
581 |
582 |
583 |
584 | nat_65819ad4c14922.37519052
585 | 10.10.10.90
586 | 55655
587 |
588 | 1
589 |
590 |
591 | wanip
592 | 55655
593 |
594 | purenat
595 |
596 | root@10.10.10.90
597 |
598 | /firewall_nat_edit.php made changes
599 |
600 |
601 | root@10.10.10.90
602 |
603 | /firewall_nat_edit.php made changes
604 |
605 |
606 |
607 | tcp/udp
608 | wan
609 |
610 | inet
611 |
612 |
613 |
614 |
615 | nat_65aa62d66c5e83.75443953
616 | 10.10.10.90
617 | 55556
618 |
619 | 1
620 |
621 |
622 | wanip
623 | 55556
624 |
625 | purenat
626 |
627 | root@10.10.10.90
628 |
629 | /firewall_nat_edit.php made changes
630 |
631 |
632 | root@10.10.10.90
633 |
634 | /firewall_nat_edit.php made changes
635 |
636 |
637 |
638 | tcp/udp
639 | wan
640 |
641 | inet
642 |
643 |
644 |
645 |
646 | nat_658369c864ffa7.61701608
647 | 10.10.10.90
648 | 60300
649 |
650 | 1
651 |
652 |
653 | wanip
654 | 60300
655 |
656 | purenat
657 |
658 | root@10.10.10.90
659 |
660 | /firewall_nat_edit.php made changes
661 |
662 |
663 | root@10.10.10.90
664 |
665 | /firewall_nat_edit.php made changes
666 |
667 |
668 |
669 | tcp/udp
670 | wan
671 |
672 | inet
673 |
674 |
675 |
676 |
677 | nat_65d84f2916f3b3.79958818
678 | 10.10.10.90
679 | 60310
680 |
681 | 1
682 |
683 |
684 | wanip
685 | 60310
686 |
687 | purenat
688 |
689 | root@10.10.10.90
690 |
691 | /firewall_nat_edit.php made changes
692 |
693 |
694 | root@10.10.10.90
695 |
696 | /firewall_nat_edit.php made changes
697 |
698 |
699 |
700 | tcp/udp
701 | wan
702 |
703 | inet
704 |
705 |
706 |
707 |
708 | nat_65aa10b2326d13.57028309
709 | 10.10.10.34
710 | 22
711 |
712 | 1
713 |
714 |
715 | wanip
716 | 22
717 |
718 | purenat
719 |
720 | root@10.10.10.90
721 |
722 | /firewall_nat_edit.php made changes
723 |
724 |
725 | root@10.10.10.90
726 |
727 | /firewall_nat_edit.php made changes
728 |
729 |
730 |
731 | tcp/udp
732 | wan
733 |
734 | inet
735 |
736 |
737 |
738 |
739 | nat_65a711cdb84007.33086063
740 | 10.10.12.10
741 | 3389
742 |
743 | 1
744 |
745 |
746 | wanip
747 | 3389
748 |
749 | purenat
750 |
751 | root@10.10.10.90
752 |
753 | /firewall_nat_edit.php made changes
754 |
755 |
756 | root@10.10.10.90
757 |
758 | /firewall_nat_edit.php made changes
759 |
760 |
761 |
762 |
763 |
764 | nat_653a28be978324.95074010
765 |
766 | 1
767 |
768 | wan
769 | keep state
770 | tcp/udp
771 | inet
772 |
773 | Xbox_One_Console
774 | Xbox_Live_Port_50114
775 |
776 |
777 |
778 |
779 | root@10.10.10.13
780 |
781 | /firewall_nat_edit.php made changes
782 |
783 |
784 |
785 | nat_65819ad4c14922.37519052
786 |
787 | 1
788 |
789 | wan
790 | keep state
791 | tcp/udp
792 | inet
793 |
794 | 10.10.10.90
795 | 55655
796 |
797 |
798 |
799 |
800 | root@10.10.10.90
801 |
802 | /firewall_nat_edit.php made changes
803 |
804 |
805 |
806 | nat_658369c864ffa7.61701608
807 |
808 | 1
809 |
810 | wan
811 | keep state
812 | tcp/udp
813 | inet
814 |
815 | 10.10.10.90
816 | 60300
817 |
818 |
819 |
820 |
821 | root@10.10.10.90
822 |
823 | /firewall_nat_edit.php made changes
824 |
825 |
826 |
827 | pass
828 | inet
829 | Default allow LAN to any rule
830 | lan
831 |
832 | lan
833 |
834 |
835 |
836 |
837 |
838 |
839 | pass
840 | inet6
841 | Default allow LAN IPv6 to any rule
842 | lan
843 |
844 | lan
845 |
846 |
847 |
848 |
849 |
850 |
851 | pass
852 | opt3
853 | inet
854 | keep state
855 | Default allow Bridge to any rule
856 | in
857 | 1
858 |
859 | opt3
860 |
861 |
862 | 1
863 |
864 |
865 | root@10.10.10.13
866 |
867 | /firewall_rules_edit.php made changes
868 |
869 |
870 | root@10.10.10.13
871 |
872 | /firewall_rules_edit.php made changes
873 |
874 |
875 |
876 | block
877 | opt4
878 | inet
879 | keep state
880 | in
881 | 1
882 |
883 | 1
884 |
885 |
886 | lan
887 |
888 |
889 | root@10.10.10.90
890 |
891 | /firewall_rules_edit.php made changes
892 |
893 |
894 | root@10.10.10.90
895 |
896 | /firewall_rules_edit.php made changes
897 |
898 |
899 |
900 | block
901 | opt4
902 | inet
903 | keep state
904 | in
905 | 1
906 |
907 | 1
908 |
909 |
910 | opt3
911 |
912 |
913 | root@10.10.10.90
914 |
915 | /firewall_rules_edit.php made changes
916 |
917 |
918 | root@10.10.10.90
919 |
920 | /firewall_rules_edit.php made changes
921 |
922 |
923 |
924 | pass
925 | opt4
926 | inet
927 | keep state
928 | Default allow Bridge to any rule
929 | in
930 | 1
931 |
932 | opt4
933 |
934 |
935 | 1
936 |
937 |
938 | root@10.10.10.90
939 |
940 | /firewall_rules_edit.php made changes
941 |
942 |
943 | root@10.10.10.90
944 |
945 | /firewall_rules_edit.php made changes
946 |
947 |
948 |
949 | nat_65a711cdb84007.33086063
950 |
951 | 1
952 |
953 | wan
954 | keep state
955 | tcp/udp
956 | inet
957 |
958 | 10.10.12.10
959 | 3389
960 |
961 |
962 |
963 |
964 | root@10.10.10.90
965 |
966 | /firewall_nat_edit.php made changes
967 |
968 |
969 |
970 | nat_65aa10b2326d13.57028309
971 |
972 | 1
973 |
974 | wan
975 | keep state
976 | tcp/udp
977 | inet
978 |
979 | 10.10.10.34
980 | 22
981 |
982 |
983 |
984 |
985 | root@10.10.10.90
986 |
987 | /firewall_nat_edit.php made changes
988 |
989 |
990 |
991 | nat_65aa62d66c5e83.75443953
992 |
993 | 1
994 |
995 | wan
996 | keep state
997 | tcp/udp
998 | inet
999 |
1000 | 10.10.10.90
1001 | 55556
1002 |
1003 |
1004 |
1005 |
1006 | root@10.10.10.90
1007 |
1008 | /firewall_nat_edit.php made changes
1009 |
1010 |
1011 |
1012 | nat_65d84f2916f3b3.79958818
1013 |
1014 | 1
1015 |
1016 | wan
1017 | keep state
1018 | tcp/udp
1019 | inet
1020 |
1021 | 10.10.10.90
1022 | 60310
1023 |
1024 |
1025 |
1026 |
1027 | root@10.10.10.90
1028 |
1029 | /firewall_nat_edit.php made changes
1030 |
1031 |
1032 |
1033 |
1034 |
1035 |
1036 |
1037 |
1038 | ICMP
1039 | icmp
1040 | ICMP
1041 |
1042 |
1043 |
1044 | TCP
1045 | tcp
1046 | Generic TCP
1047 |
1048 |
1049 |
1050 | HTTP
1051 | http
1052 | Generic HTTP
1053 |
1054 | /
1055 |
1056 | 200
1057 |
1058 |
1059 |
1060 | HTTPS
1061 | https
1062 | Generic HTTPS
1063 |
1064 | /
1065 |
1066 | 200
1067 |
1068 |
1069 |
1070 | SMTP
1071 | send
1072 | Generic SMTP
1073 |
1074 |
1075 | 220 *
1076 |
1077 |
1078 |
1079 |
1080 | 0.opnsense.pool.ntp.org
1081 |
1082 |
1083 |
1084 | system_information-container:00000000-col3:show,dmidecode-container:00000001-col3:show,services_status-container:00000002-col4:show,gateways-container:00000003-col4:show,interface_list-container:00000004-col4:show,traffic_graphs-container:00000005-col4:show,interface_statistics-container:00000006-col4:show,ntp_status-container:00000007-col4:show,system_log-container:00000008-col4:show
1085 |
1086 | 2
1087 |
1088 |
1089 | root@10.10.10.90
1090 | /api/kea/dhcpv4/set made changes
1091 |
1092 |
1093 |
1094 |
1095 |
1096 |
1097 |
1098 |
1099 |
1100 |
1101 |
1102 |
1103 |
1104 |
1105 |
1106 |
1107 |
1108 |
1109 |
1110 |
1111 |
1112 |
1113 |
1114 |
1115 |
1116 |
1117 |
1118 |
1119 |
1120 |
1121 |
1122 |
1123 |
1124 |
1125 |
1126 |
1127 |
1128 |
1129 |
1130 |
1131 |
1132 |
1133 |
1134 |
1135 | 1
1136 | Xbox_Live_Port_50114
1137 | port
1138 |
1139 |
1140 | 0
1141 |
1142 | 50114
1143 |
1144 |
1145 |
1146 |
1147 | 1
1148 | Xbox_One_Console
1149 | host
1150 |
1151 |
1152 | 0
1153 |
1154 | 10.10.11.99
1155 |
1156 |
1157 |
1158 |
1159 | 1
1160 | Ubuntu_Desktop
1161 | host
1162 |
1163 |
1164 | 0
1165 |
1166 | 10.10.10.44
1167 |
1168 |
1169 |
1170 |
1171 | 1
1172 | Ubuntu_Desktop_Temp
1173 | host
1174 |
1175 |
1176 | 0
1177 |
1178 | 10.10.10.55
1179 |
1180 |
1181 |
1182 |
1183 |
1184 |
1185 |
1186 |
1187 |
1188 |
1189 |
1190 |
1191 |
1192 |
1193 |
1194 |
1195 | opt3,lan,wan
1196 | wan
1197 | v9
1198 | 127.0.0.1:2056
1199 |
1200 |
1201 | 1
1202 |
1203 | 1800
1204 | 15
1205 |
1206 |
1207 |
1208 |
1209 |
1210 |
1211 |
1212 |
1213 | 0
1214 | 0
1215 | 0
1216 | wan
1217 | 192.168.0.0/16,10.0.0.0/8,172.16.0.0/12
1218 |
1219 |
1220 | W0D23
1221 | 4
1222 | ac
1223 |
1224 | medium
1225 |
1226 |
1227 |
1228 | 0
1229 | 0
1230 | 0
1231 |
1232 |
1233 |
1234 |
1235 |
1236 |
1237 |
1238 |
1239 |
1240 |
1241 | 0
1242 | 120
1243 | 120
1244 | 127.0.0.1
1245 | 25
1246 |
1247 |
1248 | 0
1249 | auto
1250 | 1
1251 | syslog facility log_daemon
1252 |
1253 |
1254 |
1255 | 0
1256 | root
1257 | 7tYWsfWDcLWVW79dKzldO
1258 | 2812
1259 |
1260 |
1261 | 5
1262 | 1
1263 |
1264 |
1265 | 0
1266 | root@localhost.local
1267 | 0
1268 |
1269 |
1270 | 10
1271 |
1272 |
1273 |
1274 | 1
1275 | $HOST
1276 |
1277 | system
1278 |
1279 |
1280 |
1281 | 300
1282 | 30
1283 |
1284 |
1285 |
1286 |
1287 |
1288 | 6671ba49-729a-4a9c-b40a-cc3541d9d346,014f8720-8610-498e-802f-991d8e780bd1,acb5c067-15f1-4932-99d9-3cc3243edc31,c76e0d36-e04d-4ceb-aaf8-0d8704356f46
1289 |
1290 |
1291 |
1292 |
1293 |
1294 | 1
1295 | RootFs
1296 |
1297 | filesystem
1298 |
1299 |
1300 | /
1301 | 300
1302 | 30
1303 |
1304 |
1305 |
1306 |
1307 | bd3e982b-3063-4561-b60e-c90c8eb33096
1308 |
1309 |
1310 |
1311 |
1312 | 0
1313 | carp_status_change
1314 |
1315 | custom
1316 |
1317 |
1318 | /usr/local/opnsense/scripts/OPNsense/Monit/carp_status
1319 | 300
1320 | 30
1321 |
1322 |
1323 |
1324 |
1325 | d9c966ab-6a26-4e24-80c7-318cb42528af
1326 |
1327 |
1328 |
1329 |
1330 | 0
1331 | gateway_alert
1332 |
1333 | custom
1334 |
1335 |
1336 | /usr/local/opnsense/scripts/OPNsense/Monit/gateway_alert
1337 | 300
1338 | 30
1339 |
1340 |
1341 |
1342 |
1343 | 4f68c864-d7a1-47d2-9784-f40d66e885b9
1344 |
1345 |
1346 |
1347 |
1348 | Ping
1349 | NetworkPing
1350 | failed ping
1351 | alert
1352 |
1353 |
1354 |
1355 | NetworkLink
1356 | NetworkInterface
1357 | failed link
1358 | alert
1359 |
1360 |
1361 |
1362 | NetworkSaturation
1363 | NetworkInterface
1364 | saturation is greater than 75%
1365 | alert
1366 |
1367 |
1368 |
1369 | MemoryUsage
1370 | SystemResource
1371 | memory usage is greater than 75%
1372 | alert
1373 |
1374 |
1375 |
1376 | CPUUsage
1377 | SystemResource
1378 | cpu usage is greater than 75%
1379 | alert
1380 |
1381 |
1382 |
1383 | LoadAvg1
1384 | SystemResource
1385 | loadavg (1min) is greater than 4
1386 | alert
1387 |
1388 |
1389 |
1390 | LoadAvg5
1391 | SystemResource
1392 | loadavg (5min) is greater than 3
1393 | alert
1394 |
1395 |
1396 |
1397 | LoadAvg15
1398 | SystemResource
1399 | loadavg (15min) is greater than 2
1400 | alert
1401 |
1402 |
1403 |
1404 | SpaceUsage
1405 | SpaceUsage
1406 | space usage is greater than 75%
1407 | alert
1408 |
1409 |
1410 |
1411 | ChangedStatus
1412 | ProgramStatus
1413 | changed status
1414 | alert
1415 |
1416 |
1417 |
1418 | NonZeroStatus
1419 | ProgramStatus
1420 | status != 0
1421 | alert
1422 |
1423 |
1424 |
1425 |
1426 |
1427 | 0
1428 | opnsense
1429 |
1430 |
1431 |
1432 | 1
1433 | 1
1434 |
1435 |
1436 |
1437 |
1438 |
1439 | 0
1440 | on
1441 | strip
1442 | 1
1443 | 1
1444 | 0
1445 |
1446 | admin@localhost.local
1447 |
1448 |
1449 |
1450 | 0
1451 | /var/squid/cache
1452 | 256
1453 |
1454 |
1455 | always
1456 | 100
1457 | 16
1458 | 256
1459 | 0
1460 | 0
1461 |
1462 |
1463 |
1464 | 0
1465 | 2048
1466 | 1024
1467 | 1024
1468 | 256
1469 |
1470 |
1471 | 0
1472 |
1473 | 0
1474 | username
1475 | password
1476 |
1477 |
1478 |
1479 |
1480 |
1481 |
1482 | lan
1483 | 3128
1484 | 3129
1485 | 0
1486 | 0
1487 |
1488 |
1489 | 4
1490 | 5
1491 | 0
1492 | 3401
1493 | public
1494 |
1495 | 2121
1496 | 0
1497 | 1
1498 | 0
1499 |
1500 |
1501 |
1502 |
1503 |
1504 |
1505 |
1506 |
1507 |
1508 |
1509 | 80:http,21:ftp,443:https,70:gopher,210:wais,1025-65535:unregistered
1510 | ports,280:http-mgmt,488:gss-http,591:filemaker,777:multiling http
1511 |
1512 | 443:https
1513 |
1514 |
1515 |
1516 |
1517 |
1518 |
1519 | 0
1520 | icap://[::1]:1344/avscan
1521 | icap://[::1]:1344/avscan
1522 | 1
1523 | 0
1524 | 0
1525 | X-Username
1526 | 1
1527 | 1024
1528 | 60
1529 |
1530 |
1531 |
1532 |
1533 |
1534 | OPNsense proxy authentication
1535 | 2
1536 | 5
1537 |
1538 |
1539 |
1540 |
1541 |
1542 |
1543 |
1544 |
1545 |
1546 | 1
1547 |
1548 |
1549 |
1550 |
1551 |
1552 |
1553 |
1554 |
1555 |
1556 |
1557 | 1
1558 | 53
1559 | 1
1560 |
1561 | 0
1562 | 64:ff9b::/96
1563 | 0
1564 | 0
1565 |
1566 | 1
1567 | 0
1568 | 0
1569 | 0
1570 | 1
1571 | transparent
1572 |
1573 | 0
1574 |
1575 |
1576 | 0
1577 | 0
1578 | 0
1579 | 0
1580 | 1
1581 | 0
1582 |
1583 |
1584 | 0
1585 |
1586 | 0
1587 | 0
1588 | 0
1589 | 0
1590 | 0
1591 | 0
1592 | 0
1593 | 1
1594 | 0
1595 |
1596 |
1597 | 0.0.0.0/8,10.0.0.0/8,100.64.0.0/10,169.254.0.0/16,172.16.0.0/12,192.0.2.0/24,192.168.0.0/16,198.18.0.0/15,198.51.100.0/24,203.0.113.0/24,233.252.0.0/24,::1/128,2001:db8::/32,fc00::/8,fd00::/8,fe80::/10
1598 |
1599 |
1600 |
1601 |
1602 |
1603 |
1604 |
1605 |
1606 |
1607 |
1608 |
1609 |
1610 |
1611 | 0
1612 |
1613 |
1614 |
1615 |
1616 | allow
1617 |
1618 |
1619 | 0
1620 | 0
1621 |
1622 |
1623 |
1624 |
1625 |
1626 |
1627 | 0
1628 |
1629 |
1630 | 0
1631 |
1632 |
1633 |
1634 |
1635 | 1
1636 | esx
1637 | local
1638 | A
1639 |
1640 |
1641 | 10.10.10.2
1642 | ESXi Server
1643 |
1644 |
1645 |
1646 |
1647 |
1648 |
1649 |
1650 | 0
1651 | WAN_GW
1652 | WAN Gateway
1653 | wan
1654 | inet
1655 |
1656 | 1
1657 |
1658 | 1
1659 |
1660 |
1661 |
1662 | 255
1663 | 1
1664 |
1665 |
1666 |
1667 |
1668 |
1669 |
1670 |
1671 |
1672 |
1673 |
1674 |
1675 |
1676 | 1
1677 | 0
1678 | 0
1679 | 300
1680 | opnsense
1681 |
1682 |
1683 |
1684 | 1
1685 | noip
1686 |
1687 |
1688 | sims.mike@gmail.com
1689 | Alpha4Beta321
1690 |
1691 | synchole.ddns.net
1692 | 0
1693 |
1694 | web_dyndns
1695 | 10
1696 | 1
1697 | 300
1698 | wan
1699 | NoIp
1700 |
1701 |
1702 |
1703 |
1704 |
1705 | 1
1706 | opt3,opt4,lan,wan
1707 |
1708 |
1709 |
1710 |
1711 |
1712 | 1
1713 | 127.0.0.1
1714 | 8000
1715 |
1716 |
1717 |
1718 |
1719 | 1
1720 | opt3,opt4,lan
1721 | 432000
1722 | 1
1723 |
1724 |
1725 | 0
1726 |
1727 |
1728 |
1729 |
1730 | 10.10.10.0/24
1731 | 1
1732 |
1733 | 10.10.10.1
1734 | 10.10.10.1
1735 | home
1736 | 10.10.10.1
1737 |
1738 |
1739 |
1740 | 10.10.10.100-10.10.10.254
1741 |
1742 |
1743 | 10.10.11.0/24
1744 | 1
1745 |
1746 | 10.10.11.1
1747 | 10.10.11.1
1748 | home
1749 | 10.10.11.1
1750 |
1751 |
1752 |
1753 | 10.10.11.100-10.10.11.254
1754 |
1755 |
1756 | 10.10.12.0/24
1757 | 1
1758 |
1759 | 10.10.12.1
1760 | 10.10.12.1
1761 | home
1762 | 10.10.12.1
1763 |
1764 |
1765 |
1766 | 10.10.12.100-10.10.12.254
1767 |
1768 |
1769 |
1770 |
1771 |
1772 |
1773 |
1774 |
1775 |
1776 |
1777 |
1778 | 0
1779 |
1780 |
1781 |
1782 |
1783 |
1784 |
1785 |
1786 |
1787 |
1788 |
1789 |
1790 |
1791 |
1792 |
1793 |
1794 |
1795 |
1796 |
1797 |
1798 |
1799 |
1800 |
1801 | Bridge
1802 |
1803 |
1804 | bridge0
1805 |
1806 |
1807 |
1808 |
1809 | rstp
1810 |
1811 | opt1,opt2
1812 |
1813 |
1814 |
1815 |
1816 |
1817 |
1818 |
1819 |
1820 |
1821 |
1822 |
1823 |
1824 |
1825 |
1826 |
1827 |
1828 |
1829 | 6587af1a54447
1830 | Certificate Authority for VPN
1831 |
1832 | LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdUekNDQkRlZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRMEZBRENCbWpFTE1Ba0dBMVVFQmhNQ1ZWTXgKRXpBUkJnTlZCQWdNQ2tOaGJHbG1iM0p1YVdFeEZEQVNCZ05WQkFjTUMxWnBZM1J2Y25acGJHeGxNU1V3SXdZRApWUVFLREJ4VGFXMTBaV05vSUVSaGRHRWdVMlZ5ZG1salpYTXNJR2x1WXk0dU1TTXdJUVlKS29aSWh2Y05BUWtCCkZoUnRhV3RsUUhOcGJYUmxZMmhrWVhSaExtTnZiVEVVTUJJR0ExVUVBd3dMYVc1MFpYSnVZV3d0WTJFd0hoY04KTWpNeE1qSTBNRFF4TURBMFdoY05Nall3TXpJNE1EUXhNREEwV2pDQm1qRUxNQWtHQTFVRUJoTUNWVk14RXpBUgpCZ05WQkFnTUNrTmhiR2xtYjNKdWFXRXhGREFTQmdOVkJBY01DMVpwWTNSdmNuWnBiR3hsTVNVd0l3WURWUVFLCkRCeFRhVzEwWldOb0lFUmhkR0VnVTJWeWRtbGpaWE1zSUdsdVl5NHVNU013SVFZSktvWklodmNOQVFrQkZoUnQKYVd0bFFITnBiWFJsWTJoa1lYUmhMbU52YlRFVU1CSUdBMVVFQXd3TGFXNTBaWEp1WVd3dFkyRXdnZ0lpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3pQMWJXN1U3T1dYQVZTUUNuYzQxaXZDMGdVRkNECnhqelQzMlpYQzNMNTkzb1dRdEl6SzQ4bExkK2dQTUFnYjJvY2NxaGdUMjdlOEFPN3pwMzNaUDBrR1ZPU1JFdXgKQ25DbVdYRGJ5Y0xXUGhLYVZrMmZGOXUrbkszZTAzUXNZcU5Yam5hSmtTVnpoVXhsRndQNkw1aXRBS1RVRk9pSwpCMUhiYXIxWmNNeEpOOGJ3UEVZblhDbUI5ck43MWZRb3p3akJpR2JPVzRQQ0F6dW53KytnUStsTlVRdDk5a0xyCksxc0ZHTng3Rm4vL3JDQmE5QzJ1eEQ5RGF3OStHWUgvQ09MT1FVUWQrNk0rNkZVUUlETU1TQUY5RzlqVUpGVWUKVDQ1K1lZRkJOVldBVC9xdlNGZkh0bTNYTTM3QWdENXQ3M253ZDl6NkhYMXVsVTZQb0dGVUo1a0RyQ3RtcDdhVAoyQzY0ZEFCeFp0bVFNbG9OdjFOWDVRVWE0eTRJdnhTc250UlBGSHFsUFBEOVBjU0FQeTZidU9VK09zWVQ0ZkVNCmIrRjZhMFo5bzZURmN2NWNxV1g5ekRYYXdhaysxa2lyOFlZSU80QVdCMVZ2Z1U0cTFkSjRnaFZ3UStVN24vSy8KeVJjc3VVRmlJV1dGdU5ORFd6QUZVeHpONFNxeURmbklsbnZVSWZtOWxkSndVb2dodjdyQnpadlZpaHh5SFdCYgpiY1l1T1VpdzJtUlNQQjkyQXBhbjh5UzZmZjhkMndBeHZ0TEFEZjZXb2VON1FWb3h5dG4vTU9qQmxpOFU0MDdUCjdwZW5CZkZDMVdCZFE5MWVtUzdtd1c1VWlKTms3Ny81a0ExWDhpc1VGa09LTm5QOEtMR2M3aUZXckorMEwvRTMKZW9xbWkveXcrVTh2L1FJREFRQUJvNEdkTUlHYU1EY0dDV0NHU0FHRytFSUJEUVFxRmloUFVFNXpaVzV6WlNCSApaVzVsY21GMFpXUWdRMlZ5ZEdsbWFXTmhkR1VnUVhWMGFHOXlhWFI1TUIwR0ExVWREZ1FXQkJSeXdob3cyTk40CkY2UnNRcnZOOStxRjdrVWUyREFmQmdOVkhTTUVHREFXZ0JSeXdob3cyTk40RjZSc1Fydk45K3FGN2tVZTJEQVAKQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQmhqQU5CZ2txaGtpRzl3MEJBUTBGQUFPQwpBZ0VBaU9nQnVSdjhVelVTdEdVTEtOOVpGelJNdjdXYkhaL3hvTEdrckdpemtaN0ZraXplczhsSmkzTlc0OUl2CmFzcjdwclZIazAvNDZOaDZHTCt3bkxHNm1QZENaTDdIRFI1UlgxT0NrdGE5YWZPekpOS1lwU0lLeS9OblI0U08KWmM5VEd1N2l2NzY0dVNtL2JiTEVjM1lmZkJGV0lvd084dGtOQy90ZlplSnk2WVNEQUs1UXZ3bXFqSDBWWkhRdgpNZ0FLdFQxNVBwUnVVd2prRXhRbk5zakxkN21NeE9ZY2FXSmVFd0g5aC9YK2k1T2xCdVNRRmtOT1kyWkdDRXBpClhscThueExvbUQ4VHVqM3hNdlgyS091Um9wUjJhemQyVnRraDdHdmFQMGtaQzV2SHg2M2hGOUxNek9SN2ZkRkUKOFBZV3crSzFUUkl4ZEFXaDk4dnBDS25od2VOc3Fmb0paZ25TWGpVaHZVeTVDNEw4ZWZHY1RqMGJtSmo4NHhEYgo0NXdua0dZdzlJd0hNMFRKTnVLcTg5SUZRYkZUV1R2WUI5cVhpaGdLYXNGV3NJYjBqOUxlUUVQR3FDa0RjSnV2Ck1YZVoyYktxbWtGTzZOL00vamthSng1Yld0V0dtWUV0b2hGK2pKM0QrbHl2OTBDNTl5U1NDaFIyNnhyY2RGeUUKTDk4TlUxUExGQkF1NEo0UVdZOHpqU0hjU3NybnB2ZnQxT3FlYzNlVmdJMnFMYmRDSmhCUzNGYm9qRCsxcWJxbQpSQ3kwTWp2dytDZnVQa2hFZ1ZZblBuTjNyTndrSUZYL3ExckNEUzBWUGIyVEFKOUNob0ZzZzhacWlYMWplMnVECnROejBkNXBoMXB1TXdiSm5xcC81R1lzbWpydm0yT1pXUGNsK0k2Vjl4SS9UOHRBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
1833 |
1834 |
1835 | LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRZ0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1N3d2dna29BZ0VBQW9JQ0FRQ3pQMWJXN1U3T1dYQVYKU1FDbmM0MWl2QzBnVUZDRHhqelQzMlpYQzNMNTkzb1dRdEl6SzQ4bExkK2dQTUFnYjJvY2NxaGdUMjdlOEFPNwp6cDMzWlAwa0dWT1NSRXV4Q25DbVdYRGJ5Y0xXUGhLYVZrMmZGOXUrbkszZTAzUXNZcU5Yam5hSmtTVnpoVXhsCkZ3UDZMNWl0QUtUVUZPaUtCMUhiYXIxWmNNeEpOOGJ3UEVZblhDbUI5ck43MWZRb3p3akJpR2JPVzRQQ0F6dW4KdysrZ1ErbE5VUXQ5OWtMcksxc0ZHTng3Rm4vL3JDQmE5QzJ1eEQ5RGF3OStHWUgvQ09MT1FVUWQrNk0rNkZVUQpJRE1NU0FGOUc5alVKRlVlVDQ1K1lZRkJOVldBVC9xdlNGZkh0bTNYTTM3QWdENXQ3M253ZDl6NkhYMXVsVTZQCm9HRlVKNWtEckN0bXA3YVQyQzY0ZEFCeFp0bVFNbG9OdjFOWDVRVWE0eTRJdnhTc250UlBGSHFsUFBEOVBjU0EKUHk2YnVPVStPc1lUNGZFTWIrRjZhMFo5bzZURmN2NWNxV1g5ekRYYXdhaysxa2lyOFlZSU80QVdCMVZ2Z1U0cQoxZEo0Z2hWd1ErVTduL0sveVJjc3VVRmlJV1dGdU5ORFd6QUZVeHpONFNxeURmbklsbnZVSWZtOWxkSndVb2doCnY3ckJ6WnZWaWh4eUhXQmJiY1l1T1VpdzJtUlNQQjkyQXBhbjh5UzZmZjhkMndBeHZ0TEFEZjZXb2VON1FWb3gKeXRuL01PakJsaThVNDA3VDdwZW5CZkZDMVdCZFE5MWVtUzdtd1c1VWlKTms3Ny81a0ExWDhpc1VGa09LTm5QOApLTEdjN2lGV3JKKzBML0UzZW9xbWkveXcrVTh2L1FJREFRQUJBb0lDQUFnUTBKS0pTU09GNk1JOGI3Z1pQZ0owClh6OTEvYm1BUVJwemtnSld0SXpFOHd4dlkxQUVKTVBTaFo2TFBVWDRYWGo4TzlGaG9hYU1mRTZHSkp1T1Fzbk8KRGZHbCt4WHpWMUJVOC93ZjN4R081MzFrWnNmQzVoTjByMm80YjZEVHEyLzBMQ2RTamJIZURLcjcxeVQ1NFUvZgptSXNtaWJRMFVoMmlkdlRBVzZEcnpwcmV5M1ZYODFJeXpLN0UyT0RCT0M2bE9hTU5nU2RJeC9Wcm5xdkNnb3dGCkdwUkhjWWx0Z1FJQXRXTWdody8xS2R1TjQwUmE5bEhOVG53cEg2MWZNLzE5K0ZlMURBcDNuK1JDM3FrdDBFdFYKNW5MZFU2c3lmMEgybHo5YzdBVURGRSt3M0twUzdpeGgxOUZIdEFkMFlETk80WFdyd0FvcTA4Y291MWh6RTdLQQpRRUthZUNVNnB3TFJycXJQSExRb3NBVm9ZTzN1OHY0ZEFpaTRzYlZMWkJWOHVoT0FDN2lnZVZaWm90b1VNL2s0ClZtaWxNbjNRTERKYzVsTkJJM0JJUVJ6VUloSHBDRHpCa2tPS1lpeHZvSWk0czRQQjljQTZ2aEhOeGdQMHlnckQKekk3ZlcvYnlYSTBHbHg5cHhzN08rQ0w5YXdlT05uMkN4NXlTdUx6WTh3dHJWRVZiSU5Wa3FvbEwvM3NWWGp0eApuaDUwRitFMCtIeGR2TUZwSk8zZ25rV3V3OE5QTDhaWFQ0Q3ZPZG1oQ25rSWV1RGhra3d6SXF2NWJPaDgvYm54Cm84T2RGYW13SG5Fc2Z0NU91ZkRwclA5S1JvYWlTaHFCa2ZOVC9NeENMMG81Uml6bjM1QnRLbWNSdm1MQVNISWEKWmg4SDgvcVB0bUdYWjA0YVZNbnRBb0lCQVFEcWlDR082WnRKOFhwVnArSlVKaFhFSHpwbWRjOWlUWnhyQklvVQp5SEhIUGFxTjhmYW1YRHQ5NzB2VDdRSmkwdXk2WldzcVA2aTFkR3BLUm85ODdUeTBiMjYrRFRYeGU0cWo0dWZ4ClBwL1ludzQySU0xcjFUNzVvek5WTXVFZXZIWkMydUNzSklWd0ovMVRvcGJGVENpQWxHc2h1QWZFd2NQSERDTzUKdHFwMTZJaTBDYnFOMVVvM256QUpCWWRvdi80Q2E2cDRYbFVmUzY4cHhwNjM0Vml1aVFhMFA1Q3pGVzJCNWYwdApZcWFtT0JrTW9Ub2VEOVpiMGNvUjF4TkgzcFNTM2VvM2I3Zm5pZWlFbzVGNW8xcXpUZDRvV3B0bnlLS0lwSlorCnpSYThndk01NCtTVmlsUmVEVTZPMTlLck16bXYybmNiSStCekNta2F0c01Ob0xIL0FvSUJBUUREcDdXMk5SVEoKUDZIamlMSDlUVEdRVklOR1FrcWdVemxlaDU2SmNsY0w1c2N0eENCaVk3ejFPVGxla0loOWtLejRvL0FGb3JmSgo0STgxZzRUOE5RWUpXbjFPZmRncVo5elp0dmJxR1ZkZ3lHTzc2VVV1UURIZ1JpSlFIT0ZkeXJ3MXRKM05jem0yCkg4Tzl6akViMTFha1BhSUI2TUg3NTV0NzJ4TWVQV3o2SU5rbi93NmhCRThKSHNUZnMzd2ZINmY0d1FISnlUbTEKNVJHVEw5bUxRcnYxT1lYZmlIcVFjQXdMVGFYSHN0TDd4aytYdWNnZWdVZzcxUXhONWpINVYxclEvajMweEdSYgp4S0FnbURFdEwrUEgzYUlESGxtd2tPRDk1WWJVUDFmdTdMWng3WlU5SlN6QStqdXgyM3U2WE1Ma25qbFhqclM1CkhnaFZnTlFyZnVZREFvSUJBQWgwemhqMERWaFdMNTRGQnFFWUduTE8yWEUyVURyd0ozS29ZRDR0bUFTaUVaTTYKcFRVTVlFekRJdzNLSHVyblJnZldmazJ3cSttVy8vb2JuekxXN3ZobWlDeXNGMFRVdW9QOE8zYTBWbGtlS3dvQwpsc1dMazlDMmRMUmV1RVUrY0ZrcXdTMFR5QWZxT1RVWnlLdm1laE5neHBnWnBaWVBrbnFMMG9Id3R5YTNNcTZqCkp5blVCZkFKZWxibzd4LzB4RGpjSHZKbUhGV2JpZjVNbmc1dFBxQlVhbngzU2tWYXdXOE1sdHRiRWowdUNxRXMKOHdhQWRhOHIya2hZWSthVWZQRHF0WFk0UGY1SU42MElwTWNvLzYwMVlvdzc4QnlHM0cxbTJkSktuTVpCUm5uUQo0TDRQbGNrcVc2bkUyR0M1NFJ1WkdmQk5rOXN5QmVZanJ0YS84NHNDZ2dFQVdtbk15ZGQ3dElnb09tbzN2aE1HCi9XaGdoWDRxMkMyOVRCYWx4MlJFSDJiVTBpeFl2cjdTV2d2SW5BOTBVM29neElHVmNEVkNjeExIZXZZODVRTm4KdDdqT1FSQmNiVFF6MVpQOFJDL1R0aERFTGRqZE5FTk1DUlMvMUgrVUVYQ1hTc1lkU2d5ZU5iQTJGeWNLZ0pBaApKS0txay9GSWV5MExKOUFUNUp5RUdJNUhhM2tzL0hGdVNJdWtkSytQZ3g1dzA3MzFJcGRQaU9QREhGNDNUR2haClRUZjR5bFJhTnhiZ0tmVUd6K0t1SnRUOGdPUEVPM3lJc2NXQSt4cU9LMmdYdW81U2VTS3NNZEFLSXlYUlM4MWUKbUVTdUVuemErNEhueHN4all2K21sZTFqWGdCcFA2bEhKaUk4cGJNRVdSbDJvb2tQZkl1Z3JnN1gwUk5JZUpVYQptd0tDQVFFQTF0L3RHVkx3bWM5T2w2V2RTczh0RldxN2dlcFV4UU1KSzhLZ0pVSlk4dDF0RHd2QjgyVVFoZHBSCjV5Z2c2aUdiRG50MUJYaW9oMTJxZm8vamVPZCtlZmJqVmlxQmtZeUplUEtmdllTOFAwU0NsRWZVTFh3c2NWQ0MKdENNcFZwSzVvZ25sMTc4aHYwa1NhTmx1ZVMvd3l4TnZnWVVIYi9kL1JsUGViZjNUVWkwakhiOE1NREhKQ3ZBUApFUFplT01ZdUxqYlVHclM5aVBFb3lPT0Q4Y3d5eXdoUTBObG9Ha0hIcjRjb3JXVnRIK0VudjV4NE1IV09UL3NSCnoxaGxlZzNIbmhZMlp1emNibG4rTHZxR1BKc2lUNGQ1RjNINW43UFBnSVFkYU05YmZXaGRWelpsOFNSbWw1MmQKSjNvWnJCN1FoNEpZd1k0KzZVR2lBdVljcUliZ1pRPT0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo=
1836 |
1837 | 2
1838 |
1839 |
1840 |
1841 | hmac-md5
1842 | 1
1843 |
1844 | FD00:BADE:0123:0001::100
1845 | FD00:BADE:0123:0001::500
1846 |
1847 |
1848 |
1849 |
1850 | 48
1851 |
1852 |
1853 |
1854 |
1855 |
1856 |
1857 |
1858 |
1859 | hmac-md5
1860 | 1
1861 |
1862 | FD00:BADE:0123:0002::100
1863 | FD00:BADE:0123:0002::500
1864 |
1865 |
1866 |
1867 |
1868 | 48
1869 |
1870 |
1871 |
1872 |
1873 |
1874 |
1875 |
1876 |
1877 | hmac-md5
1878 |
1879 | FD00:BADE:0123:0003::100
1880 | FD00:BADE:0123:0003::500
1881 |
1882 |
1883 |
1884 |
1885 | 48
1886 |
1887 |
1888 |
1889 |
1890 |
1891 |
1892 |
1893 |
1894 |
1895 | 652a77f30634b
1896 | Web GUI TLS certificate
1897 |
1898 | LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUhORENDQlJ5Z0F3SUJBZ0lVU0FNUWUveEd4S0RKSzRyQnVRbkFHUGlNWEVFd0RRWUpLb1pJaHZjTkFRRUwKQlFBd2dZa3hIVEFiQmdOVkJBTU1GRTlRVG5ObGJuTmxMbXh2WTJGc1pHOXRZV2x1TVFzd0NRWURWUVFHRXdKTwpUREVWTUJNR0ExVUVDQXdNV25WcFpDMUliMnhzWVc1a01SVXdFd1lEVlFRSERBeE5hV1JrWld4b1lYSnVhWE14CkxUQXJCZ05WQkFvTUpFOVFUbk5sYm5ObElITmxiR1l0YzJsbmJtVmtJSGRsWWlCalpYSjBhV1pwWTJGMFpUQWUKRncweU16RXdNVFF4TVRFek5UWmFGdzB5TkRFeE1UUXhNVEV6TlRaYU1JR0pNUjB3R3dZRFZRUUREQlJQVUU1egpaVzV6WlM1c2IyTmhiR1J2YldGcGJqRUxNQWtHQTFVRUJoTUNUa3d4RlRBVEJnTlZCQWdNREZwMWFXUXRTRzlzCmJHRnVaREVWTUJNR0ExVUVCd3dNVFdsa1pHVnNhR0Z5Ym1sek1TMHdLd1lEVlFRS0RDUlBVRTV6Wlc1elpTQnoKWld4bUxYTnBaMjVsWkNCM1pXSWdZMlZ5ZEdsbWFXTmhkR1V3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQwpEd0F3Z2dJS0FvSUNBUUNmRXVtYmlmM0dVMWMwZ2hVRGRzMVhMckl6SlJlSmlyL1JLelFuMndXMUtmcWhjOFVyClNDeXd0WXl3UlFYUnU1S3MrM05xUUVERGlOVTBIRlkyZ21IbzJqK3NFc0tLS1pSS3pja2N2Zk51elpQbUFPVUwKeFBlMHFzblNYMHV0VE5UNmNlejlNd2Mybk1teFFSYkZpaTdUZVRDenZTRlJ0c2pUb3BsNjMrM0xGd0RtSHZRQworck5jeWUxaG9CSDJKaG5uWXU5c0NwcjNzcVlFK1VjZ0hMcTFvdENTdXJqTXJ6YUxUdlFhVlZ2bWtOZ2ErZWMzClRuNVVvWXlSQ0I3d0xRTnZaWCsvbFBjampCVDZkUWV0YktDL014RkJ6MFlsMXErTEZnU3QyOFlMNm82NEtPRHUKdk9FRjdseWVlRVVKNVhRczdJVUVWVWNGMVBBc3FuSy8xdk5JQUQzN3dzTE5pSmQ1RUgwNDVzbDVrMkVDNlNTVAppTWJtVWJxWW1CdS9FTUxtbU5aL2FBRS85VCtFZUFuR0hLQ1pXeGMwbkdtcmdGS2NHdFVDVnNvcW5ZLzI2Q2s1ClFGWjdWYzdObjFINWsrdnNINEVkL3UrK0ltR0pwUTFNeldOS09TbjhWcVdGS0c2OXVuenJzc0NrYnpWcllEd1EKVnBaeXlZelhwVG9SRHdMN2s2OHR1MkE2MGt3aFdldkRXNDV3SGZoUTIwTHNILzNaWHFwYlhnRTFOR2RlSjdMSgpTZHRyajhMQis5emd0bG5KdGRySTNJQ3hzTFNCVHpmSWRhKzhXa0I3c3VJVHZqM0hDdmNtNnNuWlZqcUQyMjdHCkhnUzg3MjBZV2RJZ292bVR6WG4rN3hhclJXTk5abW8zV1FNbVdidXRmM3k3M2tsQ2tLZENlTDBCNXdJREFRQUIKbzRJQmtEQ0NBWXd3Q1FZRFZSMFRCQUl3QURBUkJnbGdoa2dCaHZoQ0FRRUVCQU1DQmtBd05BWUpZSVpJQVliNApRZ0VOQkNjV0pVOVFUbk5sYm5ObElFZGxibVZ5WVhSbFpDQlRaWEoyWlhJZ1EyVnlkR2xtYVdOaGRHVXdIUVlEClZSME9CQllFRkdrOVNob0syOG4vekUrRE9JK1g5dUlyYzlJMk1JSEpCZ05WSFNNRWdjRXdnYjZBRkdrOVNob0sKMjhuL3pFK0RPSStYOXVJcmM5STJvWUdQcElHTU1JR0pNUjB3R3dZRFZRUUREQlJQVUU1elpXNXpaUzVzYjJOaApiR1J2YldGcGJqRUxNQWtHQTFVRUJoTUNUa3d4RlRBVEJnTlZCQWdNREZwMWFXUXRTRzlzYkdGdVpERVZNQk1HCkExVUVCd3dNVFdsa1pHVnNhR0Z5Ym1sek1TMHdLd1lEVlFRS0RDUlBVRTV6Wlc1elpTQnpaV3htTFhOcFoyNWwKWkNCM1pXSWdZMlZ5ZEdsbWFXTmhkR1dDRkVnREVIdjhSc1NneVN1S3dia0p3Qmo0akZ4Qk1CMEdBMVVkSlFRVwpNQlFHQ0NzR0FRVUZCd01CQmdnckJnRUZCUWdDQWpBTEJnTlZIUThFQkFNQ0JhQXdId1lEVlIwUkJCZ3dGb0lVClQxQk9jMlZ1YzJVdWJHOWpZV3hrYjIxaGFXNHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBSC8zdExTNlZ1SjEKZkZDbnJ4czhUeGVKNithbXpBc2NybmxudWEwYk5IVVJwU0V5bE9yR3g0YVl4Mjh2bUdUS2NkeUhnQ2ZYOTIzdAp3Qjk3emw2RWJsZHNHTS9YTUxXR3h5amN1MUFOUTBsYzNYeTJnVWJDKzNEb3VaTHE5NFRYOGlwSVcwaFdVZnlyCm5xNGNLZHQ2Ym8vTE9ZdkZJZDJxMWtEcFJXYUJTaWNobHF2WVhDNjRuWlE2UlRTWXN6eDQySzlqWlZpcGRvcTQKZ1VySmVUbzdlazduU0tpMjl3OEpoSVJXZjdnK3VQQ05KV2JZd1F6cW5tMURTcktiTDVrUjlGcE9USDd0MFp1RApKU1llY29WSjVtZCt0VmlyT3JvdU12SFVhSVdyNzN4TVhSQytDSHIrMTd3TkFDZXBCbGUzSTFSVzRqWWp4NjAyClpTVVhrb2Y2WTF3eCs3clRoTTkwSk4yeXdTOHpaOE5pemFBSmR0TWhYTkl3TzRQU1lZL3dSYUpVVFlpOTY3TzEKQ1FPZFdlSFhlU0dGTEhXZFlJQW43N0JNSDZxaUw1QjJsWTlsdFhhTjZOcGVtVlBhQnJoTVh4cm9jSGlZbWIvbApIeHRqeGV2aG41K0k3eGhEUlU3RlhYZHhRNjZ4R1RmZUlNY3dZWUtJa3l1SGZ1S1VrTkpycFNING5nTGVMdWcyCmVjcXVhdHkrcTBXY1lqZjlsTlh3b2FkWE5DTk9ManVuZHNJZXlLUnBKNlVNSERjeHBqbXZxTzFqdGxSSnI2aysKUzQ1QTBwemwybTQ3ejh0SkFaYUV2LzZFVEJEd0NSVXA3dk1IT1pnd3FHTjVsU0xlQXgrN1c1ajRJMGZ2d29iQgp0Ukc0dWwwMmtJZnl2NTVmTjZTWFVpM01CWDlTNklDaAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
1899 |
1900 |
1901 | LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1Mwd2dna3BBZ0VBQW9JQ0FRQ2ZFdW1iaWYzR1UxYzAKZ2hVRGRzMVhMckl6SlJlSmlyL1JLelFuMndXMUtmcWhjOFVyU0N5d3RZeXdSUVhSdTVLcyszTnFRRUREaU5VMApIRlkyZ21IbzJqK3NFc0tLS1pSS3pja2N2Zk51elpQbUFPVUx4UGUwcXNuU1gwdXRUTlQ2Y2V6OU13YzJuTW14ClFSYkZpaTdUZVRDenZTRlJ0c2pUb3BsNjMrM0xGd0RtSHZRQytyTmN5ZTFob0JIMkpobm5ZdTlzQ3ByM3NxWUUKK1VjZ0hMcTFvdENTdXJqTXJ6YUxUdlFhVlZ2bWtOZ2ErZWMzVG41VW9ZeVJDQjd3TFFOdlpYKy9sUGNqakJUNgpkUWV0YktDL014RkJ6MFlsMXErTEZnU3QyOFlMNm82NEtPRHV2T0VGN2x5ZWVFVUo1WFFzN0lVRVZVY0YxUEFzCnFuSy8xdk5JQUQzN3dzTE5pSmQ1RUgwNDVzbDVrMkVDNlNTVGlNYm1VYnFZbUJ1L0VNTG1tTlovYUFFLzlUK0UKZUFuR0hLQ1pXeGMwbkdtcmdGS2NHdFVDVnNvcW5ZLzI2Q2s1UUZaN1ZjN05uMUg1ayt2c0g0RWQvdSsrSW1HSgpwUTFNeldOS09TbjhWcVdGS0c2OXVuenJzc0NrYnpWcllEd1FWcFp5eVl6WHBUb1JEd0w3azY4dHUyQTYwa3doCldldkRXNDV3SGZoUTIwTHNILzNaWHFwYlhnRTFOR2RlSjdMSlNkdHJqOExCKzl6Z3Rsbkp0ZHJJM0lDeHNMU0IKVHpmSWRhKzhXa0I3c3VJVHZqM0hDdmNtNnNuWlZqcUQyMjdHSGdTODcyMFlXZElnb3ZtVHpYbis3eGFyUldOTgpabW8zV1FNbVdidXRmM3k3M2tsQ2tLZENlTDBCNXdJREFRQUJBb0lDQUcrYldGV3RpbVRFZ2xHdjFzaDRhUGQ3CkpzSGxpMDhRRHliVlZpR0VkTXUzcVVYdnNPMStGUVRpUzlROGlTbXVuZWxKL3A4VWQ1djQvQVUwd0hROEpDKzQKT0tZay8yTHFhMFhVZmY3eGNzTlI3eXVYZ3h3djFNOW9hSE4yTXVWakc2YWZtZlBJQW82WmtKVVJvc1Z6L3dpVwpaY29scnlQaXg2SmMyYXd4UW1pVU9pZzZuVjhkd0F3aERMRExHdThGcW5VQ29CTEFtaHVodHdPVVZnZTh3RzdCCnplNjBuUVhYQk1EVzQwTTZrbUVCVE80WVdkWWU5MW12Z3EwYThvSDJRd3U4UGRZUDBSbWFwZmxYZE15RGc0REMKZHFBaXFnZlFTWmVmR2lkVkkrMm1ZdjNvaUhCWUN0VWJlTllpY2VYUW5DTU15d0xRUmlWY1VpbzBhSkFhWXRNTgpJUXZMMXFtVG5ITWdvUllKQUg5VmxFakZ2WmNBR2tOQzdRNWdvRzlrWC8zN0Y1VmpiZDZHS2lkcDR0LzRCQWI2ClYvWHpTdGF5NmtsZWlld3MrZ2lxdnRnUzhtUlEyZDIrNG02bWVXeW9ON2NBTzc2MDRCak1KTGFYZExuYWQ3TFcKbEdJMytFeEhEc1VXVnBHS01naWxrS3NWaW5RSDFYcWY5V2hMWWtPNkVRUmZrNmVtZFE1NHlhVXdjS2ZWbllsSgpmcGxJZVpGNnBUd3k1MGtiYjR0OEdhdklkWXZzV1ZEaTc4UklQaXlRWE1LeTZKL0R3V0xUQ2s3OVlqRldZenJwCnk4cm5YRUZ1VzR1K1k1b1VqZ3h1VmtrRjU3NlVaQ3hOSzhkQlNVZ3RoVG5IU2ZQYW5FN1RidjNCOCt1RUFZa0wKcXpPckVBVVR1Wm9nTGpJWW1yN0JBb0lCQVFEUmtoWU5UTktGdEhua1Z1eXY3YWttdnExZUlvcmdEdVRwd2Z1OApsbG1UZTRyK0g0MU9JeTlNajNIQnZ2QTArTEF1UEpPY3JkTzA3d1RJUnJYRGZVTGI2YlhaR0V4UDRRMWtIWkFpCjQ3cUpkR1ptY1pWc05Cdzh1MHkybEU5QnpXOFpmb3duQWMrQW5XaGUrTENnTmZDazNjdCs0UjhvWWhUVHdCNm0KcWVnUVlZVkFzUTNxQUpBQTJxUEdIK1UvN3puQ3krbjM5blJVa1VTYWQrQW5JZStiNzVKdWtJdDNWY042QXp6Vwo1dTdHVXhsNzFqeGNZNWZRVG9vRWtuWHdFYm1saHFXSWlsdGJnWVpRTzRjR2RNMUgxSk1nSVN4NWlFNkYwaDZ5Cm4yTXhhd2lDVVJ3NmRlUWQvTWYxQy9INnNvVFFqVWMrM2RiYjI3aHVuVEtMbDB5SEFvSUJBUURDVU4vWFlDaTYKN3BXUDBXOFZTZ1FHRDNCVzNicS91bFNuK3FlQkhlVnRLSnl0VVhFT204WGRYcEtUVU1tOWtNUkc5MHpMWDFnaAorRFYxS0FhQ1BZa040SVRxdXRzWUUzNVhncFpFSmZDdmhtWEZiWFBIMWtaWld6SG12ajQzYVo3TnZoQU13Q1E2CjRpYnZWM0pDUy9sV0pCRFNZQ2xJWXNER2pFblJXM3JMM0tpKzhsa0VsZG5KWFR4cy8wZzN1dkhXSjZ1Mmp4ZzgKOXMveXhiaEU4QWs5ZDAwS0J5ZEUyQnJKR0xNSmtPVk5TcGJvUzhQSE9KNDdFMklCZ29ia2NLVVBaOXkwMVhFSAphc1dNYU1Ra0lwOUdwSkU5K3NmWXVqb1UzZ2lZa2NDdldxQVhTZVVEVVlRdkJmOEQ5UXJUampKQnUxOWx1QUpFCnFTMzk1S2g0ekZlaEFvSUJBUUNLSnZhWWovTWNKeXhQaGFvRUUvVDFVSyt6SmF4TkppUnJvUEJWa3Z1OENLNUkKOWYzTjY4M3JkNGh6UTI3UVRMeS96amsxQ1RaTnlWOXFzNHB4TTZzV2s4dklNSWRtQlNNeHczZFlPSzJvblc0Lwp6RkxIZ05hNGhuUjh5K292bzhEQW1yYkRwQ0xwVTFzUmVIbmZNNC9PNzFPTjhkUDdhQ1Q0cm1iR1VhMWsxeFRqCjM1UWZsWDFZd3NsQis1YkIvZThpNWcvMzRhVXdkbzgyRVI1WVRidktIVFYzNDV1ODhIR3JobVRkK21DZnB2cGUKczQwWkRxSnV0TWV4V2VlYmVlUGJKWmNNR3NFODRuYnJmMEowMUJ6YlpGd1V5eW1wZUZ6alJPL3RxcnJXUWd2YQo5S05hT290RjVYVGZxcDg3TitIc0phWTQ0RDhhc282emhMZGtaRG9UQW9JQkFRQ3lKZHRTWmdKeGZ4TDNpNWMvCitWKysvcUNMd3pUWFdra0t5QzZSbllzZGpNSTMxQmJHd2VHaGxuYmpRSW4wbGFpZE4xVGNqMGtKdTdtbTgwOGsKVUs0NlhzRDlRdHBqTkZ2OGR1aTFDZU9qeUorOVpSOWs4dm9FS2l1UjFKRE4xTE9YQk0xS0kwNFQvZ3FjRzV2UgpWRDMvejRqc2x1VENUR2RZb0gxOHgxWEpXVUFMNzd2VkRGMWkwMnYyc2dUUHMwRE1pZ3BQa05rejYwT3kyN3FZCjJVaGZaZVRuY0s5NzJuU1VNV1RUUEZnOWlFamFKN3dTQmNKcmZ0VzNkS2VlLy9jVUxMQ1h5YWVhbVRVTUNYRHAKZ0NSdWE2b05ITUhqM0xnck1YVElDN2lRQzVJQ1Ira0NKZFgrRm8wNlg0blJjdWg0Z3dSdkNVaHJFbi9yNlpyYgpSTnlCQW9JQkFDVENVMDdLbFc1c0xvdnpxbnllWkhVRmZpb3FBK2g2eXFJYW9wQ2Z5ZDNzbGVBS0pUTUloU01mCnFwTU5LOW9zWXhrSmFZalovaDl2a01JNnY2bWlvYzZjR2lPTWNvN3NQK2QyZ1gvY1c0TmpXR2JEZjIvRnl3Q3oKVmFkZ3JNR3dET3QvcmtlMTlIZm9oV0dXQmdPMGp5WktxUTQrZ2tzSFNBdWt3V2FKL0RHTmovTWVTc3I5S25qVwovbWs5REtxODRUYkNoaXI3NzJqbytBTW5uMEV6ekQ3SVhYTDBkWTFQV2FCUW54ZjJOdVRIa1cxWU8wZnB4RGh5CkMxWmxHOFVvdDJxKzZyQ0s5akdJUmdKZ0E4MjBmS21NOWNYazJLMlIybXk5YkIvaFdIbWtUd21pdy9sMTVzc1IKY3E2emZZYlVSWk5GRU5tSzZNN1hlNjQ4aDRLemNtcz0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo=
1902 |
1903 |
1904 |
1905 | 6587afb3c50d6
1906 | Certificate for VPN
1907 | 6587af1a54447
1908 |
1909 | LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUhIRENDQlFTZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRMEZBRENCbWpFTE1Ba0dBMVVFQmhNQ1ZWTXgKRXpBUkJnTlZCQWdNQ2tOaGJHbG1iM0p1YVdFeEZEQVNCZ05WQkFjTUMxWnBZM1J2Y25acGJHeGxNU1V3SXdZRApWUVFLREJ4VGFXMTBaV05vSUVSaGRHRWdVMlZ5ZG1salpYTXNJR2x1WXk0dU1TTXdJUVlKS29aSWh2Y05BUWtCCkZoUnRhV3RsUUhOcGJYUmxZMmhrWVhSaExtTnZiVEVVTUJJR0ExVUVBd3dMYVc1MFpYSnVZV3d0WTJFd0hoY04KTWpNeE1qSTBNRFF4TWpNNFdoY05Nall3TXpJM01EUXhNak00V2pDQmxqRUxNQWtHQTFVRUJoTUNWVk14RXpBUgpCZ05WQkFnTUNrTmhiR2xtYjNKdWFXRXhGREFTQmdOVkJBY01DMVpwWTNSdmNuWnBiR3hsTVNVd0l3WURWUVFLCkRCeFRhVzEwWldOb0lFUmhkR0VnVTJWeWRtbGpaWE1zSUdsdVl5NHVNU013SVFZSktvWklodmNOQVFrQkZoUnQKYVd0bFFITnBiWFJsWTJoa1lYUmhMbU52YlRFUU1BNEdBMVVFQXd3SFkyNHRZMlZ5ZERDQ0FpSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU4vT3U5UjY2TXcwWE5uMzZTc1kzbVdhcEZ2OWc1N0QvbWJlCm0wbDVmQjgweWczVUpKNEFKQy9PNWR6ckkrR3ovWW13bGVQdW9xWkxXdzUzZk1iM0hacjdVN1ZaNE8vS2hXOGUKRXhSYXNmVFZaNzROZTBCRUF1OEVyL2FzT3liUFltelBkZGMrMktXNXJmcnhVSWMxbEtyY2syamtKMlp3MDN0SQpnTTc1cUpGLyt4TGNNRXhTb0RteGwxSHFDL3lTSzJVOGNkUXBQRzBOZlhsK1RaZjdESFBWZzV4MHVleDNCalhQCk5pL3VOcEh4OFdaZGhOUGVEcmpqbW51ZklTOHp1T1l6QUlzUGZ2RitBaFF4KzUyQ3JSNTBicXJKQWltOSthQ2QKZS9uV1FQU3RSRVg4bW1tQlVsVjd5N2lwa3FZTnBWNzlHaFIxOERXRUlXMlNKTEJubm1XcytXa3dkei9iUm9hawp1RmFkbkJINEdzQ2JVQXZyaGlPSkltQlRqK21OUW1IZjNIN2FVS28vS1lxZTZheEJ3K3p3WGRvZi9rcWMvdUs5CnJiQnJBelQvVkR0cCtjYkpBYVNiWkIzWE1VeHRNWTRIWCt6dzFnQXBCR0RuakR1SmRoZkU3d2JaTW9LM0EydWkKN3Yrc1RXSDhSRStZemtLeTl0RjVybmZHTUl5Wk0yQWFiaTM3RTBTL1BGWHdoZHJneENxcitQTEZDVkQwL1hVOQoxTVVJdkVMVzFDQnA2TkZsblZUd2JFMWlXcXdkTEtaNnBEanJpa2FCcGRVYmk5MU9pdytYTnhoK1V2UUFBaXdrCm1sU3RZQW5lam1FUjJoeFRCdXJwMTl5OU12K2ZHSC8vQzFQRkZaZ1k1OXM5MmdOZS9uR3UxZzU5L3I3LzhZN0EKOXJBNkRuYWxBZ01CQUFHamdnRnRNSUlCYVRBSkJnTlZIUk1FQWpBQU1CRUdDV0NHU0FHRytFSUJBUVFFQXdJRwpRREEwQmdsZ2hrZ0JodmhDQVEwRUp4WWxUMUJPYzJWdWMyVWdSMlZ1WlhKaGRHVmtJRk5sY25abGNpQkRaWEowCmFXWnBZMkYwWlRBZEJnTlZIUTRFRmdRVVRQSU5rclJjVWpTYUxaYkp1Ymd6WWtGZStRc3dnY2NHQTFVZEl3U0IKdnpDQnZJQVVjc0lhTU5qVGVCZWtiRUs3emZmcWhlNUZIdGloZ2FDa2daMHdnWm94Q3pBSkJnTlZCQVlUQWxWVApNUk13RVFZRFZRUUlEQXBEWVd4cFptOXlibWxoTVJRd0VnWURWUVFIREF0V2FXTjBiM0oyYVd4c1pURWxNQ01HCkExVUVDZ3djVTJsdGRHVmphQ0JFWVhSaElGTmxjblpwWTJWekxDQnBibU11TGpFak1DRUdDU3FHU0liM0RRRUoKQVJZVWJXbHJaVUJ6YVcxMFpXTm9aR0YwWVM1amIyMHhGREFTQmdOVkJBTU1DMmx1ZEdWeWJtRnNMV05oZ2dFQQpNQjBHQTFVZEpRUVdNQlFHQ0NzR0FRVUZCd01CQmdnckJnRUZCUWdDQWpBTEJnTlZIUThFQkFNQ0JhQXdEUVlKCktvWklodmNOQVFFTkJRQURnZ0lCQUpKRnI5VTFNVHBDL2cxOFlpUE9ua2R2QnpFQU5uejNWelU3MDVSclRtSSsKWDV5NXpEV2k4OXdTMk1wQjBVMlpOSWVRVStWNkVkczlZNEhIODN0cGo2VUFsVFM3eVlXOUNsYUpNbTNyN3R5bQpCc0g4MFhFNkZmSmFyaEU3eTJEaUxCN0U1dUR2N2tTS3hVWXlKZms2aVRmeGd2V0RjR3FtTyszUitlQjBkQnVtClQ2ZFhZL0JoUGFFRlJXSVhsbHhKbktMUFJ6RjF6cjFwSTRvWlRMaFJvRE1yNFNtVTdQTFNwWGc1SjB3NCt2QXgKZ3N3YWp2UitGQTBoMVRWQmtnLy9HYXhUUHVFY21obDdRUTdEUEdQeG1LTis0Z09makpYY3c4RVR3QmhOcGQyago0UnU2TXQvcmlNc0ZQU09yYjQrc1p0MHFXVEJYcldkZmYydTk3alpzcFQ0RDFZZnYrM29XOTF5NlRDZ011ZmdOCnE0WTVURVl6eHZncm02NkRDcjh0Q1pHU2JaMGN0QzlSdjMzandVbG5HWUtwY2pucmRTZFpUbUg3akRtSTBmS1AKTzZCSE42SDFLMUJNSXJKeTBsOTRRRDd5ZkdIa3NpVDN1Yk1DR3V5Q2o0emJOTUxCYjRQK0VnZ3AveXdOQmpGSApWOEhiWjY5dldJVGdOa2xzSDkzcmRqMDBhRThVRzIzem5WWFl2MGV5bDc2MC9uUjVlVklveXBMeVJVbVJ6NGZiCkJLdzdDVHRBSW05MlB0eUYvS0RTd1JPWWNGZ24xNVNLcmdnK3MzZ1dOU050cEFpM1c2MnZMNmFNbW4yK3E2eEcKRXZTcTIyclNBaXpmTXBOMEdNTWM5cTNQLzRWUTJYNTNLQ1Q2c0NpS3pUdHF1aGxpeGt3OTFDNldoVEdyRXZwRgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
1910 |
1911 |
1912 | LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRZ0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1N3d2dna29BZ0VBQW9JQ0FRRGZ6cnZVZXVqTU5GeloKOStrckdONWxtcVJiL1lPZXcvNW0zcHRKZVh3Zk5Nb04xQ1NlQUNRdnp1WGM2eVBocy8ySnNKWGo3cUttUzFzTwpkM3pHOXgyYSsxTzFXZUR2eW9WdkhoTVVXckgwMVdlK0RYdEFSQUx2QksvMnJEc216MkpzejNYWFB0aWx1YTM2CjhWQ0hOWlNxM0pObzVDZG1jTk43U0lETythaVJmL3NTM0RCTVVxQTVzWmRSNmd2OGtpdGxQSEhVS1R4dERYMTUKZmsyWCt3eHoxWU9jZExuc2R3WTF6ell2N2phUjhmRm1YWVRUM2c2NDQ1cDdueUV2TTdqbU13Q0xEMzd4ZmdJVQpNZnVkZ3EwZWRHNnF5UUlwdmZtZ25YdjUxa0QwclVSRi9KcHBnVkpWZTh1NHFaS21EYVZlL1JvVWRmQTFoQ0Z0CmtpU3daNTVsclBscE1IYy8yMGFHcExoV25ad1IrQnJBbTFBTDY0WWppU0pnVTQvcGpVSmgzOXgrMmxDcVB5bUsKbnVtc1FjUHM4RjNhSC81S25QN2l2YTJ3YXdNMC8xUTdhZm5HeVFHa20yUWQxekZNYlRHT0IxL3M4TllBS1FSZwo1NHc3aVhZWHhPOEcyVEtDdHdOcm91Ny9yRTFoL0VSUG1NNUNzdmJSZWE1M3hqQ01tVE5nR200dCt4TkV2enhWCjhJWGE0TVFxcS9qeXhRbFE5UDExUGRURkNMeEMxdFFnYWVqUlpaMVU4R3hOWWxxc0hTeW1lcVE0NjRwR2dhWFYKRzR2ZFRvc1BsemNZZmxMMEFBSXNKSnBVcldBSjNvNWhFZG9jVXdicTZkZmN2VEwvbnhoLy93dFR4UldZR09mYgpQZG9EWHY1eHJ0WU9mZjYrLy9HT3dQYXdPZzUycFFJREFRQUJBb0lDQUU4S0tzbVNrcTZ6ZTJzN0kyeWwvcnp4ClRVUnpsczAyT0oxSjFwdXZQTWVrbEFzb05icGJJR3lGN0NZR0lRanYwUVdVaUlzVDF2dFZ0NVczV3lqRlV2NU4KN2pVb3hjakp4REFHOWdRRk43M1l0Q2VwaVRLY0VsRXBYWitIR2VqTjZ0dTB0TkJNa0tTT204UDQvMUNRK3EwUQo4enBqQVFzcm8zUnhtWlAvRmFvMUFZMmFsN0FNcWl0VjdiUHZMVWFJdEt5dkdTQXRZL3E3ZmVtdlVtWHZNbW1pCktUWFMvMnBrYXB3TVR2M0VhaDlHeTlNMENkbnRIVlBzaGIxTTZLSkw2T3ZiYlVDdk8weThESzNuTFE1bWZRODUKWFhBUlJ5Tkl4V1VVMlJqVnN1RDJaQnMzWjYwRkQvZkNuYUxjdUQ3T3FPMlFBMnJnYi9IbWRRdkdSaERLdDJSVgo1eUg3Wjk1NytvMXlMZkRKMmttTFdBUFM2ODlvc05xTlRpTkhVREgxRHNWSTd3SmJpYVh1M2pTdXRwY1drSVV3ClJxOENBZFdZbUhqQ0RLOEJ5T3B2UWxnOWc3ajNmcWVsOHJuelBEZnJhb1NvS0NpOHFmT1RIeFNWWWI2bkg1L2IKYWFiOTNjQmtJREhJN2duR1pFN1plODdvWEdDTFQwMjBDYTR5SXo5eHJjOUlqSXlyZ213MjVnOGZrOHhvV04wYQpOZnNBWm5xcUpndThjTkwvT29hdXNnV2Rma2xtRzJlYklETXY0WjkwRFdzY0FiT0hmMHF0eFBwRWoxdEN1cklYCnAwekxPWEVVVHdiUEdIQXhQZVUxTm9yVldyNSt6ak1VMnRQc1U1RTc0UEd3M1dhci9JNnB3NXV6bmsyZWFFR0MKeElEZWs5RjNjMlE1OVA4SmdwaEJBb0lCQVFENXFtWVJML3JQL3h3ODI0NlFzU0xnVWlGUEErdUxWaDVKSGh0Ygp0R2poZld6blFuUjQ3UWh6MXZlR0pob0d2TjI5eWtwaSs5TjN0c0Jhc09jOFUrSzl5Z0RYamdlVzAxaXNneG4vCjFDMmpjTE5sWUJPVkZrY2R2TVJ6Zi9wbUcxK09ORnN5Q0kyOVI1QUNRbkMzbnZkK2M3dHByVE02RDh3b3dDWDIKY1dFRVY4WmUrTDJmTFRqWS9VbHhaSzI2VTQ2OURud01STVlPbEN2ZWR1blk2bFduT1pEWkNHeFN1aGw2ZGh2MApnTzZicU9EaG5ya1VqeE9KL2hvNUpwblVHcUplQi94ZHZpMjBmbks0KzVPM0dURHZGeDRFdGZCMXdvQXpoL3BoCmluUzYxaWRQb25FbG1oYkFYYVFOdWZMZFZxVVFKeFF5M29GTXA4MUxPZkNBaVZKUkFvSUJBUURsZkdKdEl1ZEEKUDQ3UE9HNUl1TnVWL2I2MkRZVHNUVHFwRXg0UzRuSWN2eFIwQUxQcHNLL05iQ3lOeUg3VUVWd1Boc1dzZWNKdQpXKzNYc2ZMU0c0eEJwRlpzbzA5OTF4cC9CSlpjNHY5UU9YczBZODVKNE5ZQUM3NHBSaHpUeDlWcDQrNzhIT25jClloK1lJeHc5anpNemlPeGJzSWVtZVdYaUpJYUhZZm8xRWI0NmhxV2RtU0ltWlRVL2piUkVIN0h4ZUZDZjNXSmIKQ2Q0QU9qRVB2ODlmK2JsQ1V4TEo4Y2UvdDNRTC9NOWZYeXVTbnBMWEFWNTM3aE5nQnZaR0M0cy8wOEVyVnpKQQpEZkxZb2JiLzl3ZEVlekFkMWlsdm1vOFJibDYyT3FNZTVxdEVPdi9menhoSnFRYUtYcGFJUDhDTmFCSlJBS3hjCkZrczNsYkdTaTlZVkFvSUJBRzI0NTNaeVFhWWJsY3RoS255SWZLMWRLdXBRN0xtbHRWV285NWtMNW5RQzdWT04KTHliZDlUTURySEMyV2dYUUJ4dWJ4YWxPeHhiN3AvbXplVXhZQ1hRalRNOXV5Z01OQ3hGMTVIMDhRSHB0MDBtZwpPYnJ4dVh0bU5HZ1dQSE9YWUIxZEFSOHlCeWpDUkpYWm9UUHhsdzlweVZtZUZyOVRwZ1BhdmxSYWE2cSs4SjFZCmIrMStzRmNjcWFROS9PUEFTU0RwTnJjbG1tMVp6UlhONk9POXlMcmZYN3NpS29rSTVKMmZQcFhyKy9GSS9OdnIKSjZmVFlXRHAzWmgwVUhLWTZmYXRSOG5qQks4b1N6N2t3WHhjZzlidnIrK2VEZm1TNjBpNlg5MXlQZTdHb3l3cQpWZE9TcnFFSUJrdEtCMlFpNmhQNU9MVktlRVM2RWswWFA0MGR6S0VDZ2dFQWVVSDVMQnVtUDQrVjRTNjdMMWZtClIySDFsSEtlU3RJZjdkaTVLbGRXM3BPa3RncnRCYzBqaDVMaUUrVGVCeVpKRTdjdDJnM1lTOEh0Y2V5SUZyY1IKckZtdWhPYmlDT2RSQzg2YnVPY0U2eG9FWE5GajNpdWNTQmZzV2hpL0FMUjFzdWNLajFLank1eFpmMlVGOWcwbAppOVNNdDRJV20wTklMMjhIV3AvTnVwN3VlalJOYkhITzFxVGh0dndrUlY3T0FuNkZjNE5pQmlLM21EMG5VV0FUCnJtM2drd2djUkhLcURrWmNYajB1UWdHaW4yMkV2M0RzdnNnZ21ydnpBMTMwTFR5eHREbjF4bHpZZGRrMVBoa0UKVVE0YWhabDArWkNjaWlSY2pVTjhqOFpvdHJ2S0dqTnViUFdRRENzZ3RVdWliZFdRNEJaUC9MU1c5Lzd6L2pBLwpaUUtDQVFFQWw5bWRTR3djYnpqMTkxOWh3RUJEd3psSWlwWFZlcUZoemFFUFZEQlhDQmhtRytaNk9aME1zZ1F6CldzTjBYK1pkUVJmTEQwZmgvVWY1eHV3ckdBbWJ0QndJRmNaQzRMSTVhZEovbHZHNVZOS00yVi9ZZjNhYzV1ejQKVE52VHdXbCtOVU5jeTNwWDR0c29vMC8ra0pTd3E2WFJ0UzdWQlYwUXJ5VGNVcGdCMHp5dUlJOEk1Z0hmdWtjagpuRlE3dXVYTEpkMlZiMkpubVhFbFRaZjN4a2NCaDJXOFg4bVRyQmZGN2d2V2ZBSklEbGJIQW5wWWpJV3JjTUZxCnplaGRCYlpHUzdsYmNXZzhMUFdwT2JqNzRZOE9nS0cwL0N4Smp0SGsyNElCWWlFUW5zZjBNMXQ5T1FGemhBMjQKcmF6akFXOUJzZ0RwZi8vUGFEcmVodVVGbCtYNmRRPT0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo=
1913 |
1914 |
1915 |
1916 | 6587b2632c429
1917 | michael
1918 | 6587af1a54447
1919 |
1920 | LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUhBakNDQk9xZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRMEZBRENCbWpFTE1Ba0dBMVVFQmhNQ1ZWTXgKRXpBUkJnTlZCQWdNQ2tOaGJHbG1iM0p1YVdFeEZEQVNCZ05WQkFjTUMxWnBZM1J2Y25acGJHeGxNU1V3SXdZRApWUVFLREJ4VGFXMTBaV05vSUVSaGRHRWdVMlZ5ZG1salpYTXNJR2x1WXk0dU1TTXdJUVlKS29aSWh2Y05BUWtCCkZoUnRhV3RsUUhOcGJYUmxZMmhrWVhSaExtTnZiVEVVTUJJR0ExVUVBd3dMYVc1MFpYSnVZV3d0WTJFd0hoY04KTWpNeE1qSTBNRFF5TkRBMFdoY05NalV3TVRJME1EUXlOREEwV2pDQm1URUxNQWtHQTFVRUJoTUNWVk14RXpBUgpCZ05WQkFnTUNrTmhiR2xtYjNKdWFXRXhGREFTQmdOVkJBY01DMVpwWTNSdmNuWnBiR3hsTVNVd0l3WURWUVFLCkRCeFRhVzEwWldOb0lFUmhkR0VnVTJWeWRtbGpaWE1zSUdsdVl5NHVNU013SVFZSktvWklodmNOQVFrQkZoUnQKYVd0bFFITnBiWFJsWTJoa1lYUmhMbU52YlRFVE1CRUdBMVVFQXd3S1kyNHRiV2xqYUdGbGJEQ0NBaUl3RFFZSgpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFMR1IvUWNRbnZ5SzFGb1dxcDRYLzNVNWVhK2kzQU4yCkN1dlJkRndlemIxaGZOd2N5bmhhODFJTUpTRzV5SkxRcHlVYmdtRXZvT2xER3h1ZjY5S09md0hVNWovSVZHeHcKN1BRQ1ZHRG1vRGhUWCs5UjdIYStrWUw5cFNtN240VDRPR2NubFNMRG5GTjZ0UmM2R2pwS0t0MDZsdFB6czR3WApoNkVWQVZTUzJUMjNzRWJnamgyc3V1NDlZMlJjYUkyUmZlVklsRzVNSmZuc3d2dnRpWXJOdldYUVpIem00SlMzCnRnQnNtclpTKytXSy9BVWtoclVWQTBxU2JNQi9hOVhvT1R1Tk9mRjJtYUo1Q0kveE5nSDVBck1uNyt5RGlRODIKdDdmTWZzZDBCUFMyQm9FMkEvQlBXc25oSUc2bm5LdE9yWUkxSi8wRkFwa1NTem9TMVp4RlB6L05GL2ZieERoMwpaVWp3d2NRYjQ5Q2p0K0ZuODNMOFRGWllGSHh5aGxXQmJhZTZYYzQ1M3AwMEhMblpIbi9PK0FXWkdobFMvbXZVCnhFbFZZMU1OYnlKeDFRMzJDcTZEL21yTUZuK0E1U1pmSWMyYldyTXphOUc4cm5keUVDOWhyR3BIU0xZbGl4cW4KUGdUTFBCNTlMYTBDeEk0SmVlZThIU0FNOGZNUWRzSXVsZWJNWEpzdWZTenFydWJqaUplay81RWxJdG4zL3ZqRgp6YWRtM2grSGlLaVhoVUhwNjd4MjV0Mm5UcEtrTlZTZnhneGVHYXUxbE56eUdNcVh1dEpHeWlnQ211VzZYZTV4CllJODYyYnNGSGUxU3E3NzVKYmR6QlQwTmZQWHRrbHZBNnZxVFI3REJkQWk0YlgwK2U2N01tRDUrYUJEdTRIZlIKQ1VrQ0UvNE1meVZEQWdNQkFBR2pnZ0ZRTUlJQlREQUpCZ05WSFJNRUFqQUFNQXNHQTFVZER3UUVBd0lGNERBMApCZ2xnaGtnQmh2aENBUTBFSnhZbFQxQk9jMlZ1YzJVZ1IyVnVaWEpoZEdWa0lFTnNhV1Z1ZENCRFpYSjBhV1pwClkyRjBaVEFkQmdOVkhRNEVGZ1FVd2M0c0hMZGJwZDl3WnM5Wm9SM0tRZDFKdHBVd2djY0dBMVVkSXdTQnZ6Q0IKdklBVWNzSWFNTmpUZUJla2JFSzd6ZmZxaGU1Rkh0aWhnYUNrZ1owd2dab3hDekFKQmdOVkJBWVRBbFZUTVJNdwpFUVlEVlFRSURBcERZV3hwWm05eWJtbGhNUlF3RWdZRFZRUUhEQXRXYVdOMGIzSjJhV3hzWlRFbE1DTUdBMVVFCkNnd2NVMmx0ZEdWamFDQkVZWFJoSUZObGNuWnBZMlZ6TENCcGJtTXVMakVqTUNFR0NTcUdTSWIzRFFFSkFSWVUKYldsclpVQnphVzEwWldOb1pHRjBZUzVqYjIweEZEQVNCZ05WQkFNTUMybHVkR1Z5Ym1Gc0xXTmhnZ0VBTUJNRwpBMVVkSlFRTU1Bb0dDQ3NHQVFVRkJ3TUNNQTBHQ1NxR1NJYjNEUUVCRFFVQUE0SUNBUUJ4eWFYVithTWVmZ2lXCkxlb2dFNjJhUG42ajFFMU1qOWNYSEtnNDMzeFppOGtYRnFUZVhsbnd4U2hrVW9KWkl5VkM4LzBIUUtUQnF0YnMKamFCeUxWS3k0dW1GUXROUmpVRnJmSlAvL0pwYzNKd29taVVyRDVObHhkcUFTRWhhaE8zcWowbHhRNkpBTnNmVgp1WjFIdFZaRmtoWE5LRTZQYjY5ZmtERVBoT0kvazZxaGJ3SXhlMnFsVTEzRG1HNmpoYVNaZ2QrSW4rVTlGM2VZCmtReHdXc2p1YWlmMG5ZREU4dFdhWFRpalZwYTlWZC80eVA4RDAxcEJsd1hYbE9QcTRYeEVjNEVEb1ZkcUVkTk0KV0U1ZzRQMHAwZ29Rc1VHS2MrMnpCZWt5MlNXZ25yQXdOcmMrek1NN1A1T3ZzVWNsVnhXMDJnSGQzVW93eUh5VgpkeDlsL0NiYlg3cjBqcWpDZlVINXhndVY1eVJpK0l3d0tsV2VoQWpVaVg5ZytVVncvS2QyWG1GNm84TEc5OUR4Ck1COXhjeHI5VWplRVlQYkFlMVpoUTZhcWtqWDV3RlZGa281bHdHS2hyRlpkcnFsTitXYjVOa3Vjb1VlWlpaSEMKMXFmZ09aMU0yNHNPVmtCanNueGZGZ0lnNmRsQ1hZbU1MM1NzOHplNEpRNC9DWTVVb1Rsd2pVdHJXSkQ5Yk15SQpvVDYycnZ4b2tCUFltNmtQUDZXK0Z4LzBncnRYOTVBdmppYzJZaE1qV0NqeUk5cDlzbDFMbUdjWTVXUVN0b1ZsCnY3eXNMczhyZ21LYWpKNUlUekV6ZHJuY1o3SnJ1eUhKbGdzNzdlYytuTXY5cW53cVpjazhjaEhTK0pacHlyR20KeXJBc3JBQWRtQmlxMXJnaVdTL3hHZmE5QmwwVzl3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
1921 |
1922 |
1923 | LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1Mwd2dna3BBZ0VBQW9JQ0FRQ3hrZjBIRUo3OGl0UmEKRnFxZUYvOTFPWG12b3R3RGRncnIwWFJjSHMyOVlYemNITXA0V3ZOU0RDVWh1Y2lTMEtjbEc0SmhMNkRwUXhzYgpuK3ZTam44QjFPWS95RlJzY096MEFsUmc1cUE0VTEvdlVleDJ2cEdDL2FVcHU1K0UrRGhuSjVVaXc1eFRlclVYCk9obzZTaXJkT3BiVDg3T01GNGVoRlFGVWt0azl0N0JHNEk0ZHJMcnVQV05rWEdpTmtYM2xTSlJ1VENYNTdNTDcKN1ltS3piMWwwR1I4NXVDVXQ3WUFiSnEyVXZ2bGl2d0ZKSWExRlFOS2ttekFmMnZWNkRrN2pUbnhkcG1pZVFpUAo4VFlCK1FLekorL3NnNGtQTnJlM3pIN0hkQVQwdGdhQk5nUHdUMXJKNFNCdXA1eXJUcTJDTlNmOUJRS1pFa3M2CkV0V2NSVDgvelJmMzI4UTRkMlZJOE1IRUcrUFFvN2ZoWi9OeS9FeFdXQlI4Y29aVmdXMm51bDNPT2Q2ZE5CeTUKMlI1L3p2Z0ZtUm9aVXY1cjFNUkpWV05URFc4aWNkVU45Z3F1Zy81cXpCWi9nT1VtWHlITm0xcXpNMnZSdks1MwpjaEF2WWF4cVIwaTJKWXNhcHo0RXl6d2VmUzJ0QXNTT0NYbm52QjBnRFBIekVIYkNMcFhtekZ5YkxuMHM2cTdtCjQ0aVhwUCtSSlNMWjkvNzR4YzJuWnQ0Zmg0aW9sNFZCNmV1OGR1YmRwMDZTcERWVW44WU1YaG1ydFpUYzhoaksKbDdyU1Jzb29BcHJsdWwzdWNXQ1BPdG03QlIzdFVxdSsrU1czY3dVOURYejE3Wkpid09yNmswZXd3WFFJdUcxOQpQbnV1ekpnK2ZtZ1E3dUIzMFFsSkFoUCtESDhsUXdJREFRQUJBb0lDQUJGQ1lWZW9jK3VVQ3VQZXhDS3RyblRVCmExRjVBTzJOTWE2T0kwTTQ4MEp2RVZYTHJwcFlMTUpTeitFaFQ2K0ZmRm1NL1BVNVRlaWVUeW8yTnhPMktmNGgKbFdlcHJ4c0ROdVRZdlI3V0M4aXR3ZXRmQ1I3Wmt3Y3FaRDFVTVVNWlpWSVJkTnQySytHcFVhUzZUd1pQWXk4eApuS3RwU3BCWlVTT0ZDU1lSUi9CSnhHWi9PUkVGVXY0SkZYb1J5VS9KVG5WVXdxaWQyaXNhcWpFV2U0SDBVVzV0Ci9QWnU4bkZDRWZ5a2tiMGEvOFRsNTIwUWljOWNCWC9nRDVYK1RKcjBBV3dhWkFGbVI3U1ZFeEg2bmdjL0R0WWYKRWFEcGdBN3NnSnJxMDMvTGRSZmNBWEhac0RSUllqK3hGQmZ0VHJzUDRLbUJSU3ZBcXVuNTd6bnJ6cnRydDZQdwpSR2tHdmNPNy9nN3ZYandUYW1HNm8xRmttNEs4ank5NGhxbmphY1M2NXZXTFpEQnhWTFFqeTNRWjZOdG9GSzlaCnYvbjBBVzFGNWFpQmxHcU01RzZ3YmFScER5bGxwZ2VJWVhyUURXQVhUVFc3NjRka2Z5Z202L2NRcHY5OHpaN3EKVGptZytKS2dtVzl5enIxS1lFUFZ4ZUErNjlHOUR2QlpXSGN5cThHbHAzRHV5d1dDM2FicEpmSlhveEVJWEtzQQppTHRFM0Q5UjJiZzE5Yit0NDJLM1ZrRHZ5QitYTGdRY2xPVkYrOTZ0Y2FlaG8vU2dKUGY2VkZ4NGFGK0lPa0gwClg5dmRTeHZ1WStKWTEwSjcwVVBucis3emsza1NFS0dPVEVURFJCVjZvSldGSUVYZFpnV0Q3VlByaGt2OHZaY08KRG1vdkpRaUttdGF1RXdtdDBudUJBb0lCQVFEckRDTDBoRWw0QitRWk16N2FlM2dwbHdwSmVSUSsySytIZDVBUwpIRi9XVVhrOVpIa3I4SzA4aXNJL1crZHVKNzFsbTZ4SzRoWFlYVXlycXhHWlVLT1dvdjdaWmR6ZWFuSWRmRS96CitnMDZvQWpIMHpLY254SGNJMDhyRHM1NW9qL2tKT05TMFlYOHlwcENTQStueS92MnBEcGwrbFYvRmNQcmhqd2IKNDZDdUNxRWRSNGZsVmJyRUIxaTF0R0t5V2VOOWp0UzZzS0lIUDIweGNHNTRrVXB1NHp5RWhTZy9yU2x6YWFBagpXamV2OEtoNm5VS25TS0hpblpXeVEycGN4bjV1UjZtWHBVNi9IZ1FkTU9lTUx2REhKSFBjV0ptTkVtQXhtNjVOCmZ0Y05tY1gyRlRQS0JXaU1yNHJaZmxIaC9uZStIR0xHVndCU3RrTWdDSVQ4RzliaEFvSUJBUURCWmpRYWY1S24KaFhiektNa3dHN05YbXNWSFJla1F6andxb1NxcVg5T1B5MktPNko3Y0RMNHhubGx4MnREcy9LeEFzK050YVF0WAoxV2lQS0lscktHWVF5eVNmNnBGUUZJYmFJRFRMTStudktqSnFMMXRMRUJSRkFvUngxL3FZUXV4Q1RPWVF4SWN5Ckg5S0lZaGI4dENaUXg1Y0s4TXVzS1ovTDNmMFVIOXVaR0hoNC9aZlU0ZTNSbE5rYlhiUmVOQTBZQ1RlN2hGaEUKZ0hzQldKRXAyWVlUc2lweXgvREI1Q0dTUytwdUtaMVRmTVdUSURVZzRaRFp4cVgwbjYxVjQyeU1TNEpXcjVLSQozNUhyTXR3d3IxYlpxVVJoYlFwaW9BSndHaEJEc0hiWTJjSjluaEtrS3BjWEliTllTQTEyWkpNK2JaYnllWkNWCjVrMU5IalhxTTlTakFvSUJBUUNXNytzK2cvaTk2S3RVZDNFRVVrZGV4Y3hvVkNWcEdqTFYxalNoUExGYWFtVmwKeERCL3hBVXJISndTbmN6bkV3UHZ6T0QrRVdNZjF3SVdOenVNN1ppdmNpb2ZwdWNIdU9sZy8rUkQ4eTR0bUhrcgpBUGUrVmZQZEhwdUhOZkhuY0FhQlZpTFltdzNrd0tJQXNFL0ZYQnVJVGZ2bVlyUW1jTzZvUDBJNFVwdHJTQTRnClJFQURTR012NE52WmkyWFp6QmxuRnFLSzVFU1lUT1dzMnR0RjkxOEtDRWhqZlRMVWVUbG1FTTB5Qm93K0lsZSsKcldBUkZuWkdsUlY5TFFlUFhqUHdVM3FYbENNV1hZc2N4N3ZaYklkWUNwT1FTeUVIMDJZTVZVSEFLQlNuZWprQwpocWtFTVNick9RcjhFYjg1VmZURkUydG1uSlhyaDNsaGg3Y0dRa1poQW9JQkFRQ2hCaDEvcXBSS2twODFXZElaCkVoZENhNFN5RVEwNmh0d2xpa2JoMENOdjZDRkpaM2xOTWZieGpTeGYxWlo2bXU0NGVRNTB2QzlMbEU0WVUrSUcKckg0K29VVC9PT2lBU25iMUNqZXFzTENvQnZRdTRQc2NCbWs2QkJ5T1JRdEsxdjJyUGllWDhtbTJYRFNJaFZNcQpXRHhHcWNlaXZsWjJJN24rbmZmblY1Y1pZdng3a0hsb01DdzRnYnc2UXN5NFdwSkVYdmhlVXBURGhFM21FdjNhCllGaDM4YkhTRzVMamZMUlBBSkpSNHFneEtRTy91ZU5DVzB5bFpmWXJOUCszTVVIaGxjVVJzK0ZId1EzWFRHTjAKemFoOFZhaXZqWUJHR1grdUlxVkVGcHI5ZG1HdkFYdjMzOVlvMWxCaXdxc2kxaDZhcmRndVR2VUpPZFZHems2SgpqMW9OQW9JQkFEeTZQcllTQ1FZMUIyYUtTakFRSU10MC9RWi9uVmxjNlFka1d2UXJMbmxVS2F5dy9xcjV0bXpLCndab2phRTFoUlcrSmhGKzd3OWVKd2pSVkZCSFViVjM1dG1YRktFSWkrOWsvU2xjZm9QOENTOEs0amRNbEVDUjMKKy9ZYlF5cHVFc0V1Ty9vQzZSYlpzTHlRZ210VEZRUThWUlc5bThESzlOMmc3NUNGRE15dENjazZiR0FIK3I5bQpsLzRyb25ZRjFRdzI1VzNiMkZ6Q2QvWTIwemxaYXdSSWNzV05NSmZrUzFVR0lZMnNQSWZ2V2VQdU9QTGR1L0QzCjl3L29TYmFycXBqL1VYTWRsdm5CeDZlUDM1dWlvRXY1aW1IRGoyck1LNVlDMSt1Y0tRbG9nUUQ1d1BrWFEzYkMKU2xxL1N3ZStUdTFTZ05FdVFrVDhoRDFkckVZM1g5TT0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo=
1924 |
1925 |
1926 |
1927 |
1928 |
1929 |
1930 | 1
1931 | 1
1932 | 1
1933 | 1
1934 | wan
1935 |
1936 |
1937 |
1938 |
1939 |
1940 |
1941 |
1942 |
1943 |
1944 |
1945 |
1946 |
1947 |
1948 |
1949 | opt3,lan
1950 |
1951 |
1952 |
1953 |
1954 |
--------------------------------------------------------------------------------
/img/VideoThumb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EasyG0ing1/Migration/c9c991530c3d650a662c0269265e17d03eb8ed7e/img/VideoThumb.png
--------------------------------------------------------------------------------
/img/Win1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EasyG0ing1/Migration/c9c991530c3d650a662c0269265e17d03eb8ed7e/img/Win1.png
--------------------------------------------------------------------------------
/img/Win21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EasyG0ing1/Migration/c9c991530c3d650a662c0269265e17d03eb8ed7e/img/Win21.png
--------------------------------------------------------------------------------
/img/Win3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EasyG0ing1/Migration/c9c991530c3d650a662c0269265e17d03eb8ed7e/img/Win3.png
--------------------------------------------------------------------------------
/img/Win4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EasyG0ing1/Migration/c9c991530c3d650a662c0269265e17d03eb8ed7e/img/Win4.png
--------------------------------------------------------------------------------
/img/WinGit1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EasyG0ing1/Migration/c9c991530c3d650a662c0269265e17d03eb8ed7e/img/WinGit1.png
--------------------------------------------------------------------------------
/img/WinVS1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EasyG0ing1/Migration/c9c991530c3d650a662c0269265e17d03eb8ed7e/img/WinVS1.png
--------------------------------------------------------------------------------
/img/WinVS2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EasyG0ing1/Migration/c9c991530c3d650a662c0269265e17d03eb8ed7e/img/WinVS2.png
--------------------------------------------------------------------------------
/img/WinVS3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EasyG0ing1/Migration/c9c991530c3d650a662c0269265e17d03eb8ed7e/img/WinVS3.png
--------------------------------------------------------------------------------
/img/WinVS4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EasyG0ing1/Migration/c9c991530c3d650a662c0269265e17d03eb8ed7e/img/WinVS4.png
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 4.0.0
4 |
5 | com.simtechdata
6 | Migration
7 | 2.2.0
8 | jar
9 |
10 | Migration
11 | A Program for migrating ISC DHCP to Kea for OPNsense version 24
12 |
13 |
14 | migrate
15 | com.simtechdata.App
16 | UTF-8
17 | UTF-8
18 | 22
19 | ${java.version}
20 | ${java.version}
21 | 3.13.0
22 | 3.4.1
23 | 3.1.0
24 | 2.16.2
25 | 3.4.1
26 | 0.10.1
27 | 3.7.1
28 |
29 |
30 |
31 |
32 |
33 | com.fasterxml.jackson.core
34 | jackson-databind
35 | 2.17.1
36 |
37 |
38 | com.fasterxml.jackson.dataformat
39 | jackson-dataformat-xml
40 | 2.17.1
41 |
42 |
43 | commons-io
44 | commons-io
45 | 2.16.1
46 |
47 |
48 |
49 |
50 |
51 |
52 | src/main/resources
53 | true
54 |
55 | version.properties
56 |
57 |
58 |
59 |
60 |
61 |
62 | org.codehaus.mojo
63 | versions-maven-plugin
64 | ${versions-maven-plugin}
65 |
66 |
67 |
68 | display-dependency-updates
69 | display-plugin-updates
70 | property-updates-report
71 | dependency-updates-report
72 | plugin-updates-report
73 | update-properties
74 | use-latest-versions
75 |
76 |
77 |
78 |
79 |
80 |
81 | org.apache.maven.plugins
82 | maven-enforcer-plugin
83 | ${maven-enforcer-plugin}
84 |
85 |
86 | enforce-maven
87 |
88 | enforce
89 |
90 |
91 |
92 |
93 | 3.9.6
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 | org.apache.maven.plugins
104 | maven-compiler-plugin
105 | ${maven-compiler-plugin}
106 |
107 | ${java.version}
108 | ${java.version}
109 |
110 | --enable-preview
111 |
112 |
113 |
114 |
115 |
116 | org.apache.maven.plugins
117 | maven-assembly-plugin
118 | ${maven-assembly-plugin}
119 |
120 |
121 |
122 | ${mainClass}
123 |
124 |
125 |
126 | jar-with-dependencies
127 |
128 | ${name}
129 |
130 |
131 |
132 | make-assembly
133 | package
134 |
135 | single
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 | native
147 |
148 |
149 |
150 | org.apache.maven.plugins
151 | maven-jar-plugin
152 | ${maven-jar-plugin}
153 |
154 |
155 |
156 | true
157 | ${mainClass}
158 |
159 |
160 |
161 |
162 |
163 |
164 | org.graalvm.buildtools
165 | native-maven-plugin
166 | ${native-maven-plugin}
167 | true
168 |
169 | ${java.version}
170 | ${imageName}
171 | ${mainClass}
172 | true
173 |
174 | --no-fallback
175 | --verbose
176 | --enable-preview
177 | -march=compatibility
178 | -H:+ReportExceptionStackTraces
179 | -H:ReflectionConfigurationFiles=${project.basedir}/graalvm/reflect-config.json
180 | -H:JNIConfigurationFiles=${project.basedir}/graalvm/jni-config.json
181 | -H:ResourceConfigurationFiles=${project.basedir}/graalvm/resource-config.json
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
--------------------------------------------------------------------------------
/src/main/java/com/simtechdata/App.java:
--------------------------------------------------------------------------------
1 | package com.simtechdata;
2 |
3 | import com.simtechdata.enums.Mode;
4 | import com.simtechdata.migrate.Message;
5 | import com.simtechdata.migrate.Migrate;
6 |
7 | import java.io.IOException;
8 | import java.io.InputStream;
9 | import java.util.Arrays;
10 | import java.util.Properties;
11 |
12 |
13 | public class App {
14 |
15 | public static void main(String[] args) {
16 | processArgs(args);
17 | new Migrate().start();
18 | System.exit(0);
19 | }
20 |
21 | /**
22 | * Prints the help message to console and exits
23 | */
24 | private static void help() {
25 | System.out.println(Message.HELP);
26 | System.exit(0);
27 | }
28 |
29 | /**
30 | * Prints the How to message to console and exits
31 | */
32 | private static void howTo() {
33 | System.out.println(Message.HOW_TO);
34 | System.exit(0);
35 | }
36 |
37 | /**
38 | * Handles the command line arguments when the program is first run
39 | *
40 | * @param args - String array
41 | */
42 | private static void processArgs(String[] args) {
43 | boolean argumentPassed = args.length > 0;
44 | if (args.length > 0) {
45 | for (String a : args) {
46 | String arg = a.toLowerCase();
47 | switch (arg) {
48 | case "v", "version", "--version", "-v", "-version" -> {
49 | showVersion();
50 | System.exit(0);
51 | }
52 | case "?", "--help", "-help", "help" -> help();
53 | case "howto", "how", "--how", "--howto" -> howTo();
54 | case "debug" -> Mode.setMode(Mode.DEBUG);
55 | case "graal", "graalvm" -> {
56 | System.out.println("Running GraalVM");
57 | Mode.setMode(Mode.GRAAL);
58 | }
59 | case "test" -> {
60 | if (args.length > 1) {
61 | String filename = args[1];
62 | new Migrate(filename).testNew();
63 | }
64 | else {
65 | new Migrate().testNew();
66 | }
67 | System.exit(0);
68 | }
69 | case "file" -> {
70 | if (args.length > 1) {
71 | String filename = args[1];
72 | new Migrate(filename).start();
73 | System.exit(0);
74 | }
75 | else {
76 | System.out.println("Missing filename");
77 | System.exit(1);
78 | }
79 | }
80 | }
81 | }
82 | }
83 | if (argumentPassed && !Mode.isDebug() && !Mode.isGraal()) {
84 | help();
85 | }
86 | }
87 |
88 | /**
89 | * Pulls the version number from the property file and shows it to the user
90 | */
91 | public static void showVersion() {
92 | Properties prop = new Properties();
93 | try (InputStream input = App.class.getClassLoader().getResourceAsStream("version.properties")) {
94 | if (input == null) {
95 | System.out.println("Could not determine current version");
96 | }
97 | else {
98 | prop.load(input);
99 | System.out.println(prop.getProperty("version"));
100 | }
101 | }
102 | catch (IOException e) {
103 | System.out.println(Arrays.toString(e.getStackTrace()));
104 | throw new RuntimeException(e);
105 | }
106 | }
107 |
108 | }
109 |
--------------------------------------------------------------------------------
/src/main/java/com/simtechdata/data/StaticmapLocal.java:
--------------------------------------------------------------------------------
1 | package com.simtechdata.data;
2 |
3 | public class StaticmapLocal {
4 |
5 | public StaticmapLocal(String mac, String ipAddress, String cid, String hostname, String description, String networkName) {
6 | this.mac = mac;
7 | this.ipAddress = ipAddress;
8 | this.cid = cid;
9 | this.hostname = hostname;
10 | this.description = description;
11 | this.networkName = networkName;
12 | this.failed = this.mac.isEmpty() || this.ipAddress.isEmpty();
13 | }
14 |
15 | private final String mac;
16 | private final String cid;
17 | private final String ipAddress;
18 | private final String networkName;
19 | private final String hostname;
20 | private final String description;
21 | private final boolean failed;
22 | private final static String NL = System.getProperty("line.separator");
23 |
24 | public String getMac() {
25 | return mac;
26 | }
27 |
28 | public String getCid() {
29 | return cid;
30 | }
31 |
32 | public String getIpAddress() {
33 | return ipAddress;
34 | }
35 |
36 | public String getHostname() {
37 | return hostname;
38 | }
39 |
40 | public String getDescription() {
41 | return description;
42 | }
43 |
44 | public String getNetworkName() {
45 | return networkName;
46 | }
47 |
48 | public boolean isFailed() {
49 | return failed;
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/main/java/com/simtechdata/enums/Mode.java:
--------------------------------------------------------------------------------
1 | package com.simtechdata.enums;
2 |
3 | public enum Mode {
4 | NORMAL,
5 | GRAAL,
6 | DEBUG;
7 |
8 | private static Mode mode = NORMAL;
9 |
10 | public static void setMode(Mode mode) {
11 | Mode.mode = mode;
12 | }
13 |
14 | public static boolean isDebug() {
15 | return mode.equals(DEBUG);
16 | }
17 |
18 | public static boolean isGraal() {
19 | return mode.equals(GRAAL);
20 | }
21 |
22 | public static boolean isForced() {
23 | return isDebug() || isGraal();
24 | }
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/java/com/simtechdata/migrate/Message.java:
--------------------------------------------------------------------------------
1 | package com.simtechdata.migrate;
2 |
3 | import java.util.Map;
4 | import java.util.Set;
5 |
6 | public class Message {
7 |
8 | private static final String NL = System.getProperty("line.separator");
9 |
10 | public static final String HELP = """
11 | \s
12 | OPNsense DHCP Static Address Migration
13 | --------------------------------------
14 | \s
15 | **** IT IS MANDATORY that you are working with version 24 or later of
16 | OPNsense. This tool cannot work using the backup config of an
17 | older version of OPNsense.
18 | \s
19 | This is a tool to help you migrate from ISC DHCP server to the newer
20 | Kea DHCP Server in OPNsense version 24. It will take the static IP
21 | assignments that you currently have and convert them over to the
22 | Kea format which you can then import into OPNsense.
23 | \s
24 | For quick documentation, go to https://github.com/EasyG0ing1/Migration
25 | \s
26 | Possible arguments are:
27 | \s
28 | how, --howto - Get the detailed steps for doing the migration.
29 | v, --version - get the version info.
30 | ?, --help - This help.
31 |
32 | \s""";
33 |
34 | public static final String HOW_TO = """
35 | \s
36 | Instructions
37 | ------------
38 | \s
39 | **** IT IS MANDATORY that you are working with version 24 or later of
40 | OPNsense. This tool cannot work using the backup config of an
41 | older version of OPNsense.
42 | \s
43 | EXPORT config.xml
44 | 1 - In OPNsense, go into Services / Kea DHCP / Kea DHCPv4
45 | 2 - In the right pane, click on the Subnets tab
46 | 3 - Create all of your networks subnets and IP Pools
47 | - The pools can be done later, what matters is that the subnet is properly stated
48 | - Click Apply to save the subnets you just created
49 | 4 - Go into System / Configuration / Backups
50 | 5 - Click on Download Configuration and name the file `config.xml'
51 | - Save the file into the same folder that this program is in
52 | 6 - Run this program
53 | - There will be a new file in this folder called 'new_config.xml'
54 | \s
55 | IMPORT new_config.xml
56 | 1 - Go into OPNsense under System / Configuration / Backups
57 | 2 - UNCHECK the box that says Reboot after restore
58 | - Make sure everything else stays at default settings
59 | 3 - Click Choose File and select new_config.xml
60 | 4 - Click Restore configuration
61 | \s
62 | To create an issue, go to https://github.com/EasyG0ing1/Migration and click on Issues
63 | \s
64 | \s""";
65 |
66 | public static final String SUBNET_PROBLEMS_HAVING_GUID = """
67 |
68 | The nodes in the config.xml file contain the definitions of the subnets that
69 | you created in step one of this process (see migrate how). However, even though
70 | I can find a node which seems to have a valid UUID, I cannot find the xml
71 | tag which would contain the definition of the subnet. An example of what
72 | that definition will look like, would be in the format of either of these:
73 | \s
74 | 192.168.1.0/24
75 | 10.10.10.0/24
76 | \s
77 | Where the address on the left side will be a valid IPv4 subnet address
78 | that is in alignment with the number of bits in the subnet mask and that
79 | number of bits is the number on the right of the slash.
80 | \s
81 | We cannot proceed with the migration until those subnets are properly defined.
82 | \s
83 | For instructions: migrate how
84 |
85 | \s""";
86 |
87 | public static final String SUBNET_EXPECTED_BUT_NOT_FOUND = """
88 | \s
89 | I was expecting to find a Kea DHCP subnet definition, but instead I found none.
90 | Since the program merely iterates through the number of definitions it was given
91 | based on the number of nodes returned, it is impossible to speculate
92 | as to why this problem happened. A probable reason could be that your config.xml
93 | file is corrupted and should be re-created.
94 | \s
95 | For instructions: migrate how
96 | \s
97 | \s""";
98 |
99 | public static final String NO_KEA_SUBNETS_FOUND = """
100 | \s
101 | Problem:
102 | No Kea subnets found. Did you create them before generating config.xml?
103 | \s
104 | For instructions: migrate how
105 | \s
106 | \s""";
107 |
108 | public static final String NO_STATIC_MAP = """
109 | \s
110 | Problem:
111 | No static mappings found in your config.xml file.
112 | \s
113 | Options:
114 | Please go into OPNsense and check all of your static mappings in the ISC DHCP server to make sure
115 | that your mappings contain an IP address and a MAC address or simply scroll through your config.xml
116 | file and do a search for where each static mapping exists as a complete node
117 | so you would expect to see many sections of xml text that are defined by the
118 | tags. An example of one would look like this:
119 | \s
120 |
121 | cc:cc:10:10:10:11
122 | 10.10.10.11
123 | SomeHostname
124 |
125 |
126 |
127 | Description of static map
128 |
129 | \s
130 | What is mandatory in these nodes is that the MAC address and the IP address exist and are accurate.
131 | \s
132 | \s""";
133 |
134 |
135 | public static final String GENERIC_CONFIG_XML = """
136 | \s
137 | Problem:
138 | There was a problem with config.xml. The file exists but it could not be read into a Java XML Document.
139 | \s
140 | Options:
141 | You might try obtaining a clean copy from you OPNsense firewall.
142 | \s
143 | For instructions: migrate how
144 | \s
145 | \s""";
146 |
147 |
148 | public static final String NO_CONFIG_FILE = """
149 | \s
150 | Problem:
151 | Could not find config.xml, which needs be in the same folder that this program is in
152 | and you need to be in that folder when you run migrate.
153 | \s
154 | Options:
155 | Make sure you are in the correct folder and that both the config.xml file and the migrate
156 | program are in that folder, then try again.
157 | \s
158 | For instructions: migrate how
159 | \s
160 | \s""";
161 |
162 |
163 | public static String STATIC_MAP_FAILURES(Map failureMap) {
164 | StringBuilder sb = new StringBuilder(NL);
165 | for (String netName : failureMap.keySet()) {
166 | Integer count = failureMap.get(netName);
167 | sb.append("\tNetwork: ").append(netName).append("\tFailures: ").append(count).append(NL);
168 | }
169 | sb.append(NL);
170 |
171 | return STR."""
172 |
173 | Alert:
174 | There were failures encountered when extracting static maps from your
175 | ISC DHCP4 networks. This could mean that either a specific network had no static
176 | mappings at all, OR it could mean that some of your static mappings were missing
177 | an IP address or a MAC address.
178 |
179 | Here are the networks along with the number of failures each one had:
180 | \{sb.toString()}
181 | If a network only has one failure, then that network most likely has no static mappings.
182 |
183 | Migrate will skip the incorrect mappings and has in fact migrated \{Migrate.getFinalCount()} static maps
184 | over to Kea.
185 |
186 | """;
187 | }
188 |
189 | public static String IP_HAS_NO_SUBNET(String ipAddress) {
190 | return String.format("""
191 | \s
192 | Problem:
193 | IP Address: %s
194 | Has no matching Kea DHCP subnet.
195 | \s
196 | Options:
197 | Please make sure that the Kea subnets are correctly defined.
198 | \s
199 | For instructions: migrate how
200 | \s
201 | \s""", ipAddress);
202 | }
203 |
204 |
205 | public static final String CREATE_ISSUE = """
206 | \s
207 | Create an issue for this problem by going to https://github.com/EasyG0ing1/Migration and clicking on Issues.
208 | \s
209 | Make sure you copy and paste the stack trace above into the issue that you create.
210 | \s
211 | \s""";
212 |
213 |
214 | public static String TEST_NODES(int count, int duplicates, String filename) {
215 | return STR."""
216 |
217 | The number of reservations found in \{filename} is: \{count}
218 | The number of duplicate IP Addresses is: \{duplicates}
219 | The net total of reservations is: \{count - duplicates}
220 |
221 | """;
222 | }
223 |
224 | public static String DUPLICATE_IP_ADDRESS(Set duplicates) {
225 | StringBuilder sb = new StringBuilder(NL);
226 | for (String ipAddress : duplicates) {
227 | sb.append("\t").append(ipAddress).append(NL);
228 | }
229 | sb.append(NL);
230 | return STR."""
231 |
232 | Duplicate IP addresses were found in your static mappings.
233 | Here is the list:
234 | \{sb.toString()}
235 | Please remove the duplicate IP addresses from your OPNsense configuration
236 | then re-export config.xml and try again.
237 |
238 | """;
239 | }
240 |
241 | public static String success(String filename) {
242 | return STR."""
243 |
244 | The output file, \{filename} has been successfully created.
245 |
246 | There were \{Migrate.getFinalCount()} static mappings migrated to Kea.
247 |
248 | For instructions on how to import the config file back into OPNsense
249 |
250 | For instructions: migrate how
251 |
252 | """;
253 | }
254 |
255 | public static String reservationsExist(int count, String filename) {
256 | return STR."""
257 |
258 | Your \{filename} file already has \{count} Kea static IP reservations.
259 |
260 | Migrating again will only add duplicates to your OPNsense configuration.
261 |
262 | """;
263 | }
264 |
265 | }
266 |
--------------------------------------------------------------------------------
/src/main/java/com/simtechdata/migrate/Migrate.java:
--------------------------------------------------------------------------------
1 | package com.simtechdata.migrate;
2 |
3 | import com.simtechdata.data.StaticmapLocal;
4 | import com.simtechdata.enums.Mode;
5 | import com.simtechdata.pojos.Reservation;
6 | import com.simtechdata.pojos.Subnet4;
7 | import org.apache.commons.io.FileUtils;
8 | import org.w3c.dom.Document;
9 | import org.w3c.dom.Element;
10 | import org.w3c.dom.Node;
11 | import org.w3c.dom.NodeList;
12 | import org.xml.sax.InputSource;
13 | import org.xml.sax.SAXException;
14 |
15 | import javax.xml.parsers.DocumentBuilder;
16 | import javax.xml.parsers.DocumentBuilderFactory;
17 | import javax.xml.parsers.ParserConfigurationException;
18 | import javax.xml.transform.OutputKeys;
19 | import javax.xml.transform.Transformer;
20 | import javax.xml.transform.TransformerFactory;
21 | import javax.xml.transform.dom.DOMSource;
22 | import javax.xml.transform.stream.StreamResult;
23 | import java.io.File;
24 | import java.io.IOException;
25 | import java.io.StringReader;
26 | import java.io.StringWriter;
27 | import java.net.InetAddress;
28 | import java.net.UnknownHostException;
29 | import java.nio.ByteBuffer;
30 | import java.nio.charset.Charset;
31 | import java.nio.file.Files;
32 | import java.nio.file.Path;
33 | import java.nio.file.Paths;
34 | import java.util.*;
35 |
36 | public class Migrate {
37 |
38 | public Migrate() {
39 | CONFIG_PATH = Paths.get(EXE_FOLDER, "config.xml");
40 | NEW_CONFIG_PATH = Paths.get(EXE_FOLDER, "new_config.xml");
41 | }
42 |
43 | public Migrate(String filename) {
44 | String newConfigFilename = STR."new_\{filename}";
45 | CONFIG_PATH = Paths.get(EXE_FOLDER, filename);
46 | NEW_CONFIG_PATH = Paths.get(EXE_FOLDER, newConfigFilename);
47 | System.out.println(STR."New Config Filename: \{newConfigFilename}");
48 | }
49 |
50 | private final String EXE_FOLDER = System.getProperty("user.dir");
51 | private final Path CONFIG_PATH;
52 | private final Path NEW_CONFIG_PATH;
53 | private final String NL = System.getProperty("line.separator");
54 | private final List subnet4List = new ArrayList<>();
55 | private final List reservationList = new ArrayList<>();
56 | private final Map netFailureMapCount = new HashMap<>();
57 | private Document doc = null;
58 | private final LinkedList staticMappings = new LinkedList<>();
59 | private NodeList subnet4NodeList = null;
60 | private String configXML = "";
61 | private static int finalCount = 0;
62 |
63 |
64 | public void start() {
65 | createDocument();
66 | getStaticMappings();
67 | getKeaSubnetList();
68 | createSubnet4List();
69 | createKeaReservations();
70 | if (finalCount > 0) {
71 | askUserToDeleteOldMappings();
72 | }
73 | saveNewConfig();
74 | }
75 |
76 | public void testNew() {
77 | File newConfigFile = NEW_CONFIG_PATH.toFile();
78 | if (newConfigFile.exists()) {
79 | try {
80 | String configXML = FileUtils.readFileToString(newConfigFile, Charset.defaultCharset());
81 | DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
82 | DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
83 | Document doc = dBuilder.parse(new InputSource(new StringReader(configXML)));
84 | if (doc == null) {
85 | System.out.println(Message.GENERIC_CONFIG_XML);
86 | System.exit(1);
87 | }
88 | Node reservations = doc.getElementsByTagName("reservations").item(0);
89 | int count = 0;
90 | int duplicates = 0;
91 | Set ipAddresses = new HashSet<>();
92 | if (reservations.getNodeType() == Node.ELEMENT_NODE) {
93 | NodeList reservationList = reservations.getChildNodes();
94 | int qty = reservationList.getLength();
95 | for (int i = 0; i < qty; i++) {
96 | Node node = reservationList.item(i);
97 | if (node.getNodeType() == Node.ELEMENT_NODE) {
98 | String name = node.getNodeName();
99 | if (name.equalsIgnoreCase("reservation")) {
100 | count++;
101 | Reservation reservation = convertNodeToReservation(node);
102 | if (reservation != null) {
103 | String ipAddy = reservation.getIp_address();
104 | if (ipAddresses.contains(ipAddy)) {
105 | duplicates++;
106 | }
107 | ipAddresses.add(ipAddy);
108 | }
109 | else {
110 | System.out.println("reservation is null");
111 | System.exit(1);
112 | }
113 | }
114 | }
115 | }
116 | if (reservationList != null && count > 0) {
117 | System.out.println(Message.TEST_NODES(count, duplicates, NEW_CONFIG_PATH.getFileName().toString()));
118 | }
119 | else {
120 | System.out.println("Could not find any reservations in new_config.xml");
121 | System.exit(1);
122 | }
123 | }
124 | }
125 | catch (IOException e) {
126 | throw new RuntimeException(e);
127 | }
128 | catch (ParserConfigurationException e) {
129 | throw new RuntimeException(e);
130 | }
131 | catch (SAXException e) {
132 | throw new RuntimeException(e);
133 | }
134 | }
135 | else {
136 | System.out.println(STR."Could not find file: \{NEW_CONFIG_PATH}");
137 | System.exit(1);
138 | }
139 | }
140 |
141 | private Reservation convertNodeToReservation(Node node) {
142 | if (node.getNodeType() == Node.ELEMENT_NODE) {
143 | Element element = (Element) node;
144 | String uuid = element.getAttribute("uuid");
145 | String subnet = getElementTextContent(element, "subnet");
146 | String ipAddress = getElementTextContent(element, "ip_address");
147 | String hwAddress = getElementTextContent(element, "hw_address");
148 | String hostname = getElementTextContent(element, "hostname");
149 | String description = getElementTextContent(element, "description");
150 |
151 | return new Reservation(uuid, subnet, ipAddress, hwAddress, hostname, description);
152 | }
153 | return null;
154 | }
155 |
156 | private String getElementTextContent(Element parentElement, String tagName) {
157 | NodeList nodeList = parentElement.getElementsByTagName(tagName);
158 | if (nodeList.getLength() > 0) {
159 | return nodeList.item(0).getTextContent();
160 | }
161 | return "";
162 | }
163 |
164 | private void createDocument() {
165 | try {
166 | if (CONFIG_PATH.toFile().exists()) {
167 | configXML = Files.readString(CONFIG_PATH);
168 | }
169 | else {
170 | System.out.println(Message.NO_CONFIG_FILE);
171 | System.exit(1);
172 | }
173 | DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
174 | DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
175 | doc = dBuilder.parse(new InputSource(new StringReader(configXML)));
176 | if (doc == null) {
177 | System.out.println(Message.GENERIC_CONFIG_XML);
178 | System.exit(1);
179 | }
180 | }
181 | catch (IOException e) {
182 | e.printStackTrace();
183 | System.out.println(Message.CREATE_ISSUE);
184 | System.exit(1);
185 | }
186 | catch (ParserConfigurationException e) {
187 | e.printStackTrace();
188 | System.out.println(Message.CREATE_ISSUE);
189 | System.exit(1);
190 | }
191 | catch (SAXException e) {
192 | e.printStackTrace();
193 | System.out.println(Message.CREATE_ISSUE);
194 | System.exit(1);
195 | }
196 | }
197 |
198 | private void getStaticMappings() {
199 | Node dhcpdNode = doc.getElementsByTagName("dhcpd").item(0);
200 | if (dhcpdNode.getNodeType() == Node.ELEMENT_NODE) {
201 | NodeList dhcpdNodeList = dhcpdNode.getChildNodes();
202 | for (int x = 0; x < dhcpdNodeList.getLength(); x++) {
203 | Node netNode = dhcpdNodeList.item(x);
204 | String netName = netNode.getNodeName();
205 | NodeList netNodeList = netNode.getChildNodes();
206 | for (int y = 0; y < netNodeList.getLength(); y++) {
207 | Node staticMapNode = netNodeList.item(y);
208 | String name = staticMapNode.getNodeName();
209 | if (name.equalsIgnoreCase("staticmap")) {
210 | NodeList valueNodeList = staticMapNode.getChildNodes();
211 | if (valueNodeList != null && valueNodeList.getLength() > 0) {
212 | String mac = "";
213 | String ipAddress = "";
214 | String cid = "";
215 | String hostname = "";
216 | String description = "";
217 | for (int z = 0; z < valueNodeList.getLength(); z++) {
218 | Node valueNode = valueNodeList.item(z);
219 | String valueName = valueNode.getNodeName();
220 | String value = valueNode.getTextContent();
221 | if (value != null) {
222 | switch (valueName) {
223 | case "mac" -> mac = value;
224 | case "ipaddr" -> ipAddress = value;
225 | case "cid" -> cid = value;
226 | case "hostname" -> hostname = value;
227 | case "descr" -> description = value;
228 | }
229 | }
230 | }
231 | boolean addStatic = !mac.isEmpty() && !ipAddress.isEmpty();
232 | StaticmapLocal staticmapLocal = new StaticmapLocal(mac, ipAddress, cid, hostname, description, netName);
233 | if (addStatic) {
234 | staticMappings.addLast(staticmapLocal);
235 | finalCount++;
236 | }
237 | else {
238 | addFailure(netName);
239 | }
240 | }
241 | else {
242 | addFailure(netName);
243 | }
244 | }
245 | }
246 | }
247 | }
248 | if (finalCount == 0) {
249 | System.out.println(Message.NO_STATIC_MAP);
250 | System.exit(1);
251 | }
252 | }
253 |
254 | private void getKeaSubnetList() {
255 | /**
256 | * This method gets the list of subnets that were created in Kea so that we can check
257 | * each static IP address against each subnet then assign the subnets UUID to the
258 | * new Kea static mapping. Subnets go into subnet4List (subnet4 being unique to Kea)
259 | */
260 |
261 | subnet4NodeList = doc.getElementsByTagName("subnet4");
262 | if (subnet4NodeList != null && subnet4NodeList.getLength() > 0) {
263 | for (int i = 0; i < subnet4NodeList.getLength(); i++) {
264 | Node subnet4Node = subnet4NodeList.item(i);
265 | Element subnet4Element = (Element) subnet4Node;
266 | if (subnet4Element != null) {
267 | String uuid = subnet4Element.getAttribute("uuid");
268 | NodeList sub4List = subnet4Element.getElementsByTagName("subnet");
269 | if (sub4List != null && sub4List.getLength() > 0) {
270 | Node node = sub4List.item(0);
271 | if (node != null) {
272 | String subnet = node.getTextContent();
273 | subnet4List.add(new Subnet4(subnet, uuid));
274 | }
275 | else {
276 | System.out.println(Message.SUBNET_PROBLEMS_HAVING_GUID);
277 | System.exit(1);
278 | }
279 | }
280 | else {
281 | System.out.println(Message.SUBNET_PROBLEMS_HAVING_GUID);
282 | System.exit(1);
283 | }
284 | }
285 | else {
286 | System.out.println(Message.SUBNET_EXPECTED_BUT_NOT_FOUND);
287 | System.exit(1);
288 | }
289 | }
290 | }
291 |
292 | if (subnet4NodeList == null || subnet4NodeList.getLength() == 0 || subnet4List.isEmpty()) {
293 | System.out.println(Message.NO_KEA_SUBNETS_FOUND);
294 | System.exit(1);
295 | }
296 | }
297 |
298 | private void createSubnet4List() {
299 |
300 | /**
301 | * This method gets the list of subnets that were created in Kea and puts them into
302 | * subnet4List (subnet4 being an XML tag that is unique to Kea) so that we can check
303 | * each static IP address against each subnet then assign the subnets UUID to the
304 | * new record.
305 | */
306 |
307 | for (int i = 0; i < subnet4NodeList.getLength(); i++) {
308 | Node subnet4Node = subnet4NodeList.item(i);
309 | Element subnet4Element = (Element) subnet4Node;
310 | if (subnet4Element != null) {
311 | String uuid = subnet4Element.getAttribute("uuid");
312 | NodeList sub4List = subnet4Element.getElementsByTagName("subnet");
313 | if (sub4List != null && sub4List.getLength() > 0) {
314 | Node node = sub4List.item(0);
315 | if (node != null) {
316 | String subnet = node.getTextContent();
317 | subnet4List.add(new Subnet4(subnet, uuid));
318 | }
319 | else {
320 | System.out.println(Message.SUBNET_PROBLEMS_HAVING_GUID);
321 | System.exit(1);
322 | }
323 | }
324 | else {
325 | System.out.println(Message.SUBNET_PROBLEMS_HAVING_GUID);
326 | System.exit(1);
327 | }
328 | }
329 | else {
330 | System.out.println(Message.SUBNET_EXPECTED_BUT_NOT_FOUND);
331 | System.exit(1);
332 | }
333 | }
334 | }
335 |
336 | private void createKeaReservations() {
337 | Set uuidSet = new HashSet<>();
338 | Set ipAddresses = new HashSet<>();
339 | int count = 0;
340 | for (StaticmapLocal staticMap : staticMappings) {
341 | String mac = staticMap.getMac();
342 | String cid = staticMap.getCid();
343 | String ipAddy = staticMap.getIpAddress();
344 | String description = staticMap.getDescription();
345 | String hostname = staticMap.getHostname();
346 | String uuid = "";
347 | if (hostname.isEmpty()) {
348 | hostname = cid;
349 | }
350 | while (uuidSet.contains(uuid) || uuid.isEmpty()) {
351 | uuid = getUUID();
352 | }
353 | uuidSet.add(uuid);
354 | String subnet = getSubnet(ipAddy);
355 | if (subnet.isEmpty()) {
356 | System.out.println(Message.IP_HAS_NO_SUBNET(ipAddy));
357 | System.exit(1);
358 | }
359 | Reservation rsv = new Reservation(uuid, subnet, ipAddy, mac, hostname, description);
360 | reservationList.add(rsv);
361 | if (Mode.isDebug()) {
362 | String dbs = STR."Reservation Added:\{NL}IPAddy: \{ipAddy}\{NL}Mac: \{mac}\{NL}Hostname: \{hostname}\{NL}Description: \{description}\{NL}";
363 | System.out.println(dbs);
364 | }
365 | count++;
366 | }
367 | if (Mode.isDebug()) {
368 | System.out.println(STR."Total added to reservationList: \{count}");
369 | }
370 | Node reservationNode = doc.getElementsByTagName("reservations").item(0);
371 | int reservationCount = reservationNode.getChildNodes().getLength();
372 | if (reservationCount > 0) {
373 | System.out.println(Message.reservationsExist(reservationCount, CONFIG_PATH.getFileName().toString()));
374 | System.exit(1);
375 | }
376 | if (reservationNode.getNodeType() == Node.ELEMENT_NODE) {
377 | Element reservationElement = (Element) reservationNode;
378 | for (Reservation reservation : reservationList) {
379 | reservationElement.appendChild(reservation.getReservation(doc));
380 | }
381 | }
382 | }
383 |
384 | private void askUserToDeleteOldMappings() {
385 | System.out.println(STR."\{finalCount} Kea DHCP static mappings have been successfully migrated.\nWould you like to remove ALL static mappings from your ISC DHCP configuration?");
386 | String response = Mode.isForced() ? "y" : "";
387 | while (!response.equalsIgnoreCase("y") && !response.equalsIgnoreCase("n")) {
388 | System.out.print("(Y/N):");
389 | response = new Scanner(System.in).nextLine();
390 | }
391 | if (response.equalsIgnoreCase("y")) {
392 | Node dhcpdNode = doc.getElementsByTagName("dhcpd").item(0);
393 | if (dhcpdNode == null) {
394 | System.out.println("Could not remove old mappings because the dhcpd node came back null!");
395 | System.out.print("Do you wish to continue? Your static mappings will still migrate safely if you chose Y\n(Y/N)? ");
396 | if (new Scanner(System.in).nextLine().equalsIgnoreCase("n")) {
397 | System.exit(1);
398 | }
399 | }
400 | else {
401 | NodeList networks = dhcpdNode.getChildNodes();
402 | for (int i = 0; i < networks.getLength(); i++) {
403 | Node networkNode = networks.item(i);
404 | String nodeName = networkNode.getNodeName();
405 | if (networkNode.getNodeType() == Node.ELEMENT_NODE) {
406 | Element element = (Element) networkNode;
407 | NodeList staticMapNodes = element.getElementsByTagName("staticmap");
408 | boolean removed = false;
409 | while (staticMapNodes.getLength() > 0) {
410 | String staticName = staticMapNodes.item(0).getNodeName();
411 | if (Mode.isDebug())
412 | System.out.println(STR."\{nodeName}:\{staticName} Removed");
413 | Node staticMapNode = staticMapNodes.item(0);
414 | element.removeChild(staticMapNode);
415 | removed = true;
416 | }
417 | if (removed) { //add the tag indicating there are no static mappings for this network
418 | Element noStaticMap = doc.createElement("staticmap");
419 | element.appendChild(noStaticMap);
420 | }
421 | }
422 | }
423 | }
424 | }
425 | }
426 |
427 | private void saveNewConfig() {
428 | try {
429 | if (!netFailureMapCount.isEmpty()) {
430 | System.out.println(Message.STATIC_MAP_FAILURES(netFailureMapCount));
431 | }
432 | if (finalCount > 0) {
433 | TransformerFactory tf = TransformerFactory.newInstance();
434 | Transformer transformer = tf.newTransformer();
435 | transformer.setOutputProperty(OutputKeys.INDENT, "yes");
436 | transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
437 | transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
438 | transformer.setOutputProperty(OutputKeys.METHOD, "xml");
439 | transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
440 | StringWriter writer = new StringWriter();
441 | DOMSource source = new DOMSource(doc);
442 | StreamResult result = new StreamResult(writer);
443 | transformer.transform(source, result);
444 | String pattern = "\\r?\\n\\s+\\r?\\n";
445 | String prettyXML = writer.toString().replaceAll(pattern, NL);
446 | File outFile = NEW_CONFIG_PATH.toFile();
447 | if (outFile.exists())
448 | FileUtils.forceDelete(outFile);
449 | FileUtils.writeStringToFile(outFile, prettyXML, Charset.defaultCharset());
450 | System.out.println(Message.success(outFile.getName()));
451 | }
452 | else {
453 | System.out.println(STR."finalCount: \{finalCount}");
454 | }
455 | }
456 | catch (NullPointerException e) {
457 | e.printStackTrace();
458 | System.out.println(Message.CREATE_ISSUE);
459 | System.exit(1);
460 | }
461 | catch (Exception e) {
462 | e.printStackTrace();
463 | System.out.println(Message.CREATE_ISSUE);
464 | System.exit(1);
465 | }
466 |
467 | }
468 |
469 | private String findParentOfDHCPDMapping(Node node) {
470 | Node current = node;
471 | while (current != null && !"dhcpd".equals(current.getParentNode().getNodeName())) {
472 | current = current.getParentNode();
473 | }
474 | return current != null ? current.getNodeName() : null;
475 | }
476 |
477 | private void addFailure(String net) {
478 | if (netFailureMapCount.containsKey(net)) {
479 | Integer value = netFailureMapCount.get(net) + 1;
480 | netFailureMapCount.replace(net, value);
481 | }
482 | else {
483 | netFailureMapCount.put(net, 1);
484 | }
485 | }
486 |
487 | /**
488 | * Generates one UUID for each Kea static mapping
489 | *
490 | * @return String
491 | */
492 | private String getUUID() {
493 | UUID uuid = UUID.randomUUID();
494 | return uuid.toString();
495 | }
496 |
497 | /**
498 | * This method loops through the subnets checking the IP address for a match.
499 | *
500 | * @param ipAddy - Pass it the IP address
501 | * @return String
502 | */
503 | private String getSubnet(String ipAddy) {
504 | try {
505 | // Iterate subnets and find out if the IP addy is in one of the subnets
506 | for (Subnet4 subnet : subnet4List) {
507 | if (ipInSubnet(ipAddy, subnet.getSubnet())) {
508 | return subnet.getUuid();
509 | }
510 | }
511 | }
512 | catch (NullPointerException ne) {
513 | ne.printStackTrace();
514 | System.out.println(Message.CREATE_ISSUE);
515 | System.exit(1);
516 | throw ne;
517 | }
518 | catch (Exception e) {
519 | e.printStackTrace();
520 | System.out.println(Message.CREATE_ISSUE);
521 | System.exit(1);
522 | throw e;
523 | }
524 | return "";
525 | }
526 |
527 | /**
528 | * This does the "Heavy lifting" of checking the IP address against a given subnet address/mask.
529 | *
530 | * @param ipAddy - IP Address
531 | * @param network - Network in the format xxx.xxx.xxx.xxx/xx
532 | * @return String
533 | */
534 | private boolean ipInSubnet(String ipAddy, String network) {
535 | try {
536 | String[] parts = network.split("/");
537 | String networkAddress = parts[0];
538 | int prefixLength = Integer.parseInt(parts[1]);
539 |
540 | byte[] networkBytes = InetAddress.getByName(networkAddress).getAddress();
541 | byte[] ipBytes = ipAddy.equals(networkAddress) ? networkBytes : InetAddress.getByName(ipAddy).getAddress();
542 |
543 | int mask = -1 << (32 - prefixLength);
544 |
545 | ByteBuffer networkMasked = ByteBuffer.wrap(applyMask(networkBytes, mask));
546 | ByteBuffer ipMasked = ByteBuffer.wrap(applyMask(ipBytes, mask));
547 |
548 | return networkMasked.getInt() == ipMasked.getInt();
549 | }
550 | catch (UnknownHostException e) {
551 | e.printStackTrace();
552 | System.out.println(Message.CREATE_ISSUE);
553 | System.exit(1);
554 | throw new RuntimeException(e);
555 | }
556 | catch (NullPointerException e) {
557 | e.printStackTrace();
558 | System.out.println(Message.CREATE_ISSUE);
559 | System.exit(1);
560 | throw new RuntimeException(e);
561 | }
562 | catch (Exception e) {
563 | e.printStackTrace();
564 | System.out.println(Message.CREATE_ISSUE);
565 | System.exit(1);
566 | throw new RuntimeException(e);
567 | }
568 | }
569 |
570 | /**
571 | * This function was broken out of the ipInSubnet method for simplification
572 | *
573 | * @param address - byte array of the ip address
574 | * @param mask - subnet mask in number of bits
575 | * @return byte array
576 | */
577 | private byte[] applyMask(byte[] address, int mask) {
578 | try {
579 | int addr = ByteBuffer.wrap(address).getInt();
580 | return ByteBuffer.allocate(4).putInt(addr & mask).array();
581 | }
582 | catch (NullPointerException e) {
583 | e.printStackTrace();
584 | System.out.println(Message.CREATE_ISSUE);
585 | System.exit(1);
586 | throw new RuntimeException(e);
587 | }
588 | catch (Exception e) {
589 | e.printStackTrace();
590 | System.out.println(Message.CREATE_ISSUE);
591 | System.exit(1);
592 | throw new RuntimeException(e);
593 | }
594 | }
595 |
596 | /**
597 | * Used by the Message class
598 | *
599 | * @return number of successful migrations
600 | */
601 | public static int getFinalCount() {
602 | return finalCount;
603 | }
604 | }
605 |
--------------------------------------------------------------------------------
/src/main/java/com/simtechdata/pojos/Reservation.java:
--------------------------------------------------------------------------------
1 | package com.simtechdata.pojos;
2 |
3 | import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
4 | import org.w3c.dom.Document;
5 | import org.w3c.dom.Element;
6 |
7 | public class Reservation {
8 | @JacksonXmlProperty(isAttribute = true)
9 | private String uuid;
10 | private String subnet;
11 | private String ip_address;
12 | private String hw_address;
13 | private String hostname;
14 | private String description;
15 |
16 | public Reservation(String uuid, String subnet, String ip_address, String hw_address, String hostname, String description) {
17 | this.uuid = uuid;
18 | this.subnet = subnet;
19 | this.ip_address = ip_address;
20 | this.hw_address = hw_address;
21 | this.hostname = hostname;
22 | this.description = description;
23 | }
24 |
25 | public String getSubnet() {
26 | return subnet;
27 | }
28 |
29 | public void setSubnet(String subnet) {
30 | this.subnet = subnet;
31 | }
32 |
33 | public String getHostname() {
34 | return hostname;
35 | }
36 |
37 | public void setHostname(String hostname) {
38 | this.hostname = hostname;
39 | }
40 |
41 | public String getHw_address() {
42 | return hw_address;
43 | }
44 |
45 | public void setHw_address(String hw_address) {
46 | this.hw_address = hw_address;
47 | }
48 |
49 | public String getDescription() {
50 | return description;
51 | }
52 |
53 | public void setDescription(String description) {
54 | this.description = description;
55 | }
56 |
57 | public String getIp_address() {
58 | return ip_address;
59 | }
60 |
61 | public void setIp_address(String ip_address) {
62 | this.ip_address = ip_address;
63 | }
64 |
65 | public String getUuid() {
66 | return uuid;
67 | }
68 |
69 | public void setUuid(String uuid) {
70 | this.uuid = uuid;
71 | }
72 |
73 | public Element getReservation(Document doc) {
74 | Element newReservation = doc.createElement("reservation");
75 | newReservation.setAttribute("uuid", this.uuid);
76 |
77 | Element subnet = doc.createElement("subnet");
78 | subnet.setTextContent(this.subnet);
79 | newReservation.appendChild(subnet);
80 |
81 | Element ipAddress = doc.createElement("ip_address");
82 | ipAddress.setTextContent(this.ip_address);
83 | newReservation.appendChild(ipAddress);
84 |
85 | Element hwAddress = doc.createElement("hw_address");
86 | hwAddress.setTextContent(this.hw_address);
87 | newReservation.appendChild(hwAddress);
88 |
89 | Element hostname = doc.createElement("hostname");
90 | hostname.setTextContent(this.hostname);
91 | newReservation.appendChild(hostname);
92 |
93 | Element description = doc.createElement("description");
94 | description.setTextContent(this.description);
95 | newReservation.appendChild(description);
96 |
97 | return newReservation;
98 | }
99 | }
100 |
--------------------------------------------------------------------------------
/src/main/java/com/simtechdata/pojos/Subnet4.java:
--------------------------------------------------------------------------------
1 | package com.simtechdata.pojos;
2 |
3 | import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
4 |
5 | public class Subnet4 {
6 |
7 | public Subnet4(String subnet, String uuid) {
8 | this.subnet = subnet;
9 | this.uuid = uuid;
10 | }
11 |
12 | private final String subnet;
13 | @JacksonXmlProperty(isAttribute = true)
14 | private final String uuid;
15 |
16 |
17 | public String getSubnet() {
18 | return subnet;
19 | }
20 |
21 | public String getUuid() {
22 | return uuid;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/com/simtechdata/pojos/Subnets.java:
--------------------------------------------------------------------------------
1 | package com.simtechdata.pojos;
2 |
3 | import java.util.ArrayList;
4 | import java.util.List;
5 |
6 | public class Subnets {
7 | private List subnet4 = new ArrayList<>();
8 |
9 | public List getSubnet4() {
10 | return subnet4;
11 | }
12 |
13 | public void setSubnet4(List subnet4) {
14 | this.subnet4 = subnet4;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/resources/version.properties:
--------------------------------------------------------------------------------
1 | version=${project.version}
2 |
--------------------------------------------------------------------------------