Blame lenses/shellvars.aug

Packit Service a2ae7a
(*
Packit Service a2ae7a
Module: Shellvars
Packit Service a2ae7a
 Generic lens for shell-script config files like the ones found
Packit Service a2ae7a
 in /etc/sysconfig
Packit Service a2ae7a
Packit Service a2ae7a
About: License
Packit Service a2ae7a
   This file is licenced under the LGPL v2+, like the rest of Augeas.
Packit Service a2ae7a
Packit Service a2ae7a
About: Lens Usage
Packit Service a2ae7a
   To be documented
Packit Service a2ae7a
*)
Packit Service a2ae7a
Packit Service a2ae7a
module Shellvars =
Packit Service a2ae7a
  autoload xfm
Packit Service a2ae7a
Packit Service a2ae7a
  (* Delete a blank line, rather than mapping it *)
Packit Service a2ae7a
  let del_empty = del (Util.empty_generic_re . "\n") "\n"
Packit Service a2ae7a
Packit Service a2ae7a
  let empty   = Util.empty
Packit Service a2ae7a
  let empty_part_re = Util.empty_generic_re . /\n+/
Packit Service a2ae7a
  let eol = del (/[ \t]+|[ \t]*[;\n]/ . empty_part_re*) "\n"
Packit Service a2ae7a
  let semicol_eol = del (/[ \t]*[;\n]/ . empty_part_re*) "\n"
Packit Service a2ae7a
  let brace_eol = del /[ \t\n]+/ "\n"
Packit Service a2ae7a
Packit Service a2ae7a
  let key_re = /[A-Za-z0-9_][-A-Za-z0-9_]*(\[[0-9A-Za-z_,]+\])?/ - ("unset" | "export")
Packit Service a2ae7a
  let matching_re = "${!" . key_re . /[\*@]\}/
Packit Service a2ae7a
  let eq = Util.del_str "="
