Add listener closing when the target set has changed.
All checks were successful
CI / build (push) Successful in 22m46s
All checks were successful
CI / build (push) Successful in 22m46s
This commit is contained in:
parent
c90a8fff4a
commit
41d10c5c94
1
.earthlyignore
Normal file
1
.earthlyignore
Normal file
@ -0,0 +1 @@
|
||||
target/
|
9
.github/workflows/ci.yml
vendored
9
.github/workflows/ci.yml
vendored
@ -4,7 +4,6 @@ name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
branches: [main]
|
||||
|
||||
@ -12,11 +11,11 @@ jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
|
||||
DOCKER_TOKEN: ${{ secrets.DOCKER_TOKEN }}
|
||||
MY_DOCKER_USERNAME: ${{ secrets.MY_DOCKER_USERNAME }}
|
||||
MY_DOCKER_PASSWORD: ${{ secrets.MY_DOCKER_PASSWORD }}
|
||||
FORCE_COLOR: 1
|
||||
steps:
|
||||
- uses: earthly/actions/setup-earthly@v1
|
||||
- uses: https://github.com/earthly/actions-setup@v1
|
||||
with:
|
||||
version: v0.7.0
|
||||
- uses: actions/checkout@v2
|
||||
@ -30,7 +29,7 @@ jobs:
|
||||
fi
|
||||
git checkout -b "$branch" || true
|
||||
- name: Docker Login
|
||||
run: docker login docker.hibas123.de --username "$DOCKER_USERNAME" --password "$DOCKER_TOKEN"
|
||||
run: docker login git.hibas.dev --username "$MY_DOCKER_USERNAME" --password "$MY_DOCKER_PASSWORD"
|
||||
- name: Earthly version
|
||||
run: earthly --version
|
||||
- name: Run build
|
||||
|
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -838,7 +838,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustocat"
|
||||
version = "0.1.10"
|
||||
version = "0.1.12"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"chrono",
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "rustocat"
|
||||
version = "0.1.11"
|
||||
version = "0.1.12"
|
||||
edition = "2021"
|
||||
description = "Socat in rust with many less features and a configuration file"
|
||||
license = "ISC"
|
||||
|
26
Dockerfile
26
Dockerfile
@ -1,26 +0,0 @@
|
||||
FROM rust:alpine as builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
RUN apk add --no-cache musl-dev libssl3 openssl-dev
|
||||
|
||||
# This should fetch the index and cache it. This should reduce the time required of subsequent builds
|
||||
RUN cargo search test
|
||||
|
||||
COPY Cargo.toml Cargo.lock /app/
|
||||
# COPY .cargo /app/.cargo
|
||||
|
||||
COPY src /app/src
|
||||
|
||||
|
||||
RUN cargo build --release
|
||||
|
||||
FROM alpine
|
||||
|
||||
RUN apk add --no-cache libssl3
|
||||
COPY --from=builder /app/target/release/rustocat /usr/bin/rustocat
|
||||
|
||||
ENTRYPOINT ["/bin/sh"]
|
||||
CMD [ "-c", "/usr/bin/rustocat" ]
|
||||
|
||||
|
@ -19,7 +19,7 @@ docker:
|
||||
FROM alpine
|
||||
RUN apk add --no-cache libssl3
|
||||
COPY +build/rustocat rustocat
|
||||
ENTRYPOINT ["rustocat"]
|
||||
ENTRYPOINT ["./rustocat"]
|
||||
ARG EARTHLY_TARGET_TAG
|
||||
ARG TAG=$EARTHLY_TARGET_TAG
|
||||
SAVE IMAGE --push docker.hibas123.de/rustocat:$TAG
|
||||
SAVE IMAGE --push git.hibas.dev/hibas123/rustocat:$TAG
|
@ -1,9 +1,11 @@
|
||||
use crate::shutdown::ShutdownReceiver;
|
||||
use std::sync::Arc;
|
||||
use tokio::sync::broadcast;
|
||||
use tokio::sync::RwLock;
|
||||
|
||||
pub(crate) struct Listener {
|
||||
pub(crate) shutdown: ShutdownReceiver,
|
||||
pub(crate) source: String,
|
||||
pub(crate) targets: Arc<RwLock<Vec<String>>>,
|
||||
pub(crate) targets_changed: broadcast::Receiver<()>,
|
||||
}
|
||||
|
@ -20,6 +20,7 @@ pub type Result<T> = std::result::Result<T, Box<dyn Error>>;
|
||||
struct ActiveListener {
|
||||
notify_shutdown: broadcast::Sender<()>,
|
||||
targets: Arc<RwLock<Vec<String>>>,
|
||||
notify_targets: broadcast::Sender<()>,
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
@ -119,19 +120,24 @@ async fn run_loop(
|
||||
warn!("Found invalid targets! Adjusting!");
|
||||
let mut w = listener.targets.write().await;
|
||||
*w = target.targets;
|
||||
|
||||
_ = listener.notify_targets.send(())?; //TODO: Maybe ignore this error
|
||||
}
|
||||
} else {
|
||||
let (notify_shutdown, _) = broadcast::channel(1);
|
||||
let (notify_targets, _) = broadcast::channel(1);
|
||||
|
||||
let listener = ActiveListener {
|
||||
notify_shutdown: notify_shutdown,
|
||||
targets: Arc::new(RwLock::new(target.targets)),
|
||||
notify_targets: notify_targets,
|
||||
};
|
||||
|
||||
let l = listener::Listener {
|
||||
shutdown: shutdown::ShutdownReceiver::new(listener.notify_shutdown.subscribe()),
|
||||
source: target.source.clone(),
|
||||
targets: listener.targets.clone(),
|
||||
targets_changed: listener.notify_targets.subscribe(),
|
||||
};
|
||||
|
||||
tokio::spawn(async move {
|
||||
@ -168,6 +174,8 @@ async fn run_loop(
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Maybe Wait for the listener to shut down
|
||||
|
||||
debug!("Removing listener!");
|
||||
listeners.remove(&del_key);
|
||||
}
|
||||
|
@ -29,6 +29,10 @@ pub(crate) async fn start_tcp_listener(
|
||||
loop {
|
||||
let (next_socket, _) = tokio::select! {
|
||||
res = listener.accept() => res?,
|
||||
_ = listener_config.targets_changed.recv() => {
|
||||
info!("Targets changed!");
|
||||
continue;
|
||||
}
|
||||
_ = listener_config.shutdown.recv() => {
|
||||
info!("Exiting listener!");
|
||||
return Ok(());
|
||||
|
11
src/udp.rs
11
src/udp.rs
@ -180,6 +180,15 @@ pub(crate) async fn start_udp_listener(mut listener_config: Listener) -> Result<
|
||||
trace!("Waiting for packet or shutdown");
|
||||
let (num_bytes, src_addr) = tokio::select! {
|
||||
res = listener.recv_from(&mut buf) => res?,
|
||||
_ = listener_config.targets_changed.recv() => {
|
||||
info!("Targets changed!");
|
||||
info!("Closing all connections!");
|
||||
for (_, handler) in connections.lock().await.iter_mut() {
|
||||
handler.close().await;
|
||||
}
|
||||
info!("Closed all connections!");
|
||||
continue;
|
||||
}
|
||||
_ = listener_config.shutdown.recv() => {
|
||||
info!("Exiting listener!");
|
||||
break;
|
||||
@ -220,5 +229,7 @@ pub(crate) async fn start_udp_listener(mut listener_config: Listener) -> Result<
|
||||
handler.close().await;
|
||||
}
|
||||
|
||||
println!("Listener closed.");
|
||||
|
||||
return Ok(());
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user