Hello,

With Raphael Pinson large help I write a lense for cgconfig.conf configuration
file and test file for it.
(cgconfig.conf file is a part of libcgroup tool -http://libcg.sourceforge.net/)
I'm sending them in attachment.
If there are any problems please ping me.

Thanks,

Ivana Hutarova Varekova

(*
Module: cgconfig
    Parses /etc/cgconfig.conf

Author:
    Ivana Hutarova Varekova <[email protected]>
    Raphael Pinson          <[email protected]>

About: Licence
    This file is licensed under the LGPLv2+, like the rest of Augeas.

About: Lens Usage
    Sample usage of this lens in augtool
        * print all mounted cgroups
           print /files/etc/cgconfig.conf/mount

About: Configuration files
    This lens applies to /etc/cgconfig.conf. See <filter>.
 *)

module Cgconfig =
   autoload xfm

   let indent  = Util.indent
   let eol     = Util.eol
   let comment = Util.comment
   let empty   = Util.empty

   let name      = /[^#= \n\t{}]+/
(*   let cont_name2 = /([^ \n\t\{}]\{1,3\}|[^ \n\t\{}]\{5,\}|[^ \n\t\{}p][^ 
\n\t\{}]\{3\}|[^ \n\t\{e][^ \n\t\{+]\{2\})/ *)
   let cont_name = /(cpuacct|cpu|devices|ns|cpuset|memory|freezer|net_cls)/
   let role_name = /(admin|task)/
   let id_name   = /(uid|gid)/
   let address   = /[^#; \n\t{}]+/

   let lbracket = del /[ \t\n]*\{/ " {"
   let rbracket = del /[ \t]*\}/ "}"

(******************************************
 * Function to deal with abc=def; entries
 ******************************************)

   let key_value (sq:string) (lbla:string) (rxa:regexp) (lblb:string) 
(rxb:regexp) =
                       [ seq sq . indent
                     . [ label lbla  . store rxa ]
                     . indent . Util.del_str "=" . indent
                     . [ label lblb  . store rxb ]
                     . indent . Util.del_str ";"
                       ]

(* Function to deal with bracketted entries *)
   let brack_entry_base (lnsa:lens) (lnsb:lens) =
                 [ indent . lnsa
                    . lbracket
                    . lnsb
                    . rbracket ]

   let brack_entry_key (kw:regexp) (lns:lens) =
                 let lnsa = key kw
                     in brack_entry_base lnsa lns

   let brack_entry (kw:regexp) (lns:lens) =
                 let full_lns = (lns | comment | empty)*
                    in brack_entry_key kw full_lns

(******************************************
 * control groups
 ******************************************)

   let permission_setting = key_value "pv" "role" id_name "value" address

(* task setting *)
   let t_info =  brack_entry "task" permission_setting

(* admin setting *)
   let a_info =  brack_entry "admin" permission_setting

(* permissions setting *)
   let perm_info =
           let perm_info_lns = ( comment | empty ) * . ((t_info . (comment | 
empty)*
                                                     . (a_info . ( comment | 
empty )* )?)
                             | (a_info . (comment | empty)* . (t_info . ( 
comment | empty )* )?) )?
                in brack_entry_key "perm" perm_info_lns

   let variable_setting = key_value "nv" "name" name "value" address

(* controllers setting *)
   let controller_info =
                 let lnsa = label "controller" . store cont_name
                    in let lnsb = ( variable_setting | comment | empty ) *
                       in brack_entry_base lnsa lnsb

(* group { ... } *)
   let group_data  =
                 let lnsa = key "group" . indent . [ label "name"  . store name 
]
                    in let lnsb = ( perm_info | controller_info | comment | 
empty ) *
                       in brack_entry_base lnsa lnsb


(*************************************************
 * mount point
 *************************************************)

(* controller = mount_point; *)
   let mount_point = key_value "mpoint" "controller" name "mount_point" address

(* mount { .... } *)
   let mount_data = brack_entry "mount" mount_point


(****************************************************
 * namespace
 ****************************************************)

(* controller = cgroup; *)
   let namespace_instance = key_value "mpoint" "controller" name "cgroup" 
address


(* namespace { .... } *)
   let namespace = brack_entry "namespace" namespace_instance

   let lns =  ( comment | empty | mount_data | group_data | namespace )*

   let xfm = transform lns (incl "/etc/cgconfig.conf")
module Test_cgconfig =

   let conf="#cgconfig test cofiguration file
mount { 123 = 456; 456 = 789;}
"
   test Cgconfig.lns get conf =
  { "#comment" = "cgconfig test cofiguration file" }
  { "mount"
    { "1"
      { "controller" = "123" }
      { "mount_point" = "456" }
    }
    { "2"
      { "controller" = "456" }
      { "mount_point" = "789" }
    }
  }
  {}



(* white spaces before mount sign *)
   let conf2="
 mount { 123 = 456;}
    mount { 123 = 456;}

mount { 123 = 456;}mount { 123 = 456;}
"
   test Cgconfig.lns get conf2 =
        { }
        {"mount"
           {"1" {"controller" = "123"}
                {"mount_point" = "456"}
           }
        }
        { }
        {"mount"
            {"2" {"controller" = "123"}
                 {"mount_point" = "456"}
            }
        }
        { }
        { }
        {"mount"
           {"3" {"controller" = "123"}
                {"mount_point" = "456"}
           }
        }
        { "mount"
           { "4" { "controller" = "123" }
                 { "mount_point" = "456" }
           }
        }
        { }

   let conf3="#cgconfig test cofiguration file
mount { 123 = 456; 
#eswkh
 456 = 789;}
"
   test Cgconfig.lns get conf3 =
  { "#comment" = "cgconfig test cofiguration file" }
  { "mount"
    { "1"
      { "controller" = "123" }
      { "mount_point" = "456" }
    }
    {}
    { "#comment" = "eswkh" }
    { "2"
      { "controller" = "456" }
      { "mount_point" = "789" }
    }
  }
  {}

  let conf4="#cgconfig test cofiguration file
mount {
123 = 456;1245=456;
}
mount { 323=324;}mount{324=5343;  }# this is a comment
"
   test Cgconfig.lns get conf4 =
      {"#comment" = "cgconfig test cofiguration file" }
      {"mount"
               {  }
               { "1"
                     {"controller" = "123"}
                     {"mount_point" = "456"}
               }
               { "2"
                     { "controller" = "1245" }
                     { "mount_point" = "456" }
               } 
               {  }}
      { }
      { "mount"
               { "3"
                     { "controller" = "323" }
                     { "mount_point" = "324" }
               } }
      { "mount"
               { "4"
                     { "controller" = "324" }
                     { "mount_point" = "5343" }
               } }
      { "#comment" = "this is a comment" }

   let group1="
group user {
        cpuacct {
      lll = jjj;
        }
        cpu {
        }
}"

test Cgconfig.lns get group1 =
{  }
  { "group"
        { "name" = "user" }
    {  }
    { "controller" = "cpuacct"
      {  }
      { "1"
        { "name" = "lll" }
        { "value" = "jjj" }
      }
      {  }
    }
    {  }
    { "controller" = "cpu"
      {  }
    }
    {  }
  }


let group2="
group aa{
     perm {
                 task { }
                 admin { }
      }
}"

test Cgconfig.lns get group2 =
  {  }
  { "group"
    { "name" = "aa" }
    {  }
    { "perm"
      {  }
      { "task" }
      {  }
      { "admin" }
      {  }
    }
    {  }
  }


let group3 ="
group xx/www {
 perm {
        task {
                gid = root;
                uid = root;
        }
        admin {
                gid = aaa;
# no aaa
                uid = aaa;
        }
}
}
"

test Cgconfig.lns get group3 = 
  {  }
  { "group"
    { "name" = "xx/www" }
    {  }
    { "perm"
      {  }
      { "task"
        {  }
        { "1"
          { "role" = "gid" }
          { "value" = "root" }
        }
        {  }
        { "2"
          { "role" = "uid" }
          { "value" = "root" }
        }
        {  }
      }
      {  }
      { "admin"
        {  }
        { "3"
          { "role" = "gid" }
          { "value" = "aaa" }
        }
        {  }
        { "#comment" = "no aaa" }
        { "4"
          { "role" = "uid" }
          { "value" = "aaa" }
        }
        {  }
      }
      {  }
    }
    {  }
  }
  {  }


let group4 ="
#group daemons {
#           cpuacct{
#           }
#}

group daemons/ftp {
                     cpuacct{
                                          }
}

   group daemons/www {
        perm {
                task {
                        uid = root;
                        gid = root;
                }
                admin {
                        uid = root;
                        gid = root;
                }
        }
#       cpu {
#               cpu.shares = 1000;
#       }
}
#
#

  mount {
       devices = /mnt/cgroups/devices;cpuacct = /mnt/cgroups/cpuset;
        cpuset = /mnt/cgroups/cpuset;


        cpu = /mnt/cpu;
#        cpuset = /mnt/cgroups/cpuset2;
}
mount   {
devices = /mnt/cgroups/devices;
#       cpuacct = /mnt/cgroups/cpuacct;
        ns = /mnt/cgroups/ns;
#
}

"

test Cgconfig.lns get group3 =
  {  }
  { "group"
    { "name" = "xx/www" }
    {  }
    { "perm"
      {  }
      { "task"
        {  }
        { "1"
          { "role" = "gid" }
          { "value" = "root" }
        }
        {  }
        { "2"
          { "role" = "uid" }
          { "value" = "root" }
        }
        {  }
      }
      {  }
      { "admin"
        {  }
        { "3"
          { "role" = "gid" }
          { "value" = "aaa" }
        }
        {  }
        { "#comment" = "no aaa" }
        { "4"
          { "role" = "uid" }
          { "value" = "aaa" }
        }
        {  }
      }
      {  }
    }
    {  }
  }
  {  }

_______________________________________________
augeas-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/augeas-devel

Reply via email to