Finding one certain line in a file is easy but how to look f

Hi,
I’m writing a little script for installing ati-drivers on linux machines
but I have a little problem. I need to change the /etc/X11/xorg.conf
file for this. This file is built like this (just a cut-out):

Section “InputDevice”
Identifier “Generic Keyboard”
Driver “kbd”
Option “CoreKeyboard”
Option “XkbRules” “xorg”
Option “XkbModel” “pc105”
Option “XkbLayout” “de”
Option “XkbOptions” “lv3:ralt_switch”
EndSection

Section “Device”
Identifier “Standardgrafikkarte”
Driver “ati”
BusID “PCI:1:0:0”
EndSection

Section “Monitor”
Identifier “Standardbildschirm”
Option “DPMS”
HorizSync 28-64
VertRefresh 43-60
EndSection

Section “DRI”
Mode 0666
EndSection

Section “Extensions”
Option “Composite” “Disable”
EndSection

Now I need to change the driver value within the Section “Device” from
ati|vesa|radeon|nomatterwhat… to fglrx, but how to find it? E.g.
IO.foreach(’/etc/X11/xorg.conf’) { |line| puts line if line =~
/^Section “Device”/ } finds me the correct section but how to “navigate”
now in it? Is iteration at all the answer to this problem?

greets

Hi –

On Sun, 26 Aug 2007, kazaam wrote:

E.g. IO.foreach(’/etc/X11/xorg.conf’) { |line| puts line if line =~
/^Section “Device”/ } finds me the correct section but how to
“navigate” now in it? Is iteration at all the answer to this
problem?

I usually do something like this (where fh is my filehandle):

while line = fh.gets
flag = true if /Section “Device”/.match(line)
flag = false if flag && line.gsub!(/(Driver\s+)"(.*)"/,
‘\1"fglrx"’)
puts line
end

David

kazaam wrote:

Hi,
I’m writing a little script for installing ati-drivers on linux machines
but I have a little problem. I need to change the /etc/X11/xorg.conf file
for this.

For what you’re trying to do, you could just read the file in as a
string,
use String#sub on it and write it to file again, but here is something a
little more fun (for me to write anyway):
http://pastie.caboo.se/91056
Usage:
xconf=XConf.new “/etc/X11/xorg.conf”
xconf[“Device”][“Driver”]=‘“fglrx”’
xconf.write #This will backup the old config to /etc/X11/xorg.conf.old
#or
xconf.write “new_config”

The new config won’t contain comments.

I just quickly hacked this up, so this isn’t thoroughly tested and may
contain
bugs (the above example works as it should, though, I tested that much).
There’s obviously some room for improvement here, but for the beginning
this seems decent enough.

HTH,
Sebastian

thx for your help, I solved it now this way (I know pretty messy) but it
works fine:

system(‘cp /etc/X11/xorg.conf /etc/X11/xorg.conf.bak’)
xorgbak = File.open(’/etc/X11/xorg.conf.bak’)
xorg = File.open(’/etc/X11/xorg.conf’,‘w’)
drifound = false
compofound=false
while line = xorgbak.gets
driverflag = true if /Section “Device”/.match(line)
driverflag = false if driverflag && line.gsub!(/(Driver\s+)"(.)"/,
‘\1"fglrx"’)
(driflag = true & drifound = true) if /Section “DRI”/.match(line)
driflag = false if driflag && line.gsub!(/(Mode\s+).
/, ‘\10666’)
(compoflag = true & compofound = true) if /Section
“Extensions”/.match(line)
compoflag = false if compoflag && line.gsub!(/(Option\s+)"(.*)"/,
‘\1"Composite" “Disable”’)
xorg.puts line
end
xorgbak.close
xorg.close
xorg = File.open(’/etc/X11/xorg.conf’,“a”)
if not drifound
xorg.puts’’
xorg.puts’Section “DRI”’
xorg.puts’ Mode 0666’
xorg.puts’EndSection’
end
if not compofound
xorg.puts’’
xorg.puts’Section “Extensions”’
xorg.puts’ Option “Composite” “Disable”’
xorg.puts’EndSection’
end
xorg.close