summaryrefslogtreecommitdiffstats
path: root/net/mosquitto/files/mosquitto.uci.convert
blob: 1a03d9795733362603f4bd53384d83f389143c7c (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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/bin/sh
# Converts a uci config file into an appropriate mosquitto.conf snippet
# expected to be used in an init file to generate a config file to run from
# Karl Palsson <karlp@remake.is> 2012.
# Considered to be released into the public domain

[ -f $IPKG_INSTROOT/lib/functions.sh ] && . $IPKG_INSTROOT/lib/functions.sh

TCONF=/tmp/mosquitto.generated.$$.conf
while getopts "f:" o; do
    case $o in
    f)
        TCONF=$OPTARG
        ;;
    esac
done

if [ -e $TCONF ]; then
    echo "Odd, same temporary generated config file already existed: $TCONF"
    exit 1
fi

echo "Generating mosquitto config file in $TCONF"
NOW=$(date)
echo "# mosquitto.conf file generated from UCI config." >>$TCONF
echo "# Config snippet generated by $0 on $NOW" >>$TCONF
echo "#" >> $TCONF

# Usage: append_if cfg uci_name output_name
# add a config line of the form "output_name <value>"
# if the "uci_name" was found.
# output_name defaults to uci_name if not specified.
append_if() {
    local cfg="$1"
    local uci_name="$2"
    local out_name="$3"
    if [ -z "$out_name" ]; then
        out_name=$uci_name
    fi
    config_get val $cfg $uci_name
    if [ -n "$val" ]; then
        echo "$out_name $val" >> $TCONF
    fi
}

# mosquitto uses true/false, uci uses 1/0
# note that this is not shell truthy, but equality with 1!
append_bool() {
    if [ $2 -eq 1 ]; then
        echo "$1 true" >> $TCONF
    else
        echo "$1 false" >> $TCONF
    fi
}

# as per append_if, but gets the value as a uci bool, not raw
append_optional_bool() {
    local cfg="$1"
    local uci_name="$2"
    local out_name="$3"
    config_get val $cfg $uci_name
    if [ -n "$val" ]; then
        config_get_bool real $cfg $uci_name
        append_bool $out_name $real
    fi
}

mosq_general() {
    config_get destinations "$1" log_dest
    for dest in $destinations; do
        echo "log_dest $dest" >> $TCONF
    done

    config_get_bool no_remote "$1" no_remote_access 0
    if [ "$no_remote" -eq 1 ]; then
        echo "bind_address 127.0.0.1" >> $TCONF
    fi

    config_get port "$1" port 1883
    echo "port $port" >> $TCONF
    append_if "$1" protocol
    append_if "$1" max_inflight_messages
    append_if "$1" max_queued_messages

}

add_listener() {
    echo "" >> $TCONF
    config_get port "$1" port
    if [ -z "$port" ]; then
        echo "Ignoring listener section without port"
        return
    fi
    config_get_bool no_remote "$1" no_remote_access 0
    if [ "$no_remote" -eq 1 ]; then
        echo "listener $port 127.0.0.1" >> $TCONF
    else
        echo "listener $port" >> $TCONF
    fi

    append_if "$1" protocol
}

add_topic() {
    echo "topic $1" >> $TCONF
}

add_bridge() {
    config_get conn "$1" connection
    config_get addr "$1" address
    if [ -z "$conn" -o -z "$addr" ]; then
        echo "Ignoring bridge section, misisng connection/address"
        return
    fi
    echo "" >> $TCONF
    echo "# Bridge connection from UCI section" >> $TCONF
    append_if "$1" connection
    append_if "$1" address

    config_list_foreach "$1" topic add_topic
    append_optional_bool "$1" cleansession cleansession
    append_optional_bool "$1" try_private try_private

    append_if "$1" clientid
    append_if "$1" identity bridge_identity
    append_if "$1" psk bridge_psk
    append_if "$1" tls_version bridge_tls_version
}


config_load "mosquitto"
config_foreach mosq_general "mosquitto"
config_foreach add_listener "listener"
config_foreach add_bridge "bridge"