• editing file in ruby

    From mohan.mohta@gmail.com@21:1/5 to All on Thu Jul 19 14:49:08 2018
    Hello
    I am trying to update /boot/grub/grub.conf
    I need to disable huge page on the server and the way to do it is adding the following parameter at the end of the line which specifies which kernel boots up
    transparent_hugepage=never

    Can you let me know how can this be done via ruby

    Sample file

    # grub.conf generated by anaconda
    #
    # Note that you do not have to rerun grub after making changes to this file
    # NOTICE: You have a /boot partition. This means that
    # all kernel and initrd paths are relative to /boot/, eg.
    # root (hd0,0)
    # kernel /vmlinuz-version ro root=/dev/mapper/rootvg-lv_root
    # initrd /initrd-[generic-]version.img
    #boot=/dev/sda
    default=0
    timeout=5
    hiddenmenu
    title Red Hat Enterprise Linux Server (2.6.32-696.23.1.el6.x86_64)
    root (hd0,0)
    kernel /vmlinuz-2.6.32-696.23.1.el6.x86_64 ro root=/dev/mapper/rootvg-lv_root nomodeset rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=768M rd_NO_DM KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=rootvg/lv_root transparent_
    hugepage=never
    initrd /initramfs-2.6.32-696.23.1.el6.x86_64.img
    title Red Hat Enterprise Linux Server (2.6.32-696.18.7.el6.x86_64)
    root (hd0,0)
    kernel /vmlinuz-2.6.32-696.18.7.el6.x86_64 ro root=/dev/mapper/rootvg-lv_root nomodeset rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=768M rd_NO_DM KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=rootvg/lv_root transparent_
    hugepage=never
    initrd /initramfs-2.6.32-696.18.7.el6.x86_64.img

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Mohan Mohta@21:1/5 to Mohan Mohta on Sat Jul 21 08:33:08 2018
    Hello
    I wrote a program but what beats me is the print works fine and gives me the expected output fir it does not write the same to the file

    File.open("/tmp/grub.conf","r").each_line do |line|
    file_boot=File.open("/tmp/bootfile","w")
    data = line.split(" ")
    if data[0] == "kernel"
    data_len=data.length
    if data[data_len-1].strip == " transparent_hugepage=never"
    file_boot.write(line)
    print line
    else
    line1=line.tr("\n","")+" transparent_hugepage=never"+"\n"
    file_boot.write(line1)
    print line1
    end
    else
    file_boot.write(line)
    print line
    end
    end

    Output Printed
    ===============
    # grub.conf generated by anaconda
    #
    # Note that you do not have to rerun grub after making changes to this file
    # NOTICE: You have a /boot partition. This means that
    # all kernel and initrd paths are relative to /boot/, eg.
    # root (hd0,0)
    # kernel /vmlinuz-version ro root=/dev/mapper/rootvg-lv_root
    # initrd /initrd-[generic-]version.img
    #boot=/dev/sda
    default=0
    timeout=5
    splashimage=(hd0,0)/grub/splash.xpm.gz
    hiddenmenu
    title Red Hat Enterprise Linux Server (2.6.32-696.23.1.el6.x86_64)
    root (hd0,0)
    kernel /vmlinuz-2.6.32-696.23.1.el6.x86_64 ro root=/dev/mapper/rootvg-lv_root rd_LVM_LV=rootvg/lv_root rd_NO_LUKS rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto rhgb quiet elevator=noop
    transparent_hugepage=never transparent_hugepage=never
    initrd /initramfs-2.6.32-696.23.1.el6.x86_64.img
    title Red Hat Enterprise Linux Server (2.6.32-696.18.7.el6.x86_64)
    root (hd0,0)
    kernel /vmlinuz-2.6.32-696.18.7.el6.x86_64 ro root=/dev/mapper/rootvg-lv_root rd_LVM_LV=rootvg/lv_root rd_NO_LUKS rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto rhgb quiet elevator=noop
    transparent_hugepage=never transparent_hugepage=never
    initrd /initramfs-2.6.32-696.18.7.el6.x86_64.img
    title Red Hat Enterprise Linux Server (2.6.32-696.3.1.el6.x86_64)
    root (hd0,0)
    kernel /vmlinuz-2.6.32-696.3.1.el6.x86_64 ro root=/dev/mapper/rootvg-lv_root rd_LVM_LV=rootvg/lv_root rd_NO_LUKS rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto rhgb quiet elevator=noop
    transparent_hugepage=never
    initrd /initramfs-2.6.32-696.3.1.el6.x86_64.img


    Stored in file
    ==============

    initrd /initramfs-2.6.32-696.3.1.el6.x86_64.img t=/dev/mapper/rootvg-lv_root rd_LVM_LV=rootvg/lv_root rd_NO_LUKS rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto rhgb quiet elevator=noop transparent_hugepage=never
    transparent_hugepage=never



    On Thursday, July 19, 2018 at 4:49:14 PM UTC-5, Mohan Mohta wrote:
    Hello
    I am trying to update /boot/grub/grub.conf
    I need to disable huge page on the server and the way to do it is adding the following parameter at the end of the line which specifies which kernel boots up
    transparent_hugepage=never

    Can you let me know how can this be done via ruby

    Sample file

    # grub.conf generated by anaconda
    #
    # Note that you do not have to rerun grub after making changes to this file
    # NOTICE: You have a /boot partition. This means that
    # all kernel and initrd paths are relative to /boot/, eg.
    # root (hd0,0)
    # kernel /vmlinuz-version ro root=/dev/mapper/rootvg-lv_root
    # initrd /initrd-[generic-]version.img
    #boot=/dev/sda
    default=0
    timeout=5
    hiddenmenu
    title Red Hat Enterprise Linux Server (2.6.32-696.23.1.el6.x86_64)
    root (hd0,0)
    kernel /vmlinuz-2.6.32-696.23.1.el6.x86_64 ro root=/dev/mapper/rootvg-lv_root nomodeset rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=768M rd_NO_DM KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=rootvg/lv_root transparent_
    hugepage=never
    initrd /initramfs-2.6.32-696.23.1.el6.x86_64.img
    title Red Hat Enterprise Linux Server (2.6.32-696.18.7.el6.x86_64)
    root (hd0,0)
    kernel /vmlinuz-2.6.32-696.18.7.el6.x86_64 ro root=/dev/mapper/rootvg-lv_root nomodeset rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=768M rd_NO_DM KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=rootvg/lv_root transparent_
    hugepage=never
    initrd /initramfs-2.6.32-696.18.7.el6.x86_64.img

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Robert Klemme@21:1/5 to Mohan Mohta on Sat Jul 21 18:25:06 2018
    On 21.07.2018 17:33, Mohan Mohta wrote:
    Hello
    I wrote a program but what beats me is the print works fine and gives me the expected output fir it does not write the same to the file

    File.open("/tmp/grub.conf","r").each_line do |line|
    file_boot=File.open("/tmp/bootfile","w")

    You are not closing this file properly.

    Here's how I'd do it

    File.open '/tmp/bootfile', 'w' do |out|
    File.foreach '/tmp/grub.conf' do |line|
    if /^\s+kernel\b/ =~ line
    line.gsub! /transparent_hugepage=\w+/, ''
    line.sub! /\s+$/, ''
    line << ' transparent_hugepage=never'
    end

    out.puts line
    end
    end

    Cheers

    robert

    --
    remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Mohan Mohta@21:1/5 to Robert Klemme on Sun Jul 22 12:51:22 2018
    On Saturday, July 21, 2018 at 11:25:15 AM UTC-5, Robert Klemme wrote:
    On 21.07.2018 17:33, Mohan Mohta wrote:
    Hello
    I wrote a program but what beats me is the print works fine and gives me the expected output fir it does not write the same to the file

    File.open("/tmp/grub.conf","r").each_line do |line|
    file_boot=File.open("/tmp/bootfile","w")

    You are not closing this file properly.

    Here's how I'd do it

    File.open '/tmp/bootfile', 'w' do |out|
    File.foreach '/tmp/grub.conf' do |line|
    if /^\s+kernel\b/ =~ line
    line.gsub! /transparent_hugepage=\w+/, ''
    line.sub! /\s+$/, ''
    line << ' transparent_hugepage=never'
    end

    out.puts line
    end
    end

    Cheers

    robert

    --
    remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/

    Thanks for your response.
    Here is what I did which worked.
    The conclusion I drew was when I opened the /tmp/bootfile file and yes the closing as well
    so if I opened with before grub.conf it worked

    file_boot=File.open("/tmp/bootfile","w")
    File.open("/boot/grub/grub.conf","r").each_line do |line|
    data = line.split(" ")
    if data[0] == "kernel"
    data_len=data.length
    tot=data_len-1
    check=0
    (0..tot).each do |cntr|
    if data[cntr].strip == "transparent_hugepage=never"
    file_boot.write(line)
    check=1
    end
    end
    if check == 0
    line1=line.tr("\n","")+" transparent_hugepage=never\n"
    file_boot.write(line1)
    end
    else
    file_boot.write(line)
    end
    end
    file_boot.close

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Robert Klemme@21:1/5 to Mohan Mohta on Mon Jul 23 22:41:29 2018
    On 22.07.2018 21:51, Mohan Mohta wrote:

    Thanks for your response.

    You are welcome. But I am not sure you understood my point:

    Here is what I did which worked.
    The conclusion I drew was when I opened the /tmp/bootfile file and yes the closing as well
    so if I opened with before grub.conf it worked

    The issue is not the order of open operations but that you did not close file_boot at all.

    file_boot=File.open("/tmp/bootfile","w")
    [...] > file_boot.close

    You better use the block form of File.open because it is way more robust
    than what you are doing here.

    Cheers

    robert


    --
    remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)