summaryrefslogtreecommitdiff
path: root/src/parseconf.sh
blob: c5ed801c7b55ed7057c4a698162c57a92532887d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/bin/bash

usage () {
    printf "Usage $0 "
    echo << "EOF"
OPTIONS... [FILTER]

Print the parsed config file filtering by the keys
Arguments:
    -f file         read configuration from a file, uses /dev/sdtin otherwise
    -v              only print values
    -c n            print the last [n]
EOF
}

# print the parsed values from the config file in key:value format
#
parse () {
    local file="$1"
    local level=""
    local list=""
    while IFS= read -r line; do
        line=$(sed "s/\s\+/ /g" <<< "$line" | sed "s/^\s\|\s$\|;*$//g")
        
        grep -q "^#" <<< "$line" && continue
        grep -q "." <<< "$line" || continue

        local key=$(echo $line | cut -d" " -f1)
        local value=$(echo $line | cut -d" " -f2-)

        [ "$key" = "include" ] && parse $value && continue

        case ${value: -1} in 
            "{")
                level="$level$key."
                ;;
            "[")
                list="$list$key."
                printf "$level$key:"
                ;;
            "}")
                level=$(sed "s/[^\.]\w*\.$//g" <<< "$level")
                ;;
            "]")
                printf "\n"
                list=$(sed "s/[^\.]\w*\.$//g" <<< "$list")
                ;;
            *)

                grep -q "." <<< "$list" && 
                    printf "$line " ||
                    printf "$level$key:$value\n"
                ;;
        esac
    done < "$file"
}

# Filter the parsed file for specific keys
#
filter () {
    local pattern=

    [ $# = 0 ] &&
        pattern=".*" ||
        pattern=$(sed "s/\*/.*/g"<<< "$@")

    $print_keys && 
        pattern="s/^($pattern:.+)/\1/p" ||
        pattern="s/^$pattern:(.+)/\1/p"


    parse $CONF_FILE | sed -rn $pattern
}

# Use the env variable if exists
[ -z ${CONF_FILE} ] && CONF_FILE="/dev/stdin"

# initialise options
print_keys=true
count=

while getopts ":f:c:v" opt; do
    case "${opt}" in 
        f)
            [ "${OPTARG}" = "-" ] &&
                CONF_FILE="/dev/stdin" ||
                CONF_FILE="${OPTARG}"
            ;;

        v)
            print_keys=false
            ;;
        c)
            count="${OPTARG}"
            ;;
        *)
    esac
done

shift $((OPTIND-1))

[ -z ${count} ] &&
    filter "$@" ||
    filter "$@" | tail -n $count