#!/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 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 " # 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"