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