[augeas-devel] Re: A few lenses... [logrotate.aug]
Raphaël Pinson
raphink at gmail.com
Fri Jul 11 10:13:04 UTC 2008
Hi,
Here is yet a new version. This one addresses the (sep_tab)? issue :
- in most cases, I passed the indent as a parameter to functions, so that
the default indent level would be "" outside of rules and "\t" inside rules
- in the case of the rule title, I used (sep_spc)? instead
As for other lenses, I sometimes fail to insert values before paths. E.g.
====================================================
augtool> print /files/etc/logrotate.d/apache2/
/files/etc/logrotate.d/apache2
/files/etc/logrotate.d/apache2/rule = "/var/log/apache2/*.log"
/files/etc/logrotate.d/apache2/rule/schedule = "weekly"
/files/etc/logrotate.d/apache2/rule/missingok = "missingok"
/files/etc/logrotate.d/apache2/rule/rotate = "52"
/files/etc/logrotate.d/apache2/rule/compress = "compress"
/files/etc/logrotate.d/apache2/rule/delaycompress = "delaycompress"
/files/etc/logrotate.d/apache2/rule/ifempty = "notifempty"
/files/etc/logrotate.d/apache2/rule/create
/files/etc/logrotate.d/apache2/rule/create/mode = "640"
/files/etc/logrotate.d/apache2/rule/create/owner = "root"
/files/etc/logrotate.d/apache2/rule/create/group = "adm"
/files/etc/logrotate.d/apache2/rule/sharedscripts
/files/etc/logrotate.d/apache2/rule/postrotate
/files/etc/logrotate.d/apache2/rule/postrotate/line[1] = "if [ -f
/var/run/apache2.pid ]; then"
/files/etc/logrotate.d/apache2/rule/postrotate/line[2] =
"/etc/init.d/apache2 restart > /dev/null"
/files/etc/logrotate.d/apache2/rule/postrotate/line[3] = "fi"
augtool> ins schedule before /files/etc/logrotate.d/apache2/rule/postrotate
augtool> print /files/etc/logrotate.d/apache2/
/files/etc/logrotate.d/apache2
/files/etc/logrotate.d/apache2/rule = "/var/log/apache2/*.log"
/files/etc/logrotate.d/apache2/rule/schedule[1] = "weekly"
/files/etc/logrotate.d/apache2/rule/missingok = "missingok"
/files/etc/logrotate.d/apache2/rule/rotate = "52"
/files/etc/logrotate.d/apache2/rule/compress = "compress"
/files/etc/logrotate.d/apache2/rule/delaycompress = "delaycompress"
/files/etc/logrotate.d/apache2/rule/ifempty = "notifempty"
/files/etc/logrotate.d/apache2/rule/create
/files/etc/logrotate.d/apache2/rule/create/mode = "640"
/files/etc/logrotate.d/apache2/rule/create/owner = "root"
/files/etc/logrotate.d/apache2/rule/create/group = "adm"
/files/etc/logrotate.d/apache2/rule/sharedscripts
/files/etc/logrotate.d/apache2/rule/schedule[2]
/files/etc/logrotate.d/apache2/rule/postrotate
/files/etc/logrotate.d/apache2/rule/postrotate/line[1] = "if [ -f
/var/run/apache2.pid ]; then"
/files/etc/logrotate.d/apache2/rule/postrotate/line[2] =
"/etc/init.d/apache2 restart > /dev/null"
/files/etc/logrotate.d/apache2/rule/postrotate/line[3] = "fi"
augtool> set /files/etc/logrotate.d/apache2/rule/schedule[2] "daily"
augtool> print /files/etc/logrotate.d/apache2/
/files/etc/logrotate.d/apache2
/files/etc/logrotate.d/apache2/rule = "/var/log/apache2/*.log"
/files/etc/logrotate.d/apache2/rule/schedule[1] = "weekly"
/files/etc/logrotate.d/apache2/rule/missingok = "missingok"
/files/etc/logrotate.d/apache2/rule/rotate = "52"
/files/etc/logrotate.d/apache2/rule/compress = "compress"
/files/etc/logrotate.d/apache2/rule/delaycompress = "delaycompress"
/files/etc/logrotate.d/apache2/rule/ifempty = "notifempty"
/files/etc/logrotate.d/apache2/rule/create
/files/etc/logrotate.d/apache2/rule/create/mode = "640"
/files/etc/logrotate.d/apache2/rule/create/owner = "root"
/files/etc/logrotate.d/apache2/rule/create/group = "adm"
/files/etc/logrotate.d/apache2/rule/sharedscripts
/files/etc/logrotate.d/apache2/rule/schedule[2] = "daily"
/files/etc/logrotate.d/apache2/rule/postrotate
/files/etc/logrotate.d/apache2/rule/postrotate/line[1] = "if [ -f
/var/run/apache2.pid ]; then"
/files/etc/logrotate.d/apache2/rule/postrotate/line[2] =
"/etc/init.d/apache2 restart > /dev/null"
/files/etc/logrotate.d/apache2/rule/postrotate/line[3] = "fi"
This works so far. Now if I try to insert in the beginning of the file ...
augtool> ins schedule before /files/etc/logrotate.d/apache2/rule
augtool> print /files/etc/logrotate.d/apache2/
/files/etc/logrotate.d/apache2
/files/etc/logrotate.d/apache2/rule = "/var/log/apache2/*.log"
/files/etc/logrotate.d/apache2/rule/schedule[1] = "weekly"
/files/etc/logrotate.d/apache2/rule/missingok = "missingok"
/files/etc/logrotate.d/apache2/rule/rotate = "52"
/files/etc/logrotate.d/apache2/rule/compress = "compress"
/files/etc/logrotate.d/apache2/rule/delaycompress = "delaycompress"
/files/etc/logrotate.d/apache2/rule/ifempty = "notifempty"
/files/etc/logrotate.d/apache2/rule/create
/files/etc/logrotate.d/apache2/rule/create/mode = "640"
/files/etc/logrotate.d/apache2/rule/create/owner = "root"
/files/etc/logrotate.d/apache2/rule/create/group = "adm"
/files/etc/logrotate.d/apache2/rule/sharedscripts
/files/etc/logrotate.d/apache2/rule/schedule[2] = "daily"
/files/etc/logrotate.d/apache2/rule/postrotate
/files/etc/logrotate.d/apache2/rule/postrotate/line[1] = "if [ -f
/var/run/apache2.pid ]; then"
/files/etc/logrotate.d/apache2/rule/postrotate/line[2] =
"/etc/init.d/apache2 restart > /dev/null"
/files/etc/logrotate.d/apache2/rule/postrotate/line[3] = "fi"
I don't see the schedule entry, but in the end of the file :
augtool> ins schedule after /files/etc/logrotate.d/apache2/rule
augtool> print /files/etc/logrotate.d/apache2/
/files/etc/logrotate.d/apache2
/files/etc/logrotate.d/apache2/rule = "/var/log/apache2/*.log"
/files/etc/logrotate.d/apache2/rule/schedule[1] = "weekly"
/files/etc/logrotate.d/apache2/rule/missingok = "missingok"
/files/etc/logrotate.d/apache2/rule/rotate = "52"
/files/etc/logrotate.d/apache2/rule/compress = "compress"
/files/etc/logrotate.d/apache2/rule/delaycompress = "delaycompress"
/files/etc/logrotate.d/apache2/rule/ifempty = "notifempty"
/files/etc/logrotate.d/apache2/rule/create
/files/etc/logrotate.d/apache2/rule/create/mode = "640"
/files/etc/logrotate.d/apache2/rule/create/owner = "root"
/files/etc/logrotate.d/apache2/rule/create/group = "adm"
/files/etc/logrotate.d/apache2/rule/sharedscripts
/files/etc/logrotate.d/apache2/rule/schedule[2] = "daily"
/files/etc/logrotate.d/apache2/rule/postrotate
/files/etc/logrotate.d/apache2/rule/postrotate/line[1] = "if [ -f
/var/run/apache2.pid ]; then"
/files/etc/logrotate.d/apache2/rule/postrotate/line[2] =
"/etc/init.d/apache2 restart > /dev/null"
/files/etc/logrotate.d/apache2/rule/postrotate/line[3] = "fi"
/files/etc/logrotate.d/apache2/schedule
augtool> set /files/etc/logrotate.d/apache2/schedule "weekly"
augtool> print /files/etc/logrotate.d/apache2/
/files/etc/logrotate.d/apache2
/files/etc/logrotate.d/apache2/rule = "/var/log/apache2/*.log"
/files/etc/logrotate.d/apache2/rule/schedule[1] = "weekly"
/files/etc/logrotate.d/apache2/rule/missingok = "missingok"
/files/etc/logrotate.d/apache2/rule/rotate = "52"
/files/etc/logrotate.d/apache2/rule/compress = "compress"
/files/etc/logrotate.d/apache2/rule/delaycompress = "delaycompress"
/files/etc/logrotate.d/apache2/rule/ifempty = "notifempty"
/files/etc/logrotate.d/apache2/rule/create
/files/etc/logrotate.d/apache2/rule/create/mode = "640"
/files/etc/logrotate.d/apache2/rule/create/owner = "root"
/files/etc/logrotate.d/apache2/rule/create/group = "adm"
/files/etc/logrotate.d/apache2/rule/sharedscripts
/files/etc/logrotate.d/apache2/rule/schedule[2] = "daily"
/files/etc/logrotate.d/apache2/rule/postrotate
/files/etc/logrotate.d/apache2/rule/postrotate/line[1] = "if [ -f
/var/run/apache2.pid ]; then"
/files/etc/logrotate.d/apache2/rule/postrotate/line[2] =
"/etc/init.d/apache2 restart > /dev/null"
/files/etc/logrotate.d/apache2/rule/postrotate/line[3] = "fi"
/files/etc/logrotate.d/apache2/schedule = "weekly"
It works... Any idea anyone ?
====================================================
(* Logrotate module for Augeas *)
(* Author: Raphael Pinson <raphink at gmail.com> *)
(* *)
(* Supported : *)
(* - defaults *)
(* - rules *)
(* - postrotate entries *)
(* *)
(* Todo : *)
(* *)
module Logrotate =
autoload xfm
let sep_spc = Util.del_ws_spc
let eol = Util.del_str "\n"
let num = /[0-9]+/
let word = /[^,# \n\t{}]+/
(* define comments and empty lines *)
let comment (indent:string) = [ label "comment" . Util.del_str indent .
del /#[ \t]*/ "# " . store /([^ \t\n][^\n]*)?/ . eol ]
let empty = [ del /[ \t]*\n/ "" ]
(* Useful functions *)
let select_to_eol (kw:string) (select:regexp) (indent:string) = [
Util.del_str indent . label kw . store select . eol ]
let value_to_eol (kw:string) (value:regexp) (indent:string ) = [
Util.del_str indent . key kw . sep_spc . store value . eol ]
let flag_to_eol (kw:string) (indent:string) = [
Util.del_str indent . key kw . eol ]
(* Defaults *)
let create (indent:string ) = [ Util.del_str indent . key "create" .
( sep_spc . [ label "mode" . store num ] . sep_spc .
[ label "owner" . store word ] . sep_spc .
[ label "group" . store word ])?
. eol ]
let attrs (indent:string) = select_to_eol "schedule"
/(daily|weekly|monthly)/ indent
| value_to_eol "rotate" num indent
| create indent
| flag_to_eol "nocreate" indent
| value_to_eol "include" word indent
| select_to_eol "missingok" /(no)?missingok/ indent
| select_to_eol "compress" /(no)?compress/ indent
| select_to_eol "delaycompress" /(no)?delaycompress/ indent
| select_to_eol "ifempty" /(not)?ifempty/ indent
| flag_to_eol "sharedscripts" indent
| value_to_eol "size" word indent
| value_to_eol "tabooext" word indent
| value_to_eol "olddir" word indent
| flag_to_eol "noolddir" indent
| value_to_eol "mail" word indent
| flag_to_eol "mailfirst" indent
| flag_to_eol "maillast" indent
| flag_to_eol "nomail" indent
| value_to_eol "errors" word indent
| value_to_eol "extension" word indent
(* Define hooks *)
let endscript_re = /[ \t]*endscript[ \t]*/
let hook_func (func_type:string) = [
del /[ \t]*/ "\t" . key func_type . eol .
[ label "line" . del /[ \t]*/ "" . store (/([^ \t\n][^\n]*)?/ -
endscript_re) . eol ]* .
del (endscript_re . "\n") "\tendscript\n" ]
let hooks = hook_func "postrotate"
| hook_func "prerotate"
(* Define rule *)
let body = Util.del_str "{\n"
. ( comment "\t" | attrs "\t" | hooks | empty )*
. Util.del_str "}\n"
let rule =
[ label "rule" . store word . (sep_spc)? . eol? . body ]
let lns = ( comment "" | empty | attrs "" | rule )*
let filter = incl "/etc/logrotate.d/*"
. incl "/etc/logrotate.conf"
. Util.stdexcl
let xfm = transform lns filter
====================================================
Raphaël
On Wed, Jul 9, 2008 at 11:00 PM, David Lutterkort <lutter at watzmann.net>
wrote:
> On Wed, 2008-07-09 at 11:17 +0200, Raphaël Pinson wrote:
> > Here are the new versions of logrotate.aug and test_logrotate.aug
> >
> > Notes :
> > - I switched back from seq to label for the hook_func lines,
> > because seq would keep increasing the line numbers outside of the
> > context, i.e. postrotate/1, postrotate/2, prerotate/3, prerotate/4,
> > etc., which doesn't make sense. label on the other hand doesn't act
> > this way. Is this a bug in seq ?
>
> When you say 'seq "foo"' you are using a global sequence "foo" that
> keeps increasing while a file is being read. You can reset that sequence
> by using 'counter "foo"', so if you have something like
>
> [ counter "foo" . stuff . [ seq "foo" . more stuff ]* ]*
>
> the inner [ .. ] will start counting from 1 everytime (without the
> 'counter' it keeps increasing globally)
>
> Generally, using a fixed label is preferrable IMHO; the difference
> between one and the other is subtle and has to do with how deleted stuff
> is restored: if you use 'seq', the deleted stuff is tied to that exact
> numeric label, and if you delete node 5, the other nodes will keep their
> exact formatting. When you use 'label "bar"', then deleting 'bar[5]'
> will restore the old bar[6] with the deleted things from the deleted
> bar[5] etc.
>
> > - I didn't touch the sep_tab issue yet
>
> Ok .. that should be a relatively easy fix. Once that's done, I think
> it's ready to be committed.
>
>
> > (* Define hooks *)
> >
> > let endscript_re = /[ \t]*endscript[ \t]*/
> > let hook_func (func_type:string) = [
> > del /[ \t]*/ "\t" . key func_type . eol .
> > [ label "line" . del /[ \t]*/ "" . store (/([^ \t\n][^
> > \n]*)?/ - endscript_re) . eol ]* .
> > del (endscript_re . "\n") "\tendscript\n" ]
>
> Actually, thinking about this more, why not suck the whole script into
> one node instead of splitting it into individual lines ?
>
> David
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/augeas-devel/attachments/20080711/7ec4c3e2/attachment.htm>
More information about the augeas-devel
mailing list