blob: 36c37001c1f598d94c0713c9f97f5e339bf39298 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
#!/bin/sh /etc/rc.common
# Copyright (C) 2006-2009 OpenWrt.org
# Copyright (C) 2006 Carlos Sobrinho
NAME=dropbear
PROG=/usr/sbin/dropbear
START=50
PIDCOUNT=0
EXTRA_COMMANDS="killclients"
EXTRA_HELP=" killclients Kill ${NAME} processes except servers and yourself"
dropbear_start()
{
local section="$1"
# check if section is enabled (default)
local enabled
config_get_bool enabled "${section}" enable 1
[ "${enabled}" -eq 0 ] && return 1
# verbose parameter
local verbosed
config_get_bool verbosed "${section}" verbose 0
# increase pid file count to handle multiple instances correctly
PIDCOUNT="$(( ${PIDCOUNT} + 1))"
# prepare parameters
# A) password authentication
local nopasswd
local passauth
config_get_bool passauth "${section}" PasswordAuth 1
[ "${passauth}" -eq 0 ] && nopasswd=1
# B) listen port
local port
config_get port "${section}" Port
# C) banner file
local bannerfile
config_get bannerfile ${section} BannerFile
[ -f $bannerfile ] || bannerfile=''
# D) gatewayports
local gatewayports
config_get_bool gatewayports "${section}" GatewayPorts 0
[ "${gatewayports}" -eq 1 ] || gatewayports=''
# concatenate parameters
local args
args="${nopasswd:+-s }${port:+-p ${port} }${bannerfile:+-b $bannerfile }${gatewayports:+-a }-P /var/run/${NAME}.${PIDCOUNT}.pid"
# execute program and return its exit code
[ "${verbosed}" -ne 0 ] && echo "${initscript}: section ${section} starting ${PROG} ${args}"
${PROG} ${args}
return $?
}
keygen()
{
for keytype in rsa dss; do
# check for keys
key=dropbear/dropbear_${keytype}_host_key
[ -f /tmp/$key -o -s /etc/$key ] || {
# generate missing keys
mkdir -p /tmp/dropbear
[ -x /usr/bin/dropbearkey ] && {
/usr/bin/dropbearkey -t $keytype -f /tmp/$key 2>&- >&- && exec /etc/rc.common "$initscript" start
} &
exit 0
}
done
lock /tmp/.switch2jffs
mkdir -p /etc/dropbear
mv /tmp/dropbear/dropbear_* /etc/dropbear/
lock -u /tmp/.switch2jffs
chown root /etc/dropbear
chmod 0700 /etc/dropbear
}
start()
{
[ -s /etc/dropbear/dropbear_rsa_host_key -a \
-s /etc/dropbear/dropbear_dss_host_key ] || keygen
config_load "${NAME}"
config_foreach dropbear_start dropbear
}
stop()
{
# killing all server processes
local pidfile
for pidfile in `ls /var/run/${NAME}.*.pid`
do
start-stop-daemon -K -s KILL -p "${pidfile}" -n "${NAME}" >/dev/null
rm -f "${pidfile}"
done
[ -z "${pidfile}" ] && echo "${initscript}: no pid files, if you get problems with start then try killclients"
}
killclients()
{
local ignore=''
local server
local pid
# if this script is run from inside a client session, then ignore that session
pid="$$"
while [ "${pid}" -ne 0 ]
do
# get parent process id
pid=`cut -d ' ' -f 4 "/proc/${pid}/stat"`
[ "${pid}" -eq 0 ] && break
# check if client connection
ps | grep -e "^[ ]*${pid} " | grep "${PROG}" >/dev/null
if [ $? -eq 0 ]
then
append ignore "${pid}"
break
fi
done
# get all server pids that should be ignored
for server in `cat /var/run/${NAME}.*.pid`
do
append ignore "${server}"
done
# get all running pids and kill client connections
local skip
for pid in `pidof "${NAME}"`
do
# check if correct program
ps | grep -e "^[ ]*${pid} " | grep "${PROG}" >/dev/null
[ $? -ne 0 ] && continue
# check if pid should be ignored (servers, ourself)
skip=0
for server in ${ignore}
do
if [ "${pid}" == "${server}" ]
then
skip=1
break
fi
done
[ "${skip}" -ne 0 ] && continue
# kill process
echo "${initscript}: Killing ${pid}..."
kill -KILL ${pid}
done
}
|