diff options
Diffstat (limited to 'steuermann/specfile.exy')
-rw-r--r-- | steuermann/specfile.exy | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/steuermann/specfile.exy b/steuermann/specfile.exy index cb2aa36..00c7547 100644 --- a/steuermann/specfile.exy +++ b/steuermann/specfile.exy @@ -2,6 +2,7 @@ # Parse a Steuermann Spec file # # This is an exyapps grammer in specfile.exy +import nodes %% parser specfile: @@ -9,37 +10,58 @@ parser specfile: ignore: "#.*\n" token END: "$" + token HOSTGROUP: "HOSTGROUP" + token IF: "IF" token TABLE: "TABLE" token HOST : "HOST" token CMD: "CMD" token OPT: "OPT" token AFTER: "AFTER" + token RUN: "RUN" + token LOCAL: "LOCAL" + token IMPORT: "IMPORT" + token DEBUG: "DEBUG" token name: "[a-zA-Z0-9_.-]+" token STAR: "\*" token cmdname: "[a-zA-Z0-9_.-]+" token tablename: "[a-zA-Z0-9_.-]+" token wildname: "[*?a-zA-Z0-9_.-]+" - token RUN: "RUN" - token LOCAL: "LOCAL" token string: '"[^"]*"' token SLASH: "/" token COLON: ":" - token IMPORT: "IMPORT" + token hostgroup: "@[a-zA-Z0-9_.-]+" + + # watch carefully: none of the keywords are "END" on a line by themselves + token CONDITIONS: 'CONDITIONS[^"]*\n[\s]*END[ \t]*\n' rule start: table_list END {{ return table_list }} - rule table_list: table_section [ table_list ] + rule table_list: table_section + rule table_section: - TABLE tablename {{ table_name = tablename }} - HOST {{ hostlist = [ ] }} - ( - name {{ hostlist.append(name) }} - )+ + DEBUG string {{ print "-->debug: %s"%string }} + | hostgroup_def + | CONDITIONS {{ nodes.declare_conditions( CONDITIONS, self._scanner.filename ) }} + | TABLE tablename {{ table_name = tablename }} HOST {{ hostlist = [ ] }} + ( + name {{ hostlist.append(name) }} + | hostgroup {{ hostlist = hostlist + nodes.get_hostgroup( hostgroup ) }} + )+ command_list - # command_list is a list of (command, pos) where command is the text from the file and pos is the location in the file + # command_list is a list of (command, pos) where command is the text from the file and pos is the location in the file {{ self.data.add_command_list( table_name, hostlist, command_list ) }} - | IMPORT string {{ self.data.import_list.append( string[1:-1] ) }} + | IMPORT string {{ self.data.import_list.append( string[1:-1] ) }} + + ## + rule hostgroup_def : + HOSTGROUP hostgroup ( hostgroup_if<<hostgroup>> )+ + + rule hostgroup_if<<hg>> : + IF name + {{ accept_nodes = nodes.check_condition(name, self._scanner.filename ) }} + COLON ( + name {{ if accept_nodes : nodes.add_hostgroup( hg, name ) }} + )+ rule command_list: # one or more commands, appended together into a list |