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
--- /dev/null
+[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
--- /dev/null
+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");
+}