meta-google: console: Allow host console redirection

Originally written by William, upstreaming it from our downstream repo.

Signed-off-by: William A. Kennington III <wak@google.com>
Signed-off-by: Brandon Kim <brandonkim@google.com>
Change-Id: If23d97cb2505f45af089571d77a70a32a37d1ce8
diff --git a/meta-google/recipes-phosphor/console/obmc-console/host-console-filtered.sh b/meta-google/recipes-phosphor/console/obmc-console/host-console-filtered.sh
new file mode 100755
index 0000000..1b57966
--- /dev/null
+++ b/meta-google/recipes-phosphor/console/obmc-console/host-console-filtered.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+# Copyright 2022 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# obmc-console-client will immediately exit if we don't give it an stdin
+# that it can block on forever, so we hook it up to /dev/null since that never
+# feeds it data.
+# We only allow printable characters we know to be good. This set is
+# currently newline + all printable ASCII chars (space through hyphen).
+obmc-console-client < <(tail -f /dev/null) | tr -cd '\12\40-\176'
diff --git a/meta-google/recipes-phosphor/console/obmc-console/host-console-journal.service.in b/meta-google/recipes-phosphor/console/obmc-console/host-console-journal.service.in
new file mode 100644
index 0000000..99d527b
--- /dev/null
+++ b/meta-google/recipes-phosphor/console/obmc-console/host-console-journal.service.in
@@ -0,0 +1,11 @@
+[Unit]
+Requires=obmc-console@@HOST_TTY@.service
+After=obmc-console@@HOST_TTY@.service
+
+[Service]
+Type=simple
+SyslogIdentifier=host-console
+ExecStart=/usr/bin/host-console-filtered.sh
+
+[Install]
+WantedBy=multi-user.target
diff --git a/meta-google/recipes-phosphor/console/obmc-console/serial-to-bmc@.service b/meta-google/recipes-phosphor/console/obmc-console/serial-to-bmc@.service
new file mode 100644
index 0000000..f8c55b3
--- /dev/null
+++ b/meta-google/recipes-phosphor/console/obmc-console/serial-to-bmc@.service
@@ -0,0 +1,22 @@
+[Unit]
+Description=BMC Serial Getty on %I
+BindsTo=dev-%i.device
+After=dev-%i.device systemd-user-sessions.service
+After=rc-local.service
+Before=getty.target
+IgnoreOnIsolate=yes
+
+Conflicts=serial-to-host@%i.service
+StartLimitIntervalSec=0
+
+[Service]
+Type=simple
+Restart=no
+RestartSec=0
+ExecStart=-/sbin/agetty -8 -n -o '-f root' -i -N -R -L %I 115200 xterm
+ExecStopPost=-/bin/sh -c 'systemctl start --no-block serial-to-host@%i'
+UtmpIdentifier=%I
+TTYPath=/dev/%I
+KillMode=process
+IgnoreSIGPIPE=no
+SendSIGHUP=yes
diff --git a/meta-google/recipes-phosphor/console/obmc-console/serial-to-host@.service.in b/meta-google/recipes-phosphor/console/obmc-console/serial-to-host@.service.in
new file mode 100644
index 0000000..c38b720
--- /dev/null
+++ b/meta-google/recipes-phosphor/console/obmc-console/serial-to-host@.service.in
@@ -0,0 +1,29 @@
+[Unit]
+Description=Host Serial Getty on %I
+BindsTo=dev-%i.device
+After=dev-%i.device systemd-user-sessions.service
+After=rc-local.service
+Before=getty.target
+IgnoreOnIsolate=yes
+
+Requires=obmc-console@@HOST_TTY@.service
+After=obmc-console@@HOST_TTY@.service
+Conflicts=serial-to-bmc@%i.service
+StartLimitIntervalSec=0
+
+[Service]
+Type=simple
+Restart=always
+RestartSec=0
+RestartPreventExitStatus=2
+SuccessExitStatus=2
+ExecStart=-/sbin/agetty -8 -n -l /usr/bin/obmc-console-client -o '-e a00pae9n2B9m1c' -i -N -R -L %I 115200 xterm
+ExecStopPost=-/bin/sh -c '(( EXIT_STATUS == 2 )) && systemctl start --no-block serial-to-bmc@%i'
+UtmpIdentifier=%I
+TTYPath=/dev/%I
+KillMode=process
+IgnoreSIGPIPE=no
+SendSIGHUP=yes
+
+[Install]
+WantedBy=getty.target
diff --git a/meta-google/recipes-phosphor/console/obmc-console_%.bbappend b/meta-google/recipes-phosphor/console/obmc-console_%.bbappend
new file mode 100644
index 0000000..d53eaaa
--- /dev/null
+++ b/meta-google/recipes-phosphor/console/obmc-console_%.bbappend
@@ -0,0 +1,44 @@
+FILESEXTRAPATHS:prepend:gbmc := "${THISDIR}/${PN}:"
+
+SRC_URI:append:gbmc = " \
+  file://serial-to-bmc@.service \
+  file://serial-to-host@.service.in \
+  file://host-console-journal.service.in \
+  file://host-console-filtered.sh \
+  "
+
+SYSTEMD_SERVICE:${PN}:append:gbmc = " serial-to-bmc@.service"
+SYSTEMD_SERVICE:${PN}:append:gbmc= " serial-to-host@.service"
+
+OBMC_CONSOLE_FRONT_TTY ?= ""
+
+RDEPENDS:${PN}:append:gbmc = " bash"
+
+FILES:${PN}:append:gbmc = " ${systemd_system_unitdir}/host-console-journal.service"
+
+do_install:append:gbmc() {
+  install -d ${D}${systemd_system_unitdir}
+  install -m 0644 ${WORKDIR}/serial-to-bmc@.service \
+    ${D}${systemd_system_unitdir}
+
+  sed "s,@HOST_TTY@,${OBMC_CONSOLE_HOST_TTY}," \
+    ${WORKDIR}/serial-to-host@.service.in \
+    >${D}${systemd_system_unitdir}/serial-to-host@.service
+
+  sed 's,@HOST_TTY@,${OBMC_CONSOLE_HOST_TTY},' \
+    ${WORKDIR}/host-console-journal.service.in \
+    >${D}${systemd_system_unitdir}/host-console-journal.service
+
+  install -d ${D}${bindir}
+  install -m0755 ${WORKDIR}/host-console-filtered.sh ${D}${bindir}/
+}
+
+pkg_postinst:${PN}:append:gbmc () {
+  if [ -n "${OBMC_CONSOLE_FRONT_TTY}" ]; then
+    systemctl --root=$D enable serial-to-host@${OBMC_CONSOLE_FRONT_TTY}.service
+  fi
+}
+
+pkg_postinst:${PN}:append:gbmc:dev () {
+  systemctl --root=$D enable host-console-journal.service
+}