mirror of
https://github.com/dnote/dnote
synced 2026-03-14 14:35:50 +01:00
227 lines
5 KiB
Bash
Executable file
227 lines
5 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# This script installs Dnote into your PATH (/usr/bin/local)
|
|
# Use it like this:
|
|
# $ curl https://raw.githubusercontent.com/dnote/dnote/master/install.sh | sh
|
|
#
|
|
|
|
set -eu
|
|
|
|
BLACK='\033[30;1m'
|
|
RED='\033[91;1m'
|
|
GREEN='\033[32;1m'
|
|
RESET='\033[0m'
|
|
|
|
print_step() {
|
|
printf "$BLACK%s$RESET\n" "$1"
|
|
}
|
|
|
|
print_error() {
|
|
printf "$RED%s$RESET\n" "$1"
|
|
}
|
|
|
|
print_success() {
|
|
printf "$GREEN%s$RESET\n" "$1"
|
|
}
|
|
|
|
is_command () {
|
|
command -v "$1" >/dev/null 2>&1;
|
|
}
|
|
|
|
http_get() {
|
|
url=$1
|
|
|
|
if is_command curl; then
|
|
cmd='curl --fail -sSL'
|
|
elif is_command wget; then
|
|
cmd='wget -qO -'
|
|
else
|
|
print_error "unable to find wget or curl. please install and try again."
|
|
exit 1
|
|
fi
|
|
|
|
$cmd "$url"
|
|
}
|
|
|
|
http_download() {
|
|
dest=$1
|
|
srcURL=$2
|
|
|
|
if is_command curl; then
|
|
cmd='curl -L --progress-bar'
|
|
destflag='-o'
|
|
elif is_command wget; then
|
|
cmd='wget -q --show-progress'
|
|
destflag='-O'
|
|
else
|
|
print_error "unable to find wget or curl. please install and try again."
|
|
exit 1
|
|
fi
|
|
|
|
$cmd $destflag "$dest" "$srcURL"
|
|
}
|
|
|
|
uname_os() {
|
|
os=$(uname -s | tr '[:upper:]' '[:lower:]')
|
|
echo "$os"
|
|
}
|
|
|
|
uname_arch() {
|
|
arch=$(uname -m)
|
|
case $arch in
|
|
x86_64) arch="amd64" ;;
|
|
aarch64) arch="arm64" ;;
|
|
arm64) arch="arm64" ;;
|
|
armv7l) arch="arm" ;;
|
|
armv6l) arch="arm" ;;
|
|
armv5l) arch="arm" ;;
|
|
arm) arch="arm" ;;
|
|
x86) arch="386" ;;
|
|
i686) arch="386" ;;
|
|
i386) arch="386" ;;
|
|
esac
|
|
|
|
echo "$arch"
|
|
}
|
|
|
|
check_platform() {
|
|
os=$1
|
|
arch=$2
|
|
platform="$os/$arch"
|
|
|
|
found=1
|
|
case "$platform" in
|
|
# Linux
|
|
linux/amd64) found=0 ;;
|
|
linux/arm64) found=0 ;;
|
|
linux/arm) found=0 ;;
|
|
# macOS
|
|
darwin/amd64) found=0 ;;
|
|
darwin/arm64) found=0 ;;
|
|
# Windows
|
|
windows/amd64) found=0 ;;
|
|
# FreeBSD
|
|
freebsd/amd64) found=0 ;;
|
|
esac
|
|
|
|
return $found
|
|
}
|
|
|
|
hash_sha256() {
|
|
TARGET=${1:-/dev/stdin}
|
|
if is_command gsha256sum; then
|
|
hash=$(gsha256sum "$TARGET")
|
|
echo "$hash" | cut -d ' ' -f 1
|
|
elif is_command sha256sum; then
|
|
hash=$(sha256sum "$TARGET")
|
|
echo "$hash" | cut -d ' ' -f 1
|
|
elif is_command shasum; then
|
|
hash=$(shasum -a 256 "$TARGET" 2>/dev/null)
|
|
echo "$hash" | cut -d ' ' -f 1
|
|
elif is_command openssl; then
|
|
hash=$(openssl -dst openssl dgst -sha256 "$TARGET")
|
|
echo "$hash" | cut -d ' ' -f a
|
|
else
|
|
print_error "could not find a command to compute sha256 hash and verify checksum"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
verify_checksum() {
|
|
filepath=$1
|
|
checksums=$2
|
|
|
|
filename=$(basename "$filepath")
|
|
|
|
want=$(grep "${filename}" "${checksums}" 2>/dev/null | cut -d ' ' -f 1)
|
|
if [ -z "$want" ]; then
|
|
print_error "unable to find checksum for '${filename}' in '${checksums}'"
|
|
exit 1
|
|
fi
|
|
got=$(hash_sha256 "$filepath")
|
|
if [ "$want" != "$got" ]; then
|
|
print_error "checksum for '$filepath' did not verify ${want} vs $got"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
install_dnote() {
|
|
sudo_cmd=""
|
|
|
|
os=$(uname_os)
|
|
arch=$(uname_arch)
|
|
|
|
if ! check_platform "$os" "$arch"; then
|
|
print_error "System not supported: $os/$arch"
|
|
print_error "Please compile manually from https://github.com/dnote/dnote"
|
|
exit 1
|
|
fi
|
|
|
|
binary=dnote
|
|
owner=dnote
|
|
repo=cli
|
|
github_download="https://github.com/${owner}/${repo}/releases/download"
|
|
tmpdir="$(mktemp -d)"
|
|
bindir=${bindir:-/usr/local/bin}
|
|
|
|
if hash sudo 2>/dev/null; then
|
|
sudo_cmd="sudo"
|
|
echo "You need a root privilege to install Dnote binary to $bindir"
|
|
|
|
if ! is_command "$sudo_cmd"; then
|
|
print_error "command not found: sudo. You need a root privilege to continue the installation."
|
|
exit 1;
|
|
fi
|
|
fi
|
|
|
|
# create destination directory if not exists
|
|
$sudo_cmd mkdir -p "$bindir"
|
|
|
|
# get the latest version
|
|
resp=$(http_get "https://api.github.com/repos/$owner/$repo/releases")
|
|
version=$(echo "$resp" | tr ',' '\n' | grep -m 1 "\"tag_name\": \"cli" | cut -f4 -d'"')
|
|
|
|
if [ -z "$version" ]; then
|
|
print_error "Error fetching latest version. Please try again."
|
|
exit 1
|
|
fi
|
|
|
|
# remove the preceding 'cli-v'
|
|
version="${version#cli-v}"
|
|
|
|
checksum=${binary}_${version}_checksums.txt
|
|
filename=${binary}_${version}_${os}_${arch}
|
|
tarball="${filename}.tar.gz"
|
|
binary_url="${github_download}/cli-v${version}/${tarball}"
|
|
checksum_url="${github_download}/cli-v${version}/${checksum}"
|
|
|
|
print_step "Latest release version is v$version."
|
|
|
|
print_step "Downloading $binary_url."
|
|
http_download "$tmpdir/$tarball" "$binary_url"
|
|
|
|
print_step "Downloading the checksum file for v$version"
|
|
http_download "$tmpdir/$checksum" "$checksum_url"
|
|
|
|
print_step "Comparing checksums for binaries."
|
|
verify_checksum "$tmpdir/$tarball" "$tmpdir/$checksum"
|
|
|
|
# unzip tar
|
|
print_step "Inflating the binary."
|
|
(cd "${tmpdir}" && tar -xzf "${tarball}")
|
|
|
|
$sudo_cmd install -d "${bindir}"
|
|
$sudo_cmd install "${tmpdir}/${binary}" "${bindir}/"
|
|
|
|
print_success "dnote v${version} was successfully installed in $bindir."
|
|
}
|
|
|
|
exit_error() {
|
|
# shellcheck disable=SC2181
|
|
if [ "$?" -ne 0 ]; then
|
|
print_error "A problem occurred while installing Dnote. Please report it on https://github.com/dnote/dnote/issues so that we can help you."
|
|
fi
|
|
}
|
|
|
|
trap exit_error EXIT
|
|
install_dnote
|