grml-screen: fix for screen race-conditions on boot [Closes: issue921]
[grml-scripts.git] / usr_bin / grml-screen
1 #!/bin/dash
2 # Filename:      grml-screen
3 # Purpose:       wrapper for screen to start with appropriate configuration
4 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
5 # Bug-Reports:   see http://grml.org/bugs/
6 # License:       This file is licensed under the GPL v2.
7 ################################################################################
8
9 # export variable USER for use withing GNU screen:
10   export USER=`id -un`
11
12 # fix tty permissions
13   TTY=`tty`
14   sudo chmod 660       $TTY
15   sudo chown $USER.tty $TTY
16
17 # FIXME: fix for screen race-conditions
18 PID_FILE_="/var/run/grml-screen"
19 MY_PID_="$$"
20 if [ ! -d "/var/run/screen/S-$USER" ]; then
21     # no /var/run/screen/S-$USER and possible no /var/run/screen either -> locking
22     for i in `seq 40`; do   # 40*0.25 = 10 seconds
23         if lockfile-create --retry 0 $PID_FILE_; then
24             echo $MY_PID_ >$PID_FILE_
25             break
26         fi
27         sleep 0.25
28     done
29 fi
30 if [ -f $PID_FILE_ ]; then
31     # FORK BEGIN
32     (
33     for i in `seq 40`; do   # 40*0.25 = 10 seconds
34         if [ ! -d "/var/run/screen/S-$USER" ]; then
35             sleep 0.25  # educated guess
36         else
37             break
38         fi
39     done
40     if [ `cat $PID_FILE_` = $MY_PID_ ]; then
41         rm $PID_FILE_
42         lockfile-remove $PID_FILE_
43     fi
44     )&
45     # FORK END
46 else
47     SLEEP_TIME_="$(( $$ % 5 * 5 + 5 ))"
48     echo "grml-screen: Error could not create lockfile! (sleeping for $SLEEP_TIME_)"
49     sleep $SLEEP_TIME_
50 fi
51
52 # now run screen with config
53   cd $HOME     # important for e.g. hardcopy-feature
54   # do we have a utf8 enabled terminal?
55   [ -x /usr/bin/vt-is-UTF8 ] && /usr/bin/vt-is-UTF8 -q && UTF='-U'
56   if [ `id -u` = 0 ] ; then
57     exec screen $UTF -c /etc/grml/screenrc
58   elif [ -r "$HOME/.screenrc" ] ; then
59     exec screen $UTF -c "$HOME/.screenrc"
60   else
61     exec screen $UTF -c /etc/grml/screenrc_grml
62   fi
63
64 ## END OF FILE #################################################################