summaryrefslogblamecommitdiffstats
path: root/src/os-plugins/plugins/xserver/XX_xserver.sh
blob: 1b757901bee724022a7dae033594946c71e36670 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
                                      
                                         










                                                                           
 

                                                                          
 

































                                                              
                      







































                                                                




                                                                        

                                                                            

  



                                   



                                                                       
 



                                                                         
                                       










                                                                                


                                                                         



                                                                                      

                                                                        
                                                                
                                                                          
                                                                             
                                     
                                                                       
                                                         
 
                                                                          
                                                        
                                                                          
 
                                                                
                                                             

                                
                                                          

                                                                           
 

                                                                               
                                          

                                                 



                                                                                           





                                                                             
                                                               
                                                     



                                                                                

                                                                          
                                                                    



                                                                   

                                                                            

                                                                                   
                   
                                                   
            

                                                                   
        
                                   





                                                             
 

                                                               
                                                      



                                                                   

 

                                                                                    


                                                                              


                     
 
      
 
                                                                          
                                               
                                                                          
 


                                                                     
                             
 

                                                                      

                                                               
 


                                                                                   
                 
      
                                                                  
                                                    

                                          








                                                              
               
      
 
                                                             
                                                                      
                                                                  
                   

      




                                                                   
 

                                                                                     

                                          
                                                                                  
        
      






































                                                                                              
 


                                                                          
                                        
                                                                      





                                                             

                                                         
                                                               
                                                                        
                    


                                                       
                                                                    
                         
                                                                
                          
                                                            
                                                              
                                                 
                                                                
 
      


                                                                     
    


                                                          
  
# Copyright (c) 2008 - RZ Uni Freiburg
# Copyright (c) 2008..2010 - OpenSLX GmbH
#
# This program/file is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
#
# If you have any feedback please consult http://openslx.org/feedback and
# send your feedback to feedback@openslx.org
#
# General information about OpenSLX can be found at http://openslx.org
#
# stage3 part of 'xserver' plugin - the runlevel script setting up the Xorg
# configuration and checking for 3D capabilities and non-gpl drivers
#
# script is included from init via the "." load function - thus it has all
# variables and functions available

# defining a set of stanard configuration blocks
x_modpath='Section "Files"
# ModulePath "/usr/lib/xorg/modules/,/usr/lib64/xorg/modules/"
EndSection'
x_srvflags='Section "ServerFlags"
  Option       "AllowMouseOpenFail"
  Option       "AllowEmptyInput"   "false"
  Option       "blank time"        "5"
  Option       "standby time"      "10"
  Option       "suspend time"      "15"
  Option       "off time"          "20"
EndSection'
x_modules='Section "Module"
  Load         "i2c"
  Load         "bitmap"
  Load         "ddc"
  Load         "extmod"
  Load         "freetype"
  Load         "int10"
  Load         "vbe"
  Load         "glx"
  Load         "dri"
EndSection'
x_mouse='Section "InputDevice"
  Identifier   "Generic Mouse"
  Driver       "mouse"
# Option       "Device"            "/dev/input/mice"
# Option       "Protocol"          "ImPS/2"
# Option       "ZAxisMapping"      "4 5"
# Option       "Emulate3Buttons"   "true"
  Option       "CorePointer"
EndSection'
x_keyboard='Section "InputDevice"
  Identifier   "Generic Keyboard"
  Driver       "evdev"
  Option       "CoreKeyboard"
  Option       "XkbRules"          "xorg"
  Option       "XkbModel"          "pc105"
  Option       "XkbLayout"         "us"
EndSection'
x_videocard='Section "Device"
  Identifier   "Generic Video Card"
  Driver       "vesa"
# BusID        "PCI:xx" #especially needed for fglrx
EndSection'
x_monitor='Section "Monitor"
  Identifier   "Generic Display"
  Option       "DPMS"
# Modelname    "could be enabled via xserver::ddcinfo attribute"
# Vertrefresh  ...
# Horizsync    ...
# DisplaySize  ...
EndSection'
x_screen='Section "Screen"
  Identifier   "Default Screen"
  Device       "Generic Video Card"
  Monitor      "Generic Display"
  DefaultDepth 24
# SubSection "Display"
#   Depth        24
#   Modes        "1024x768" "800x600"
# EndSubSection
EndSection'
x_srvlayout='Section "ServerLayout"
  Identifier   "Default Layout"
  Screen       "Default Screen"
  InputDevice  "Generic Keyboard"
  InputDevice  "Generic Mouse"
EndSection'
x_dri='Section "DRI"
  Mode    0666
