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