From 274b0c7bb7f02340b9bf3d645c6ec881ab44dddd Mon Sep 17 00:00:00 2001 From: Thomas Lamprecht Date: Thu, 6 Feb 2020 22:08:07 +0100 Subject: [PATCH] add login banner service Modeled after the one from PVE, but using rust instead of perl for resolving the nodename and writing to /etc/issue Behavior differs a bit. We write all non-loopback addresses to this file, as the gui accepts connections from them all, so limiting it to the first one is not really sensible. Further an error to resolve, or only getting loopback addresses won't write out an empty /etc/issue file, but a note about the error at the place where the address would be displayed. Named it "pbsbanner", not "proxmox-backup-banner" as it's rather an internal tool anyway and mirrors pvebanner, pmgbanner Signed-off-by: Thomas Lamprecht --- Makefile | 3 +- debian/proxmox-backup-server.install | 2 ++ etc/Makefile | 7 ++-- etc/pbsbanner.service | 15 +++++++++ src/bin/pbsbanner.rs | 48 ++++++++++++++++++++++++++++ 5 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 etc/pbsbanner.service create mode 100644 src/bin/pbsbanner.rs diff --git a/Makefile b/Makefile index 537d34f7..1d6a34f9 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,8 @@ USR_BIN := \ pxar # Binaries usable by admins -USR_SBIN := proxmox-backup-manager +USR_SBIN := proxmox-backup-manager \ + pbsbanner # Binaries for services: SERVICE_BIN := \ diff --git a/debian/proxmox-backup-server.install b/debian/proxmox-backup-server.install index 1db15f42..f5a94f51 100644 --- a/debian/proxmox-backup-server.install +++ b/debian/proxmox-backup-server.install @@ -1,8 +1,10 @@ etc/proxmox-backup-proxy.service /lib/systemd/system/ etc/proxmox-backup.service /lib/systemd/system/ +etc/pbsbanner.service /lib/systemd/system/ usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-api usr/lib/x86_64-linux-gnu/proxmox-backup/proxmox-backup-proxy usr/sbin/proxmox-backup-manager +usr/sbin/pbsbanner usr/share/javascript/proxmox-backup/css/ext6-pbs.css usr/share/javascript/proxmox-backup/images/logo-128.png usr/share/javascript/proxmox-backup/images/proxmox_logo.png diff --git a/etc/Makefile b/etc/Makefile index da1f083b..93d0c731 100644 --- a/etc/Makefile +++ b/etc/Makefile @@ -1,13 +1,16 @@ include ../defines.mk UNITS := \ + pbsbanner.service \ + +DYNAMIC_UNITS := \ proxmox-backup.service \ proxmox-backup-proxy.service -all: $(UNITS) +all: $(UNITS) $(DYNAMIC_UNITS) clean: - rm -f $(UNITS) + rm -f $(DYNAMIC_UNITS) .SUFFIXES: .service.in .service .service.in.service: diff --git a/etc/pbsbanner.service b/etc/pbsbanner.service new file mode 100644 index 00000000..c2849560 --- /dev/null +++ b/etc/pbsbanner.service @@ -0,0 +1,15 @@ +[Unit] +Description=Proxmox Backup Server Login Banner +ConditionPathExists=/usr/sbin/pbsbanner +ConditionPathExists=!/usr/bin/pvebanner +DefaultDependencies=no +After=local-fs.target +Before=console-getty.service + +[Service] +ExecStart=/usr/sbin/pbsbanner +Type=oneshot +RemainAfterExit=yes + +[Install] +WantedBy=getty.target diff --git a/src/bin/pbsbanner.rs b/src/bin/pbsbanner.rs new file mode 100644 index 00000000..927f68ac --- /dev/null +++ b/src/bin/pbsbanner.rs @@ -0,0 +1,48 @@ +use std::fmt::Write; +use std::fs; +use std::net::ToSocketAddrs; + +use proxmox::tools; + +fn main() { + let nodename = tools::nodename(); + let addr = format!("{}:8007", nodename); + + let mut banner = format!(" +{:-<78} + +Welcome to the Proxmox Backup Server. Please use your web browser to +configure this server - connect to: + +", + "" + ); + + if let Ok(saddrs) = addr.to_socket_addrs() { + let saddrs: Vec<_> = saddrs + .filter_map(|s| match !s.ip().is_loopback() { + true => Some(format!(" https://{}/", s)), + false => None, + }) + .collect(); + + if !saddrs.is_empty() { + writeln!(&mut banner, "{}", saddrs.join("\n")).unwrap(); + } else { + writeln!( + &mut banner, + "hostname '{}' does not resolves to any non-loopback address", + nodename + ) + .unwrap(); + } + } else { + writeln!(&mut banner, "could not resolve hostname '{}'", nodename).unwrap(); + } + + // unwrap will never fail for write!: + // https://github.com/rust-lang/rust/blob/1.39.0/src/liballoc/string.rs#L2318-L2331 + write!(&mut banner, "\n{:-<78}\n\n", "").unwrap(); + + fs::write("/etc/issue", banner.as_bytes()).expect("Unable to write banner to issue file"); +} -- 2.39.5