blob: 7fd9d086fcbd4525d9984eaddb4603d05760e858 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001#!/bin/sh /etc/rc.common
2# Copyright (C) 2017 Michael Heimpold
3
4START=75
5STOP=10
6
7USE_PROCD=1
8PROG=/usr/sbin/ser2net
9
10STATICCFGFILE="/etc/ser2net.conf"
11DYNAMICCFGFILE="/tmp/ser2net.conf"
12
13list_cb_append() {
14 local var="$2"
15 local value="$1"
16 local sep="${3:- }"
17
18 eval "export ${NO_EXPORT:+-n} -- \"$var=\${$var:+\${$var}\${value:+\$sep}}\$value\""
19}
20
21append_bool() {
22 local var="$1"
23 local key="$2"
24 local val="$3"
25 local uc="$4"
26 local s=""
27
28 [ "$uc" -eq 1 ] && key=`echo "$key" | tr '[a-z]' '[A-Z]'`
29 [ "$val" -eq 0 ] && s="-"
30
31 append "$var" "$s$key"
32}
33
34ser2net_default() {
35 local cfg="$1"
36 local key val
37
38 for key in speed baudrate databits stopbits parity chardelay_scale chardelay_min; do
39 config_get val "$cfg" "$key"
40 [ -n "$val" ] || continue
41
42 case "$key" in
43 baudrate) key="speed" ;;
44 hangup_when_done) ;;
45 telnet_brk_on_sync) ;;
46 deassert_CTS_DCD_DSR_on_connect) ;;
47 *) key=`echo "$key" | tr '_' '-'`
48 esac
49
50 echo "DEFAULT:$key:$val"
51 done
52
53 for key in chardelay deassert_CTS_DCD_DSR_on_connect hangup_when_done kickolduser \
54 local nobreak remctl rtscts telnet_brk_on_sync xonxoff; do
55 config_get_bool val "$cfg" "$key"
56 [ -n "$val" ] || continue
57 [ "$val" -eq 0 ] && val="false" || val="true"
58 echo "DEFAULT:$key:$val"
59 done
60
61 echo
62}
63
64ser2net_controlport() {
65 local cfg="$1"
66 local enabled host port
67
68 config_get_bool enabled "$cfg" enabled 0
69 [ "$enabled" -eq 0 ] && return 0
70
71 config_get host "$cfg" host
72 config_get port "$cfg" port
73
74 echo -e "CONTROLPORT:${host:+$host,}$port\n"
75}
76
77ser2net_led() {
78 local cfg="$1"
79 local driver device state duration
80
81 config_get driver "$cfg" driver sysfs
82 config_get device "$cfg" device
83 config_get state "$cfg" state 1
84 config_get duration "$cfg" duration 20
85
86 echo -e "LED:$cfg:$driver:device=$device state=$state duration=$duration\n"
87}
88
89ser2net_proxy() {
90 local cfg="$1"
91 local enabled port protocol timeout device baudrate databits parity stopbits
92 local led_tx led_rx key boolval options
93
94 config_get_bool enabled "$cfg" enabled 0
95 [ "$enabled" -eq 0 ] && return 0
96
97 config_get port "$cfg" port
98 [ "$port" -le 0 -o "$port" -gt 65535 ] && return 1
99
100 config_get protocol "$cfg" protocol
101 case "$protocol" in
102 raw|rawlp|telnet|off) ;;
103 *) return 1
104 esac
105
106 config_get timeout "$cfg" timeout 0
107 config_get device "$cfg" device
108 [ -z "$device" ] && return 1
109
110 config_get baudrate "$cfg" baudrate
111 [ -n "$baudrate" ] && append options "$baudrate"
112
113 config_get databits "$cfg" databits
114 if [ -n "$databits" ]; then
115 [ "$databits" -lt 5 -o "$databits" -gt 8 ] && return 1
116 append options "${databits}DATABITS"
117 fi
118
119 config_get parity "$cfg" parity
120 parity=`echo "$parity" | tr '[a-z]' '[A-Z]'`
121 case "$parity" in
122 EVEN|ODD|NONE|MARK|SPACE) append options "$parity" ;;
123 "") ;;
124 *) return 1
125 esac
126
127 config_get stopbits "$cfg" stopbits
128 case "$stopbits" in
129 1) append options "${stopbits}STOPBIT" ;;
130 2) append options "${stopbits}STOPBITS" ;;
131 "") ;;
132 *) return 1
133 esac
134
135 config_get led_tx "$cfg" led_tx
136 [ -n "$led_tx" ] && append options "led-tx=$led_tx"
137
138 config_get led_rx "$cfg" led_rx
139 [ -n "$led_rx" ] && append options "led-rx=$led_rx"
140
141 for key in rtscts local xonxoff nobreak hangup_when_done; do
142 config_get_bool boolval "$cfg" "$key"
143 [ -n "$boolval" ] || continue
144 append_bool options "$key" "$boolval" 1
145 done
146
147 for key in chardelay telnet_brk_on_sync kickolduser remctl; do
148 config_get_bool boolval "$cfg" "$key"
149 [ -n "$boolval" ] || continue
150 append_bool options "$key" "$boolval" 0
151 done
152
153 config_list_foreach "$cfg" options list_cb_append options
154
155 if [ "`echo "$device" | sed 's/://g'`" != "$device" ]; then
156 echo "DEVICE:$cfg:$device"
157 device="$cfg"
158 fi
159
160 echo -e "$port:$protocol:$timeout:$device:$options\n"
161}
162
163start_service() {
164 local enabled
165
166 config_load ser2net
167
168 config_get_bool enabled global enabled 0
169 [ "$enabled" -gt 0 ] || return 0
170
171 cat "$STATICCFGFILE" - 2>/dev/null <<-EOF > "$DYNAMICCFGFILE"
172
173 #
174 # Following part is auto-generated from UCI settings in /etc/config/ser2net
175 #
176 EOF
177
178 config_foreach ser2net_controlport controlport >> "$DYNAMICCFGFILE"
179 config_foreach ser2net_default default >> "$DYNAMICCFGFILE"
180 config_foreach ser2net_led led >> "$DYNAMICCFGFILE"
181 config_foreach ser2net_proxy proxy >> "$DYNAMICCFGFILE"
182
183 procd_open_instance
184 procd_set_param command "$PROG" -n -c "$DYNAMICCFGFILE"
185 procd_set_param file "$DYNAMICCFGFILE"
186 procd_close_instance
187}
188
189service_triggers() {
190 procd_add_reload_trigger "ser2net"
191}
192