EndSection'
# Xorg configuration file location
xfc="/mnt/etc/X11/xorg.conf"

# read the central configuration file (fixme: should the keyboard layout
# defined within the xserver plugin settings - probably not, dvs)
if [ -e /initramfs/machine-setup ] ; then
  . /initramfs/machine-setup
else
  error "  The central configuration file 'machine-setup' (produced by the \
slxconfig-demuxer\n  and transported via fileget) is not present" nonfatal
fi

if [ -e /etc/slxsystem.conf ]; then
  . /etc/slxsystem.conf
fi

# directory for libGL, DRI library links to point to proper library set
# depending on the hardware environment
glliblinks="/mnt/var/X11R6/lib/"
testmkd ${glliblinks}

# check for the existance of plugin configuration and non-existance of an
# admin provided config file in ConfTGZ
if [ -e /initramfs/plugin-conf/xserver.conf -a \
   ! -f /rootfs/etc/X11/xorg.conf ]; then
  . /initramfs/plugin-conf/xserver.conf
  # check if driver set via xserver_driver
  # if so check for xserver_prefnongpl and xserver_driver because you want to
  # force driver even if xserver_prefnongpl=0
  # eg: [ -n "$xserver_driver" -o "$xserver_prefnongpl" -eq 1 ]
  if [ -n "$xserver_driver" ]; then
    if `grep -qi "Server Module" /etc/hwinfo.gfxcard`; then
      sed -i "s,XFree86.*,FORCED XFree86 v4 Server Module: ${xserver_driver}," \
        /etc/hwinfo.gfxcard
      echo -e "\n# File modified by $1" >> /etc/hwinfo.gfxcard
      echo "# Reason: attribute server_driver set to ${xserver_driver}" \
        >> /etc/hwinfo.gfxcard
    else
      echo -e "\n# File modified by $1" >> /etc/hwinfo.gfxcard
      echo "# Reason: attribute server_driver set to ${xserver_driver}" \
        >> /etc/hwinfo.gfxcard
      echo "FORCED XFree86 v4 Server Module: ${xserver_driver}" >> /etc/hwinfo.gfxcard
    fi
  fi
  # do not start any configuration if the admin provided a preconfigured
  # xorg.conf in /rootfs/etc/X11/xorg.conf
  if [ $xserver_active -ne 0 -a ! -f /rootfs/${xfc#/mnt} ]; then
    [ $DEBUGLEVEL -gt 0 ] && echo "executing the 'xserver' os-plugin ...";
    xmodule=$(grep -i -m 1 "XFree86 v4 Server Module" /etc/hwinfo.gfxcard | \
      sed "s/.*v4 Server Module: //")
    # proprietary ATI/NVidia modules listed a different way with hwinfo
    [ -z "$xmodule" ] || error "${hcfg_hwsetup}" nonfatal

    ######################################################################
    # begin proprietary drivers section (xorg.conf part)
    ######################################################################

    if $(grep -iq -m 1 'Module: fglrx' /etc/hwinfo.gfxcard) && \
      [ -n "$xserver_driver" -o "$xserver_prefnongpl" -eq 1 ]
    then
      # we have an ati card here
      PLUGIN_ROOTFS="/opt/openslx/plugin-repo/xserver/ati"
	  if [  -f /mnt${PLUGIN_ROOTFS}/usr/X11R6/lib/dri/fglrx_dri.so -o \
		   -f /mnt${PLUGIN_ROOTFS}/usr/lib/dri/fglrx_dri.so ]; then

	      # this will be written before standard module path into xorg.conf
	      MODULE_PATH="${PLUGIN_ROOTFS}/usr/lib/xorg/modules/\,\
${PLUGIN_ROOTFS}/usr/X11R6/lib/modules/\,"
	      xmodule="fglrx"
	      PLUGIN_PATH="/mnt/${PLUGIN_ROOTFS}"

          # impossible to load it directly via stage3 insmod - yes, somehow this is too big
          chroot /mnt /sbin/insmod ${PLUGIN_ROOTFS}/modules/fglrx.ko

          #  workaround for bug #453 (for some ati graphics cards)
          if [ $? -gt 0 -a "${slxconf_distro_name}" = "ubuntu" ]; then
            xmodule="radeon"
            MODULE_PATH="/usr/lib/xorg/modules/,/usr/X11R6/lib/xorg/modules/"
          else

	      # we need some database for driver initialization
	      cp -r "${PLUGIN_PATH}/etc/ati" /mnt/etc

          if [ "${slxconf_distro_name}" = "ubuntu" ]; then
            echo "${PLUGIN_ROOTFS}/usr/lib/libGL.so.1" >> /mnt/etc/ld.so.preload
          fi
	
	      # if fglrx_dri.so is linked wrong -> we have to link it here
	      if [ "1" -eq "$( ls -l /mnt/usr/lib/dri/fglrx_dri.so \
	        | grep -o "/var/X11R6.*so$" | wc -l )" ]; then
	          ln -s ${PLUGIN_ROOTFS}/usr/lib/dri/fglrx_dri.so \
	            ${glliblinks}dri/fglrx_dri.so
	      fi
              BUSID=$(grep -m1 -i " SysFS BusID: .*" /etc/hwinfo.gfxcard | \
                awk -F':' '{print "PCI:"$3":"$4}' | sed -e 's,\.,:,g')
	      echo -e "\t${PLUGIN_ROOTFS}/usr/bin/aticonfig --initial &>/dev/null"\
                >> /mnt/etc/init.d/boot.slx
	      ATI=1
          fi # if kernel module not loaded properly
	  fi
    elif $(grep -iq -m 1 'Module: nvidia' /etc/hwinfo.gfxcard) && \
      [ -n "$xserver_driver" -o "$xserver_prefnongpl" -eq 1 ]
    then
      # we have an nvidia card here
      NVIDIA=1
      PLUGIN_ROOTFS="/opt/openslx/plugin-repo/xserver/nvidia"
      MODULE_PATH="${PLUGIN_ROOTFS}/usr/lib/xorg/modules/\,\
${PLUGIN_ROOTFS}/usr/X11R6/lib/modules/\,"
      xmodule="nvidia"
      PLUGIN_PATH="/mnt${PLUGIN_ROOTFS}"

      # if we can't find the nongpl kernel module, use gpl xorg
      # nvidia driver
      if [ -e ${PLUGIN_PATH}/modules/nvidia.ko ]; then
        # sometimes the kernel module needs agpgart
        modprobe agpgart
        # insert kernel driver
        chroot /mnt /sbin/insmod ${PLUGIN_ROOTFS}/modules/nvidia.ko


        #  workaround for bug #453 (Xorg does not start with ld.so.preload)
        if [ "${slxconf_distro_name}" = "ubuntu" -a "${xmodule}" != "nvidia" ]; then
          echo "${PLUGIN_ROOTFS}/usr/lib/libGL.so.1" >> /mnt/etc/ld.so.preload
        fi

      else
         xmodule="nv"
      fi

    fi

    ######################################################################
    # end proprietary drivers xorg.conf section
    ######################################################################

    # write the xorg.conf completely or in files needed (depending on
    # distro version)
    # determine keyboard setup (fill XKEYBOARD)
    localization "${country}"

    # run distro specific generated stage3 script which uses variables
    # defined in the beginning of this script like ${x_*}, ${xfc}
    [ -e /mnt/opt/openslx/plugin-repo/xserver/xserver.sh ] && \
      . /mnt/opt/openslx/plugin-repo/xserver/xserver.sh

    # set nodeadkeys for special layouts
    if [ ${XKEYBOARD} = "de" ]; then
      sed -e '/\"XkbLayout\"/a\\ \ Option       "XkbVariant"        "nodeadkeys"' \
        -i ${xfc}
    fi
    # if a synaptic touchpad is present, add it to the device list
    if grep -q -E "ynaptics" /etc/hwinfo.mouse || \ 
      dmesg | grep -q -E "ynaptics" ; then
    sed -e '/\"CorePointer\"/ {
a\
EndSection\
Section "InputDevice"\
  Identifier   "Synaptics TP"\
  Driver       "synaptics"\
  Option       "Device"            "/dev/input/mice"\
  Option       "SendCoreEvents"    "true"
}' -e '/Device  "Generic Mouse"/ {
a\ \ InputDevice\ \ "Synaptics TP"\ \ \ \ \ \ "SendCoreEvents"
}'    -i ${xfc}
    fi

    # ModulePath for proprietary drivers (otherwise disabled)
    if [ -n "$xserver_driver" -o "$xserver_prefnongpl" -eq "1" ]; then
      sed -e "s,# ModulePath \",  ModulePath \"${MODULE_PATH},g" \
          -i ${xfc}
    fi

    ############################################
    # Copy the appropriate ld.so.cache file
    ############################################
    if [ "${xmodule}" = "fglrx" -o  "${xmodule}" = "nvidia" ]; then
      cp ${PLUGIN_PATH}/ld.so.cache /mnt/etc/ld.so.cache

      # just in case somebody needs to run ldconfig - insert GL-Libs at the beginning
      sed -e "1s,^,include ${PLUGIN_ROOTFS}/ld.so.conf\n,g" -i /mnt/etc/ld.so.conf 

      if [ "${xmodule}" = "nvidia" ]; then
        sed -i "s,\(Driver.*\"nvidia\"\),\1\n  Option \"NoLogo\" \"True\"," ${xfc}
      fi
    fi
 
    # check if tablet hardware available, read device information from file
    if [ -e /etc/tablet.conf ]; then
      . /etc/tablet.conf
      echo -e 'Section "InputDevice"
  Driver       "wacom"
  Identifier   "Stylus"
  Option       "Device"            "/dev/input/wacom"
  Option       "Type"              "stylus"
  Option       "ForceDevice"       "ISDV4"         # Tablet PC ONLY
EndSection
Section "InputDevice"
  Driver       "wacom"
  Identifier   "Pad"
  Option       "Device"            "/dev/input/wacom"
  Option       "Type"              "pad"
  Option       "ForceDevice"       "ISDV4"         # Tablet PC ONLY
EndSection
Section "InputDevice"
  Driver       "wacom"
  Identifier   "Eraser"
  Option       "Device"            "/dev/input/wacom"
  Option       "Type"              "eraser"
  Option       "ForceDevice"       "ISDV4"         # Tablet PC ONLY
EndSection
Section "InputDevice"
  Driver       "wacom"
  Identifier   "Cursor"
  Option       "Device"            "/dev/input/wacom"
  Option       "Type"              "cursor"
  Option       "ForceDevice"       "ISDV4"         # Tablet PC ONLY
EndSection' >> ${xfc}
      sed -e "s,/dev/input/wacom,/dev/${wacomdev}," \
          -e '/e  \"Generic Mouse\"/a\\ \ InputDevice  "Stylus"            "SendCoreEvents"' \
          -e '/e  \"Generic Mouse\"/a\\ \ InputDevice  "Pad"               "SendCoreEvents"' \
          -e '/e  \"Generic Mouse\"/a\\ \ InputDevice  "Cursor"            "SendCoreEvents"' \
          -e '/e  \"Generic Mouse\"/a\\ \ InputDevice  "Eraser"            "SendCoreEvents"' \
          -i ${xfc}
    fi

    # some configurations produce no proper screen resolution without
    # Horizsync and Vertrefresh set (more enhancements might be needed for
    # really old displays like CRTs)
    if [ $xserver_ddcinfo -ne 0 ] ; then
      # read /etc/hwinfo.display started at "runinithook '00-started'"
      vert=$(grep -m 1 "Vert.*Range:" /etc/hwinfo.display | \
        sed 's|.*Range:\ ||;s|\ Hz||')
      horz=$(grep -m 1 "Hor.*Range:" /etc/hwinfo.display | \
        sed 's|.*Range:\ ||;s|\ kHz||')
      modl=$(grep -m 1 " Model: " /etc/hwinfo.display | \
        sed 's|.*Model:\ ||;s|"||g')
      size="$(grep -m 1 " Size: " /etc/hwinfo.display | \
        sed 's|.*ize:\ ||;s|\ mm||;s|x|\ |')"
      modes=$(grep -i "Resolution: .*@" /etc/hwinfo.display | \
        awk '{print $2}'| sort -unr| awk -F '@' '{print "\"" $1 "\""}'|\
        tr "\n" " ")
      [ -n "$vert" -a -n "$horz" ] && \
        sed -e "s|# Horizsync.*|  Horizsync    $horz|;\
                s|# Vertrefre.*|  Vertrefresh  $vert|;\
                s|# Modelname.*|  Modelname    \"$modl\"|" -i ${xfc}
      [ -n "$size" ] && \
        sed -e "s|# DisplaySi.*|  DisplaySize  $size|" -i ${xfc}
      [ -n "$modes" ] && \
        sed -e "s|# SubSection.*|  SubSection \"Display\"|;\
                s|#   Depth        24.*|    Depth        24|;\
                s|#   Modes.*|    Modes	$modes|;\
                s|# EndSubSection.*|  EndSubSection|;" -i ${xfc}

    fi

    [ $DEBUGLEVEL -gt 0 ] && echo "done with 'xserver' os-plugin ..."

  fi
elif [ ! -e /initramfs/plugin-conf/xserver.conf ]; then
  [ $DEBUGLEVEL -gt 2 ] && \
    echo "No configuration file found for xserver plugin."
fi