Skip to content

Commit d628692

Browse files
Merge pull request containers#51 from baude/systemd_socket_activation
systemd socket activation
2 parents cc11789 + 9d19ed9 commit d628692

File tree

6 files changed

+50
-15
lines changed

6 files changed

+50
-15
lines changed

.cirrus.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ env:
1919
NETAVARK_URL: "https://api.cirrus-ci.com/v1/artifact/github/containers/netavark-dhcp-proxy/success/binary.zip?branch=${NETAVARK_BRANCH}"
2020
# Save a little typing (path relative to $CIRRUS_WORKING_DIR)
2121
SCRIPT_BASE: "./contrib/cirrus"
22-
IMAGE_SUFFIX: "c6535313974624256"
22+
IMAGE_SUFFIX: "c6300530360713216"
2323
FEDORA_NETAVARK_IMAGE: "fedora-netavark-${IMAGE_SUFFIX}"
2424

2525

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[Unit]
2+
Description=Netavark DHCP proxy service
3+
Requires=netavark-dhcp-proxy.socket
4+
After=netavark-dhcp-proxy.socket
5+
StartLimitIntervalSec=0
6+
7+
[Service]
8+
Type=exec
9+
ExecStart=/usr/libexec/podman/netavark-proxy -a 30
10+
11+
[Install]
12+
WantedBy=default.target
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[Unit]
2+
Description=Netavark DHCP proxy socket
3+
4+
[Socket]
5+
ListenStream=%t/podman/nv-proxy.sock
6+
SocketMode=0660
7+
8+
[Install]
9+
WantedBy=sockets.target

hack/get_ci_vm.sh

+1-3
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,7 @@ elif [[ "$1" == "--setup" ]]; then
6060
echo "+ Loading ./contrib/cirrus/lib.sh" > /dev/stderr
6161
source ./contrib/cirrus/lib.sh
6262
echo "+ Mimicking .cirrus.yml build_task" > /dev/stderr
63-
make install.tools
64-
make binaries
65-
make docs
63+
make all
6664
echo "+ Running environment setup" > /dev/stderr
6765
./contrib/cirrus/setup_environment.sh
6866
else

