#!/bin/sh -e # # byobu - wrapper script # Copyright (C) 2008-2009 Canonical Ltd. # Copyright (C) 2008-2014 Dustin Kirkland # # Authors: Dustin Kirkland # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, version 3 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . VERSION=5.3 PKG="byobu" # All sorts of things go wrong if you don't own your $HOME dir. # This happens under sudo, if you don't use the -H option; Byobu will # create a bunch of files in your $HOME which will be owned by root. if [ ! -O "$HOME" ]; then echo "Cannot run $PKG because [$USER] does not own [$HOME]" 1>&2 if [ -n "$SUDO_USER" ]; then echo "To run $PKG under sudo, you MUST use 'sudo -H'" 1>&2 fi exit 1 fi # Source local byobu config if [ -r "$HOME/.config/byoburc" ]; then # Ensure that this configuration is usable . "$HOME/.config/byoburc" || mv -f "$HOME/.config/byoburc" "$HOME/.config/byoburc".orig fi if [ -z "${BYOBU_PREFIX}" ]; then # Find and export the installation location prefix greadlink -f . >/dev/null 2>&1 && export BYOBU_READLINK="greadlink" || export BYOBU_READLINK="readlink" prefix="$(dirname $(dirname $($BYOBU_READLINK -f $0)))" if [ "$prefix" != "/usr" ]; then echo "export BYOBU_PREFIX='$prefix'" >> "$HOME/.config/byoburc" . "$HOME/.config/byoburc" fi fi export BYOBU_CHARMAP=$(locale charmap) [ -r "$HOME/.config/byoburc" ] && . "$HOME/.config/byoburc" [ -z "${BYOBU_PREFIX}" ] && export BYOBU_PREFIX="/usr" || export BYOBU_PREFIX . "${BYOBU_PREFIX}/lib/${PKG}/include/common" # Override backend if we can determine intentions from argv[0] [ -r "$HOME/.$PKG/backend" ] && . "$HOME/.$PKG/backend" case "$0" in *byobu-screen) BYOBU_BACKEND="screen" ;; *byobu-tmux) BYOBU_BACKEND="tmux" ;; esac # At this point, we're sure BYOBU_BACKEND is properly defined export BYOBU_BACKEND # Store the parent tty if eval $BYOBU_TEST tty >/dev/null 2>&1; then export BYOBU_TTY=$(tty) else export BYOBU_TTY=$(readlink /proc/$$/fd/0) fi # Get the default window name [ -n "$BYOBU_WINDOW_NAME" ] || BYOBU_WINDOW_NAME=- # Add a version argument for debugging purposes, enter manpage for help if [ "$#" = "1" ]; then case "$1" in -v|--version) echo "$PKG version $VERSION" if eval $BYOBU_TEST bash >/dev/null 2>&1; then # Check ulimits u=$(bash -c "ulimit -n") [ "$u" = "unlimited" ] || [ $u -ge 15 ] || echo "WARNING: ulimit -n is too low" 1>&2 u=$(bash -c "ulimit -u") [ "$u" = "unlimited" ] || [ $u -ge 1600 ] || echo "WARNING: ulimit -u is too low" 1>&2 fi exec $BYOBU_BACKEND $BYOBU_ARG_VERSION exit 0 ;; -h|--help) exec man $PKG ;; esac fi # Check if we're being autolaunched, and this user explicitly does not want it. if [ "$0" = "/etc/profile.d/Z97-$PKG.sh" ] && [ -r "$BYOBU_CONFIG_DIR/disable-autolaunch" ]; then exit 0 fi # Sanitize the environment byobu-janitor --force # Set the window title if this is a TTY if [ -t 1 ]; then [ -r "$BYOBU_CONFIG_DIR/statusrc" ] && . "$BYOBU_CONFIG_DIR/statusrc" . $BYOBU_PREFIX/lib/$PKG/ip_address BYOBU_TITLE=${BYOBU_ALT_TITLE:-'${USER}@${HOSTNAME:-$(hostname)} ($(__ip_address t)) - ${PKG}'} [ -n "$BYOBU_NO_TITLE" ] || eval printf \"\\033\]0\;${BYOBU_TITLE}\\007\" fi # Drop a symlink to the ssh socket in $HOME, since we can ensure that exists if [ -S "$SSH_AUTH_SOCK" ] && [ ! -h "$SSH_AUTH_SOCK" ]; then ln -sf "$SSH_AUTH_SOCK" "$BYOBU_CONFIG_DIR/.ssh-agent" export SSH_AUTH_SOCK="$BYOBU_CONFIG_DIR/.ssh-agent" fi # Fallback terminfo [ -z "$BYOBU_DEFAULT_TERM" ] && BYOBU_DEFAULT_TERM="screen" # Color terminfo to use, if possible [ -z "$BYOBU_COLOR_TERM" ] && BYOBU_COLOR_TERM="screen-256color" # Check if our terminfo supports 256 colors CAN_SHOW_COLORS= if eval $BYOBU_TEST tput >/dev/null 2>&1; then if [ "$(tput colors 2>/dev/null || echo 0)" = "256" ]; then CAN_SHOW_COLORS=1 fi fi # Check if the color terminfo is available HAS_COLOR_TERM= if eval $BYOBU_TEST infocmp >/dev/null 2>&1; then if infocmp "$BYOBU_COLOR_TERM" >/dev/null 2>&1; then HAS_COLOR_TERM=1 fi fi case $BYOBU_BACKEND in tmux) # Use 256 colors if possible if [ -n "$CAN_SHOW_COLORS" ] || [ "$COLORTERM" = "gnome-terminal" ] || [ "$TERM" = "xterm" ] || [ "$TERM" = "xterm-256color" ] || [ "$TERM" = "screen" ]; then [ -z "$SCREEN_TERM" ] && SCREEN_TERM="-2" fi if [ -z "$BYOBU_TERM" ]; then if [ -n "$SCREEN_TERM" -a -n "$HAS_COLOR_TERM" ]; then BYOBU_TERM="$BYOBU_COLOR_TERM" else BYOBU_TERM="$BYOBU_DEFAULT_TERM" fi fi BYOBU_PROFILE="-f $BYOBU_PREFIX/share/$PKG/profiles/tmuxrc" # Set default window, unless user has overriden if egrep -qs "default-command|default-shell" $HOME/.$PKG/.tmux.conf >/dev/null 2>&1; then DEFAULT_WINDOW= else DEFAULT_WINDOW="new-session -n $BYOBU_WINDOW_NAME ${BYOBU_PREFIX}/bin/byobu-shell" fi sessions=$($BYOBU_BACKEND list-sessions 2>/dev/null) || true CUSTOM_WINDOW_SET=0 if [ -s "$BYOBU_CONFIG_DIR/windows.tmux.$BYOBU_WINDOWS" ]; then CUSTOM_WINDOW_SET=1 BYOBU_WINDOWS="$BYOBU_CONFIG_DIR/windows.tmux.$BYOBU_WINDOWS" elif [ -s "$BYOBU_CONFIG_DIR/windows.tmux" ]; then CUSTOM_WINDOW_SET=1 BYOBU_WINDOWS="$BYOBU_CONFIG_DIR/windows.tmux" fi ;; screen) # Allow override of default window list, with BYOBU_WINDOWS environment variable CUSTOM_WINDOW_SET=0 if [ -s "$BYOBU_WINDOWS" ]; then CUSTOM_WINDOW_SET=1 elif [ -s "$BYOBU_CONFIG_DIR/windows.$BYOBU_WINDOWS" ]; then CUSTOM_WINDOW_SET=1 BYOBU_WINDOWS="$BYOBU_CONFIG_DIR/windows.$BYOBU_WINDOWS" elif [ "$#" = "0" ]; then BYOBU_WINDOWS="$BYOBU_CONFIG_DIR/windows" else BYOBU_WINDOWS="/dev/null" fi export BYOBU_WINDOWS # Launch shell, unless the user has default windows set to launch uncommented_lines < "$BYOBU_WINDOWS" && DEFAULT_WINDOW= || DEFAULT_WINDOW="${BYOBU_PREFIX}/bin/byobu-shell" # Use 256 colors if possible if [ -z "$BYOBU_TERM" ]; then if [ -n "$CAN_SHOW_COLORS" -a -n "$HAS_COLOR_TERM" ]; then BYOBU_TERM="$BYOBU_COLOR_TERM" else BYOBU_TERM="$BYOBU_DEFAULT_TERM" fi fi SCREEN_TERM="-T $BYOBU_TERM" # Some users want to maintain separate configurations # if they use both GNU Screen and byobu on the same system if [ -r "$BYOBU_CONFIG_DIR/.screenrc" ]; then BYOBU_PROFILE="-c $BYOBU_PREFIX/share/$PKG/profiles/byoburc" else BYOBU_PROFILE="-c $BYOBU_PREFIX/share/$PKG/profiles/screenrc" fi BYOBU_SESSION_NAME="-S $PKG" # Zero out $BYOBU_SESSION_NAME if user has specified a session name for i in "$@"; do case $i in -*r*|-*d*|-*D*|-*S*|-ls|-list) BYOBU_SESSION_NAME= ;; esac done sessions=$($BYOBU_BACKEND -wipe 2>/dev/null) || true ;; esac export BYOBU_TERM # Save session info [ -n "$DBUS_SESSION_BUS_ADDRESS" ] && printf "DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS\n" > "$BYOBU_RUN_DIR/sockets" [ -n "$SESSION_MANAGER" ] && printf "SESSION_MANAGER=$SESSION_MANAGER\n" >> "$BYOBU_RUN_DIR/sockets" # Now let's execute the backend! if [ "$#" = "0" ]; then if [ "$CUSTOM_WINDOW_SET" = "1" ]; then # Start new custom window set session case $BYOBU_BACKEND in tmux) exec tmux -u $SCREEN_TERM $BYOBU_PROFILE $(cat "$BYOBU_WINDOWS") ;; screen) exec screen $SCREEN_TERM $BYOBU_SESSION_NAME $BYOBU_PROFILE ;; esac else case "$sessions" in *\(*\)*) # Select and attach to an existing session exec byobu-select-session ;; *) # Start new default session case $BYOBU_BACKEND in tmux) exec tmux -u $SCREEN_TERM $BYOBU_PROFILE $DEFAULT_WINDOW ;; screen) exec screen $SCREEN_TERM $BYOBU_SESSION_NAME $BYOBU_PROFILE $DEFAULT_WINDOW ;; esac ;; esac fi else # Launch with command line args case $BYOBU_BACKEND in tmux) exec tmux -u $SCREEN_TERM $BYOBU_PROFILE "$@" ;; screen) exec screen $SCREEN_TERM $BYOBU_SESSION_NAME $BYOBU_PROFILE "$@" ;; esac fi # vi: syntax=sh ts=4 noexpandtab