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: parse_conf_file
> # Purpose: parses a conf file
> # * The conf file may be one of Bacula's or our own
> # Usage:
> # $1: name of file to parse
> # Global variables set:
> # keyword_orgs[] Keywords as they appear in the
> conf file
> # keywords[] Keywords after canonicalisation.
> "Keyword" incudes any { or }.
> # conf_value*[] Any values following a keyword
> (* is replaced by 0,1,2 ...)
> # conf_n_values[] Number of conf_value*[]
> arrays populated for each line
> # n_functional_lines Number of lines containing a keyword
> #--------------------------
> function parse_conf_file {
>
> local conf_afn
>
> conf_afn=$1
>
> # Does the file exist?
> # ~~~~~~~~~~~~~~~~~~~~
> buf="$( ck_file $conf_afn:fr 2>&1 )"
> if [[ $buf != '' ]]
> then
> msg E "Terminating on configuration file
> problem:$lf$buf"
> finalise 1
> fi
>
> eval "$( $awk '
> BEGIN {
> squote = "\047"
> n_functional_lines=0
> }
>
> {
> # Strip any comment and any
> spaces+tabs before it
> #
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> # This is not so easy because a #
> within a
> # quoted string does not introduce
> a comment and
> # an escaped " (that is \")
> does not terminate a
> # quoted string.
> in_string = 0
>
> # False
> for ( i = 1; i <= length(
> $0 ); i++ )
> {
> char = substr(
> $0, i, 1 )
> if ( char == "#"
> && in_string == 0 )
> {
> $0 =
> substr( $0, 1, i - 1 )
>
> sub( /[ \t]*$/, "", $0 )
> break
> }
> else if ( char ==
> "\"" )
> {
> if
> ( in_string == 0 ) in_string = 1
> else if
> ( substr( $0, i - 1, 1 ) != "\\" ) in_string = 0
> }
> }
>
> # Get keyword and value(s)
> string
> # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> split( $0, array, /[
> \t]*=[ \t]*/ )
> keyword_org = array[1]
> sub( /^[ \t]*/, "",
> keyword_org ) #
> Remove any leading spaces and tabs
> if ( keyword_org == "" )
> next #
> Functionally empty line so discard
> print "keyword_orgs["
> n_functional_lines "]=" squote keyword_org squote
> keyword = tolower( keyword_org
> )
> gsub( /[ \t]*/, "",
> keyword )
> # Remove any spaces and tabs from keyword
> print "keywords["
> n_functional_lines "]=" squote keyword squote
>
> # Get individual values from
> value(s) string
> #
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> n_values=0
> values_string = array[2]
> while ( length(
> values_string ) > 0 )
> {
> value = ""
> if ( substr(
> values_string, 1, 1 ) == "\"" )
> {
>
> # Value is a
> quoted string
> buf =
> substr( values_string, 2, match( values_string, /[^\\]"/
> ) - 1 )
> # Strip
> quoted string just taken
>
> values_string = substr( values_string, length( buf ) + 3 )
> # Copy
> to value, processing any escapes
> for
> ( i = 1; i <= length( buf ); i++ )
> {
>
> char = substr( buf, i, 1 )
>
> if ( char != "\\" ) value = value char
>
> else
>
> {
> # Backslash
> escape
>
> if ( substr( buf, i + 1, 1 ) == "\\" )
>
> {
> # Escaped \ so
> keep one
>
> value = value "\\"
>
> i++
>
> }
>
> }
> }
> }
> else
> {
>
> # Value is
> unquoted
> value =
> values_string
>
> sub( /[ \t].*$/, "", value )
> # Strip anything after space or tab
> # Strip
> value string just taken
>
> values_string = substr( values_string, length( value ) + 1 )
> }
>
> print "conf_value"
> n_values++ "[" n_functional_lines "]=" squote value squote
>
> # Clean up for the
> next loop pass
> #
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> sub( /^[
> \t]*/, "", values_string ) # Strip
> leading spaces and tabs
> }
>
> print "conf_n_values["
> n_functional_lines "]=" squote n_values squote
> n_functional_lines++
> }
>
> END {
> print "n_functional_lines=" squote
> n_functional_lines squote
> }' "$conf_afn" \
> )"
>
> } # 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
|