src/cache.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ mod cache_tests {
237237
let buff = Cursor::new(Vec::new());
238238
let cache = match LeaseCache::new(buff) {
239239
Ok(cache) => cache,
240-
Err(e) => panic!("Could not create leases cache: {:?}", e),
240+
Err(e) => panic!("Could not create leases cache: {e:?}"),
241241
};
242242

243243
// Create a random amount of randomized leases
@@ -275,7 +275,7 @@ mod cache_tests {
275275
let lease_bytes = cache.writer.get_ref().as_slice();
276276
let s: HashMap<String, Vec<NetavarkLease>> = match serde_json::from_slice(lease_bytes) {
277277
Ok(s) => s,
278-
Err(e) => panic!("Error: {:?}", e),
278+
Err(e) => panic!("Error: {e:?}"),
279279
};
280280

281281
// Get the mac address of the lease
@@ -318,7 +318,7 @@ mod cache_tests {
318318
let lease_bytes = cache.writer.get_ref().as_slice();
319319
let s: HashMap<String, Vec<NetavarkLease>> = match serde_json::from_slice(lease_bytes) {
320320
Ok(s) => s,
321-
Err(e) => panic!("Error: {:?}", e),
321+
Err(e) => panic!("Error: {e:?}"),
322322
};
323323

324324
// Get the mac address of the lease
@@ -343,7 +343,7 @@ mod cache_tests {
343343
let lease_bytes = cache.writer.get_ref().as_slice();
344344
let s: HashMap<String, Vec<NetavarkLease>> = match serde_json::from_slice(lease_bytes) {
345345
Ok(s) => s,
346-
Err(e) => panic!("Error: {:?}", e),
346+
Err(e) => panic!("Error: {e:?}"),
347347
};
348348

349349
let macaddr = macaddrs
@@ -359,7 +359,7 @@ mod cache_tests {
359359

360360
let removed_lease = cache
361361
.remove_lease(macaddr)
362-
.unwrap_or_else(|_| panic!("Could not remove {:?} from leases", macaddr));
362+
.unwrap_or_else(|_| panic!("Could not remove {macaddr:?} from leases"));
363363
// Assure the lease is no longer in memory
364364
assert_eq!(deserialized_lease, removed_lease);
365365
assert_eq!(s.len(), (range - i) as usize);
@@ -368,7 +368,7 @@ mod cache_tests {
368368
let lease_bytes = cache.writer.get_ref().as_slice();
369369
let s: HashMap<String, Vec<NetavarkLease>> = match serde_json::from_slice(lease_bytes) {
370370
Ok(s) => s,
371-
Err(e) => panic!("Error: {:?}", e),
371+
Err(e) => panic!("Error: {e:?}"),
372372
};
373373
// There should be no lease under that mac address if the lease was removed
374374
let no_lease = s.get(macaddr);
@@ -405,7 +405,7 @@ mod cache_tests {
405405
let lease_bytes = cache.writer.get_ref().as_slice();
406406
let s: HashMap<String, Vec<NetavarkLease>> = match serde_json::from_slice(lease_bytes) {
407407
Ok(s) => s,
408-
Err(e) => panic!("Error: {:?}", e),
408+
Err(e) => panic!("Error: {e:?}"),
409409
};
410410

411411
// Get the mac address of the lease
@@ -443,7 +443,7 @@ mod cache_tests {
443443
let lease_bytes = cache.writer.get_ref().as_slice();
444444
let s: HashMap<String, Vec<NetavarkLease>> = match serde_json::from_slice(lease_bytes) {
445445
Ok(s) => s,
446-
Err(e) => panic!("Error: {:?}", e),
446+
Err(e) => panic!("Error: {e:?}"),
447447
};
448448
// There should be no lease under that mac address if the lease was removed
449449
let deserialized_updated_lease = s

src/server.rs

+19-3
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ use netavark_proxy::ip;
1010
use netavark_proxy::proxy_conf::{
1111
get_cache_fqname, get_proxy_sock_fqname, DEFAULT_INACTIVITY_TIMEOUT, DEFAULT_TIMEOUT,
1212
};
13-
use std::fs;
1413
use std::fs::File;
1514
use std::io::Write;
15+
use std::os::unix::io::FromRawFd;
16+
use std::os::unix::net::UnixListener as stdUnixListener;
1617
use std::path::{Path, PathBuf};
1718
use std::str::FromStr;
1819
use std::sync::{Arc, Mutex};
20+
use std::{env, fs};
1921
#[cfg(unix)]
2022
use tokio::net::UnixListener;
2123
#[cfg(unix)]
@@ -237,8 +239,22 @@ pub async fn main() -> Result<(), Box<dyn std::error::Error>> {
237239
// Watch for signals after the uds path has been created, so that the socket can be closed.
238240
handle_signal(uds_path.clone()).await;
239241

240-
// Bind to the UDS socket for gRPC calls
241-
let uds = UnixListener::bind(&uds_path)?;
242+
// check if the UDS is a systemd socket activated service. if it is,
243+
// then systemd hands this over to us on FD 3.
244+
let uds: UnixListener = match env::var("LISTEN_FDS") {
245+
Ok(effds) => {
246+
if effds != "1" {
247+
error!("Received more than one FD from systemd");
248+
return Ok(());
249+
}
250+
let systemd_socket = unsafe { stdUnixListener::from_raw_fd(3) };
251+
systemd_socket.set_nonblocking(true)?;
252+
UnixListener::from_std(systemd_socket)?
253+
}
254+
// Use the standard socket approach
255+
Err(..) => UnixListener::bind(&uds_path)?,
256+
};
257+
242258
let uds_stream = UnixListenerStream::new(uds);
243259

244260
// Create the cache file

0 commit comments

Comments
 (0)