blob: 049504a86e73520a0466ffcf622133b924e38f48 [file] [log] [blame] [raw]
#!/bin/bash
# Copyright (C) 2012-2014, Parallels, Inc. All rights reserved.
#
# 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; either version 2 of the License, or
# (at your option) any later version.
#
# 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, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
#
# Configures getty in a container on /dev/tty1 (aka /dev/console)
# and /dev/tty2. Invoked during vzctl start. Needed for vzctl console.
if [ -x /lib/systemd/systemd ]; then
SYSTEMD_DIR=/lib/systemd/system
else
SYSTEMD_DIR=/usr/lib/systemd/system
fi
ETC_SYSTEMD_DIR="/etc/systemd/system"
SYSTEMD_GETTY_SERVICE=$SYSTEMD_DIR/getty@.service
create_dev()
{
local dev=$1
local major=$2
local minor=$3
if [ ! -c /dev/$dev -o -L /dev/$dev ]; then
rm -f /dev/$dev 2>/dev/null
mknod /dev/$dev c $major $minor
fi
}
fix_shell_console()
{
[ -f $SYSTEMD_DIR/console-getty.service ] &&
return 0
echo '# This file is part of systemd.
#
# systemd 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; either version 2 of the License, or
# (at your option) any later version.
[Unit]
Description=Console Shell
After=systemd-user-sessions.service plymouth-quit-wait.service
Before=getty.target
[Service]
Environment=HOME=/root
WorkingDirectory=/root
ExecStart=-/sbin/agetty --noclear -s console 115200,38400,9600
Restart=always
RestartSec=0
UtmpIdentifier=cons
TTYPath=/dev/console
TTYReset=yes
TTYVHangup=yes
StandardInput=tty-force
StandardOutput=inherit
StandardError=inherit
KillMode=process
# Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash
# terminates cleanly.
KillSignal=SIGHUP
[Install]
WantedBy=getty.target' > $SYSTEMD_DIR/console-getty.service
rm -f $SYSTEMD_DIR/console-shell.service
}
setup_systemd_console()
{
if grep -q -e 'ConditionPathExists=!/run/openvz' \
-e 'ConditionPathExists=!/proc/vz' $SYSTEMD_GETTY_SERVICE 2>/dev/null; then
sed -i -e '/ConditionPathExists=!\/run\/openvz/d' \
-e '/ConditionPathExists=!\/proc\/vz/d' $SYSTEMD_GETTY_SERVICE
fi
[ -L $SYSTEMD_DIR/getty.target.wants/getty@tty1.service ] && \
rm -f $SYSTEMD_DIR/getty.target.wants/getty@tty1.service
[ -L $SYSTEMD_DIR/getty.target.wants/getty-static.service ] && \
rm -f $SYSTEMD_DIR/getty.target.wants/getty-static.service
[ -L $ETC_SYSTEMD_DIR/getty.target.wants/getty@tty1.service ] && \
rm -f $ETC_SYSTEMD_DIR/getty.target.wants/getty@tty1.service
[ -L $SYSTEMD_DIR/getty.target.wants/getty@tty2.service ] || \
ln -sf $SYSTEMD_DIR/getty@.service $ETC_SYSTEMD_DIR/getty.target.wants/getty@tty2.service
[ -f $SYSTEMD_DIR/console-shell.service ] &&
fix_shell_console
}
setup_upstart_console()
{
local file=/etc/init/$1.conf
local getty
if [ -x /sbin/mingetty ]; then
getty='exec /sbin/mingetty'
elif [ -x /sbin/getty ]; then
getty='exec /sbin/getty 38400'
else
echo "Unable to find suitable getty, console setup is skipped"
return 0
fi
echo "start on stopped rc RUNLEVEL=[2345]
stop on runlevel [!2345]
respawn
$getty $1" > $file
}
setup_upstart_event_console()
{
local file=/etc/init.d/$1
local getty
if [ -x /sbin/mingetty ]; then
getty='exec /sbin/mingetty'
elif [ -x /sbin/getty ]; then
getty='exec /sbin/getty 38400'
else
echo "Unable to find suitable getty console setup is skipped"
return 0
fi
echo "start on stopped rc2
start on stopped rc3
start on stopped rc4
stop on runlevel 0
stop on runlevel 1
stop on runlevel 6
$getty $1" > $file
}
setup_inittab()
{
local line
local getty1
local getty2
if [ -x /sbin/mingetty ]; then
getty1='/sbin/mingetty console'
getty2='/sbin/mingetty tty2'
elif [ -x /sbin/getty ]; then
getty1='/sbin/getty 38400 console'
getty2='/sbin/getty 38400 tty2'
elif [ -x /sbin/agetty ]; then
getty1='/sbin/agetty console 38400'
getty2='/sbin/agetty tty2 38400'
else
echo "Unable to find suitable getty, console setup is skipped"
return 0
fi
line="1:2345:respawn:$getty1"
if ! grep -q "$line" /etc/inittab; then
echo $line >> /etc/inittab
fi
line="2:2345:respawn:$getty2"
if ! grep -q "$line" /etc/inittab; then
echo $line >> /etc/inittab
fi
}
setup_console()
{
if [ -f "$SYSTEMD_GETTY_SERVICE" ]; then
setup_systemd_console
elif [ -d '/etc/init' ]; then
setup_upstart_console console
setup_upstart_console tty2
elif [ -d "/etc/event.d" ]; then
setup_upstart_event_console console
setup_upstart_event_console tty2
elif [ -f "/etc/inittab" ]; then
setup_inittab
fi
create_dev console 5 1
create_dev tty2 4 2
}
setup_console
exit 0