diff options
author | Michael Heimpold <mhei@heimpold.de> | 2017-12-30 23:30:06 +0100 |
---|---|---|
committer | Michael Heimpold <mhei@heimpold.de> | 2017-12-30 23:43:11 +0100 |
commit | 1dd54f5673835dbd508f767aa62f98c1da0807f8 (patch) | |
tree | 8cff3e74d7cc15a0d568ab1c2e3573f192fe485b /net/ser2net/files/ser2net.init | |
parent | 71ea9e8eacfbc8993777edbf17f4ce0543911ae4 (diff) |
ser2net: extend dynamic config generation (refs #5302)
Signed-off-by: Michael Heimpold <mhei@heimpold.de>
Diffstat (limited to 'net/ser2net/files/ser2net.init')
-rw-r--r-- | net/ser2net/files/ser2net.init | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/net/ser2net/files/ser2net.init b/net/ser2net/files/ser2net.init new file mode 100644 index 000000000..59516bee5 --- /dev/null +++ b/net/ser2net/files/ser2net.init @@ -0,0 +1,186 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2017 Michael Heimpold + +START=75 +STOP=10 + +USE_PROCD=1 +PROG=/usr/sbin/ser2net + +STATICCFGFILE="/etc/ser2net.conf" +DYNAMICCFGFILE="/tmp/ser2net.conf" + +list_cb_append() { + local var="$2" + local value="$1" + local sep="${3:- }" + + eval "export ${NO_EXPORT:+-n} -- \"$var=\${$var:+\${$var}\${value:+\$sep}}\$value\"" +} + +append_bool() { + local var="$1" + local key="$2" + local val="$3" + local uc="$4" + local s="" + + [ "$uc" -eq 1 ] && key=`echo "$key" | tr '[a-z]' '[A-Z]'` + [ "$val" -eq 0 ] && s="-" + + append "$var" "$s$key" +} + +ser2net_default() { + local cfg="$1" + local key val + + for key in speed baudrate databits stopbits parity chardelay_scale chardelay_min; do + config_get val "$cfg" "$key" + [ -n "$val" ] || continue + + case "$key" in + baudrate) key="speed" ;; + hangup_when_done) ;; + telnet_brk_on_sync) ;; + deassert_CTS_DCD_DSR_on_connect) ;; + *) key=`echo "$key" | tr '_' '-'` + esac + + echo "DEFAULT:$key:$val" + done + + for key in chardelay deassert_CTS_DCD_DSR_on_connect hangup_when_done kickolduser \ + local nobreak remctl rtscts telnet_brk_on_sync xonxoff; do + config_get_bool val "$cfg" "$key" + [ -n "$val" ] || continue + [ "$val" -eq 0 ] && val="false" || val="true" + echo "DEFAULT:$key:$val" + done + + echo +} + +ser2net_controlport() { + local cfg="$1" + local enabled host port + + config_get_bool enabled "$cfg" enabled 0 + [ "$enabled" -eq 0 ] && return 0 + + config_get host "$cfg" host + config_get port "$cfg" port + + echo -e "CONTROLPORT:${host:+$host,}$port\n" +} + +ser2net_led() { + local cfg="$1" + local driver device state duration + + config_get driver "$cfg" driver sysfs + config_get device "$cfg" device + config_get state "$cfg" state 1 + config_get duration "$cfg" duration 20 + + echo -e "LED:$cfg:$driver:device=$device state=$state duration=$duration\n" +} + +ser2net_proxy() { + local cfg="$1" + local enabled port protocol timeout device baudrate databits parity stopbits + local led_tx led_rx key boolval options + + config_get_bool enabled "$cfg" enabled 0 + [ "$enabled" -eq 0 ] && return 0 + + config_get port "$cfg" port + [ "$port" -le 0 -o "$port" -gt 65535 ] && return 1 + + config_get protocol "$cfg" protocol + case "$protocol" in + raw|rawlp|telnet|off) ;; + *) return 1 + esac + + config_get timeout "$cfg" timeout 0 + config_get device "$cfg" device + [ -z "$device" ] && return 1 + + config_get baudrate "$cfg" baudrate + [ -n "$baudrate" ] && append options "$baudrate" + + config_get databits "$cfg" databits + if [ -n "$databits" ]; then + [ "$databits" -lt 5 -o "$databits" -gt 8 ] && return 1 + append options "${databits}DATABITS" + fi + + config_get parity "$cfg" parity + parity=`echo "$parity" | tr '[a-z]' '[A-Z]'` + case "$parity" in + EVEN|ODD|NONE|MARK|SPACE) append options "$parity" ;; + "") ;; + *) return 1 + esac + + config_get stopbits "$cfg" stopbits + case "$stopbits" in + 1) append options "${stopbits}STOPBIT" ;; + 2) append options "${stopbits}STOPBITS" ;; + "") ;; + *) return 1 + esac + + config_get led_tx "$cfg" led_tx + [ -n "$led_tx" ] && append options "led-tx=$led_tx" + + config_get led_rx "$cfg" led_rx + [ -n "$led_rx" ] && append options "led-rx=$led_rx" + + for key in rtscts local xonxoff nobreak hangup_when_done; do + config_get_bool boolval "$cfg" "$key" + [ -n "$boolval" ] || continue + append_bool options "$key" "$boolval" 1 + done + + for key in chardelay telnet_brk_on_sync kickolduser remctl; do + config_get_bool boolval "$cfg" "$key" + [ -n "$boolval" ] || continue + append_bool options "$key" "$boolval" 0 + done + + config_list_foreach "$cfg" options list_cb_append options + + if [ "`echo "$device" | sed 's/://g'`" != "$device" ]; then + echo "DEVICE:$cfg:$device" + device="$cfg" + fi + + echo -e "$port:$protocol:$timeout:$device:$options\n" +} + +start_service() { + local enabled + + config_load ser2net + + config_get_bool enabled ser2net enabled 0 + [ "$enabled" -gt 0 ] || return 0 + + cat "$STATICCFGFILE" - 2>/dev/null <<-EOF > "$DYNAMICCFGFILE" + + # + # Following part is auto-generated from UCI settings in /etc/config/ser2net + # + EOF + + config_foreach ser2net_controlport controlport >> "$DYNAMICCFGFILE" + config_foreach ser2net_default default >> "$DYNAMICCFGFILE" + config_foreach ser2net_led led >> "$DYNAMICCFGFILE" + config_foreach ser2net_proxy proxy >> "$DYNAMICCFGFILE" + + procd_open_instance + procd_set_param command "$PROG" -n -c "$DYNAMICCFGFILE" + procd_close_instance +} |