forked from statping/statping
-
Notifications
You must be signed in to change notification settings - Fork 0
/
statuper
executable file
·384 lines (344 loc) · 10.3 KB
/
statuper
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
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
#!/usr/bin/env bash
VERSION="0.1"
VERBOSE=false
SSLOPTION=false
AWSREGION="us-west-2"
US_W_1="ami-6d1ffd0e"
US_W_2="ami-7be8a103"
US_E_1="ami-b3be85cc"
US_E_2="ami-cc7a40a9"
AMI_IMAGE=$US_W_2
AWS_CLI=$(which aws)
DOCKER_CLI=$(which docker)
DOCKER_IMG="hunterlong/statping"
AWS_ECS="$AWS_CLI --output json"
DOCKER_PORT=8080
function usage() {
cat <<EOM
##### Statping Installer #####
A simple shell script that will help you install Statping on your local machine, AWS, or Docker.
Commands:
install Install statping to your local system
aws Create a new EC2 instance running Statping
docker Start the latest Statping Docker image
docker-compose Create Statping with a Postgres database
version Return the latest version of Statping
Available Flags:
-k | --aws-access-key AWS Access Key ID. May also be set as environment variable AWS_ACCESS_KEY_ID
-s | --aws-secret-key AWS Secret Access Key. May also be set as environment variable AWS_SECRET_ACCESS_KEY
-r | --region AWS Region Name. May also be set as environment variable AWS_DEFAULT_REGION
-x | --verbose Verbose output
Visit the github repo at: https://github.com/hunterlong/statping
EOM
exit 3
}
# Check requirements
function require() {
getOS
command -v "$1" > /dev/null 2>&1 || {
echo "Some of the required software is not installed:"
APP="$1" >&2;
echo " Required application: $APP"
if [ $OS == "osx" ]; then
echo " You can run 'brew install $APP'"
elif [ $OS == "linux" ]; then
echo " You can run 'apt install $APP'"
fi
exit 4;
}
}
# Get the latest release from github
get_latest_release() {
STATPING_VERSION=$(curl --silent "https://api.github.com/repos/$DOCKER_IMG/releases/latest" | jq -r .tag_name)
}
# auto set AWS environment variables
function setAWSPresets {
if [ -z ${AWS_DEFAULT_REGION+x} ];
then unset AWS_DEFAULT_REGION
else
AWS_ECS="$AWS_ECS --region $AWS_DEFAULT_REGION"
fi
if [ -z ${AWS_PROFILE+x} ];
then unset AWS_PROFILE
else
AWS_ECS="$AWS_ECS --profile $AWS_PROFILE"
fi
}
# ask the user to inser their AWS region
function awsAskRegion {
if [ -z ${AWS_DEFAULT_REGION+x} ]; then
read -p "Enter the AWS Region: " AWSREGION
else
AWSREGION=$AWS_DEFAULT_REGION
fi
}
# ask for the EC2 instance name
function askEC2Name {
read -p "Enter the Name for EC2 Instance: " SERVERNAME
}
# ask user if they want to use SSL
function askSSLOption {
read -p "Do you want to install a SSL certificate? (y/N):" SSLOPTION
}
# ask user for domain for SSL
function askSSLDomain {
read -p "Enter the Domain to attach the SSL certificate on: " SSLDOMAIN
}
# ask user for email for Letencrypt
function askSSLEmail {
read -p "Enter the Email for Lets Encrypt: " SSLEMAIL
}
# ask user for their EC2 Keypair for instance
function askEC2KeyName {
read -p "Enter the Keypair for EC2 Instance: " EC2KEYNAME
}
# ask user to create a new AWS security group namne
function askSecurityName {
read -p "Enter a name for the new Security Group: " EC2SECGROUP
}
# ask user if they want to install statping to the bin folder
function askInstallGlobal {
read -p "Do you want to move Statping to the bin folder? (y/N): " MOVEBIN
}
# ask user if they want statping to start on boot
function askInstallSystemCTL {
read -p "Do you want to auto start Statping on boot? (y/N): " SYSTEMCTL
}
# Task to create a new AWS security group
function awsSecurityGroup {
echo "Running task: Creating Security Group";
GROUPID=`$AWS_ECS ec2 create-security-group --group-name "$EC2SECGROUP" --description "Statping HTTP Server on port 80 and 443" | jq -r .GroupId`
echo "Created new security group: $GROUPID";
awsAuthSecurityGroup
}
# Task to open ports 80 and 443 for the security group
function awsAuthSecurityGroup {
$AWS_ECS ec2 authorize-security-group-ingress --group-id $GROUPID --protocol tcp --port 80 --cidr 0.0.0.0/0
$AWS_ECS ec2 authorize-security-group-ingress --group-id $GROUPID --protocol tcp --port 443 --cidr 0.0.0.0/0
echo "Authorize security group to be open on ports 80 and 443";
}
function awsCreateEC2 {
NEW_SRV=`$AWS_ECS ec2 run-instances --image-id $US_W_2 --count 1 --instance-type t2.nano --key-name $EC2KEYNAME --security-group-ids $GROUPID`
INSTANCE_ID=$(echo "${NEW_SRV}" | jq -r .Instances[0].InstanceId)
EC2_STATUS=$(echo "${NEW_SRV}" | jq -r .Instances[0].StateReason.Message)
echo "New EC2 instance created: $INSTANCE_ID with status $EC2_STATUS";
}
# task to created a new EC2 instance with statping image
function ec2TaskComplete {
echo "New EC2 instance is ready! $INSTANCE_ID with status $EC2_STATUS";
echo "Instance ID: $INSTANCE_ID with status $EC2_STATUS";
echo "Public DNS: $EC2_DNS";
if [ $SSLOPTION == "y" ]; then
echo "Now you have to add a CNAME DNS record on $SSLDOMAIN pointing to $EC2_DNS"
fi
}
# function to check the EC2 instance
function checkEC2Instance {
SRV_INFO=`$AWS_ECS ec2 describe-instances --instance-ids $INSTANCE_ID`
EC2_STATUS=$(echo "${SRV_INFO}" | jq -r .Reservations[0].Instances[0].State.Name)
EC2_DNS=$(echo "${SRV_INFO}" | jq -r .Reservations[0].Instances[0].PublicDnsName)
EC2_STATUS=$(echo "${SRV_INFO}" | jq -r .Reservations[0].Instances[0].State.Name)
if [ $EC2_STATUS == '"pending"' ]; then
echo "EC2 instance is still being created: $INSTANCE_ID";
sleep 2
checkEC2Instance
fi
}
# function to create the Statping EC2 instance
function awsTask {
setAWSPresets
askEC2Name
awsAskRegion
askSecurityName
askEC2KeyName
askSSLOption
if [ $SSLOPTION == "y" ]; then
askSSLDomain
askSSLEmail
fi
awsSecurityGroup
awsCreateEC2
checkEC2Instance
ec2TaskComplete
}
# function to move the statping binary to the bin folder
function moveToBin {
mv statping /usr/local/bin/statping
}
# function to install a systemctl service to the local system
function installSystemCTL {
FILE=statping.service
cat > $FILE <<- EOM
[Unit]
Description=Statping Server
After=network.target
After=systemd-user-sessions.service
After=network-online.target
[Service]
Type=simple
Restart=always
ExecStart=/usr/local/bin/statping
[Install]
WantedBy=multi-user.target
EOM
echo "Installing systemctl service file to: /etc/systemd/system/$FILE"
mv $FILE /etc/systemd/system/$FILE
systemctl daemon-reload
systemctl enable statping.service
systemctl start statping
echo "Statping has been installed to SystemCTL and will start on boot"
}
function downloadBin {
getOS
getArch
get_latest_release
GIT_DOWNLOAD="https://github.com/$DOCKER_IMG/releases/download/$STATPING_VERSION/statping-$OS-$ARCH.tar.gz"
echo "Downloading Statping $STATPING_VERSION from $GIT_DOWNLOAD"
curl -L --silent $GIT_DOWNLOAD | tar xz
echo "Download complete"
}
# install statping locally from github
function localTask {
downloadBin
echo "Try Statping by running 'statping version'!"
askInstallGlobal
if [ $MOVEBIN == "y" ]; then
moveToBin
echo "Statping can now be ran anywhere with command 'statping'"
echo "Install location: /usr/local/bin/statping"
if [ $OS == "linux" ]; then
askInstallSystemCTL
if [ $SYSTEMCTL == "y" ]; then
installSystemCTL
fi
fi
fi
}
function uninstallTask {
rm -f /usr/local/bin/statping
}
# start the Statping docker image
function dockerTask {
echo "Starting Statping Docker container on port $DOCKER_PORT"
$DOCKER_CLI run -d -p $DOCKER_PORT:8080 $DOCKER_IMG
}
# get 64x or 32 machine arch
function getArch {
MACHINE_TYPE=`uname -m`
if [ ${MACHINE_TYPE} == 'x86_64' ]; then
ARCH="x64"
else
ARCH="x32"
fi
}
# get the users operating system
function getOS {
OS="`uname`"
case $OS in
'Linux')
OS='linux'
alias ls='ls --color=auto'
;;
'FreeBSD')
OS='freebsd'
alias ls='ls -G'
;;
'WindowsNT')
OS='windows'
;;
'Darwin')
OS='osx'
;;
'SunOS')
OS='solaris'
;;
'AIX') ;;
*) ;;
esac
}
function echoVersion {
require jq
get_latest_release
echo "Statping Latest: $STATPING_VERSION"
echo "Statpinger Tool: v$VERSION"
}
# main CLI entrypoint
if [ "$BASH_SOURCE" == "$0" ]; then
set -o errexit
set -o pipefail
set -u
set -e
# If no args are provided, display usage information
if [ $# == 0 ]; then usage; fi
COMMD=$1
# Loop through arguments, two at a time for key and value
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
-k|--aws-access-key)
AWS_ACCESS_KEY_ID="$2"
shift # past argument
;;
-s|--aws-secret-key)
AWS_SECRET_ACCESS_KEY="$2"
shift # past argument
;;
-r|--region)
AWS_DEFAULT_REGION="$2"
shift # past argument
;;
-p|--port)
DOCKER_PORT="$2"
shift # past argument
;;
-x|--verbose)
VERBOSE=true
;;
*)
;;
esac
shift # past argument or value
done
if [ $VERBOSE == true ]; then
set -x
fi
case $COMMD in
aws)
require aws
require jq
awsTask
exit 0
;;
docker)
require docker
dockerTask
exit 0
;;
docker-compose)
require docker-compose
dockerComposeTask
exit 0
;;
install)
require jq
require curl
require tar
localTask
shift # past argument
;;
uninstall)
uninstallTask
shift # past argument
;;
version|v)
echoVersion
exit 0
;;
*)
;;
esac
shift # past argument or value
fi
exit 0
fi