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