Blame src/virtualX.sh

Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
#
Packit bbb0ff
#   Name: virtualX.sh - part of the BeakerLib project
Packit bbb0ff
#   Description: Helpers for handling virtual X server
Packit bbb0ff
#
Packit bbb0ff
#   Author: Jan Hutar <jhutar@redhat.com>
Packit bbb0ff
#   Author: Petr Splichal <psplicha@redhat.com>
Packit bbb0ff
#
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
#
Packit bbb0ff
#   Copyright (c) 2008-2010 Red Hat, Inc. All rights reserved.
Packit bbb0ff
#
Packit bbb0ff
#   This copyrighted material is made available to anyone wishing
Packit bbb0ff
#   to use, modify, copy, or redistribute it subject to the terms
Packit bbb0ff
#   and conditions of the GNU General Public License version 2.
Packit bbb0ff
#
Packit bbb0ff
#   This program is distributed in the hope that it will be
Packit bbb0ff
#   useful, but WITHOUT ANY WARRANTY; without even the implied
Packit bbb0ff
#   warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit bbb0ff
#   PURPOSE. See the GNU General Public License for more details.
Packit bbb0ff
#
Packit bbb0ff
#   You should have received a copy of the GNU General Public
Packit bbb0ff
#   License along with this program; if not, write to the Free
Packit bbb0ff
#   Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit bbb0ff
#   Boston, MA 02110-1301, USA.
Packit bbb0ff
#
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head1 NAME
Packit bbb0ff
Packit bbb0ff
BeakerLib - virtualX - Helpers for handling virtual X server
Packit bbb0ff
Packit bbb0ff
=head1 DESCRIPTION
Packit bbb0ff
Packit bbb0ff
This module provides a simple way to start and stop virtual X server
Packit bbb0ff
(framebuffer).
Packit bbb0ff
Packit bbb0ff
=head1 FUNCTIONS
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# Internal Stuff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
Packit bbb0ff
# Files:
Packit bbb0ff
#
Packit bbb0ff
# /tmp/$Xid-pid - contains PID for X server we are running # no-reboot
Packit bbb0ff
# /tmp/$Xid-display - contains DISPLAY of our X server # no-reboot
Packit bbb0ff
Packit bbb0ff
. $BEAKERLIB/testing.sh
Packit bbb0ff
. $BEAKERLIB/infrastructure.sh
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlVirtXGetCorrectID
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
#
Packit bbb0ff
# Generate internal ID from provided unique string, used by other
Packit bbb0ff
# rlVirtX* functions. You probably do not need to call this
Packit bbb0ff
# function and can forget about its existence.
Packit bbb0ff
#
Packit bbb0ff
# usage: rlVirtXGetCorrectID some_unique_string
Packit bbb0ff
#
Packit bbb0ff
#  * some_unique_string: unique identifier, you can use e.g. $TEST
Packit bbb0ff
#    (non-alnum chars will be stripped)
Packit bbb0ff
Packit bbb0ff
function rlVirtXGetCorrectID() {
Packit bbb0ff
    echo "$1" | sed "s/[^[:alnum:]]//g"
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlVirtXGetPid
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
#
Packit bbb0ff
# Return PID of virtual X server
Packit bbb0ff
#
Packit bbb0ff
# usage: rlVirtXGetPid string
Packit bbb0ff
#
Packit bbb0ff
#  * string: ID (e.g. $TEST variable can be used)
Packit bbb0ff
Packit bbb0ff
function rlVirtXGetPid() {
Packit bbb0ff
    local Xid=$( rlVirtXGetCorrectID "$1" )
Packit bbb0ff
    if [ -f "/tmp/$Xid-pid" ]; then # no-reboot
Packit bbb0ff
        cat "/tmp/$Xid-pid"         # no-reboot
Packit bbb0ff
    else
Packit bbb0ff
        return 1
Packit bbb0ff
    fi
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlVirtXStartDisplay
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
#
Packit bbb0ff
# Start a virtual X server on display "display"
Packit bbb0ff
#
Packit bbb0ff
# usage: rlVirtXStartDisplay string display
Packit bbb0ff
#
Packit bbb0ff
#  * string: ID (e.g. $TEST variable can be used)
Packit bbb0ff
#  * display: DISPLAY number (without ':')
Packit bbb0ff
Packit bbb0ff
function rlVirtXStartDisplay() {
Packit bbb0ff
    local Xid=$( rlVirtXGetCorrectID "$1" )
Packit bbb0ff
    local Xdisplay=$( echo $2 | sed "s/[^0-9]//g" )
Packit bbb0ff
    rlLogDebug "rlVirtXStartDisplay: Starting a virtual X ($Xid) server on :$Xdisplay"
Packit bbb0ff
Packit bbb0ff
    Xvfb :$Xdisplay -ac -screen 0 1600x1200x24 -fbdir /tmp & # no-reboot
Packit bbb0ff
    local Xpid=$!
Packit bbb0ff
    sleep 3
Packit bbb0ff
    if ! ps | grep $Xpid >/dev/null; then
Packit bbb0ff
        rlLogDebug "rlVirtXStartDisplay: Virtual X failed to start"
Packit bbb0ff
        return 1
Packit bbb0ff
    else
Packit bbb0ff
        rlLogDebug "rlVirtXStartDisplay: Started with PID '$Xpid' on display :$Xdisplay"
Packit bbb0ff
        echo "$Xpid" > /tmp/$Xid-pid # no-reboot
Packit bbb0ff
        echo ":$Xdisplay" > /tmp/$Xid-display # no-reboot
Packit bbb0ff
        return 0
Packit bbb0ff
    fi
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# Virtual X Server --- Public Stuff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head2 Virtual X Server
Packit bbb0ff
Packit bbb0ff
Functions providing simple way how to start and stop virtual X
Packit bbb0ff
server.
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlVirtualXStart
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlVirtualXStart
Packit bbb0ff
Packit bbb0ff
Start a virtual X server on a first free display. Tries only first
Packit bbb0ff
N displays, so you can run out of them.
Packit bbb0ff
Packit bbb0ff
    rlVirtualXStart name
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item name
Packit bbb0ff
Packit bbb0ff
String identifying the X server.
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
Returns 0 when the server is started successfully.
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
function rlVirtualXStart() {
Packit bbb0ff
    local Xmax=3
Packit bbb0ff
    local Xid=$( rlVirtXGetCorrectID "$1" )
Packit bbb0ff
    local Xdisplay=0
Packit bbb0ff
    for Xdisplay in $( seq 1 $Xmax ); do
Packit bbb0ff
        rlLogDebug "rlVirtualXStart: Trying to start on display :$Xdisplay"
Packit bbb0ff
        if rlVirtXStartDisplay $Xid $Xdisplay; then
Packit bbb0ff
            rlLogDebug "rlVirtualXStart: Started on display :$Xdisplay"
Packit bbb0ff
            return 0
Packit bbb0ff
        fi
Packit bbb0ff
    done
Packit bbb0ff
    rlLogDebug "rlVirtualXStart: Was not able to start on displays from :1 to :Xmax"
Packit bbb0ff
    return 1
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlVirtualXGetDisplay
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlVirtualXGetDisplay
Packit bbb0ff
Packit bbb0ff
Get the DISPLAY variable for specified virtual X server.
Packit bbb0ff
Packit bbb0ff
    rlVirtualXGetDisplay name
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item name
Packit bbb0ff
Packit bbb0ff
String identifying the X server.
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
Displays the number of display where specified virtual X server is
Packit bbb0ff
running to standard output. Returns 0 on success.
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
function rlVirtualXGetDisplay() {
Packit bbb0ff
    local Xid=$( rlVirtXGetCorrectID "$1" )
Packit bbb0ff
    if [ -f "/tmp/$Xid-display" ]; then # no-reboot
Packit bbb0ff
        cat "/tmp/$Xid-display"         # no-reboot
Packit bbb0ff
    else
Packit bbb0ff
        return 1
Packit bbb0ff
    fi
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# rlVirtualXStop
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 rlVirtualXStop
Packit bbb0ff
Packit bbb0ff
Kill the specified X server.
Packit bbb0ff
Packit bbb0ff
    rlVirtualXStop name
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item name
Packit bbb0ff
Packit bbb0ff
String identifying the X server.
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
Returns 0 when the server is stopped successfully.
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
function rlVirtualXStop() {
Packit bbb0ff
    local Xid=$( rlVirtXGetCorrectID "$1" )
Packit bbb0ff
    local Xpid=$( rlVirtXGetPid "$Xid" )
Packit bbb0ff
    local Xdisplay=$( rlVirtualXGetDisplay "$1" )
Packit bbb0ff
    if [ -z "$Xpid" ]; then
Packit bbb0ff
        rlLogDebug "rlVirtualXStop: Provide pid you want to kill"
Packit bbb0ff
        return 1
Packit bbb0ff
    fi
Packit bbb0ff
    if ps | grep $Xpid >/dev/null; then
Packit bbb0ff
        kill "$Xpid"
Packit bbb0ff
    fi
Packit bbb0ff
    sleep 2; # added by koca (some servers aren't so quick :))
Packit bbb0ff
    if ! ps | grep $Xpid >/dev/null; then
Packit bbb0ff
        rlLogDebug "rlVirtualXStop: Normal 'kill $Xpid' succeed"
Packit bbb0ff
    else
Packit bbb0ff
        rlLogWarning "rlVirtualXStop: I had to 'kill -9 $Xpid' (rc: $?) X server"
Packit bbb0ff
        kill -9 "$Xpid"
Packit bbb0ff
        sleep 1
Packit bbb0ff
        if [ -r "/tmp/.X$Xdisplay-lock" ]; then # no-reboot
Packit bbb0ff
            rlLogDebug "rlVirtualXStop: Lock file '/tmp/.X$Xdisplay-lock' still exists, last attempt" # no-reboot
Packit bbb0ff
            kill $( cat "/tmp/.X$Xdisplay-lock" ) &>/dev/null # no-reboot
Packit bbb0ff
            kill -9 $( cat "/tmp/.X$Xdisplay-lock" ) &>/dev/null # no-reboot
Packit bbb0ff
            rm -f "/tmp/.X$Xdisplay-lock" # no-reboot
Packit bbb0ff
            sleep 1
Packit bbb0ff
        fi
Packit bbb0ff
        if ps | grep $Xpid >/dev/null; then
Packit bbb0ff
            rlLogDebug "rlVirtualXStop: I was not able to kill pid '$Xpid', sorry"
Packit bbb0ff
            return 2
Packit bbb0ff
        fi
Packit bbb0ff
    fi
Packit bbb0ff
    rm -rf /tmp/$Xid-display /tmp/$Xid-pid # no-reboot
Packit bbb0ff
    sleep 1     # give it some time to end
Packit bbb0ff
    return 0
Packit bbb0ff
}
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# Example
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head3 Example
Packit bbb0ff
Packit bbb0ff
Below is a simple example of usage. Note that a lot of usefull
Packit bbb0ff
debugging information is reported on the DEBUG level, so you can
Packit bbb0ff
run your test with C<DEBUG=1 make run> to get them.
Packit bbb0ff
Packit bbb0ff
    rlVirtualXStart $TEST
Packit bbb0ff
    rlAssert0 "Virtual X server started" $?
Packit bbb0ff
    export DISPLAY="$( rlVirtualXGetDisplay $TEST )"
Packit bbb0ff
    # ...your test which needs X...
Packit bbb0ff
    rlVirtualXStop $TEST
Packit bbb0ff
    rlAssert0 "Virtual X server killed" $?
Packit bbb0ff
Packit bbb0ff
These are "Requires" lines for your scripts - note different package
Packit bbb0ff
names for different RHEL versions:
Packit bbb0ff
Packit bbb0ff
    @echo "Requires: xorg-x11-server-Xvfb" >> $(METADATA) # RHEL-5
Packit bbb0ff
    @echo "Requires: xorg-x11-Xvfb"        >> $(METADATA) # RHEL-4
Packit bbb0ff
    @echo "Requires: XFree86-Xvfb"         >> $(METADATA) # RHEL-3
Packit bbb0ff
Packit bbb0ff
=cut
Packit bbb0ff
Packit bbb0ff
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
# AUTHORS
Packit bbb0ff
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Packit bbb0ff
: <<'=cut'
Packit bbb0ff
=pod
Packit bbb0ff
Packit bbb0ff
=head1 AUTHORS
Packit bbb0ff
Packit bbb0ff
=over
Packit bbb0ff
Packit bbb0ff
=item *
Packit bbb0ff
Packit bbb0ff
Jan Hutar <jhutar@redhat.com>
Packit bbb0ff
Packit bbb0ff
=item *
Packit bbb0ff
Packit bbb0ff
Petr Splichal <psplicha@redhat.com>
Packit bbb0ff
Packit bbb0ff
=back
Packit bbb0ff
Packit bbb0ff
=cut