| #!/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 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_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_set_param file "$DYNAMICCFGFILE" |
| procd_close_instance |
| } |
| |
| service_triggers() { |
| procd_add_reload_trigger "ser2net" |
| } |
| |