You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
4.0 KiB
124 lines
4.0 KiB
#!/bin/sh |
|
## |
|
## screen-multiuser -- easy screen(1) multi-user session management |
|
## Copyright (c) 2004-2009 Ralf S. Engelschall <rse@engelschall.com> |
|
## Licensed under General Public License (GPL) |
|
## |
|
|
|
# usage |
|
if [ $# -eq 0 ]; then |
|
echo "screen-multiuser:ERROR: invalid arguments" 1>&2 |
|
echo "screen-multiuser:USAGE: screen-multiuser master <session-name> [<servant-name> ...]" 1>&2 |
|
echo "screen-multiuser:USAGE: screen-multiuser servant <session-name> <master-name>" 1>&2 |
|
exit 1 |
|
fi |
|
|
|
# determine screen(1) and path to a temporary run-command script |
|
screenrc="$HOME/.screenrc-multiuser" |
|
screen="@l_prefix@/bin/screen" |
|
|
|
# dispatch run-time mode |
|
mode="$1" |
|
shift |
|
case "$mode" in |
|
master ) |
|
# run a new session as the session master |
|
if [ $# -lt 1 ]; then |
|
echo "screen-multiuser:ERROR: invalid arguments to mode \"master\"" 1>&2 |
|
echo "screen-multiuser:USAGE: $0 master <session-name> [<servant-name>[:<permission>] ...]" 1>&2 |
|
exit 1 |
|
fi |
|
session="$1"; shift |
|
master="${LOGNAME-${USERNAME-"unknown"}}" |
|
title="screen-multiuser:" |
|
title="${title} ${master}%?/%t%?" |
|
title="${title}%? %{= rW} %n %{-}%?" |
|
title="${title}%? [%u]%?" |
|
title="${title} %=%-w%{= rW}%50>%n %t%{-}%+w" |
|
( if [ -f $HOME/.screenrc ]; then |
|
echo "source \"$HOME/.screenrc\"" |
|
fi |
|
echo "escape ^Aa" |
|
echo "startup_message off" |
|
echo "vbell off" |
|
echo "defscrollback 10000" |
|
echo "defmonitor off" |
|
echo "msgminwait 1" |
|
echo "msgwait 1" |
|
echo "hardstatus alwayslastline \" $title \"" |
|
echo "multiuser on" |
|
echo "acladd $master" |
|
echo "aclchg $master +rwx \"#?\"" |
|
echo "aclumask ?+rwx" |
|
echo "aclumask ??+rwx" |
|
if [ $# -gt 0 ]; then |
|
for servant in "$@"; do |
|
permission="+rwx" |
|
if expr "$servant" : '.*:.*' >/dev/null; then |
|
permission=`expr "$servant" : '.*:\(.*\)'` |
|
servant=`expr "$servant" : '\(.*\):.*'` |
|
fi |
|
echo "acladd $servant" |
|
echo "aclchg $servant $permission \"#?\"" |
|
done |
|
else |
|
echo "password" |
|
fi |
|
) >$screenrc |
|
$screen -t "$session" -c $screenrc -S "$session" -d -R |
|
rm -f $screenrc >/dev/null 2>&1 || true |
|
;; |
|
servant ) |
|
# attach to an existing session as one session servant |
|
if [ $# -ne 2 ]; then |
|
echo "screen-multiuser:ERROR: invalid arguments to mode \"servant\"" 1>&2 |
|
echo "screen-multiuser:USAGE: $0 servant <session-name> <master-name>" 1>&2 |
|
exit 1 |
|
fi |
|
session="$1"; shift |
|
master="$1"; shift |
|
$screen -c $screenrc -r "$master/$session" -x |
|
;; |
|
* ) |
|
echo "screen-multiuser:ERROR: invalid mode \"$mode\"" 1>&2 |
|
echo "screen-multiuser:USAGE: $0 master <session-name> [<servant-name>[:<permission>] ...]" 1>&2 |
|
echo "screen-multiuser:USAGE: $0 servant <session-name> <master-name>" 1>&2 |
|
exit 1 |
|
;; |
|
esac |
|
|
|
exit 0 |
|
|
|
=pod |
|
|
|
=head1 NAME |
|
|
|
B<screen-multiuser> -- easy screen(1) multi-user session management |
|
|
|
=head1 SYNOPSIS |
|
|
|
B<screen-multiuser> B<master> I<session-name> [I<servant-name>[:I<permission>] ...] |
|
|
|
B<screen-multiuser> B<servant> I<session-name> I<master-name> |
|
|
|
=head1 DESCRIPTION |
|
|
|
B<screen-multiuser> is a tiny frontend to screen(1) for controlling |
|
multi-user sessions. The idea is that a session master is opening a |
|
screen(1) based multi-user session and one or multiple session servants |
|
then join it afterwards. |
|
|
|
=head1 EXAMPLE |
|
|
|
foo$ screen-multiuser master support bar:+rwx baz:+r |
|
bar$ screen-multiuser servant support foo |
|
baz$ screen-multiuser servant support foo |
|
|
|
=head1 AUTHOR |
|
|
|
Ralf S. Engelschall |
|
rse@engelschall.com |
|
www.engelschall.com |
|
|
|
=cut |
|
|
|
|