x11config15suse.pl revision 332d68e9666b04a5aa788a586d9f4c6b1f19c700
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#!/usr/bin/perl -w
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# Sun VirtualBox
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# Guest Additions X11 config update script
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#
3f1e0eea71cabeb90529e546f16eb7aee513fde9vboxsync# Copyright (C) 2006-2009 Sun Microsystems, Inc.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# This file is part of VirtualBox Open Source Edition (OSE), as
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# available from http://www.virtualbox.org. This file is free software;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync# General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync# Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# Clara, CA 95054 USA or visit http://www.sun.com if you need
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# additional information or have any questions.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync#
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# Versions of (open)SUSE which ship X.Org Server 1.5 still do not enable
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# mouse autodetection, so on these systems we have to enable vboxmouse in the
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# X.Org configuration file as well as vboxvideo. When uninstalling, we enable
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# the fbdev driver, which SUSE prefers over vesa, and we leave the references
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# to vboxmouse in place, as without the driver they are harmless.
7e960d3a0a8a3a84d7aba2cca45d72b1c31cc97bvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncuse File::Copy;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d31ded334a29f575e23dc889b603b1a586759348vboxsync# This is the file name for the temporary file we write the new configuration
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# to.
d31ded334a29f575e23dc889b603b1a586759348vboxsync# @todo: perl must have an API for generating this
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncmy $temp="/tmp/xorg.conf";
61fa69e2bc9fc9e7490feed1c020273f3ddb238dvboxsync# The list of possible names of X.org configuration files
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncmy @cfg_files = ("/etc/X11/xorg.conf-4", "/etc/X11/xorg.conf", "/etc/X11/.xorg.conf", "/etc/xorg.conf",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync "/usr/etc/X11/xorg.conf-4", "/usr/etc/X11/xorg.conf", "/usr/lib/X11/xorg.conf-4",
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync "/usr/lib/X11/xorg.conf");
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# File descriptor of the old configuration file
2f0d866e126dd288169fed591c259c1c6b4016e5vboxsyncmy $CFG;
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync# File descriptor of the temporary file
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncmy $TMP;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# The name of the mouse driver we are enabling
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncmy $mousedrv = 'vboxmouse';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# The name of the video driver we are enabling
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsyncmy $videodrv= 'vboxvideo';
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync# If we are uninstalling, restore the old video driver
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsyncif (@ARGV && "$ARGV[0]" eq 'uninstall')
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync{
afed5ab737f4aacfae3fe73776f40e989190a7cavboxsync $videodrv = 'fbdev' # SUSE prefers this one
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync}
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# How many different configuration files have we found?
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsyncmy $config_count = 0;
0174432b2b1a760b89840ba696f7ba51def65dddvboxsync
2daaccf68be3773aee600c5c3e48bcf5401418a6vboxsync# Subroutine to roll back after a partial installation
0174432b2b1a760b89840ba696f7ba51def65dddvboxsyncsub do_fail {
614cbe11a7e5588dc8d369e223174b1441a09359vboxsync foreach $cfg (@cfg_files) {
2634ec5cbf8f1fa0a968cd4664ead6df1fed730dvboxsync move "$cfg.vbox", $cfg;
614cbe11a7e5588dc8d369e223174b1441a09359vboxsync unlink "$cfg.vbox";
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync }
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync die $_[0];
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync}
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsync# Perform the substitution on any configuration file we may find.
7666082b743c5e146a8cee6cc794ff4bc3fd0ffdvboxsyncforeach $cfg (@cfg_files) {
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (open(CFG, $cfg)) {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync open(TMP, ">$temp")
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync or &do_fail("Can't create $TMP: $!\n");
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync my $have_mouse = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync my $in_section = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync my $in_layout = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync # Go through the configuration file line by line
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync while (defined ($line = <CFG>)) {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync # Look for the start of sections
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ($line =~ /^\s*Section\s*"([a-zA-Z]+)"/i) {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync my $section = lc($1);
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync # And see if they are device or input device sections
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (($section eq "inputdevice") || $section eq "device") {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync $in_section = 1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync # Or server layout sections
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ($section eq "serverlayout")
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync $in_section = 1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync $in_layout = 1;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync } else {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ($line =~ /^\s*EndSection/i && $in_layout) {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync # We always add this to the end of the server layout.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync print TMP " InputDevice \"VBoxMouse\"\n"
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
f351fab06d1e1507b72f5c574df71193061fd393vboxsync if ($line =~ /^\s*EndSection/i) {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync $in_section = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync $in_layout = 0;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
b1c3cdef473df2fbc621d5da81acc82dbfb8a11avboxsync }
a11c569636fa6838bd423f4631a9660a5a84204bvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ($in_section) {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync # Inside sections, look for any graphics drivers and replace
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync # them with our one.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ($line =~ /^\s*driver\s+\"(fbdev|vga|vesa|vboxvideo|ChangeMe)\"/i) {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync $line =~ s/(fbdev|vga|vesa|vboxvideo|ChangeMe)/$videodrv/i;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync # Also keep track of whether this configuration file contains
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync # an input device section for vboxmouse. If it does, we don't
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync # need to add one later.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ($line =~ /^\s*driver\s+\"(?:vboxmouse)\"/i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync $have_mouse = 1
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync # We add vboxmouse to the server layout section ourselves, so
3ecf9412133496b2aeb090cfd33a286404ec59fbvboxsync # remove any existing references to it.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if ( $line =~ /^\s*inputdevice.*\"vboxmouse\"/i)
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync $line = "";
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync print TMP $line;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync # We always add a vboxmouse section at the end for SUSE guests using
750d4d0506a38b2e80c997075d40aad474e675fbvboxsync # X.Org 1.5 if vboxmouse is not referenced anywhere else in the file,
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync # and we do not remove it when we uninstall the additions, as it will
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync # not do any harm if it is left.
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync if (!$have_mouse) {
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync print TMP "\n";
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync print TMP "Section \"InputDevice\"\n";
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync print TMP " Identifier \"VBoxMouse\"\n";
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync print TMP " Driver \"$mousedrv\"\n";
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync print TMP " Option \"Device\" \"\/dev\/vboxadd\"\n";
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync print TMP " Option \"SendCoreEvents\" \"on\"\n";
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync print TMP "EndSection\n";
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
aaeb2e2f6ed5b164f1dec9a16a7adeb84f64cf31vboxsync close(TMP);
223cf005b18af2c21352a70693ebaf0582f68ebcvboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync # We do not overwrite existing "$cfg.vbox" files in order to keep a
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync # record of what the configuration looked like before the very first
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync # installation of the additions.
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync copy $cfg, "$cfg.bak";
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync if (! -e "$cfg.vbox") {
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync rename $cfg, "$cfg.vbox";
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync copy $temp, $cfg
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync or &do_fail("Could not overwrite configuration file $cfg! Exiting...");
576d4214137bce409cdcf01e8df4a0bca5e0b2d1vboxsync unlink $temp;
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync $config_count++;
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync }
72ef2b9fc5ffc01d0dabd5052d6e8baa3a952773vboxsync}
b74ca013e5f201a2dd371e6c438433ceac12af30vboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync# Warn if we did not find any configuration files
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync$config_count != 0 or die "Could not find any X11 configuration files";
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync
d408b82da0773c7e8cd4b3a01cb8a065a2c73a2dvboxsync