osi-tools/Documentation/module-examples/openrc-osi-shell.sh

36 lines
1.2 KiB
Bash
Raw Permalink Normal View History

#!/hint/bash -euE
# Copyright (C) 2018 Luke Shumaker
# SPDX-License-Identifier: AGPL-3.0-or-later
post_install+=(10:openrc-osi-shell:post_install)
openrc-osi-shell:post_install() {
local arg_mountpoint=$1
install -Dm755 /dev/stdin "${arg_mountpoint}/etc/osi-shell" <<-'EOT'
#!/bin/sh
# We can't use login(1) because it masks the exit status of the shell,
# but we want this to be a real local login with PAM, so use su(1),
# but trick in in to using login(1)'s PAM config. We undo this trick by
# using nsenter(1) to reset the mount namespace after we've done the PAM stuff.
# This hardcodes the shell as /bin/bash, which is the default for root.
unshare --mount -- sh -c 'mount --bind /etc/pam.d/login /etc/pam.d/su && exec -- su -c "exec nsenter --mount --target=1 -- setsid bash -l"' <>/dev/ttyS0 >&0 2>&0
echo $? >/dev/ttyS1
openrc-shutdown --poweroff
sleep infinity
EOT
install -Dm755 /dev/stdin "${arg_mountpoint}/etc/init.d/osi-shell" <<-'EOT'
#!/usr/bin/openrc-run
description="osi-shell service"
supervisor=supervise-daemon
command=/etc/osi-shell
pidfile="/run/${RC_SVCNAME}.pid"
depend() {
after network-online
}
EOT
arch-chroot -- "$arg_mountpoint" rc-update add osi-shell default
}