mirror of https://github.com/statping/statping
				
				
				
			
		
			
				
	
	
		
			385 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			385 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
| #!/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/statup"
 | |
| AWS_ECS="$AWS_CLI --output json"
 | |
| DOCKER_PORT=8080
 | |
| 
 | |
| function usage() {
 | |
| cat <<EOM
 | |
| ##### Statup Installer #####
 | |
| A simple shell script that will help you install Statup on your local machine, AWS, or Docker.
 | |
| 
 | |
| Commands:
 | |
|     install             Install statup to your local system
 | |
|     aws                 Create a new EC2 instance running Statup
 | |
|     docker              Start the latest Statup Docker image
 | |
|     docker-compose      Create Statup with a Postgres database
 | |
|     version             Return the latest version of Statup
 | |
| 
 | |
| 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/statup
 | |
| 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() {
 | |
|   STATUP_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 statup to the bin folder
 | |
| function askInstallGlobal {
 | |
|     read -p "Do you want to move Statup to the bin folder? (y/N): "  MOVEBIN
 | |
| }
 | |
| 
 | |
| # ask user if they want statup to start on boot
 | |
| function askInstallSystemCTL {
 | |
|     read -p "Do you want to auto start Statup 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 "Statup 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 statup 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 Statup 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 statup binary to the bin folder
 | |
| function moveToBin {
 | |
|     mv statup /usr/local/bin/statup
 | |
| }
 | |
| 
 | |
| # function to install a systemctl service to the local system
 | |
| function installSystemCTL {
 | |
| FILE=statup.service
 | |
| cat > $FILE <<- EOM
 | |
| [Unit]
 | |
| Description=Statup Server
 | |
| After=network.target
 | |
| After=systemd-user-sessions.service
 | |
| After=network-online.target
 | |
| 
 | |
| [Service]
 | |
| Type=simple
 | |
| Restart=always
 | |
| ExecStart=/usr/local/bin/statup
 | |
| 
 | |
| [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 statup.service
 | |
| systemctl start statup
 | |
| echo "Statup 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/$STATUP_VERSION/statup-$OS-$ARCH.tar.gz"
 | |
|      echo "Downloading Statup $STATUP_VERSION from $GIT_DOWNLOAD"
 | |
|      curl -L --silent $GIT_DOWNLOAD | tar xz
 | |
|      echo "Download complete"
 | |
| }
 | |
| 
 | |
| # install statup locally from github
 | |
| function localTask {
 | |
|      downloadBin
 | |
|      echo "Try Statup by running 'statup version'!"
 | |
|      askInstallGlobal
 | |
|      if [ $MOVEBIN == "y" ]; then
 | |
|         moveToBin
 | |
|         echo "Statup can now be ran anywhere with command 'statup'"
 | |
|         echo "Install location: /usr/local/bin/statup"
 | |
|         if [ $OS == "linux" ]; then
 | |
|           askInstallSystemCTL
 | |
|           if [ $SYSTEMCTL == "y" ]; then
 | |
|             installSystemCTL
 | |
|           fi
 | |
|         fi
 | |
|     fi
 | |
| }
 | |
| 
 | |
| function uninstallTask {
 | |
|     rm -f /usr/local/bin/statup
 | |
| }
 | |
| 
 | |
| # start the Statup docker image
 | |
| function dockerTask {
 | |
|      echo "Starting Statup 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 "Statup Latest: $STATUP_VERSION"
 | |
|     echo "Statuper 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
 |