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 <t.lamprecht@proxmox.com>
This commit is contained in:
Thomas Lamprecht 2020-02-06 22:08:07 +01:00
parent ba050e3788
commit 274b0c7bb7
5 changed files with 72 additions and 3 deletions

View File

@ -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 := \

View File

@ -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

View File

@ -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:

15
etc/pbsbanner.service Normal file
View File

@ -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

48
src/bin/pbsbanner.rs Normal file
View File

@ -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");
}