dropbear: rewrite init script startup logic to handle both host key files
authorKonstantin Demin <rockdrilla@gmail.com>
Tue, 16 Oct 2018 13:31:57 +0000 (16:31 +0300)
committerHans Dedecker <dedeckeh@gmail.com>
Thu, 8 Nov 2018 10:07:05 +0000 (11:07 +0100)
Signed-off-by: Konstantin Demin <rockdrilla@gmail.com>
package/network/services/dropbear/files/dropbear.init

index a9c7ef3719d7711239771f8c914aceb16abe1b69..fb3f6dd84e9142856c2f1075d1843af4ed26c483 100755 (executable)
@@ -60,6 +60,46 @@ hk_config__keyfile()
        hk_config 'keyfile' "$1"
 }
 
+hk_generate_as_needed()
+{
+       local kdir kgen ktype tdir kcount tfile tlock
+       kdir='/etc/dropbear'
+
+       kgen=''
+       for ktype in ecdsa rsa; do
+               hk_verify "${kdir}/dropbear_${ktype}_host_key" && continue
+
+               kgen="${kgen} ${ktype}"
+       done
+
+       [ -z "${kgen}" ] && return
+
+       tdir=$(mktemp -d); chmod 0700 "${tdir}"
+
+       kcount=0
+       for ktype in ${kgen}; do
+               tfile="${tdir}/dropbear_${ktype}_host_key"
+
+               if ! _dropbearkey -t ${ktype} -f "${tfile}"; then
+                       # unsupported key type
+                       rm -f "${tfile}"
+                       continue
+               fi
+
+               kcount=$((kcount+1))
+       done
+
+       if [ ${kcount} -ne 0 ]; then
+               tlock='/tmp/.switch2jffs'
+               lock "${tlock}"
+               mkdir -p "${kdir}"; chmod 0700 "${kdir}"; chown root "${kdir}"
+               mv -f "${tdir}/"* "${kdir}/"
+               lock -u "${tlock}"
+       fi
+
+       rm -rf "${tdir}"
+}
+
 append_ports()
 {
        local ipaddrs="$1"
@@ -143,29 +183,6 @@ dropbear_instance()
        procd_close_instance
 }
 
-keygen()
-{
-       for keytype in rsa; 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
-}
-
 load_interfaces()
 {
        config_get interface "$1" Interface
@@ -176,7 +193,7 @@ load_interfaces()
 
 start_service()
 {
-       [ -s /etc/dropbear/dropbear_rsa_host_key ] || keygen
+       hk_generate_as_needed
 
        . /lib/functions.sh
        . /lib/functions/network.sh