Skip to content

Commit 6b8975c

Browse files
committed
feat: add install script
1 parent cd07f11 commit 6b8975c

2 files changed

Lines changed: 175 additions & 2 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

install.sh

100644100755
Lines changed: 174 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,174 @@
1-
echo TODO
1+
#!/bin/bash
2+
if [ "$DEBUG" == "1" ]; then
3+
set -x
4+
fi
5+
TMP_DIR=$(mktemp -d -t jpillora-installer-XXXXXXXXXX)
6+
function cleanup {
7+
rm -rf $TMP_DIR > /dev/null
8+
}
9+
function fail {
10+
cleanup
11+
msg=$1
12+
echo "============"
13+
echo "Error: $msg" 1>&2
14+
exit 1
15+
}
16+
function install {
17+
#settings
18+
USER="RotrixLOL"
19+
PROG="do-not-cry"
20+
ASPROG=""
21+
MOVE="true"
22+
RELEASE="v1.1.0"
23+
INSECURE="false"
24+
OUT_DIR="/usr/local/bin"
25+
GH="https://github.com"
26+
#bash check
27+
[ ! "$BASH_VERSION" ] && fail "Please use bash instead"
28+
[ ! -d $OUT_DIR ] && fail "output directory missing: $OUT_DIR"
29+
#dependency check, assume we are a standard POISX machine
30+
which find > /dev/null || fail "find not installed"
31+
which xargs > /dev/null || fail "xargs not installed"
32+
which sort > /dev/null || fail "sort not installed"
33+
which tail > /dev/null || fail "tail not installed"
34+
which cut > /dev/null || fail "cut not installed"
35+
which du > /dev/null || fail "du not installed"
36+
#choose an HTTP client
37+
GET=""
38+
if which curl > /dev/null; then
39+
GET="curl"
40+
if [[ $INSECURE = "true" ]]; then GET="$GET --insecure"; fi
41+
GET="$GET --fail -# -L"
42+
elif which wget > /dev/null; then
43+
GET="wget"
44+
if [[ $INSECURE = "true" ]]; then GET="$GET --no-check-certificate"; fi
45+
GET="$GET -qO-"
46+
else
47+
fail "neither wget/curl are installed"
48+
fi
49+
#debug HTTP
50+
if [ "$DEBUG" == "1" ]; then
51+
GET="$GET -v"
52+
fi
53+
#optional auth to install from private repos
54+
#NOTE: this also needs to be set on your instance of installer
55+
AUTH="${GITHUB_TOKEN}"
56+
if [ ! -z "$AUTH" ]; then
57+
GET="$GET -H 'Authorization: $AUTH'"
58+
fi
59+
#find OS #TODO BSDs and other posixs
60+
case `uname -s` in
61+
Darwin) OS="darwin";;
62+
Linux) OS="linux";;
63+
*) fail "unknown os: $(uname -s)";;
64+
esac
65+
#find ARCH
66+
if uname -m | grep -E '(arm|arch)64' > /dev/null; then
67+
ARCH="arm64"
68+
69+
# no m1 assets. if on mac arm64, rosetta allows fallback to amd64
70+
if [[ $OS = "darwin" ]]; then
71+
ARCH="amd64"
72+
fi
73+
74+
elif uname -m | grep 64 > /dev/null; then
75+
ARCH="amd64"
76+
elif uname -m | grep arm > /dev/null; then
77+
ARCH="arm" #TODO armv6/v7
78+
elif uname -m | grep 386 > /dev/null; then
79+
ARCH="386"
80+
else
81+
fail "unknown arch: $(uname -m)"
82+
fi
83+
#choose from asset list
84+
URL=""
85+
FTYPE=""
86+
case "${OS}_${ARCH}" in
87+
"linux_arm64")
88+
URL="https://github.com/RotrixLOL/do-not-cry/releases/download/v1.1.0/donotcry-v1.1.0-aarch64-unknown-linux-gnu.tar.gz"
89+
FTYPE=".tar.gz"
90+
;;
91+
"linux_arm")
92+
URL="https://github.com/RotrixLOL/do-not-cry/releases/download/v1.1.0/donotcry-v1.1.0-armv7-unknown-linux-gnueabihf.tar.gz"
93+
FTYPE=".tar.gz"
94+
;;
95+
"darwin_amd64")
96+
URL="https://github.com/RotrixLOL/do-not-cry/releases/download/v1.1.0/donotcry-v1.1.0-x86_64-apple-darwin.tar.gz"
97+
FTYPE=".tar.gz"
98+
;;
99+
"linux_amd64")
100+
URL="https://github.com/RotrixLOL/do-not-cry/releases/download/v1.1.0/donotcry-v1.1.0-x86_64-unknown-linux-musl.tar.gz"
101+
FTYPE=".tar.gz"
102+
;;
103+
*) fail "No asset for platform ${OS}-${ARCH}";;
104+
esac
105+
#got URL! download it...
106+
echo -n "Installing"
107+
echo -n " $USER/$PROG"
108+
if [ ! -z "$RELEASE" ]; then
109+
echo -n " $RELEASE"
110+
fi
111+
if [ ! -z "$ASPROG" ]; then
112+
echo -n " as $ASPROG"
113+
fi
114+
echo -n " (${OS}/${ARCH})"
115+
116+
echo "....."
117+
118+
#enter tempdir
119+
mkdir -p $TMP_DIR
120+
cd $TMP_DIR
121+
if [[ $FTYPE = ".gz" ]]; then
122+
which gzip > /dev/null || fail "gzip is not installed"
123+
bash -c "$GET $URL" | gzip -d - > $PROG || fail "download failed"
124+
elif [[ $FTYPE = ".tar.bz" ]] || [[ $FTYPE = ".tar.bz2" ]]; then
125+
which tar > /dev/null || fail "tar is not installed"
126+
which bzip2 > /dev/null || fail "bzip2 is not installed"
127+
bash -c "$GET $URL" | tar jxf - || fail "download failed"
128+
elif [[ $FTYPE = ".tar.gz" ]] || [[ $FTYPE = ".tgz" ]]; then
129+
which tar > /dev/null || fail "tar is not installed"
130+
which gzip > /dev/null || fail "gzip is not installed"
131+
bash -c "$GET $URL" | tar zxf - || fail "download failed"
132+
elif [[ $FTYPE = ".zip" ]]; then
133+
which unzip > /dev/null || fail "unzip is not installed"
134+
bash -c "$GET $URL" > tmp.zip || fail "download failed"
135+
unzip -o -qq tmp.zip || fail "unzip failed"
136+
rm tmp.zip || fail "cleanup failed"
137+
elif [[ $FTYPE = ".bin" ]]; then
138+
bash -c "$GET $URL" > "do-not-cry_${OS}_${ARCH}" || fail "download failed"
139+
else
140+
fail "unknown file type: $FTYPE"
141+
fi
142+
#search subtree largest file (bin)
143+
TMP_BIN=$(find . -type f | xargs du | sort -n | tail -n 1 | cut -f 2)
144+
if [ ! -f "$TMP_BIN" ]; then
145+
fail "could not find find binary (largest file)"
146+
fi
147+
#ensure its larger than 1MB
148+
#TODO linux=elf/darwin=macho file detection?
149+
if [[ $(du -m $TMP_BIN | cut -f1) -lt 1 ]]; then
150+
fail "no binary found ($TMP_BIN is not larger than 1MB)"
151+
fi
152+
#move into PATH or cwd
153+
chmod +x $TMP_BIN || fail "chmod +x failed"
154+
DEST="$OUT_DIR/$PROG"
155+
if [ ! -z "$ASPROG" ]; then
156+
DEST="$OUT_DIR/$ASPROG"
157+
fi
158+
#move without sudo
159+
OUT=$(mv $TMP_BIN $DEST 2>&1)
160+
STATUS=$?
161+
# failed and string contains "Permission denied"
162+
if [ $STATUS -ne 0 ]; then
163+
if [[ $OUT =~ "Permission denied" ]]; then
164+
echo "mv with sudo..."
165+
sudo mv $TMP_BIN $DEST || fail "sudo mv failed"
166+
else
167+
fail "mv failed ($OUT)"
168+
fi
169+
fi
170+
echo "Installed at $DEST"
171+
#done
172+
cleanup
173+
}
174+
install

0 commit comments

Comments
 (0)