diff --git a/.drone.yml b/.drone.yml index 7a4777b..291a16a 100644 --- a/.drone.yml +++ b/.drone.yml @@ -16,10 +16,10 @@ steps: - cargo build --verbose --all - cargo test --verbose --all volumes: - - name: cargo - path: /usr/local/cargo/registry - - name: apt - path: /var/cache/apt + - name: cargo + path: /usr/local/cargo/registry + - name: apt + path: /var/cache/apt when: event: - push @@ -32,10 +32,10 @@ steps: - cd target/release - tar -czvf ipblc-${DRONE_TAG}-${DRONE_STAGE_OS}-${DRONE_STAGE_ARCH}.tar.gz ipblc volumes: - - name: cargo - path: /usr/local/cargo/registry - - name: apt - path: /var/cache/apt + - name: cargo + path: /usr/local/cargo/registry + - name: apt + path: /var/cache/apt when: event: - tag @@ -55,12 +55,12 @@ steps: event: - tag volumes: -- name: cargo - host: - path: /home/drone/cache/cargo -- name: apt - host: - path: /home/drone/cache/apt + - name: cargo + host: + path: /home/drone/cache/cargo + - name: apt + host: + path: /home/drone/cache/apt --- kind: pipeline @@ -80,10 +80,10 @@ steps: - cargo build --verbose --all - cargo test --verbose --all volumes: - - name: cargo - path: /usr/local/cargo/registry - - name: apt - path: /var/cache/apt + - name: cargo + path: /usr/local/cargo/registry + - name: apt + path: /var/cache/apt when: event: - push @@ -96,10 +96,10 @@ steps: - cd target/release - tar -czvf ipblc-${DRONE_TAG}-${DRONE_STAGE_OS}-${DRONE_STAGE_ARCH}.tar.gz ipblc volumes: - - name: cargo - path: /usr/local/cargo/registry - - name: apt - path: /var/cache/apt + - name: cargo + path: /usr/local/cargo/registry + - name: apt + path: /var/cache/apt when: event: - tag @@ -119,9 +119,9 @@ steps: event: - tag volumes: -- name: cargo - host: - path: /home/drone/cache/cargo -- name: apt - host: - path: /home/drone/cache/apt \ No newline at end of file + - name: cargo + host: + path: /home/drone/cache/cargo + - name: apt + host: + path: /home/drone/cache/apt diff --git a/Cargo.lock b/Cargo.lock index 90819f9..319511b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,6 +11,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "android_system_properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7ed72e1635e121ca3e79420540282af22da58be50de153d36f81ddc6b83aa9e" +dependencies = [ + "libc", +] + [[package]] name = "atty" version = "0.2.14" @@ -42,15 +51,15 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bumpalo" -version = "3.10.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" +checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" [[package]] name = "bytes" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" +checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" [[package]] name = "cc" @@ -66,23 +75,25 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" dependencies = [ - "libc", + "iana-time-zone", + "js-sys", "num-integer", "num-traits", "serde", "time", + "wasm-bindgen", "winapi", ] [[package]] name = "clap" -version = "3.2.12" +version = "3.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab8b79fe3946ceb4a0b1c080b4018992b8d27e9ff363644c1c9b6387c854614d" +checksum = "29e724a68d9319343bb3328c9cc2dfde263f4b3142ee1059a9980580171c954b" dependencies = [ "atty", "bitflags", @@ -102,6 +113,12 @@ dependencies = [ "os_str_bytes", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + [[package]] name = "encoding_rs" version = "0.8.31" @@ -149,36 +166,36 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +checksum = "2bfc52cbddcfd745bf1740338492bb0bd83d76c67b445f91c5fb29fae29ecaa1" dependencies = [ "futures-core", ] [[package]] name = "futures-core" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" +checksum = "d2acedae88d38235936c3922476b10fced7b2b68136f5e3c03c2d5be348a1115" [[package]] name = "futures-sink" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" +checksum = "ca0bae1fe9752cf7fd9b0064c674ae63f97b37bc714d745cbde0afb7ec4e6765" [[package]] name = "futures-task" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" +checksum = "842fc63b931f4056a24d59de13fb1272134ce261816e063e634ad0c15cdc5306" [[package]] name = "futures-util" -version = "0.3.21" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +checksum = "f0828a5471e340229c11c77ca80017937ce3c58cb788a17e5f1c2d5c485a9577" dependencies = [ "futures-core", "futures-task", @@ -188,9 +205,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" +checksum = "5ca32592cf21ac7ccab1825cd87f6c9b3d9022c44d086172ed0966bec8af30be" dependencies = [ "bytes", "fnv", @@ -207,9 +224,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "607c8a29735385251a339424dd462993c0fed8fa09d378f259377df08c126022" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hermit-abi" @@ -291,6 +308,19 @@ dependencies = [ "tokio-rustls", ] +[[package]] +name = "iana-time-zone" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad2bfd338099682614d3ee3fe0cd72e0b6a41ca6a87f6a74a3bd593c91650501" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "js-sys", + "wasm-bindgen", + "winapi", +] + [[package]] name = "idna" version = "0.2.3" @@ -339,15 +369,15 @@ checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" [[package]] name = "itoa" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" +checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" [[package]] name = "js-sys" -version = "0.3.58" +version = "0.3.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" +checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2" dependencies = [ "wasm-bindgen", ] @@ -360,15 +390,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.126" +version = "0.2.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" [[package]] name = "lock_api" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +checksum = "9f80bf5aacaf25cbfc8210d1cfb718f2bf3b11c4c54e5afe36c236853a8ec390" dependencies = [ "autocfg", "scopeguard", @@ -479,14 +509,16 @@ dependencies = [ [[package]] name = "nix" -version = "0.24.1" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f17df307904acd05aa8e32e97bb20f2a0df1728bbc2d771ae8f9a90463441e9" +checksum = "e322c04a9e3440c327fca7b6c8a63e6890a32fa2ad689db972425f07e0d22abb" dependencies = [ + "autocfg", "bitflags", "cfg-if", "libc", "memoffset", + "pin-utils", ] [[package]] @@ -520,15 +552,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" +checksum = "074864da206b4973b84eb91683020dbefd6a8c3f0f38e054d93954e891935e4e" [[package]] name = "os_str_bytes" -version = "6.1.0" +version = "6.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21326818e99cfe6ce1e524c2a805c189a99b5ae555a35d19f9a284b427d86afa" +checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" [[package]] name = "parking_lot" @@ -603,27 +635,27 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.40" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" +checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ "proc-macro2", ] [[package]] name = "redox_syscall" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] @@ -713,24 +745,24 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7522c9de787ff061458fe9a829dc790a3f5b22dc571694fc5883f448b94d9a9" +checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55" dependencies = [ "base64", ] [[package]] name = "rustversion" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24c8ad4f0c00e1eb5bc7614d236a7f1300e3dbd76b68cac8e06fb00b015ad8d8" +checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" [[package]] name = "ryu" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" +checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" [[package]] name = "scopeguard" @@ -750,18 +782,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.139" +version = "1.0.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0171ebb889e45aa68b44aee0859b3eede84c6f5f5c228e6f140c0b2a0a46cad6" +checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.139" +version = "1.0.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1d3230c1de7932af58ad8ffbe1d784bd55efd5a9d84ac24f69c72d83543dfb" +checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" dependencies = [ "proc-macro2", "quote", @@ -770,9 +802,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.82" +version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" +checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" dependencies = [ "itoa", "ryu", @@ -802,9 +834,12 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +dependencies = [ + "autocfg", +] [[package]] name = "smallvec" @@ -814,9 +849,9 @@ checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" [[package]] name = "socket2" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" +checksum = "10c98bba371b9b22a71a9414e420f92ddeb2369239af08200816169d5e2dd7aa" dependencies = [ "libc", "winapi", @@ -836,9 +871,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" dependencies = [ "proc-macro2", "quote", @@ -900,9 +935,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.20.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57aec3cfa4c296db7255446efb4928a6be304b431a806216105542a67b6ca82e" +checksum = "7a8325f63a7d4774dd041e363b2409ed1c5cbbd0f867795e661df066b2b0a581" dependencies = [ "autocfg", "bytes", @@ -969,9 +1004,9 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.35" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" +checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307" dependencies = [ "cfg-if", "pin-project-lite", @@ -980,9 +1015,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b7358be39f2f274f322d2aaed611acc57f382e8eb1e5b48cb9ae30933495ce7" +checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7" dependencies = [ "once_cell", ] @@ -1001,9 +1036,9 @@ checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" [[package]] name = "unicode-ident" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7" +checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" [[package]] name = "unicode-normalization" @@ -1068,9 +1103,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.81" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" +checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1078,13 +1113,13 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.81" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" +checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", @@ -1093,9 +1128,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.31" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" +checksum = "fa76fb221a1f8acddf5b54ace85912606980ad661ac7a503b4570ffd3a624dad" dependencies = [ "cfg-if", "js-sys", @@ -1105,9 +1140,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.81" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" +checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1115,9 +1150,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.81" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" +checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da" dependencies = [ "proc-macro2", "quote", @@ -1128,15 +1163,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.81" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" +checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a" [[package]] name = "web-sys" -version = "0.3.58" +version = "0.3.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" +checksum = "ed055ab27f941423197eb86b2035720b1a3ce40504df082cac2ecc6ed73335a1" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/Cargo.toml b/Cargo.toml index 4580562..7866044 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,17 +10,17 @@ repository = "https://git.paulbsd.com/paulbsd/ipblc" [dependencies] chrono = { version = "0.4", features = ["serde"] } -clap = "3.1" +clap = "3.2" ipnet = "2.5" lazy_static = "1.4" mnl = "0.2" nftnl = "0.6" -nix = "0.24" -regex = "1.5" +nix = "0.25" +regex = "1.6" reqwest = { version = "0.11", default-features = false, features = ["json","rustls-tls"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -tokio = { version = "1.18", features = ["full"] } +tokio = { version = "1.20", features = ["full"] } zmq = "0.9" # [target.aarch64-unknown-linux-gnu.dependencies] diff --git a/src/config/mod.rs b/src/config/mod.rs index 5174034..64518b8 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -1,4 +1,4 @@ -use crate::ip::IpData; +use crate::ip::{BlockIpData, IpData}; use crate::utils::*; use chrono::prelude::*; @@ -17,7 +17,7 @@ const ZMQSUBSCRIPTION: &str = "ipbl"; #[derive(Debug, Clone)] pub struct Context { - pub blocklist: HashMap, + pub blocklist: HashMap, pub cfg: Config, pub client: Client, pub discovery: Discovery, @@ -79,17 +79,18 @@ impl Context { blocklist: HashMap::new(), hashwd: HashMap::new(), }; - ctx.discovery = ctx.discovery().await.unwrap(); - #[cfg(test)] - return ctx; - - print!("Loading config ... "); - match ctx.load().await { - Ok(_) => {} - Err(err) => { - println!("error loading config: {err}"); - std::process::exit(1); + loop { + print!("Loading config ... "); + match ctx.load().await { + Ok(_) => { + break; + } + Err(err) => { + let retry = 10; + println!("error loading config: {err}, retrying in {retry} secs"); + std::thread::sleep(std::time::Duration::from_secs(retry)); + } } } ctx @@ -136,48 +137,79 @@ impl Context { } pub async fn load(&mut self) -> Result<(), Box> { + #[cfg(test)] + return Ok(()); + + self.discovery = self.discovery().await?; self.cfg.load(self.to_owned()).await?; self.create_sas().await?; Ok(()) } - pub async fn get_blocklist(&self) -> Vec { + #[cfg(test)] + pub async fn get_blocklist_pending(&self) -> Vec { let mut res: Vec = vec![]; for (_, v) in self.blocklist.iter() { - res.push(v.clone()); + res.push(v.ipdata.clone()); } res } + pub async fn get_blocklist_toblock(&mut self) -> Vec { + let mut res: Vec = vec![]; + let now: DateTime = Local::now().trunc_subsecs(0); + for (_, block) in self.blocklist.iter_mut() { + let set = self.cfg.sets.get(&block.ipdata.src.to_string()).unwrap(); + if block.tryfail >= set.tryfail { + block.starttime = now; + res.push(block.ipdata.clone()); + } + } + res + } + + pub async fn update_blocklist(&mut self, ipdata: &IpData) -> IpData { + if self.blocklist.contains_key(&ipdata.ip) { + let mut a = self.blocklist.get_mut(&ipdata.ip).unwrap(); + a.tryfail += 1; + return a.ipdata.clone(); + } else { + let now = Local::now().trunc_subsecs(0); + match self.cfg.sets.get(&ipdata.src) { + Some(set) => { + self.blocklist.insert( + ipdata.ip.to_string(), + BlockIpData { + ipdata: ipdata.clone(), + tryfail: 0, + starttime: now, + blocktime: set.blocktime, + }, + ); + } + None => {} + } + return ipdata.clone(); + } + } + pub async fn gc_blocklist(&mut self) -> Vec { let mut removed: Vec = vec![]; let now: DateTime = Local::now().trunc_subsecs(0); // nightly, future use //let drained: HashMap = ctx.blocklist.drain_filter(|k,v| v.parse_date() < mindate) for (id, blocked) in self.blocklist.clone().iter() { - for set in self.cfg.sets.clone() { - if blocked.src == set.src { - let mindate = now - Duration::minutes(set.blocktime); - - if blocked.parse_date() < mindate { - self.blocklist.remove(&id.to_string()).unwrap(); - removed.push(blocked.clone()); - } - break; - } + let mindate = now - Duration::minutes(blocked.blocktime); + if blocked.starttime < mindate { + self.blocklist.remove(&id.to_string()).unwrap(); + removed.push(blocked.ipdata.clone()); } } removed } - pub async fn update_blocklist(&mut self, ip: &IpData) { - if !self.blocklist.contains_key(&ip.ip) { - self.blocklist.insert(ip.ip.clone(), ip.clone()); - } - } - pub async fn create_sas(&mut self) -> Result<(), Box> { - for set in &self.cfg.sets { + for (src, set) in self.cfg.sets.iter() { let p = Path::new(set.path.as_str()); if p.is_dir() { let res = match self.hashwd.get(&set.path.to_string()) { @@ -202,7 +234,7 @@ impl Context { } }; self.sas.insert( - set.src.clone(), + src.clone(), SetMap { filename: set.filename.clone(), fullpath: fullpath, @@ -220,7 +252,7 @@ impl Context { #[derive(Debug, Deserialize, Serialize, Clone)] pub struct Config { - pub sets: Vec, + pub sets: HashMap, #[serde(skip_serializing)] pub trustnets: Vec, pub zmq: HashMap, @@ -229,36 +261,44 @@ pub struct Config { impl Config { pub fn new() -> Self { Self { - sets: vec![ + sets: HashMap::from([ + ("smtp".to_string(), Set { src: "smtp".to_string(), filename: "mail.log".to_string(), regex: "(SASL LOGIN authentication failed)".to_string(), path: "/var/log".to_string(), blocktime: 60, - }, + tryfail: 5, + }), + ("ssh".to_string(), Set { src: "ssh".to_string(), filename: "auth.log".to_string(), regex: "(Invalid user|BREAK|not allowed because|no matching key exchange method found)".to_string(), path: "/var/log".to_string(), blocktime: 60, - }, + tryfail: 5, + },), + ("http".to_string(), Set { src: "http".to_string(), filename: "".to_string(), regex: "(anonymousfox.co)".to_string(), path: "/var/log/nginx".to_string(), blocktime: 60, - } - ,Set { + tryfail: 5, + },), + ("openvpn".to_string(), + Set { src: "openvpn".to_string(), filename: "status".to_string(), regex: "(UNDEF)".to_string(), path: "/var/run/openvpn".to_string(), blocktime: 60, - }, - ], + tryfail: 5, + },), + ]), trustnets: vec![ "127.0.0.0/8".to_string(), "10.0.0.0/8".to_string(), @@ -321,7 +361,9 @@ impl Config { Ok(res) => res, Err(err) => return Err(err), }; - self.sets = data; + for d in data { + self.sets.insert(d.src.clone(), d); + } Ok(()) } @@ -357,6 +399,7 @@ pub struct Set { pub regex: String, pub path: String, pub blocktime: i64, + pub tryfail: i64, } #[derive(Debug, Deserialize, Serialize, Clone)] @@ -398,39 +441,98 @@ mod test { use crate::ip::*; use Context; - #[tokio::test] - pub async fn test_gc_blocklist() { + pub async fn prepare_test_data() -> Context { let mut ctx = Context::new().await; let now: DateTime = Local::now().trunc_subsecs(0); ctx.blocklist = HashMap::new(); - ctx.blocklist.insert( - "1.1.1.1".to_string(), - IpData { + + for _i in 0..10 { + ctx.update_blocklist(&IpData { ip: "1.1.1.1".to_string(), hostname: "test1".to_string(), - date: (now - Duration::minutes(61)).to_rfc3339().to_string(), + date: now.to_rfc3339().to_string(), src: "ssh".to_string(), - }, - ); - ctx.blocklist.insert( - "1.1.1.2".to_string(), - IpData { + }) + .await; + } + + for _i in 0..10 { + ctx.update_blocklist(&IpData { ip: "1.1.1.2".to_string(), hostname: "test2".to_string(), - date: (now - Duration::minutes(61)).to_rfc3339().to_string(), + date: now.to_rfc3339().to_string(), src: "http".to_string(), - }, - ); - ctx.blocklist.insert( - "1.1.1.3".to_string(), - IpData { - ip: "1.1.1.3".to_string(), - hostname: "testgood".to_string(), - date: (now - Duration::minutes(59)).to_rfc3339().to_string(), - src: "http".to_string(), - }, - ); - let result = ctx.gc_blocklist().await; - assert_eq!(result.len(), 2); + }) + .await; + } + + ctx.update_blocklist(&IpData { + ip: "1.1.1.3".to_string(), + hostname: "testgood".to_string(), + date: now.to_rfc3339().to_string(), + src: "http".to_string(), + }) + .await; + + ctx.update_blocklist(&IpData { + ip: "1.1.1.4".to_string(), + hostname: "testgood".to_string(), + date: now.to_rfc3339().to_string(), + src: "http".to_string(), + }) + .await; + + ctx.update_blocklist(&IpData { + ip: "1.1.1.4".to_string(), + hostname: "testgood".to_string(), + date: now.to_rfc3339().to_string(), + src: "http".to_string(), + }) + .await; + + let mut ip1 = ctx.blocklist.get_mut(&"1.1.1.1".to_string()).unwrap(); + ip1.starttime = now - Duration::minutes(61); + + let mut ip2 = ctx.blocklist.get_mut(&"1.1.1.2".to_string()).unwrap(); + ip2.starttime = now - Duration::minutes(61); + ctx + } + + #[tokio::test] + pub async fn test_blocklist_pending() { + let ctx = prepare_test_data().await; + + let pending = ctx.get_blocklist_pending().await; + assert_eq!(pending.len(), 4); + for i in ["1.1.1.1", "1.1.1.2", "1.1.1.3", "1.1.1.4"] { + let ip = ctx + .blocklist + .get(&i.to_string()) + .unwrap() + .ipdata + .ip + .as_str(); + assert_eq!(ip, i); + } + } + + #[tokio::test] + pub async fn test_blocklist_toblock() { + let mut ctx = prepare_test_data().await; + let toblock = ctx.get_blocklist_toblock().await; + assert_eq!(toblock.len(), 2); + } + + #[tokio::test] + pub async fn test_blocklist_gc() { + let mut ctx = prepare_test_data().await; + let after_gc = ctx.gc_blocklist().await; + assert_eq!(after_gc.len(), 2); + for i in &["1.1.1.3", "1.1.1.4"] { + assert_eq!( + ctx.blocklist.get(&i.to_string()).unwrap().ipdata.ip, + i.to_string() + ); + } } } diff --git a/src/ip.rs b/src/ip.rs index 20914f3..a18f2dc 100644 --- a/src/ip.rs +++ b/src/ip.rs @@ -26,10 +26,12 @@ pub struct IpData { pub hostname: String, } -impl IpData { - pub fn parse_date(&self) -> DateTime { - DateTime::parse_from_rfc3339(self.date.as_str()).unwrap() - } +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct BlockIpData { + pub ipdata: IpData, + pub tryfail: i64, + pub blocktime: i64, + pub starttime: DateTime, } impl PartialEq for IpData { diff --git a/src/ipblc/inc.rs b/src/ipblc/inc.rs index 802d640..20a7685 100644 --- a/src/ipblc/inc.rs +++ b/src/ipblc/inc.rs @@ -69,7 +69,7 @@ pub async fn process(ctx: &Arc>) { // apply firewall blocking firewall::block( &env!("CARGO_PKG_NAME").to_string(), - &ctx.get_blocklist().await, + &ctx.get_blocklist_toblock().await, &mut ret, ) .unwrap(); @@ -104,7 +104,7 @@ async fn watchfiles(ctx: &Arc>) -> Receiver { for event in events { let date: DateTime = Local::now().trunc_subsecs(0); bltx.send(FileEvent { - ie: event, + inotifyevent: event, date: date, }) .await @@ -140,12 +140,12 @@ async fn compare_files_changes( let mut ctx = ctx.lock().await; trustnets = build_trustnets(&ctx.cfg.trustnets); - match modifiedfiles.ie.name { + match modifiedfiles.inotifyevent.name { Some(name) => { let inotify_filename = name.to_str().unwrap(); for sak in &mut ctx.clone().sas.keys() { let sa = &mut ctx.sas.get_mut(sak).unwrap(); - if modifiedfiles.ie.wd == sa.wd { + if modifiedfiles.inotifyevent.wd == sa.wd { let handle_filename: String; if sa.filename.as_str() == "" { handle_filename = format!("{}/{}", &sa.fullpath, inotify_filename); diff --git a/src/ipblc/mod.rs b/src/ipblc/mod.rs index 5ac6f6d..3c3a2d7 100644 --- a/src/ipblc/mod.rs +++ b/src/ipblc/mod.rs @@ -13,13 +13,13 @@ use tokio::sync::mpsc::Sender; use tokio::sync::Mutex; pub struct FileEvent { - pub ie: InotifyEvent, + pub inotifyevent: InotifyEvent, pub date: DateTime, } impl std::fmt::Debug for FileEvent { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{ie:?}", ie = self.ie) + write!(f, "{ie:?}", ie = self.inotifyevent) } } diff --git a/src/utils.rs b/src/utils.rs index 2b729a1..6ad9521 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -52,8 +52,7 @@ pub fn sleep(seconds: u64) { } pub fn gethostname(show_fqdn: bool) -> String { - let mut buf = [0u8; 64]; - let hostname_cstr = unistd::gethostname(&mut buf).expect("Failed getting hostname"); + let hostname_cstr = unistd::gethostname().expect("Failed getting hostname"); let fqdn = hostname_cstr .to_str() .expect("Hostname wasn't valid UTF-8") diff --git a/tests/test.py b/tests/testzmq.py similarity index 100% rename from tests/test.py rename to tests/testzmq.py