Bacula-users

[Bacula-users] How to parse Bacula conf files

2010-11-01 10:01:35
Subject: [Bacula-users] How to parse Bacula conf files
From: catkins <bacula-forum AT backupcentral DOT com>
To: bacula-users AT lists.sourceforge DOT net
Date: Mon, 01 Nov 2010 09:58:48 -0400
Here's a bash-with-embedded awk scrippet that parses Bacula .conf files.  I 
don't know if it works with all possible permutations of .conf file layout 
(it's only tested on my own).  It uses supporting functions ck_file, finalise 
and msg but they only do the obvious and are not significant in the parsing.

#--------------------------
# Name&#58; parse_conf_file
# Purpose&#58; parses a conf file
#&nbsp; &nbsp;* The conf file may be one of Bacula's or our own
# Usage&#58;&nbsp; 
#&nbsp; &nbsp;$1&#58; name of file to parse
# Global variables set&#58;
#&nbsp; &nbsp;keyword_orgs&#91;&#93;&nbsp; Keywords as they appear in the conf 
file
#&nbsp; &nbsp;keywords&#91;&#93;&nbsp; Keywords after canonicalisation.&nbsp; 
"Keyword" incudes any &#123; or &#125;.
#&nbsp; &nbsp;conf_value*&#91;&#93;&nbsp; Any values following a keyword &#40;* 
is replaced by 0,1,2 ...&#41;
#&nbsp; &nbsp;conf_n_values&#91;&#93;&nbsp; Number of conf_value*&#91;&#93; 
arrays populated for each line
#&nbsp; &nbsp;n_functional_lines&nbsp; Number of lines containing a keyword
#--------------------------
function parse_conf_file &#123;

&nbsp; &nbsp; local conf_afn

&nbsp; &nbsp; conf_afn=$1

&nbsp; &nbsp; # Does the file exist?
&nbsp; &nbsp; # ~~~~~~~~~~~~~~~~~~~~
&nbsp; &nbsp; buf="$&#40; ck_file $conf_afn&#58;fr 2>&1 &#41;"
&nbsp; &nbsp; if &#91;&#91; $buf != '' &#93;&#93;
&nbsp; &nbsp; then
&nbsp; &nbsp; &nbsp; &nbsp; msg E "Terminating on configuration file 
problem&#58;$lf$buf"
&nbsp; &nbsp; &nbsp; &nbsp; finalise 1
&nbsp; &nbsp; fi

&nbsp; &nbsp; eval "$&#40; $awk '
&nbsp; &nbsp; &nbsp; &nbsp; BEGIN &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; squote = "\047"
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; n_functional_lines=0
&nbsp; &nbsp; &nbsp; &nbsp; &#125;

&nbsp; &nbsp; &nbsp; &nbsp; &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # Strip any comment and any 
spaces+tabs before it
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # This is not so easy because a # 
within a
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # quoted string does not introduce a 
comment and
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # an escaped " &#40;that is \"&#41; 
does not terminate a
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # quoted string.
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; in_string = 0&nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp;# False
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for &#40; i = 1; i <= length&#40; $0 
&#41;; i++ &#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; char = substr&#40; $0, 
i, 1 &#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if &#40; char == "#" && 
in_string == 0 &#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $0 = 
substr&#40; $0, 1, i - 1 &#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sub&#40; 
/&#91; \t&#93;*$/, "", $0 &#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else if &#40; char == 
"\"" &#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if &#40; 
in_string == 0 &#41; in_string = 1
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else if 
&#40; substr&#40; $0, i - 1, 1 &#41; != "\\" &#41; in_string = 0
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # Get keyword and value&#40;s&#41; 
string
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; split&#40; $0, array, /&#91; 
\t&#93;*=&#91; \t&#93;*/ &#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; keyword_org = array&#91;1&#93;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sub&#40; /^&#91; \t&#93;*/, "", 
keyword_org &#41;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 
Remove any leading spaces and tabs
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if &#40; keyword_org == "" &#41; 
next&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 
Functionally empty line so discard
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print "keyword_orgs&#91;" 
n_functional_lines "&#93;=" squote keyword_org squote
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; keyword = tolower&#40; keyword_org 
&#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; gsub&#40; /&#91; \t&#93;*/, "", 
keyword &#41;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp;# Remove any spaces and tabs from keyword
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print "keywords&#91;" 
n_functional_lines "&#93;=" squote keyword squote

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # Get individual values from 
value&#40;s&#41; string
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; n_values=0
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values_string = array&#91;2&#93;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while &#40; length&#40; values_string 
&#41; > 0 &#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value = ""
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if &#40; substr&#40; 
values_string, 1, 1 &#41; == "\"" &#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#123;&nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# Value is a 
quoted string
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buf = 
substr&#40; values_string, 2, match&#40; values_string, /&#91;^\\&#93;"/ &#41; 
- 1 &#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # Strip 
quoted string just taken
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
values_string = substr&#40; values_string, length&#40; buf &#41; + 3 &#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # Copy to 
value, processing any escapes
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for &#40; 
i = 1; i <= length&#40; buf &#41;; i++ &#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; char = substr&#40; buf, i, 1 &#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; if &#40; char != "\\" &#41; value = value char
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; else
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &#123;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# Backslash escape
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; if &#40; substr&#40; buf, i + 1, 1 &#41; == "\\" &#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &#123;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# Escaped \ so 
keep one
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value = value "\\"
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i++
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &#125;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &#125;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#123;&nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# Value is 
unquoted
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value = 
values_string
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sub&#40; 
/&#91; \t&#93;.*$/, "", value &#41;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # 
Strip anything after space or tab
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # Strip 
value string just taken
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
values_string = substr&#40; values_string, length&#40; value &#41; + 1 &#41;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print "conf_value" 
n_values++ "&#91;" n_functional_lines "&#93;=" squote value squote

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # Clean up for the next 
loop pass
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sub&#40; /^&#91; 
\t&#93;*/, "", values_string &#41;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# Strip 
leading spaces and tabs
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#125;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print "conf_n_values&#91;" 
n_functional_lines "&#93;=" squote n_values squote
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; n_functional_lines++
&nbsp; &nbsp; &nbsp; &nbsp; &#125;

&nbsp; &nbsp; &nbsp; &nbsp; END &#123;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print "n_functional_lines=" squote 
n_functional_lines squote
&nbsp; &nbsp; &nbsp; &nbsp; &#125;' "$conf_afn" \
&nbsp; &nbsp; &#41;"

&#125;&nbsp; # end of function parse_conf_file


+----------------------------------------------------------------------
|This was sent by catkin05 AT yahoo.co DOT uk via Backup Central.
|Forward SPAM to abuse AT backupcentral DOT com.
+----------------------------------------------------------------------



------------------------------------------------------------------------------
Nokia and AT&T present the 2010 Calling All Innovators-North America contest
Create new apps & games for the Nokia N8 for consumers in  U.S. and Canada
$10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing
Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store 
http://p.sf.net/sfu/nokia-dev2dev
_______________________________________________
Bacula-users mailing list
Bacula-users AT lists.sourceforge DOT net
https://lists.sourceforge.net/lists/listinfo/bacula-users

<Prev in Thread] Current Thread [Next in Thread>