242 lines
5.4 KiB
Bash
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"
|
|
}
|