-
Notifications
You must be signed in to change notification settings - Fork 0
/
toolsman.sh
executable file
·272 lines (240 loc) · 8.83 KB
/
toolsman.sh
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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
#!/bin/bash
function __display_app_name_banner() {
local STRING_TO_ECHO=$(printf "%-$(expr length "${@}")s");
echo -e " ${STRING_TO_ECHO// /_}__\n / ${STRING_TO_ECHO// / } \\\\\n | ${@} |\n \\\\${STRING_TO_ECHO// /_}__/";
}
function __display_last_message() {
local CHARACTERS_COUNT=$(printf "%-$(expr length "$(echo -e "${@}" | sed "$(echo -e "${@}" | wc -l)!d")")s");
echo -e "${@}\n${CHARACTERS_COUNT// /*}";
}
function __get_environment_info() {
ARCH=$(uname -m)
case $ARCH in
armv5*) ARCH="armv5";;
armv6*) ARCH="armv6";;
armv7*) ARCH="arm";;
aarch64) ARCH="arm64";;
x86) ARCH="386";;
x86_64) ARCH="amd64";;
i686) ARCH="386";;
i386) ARCH="386";;
esac;
OS=$(echo `uname` | tr '[:upper:]' '[:lower:]');
}
function __execute_command() {
#https://stackoverflow.com/questions/11027679/capture-stdout-and-stderr-into-different-variables
which $(echo "${@}" | cut -d " " -f1) &> /dev/null;
if [[ "$?" -ne 0 ]];
then
return 1;
else
unset T_STD T_ERR T_RET;
local T_STD T_ERR T_RET;
eval "$( eval "${@}" 2> >(T_ERR=$(cat); typeset -p T_ERR) > >(T_STD=$(cat); typeset -p T_STD); T_RET=$?; typeset -p T_RET )";
printf "${T_STD}";
return $T_RET;
fi;
}
function __download_file() {
local DESTINATION_FILE=${1};
local DOWNLOAD_FILE_URL=${2};
__execute_command "curl -sfIo /dev/null ${DOWNLOAD_FILE_URL}";
if [[ "$?" -ne 0 ]];
then
return 1;
fi;
printf "⏬ Starting to download.\n";
curl -# -Lo ${DESTINATION_FILE} ${DOWNLOAD_FILE_URL};
if [[ -f "${DESTINATION_FILE}" ]];
then
true;
else
false;
fi;
}
function __verify_downloaded_file() {
local FILE_TO_VERIFY=${1};
local COMMAND_TO_VERIFY=${2};
if [ ! -z "${COMMAND_TO_VERIFY}" ];
then
eval ${COMMAND_TO_VERIFY};
if [[ "$?" -eq 0 ]];
then
printf "✅ Downloaded file verified successfully.\n";
return 0;
else
rm -f "${FILE_TO_VERIFY}";
return 1;
fi;
fi;
}
function __unzip_and_strip() {
local ARCHIVE=${1};
local DESTINATION_DIR=${2:-};
local TEMP_DIR=$(mktemp -dt toolsman_zip_XXXXXX);
unzip -qq ${ARCHIVE} -d ${TEMP_DIR};
local SOURCE_DIR=$(dirname $(find ${TEMP_DIR} -type f -print -quit));
cp -rpf ${SOURCE_DIR}/* ${DESTINATION_DIR}/.;
}
function __extract_deb_file() {
local ARCHIVE=${1};
local DESTINATION_DIR=${2:-};
local TEMP_DIR=$(mktemp -dt toolsman_deb_XXXXXX);
ar x ${ARCHIVE} data.tar.xz --output="${TEMP_DIR}";
tar -xf ${TEMP_DIR}/data.tar.xz -C "${TEMP_DIR}";
rm -f ${TEMP_DIR}/data.tar.xz;
local SOURCE_DIR=$(find ${TEMP_DIR} -type d -name $(basename "${DESTINATION_DIR}") | grep "${DESTINATION_DIR}");
cp -rpf "${SOURCE_DIR}"/* "${DESTINATION_DIR}"/.;
}
function __do_upgrade() {
local DOWNLOAD_DIR=$(dirname ${1});
local DOWNLOAD_FILE=$(basename ${1});
local DOWNLOAD_FILE_EXT="${DOWNLOAD_FILE##*.}";
local DESTINATION_DIR=${2};
printf "⬆️ Starting to upgrade.\n";
if [[ ! -f "${DOWNLOAD_DIR}/${DOWNLOAD_FILE}" ]];
then
false;
else
case "$DOWNLOAD_FILE_EXT" in
gz | tgz | xz )
tar xf "${DOWNLOAD_DIR}/${DOWNLOAD_FILE}" --directory "${DESTINATION_DIR}"/ --strip-components=$(tar tf "${DOWNLOAD_DIR}/${DOWNLOAD_FILE}" | grep "\/$" | sort | head -n1 | grep -o "\/" | wc -l);
;;
zip)
__unzip_and_strip "${DOWNLOAD_DIR}/${DOWNLOAD_FILE}" "${DESTINATION_DIR}"/;
;;
deb)
__extract_deb_file "${DOWNLOAD_DIR}/${DOWNLOAD_FILE}" "${DESTINATION_DIR}";
;;
*)
rm -f ${DESTINATION_DIR}/${DOWNLOAD_FILE};
mv ${DOWNLOAD_DIR}/${DOWNLOAD_FILE} ${DESTINATION_DIR}/${DOWNLOAD_FILE};
chmod u+x ${DESTINATION_DIR}/${DOWNLOAD_FILE};
;;
esac;
true;
fi;
}
function __split_repo_line() {
IFS=';' read -r -a REPO_LINE_ARRAY <<< "${@}";
}
function __read_repo_file() {
readarray -t REPO_LINES < "${@}";
}
function __showBusyText() {
frames="/ | \\ -"
while kill -0 ${2} 2&>1 > /dev/null;
do
for frame in $frames;
do
printf "\r$frame ${1}";
sleep 0.5
done
done
}
function __display_format() {
bold=$(tput bold);
underline=$(tput smul);
italic=$(tput sitm);
info=$(tput setaf 2);
error=$(tput setaf 160);
warn=$(tput setaf 214);
reset=$(tput sgr0);
echo "${info}INFO${reset}: This is an ${bold}info${reset} message";
echo "${error}ERROR${reset}: This is an ${underline}error${reset} message";
echo "${warn}WARN${reset}: This is a ${italic}warning${reset} message";
}
function main() {
local REPO_LINE;
for REPO_LINE in "${REPO_LINES[@]}";
do
if [ -z "${REPO_LINE}" ];
then
continue;
fi;
__split_repo_line "${REPO_LINE}";
local APP_NAME=${REPO_LINE_ARRAY[0]};
local INSTALLED_VERSION_COMMAND=${REPO_LINE_ARRAY[1]};
local DESTINATION_DIRECTORY=${REPO_LINE_ARRAY[2]};
local AVAILABLE_VERSION_COMMAND=${REPO_LINE_ARRAY[3]};
local DOWNLOAD_FILE_URL=${REPO_LINE_ARRAY[4]};
local VERIFY_DOWNLOADED_FILE_COMMAND=${REPO_LINE_ARRAY[5]};
printf "💻 App name: ${APP_NAME#"#"}\n";
if [[ ${REPO_LINE:0:1} = \# ]];
then
__display_last_message "🟡 Upgrade status: This app is not to be upgraded as it is commented. ";
continue;
fi;
if [ ! -d "${DESTINATION_DIRECTORY}" ] || [ ! "$(ls -A "${DESTINATION_DIRECTORY}")" ];
then
__display_last_message "⛔ Upgrade status: Directory \"${DESTINATION_DIRECTORY}\" does not exists or it is empty. ";
continue;
fi;
local INSTALLED_VERSION;
INSTALLED_VERSION=$(__execute_command "${INSTALLED_VERSION_COMMAND}");
if [[ "$?" -ne 0 || "$(echo ${INSTALLED_VERSION} | grep [0-9] -q && echo $?)" != "0" ]];
then
__display_last_message "⛔ Installed version: Error getting it. ";
continue;
fi;
printf "📌 Installed version: ${INSTALLED_VERSION}\n";
local INSTALLED_VERSION_BY_BITS=( ${INSTALLED_VERSION//./ } );
local INSTALLED_VERSION_MAJOR_BIT=${INSTALLED_VERSION_BY_BITS[0]};
local INSTALLED_VERSION_MINOR_BIT=${INSTALLED_VERSION_BY_BITS[1]};
local INSTALLED_VERSION_PATCH_BIT=${INSTALLED_VERSION_BY_BITS[2]};
if [ -z "${DOWNLOAD_FILE_URL}" ];
then
printf "⏬ Checking for updates and self upgrading.\n";
SELF_UPDATE_OUTPUT=$(__execute_command "${AVAILABLE_VERSION_COMMAND}");
printf "✅ Self upgraded and the ouput is...\n";
__display_last_message "🟢 Upgrade status: ${SELF_UPDATE_OUTPUT} ";
continue;
fi;
local AVAILABLE_VERSION;
AVAILABLE_VERSION=$(__execute_command "$(echo ${AVAILABLE_VERSION_COMMAND} | sed "s|\${MajorVersionBit}|${INSTALLED_VERSION_MAJOR_BIT}|Ig")");
if [[ "$?" -ne 0 ]];
then
__display_last_message "⛔ Available version: Error getting it. ";
continue;
fi;
local DOWNLOAD_FILE=$(basename ${DOWNLOAD_FILE_URL} | sed "s|[-_.]x86[-_.]64||Ig;s|[-_.]\${OperatingSystem}64||Ig;s|[-_.]\${OperatingSystem}||Ig;s|[-_.]\${ProcessorArchitecture}||Ig;s|[-_.]\${AvailableVersion}||Ig;s|[-_.]v\${AvailableVersion}||Ig;s|\${AvailableVersion}||Ig");
#Hack for Chrome/Edge where available version is followed by a dash and number. This version number is necessary in the download file URL only.
DOWNLOAD_FILE_URL=$(echo "${DOWNLOAD_FILE_URL}" | sed "s|\${MajorVersionBit}|${INSTALLED_VERSION_MAJOR_BIT}|Ig;s|\${AvailableVersion}|${AVAILABLE_VERSION}|Ig;s|\${OperatingSystem}|${OS}|Ig;s|\${ProcessorArchitecture}|${ARCH}|Ig");
VERIFY_DOWNLOADED_FILE_COMMAND=$(echo "${VERIFY_DOWNLOADED_FILE_COMMAND}" | sed "s|\${MajorVersionBit}|${INSTALLED_VERSION_MAJOR_BIT}|Ig;s|\${DestinationDir}|${DESTINATION_DIRECTORY}|Ig;s|\${AvailableVersion}|${AVAILABLE_VERSION}|Ig;s|\${OperatingSystem}|${OS}|Ig;s|\${ProcessorArchitecture}|${ARCH}|Ig");
#Removing dash and number from available version as it is no more necessary.
local AVAILABLE_VERSION=$(echo ${AVAILABLE_VERSION/-*/});
if [[ "${INSTALLED_VERSION}" == "${AVAILABLE_VERSION}" ]];
then
__display_last_message "🟢 Upgrade status: This app is up-to-date with latest version installed. ";
continue;
fi;
if [[ "${INSTALLED_VERSION}" != "${AVAILABLE_VERSION}" ]];
then
printf "☁️ Available version: ${AVAILABLE_VERSION}\n";
local TEMP_DOWNLOAD_FILE="$(mktemp -dt toolsman_download_XXXXXX)/${DOWNLOAD_FILE}";
__download_file "${TEMP_DOWNLOAD_FILE}" "${DOWNLOAD_FILE_URL}";
if [[ "$?" -ne 0 ]];
then
__display_last_message "⛔ Upgrade status: Couldn't download \"${APP_NAME#"#"}\" update of ${AVAILABLE_VERSION} version. ";
continue;
fi;
__verify_downloaded_file "${TEMP_DOWNLOAD_FILE}" "$(echo ${VERIFY_DOWNLOADED_FILE_COMMAND} | sed "s|\${DestinationFile}|${TEMP_DOWNLOAD_FILE}|Ig")";
if [[ "$?" -ne 0 ]];
then
__display_last_message "⛔ Upgrade status: Downloaded file verification failed. ";
continue;
fi;
__do_upgrade "${TEMP_DOWNLOAD_FILE}" "${DESTINATION_DIRECTORY}";
if [[ "$(__execute_command ${INSTALLED_VERSION_COMMAND})" != "${AVAILABLE_VERSION}" ]];
then
__display_last_message "🟡 Upgrade status: Upgrade done. However, there is a mismatch in versions. ";
continue;
fi;
__display_last_message "🟢 Upgrade status: Upgraded successfully. ";
fi;
done;
}
__get_environment_info;
__read_repo_file "$(dirname "$(readlink -f "$0")")/repo";
main;
exit;