Bacula-users

Re: [Bacula-users] How to parse Bacula conf files

2010-11-01 11:41:50
Subject: Re: [Bacula-users] How to parse Bacula conf files
From: Bruno Friedmann <bruno AT ioda-net DOT ch>
To: bacula-users AT lists.sourceforge DOT net
Date: Mon, 01 Nov 2010 16:39:42 +0100
Ok when people will stop posting html converted perhaps we will try to read 
their demand.



On 11/01/2010 02:58 PM, catkins wrote:
> 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


-- 

Bruno Friedmann (irc:tigerfoot)
Ioda-Net Sàrl www.ioda-net.ch
 openSUSE Member
    User www.ioda.net/r/osu
    Blog www.ioda.net/r/blog
  fsfe fellowship www.fsfe.org
GPG KEY : D5C9B751C4653227
vcard : http://it.ioda-net.ch/ioda-net.vcf

------------------------------------------------------------------------------
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>