openwrt-packages/net/ser2net/files/ser2net.init

242 lines
5.4 KiB
Bash

#!/bin/sh /etc/rc.common
# Copyright (C) 2017 Michael Heimpold
START=99
STOP=10
USE_PROCD=1
PROG=/usr/sbin/ser2net
STATICCFGFILE="/etc/ser2net.yaml"
DYNAMICCFGFILE="/tmp/ser2net.yaml"
list_cb_append() {
local var="$2"
local value="$1"
local sep="${3:-,}"
eval "export ${NO_EXPORT:+-n} -- \"$var=\${$var:+\${$var}\${value:+\$sep}}\$value\""
}
ser2net_default() {
local cfg="$1"
local key val
local baudrate parity databits stopbits
config_get baudrate "$cfg" speed
if [ -n "$baudrate" ]; then
config_get parity "$cfg" parity
case "$parity" in
[Nn]one) parity=n ;;
[Oo]dd) parity=o ;;
[Ee]ven) parity=e ;;
"") ;;
*) return 1
esac
if [ -n "$parity" ]; then
config_get databits "$cfg" databits 8
[ "$databits" -ge 5 ] && [ "$databits" -le 9 ] || return 1
config_get stopbits "$cfg" stopbits 1
case "$stopbits" in
1) ;;
2) ;;
*) return 1
esac
fi
echo "default:"
echo " name: speed"
echo " value: $baudrate${parity:+$parity$databits$stopbits}"
fi
for key in chardelay_scale chardelay_min; do
config_get val "$cfg" "$key"
[ -n "$val" ] || continue
key=`echo "$key" | tr '_' '-'`
echo "default:"
echo " name: $key"
echo " value: $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
case "$key" in
remctl) key=rfc2217 ;;
esac
config_get_bool val "$cfg" "$key"
[ -n "$val" ] || continue
key=`echo "$key" | tr '_' '-'`
[ "$val" -eq 0 ] && val="false" || val="true"
echo "default:"
echo " name: $key"
echo " value: $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
[ "$port" -ge 1 ] && [ "$port" -le 65535 ] || return 1
echo "admin:"
echo " accepter: tcp,${host:+$host,}$port"
echo
}
ser2net_led() {
local cfg="$1"
local driver device state duration
config_get driver "$cfg" driver sysfs
config_get device "$cfg" device
[ -z "$device" ] && return 1
config_get duration "$cfg" duration
config_get state "$cfg" state
echo "led: &$cfg"
echo " driver: $driver"
echo " options:"
echo " device: \"$device\""
[ -n "$duration" ] && echo " duration: $duration"
[ -n "$state" ] && echo " state: $state"
echo
}
ser2net_proxy() {
local cfg="$1"
local enabled port protocol timeout device baudrate databits parity stopbits
local key boolval options custom_options
local echo_options=1
config_get_bool enabled "$cfg" enabled 0
config_get device "$cfg" device
[ -z "$device" ] && return 1
config_get port "$cfg" port
[ "$port" -ge 1 ] && [ "$port" -le 65535 ] || return 1
config_get protocol "$cfg" protocol
case "$protocol" in
raw)
protocol="tcp"
;;
rawlp)
protocol="tcp"
options="wronly"
;;
telnet)
protocol="telnet,tcp"
config_get_bool boolval "$cfg" remctl 0
[ "$boolval" -eq 1 ] && protocol="telnet(rfc2217),tcp"
;;
off)
enabled=0
;;
*) return 1
esac
config_get baudrate "$cfg" baudrate
if [ -n "$baudrate" ]; then
config_get parity "$cfg" parity
case "$parity" in
[Nn]one) parity=n ;;
[Oo]dd) parity=o ;;
[Ee]ven) parity=e ;;
"") ;;
*) return 1
esac
if [ -n "$parity" ]; then
config_get databits "$cfg" databits 8
[ "$databits" -ge 5 ] && [ "$databits" -le 9 ] || return 1
config_get stopbits "$cfg" stopbits 1
case "$stopbits" in
1) ;;
2) ;;
*) return 1
esac
fi
fi
config_get timeout "$cfg" timeout 0
for key in rtscts local xonxoff nobreak hangup_when_done; do
config_get_bool boolval "$cfg" "$key"
[ -n "$boolval" ] || continue
key=`echo "$key" | tr '_' '-'`
options="${options:+$options,}$key"
[ "$boolval" -eq 0 ] && options="$options=false"
done
config_list_foreach "$cfg" options list_cb_append custom_options
echo "connection: &$cfg"
echo " accepter: $protocol,$port"
echo " timeout: $timeout"
[ "$enabled" -eq 0 ] && echo " enable: off"
echo " connector: serialdev,$device${baudrate:+,$baudrate${parity:+$parity$databits$stopbits}}${options:+,$options}${custom_options:+,$custom_options}"
for key in led_tx led_rx; do
config_get val "$cfg" "$key"
[ -n "$val" ] || continue
[ "$echo_options" -eq 1 ] && echo " options:" && echo_options=0
key=`echo "$key" | tr '_' '-'`
echo " $key: *$val"
done
for key in chardelay telnet_brk_on_sync kickolduser; do
config_get_bool boolval "$cfg" "$key"
[ -n "$boolval" ] || continue
[ "$echo_options" -eq 1 ] && echo " options:" && echo_options=0
key=`echo "$key" | tr '_' '-'`
echo " $key: $boolval"
done
echo
}
start_service() {
local enabled
config_load ser2net
config_get_bool enabled global 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_default default >> "$DYNAMICCFGFILE"
config_foreach ser2net_led led >> "$DYNAMICCFGFILE"
config_foreach ser2net_controlport controlport >> "$DYNAMICCFGFILE"
config_foreach ser2net_proxy proxy >> "$DYNAMICCFGFILE"
procd_open_instance
procd_set_param command "$PROG" -n -c "$DYNAMICCFGFILE"
procd_set_param file "$DYNAMICCFGFILE"
procd_close_instance
}
service_triggers() {
procd_add_reload_trigger "ser2net"
}