1(*
2Module: cgconfig
3    Parses /etc/cgconfig.conf
4
5Author:
6    Ivana Hutarova Varekova <varekova@redhat.com>
7    Raphael Pinson          <raphink@gmail.com>
8
9About: Licence
10    This file is licensed under the LGPL v2+, like the rest of Augeas.
11
12About: Lens Usage
13    Sample usage of this lens in augtool
14        * print all mounted cgroups
15           print /files/etc/cgconfig.conf/mount
16
17About: Configuration files
18    This lens applies to /etc/cgconfig.conf. See <filter>.
19 *)
20
21module Cgconfig =
22   autoload xfm
23
24   let indent  = Util.indent
25   let eol     = Util.eol
26   let comment = Util.comment
27   let empty   = Util.empty
28
29   let id        = /[a-zA-Z0-9_\/.-]+/
30   let name      = /[^#= \n\t{}\/]+/
31   let cont_name = /(cpuacct|cpu|devices|ns|cpuset|memory|freezer|net_cls|blkio|hugetlb|perf_event)/
32   let role_name = /(admin|task)/
33   let id_name   = /(uid|gid|fperm|dperm)/
34   let address   = /[^#; \n\t{}]+/
35   let qaddress  = address|/"[^#;"\n\t{}]+"/
36
37   let lbracket = del /[ \t\n]*\{/ " {"
38   let rbracket = del /[ \t]*\}/ "}"
39   let eq       = indent . Util.del_str "=" . indent
40
41(******************************************
42 * Function to deal with abc=def; entries
43 ******************************************)
44
45   let key_value (key_rx:regexp) (val_rx:regexp) =
46     [ indent . key key_rx . eq . store val_rx
47         . indent . Util.del_str ";" ]
48
49   (* Function to deal with bracketted entries *)
50   let brack_entry_base (lnsa:lens) (lnsb:lens) =
51     [ indent . lnsa . lbracket . lnsb . rbracket ]
52
53   let brack_entry_key (kw:regexp) (lns:lens) =
54     let lnsa = key kw in
55     brack_entry_base lnsa lns
56
57   let brack_entry (kw:regexp) (lns:lens) =
58     let full_lns = (lns | comment | empty)* in
59     brack_entry_key kw full_lns
60
61(******************************************
62 * control groups
63 ******************************************)
64
65   let permission_setting = key_value id_name address
66
67(* task setting *)
68   let t_info =  brack_entry "task" permission_setting
69
70(* admin setting *)
71   let a_info =  brack_entry "admin" permission_setting
72
73(* permissions setting *)
74   let perm_info =
75     let ce = (comment|empty)* in
76     let perm_info_lns = ce .
77       ((t_info . ce . (a_info . ce)?)
78       |(a_info . ce . (t_info . ce)?))? in
79     brack_entry_key "perm" perm_info_lns
80
81   let variable_setting = key_value name qaddress
82
83(* controllers setting *)
84   let controller_info =
85     let lnsa = label "controller" . store cont_name in
86     let lnsb = ( variable_setting | comment | empty ) * in
87     brack_entry_base lnsa lnsb
88
89(* group { ... } *)
90   let group_data  =
91     let lnsa = key "group" . Util.del_ws_spc . store id in
92     let lnsb = ( perm_info | controller_info | comment | empty )* in
93     brack_entry_base lnsa lnsb
94
95
96(*************************************************
97 * mount point
98 *************************************************)
99
100(* controller = mount_point; *)
101   let mount_point = key_value name address
102
103(* mount { .... } *)
104   let mount_data = brack_entry "mount" mount_point
105
106
107(****************************************************
108 * namespace
109 ****************************************************)
110
111(* controller = cgroup; *)
112   let namespace_instance = key_value name address
113
114
115(* namespace { .... } *)
116   let namespace = brack_entry "namespace" namespace_instance
117
118   let lns =  ( comment | empty | mount_data | group_data | namespace )*
119
120   let xfm = transform lns (incl "/etc/cgconfig.conf")
121