[augeas-devel] [PATCH 2/6] Grub: parse kernel and module arguments

David Lutterkort lutter at redhat.com
Thu Apr 9 23:17:05 UTC 2009


---
 lenses/grub.aug            |   45 ++++++++++++++++++++++++++++++-------------
 lenses/tests/test_grub.aug |   17 ++++++++++-----
 2 files changed, 42 insertions(+), 20 deletions(-)

diff --git a/lenses/grub.aug b/lenses/grub.aug
index ccfcc7e..8015a31 100644
--- a/lenses/grub.aug
+++ b/lenses/grub.aug
@@ -8,19 +8,25 @@ module Grub =
     let value_to_eol = store /[^= \t\n][^\n]*[^= \t\n]|[^= \t\n]/
     let eol = Util.eol
     let del_to_eol = del /[^ \t\n]*/ ""
+    let spc = Util.del_ws_spc
     let opt_ws = Util.del_opt_ws ""
+    let dels (s:string) = Util.del_str s
+    let eq = dels "="
+    let switch (n:string) = dels ("--" . n) . label n
     let value_sep (dflt:string) = del /[ \t]*[ \t=][ \t]*/ dflt
 
+    let command (kw:string) (indent:string) =
+      Util.del_opt_ws indent . key kw
+
     let kw_arg (kw:string) (indent:string) (dflt_sep:string) =
-      [ Util.del_opt_ws indent . key kw . value_sep dflt_sep
-          . value_to_eol . eol ]
+      [ command kw indent . value_sep dflt_sep . value_to_eol . eol ]
 
     let kw_boot_arg (kw:string) = kw_arg kw "\t" " "
     let kw_menu_arg (kw:string) = kw_arg kw "" "="
     let password_arg = [ key "password" .
-      (Util.del_ws_spc . [ Util.del_str "--md5" . label "md5" ])? .
-      Util.del_ws_spc . store (/[^ \t\n]+/ - "--md5") .
-      (Util.del_ws_spc . [ label "file" . store /[^ \t\n]+/ ])? .
+      (spc . [ switch "md5" ])? .
+      spc . store (/[^ \t\n]+/ - "--md5") .
+      (spc . [ label "file" . store /[^ \t\n]+/ ])? .
       eol ]
 
     let kw_pres (kw:string) = [ opt_ws . key kw . del_to_eol . eol ]
@@ -31,11 +37,11 @@ module Grub =
       let color_name = store /[A-Za-z-]+/ in
       let color_spec =
         [ label "foreground" . color_name] .
-        Util.del_str "/" .
+        dels "/" .
         [ label "background" . color_name ] in
       [ opt_ws . key "color" .
-        Util.del_ws_spc . [ label "normal" . color_spec ] .
-        (Util.del_ws_spc . [ label "highlight" . color_spec ])? .
+        spc . [ label "normal" . color_spec ] .
+        (spc . [ label "highlight" . color_spec ])? .
         eol ]
 
     let menu_setting = kw_menu_arg "default"
@@ -50,20 +56,31 @@ module Grub =
 
     let title = del /title[ \t]+/ "title " . value_to_eol . eol
 
-    let module_lines = [ label "modules" .
-                            Util.del_ws "\t" .
-                             Util.del_str "module" . Util.del_ws_spc
-                             . value_to_eol . eol ]
+    (* Parse the file name and args on a kernel or module line *)
+    let kernel_args =
+      let arg = Rx.word - /type|no-mem-option/ in
+      store /\/[^ \t\n]*/ .
+            (spc . [ key arg . (eq . store Rx.no_spaces)?])* . eol
+
+    let module_line =
+      [ command "module" "\t" . spc . kernel_args ]
+
+    let kernel =
+        [ command "kernel" "\t" .
+          (spc .
+             ([switch "type" . eq . store /[a-z]+/]
+             |[switch "no-mem-option"]))* .
+          spc . kernel_args ]
 
     let boot_setting = kw_boot_arg "root"
-                     | kw_boot_arg "kernel"
+                     | kernel
                      | kw_boot_arg "initrd"
                      | kw_boot_arg "rootnoverify"
                      | kw_boot_arg "chainloader"
                      | kw_boot_arg "uuid"
                      | kw_pres "quiet"  (* Seems to be a Ubuntu extension *)
                      | kw_pres "savedefault"
-                     | module_lines
+                     | module_line
 
     let boot = [ label "title" . title . boot_setting* ]
 
diff --git a/lenses/tests/test_grub.aug b/lenses/tests/test_grub.aug
index 4b7818f..e104f35 100644
--- a/lenses/tests/test_grub.aug
+++ b/lenses/tests/test_grub.aug
@@ -51,20 +51,24 @@ title Fedora (2.6.24.3-34.fc8)
     { "hiddenmenu" }
     { "title" = "Fedora (2.6.24.4-64.fc8)"
         { "root" = "(hd0,0)" }
-        { "kernel" = "/vmlinuz-2.6.24.4-64.fc8 ro root=/dev/vg00/lv00" }
+        { "kernel" = "/vmlinuz-2.6.24.4-64.fc8"
+            { "ro" }  { "root" = "/dev/vg00/lv00" } }
         { "initrd" = "/initrd-2.6.24.4-64.fc8.img" } }
     { "title" = "Fedora (2.6.24.3-50.fc8)"
         { "root" = "(hd0,0)" }
-        { "kernel" = "/vmlinuz-2.6.24.3-50.fc8 ro root=/dev/vg00/lv00" }
+        { "kernel" = "/vmlinuz-2.6.24.3-50.fc8"
+            { "ro" } { "root" = "/dev/vg00/lv00" } }
         { "initrd" = "/initrd-2.6.24.3-50.fc8.img" } }
     { "title" = "Fedora (2.6.21.7-3.fc8xen)"
         { "root" = "(hd0,0)" }
         { "kernel" = "/xen.gz-2.6.21.7-3.fc8" }
-        { "modules" = "/vmlinuz-2.6.21.7-3.fc8xen ro root=/dev/vg00/lv00" }
-        { "modules" = "/initrd-2.6.21.7-3.fc8xen.img" } }
+        { "module" = "/vmlinuz-2.6.21.7-3.fc8xen"
+            { "ro" } { "root" = "/dev/vg00/lv00" } }
+        { "module" = "/initrd-2.6.21.7-3.fc8xen.img" } }
     { "title" = "Fedora (2.6.24.3-34.fc8)"
         { "root" = "(hd0,0)" }
-        { "kernel" = "/vmlinuz-2.6.24.3-34.fc8 ro root=/dev/vg00/lv00" }
+        { "kernel" = "/vmlinuz-2.6.24.3-34.fc8"
+            { "ro" } { "root" = "/dev/vg00/lv00" } }
         { "initrd" = "/initrd-2.6.24.3-34.fc8.img" } }
 
   test Grub.lns put conf after set "default" "0" = conf
@@ -105,7 +109,8 @@ initrd\t\t/boot/initrd.img-2.6.18-6-vserver-686
   test Grub.lns get boot_savedefault =
     { "title" = "Debian GNU/Linux, kernel 2.6.18-6-vserver-686"
       { "root" = "(hd0,0)" }
-      { "kernel" = "/boot/vmlinuz-2.6.18-6-vserver-686 root=/dev/md0 ro" }
+      { "kernel" = "/boot/vmlinuz-2.6.18-6-vserver-686"
+          { "root" = "/dev/md0" } { "ro" } }
       { "initrd" = "/boot/initrd.img-2.6.18-6-vserver-686" }
       { "savedefault" } }
 
-- 
1.6.0.6




More information about the augeas-devel mailing list