Skip to content

Commit e7478d3

Browse files
committed
Add install.sh script for automated VectraCtl installation
Introduced a Bash script to automate downloading, verifying, and installing the VectraCtl CLI tool. The script detects system architecture, checks for curl or wget, fetches the latest or specified release from GitHub, handles installation to /usr/local/bin (with sudo if needed), and provides user feedback and error handling. #23
1 parent 4aa6738 commit e7478d3

1 file changed

Lines changed: 227 additions & 0 deletions

File tree

‎install/install.sh‎

Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
#!/usr/bin/env bash
2+
3+
# VectraCtl location
4+
: ${VECTRACTL_INSTALL_DIR:="/usr/local/bin"}
5+
6+
# sudo is required to copy binary to VECTRACTL_INSTALL_DIR for linux
7+
: ${USE_SUDO:="false"}
8+
9+
# Http request vectractl
10+
HTTP_REQUEST_VECTRACTL=curl
11+
12+
# GitHub Organization and repo name to download release
13+
GITHUB_ORG=cortexiumlabs
14+
GITHUB_REPO=vectractl
15+
16+
# VectraCtl filename
17+
VECTRACTL_FILENAME=vectractl
18+
19+
VECTRACTL_FILE="${VECTRACTL_INSTALL_DIR}/${VECTRACTL_FILENAME}"
20+
21+
getSystemInfo() {
22+
ARCH=$(uname -m)
23+
case $ARCH in
24+
armv7*) ARCH="arm";;
25+
aarch64) ARCH="arm64";;
26+
x86_64) ARCH="x64";;
27+
esac
28+
29+
OS=$(echo `uname`|tr '[:upper:]' '[:lower:]')
30+
31+
# Most linux distro needs root permission to copy the file to /usr/local/bin
32+
if [[ "$OS" == "linux" || "$OS" == "darwin" ]] && [[ "VECTRACTL_INSTALL_DIR" == "/usr/local/bin" ]]; then
33+
USE_SUDO="true"
34+
fi
35+
}
36+
37+
verifySupported() {
38+
releaseTag=$1
39+
local supported=(darwin-x64 linux-x64 linux-arm linux-arm64)
40+
local current_osarch="${OS}-${ARCH}"
41+
42+
for osarch in "${supported[@]}"; do
43+
if [[ "$osarch" == "$current_osarch" ]]; then
44+
echo "Your system is ${OS}_${ARCH}"
45+
return
46+
fi
47+
done
48+
49+
if [[ "$current_osarch" == "darwin-arm64" ]]; then
50+
if isReleaseAvailable $releaseTag; then
51+
return
52+
else
53+
echo "The darwin_arm64 arch has no native binary for this version of VectraCtl, however you can use the amd64 version so long as you have rosetta installed"
54+
echo "Use 'softwareupdate --install-rosetta' to install rosetta if you don't already have it"
55+
ARCH="x64"
56+
return
57+
fi
58+
fi
59+
60+
echo "No prebuilt binary for ${current_osarch}"
61+
exit 1
62+
}
63+
64+
runAsRoot() {
65+
local CMD="$*"
66+
67+
if [[ $EUID -ne 0 && $USE_SUDO = "true" ]]; then
68+
CMD="sudo $CMD"
69+
fi
70+
71+
$CMD || {
72+
echo "Please visit https://github.com/cortexiumlabs/vectractl for instructions on how to install without sudo."
73+
exit 1
74+
}
75+
}
76+
77+
checkHttpRequestVectraCtl() {
78+
if type "curl" > /dev/null; then
79+
HTTP_REQUEST_VECTRACTL=curl
80+
elif type "wget" > /dev/null; then
81+
HTTP_REQUEST_VECTRACTL=wget
82+
else
83+
echo "Either curl or wget is required"
84+
exit 1
85+
fi
86+
}
87+
88+
checkExistingVectraCtl() {
89+
if [[ -f "$VECTRACTL_FILE" ]]; then
90+
echo -e "\nVectraCtl is detected:"
91+
$VECTRACTL_FILE --version
92+
echo -e "Reinstalling VectraCtl...\n"
93+
else
94+
echo -e "Installing VectraCtl...\n"
95+
fi
96+
}
97+
98+
getLatestRelease() {
99+
local vectrActlReleaseUrl="https://api.github.com/repos/${GITHUB_ORG}/${GITHUB_REPO}/releases"
100+
local latest_release=""
101+
102+
if [[ "$HTTP_REQUEST_VECTRACTL" == "curl" ]]; then
103+
latest_release=$(curl -s $vectrActlReleaseUrl | grep \"tag_name\" | grep -v rc | awk 'NR==1{print $2}' | sed -n 's/\"\(.*\)\",/\1/p')
104+
else
105+
latest_release=$(wget -q --header="Accept: application/json" -O - $vectrActlReleaseUrl | grep \"tag_name\" | grep -v rc | awk 'NR==1{print $2}' | sed -n 's/\"\(.*\)\",/\1/p')
106+
fi
107+
108+
ret_val=$latest_release
109+
}
110+
111+
downloadFile() {
112+
LATEST_RELEASE_TAG=$1
113+
114+
VECTRACTL_ARTIFACT="${VECTRACTL_FILENAME}-${OS}-${ARCH}.tar.gz"
115+
DOWNLOAD_BASE="https://github.com/${GITHUB_ORG}/${GITHUB_REPO}/releases/download"
116+
DOWNLOAD_URL="${DOWNLOAD_BASE}/${LATEST_RELEASE_TAG}/${VECTRACTL_ARTIFACT}"
117+
118+
# Create the temp directory
119+
VECTRACTL_TMP_ROOT=$(mktemp -dt vectractl-install-XXXXXX)
120+
ARTIFACT_TMP_FILE="$VECTRACTL_TMP_ROOT/$VECTRACTL_ARTIFACT"
121+
122+
echo "Downloading $DOWNLOAD_URL ..."
123+
if [[ "$HTTP_REQUEST_VECTRACTL" == "curl" ]]; then
124+
curl -SsL "$DOWNLOAD_URL" -o "$ARTIFACT_TMP_FILE"
125+
else
126+
wget -q -O "$ARTIFACT_TMP_FILE" "$DOWNLOAD_URL"
127+
fi
128+
129+
if [[ ! -f "$ARTIFACT_TMP_FILE" ]]; then
130+
echo "failed to download $DOWNLOAD_URL ..."
131+
exit 1
132+
fi
133+
}
134+
135+
isReleaseAvailable() {
136+
LATEST_RELEASE_TAG=$1
137+
138+
VECTRACTL_ARTIFACT="${VECTRACTL_FILENAME}-${OS}-${ARCH}.tar.gz"
139+
DOWNLOAD_BASE="https://github.com/${GITHUB_ORG}/${GITHUB_REPO}/releases/download"
140+
DOWNLOAD_URL="${DOWNLOAD_BASE}/${LATEST_RELEASE_TAG}/${VECTRACTL_ARTIFACT}"
141+
142+
if [[ "$HTTP_REQUEST_VECTRACTL" == "curl" ]]; then
143+
httpstatus=$(curl -sSLI -o /dev/null -w "%{http_code}" "$DOWNLOAD_URL")
144+
if [[ "$httpstatus" == "200" ]]; then
145+
return 0
146+
fi
147+
else
148+
wget -q --spider "$DOWNLOAD_URL"
149+
exitstatus=$?
150+
if [[ $exitstatus -eq 0 ]]; then
151+
return 0
152+
fi
153+
fi
154+
return 1
155+
}
156+
157+
installFile() {
158+
tar xf "$ARTIFACT_TMP_FILE" -C "$VECTRACTL_TMP_ROOT"
159+
local tmp_root_vectractl="$VECTRACTL_TMP_ROOT/$VECTRACTL_FILENAME"
160+
161+
if [[ ! -f "$tmp_root_vectractl" ]]; then
162+
echo "Failed to unpack VectraCtl executable."
163+
exit 1
164+
fi
165+
166+
if [[ -f "$VECTRACTL_FILE" ]]; then
167+
runAsRoot rm "$VECTRACTL_FILE"
168+
fi
169+
chmod o+x $tmp_root_vectractl
170+
mkdir -p $VECTRACTL_INSTALL_DIR
171+
runAsRoot cp "$tmp_root_vectractl" "$VECTRACTL_INSTALL_DIR"
172+
173+
if [[ -f "$VECTRACTL_FILE" ]]; then
174+
echo "$VECTRACTL_FILENAME installed into $VECTRACTL_INSTALL_DIR successfully."
175+
176+
$VECTRACTL_FILE --version
177+
else
178+
echo "Failed to install $VECTRACTL_FILENAME"
179+
exit 1
180+
fi
181+
}
182+
183+
fail_trap() {
184+
result=$?
185+
if [[ "$result" != "0" ]]; then
186+
echo "Failed to install VectraCtl"
187+
echo "For support, go to https://github.com/cortexiumlabs/vectractl"
188+
fi
189+
cleanup
190+
exit $result
191+
}
192+
193+
cleanup() {
194+
if [[ -d "${VECTRACTL_TMP_ROOT:-}" ]]; then
195+
rm -rf "$VECTRACTL_TMP_ROOT"
196+
fi
197+
}
198+
199+
installCompleted() {
200+
echo -e "\nTo get started with VectraCtl, please visit https://github.com/cortexiumlabs/vectractl"
201+
}
202+
203+
# -----------------------------------------------------------------------------
204+
# main
205+
# -----------------------------------------------------------------------------
206+
trap "fail_trap" EXIT
207+
208+
getSystemInfo
209+
checkHttpRequestVectraCtl
210+
211+
if [[ -z "$1" ]]; then
212+
echo "Getting the latest VectraCtl..."
213+
getLatestRelease
214+
else
215+
ret_val=v$1
216+
fi
217+
218+
verifySupported $ret_val
219+
checkExistingVectraCtl
220+
221+
echo "Installing $ret_val VectraCtl..."
222+
223+
downloadFile $ret_val
224+
installFile
225+
cleanup
226+
227+
installCompleted

0 commit comments

Comments
 (0)