Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
f3717ce132 | ||
![]() |
aff9648e00 |
48
Dockerfile
48
Dockerfile
@ -1,47 +1,37 @@
|
||||
FROM rust:1.33-slim AS rustbuild
|
||||
|
||||
FROM rustbuild AS eventbuild
|
||||
|
||||
ARG MODE=--release
|
||||
|
||||
WORKDIR /build
|
||||
|
||||
RUN rustup target add x86_64-unknown-linux-musl
|
||||
|
||||
ENV USER root
|
||||
COPY wg-event-gen/Cargo.* /build/
|
||||
|
||||
ENV CARGO_INSTALL_ROOT /build/
|
||||
RUN mkdir -p src && echo "fn main() {}" > src/main.rs && cargo build $MODE --target x86_64-unknown-linux-musl
|
||||
|
||||
RUN mkdir -p /build/bin
|
||||
COPY wg-event-gen/ /build
|
||||
|
||||
RUN bash -c "cd /tmp/; cargo new --bin index; cd index; echo 'test_crate_hello_world = \"0.1.2\"' >> Cargo.toml; cargo build; cd /tmp; rm -rf index"
|
||||
|
||||
FROM rustbuild AS eventbuild
|
||||
|
||||
WORKDIR /build
|
||||
|
||||
RUN cargo new --lib wg-event-gen
|
||||
|
||||
COPY wg-event-gen/Cargo.* /build/wg-event-gen/
|
||||
|
||||
WORKDIR /build/wg-event-gen
|
||||
|
||||
RUN cargo build --target x86_64-unknown-linux-musl
|
||||
|
||||
COPY wg-event-gen/src/ /build/wg-event-gen/src/
|
||||
|
||||
RUN cargo install --debug --path . --target x86_64-unknown-linux-musl
|
||||
RUN cargo build --target x86_64-unknown-linux-musl $MODE
|
||||
|
||||
|
||||
FROM rustbuild AS boringbuild
|
||||
|
||||
RUN cargo new --bin boringtun && touch boringtun/src/lib.rs
|
||||
ARG MODE=--release
|
||||
|
||||
COPY boringtun/Cargo.* /build/boringtun/
|
||||
WORKDIR /build
|
||||
|
||||
WORKDIR /build/boringtun
|
||||
RUN rustup target add x86_64-unknown-linux-musl
|
||||
|
||||
RUN cargo build --release && rm -rf src Cargo.*
|
||||
COPY boringtun/Cargo.* /build/
|
||||
|
||||
COPY boringtun/ /build/boringtun/
|
||||
RUN mkdir -p src && echo "fn main() {}" > src/main.rs && touch src/lib.rs && cargo build $MODE #--target x86_64-unknown-linux-musl #Ring won't compile https://github.com/briansmith/ring/issues/713
|
||||
|
||||
RUN cargo install --path .
|
||||
COPY boringtun/ /build
|
||||
|
||||
RUN cargo build $MODE #--target x86_64-unknown-linux-musl
|
||||
|
||||
|
||||
FROM frolvlad/alpine-glibc
|
||||
@ -50,9 +40,11 @@ RUN echo http://nl.alpinelinux.org/alpine/edge/testing >> /etc/apk/repositories
|
||||
|
||||
ENV WG_I_PREFER_BUGGY_USERSPACE_TO_POLISHED_KMOD=1
|
||||
|
||||
COPY --from=eventbuild /build/bin/wg-event-gen /usr/bin/
|
||||
ARG MODE=--release
|
||||
|
||||
COPY --from=boringbuild /build/bin/boringtun /usr/bin/
|
||||
COPY --from=eventbuild /build/target/x86_64-unknown-linux-musl/*/wg-event-gen /usr/bin/
|
||||
|
||||
COPY --from=boringbuild /build/target/*/boringtun /usr/bin/
|
||||
|
||||
COPY init.sh /init.sh
|
||||
|
||||
|
11
Makefile
11
Makefile
@ -3,11 +3,10 @@ REPO := repo.shimun.net/shimun/wireguard-user
|
||||
build:
|
||||
docker build . -t ${REPO}
|
||||
|
||||
.ONESHELL:
|
||||
update:
|
||||
cd boringtun
|
||||
git checkout master
|
||||
git pull
|
||||
|
||||
push: build
|
||||
docker push ${REPO}
|
||||
|
||||
pull:
|
||||
docker pull ${REPO}
|
||||
docker pull ${REPO}:build-event-gen
|
||||
docker pull ${REPO}:build-boringtun
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 1f842a618a4efb460841a3e0104f4979b21a2485
|
||||
Subproject commit cabd96987454add6785c6363e4846ef1ff09101e
|
@ -24,13 +24,10 @@ case "$EVENT" in
|
||||
PREV_ENDPOINT=$8
|
||||
;;
|
||||
"added")
|
||||
|
||||
;;
|
||||
"removed")
|
||||
|
||||
;;
|
||||
"transfered")
|
||||
|
||||
*)
|
||||
exit 1
|
||||
;;
|
||||
|
2
init.sh
2
init.sh
@ -27,7 +27,7 @@ function setup_iptables() {
|
||||
iptables -t nat -$1 POSTROUTING -s $ADDRESS -o $PHY_IF -j MASQUERADE;
|
||||
}
|
||||
|
||||
/usr/bin/boringtun --disable-drop-privileges $WG_IF
|
||||
/usr/bin/boringtun $WG_IF
|
||||
|
||||
if [ ! -f "/etc/wireguard/$WG_IF.conf" ]; then
|
||||
mkdir -p /etc/wireguard/keys
|
||||
|
167
wg-event-gen/Cargo.lock
generated
167
wg-event-gen/Cargo.lock
generated
@ -1,11 +1,9 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "ansi_term"
|
||||
version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -13,17 +11,17 @@ name = "atty"
|
||||
version = "0.2.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "base64"
|
||||
version = "0.10.1"
|
||||
version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -33,19 +31,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "1.3.1"
|
||||
version = "1.2.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "2.33.0"
|
||||
version = "2.32.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
@ -66,9 +64,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"ident_case 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -77,8 +75,8 @@ version = "0.8.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"darling_core 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -88,9 +86,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"darling 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"derive_builder_core 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -99,9 +97,9 @@ version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"darling 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -114,7 +112,7 @@ name = "heck"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -129,30 +127,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.55"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "num_cpus"
|
||||
version = "1.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "number_prefix"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "numtoa"
|
||||
version = "0.1.0"
|
||||
version = "0.2.47"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "0.4.30"
|
||||
version = "0.4.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -160,15 +140,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "0.6.12"
|
||||
version = "0.6.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.1.54"
|
||||
version = "0.1.50"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
@ -176,84 +156,75 @@ name = "redox_termios"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "strsim"
|
||||
version = "0.8.0"
|
||||
version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "structopt"
|
||||
version = "0.2.15"
|
||||
version = "0.2.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"structopt-derive 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"structopt-derive 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "structopt-derive"
|
||||
version = "0.2.15"
|
||||
version = "0.2.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "0.15.34"
|
||||
version = "0.15.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "termion"
|
||||
version = "1.5.2"
|
||||
version = "1.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "textwrap"
|
||||
version = "0.11.0"
|
||||
version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "threadpool"
|
||||
version = "1.7.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "time"
|
||||
version = "0.1.42"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-segmentation"
|
||||
version = "1.3.0"
|
||||
version = "1.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
@ -275,19 +246,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
name = "wg-event-gen"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"base64 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"derive_builder 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"number_prefix 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"structopt 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"structopt-derive 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"structopt 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"structopt-derive 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.3.7"
|
||||
version = "0.3.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -307,10 +276,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
[metadata]
|
||||
"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
|
||||
"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
|
||||
"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
|
||||
"checksum base64 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "621fc7ecb8008f86d7fb9b95356cd692ce9514b80a86d85b397f32a22da7b9e2"
|
||||
"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12"
|
||||
"checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb"
|
||||
"checksum clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5067f5bb2d80ef5d68b4c87db81601f0b75bca627bc2ef76b141d7b846a3c6d9"
|
||||
"checksum byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "94f88df23a25417badc922ab0f5716cc1330e87f71ddd9203b3a3ccd9cedf75d"
|
||||
"checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e"
|
||||
"checksum darling 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9158d690bc62a3a57c3e45b85e4d50de2008b39345592c64efd79345c7e24be0"
|
||||
"checksum darling_core 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d2a368589465391e127e10c9e3a08efc8df66fd49b87dc8524c764bbe7f2ef82"
|
||||
"checksum darling_macro 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)" = "244e8987bd4e174385240cde20a3657f607fb0797563c28255c353b5819a07b1"
|
||||
@ -320,26 +289,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
"checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
|
||||
"checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77"
|
||||
"checksum ident_case 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
|
||||
"checksum libc 0.2.55 (registry+https://github.com/rust-lang/crates.io-index)" = "42914d39aad277d9e176efbdad68acb1d5443ab65afe0e0e4f0d49352a950880"
|
||||
"checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba"
|
||||
"checksum number_prefix 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a"
|
||||
"checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef"
|
||||
"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
|
||||
"checksum quote 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faf4799c5d274f3868a4aae320a0a182cbd2baee377b378f080e16a23e9d80db"
|
||||
"checksum redox_syscall 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)" = "12229c14a0f65c4f1cb046a3b52047cdd9da1f4b30f8a39c5063c8bae515e252"
|
||||
"checksum libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)" = "48450664a984b25d5b479554c29cc04e3150c97aa4c01da5604a2d4ed9151476"
|
||||
"checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915"
|
||||
"checksum quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "53fa22a1994bd0f9372d7a816207d8a2677ad0325b073f5c5332760f0fb62b5c"
|
||||
"checksum redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)" = "52ee9a534dc1301776eff45b4fa92d2c39b1d8c3d3357e6eb593e0d795506fc2"
|
||||
"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
|
||||
"checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
|
||||
"checksum structopt 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)" = "3d0760c312538987d363c36c42339b55f5ee176ea8808bbe4543d484a291c8d1"
|
||||
"checksum structopt-derive 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)" = "528aeb7351d042e6ffbc2a6fb76a86f9b622fdf7c25932798e7a82cb03bc94c6"
|
||||
"checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe"
|
||||
"checksum termion 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dde0593aeb8d47accea5392b39350015b5eccb12c0d98044d856983d89548dea"
|
||||
"checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
|
||||
"checksum threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865"
|
||||
"checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550"
|
||||
"checksum structopt 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "670ad348dc73012fcf78c71f06f9d942232cdd4c859d4b6975e27836c3efc0c3"
|
||||
"checksum structopt-derive 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "ef98172b1a00b0bec738508d3726540edcbd186d50dfd326f2b1febbb3559f04"
|
||||
"checksum syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)" = "f92e629aa1d9c827b2bb8297046c1ccffc57c99b947a680d3ccff1f136a3bee9"
|
||||
"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
|
||||
"checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6"
|
||||
"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f"
|
||||
"checksum unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9"
|
||||
"checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1"
|
||||
"checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526"
|
||||
"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
|
||||
"checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a"
|
||||
"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770"
|
||||
"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0"
|
||||
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||
|
@ -11,8 +11,12 @@ time = "0.1.42"
|
||||
structopt = "0.2.14"
|
||||
structopt-derive = "0.2.14"
|
||||
derive_builder = "0.7.1"
|
||||
threadpool = "1.7.1"
|
||||
number_prefix = "0.3.0"
|
||||
|
||||
[profile.release]
|
||||
lto = true
|
||||
|
||||
[features]
|
||||
|
||||
default = ["addrem"]
|
||||
|
||||
addrem = []
|
||||
|
@ -1,5 +1,5 @@
|
||||
use crate::model::{
|
||||
ECCKey, HexBackend, Interface, Peer, PeerBuilder, SharedKey, WireguardController,
|
||||
Base64Backed, ECCKey, Interface, Peer, PeerBuilder, SharedKey, WireguardController,
|
||||
};
|
||||
use std::io::{BufRead, BufReader, Error, ErrorKind, Result, Write};
|
||||
use std::net::{IpAddr, SocketAddr};
|
||||
@ -33,12 +33,9 @@ impl WireguardController for Userspace {
|
||||
let value_as_num = || parse_err(value.parse::<u64>());
|
||||
let mut peer: Option<Peer> = None;
|
||||
let build_peer = |peer: &mut Option<Peer>, builder: &mut PeerBuilder| -> Result<()> {
|
||||
if builder.has_key() {
|
||||
//Threat as uninitialized otherwise
|
||||
let built: Result<Peer> = parse_err(builder.build());
|
||||
*peer = Some(built?);
|
||||
*builder = PeerBuilder::default();
|
||||
}
|
||||
Ok(())
|
||||
};
|
||||
let mut add_key = |peer: &mut Option<Peer>, key: ECCKey| -> Result<()> {
|
||||
@ -53,24 +50,16 @@ impl WireguardController for Userspace {
|
||||
match key.as_ref() {
|
||||
"" => {
|
||||
//Empty line means end of data
|
||||
build_peer(&mut peer, builder).map_err(|err| {
|
||||
Error::new(
|
||||
ErrorKind::InvalidData,
|
||||
format!(
|
||||
"Protocol error, wireguard supplied insufficent data: {}",
|
||||
err
|
||||
),
|
||||
)
|
||||
})?; //TODO: handle possible actual error case
|
||||
build_peer(&mut peer, builder)?; //TODO: handle possible actual error case
|
||||
}
|
||||
"public_key" => {
|
||||
add_key(&mut peer, parse_err(ECCKey::from_hex(value))?)?;
|
||||
add_key(&mut peer, parse_err(ECCKey::from_base64(value))?)?;
|
||||
}
|
||||
"private_key" => {
|
||||
add_key(&mut peer, ECCKey::from_hex(value)?)?;
|
||||
add_key(&mut peer, ECCKey::from_base64(value)?)?;
|
||||
}
|
||||
"preshared_key" => {
|
||||
builder.shared_key(Some(SharedKey::from_hex(value)?));
|
||||
builder.shared_key(Some(SharedKey::from_base64(value)?));
|
||||
}
|
||||
"endpoint" => {
|
||||
builder.endpoint(Some(parse_err(value.parse::<SocketAddr>())?));
|
||||
|
@ -19,47 +19,35 @@ pub(crate) fn gen_events(
|
||||
.map(|p| (*p, (prev.get(*p), state.get(*p))))
|
||||
.collect::<HashMap<&ECCKey, (Option<&Peer>, Option<&Peer>)>>()
|
||||
};
|
||||
let d_zero = Duration::from_secs(0);
|
||||
let h_ms = Duration::from_millis(100);
|
||||
for (_id, (prev, cur)) in side_by_side {
|
||||
match (prev, cur) {
|
||||
(Some(prev), Some(cur)) => {
|
||||
let timedout = |peer: &Peer| {
|
||||
peer.last_handshake
|
||||
.map(|shake| {
|
||||
shake.elapsed().unwrap() > timeout
|
||||
|| shake.elapsed().unwrap() + poll_interval < timeout
|
||||
})
|
||||
.unwrap_or(true)
|
||||
};
|
||||
|
||||
if let (Some(prev_addr), Some(cur_addr)) = (prev.endpoint, cur.endpoint) {
|
||||
if prev_addr != cur_addr {
|
||||
listeners.fire(Event::Roamed(&cur, prev_addr));
|
||||
listeners.roaming(&cur, prev_addr);
|
||||
}
|
||||
}
|
||||
|
||||
let timedout_now = || !cur.last_handshake.is_some();
|
||||
if !timedout(&prev) && timedout(&cur) {
|
||||
listeners.disconnected(&cur);
|
||||
continue;
|
||||
}
|
||||
|
||||
let timedout_prev = || !prev.last_handshake.is_some();
|
||||
|
||||
match (
|
||||
timedout_prev(),
|
||||
timedout_now(),
|
||||
prev.last_handshake.and_then(|p_shake| {
|
||||
cur.last_handshake
|
||||
.and_then(|c_shake| c_shake.duration_since(p_shake).ok())
|
||||
}),
|
||||
) {
|
||||
(false, true, _) => listeners.fire(Event::Disconnected(&cur)),
|
||||
(true, false, _) => listeners.fire(Event::Connected(&cur)),
|
||||
other => {
|
||||
//dbg!(other);
|
||||
if timedout(&prev) && !timedout(&cur) {
|
||||
listeners.connected(&cur);
|
||||
}
|
||||
}
|
||||
if prev.traffic != cur.traffic {
|
||||
if let ((p_tx, p_rx), (c_tx, c_rx)) = (prev.traffic, cur.traffic) {
|
||||
listeners.fire(Event::Transfered {
|
||||
peer: &cur,
|
||||
tx: c_tx - p_tx,
|
||||
rx: c_rx - p_rx,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
(None, Some(cur)) => listeners.fire(Event::Added(&cur)),
|
||||
(Some(prev), None) => listeners.fire(Event::Removed(&prev)),
|
||||
(None, Some(cur)) => listeners.added(&cur),
|
||||
(Some(prev), None) => listeners.removed(&prev),
|
||||
fail => {
|
||||
println!("{:?}", fail);
|
||||
unreachable!()
|
||||
@ -68,7 +56,6 @@ pub(crate) fn gen_events(
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
@ -101,31 +88,31 @@ mod test {
|
||||
fn added<'a>(&self, peer: &'a Peer) {
|
||||
self.calls
|
||||
.borrow_mut()
|
||||
.push(format!("add {}", peer.key));
|
||||
.push(format!("add {}", peer.public_key));
|
||||
}
|
||||
|
||||
fn connected<'a>(&self, peer: &'a Peer) {
|
||||
self.calls
|
||||
.borrow_mut()
|
||||
.push(format!("con {}", peer.key));
|
||||
.push(format!("con {}", peer.public_key));
|
||||
}
|
||||
|
||||
fn disconnected<'a>(&self, peer: &'a Peer) {
|
||||
self.calls
|
||||
.borrow_mut()
|
||||
.push(format!("dis {}", peer.key));
|
||||
.push(format!("dis {}", peer.public_key));
|
||||
}
|
||||
|
||||
fn removed<'a>(&self, peer: &'a Peer) {
|
||||
self.calls
|
||||
.borrow_mut()
|
||||
.push(format!("rem {}", peer.key));
|
||||
.push(format!("rem {}", peer.public_key));
|
||||
}
|
||||
|
||||
fn roaming<'a>(&self, peer: &'a Peer, _previous_addr: SocketAddr) {
|
||||
self.calls
|
||||
.borrow_mut()
|
||||
.push(format!("rom {}", peer.key));
|
||||
.push(format!("rom {}", peer.public_key));
|
||||
}
|
||||
}
|
||||
|
||||
@ -141,7 +128,7 @@ mod test {
|
||||
let peer = peer();
|
||||
listeners.connected(&peer);
|
||||
assert_eq!(
|
||||
vec![["con", &peer.key].join(" ")],
|
||||
vec![["con", &peer.public_key].join(" ")],
|
||||
calls.borrow().clone()
|
||||
);
|
||||
}
|
||||
@ -154,7 +141,7 @@ mod test {
|
||||
let bkey = "HhRgEL2xsnEIqThSTUKLGaTXusorM1MFdjSSYvzBynY=";
|
||||
let key = b2h(bkey);
|
||||
Peer::from_kv(&vec![
|
||||
("key".to_string(), key.clone()),
|
||||
("public_key".to_string(), key.clone()),
|
||||
/*(
|
||||
"last_handshake_time_nsec".to_string(),
|
||||
(1000 * 1000 * 1).to_string(),
|
||||
@ -170,7 +157,7 @@ let peer = peer();
|
||||
let mut peer_cur = peer.clone();
|
||||
let mut prev: HashMap<String, Peer> = HashMap::new();
|
||||
let mut cur: HashMap<String, Peer> = HashMap::new();
|
||||
cur.insert(peer_cur.key.clone(), peer_cur.clone());
|
||||
cur.insert(peer_cur.public_key.clone(), peer_cur.clone());
|
||||
let (listener, calls) = listeners();
|
||||
let interval = time::Duration::from_secs(3);
|
||||
gen_events(
|
||||
@ -181,7 +168,7 @@ time::Duration::from_secs(3),
|
||||
interval,
|
||||
);
|
||||
assert_eq!(
|
||||
vec![["add", &peer_cur.key].join(" ")],
|
||||
vec![["add", &peer_cur.public_key].join(" ")],
|
||||
calls.borrow().clone()
|
||||
);
|
||||
|
||||
@ -205,7 +192,7 @@ time::Duration::from_secs(10),
|
||||
interval,
|
||||
);
|
||||
assert_eq!(
|
||||
vec![["rem", &peer.key].join(" ")],
|
||||
vec![["rem", &peer.public_key].join(" ")],
|
||||
calls.borrow().clone()
|
||||
);
|
||||
|
||||
@ -217,7 +204,7 @@ peer_prev.endpoint = Some("2.2.2.2:33333".parse::<SocketAddr>().unwrap());
|
||||
|
||||
peer_prev.last_handshake = Some(time::Duration::from_secs(1000));
|
||||
|
||||
prev.insert(peer_prev.key.clone(), peer_prev.clone());
|
||||
prev.insert(peer_prev.public_key.clone(), peer_prev.clone());
|
||||
|
||||
gen_events(
|
||||
&prev,
|
||||
@ -230,7 +217,7 @@ interval,
|
||||
assert!(calls
|
||||
.borrow()
|
||||
.clone()
|
||||
.contains(&["rom", &peer.key].join(" ")));
|
||||
.contains(&["rom", &peer.public_key].join(" ")));
|
||||
|
||||
calls.borrow_mut().clear();
|
||||
|
||||
@ -238,8 +225,8 @@ let peer_prev = peer.clone();
|
||||
|
||||
peer_cur.last_handshake = Some(time::Duration::from_secs(5));
|
||||
|
||||
cur.insert(peer_cur.key.clone(), peer_cur.clone());
|
||||
prev.insert(peer_prev.key.clone(), peer_prev.clone());
|
||||
cur.insert(peer_cur.public_key.clone(), peer_cur.clone());
|
||||
prev.insert(peer_prev.public_key.clone(), peer_prev.clone());
|
||||
|
||||
gen_events(
|
||||
&cur,
|
||||
@ -250,7 +237,7 @@ interval,
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
vec![["con", &peer.key].join(" ")],
|
||||
vec![["con", &peer.public_key].join(" ")],
|
||||
calls.borrow().clone()
|
||||
);
|
||||
|
||||
@ -266,9 +253,9 @@ interval,
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
vec![["dis", &peer.key].join(" ")],
|
||||
vec![["dis", &peer.public_key].join(" ")],
|
||||
calls.borrow().clone()
|
||||
);
|
||||
}
|
||||
|
||||
}*/
|
||||
}
|
||||
|
@ -1,96 +1,88 @@
|
||||
use crate::Peer;
|
||||
use number_prefix::{NumberPrefix, Prefixed, Standalone};
|
||||
use std::env;
|
||||
use std::net::SocketAddr;
|
||||
use std::path::PathBuf;
|
||||
use std::process::Command;
|
||||
use std::thread;
|
||||
use std::time::SystemTime;
|
||||
use threadpool::ThreadPool;
|
||||
|
||||
//#[non_exhaustive]
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum Event<'a> {
|
||||
Added(&'a Peer),
|
||||
Removed(&'a Peer),
|
||||
Connected(&'a Peer),
|
||||
Disconnected(&'a Peer),
|
||||
Roamed(&'a Peer, SocketAddr),
|
||||
Transfered { peer: &'a Peer, tx: u64, rx: u64 },
|
||||
}
|
||||
|
||||
pub trait EventListener {
|
||||
fn name(&self) -> &'static str;
|
||||
fn added<'a>(&self, peer: &'a Peer) {
|
||||
self.connected(peer);
|
||||
}
|
||||
|
||||
fn fire<'a>(&self, event: Event<'a>);
|
||||
fn connected<'a>(&self, peer: &'a Peer);
|
||||
|
||||
fn disconnected<'a>(&self, peer: &'a Peer);
|
||||
|
||||
fn removed<'a>(&self, peer: &'a Peer) {
|
||||
self.disconnected(peer)
|
||||
}
|
||||
|
||||
fn roaming<'a>(&self, peer: &'a Peer, previous_addr: SocketAddr);
|
||||
}
|
||||
|
||||
impl EventListener for Vec<Box<EventListener>> {
|
||||
fn name(&self) -> &'static str {
|
||||
"List of Listeners"
|
||||
}
|
||||
fn fire<'a>(&self, event: Event<'a>) {
|
||||
self.iter().for_each(|l| l.fire(event.clone()));
|
||||
fn added<'a>(&self, peer: &'a Peer) {
|
||||
if cfg!(feature = "addrem") || cfg!(test) {
|
||||
self.iter().for_each(|l| l.added(&peer));
|
||||
}
|
||||
}
|
||||
|
||||
pub struct LogListener {
|
||||
log_transfer: bool,
|
||||
fn connected<'a>(&self, peer: &'a Peer) {
|
||||
self.iter().for_each(|l| l.connected(&peer));
|
||||
}
|
||||
|
||||
impl Default for LogListener {
|
||||
fn default() -> LogListener {
|
||||
let log = env::var("WG_LOG_TRANSFER")
|
||||
.map(|t| t.parse::<bool>().unwrap_or(true))
|
||||
.unwrap_or(false);
|
||||
LogListener { log_transfer: log }
|
||||
fn disconnected<'a>(&self, peer: &'a Peer) {
|
||||
self.iter().for_each(|l| l.disconnected(&peer));
|
||||
}
|
||||
|
||||
fn removed<'a>(&self, peer: &'a Peer) {
|
||||
if cfg!(feature = "addrem") || cfg!(test) {
|
||||
self.iter().for_each(|l| l.removed(&peer));
|
||||
}
|
||||
}
|
||||
|
||||
fn roaming<'a>(&self, peer: &'a Peer, previous_addr: SocketAddr) {
|
||||
self.iter().for_each(|l| l.roaming(&peer, previous_addr));
|
||||
}
|
||||
}
|
||||
|
||||
pub struct LogListener;
|
||||
|
||||
impl EventListener for LogListener {
|
||||
fn name(&self) -> &'static str {
|
||||
"Log"
|
||||
fn connected<'a>(&self, peer: &'a Peer) {
|
||||
println!("{} connected!", peer.key);
|
||||
}
|
||||
|
||||
fn fire<'a>(&self, event: Event<'a>) {
|
||||
match event {
|
||||
Event::Connected(peer) => println!("{} connected!", peer.key),
|
||||
Event::Disconnected(peer) => println!("{} disconnected!", peer.key),
|
||||
Event::Added(peer) => println!("{} added!", peer.key),
|
||||
Event::Removed(peer) => println!("{} removed!", peer.key),
|
||||
Event::Roamed(peer, previous_addr) => println!(
|
||||
fn disconnected<'a>(&self, peer: &'a Peer) {
|
||||
println!("{} disconnected!", peer.key);
|
||||
}
|
||||
|
||||
fn added<'a>(&self, peer: &'a Peer) {
|
||||
println!("{} added!", peer.key);
|
||||
}
|
||||
|
||||
fn removed<'a>(&self, peer: &'a Peer) {
|
||||
println!("{} removed!", peer.key);
|
||||
}
|
||||
|
||||
fn roaming<'a>(&self, peer: &'a Peer, previous_addr: SocketAddr) {
|
||||
println!(
|
||||
"{} roamed {} -> {}!",
|
||||
peer.key,
|
||||
previous_addr,
|
||||
peer.endpoint.unwrap()
|
||||
),
|
||||
Event::Transfered { peer, tx, rx } if self.log_transfer => {
|
||||
let prefix = |cnt: u64| match NumberPrefix::binary(cnt as f64) {
|
||||
Standalone(bytes) => format!("{}B", bytes),
|
||||
Prefixed(prefix, n) => format!("{:.0} {}B", n, prefix),
|
||||
};
|
||||
println!(
|
||||
"{} transfered {} up, {} down",
|
||||
peer.key,
|
||||
prefix(tx),
|
||||
prefix(rx)
|
||||
);
|
||||
}
|
||||
Event::Transfered { peer, tx, rx } => (),
|
||||
_ => unimplemented!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ScriptListener {
|
||||
pub script: PathBuf,
|
||||
pub pool: ThreadPool,
|
||||
}
|
||||
|
||||
impl ScriptListener {
|
||||
pub fn new(script: PathBuf) -> ScriptListener {
|
||||
let pool = ThreadPool::new(8);
|
||||
ScriptListener { script, pool }
|
||||
ScriptListener { script }
|
||||
}
|
||||
|
||||
fn peer_props<'a>(&self, peer: &'a Peer) -> String {
|
||||
@ -135,36 +127,34 @@ impl ScriptListener {
|
||||
|
||||
fn call_sub<'a>(&self, args: Vec<&'a str>) {
|
||||
let mut cmd = self.mkcmd(args);
|
||||
self.pool.execute(move || {
|
||||
cmd.output().expect("Failed to call Script hooḱ!");
|
||||
thread::spawn(move || {
|
||||
cmd.spawn().expect("Failed to call Script hooḱ!");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
impl EventListener for ScriptListener {
|
||||
fn name(&self) -> &'static str {
|
||||
"Script"
|
||||
fn connected<'a>(&self, peer: &'a Peer) {
|
||||
self.call_sub(vec!["connected", &self.peer_props(peer)]);
|
||||
}
|
||||
fn fire<'a>(&self, event: Event<'a>) {
|
||||
match event {
|
||||
Event::Connected(peer) => self.call_sub(vec!["connected", &self.peer_props(peer)]),
|
||||
Event::Disconnected(peer) => {
|
||||
self.call_sub(vec!["disconnected", &self.peer_props(peer)])
|
||||
|
||||
fn disconnected<'a>(&self, peer: &'a Peer) {
|
||||
self.call_sub(vec!["disconnected", &self.peer_props(peer)]);
|
||||
}
|
||||
Event::Added(peer) => self.call_sub(vec!["added", &self.peer_props(peer)]),
|
||||
Event::Removed(peer) => self.call_sub(vec!["removed", &self.peer_props(peer)]),
|
||||
Event::Roamed(peer, previous_addr) => self.call_sub(vec![
|
||||
|
||||
fn added<'a>(&self, peer: &'a Peer) {
|
||||
self.call_sub(vec!["added", &self.peer_props(peer)]);
|
||||
}
|
||||
|
||||
fn removed<'a>(&self, peer: &'a Peer) {
|
||||
self.call_sub(vec!["removed", &self.peer_props(peer)]);
|
||||
}
|
||||
|
||||
fn roaming<'a>(&self, peer: &'a Peer, previous_addr: SocketAddr) {
|
||||
self.call_sub(vec![
|
||||
"roaming",
|
||||
&self.peer_props(peer),
|
||||
&previous_addr.to_string(),
|
||||
]),
|
||||
Event::Transfered { peer, tx, rx } => self.call_sub(vec![
|
||||
"transfered",
|
||||
&self.peer_props(peer),
|
||||
&tx.to_string(),
|
||||
&rx.to_string(),
|
||||
]),
|
||||
_ => unimplemented!(),
|
||||
}
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
@ -17,10 +17,9 @@ use controller::Userspace;
|
||||
use model::WireguardController;
|
||||
use opts::Opts;
|
||||
use std::collections::HashMap;
|
||||
use std::error::Error;
|
||||
use std::io;
|
||||
use std::thread::sleep;
|
||||
use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
|
||||
use std::time::{Duration, Instant};
|
||||
use structopt::StructOpt;
|
||||
|
||||
fn listeners(opts: &Opts) -> Vec<Box<EventListener>> {
|
||||
@ -29,9 +28,8 @@ fn listeners(opts: &Opts) -> Vec<Box<EventListener>> {
|
||||
listeners.push(Box::new(ScriptListener::new(events)))
|
||||
}
|
||||
if opts.log {
|
||||
listeners.push(Box::new(LogListener::default()));
|
||||
listeners.push(Box::new(LogListener));
|
||||
}
|
||||
println!("Enabled handlers: {}", (&listeners.iter().map(|l| l.name()).collect::<Vec<_>>()).join(", "));
|
||||
listeners
|
||||
}
|
||||
|
||||
@ -50,22 +48,23 @@ fn main() -> io::Result<()> {
|
||||
let mut peers_last: Option<HashMap<ECCKey, Peer>> = None;
|
||||
loop {
|
||||
let now = Instant::now();
|
||||
let peers = match controller.peers() {
|
||||
Err(ref err) if opts.ignore_socket_errors => {
|
||||
eprintln!(
|
||||
"Encountered error while querying Wireguard: {}",
|
||||
err.description()
|
||||
);
|
||||
sleep(interval);
|
||||
continue;
|
||||
let peers = controller.peers()?;
|
||||
/*println!("Connected peers:");
|
||||
for peer in peers {
|
||||
let peer = peer?;
|
||||
if peer
|
||||
.last_handshake
|
||||
.map(|h| h.elapsed().unwrap() < timeout)
|
||||
.unwrap_or(false)
|
||||
{
|
||||
println!("/\\{:?} {}",(timeout - peer.last_handshake.unwrap().elapsed().unwrap()), peer);
|
||||
}
|
||||
res => res?,
|
||||
};
|
||||
}*/
|
||||
let peers = peers
|
||||
.map(|peer| peer.map(|peer_ok| (peer_ok.key.clone(), peer_ok)))
|
||||
.collect::<io::Result<HashMap<_, _>>>()?;
|
||||
|
||||
if let Some(ref mut peers_last) = peers_last {
|
||||
|
||||
gen_events(&peers, &peers_last, &listeners, timeout, interval);
|
||||
|
||||
*peers_last = peers;
|
||||
@ -73,7 +72,7 @@ fn main() -> io::Result<()> {
|
||||
peers_last = Some(peers);
|
||||
}
|
||||
let pause = interval - now.elapsed();
|
||||
|
||||
//dbg!(interval - pause);
|
||||
sleep(if pause > interval / 2 {
|
||||
pause
|
||||
} else {
|
||||
|
@ -1,5 +1,4 @@
|
||||
use base64::{decode, encode};
|
||||
use hex;
|
||||
use std::error::Error;
|
||||
use std::fmt;
|
||||
use std::hash::{Hash, Hasher};
|
||||
@ -22,31 +21,6 @@ impl fmt::Display for ECCKey {
|
||||
}
|
||||
}
|
||||
|
||||
pub trait HexBackend {
|
||||
fn from_bytes(bytes: Vec<u8>) -> Self;
|
||||
fn bytes(&self) -> &Vec<u8>;
|
||||
fn from_hex<I: AsRef<str>>(key: I) -> io::Result<Self>
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
Ok(Self::from_bytes(hex::decode(key.as_ref()).map_err(
|
||||
|_| io::Error::new(io::ErrorKind::InvalidData, "Failed to decode hexstring"),
|
||||
)?))
|
||||
}
|
||||
fn as_hex(&self) -> io::Result<String> {
|
||||
Ok(hex::encode(&self.bytes()))
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Base64Backed> HexBackend for T {
|
||||
fn from_bytes(bytes: Vec<u8>) -> Self {
|
||||
<Self as Base64Backed>::from_bytes(bytes)
|
||||
}
|
||||
fn bytes(&self) -> &Vec<u8> {
|
||||
<Self as Base64Backed>::bytes(self)
|
||||
}
|
||||
}
|
||||
|
||||
pub trait Base64Backed {
|
||||
fn from_bytes(bytes: Vec<u8>) -> Self;
|
||||
fn bytes(&self) -> &Vec<u8>;
|
||||
@ -60,7 +34,7 @@ pub trait Base64Backed {
|
||||
return Err(io::Error::new(
|
||||
io::ErrorKind::InvalidData,
|
||||
"Failed to decode base64",
|
||||
));
|
||||
))
|
||||
}
|
||||
}; /*.map_err(|err| {
|
||||
|
||||
@ -194,10 +168,6 @@ impl PeerBuilder {
|
||||
self.validate().is_ok()
|
||||
}
|
||||
|
||||
pub fn has_key(&self) -> bool {
|
||||
self.key.is_some()
|
||||
}
|
||||
|
||||
pub fn add_allowed_ip(&mut self, ip: (IpAddr, u8)) {
|
||||
if let Some(ref mut ips) = &mut self.allowed_ips {
|
||||
ips.push(ip);
|
||||
@ -233,15 +203,3 @@ pub trait WireguardController {
|
||||
|
||||
fn update_peer(&mut self, peer: &Peer) -> io::Result<()>;
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
|
||||
use super::*;
|
||||
#[test]
|
||||
fn key_encoding() {
|
||||
let key_encoded = "08df3bebd54217eb769d607f8673e1c3c53bb55d6ac689348a9227c8c4dd8857";
|
||||
let key = ECCKey::from_hex(key_encoded).unwrap();
|
||||
assert_eq!(&key.as_hex().unwrap(), key_encoded);
|
||||
}
|
||||
}
|
||||
|
@ -4,16 +4,14 @@ use structopt::StructOpt;
|
||||
#[derive(StructOpt, Debug)]
|
||||
#[structopt(name = "event-gen")]
|
||||
pub struct Opts {
|
||||
///Time after which a client is considered as offline
|
||||
#[structopt(
|
||||
short = "t",
|
||||
long = "timeout",
|
||||
default_value = "115",
|
||||
default_value = "120",
|
||||
env = "WG_EVENT_TIMEOUT"
|
||||
)]
|
||||
pub timeout: u64,
|
||||
|
||||
///Interval after which Wireguard will be polled for updates
|
||||
#[structopt(
|
||||
short = "p",
|
||||
long = "poll-interval",
|
||||
@ -22,7 +20,6 @@ pub struct Opts {
|
||||
)]
|
||||
pub poll: u64,
|
||||
|
||||
///Programm to run when an event has fired
|
||||
#[structopt(
|
||||
short = "e",
|
||||
long = "event-handler",
|
||||
@ -31,15 +28,12 @@ pub struct Opts {
|
||||
)]
|
||||
pub events: Option<PathBuf>,
|
||||
|
||||
///Don't exit on API errors
|
||||
#[structopt(short = "I", long = "ignore-socket-err", env = "WG_IGNORE_SOCKET_ERR")]
|
||||
pub ignore_socket_errors: bool,
|
||||
|
||||
///Log all events to Stdout
|
||||
#[structopt(short = "l", long = "log", env = "WG_LOG_EVENTS")]
|
||||
pub log: bool,
|
||||
|
||||
///Socket for the userspace implementation to poll
|
||||
#[structopt(name = "SOCKET", parse(from_os_str), env = "WG_EVENT_SOCKET")]
|
||||
pub socket: PathBuf,
|
||||
}
|
||||
|
@ -1 +1 @@
|
||||
cargo +nightly build && cat target/release/wg-event-gen | ssh core@ks1 "sudo bash -c 'rm -f /srv/vpn/wireguard/event-gen; cat > /srv/vpn/wireguard/event-gen; chmod +x /srv/vpn/wireguard/event-gen'"
|
||||
cargo build --release && cat target/release/wg-event-gen | ssh core@ks1 "sudo bash -c 'cat > /srv/vpn/wireguard/event-gen'"
|
||||
|
Loading…
x
Reference in New Issue
Block a user