Packit Service a2ae7a
Packit Service a2ae7a
  let eol_for_comment = del /([ \t]*\n)([ \t]*(#[ \t]*)?\n)*/ "\n"
Packit Service a2ae7a
  let comment = Util.comment_generic_seteol /[ \t]*#[ \t]*/ " # " eol_for_comment
Packit Service a2ae7a
  (* comment_eol in shell MUST begin with a space *)
Packit Service a2ae7a
  let comment_eol = Util.comment_generic_seteol /[ \t]+#[ \t]*/ " # " eol_for_comment
Packit Service a2ae7a
  let comment_or_eol = comment_eol | semicol_eol
Packit Service a2ae7a
Packit Service a2ae7a
  let xchgs   = Build.xchgs
Packit Service a2ae7a
  let semicol = del /;?/ ""
Packit Service a2ae7a
Packit Service a2ae7a
  let char  = /[^`;()'"&|\n\\# \t]#*|\\\\./
Packit Service a2ae7a
  let dquot =
Packit Service a2ae7a
       let char = /[^"\\]|\\\\./ | Rx.cl
Packit Service a2ae7a
    in "\"" . char* . "\""                    (* " Emacs, relax *)
Packit Service a2ae7a
  let squot = /'[^']*'/
Packit Service a2ae7a
  let bquot = /`[^`\n]+`/
Packit Service a2ae7a
  (* dbquot don't take spaces or semi-colons *)
Packit Service a2ae7a
  let dbquot = /``[^` \t\n;]+``/
Packit Service a2ae7a
  let dollar_assign = /\$\([^\(\)#\n]*\)/
Packit Service a2ae7a
  let dollar_arithm = /\$\(\([^\)#\n]*\)\)/
Packit Service a2ae7a
Packit Service a2ae7a
  let anyquot = (char|dquot|squot|dollar_assign|dollar_arithm)+ | bquot | dbquot
Packit Service a2ae7a
  let sto_to_semicol = store (anyquot . (Rx.cl_or_space . anyquot)*)
Packit Service a2ae7a
Packit Service a2ae7a
  (* Array values of the form '(val1 val2 val3)'. We do not handle empty *)
Packit Service a2ae7a
  (* arrays here because of typechecking headaches. Instead, they are    *)
Packit Service a2ae7a
  (* treated as a simple value                                           *)
Packit Service a2ae7a
  let array =
Packit Service a2ae7a
    let array_value = store anyquot in
Packit Service a2ae7a
    del /\([ \t]*/ "(" . counter "values" .
Packit Service a2ae7a
      [ seq "values" . array_value ] .
Packit Service a2ae7a
      [ del /[ \t\n]+/ " " . seq "values" . array_value ] *
Packit Service a2ae7a
      . del /[ \t]*\)/ ")"
Packit Service a2ae7a
Packit Service a2ae7a
  (* Treat an empty list () as a value '()'; that's not quite correct *)
Packit Service a2ae7a
  (* but fairly close.                                                *)
Packit Service a2ae7a
  let simple_value =
Packit Service a2ae7a
    let empty_array = /\([ \t]*\)/ in
Packit Service a2ae7a
      store (anyquot | empty_array)?
Packit Service a2ae7a
Packit Service a2ae7a
  let export = [ key "export" . Util.del_ws_spc ]
Packit Service a2ae7a
  let kv = Util.indent . export? . key key_re
Packit Service a2ae7a
           . eq . (simple_value | array)
Packit Service a2ae7a
Packit Service a2ae7a
  let var_action (name:string) =
Packit Service a2ae7a
    Util.indent . del name name . Util.del_ws_spc
Packit Service a2ae7a
    . label ("@" . name) . counter "var_action"
Packit Service a2ae7a
    . Build.opt_list [ seq "var_action" . store (key_re | matching_re) ] Util.del_ws_spc
Packit Service a2ae7a
Packit Service a2ae7a
  let unset = var_action "unset"
Packit Service a2ae7a
  let bare_export = var_action "export"
Packit Service a2ae7a
Packit Service a2ae7a
  let source =
Packit Service a2ae7a
    Util.indent
Packit Service a2ae7a
    . del /\.|source/ "." . label ".source"
Packit Service a2ae7a
    . Util.del_ws_spc . store /[^;=# \t\n]+/
Packit Service a2ae7a
Packit Service a2ae7a
  let shell_builtin_cmds = "ulimit" | "shift" | "exit"
Packit Service a2ae7a
Packit Service a2ae7a
  let eval =
Packit Service a2ae7a
    Util.indent . Util.del_str "eval" . Util.del_ws_spc
Packit Service a2ae7a
    . label "@eval" . store anyquot
Packit Service a2ae7a
Packit Service a2ae7a
  let alias =
Packit Service a2ae7a
    Util.indent . Util.del_str "alias" . Util.del_ws_spc
Packit Service a2ae7a
    . label "@alias" . store key_re . eq
Packit Service a2ae7a
    . [ label "value" . store anyquot ]
Packit Service a2ae7a
Packit Service a2ae7a
  let builtin =
Packit Service a2ae7a
    Util.indent . label "@builtin"
Packit Service a2ae7a
    . store shell_builtin_cmds
Packit Service a2ae7a
    . (Sep.cl_or_space
Packit Service a2ae7a
    . [ label "args" . sto_to_semicol ])?
Packit Service a2ae7a
Packit Service a2ae7a
  let keyword (kw:string) = Util.indent . Util.del_str kw
Packit Service a2ae7a
  let keyword_label (kw:string) (lbl:string) = keyword kw . label lbl
Packit Service a2ae7a
Packit Service a2ae7a
  let return =
Packit Service a2ae7a
    Util.indent . label "@return"
Packit Service a2ae7a
    . Util.del_str "return"
Packit Service a2ae7a
    . ( Util.del_ws_spc . store Rx.integer )?
Packit Service a2ae7a
Packit Service a2ae7a
  let action (operator:string) (lbl:string) (sto:lens) =
Packit Service a2ae7a
       let sp = Rx.cl_or_opt_space | /[ \t\n]+/
Packit Service a2ae7a
    in [ del (sp . operator . sp) (" " . operator . " ")
Packit Service a2ae7a
       . label ("@".lbl) . sto ]
Packit Service a2ae7a
Packit Service a2ae7a
  let action_pipe = action "|" "pipe"
Packit Service a2ae7a
  let action_and = action "&&" "and"
Packit Service a2ae7a
  let action_or = action "||" "or"
Packit Service a2ae7a
Packit Service a2ae7a
  let condition =
Packit Service a2ae7a
    let cond (start:string) (end:string) = [ label "type" . store start ]
Packit Service a2ae7a
                                         . Util.del_ws_spc . sto_to_semicol
Packit Service a2ae7a
                                         . Util.del_ws_spc . Util.del_str end
Packit Service a2ae7a
                                         . ( action_and sto_to_semicol | action_or sto_to_semicol )*
Packit Service a2ae7a
    in Util.indent . label "@condition" . (cond "[" "]" | cond "[[" "]]")
Packit Service a2ae7a
Packit Service a2ae7a
  (* Entry types *)
Packit Service a2ae7a
  let entry_eol_item (item:lens) = [ item . comment_or_eol ]
Packit Service a2ae7a
  let entry_item (item:lens) = [ item ]
Packit Service a2ae7a
Packit Service a2ae7a
  let entry_eol_nocommand =
Packit Service a2ae7a
      entry_eol_item source
Packit Service a2ae7a
        | entry_eol_item kv
Packit Service a2ae7a
        | entry_eol_item unset
Packit Service a2ae7a
        | entry_eol_item bare_export
Packit Service a2ae7a
        | entry_eol_item builtin
Packit Service a2ae7a
        | entry_eol_item return
Packit Service a2ae7a
        | entry_eol_item condition
Packit Service a2ae7a
        | entry_eol_item eval
Packit Service a2ae7a
        | entry_eol_item alias
Packit Service a2ae7a
Packit Service a2ae7a
  let entry_noeol_nocommand =
Packit Service a2ae7a
      entry_item source
Packit Service a2ae7a
        | entry_item kv
Packit Service a2ae7a
        | entry_item unset
Packit Service a2ae7a
        | entry_item bare_export
Packit Service a2ae7a
        | entry_item builtin
Packit Service a2ae7a
        | entry_item return
Packit Service a2ae7a
        | entry_item condition
Packit Service a2ae7a
        | entry_item eval
Packit Service a2ae7a
        | entry_item alias
Packit Service a2ae7a
Packit Service a2ae7a
  (* Command *)
Packit Service a2ae7a
  let rec command =
Packit Service a2ae7a
       let env = [ key key_re . eq . store anyquot . Sep.cl_or_space ]
Packit Service a2ae7a
    in let reserved_key = /exit|shift|return|ulimit|unset|export|source|\.|if|for|select|while|until|then|else|fi|done|case|eval|alias/
Packit Service a2ae7a
    in let word = /\$?[-A-Za-z0-9_.\/]+/
Packit Service a2ae7a
    in let entry_eol = entry_eol_nocommand | entry_eol_item command
Packit Service a2ae7a
    in let entry_noeol = entry_noeol_nocommand | entry_item command
Packit Service a2ae7a
    in let entry = entry_eol | entry_noeol
Packit Service a2ae7a
    in let pipe = action_pipe (entry_eol_item command | entry_item command)
Packit Service a2ae7a
    in let and = action_and entry
Packit Service a2ae7a
    in let or = action_or entry
Packit Service a2ae7a
    in Util.indent . label "@command" . env* . store (word - reserved_key)
Packit Service a2ae7a
     . [ Sep.cl_or_space . label "@arg" . sto_to_semicol]?
Packit Service a2ae7a
     . ( pipe | and | or )?
Packit Service a2ae7a
Packit Service a2ae7a
  let entry_eol = entry_eol_nocommand
Packit Service a2ae7a
                | entry_eol_item command
Packit Service a2ae7a
Packit Service a2ae7a
  let entry_noeol = entry_noeol_nocommand
Packit Service a2ae7a
                  | entry_item command
Packit Service a2ae7a
Packit Service a2ae7a
(************************************************************************
Packit Service a2ae7a
 * Group:                 CONDITIONALS AND LOOPS
Packit Service a2ae7a
 *************************************************************************)
Packit Service a2ae7a
Packit Service a2ae7a
  let generic_cond_start (start_kw:string) (lbl:string)
Packit Service a2ae7a
                         (then_kw:string) (contents:lens) =
Packit Service a2ae7a
      keyword_label start_kw lbl . Sep.space
Packit Service a2ae7a
      . sto_to_semicol
Packit Service a2ae7a
      . ( action_and sto_to_semicol | action_or sto_to_semicol )*
Packit Service a2ae7a
      . semicol_eol
Packit Service a2ae7a
      . keyword then_kw . eol
Packit Service a2ae7a
      . contents
Packit Service a2ae7a
Packit Service a2ae7a
  let generic_cond (start_kw:string) (lbl:string)
Packit Service a2ae7a
                       (then_kw:string) (contents:lens) (end_kw:string) =
Packit Service a2ae7a
      [ generic_cond_start start_kw lbl then_kw contents
Packit Service a2ae7a
        . keyword end_kw . comment_or_eol ]
Packit Service a2ae7a
Packit Service a2ae7a
  let cond_if (entry:lens) =
Packit Service a2ae7a
    let elif = [ generic_cond_start "elif" "@elif" "then" entry+ ] in
Packit Service a2ae7a
    let else = [ keyword_label "else" "@else" . eol . entry+ ] in
Packit Service a2ae7a
    generic_cond "if" "@if" "then" (entry+ . elif* . else?) "fi"
Packit Service a2ae7a
Packit Service a2ae7a
  let loop_for (entry:lens) =
Packit Service a2ae7a
    generic_cond "for" "@for" "do" entry+ "done"
Packit Service a2ae7a
Packit Service a2ae7a
  let loop_while (entry:lens) =
Packit Service a2ae7a
    generic_cond "while" "@while" "do" entry+ "done"
Packit Service a2ae7a
Packit Service a2ae7a
  let loop_until (entry:lens) =
Packit Service a2ae7a
    generic_cond "until" "@until" "do" entry+ "done"
Packit Service a2ae7a
Packit Service a2ae7a
  let loop_select (entry:lens) =
Packit Service a2ae7a
    generic_cond "select" "@select" "do" entry+ "done"
Packit Service a2ae7a
Packit Service a2ae7a
  let case (entry:lens) (entry_noeol:lens) =
Packit Service a2ae7a
       let pattern = [ label "@pattern" . sto_to_semicol . Sep.opt_space ]
Packit Service a2ae7a
    in let case_entry = [ label "@case_entry"
Packit Service a2ae7a
                       . Util.indent . pattern
Packit Service a2ae7a
                       . (Util.del_str "|" . Sep.opt_space . pattern)*
Packit Service a2ae7a
                       . Util.del_str ")" . eol
Packit Service a2ae7a
                       . entry* . entry_noeol?
Packit Service a2ae7a
                       . Util.indent . Util.del_str ";;" . eol ] in
Packit Service a2ae7a
      [ keyword_label "case" "@case" . Sep.space
Packit Service a2ae7a
        . store (char+ | ("\"" . char+ . "\""))
Packit Service a2ae7a
        . del /[ \t\n]+/ " " . Util.del_str "in" . eol
Packit Service a2ae7a
        . (empty* . comment* . case_entry)*
Packit Service a2ae7a
        . empty* . comment*
Packit Service a2ae7a
        . keyword "esac" . comment_or_eol ]
Packit Service a2ae7a
Packit Service a2ae7a
  let subshell (entry:lens) =
Packit Service a2ae7a
    [ Util.indent . label "@subshell"
Packit Service a2ae7a
    . Util.del_str "{" . brace_eol
Packit Service a2ae7a
    . entry+
Packit Service a2ae7a
    . Util.indent . Util.del_str "}" . eol ]
Packit Service a2ae7a
Packit Service a2ae7a
  let function (entry:lens) (start_kw:string) (end_kw:string) =
Packit Service a2ae7a
    [ Util.indent . label "@function"
Packit Service a2ae7a
    . del /(function[ \t]+)?/ ""
Packit Service a2ae7a
    . store Rx.word . del /[ \t]*\(\)/ "()"
Packit Service a2ae7a
    . (comment_eol|brace_eol) . Util.del_str start_kw . brace_eol
Packit Service a2ae7a
    . entry+
Packit Service a2ae7a
    . Util.indent . Util.del_str end_kw . eol ]
Packit Service a2ae7a
Packit Service a2ae7a
  let rec rec_entry =
Packit Service a2ae7a
    let entry = comment | entry_eol | rec_entry in
Packit Service a2ae7a
        cond_if entry
Packit Service a2ae7a
      | loop_for entry
Packit Service a2ae7a
      | loop_select entry
Packit Service a2ae7a
      | loop_while entry
Packit Service a2ae7a
      | loop_until entry
Packit Service a2ae7a
      | case entry entry_noeol
Packit Service a2ae7a
      | function entry "{" "}"
Packit Service a2ae7a
      | function entry "(" ")"
Packit Service a2ae7a
      | subshell entry
Packit Service a2ae7a
Packit Service a2ae7a
  let lns_norec = del_empty* . (comment | entry_eol) *
Packit Service a2ae7a
Packit Service a2ae7a
  let lns = del_empty* . (comment | entry_eol | rec_entry) *
Packit Service a2ae7a
Packit Service a2ae7a
  let sc_incl (n:string) = (incl ("/etc/sysconfig/" . n))
Packit Service a2ae7a
  let sc_excl (n:string) = (excl ("/etc/sysconfig/" . n))
Packit Service a2ae7a
Packit Service a2ae7a
  let filter_sysconfig =
Packit Service a2ae7a
      sc_incl "*" .
Packit Service a2ae7a
      sc_excl "anaconda" .
Packit Service a2ae7a
      sc_excl "bootloader" .
Packit Service a2ae7a
      sc_excl "hw-uuid" .
Packit Service a2ae7a
      sc_excl "hwconf" .
Packit Service a2ae7a
      sc_excl "ip*tables" .
Packit Service a2ae7a
      sc_excl "ip*tables.save" .
Packit Service a2ae7a
      sc_excl "kernel" .
Packit Service a2ae7a
      sc_excl "*.pub" .
Packit Service a2ae7a
      sc_excl "sysstat.ioconf" .
Packit Service a2ae7a
      sc_excl "system-config-firewall" .
Packit Service a2ae7a
      sc_excl "system-config-securitylevel" .
Packit Service a2ae7a
      sc_incl "network/config" .
Packit Service a2ae7a
      sc_incl "network/dhcp" .
Packit Service a2ae7a
      sc_incl "network/dhcp6r" .
Packit Service a2ae7a
      sc_incl "network/dhcp6s" .
Packit Service a2ae7a
      sc_incl "network/ifcfg-*" .
Packit Service a2ae7a
      sc_incl "network/if-down.d/*" .
Packit Service a2ae7a
      sc_incl "network/ifroute-*" .
Packit Service a2ae7a
      sc_incl "network/if-up.d/*" .
Packit Service a2ae7a
      sc_excl "network/if-up.d/SuSEfirewall2" .
Packit Service a2ae7a
      sc_incl "network/providers/*" .
Packit Service a2ae7a
      sc_excl "network-scripts" .
Packit Service a2ae7a
      sc_incl "network-scripts/ifcfg-*" .
Packit Service a2ae7a
      sc_excl "rhn" .
Packit Service a2ae7a
      sc_incl "rhn/allowed-actions/*" .
Packit Service a2ae7a
      sc_excl "rhn/allowed-actions/script" .
Packit Service a2ae7a
      sc_incl "rhn/allowed-actions/script/*" .
Packit Service a2ae7a
      sc_incl "rhn/rhnsd" .
Packit Service a2ae7a
      sc_excl "SuSEfirewall2.d" .
Packit Service a2ae7a
      sc_incl "SuSEfirewall2.d/cobbler" .
Packit Service a2ae7a
      sc_incl "SuSEfirewall2.d/services/*" .
Packit Service a2ae7a
      sc_excl "SuSEfirewall2.d/services/TEMPLATE" .
Packit Service a2ae7a
      sc_excl "*.systemd"
Packit Service a2ae7a
Packit Service a2ae7a
  let filter_default = incl "/etc/default/*"
Packit Service a2ae7a
                     . excl "/etc/default/grub_installdevice*"
Packit Service a2ae7a
                     . excl "/etc/default/rmt"
Packit Service a2ae7a
                     . excl "/etc/default/star"
Packit Service a2ae7a
                     . excl "/etc/default/whoopsie"
Packit Service a2ae7a
                     . incl "/etc/profile"
Packit Service a2ae7a
                     . incl "/etc/profile.d/*"
Packit Service a2ae7a
                     . excl "/etc/profile.d/*.csh"
Packit Service a2ae7a
                     . excl "/etc/profile.d/csh.local"
Packit Service a2ae7a
  let filter_misc    = incl "/etc/arno-iptables-firewall/debconf.cfg"
Packit Service a2ae7a
                     . incl "/etc/conf.d/*"
Packit Service a2ae7a
                     . incl "/etc/cron-apt/config"
Packit Service a2ae7a
                     . incl "/etc/environment"
Packit Service a2ae7a
                     . incl "/etc/firewalld/firewalld.conf"
Packit Service a2ae7a
                     . incl "/etc/blkid.conf"
Packit Service a2ae7a
                     . incl "/etc/adduser.conf"
Packit Service a2ae7a
                     . incl "/etc/cowpoke.conf"
Packit Service a2ae7a
                     . incl "/etc/cvs-cron.conf"
Packit Service a2ae7a
                     . incl "/etc/cvs-pserver.conf"
Packit Service a2ae7a
                     . incl "/etc/devscripts.conf"
Packit Service a2ae7a
                     . incl "/etc/kamailio/kamctlrc"
Packit Service a2ae7a
                     . incl "/etc/lbu/lbu.conf"
Packit Service a2ae7a
                     . incl "/etc/lintianrc"
Packit Service a2ae7a
                     . incl "/etc/lsb-release"
Packit Service a2ae7a
                     . incl "/etc/os-release"
Packit Service a2ae7a
                     . incl "/etc/periodic.conf"
Packit Service a2ae7a
                     . incl "/etc/popularity-contest.conf"
Packit Service a2ae7a
                     . incl "/etc/rc.conf"
Packit Service a2ae7a
                     . incl "/etc/rc.conf.d/*"
Packit Service a2ae7a
                     . incl "/etc/rc.conf.local"
Packit Service a2ae7a
                     . incl "/etc/selinux/config"
Packit Service a2ae7a
                     . incl "/etc/ucf.conf"
Packit Service a2ae7a
                     . incl "/etc/locale.conf"
Packit Service a2ae7a
                     . incl "/etc/vconsole.conf"
Packit Service a2ae7a
                     . incl "/etc/byobu/*"
Packit Service a2ae7a
Packit Service a2ae7a
  let filter = filter_sysconfig
Packit Service a2ae7a
             . filter_default
Packit Service a2ae7a
             . filter_misc
Packit Service a2ae7a
             . Util.stdexcl
Packit Service a2ae7a
Packit Service a2ae7a
  let xfm = transform lns filter
Packit Service a2ae7a
Packit Service a2ae7a
(* Local Variables: *)
Packit Service a2ae7a
(* mode: caml       *)
Packit Service a2ae7a
(* End:             *)