1+ #! /bin/sh
2+
3+ add_ssh_entry () {
4+ ENTRY=$1
5+ SSH_FILE=$2
6+ # Add the entry in both .ssh dirs since ssh checks different locations based on env variables and how it is launched, e.g. on boot vs. manually
7+ for DIR in ~ root/.ssh $HOME /.ssh
8+ do
9+ if [ ! -f " $DIR /$SSH_FILE " ] || ! grep -Fxq " $ENTRY " " $DIR /$SSH_FILE " ; then
10+ mkdir -p $DIR
11+ echo " $ENTRY " >> " $DIR /$SSH_FILE "
12+ fi
13+ done
14+ }
15+
16+ remote_ctrl () {
17+ if [ -z " $SSH_HOST " ]; then
18+ echo " \$ SSH_HOST is empty"
19+ exit 1
20+ fi
21+
22+ if [ -z " $SSH_FORWARD_PORT " ]; then
23+ echo " \$ SSH_FORWARD_PORT is empty"
24+ exit 1
25+ fi
26+
27+ if [ -z " $SSH_USERNAME " ]; then
28+ echo " \$ SSH_USERNAME is empty"
29+ exit 1
30+ fi
31+
32+ if [ -z " $SSH_PRIVATE_KEY " ]; then
33+ echo " \$ SSH_PRIVATE_KEY is empty"
34+ exit 1
35+ fi
36+
37+ if [ -z " $SSH_LOCAL_PORT " ]; then
38+ SSH_LOCAL_PORT=22
39+ fi
40+
41+ if [ -z " $SSH_REMOTE_PORT " ]; then
42+ SSH_REMOTE_PORT=22
43+ fi
44+
45+ export PRIVATE_KEY_FILE=/tmp/temp_ssh_key
46+ echo -e " $SSH_PRIVATE_KEY " > " $PRIVATE_KEY_FILE "
47+ if command -v dropbearconvert & > /dev/null; then
48+ dropbearconvert openssh dropbear " $PRIVATE_KEY_FILE " " $PRIVATE_KEY_FILE "
49+ fi
50+ chmod 600 " $PRIVATE_KEY_FILE "
51+
52+ if [ -z " $SSH_HOST_KEY " ]; then
53+ echo " \$ SSH_HOST_KEY is empty"
54+ else
55+ KNOWN_HOST=" $SSH_HOST $SSH_HOST_KEY "
56+ add_ssh_entry " $KNOWN_HOST " known_hosts
57+ fi
58+
59+ if [ -z " $SSH_AUTH_KEY " ]; then
60+ echo " \$ SSH_AUTH_KEY is empty"
61+ else
62+ add_ssh_entry " $SSH_AUTH_KEY " authorized_keys
63+ fi
64+
65+ if [ " $SSHD_FORCE_PUBKEY_AUTH " == " true" ]; then
66+ echo " Starting sshd with publickey authentication"
67+ $( which sshd) -p $SSH_LOCAL_PORT -o " PubkeyAuthentication yes"
68+ fi
69+ ssh -o " ExitOnForwardFailure yes" -N -R $SSH_FORWARD_PORT :localhost:$SSH_LOCAL_PORT $SSH_USERNAME @$SSH_HOST -p $SSH_REMOTE_PORT -i $PRIVATE_KEY_FILE &
70+ sh -c ' sleep 10; rm $PRIVATE_KEY_FILE'
71+ }
72+
73+ update () {
74+ if [ -z " $UPDATE_URL " ]; then
75+ echo " \$ UPDATE_URL is empty"
76+ exit 1
77+ fi
78+
79+ if [ " $UPDATE_FILE_MODE " != " " ] && [ -z " $( echo " $UPDATE_FILE_MODE " | grep -E ' ^[0-7]{3,4}$' ) " ]; then
80+ echo " \$ UPDATE_FILE_MODE is not valid"
81+ exit 1
82+ fi
83+
84+ UPDATE_FILE_PATH=/tmp/$( basename $UPDATE_URL )
85+ if [ " $UPDATE_FILE_PATH " != " /tmp/" ]; then
86+ echo " Downloading $UPDATE_URL "
87+ curl -s -f $UPDATE_URL --output $UPDATE_FILE_PATH
88+ RESULT=$?
89+ if ( test " $RESULT " == " 60" || test " $RESULT " == " 77" ) && ! test -f /etc/ssl/certs/ca-certificates.crt; then
90+ echo " Download failed, attempting to update certs and retry"
91+ if command -v update-ca-certificates & > /dev/null; then
92+ update-ca-certificates
93+ else
94+ opkg update
95+ opkg install ca-certificates
96+ opkg upgrade ca-certificates
97+ fi
98+ curl -s -f $UPDATE_URL --output $UPDATE_FILE_PATH
99+ RESULT=$?
100+ fi
101+ if test " $RESULT " ! = " 0" ; then
102+ echo " Download failed with: $RESULT "
103+ rm -f $UPDATE_FILE_PATH
104+ exit $RESULT
105+ fi
106+
107+ echo " Verifying checksum"
108+ DOWNLOAD_MD5=$( md5sum " $UPDATE_FILE_PATH " | cut -d " " -f1)
109+ if [ $DOWNLOAD_MD5 == $UPDATE_MD5 ]; then
110+ echo " Checksum matches"
111+ if [ " $UPDATE_TYPE " == " file" ]; then
112+ if [ " $UPDATE_DEST " != " " ]; then
113+ echo " Moving file to $UPDATE_DEST "
114+ DEST_DIR=$( dirname $UPDATE_DEST )
115+ mkdir -p $DEST_DIR
116+ mv -f $UPDATE_FILE_PATH $UPDATE_DEST
117+ if [ " $UPDATE_FILE_MODE " != " " ]; then
118+ # If the specified file mode is valid, set it
119+ chmod $UPDATE_FILE_MODE $UPDATE_DEST
120+ fi
121+ exit $?
122+ fi
123+ fi
124+
125+ echo " Installing $UPDATE_FILE_PATH "
126+ UPDATE_OPTIONS=" "
127+ FORCE_REINSTALL=$( echo " $FORCE_REINSTALL " | tr ' [:upper:]' ' [:lower:]' )
128+ if [ " $FORCE_REINSTALL " == " true" ]; then
129+ UPDATE_OPTIONS=" --force-reinstall"
130+ fi
131+ echo " opkg install $UPDATE_FILE_PATH $UPDATE_OPTIONS "
132+ opkg install $UPDATE_FILE_PATH $UPDATE_OPTIONS
133+ else
134+ echo " Checksum does not match"
135+ fi
136+
137+ echo " Deleting $UPDATE_FILE_PATH "
138+ rm -f $UPDATE_FILE_PATH
139+ fi
140+ }
141+
142+ reboot_device () {
143+ /usr/bin/tektelic_reset
144+ }
145+
146+ case " $1 " in
147+ " remote-ctrl" )
148+ remote_ctrl
149+ ;;
150+ " update" )
151+ update
152+ ;;
153+ " reboot" )
154+ reboot_device
155+ ;;
156+ * )
157+ # # If no parameters are given, print which are available.
158+ echo " Usage: $0 {remote-ctrl|update|reboot}"
159+ exit 1
160+ ;;
161+ esac
0 commit comments