mrrl-logincaps

MRRL version of logincaps
git clone https://ccx.te2000.cz/git/mrrl-logincaps
Log | Files | Refs

commit 137140ca4e9eb11c9ff821e2d22828fe3fcef489
parent 4c3d6d043f7abc2f9593e647f357199badc2668b
Author: Jan Pobrislo <ccx@te2000.cz>
Date:   Tue, 15 Apr 2025 00:06:26 +0000

add login.capability.app-terminal

Diffstat:
Asbin/login.capability.app-terminal | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msbin/logincaps | 2++
2 files changed, 101 insertions(+), 0 deletions(-)

diff --git a/sbin/login.capability.app-terminal b/sbin/login.capability.app-terminal @@ -0,0 +1,99 @@ +#!/bin/zsh +setopt no_unset extended_glob warn_create_global + +exit 101 # TODO + +die_n() { + exitcode=$1 + shift + printf >&2 '%s\n' "$@" + exit $exitcode +} + +die100() { + die_n 100 "$@" +} + +die111() { + die_n 111 "$@" +} + +launch-urxvt() { + local container cmd exec_sock urxvt_sock + container=$1 + cmd=$2 + exec_sock=/run/containers/$container/run/exec/exec + urxvt_sock=/run/containers/xsession.$X.$USER/run/exec/urxvt + + [[ -S $exec_sock ]] || + die111 "Socket for exec not present: ${(qqq)exec_sock}" + + [[ -S $urxvt_sock ]] || + die111 "Socket for urxvt not present: ${(qqq)urxvt_sock}" + + local -a el_env=( + EXEC_SOCK=$exec_sock + URXVT_SOCK=$urxvt_sock + TERM_NAME=${container//./:} + ) + local -a el_cmd=( + 'multisubstitute {' + ' importas -i -u EXEC_SOCK EXEC_SOCK' + ' importas -i -u URXVT_SOCK URXVT_SOCK' + ' importas -i -u TERM_NAME TERM_NAME' + '}' + '/mnt/ns/bin/socketpair 3 1' + 'background -d {' + ' fdclose 3' + ' s6-sudo $EXEC_SOCK' + ' /mnt/ns/bin/spawn-pty rxvt-unicode-256color {' + " $cmd" + ' } /mnt/ns/bin/fdsend 1 0 true' + '}' + 'fdmove -c 1 2' + '/mnt/ns/bin/fdrecvto 3 0' + 'fdclose 3' + 'backtick -E PTS_NAME { /mnt/ns/bin/ptsname 0 }' + 's6-sudo $URXVT_SOCK ${TERM_NAME}:${PTS_NAME}' + ) + exec env $el_env execlineb -c "${(F)el_cmd}" +} + +check_command() { + local arg + local -a run quoted + typeset -g container + + case $1 in + (tinc:ccx) + container=tinc.tinc + run=( tinc -n ccx ) + ;; + (wpa_cli) + container=wpa_supplicant.wpa_supplicant + run=( wpa_cli ) + ;; + (networking) + container=networking.networking + run=( zsh -li ) + ;; + (*) die100 "app not permitted: ${(qqq)1}";; + esac + + for arg in "$@"; do + quoted+=( "$(s6-quote -- "$arg")" ) + done + + typeset -g quoted_cmd + quoted_cmd="${(j: :)quoted}" +} + +main() { + [[ $# == 1 ]] || die100 "usage: ${0:t} app" + check_command $1 + launch-urxvt $container $quoted_cmd +} +typeset -f -t main + +main "$@" +# vim: ft=zsh noet ts=4 sts=4 sw=4 diff --git a/sbin/logincaps b/sbin/logincaps @@ -129,11 +129,13 @@ main() { (*) printf 'ECMD\n';; esac done + stop_x } if [[ $LOGIN_TTY == /dev/tty[1-4] ]]; then typeset -g X X=$[ ${LOGIN_TTY#/dev/tty} + 4 ] + export X fi main