home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / root / usr / lib / YaST2 / bin / xmigrate.pl < prev    next >
Perl Script  |  2006-11-29  |  5KB  |  193 lines

  1. #!/usr/bin/perl
  2. # Copyright (c) 2003 SuSE GmbH Nuernberg, Germany.  All rights reserved.
  3. #
  4. # Authors:
  5. # --------
  6. # Marcus Schaefer <ms@suse.de>
  7. #
  8. # Perl Skript to update/migrate a XFree86 v3 based system
  9. # into a XOrg 4.x based system
  10. #
  11. # Details:
  12. # --------
  13. # 1) Check if the Card is supported from XOrg 4.x
  14. # 2) Obtain the most important information from the
  15. #    existing 3.x config file
  16. # 3) Create a SaX2 profile with the 3.x data
  17. # 4) Create new 4.x config file with SaX2
  18. #    - use real driver if supported
  19. #    - use fbdev driver if card is framebuffer capable
  20. #    - use vesa driver if vesa BIOS was found
  21. #    - use vga driver if no VESA bios was found
  22. #
  23. # Status: Up-To-Date
  24. #
  25. #----[ readFile ]----#
  26. sub readFile {
  27. #----------------------------------------------
  28. # read the XFree86_3x based configuration file
  29. # and save the lines in a list. Check for a
  30. # valid SaX(1) header
  31. #
  32.     my @result = ();
  33.     my $infile = "/etc/XF86Config";
  34.     open (FD,$infile) || die "Update::Could not open input file";
  35.     my $header = <FD>;
  36.     if ($header !~ /# SaX autogenerated/) {
  37.         die "Update::Not a SaX(1) header";
  38.     }
  39.     while (<FD>) {
  40.         chomp $_; push @result,$_;
  41.     }
  42.     return @result;
  43. }
  44.  
  45. #---[ getDefaultColor ]---#
  46. sub getDefaultColor {
  47. #----------------------------------------------
  48. # obtain default color depth
  49. #
  50.     my $depth = 8;
  51.     foreach (@_) {
  52.     if ($_ =~ /DefaultColorDepth(.*)/) {
  53.         $depth = $1;
  54.         $depth =~ s/\s+//g;
  55.         if ($depth < 8) {
  56.             $depth = 16;
  57.         }
  58.         return $depth;
  59.     }
  60.     }
  61.     return undef;
  62. }
  63.  
  64. #---[ getModeForColor ]---#
  65. sub getModeForColor {
  66. #----------------------------------------------
  67. # obtain Modes line used for given color depth
  68. #
  69.     my $color = $_[0];
  70.     my @list  = @{$_[1]};
  71.     my $start = 0;
  72.     foreach (@list) {
  73.     if ($_ =~ /^\s+Depth\s+$color/) {
  74.         $start = 1;
  75.         next;
  76.     }
  77.     if (($start) && ($_ =~ /Modes\s+(.*)/)) {
  78.         my $modes = $1;
  79.         $modes =~ s/\s+$//;
  80.         $modes =~ s/\"//g;
  81.         $modes =~ s/\s+/,/g;
  82.         return $modes;
  83.     }
  84.     }
  85.     return undef;
  86. }
  87.  
  88. #---[ getSyncRange ]---#
  89. sub getSyncRange {
  90. #----------------------------------------------
  91. # obtain sync ranges from Monitor section
  92. #
  93.     my %result;
  94.     foreach (@_) {
  95.     if ($_ =~ /^\s+HorizSync\s+(.*)/) {
  96.         my $hsync = $1;
  97.         $hsync =~ s/\s+//g;
  98.         $result{HSync} = $hsync;
  99.     }
  100.     if ($_ =~ /^\s+VertRefresh\s(.*)/) {
  101.         my $vsync = $1;
  102.         $vsync =~ s/\s+//g;
  103.         $result{VSync} = $vsync;
  104.     }
  105.     }
  106.     if ((defined $result{HSync}) && (defined $result{VSync})) {
  107.         return %result;
  108.     }
  109.     return undef;
  110. }
  111.  
  112. #---[ isSupported ]---#
  113. sub isSupported {
  114. #-------------------------------------------------
  115. # check if the card is supported from XOrg 4.x
  116. #
  117.     my $class = "Unclassified";
  118.     my $sysp  = "/usr/sbin/sysp -c";
  119.     my $data  = qx ($sysp);
  120.     if (grep (/$class/,$data)) {
  121.         return 0;
  122.     }
  123.     return 1;
  124. }
  125.  
  126. #=======================================
  127. # Main...
  128. #---------------------------------------
  129. if ($< != 0) {
  130.     die "Update::Only root can do this";
  131. }
  132. my @list  = readFile();
  133. my $color = getDefaultColor (@list);
  134. my $mode  = getModeForColor ($color,\@list);
  135. my %sync  = getSyncRange (@list);
  136.  
  137. #=======================================
  138. # Printout...
  139. #---------------------------------------
  140. my $profile = "/var/cache/sax/files/updateProfile";
  141. open (FD,">$profile")
  142.     || die "Update::Couldn't create file: $profile: $!";
  143. if (defined $color) {
  144.     print FD "Screen->0->DefaultDepth = $color\n";
  145. }
  146. if (defined $mode) {
  147.     print FD "Screen->0->Depth->$color->Modes = $mode\n";
  148. }
  149. if (defined %sync) {
  150.     print FD "Monitor->0->HorizSync = $sync{HSync}\n";
  151.     print FD "Monitor->0->VertRefresh = $sync{VSync}\n";
  152. }
  153.  
  154. #=======================================
  155. # Generate/Merge config file...
  156. #---------------------------------------
  157. if (isSupported()) {
  158.     #============================================
  159.     # 1) Card is supported...
  160.     #--------------------------------------------
  161.     close FD;
  162.     qx (sax2 -r -a -b $profile);
  163.     exit 0;
  164. }
  165. if (open (FB,"/dev/fb0")) {
  166.     #============================================
  167.     # 2) Card not supported but fbdev capable
  168.     #--------------------------------------------
  169.     close FB;
  170.     close FD;
  171.     # YaST should InjectFile() the fbdev config file...
  172.     exit 1;
  173. }
  174. my $bios = qx (hwinfo --vbe | grep "VESA BIOS");
  175. if ($bios =~ /VESA BIOS/) {
  176.     #============================================
  177.     # 3) Card not fbdev capable but VESA capable
  178.     #--------------------------------------------
  179.     print FD "Desktop->0->CalcModelines = no\n";
  180.     print FD "Monitor->0->CalcAlgorithm = XServerPool\n";
  181.     print FD "Desktop->0->Modelines\n";
  182.     close FD;
  183.     qx (sax2 -m 0=vesa -a -b $profile);
  184.     exit 2;
  185. } else {
  186.     #============================================
  187.     # 4) Card is not VESA capable -> vga
  188.     #--------------------------------------------
  189.     close FD;
  190.     qx (sax2 -m 0=vga -a);
  191.     exit 3;
  192. }
  193.