-
Notifications
You must be signed in to change notification settings - Fork 135
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
* PMM-7883 Add PMM single line installer. * PMM-7883 Add/fix comments.. * PMM-7883 Fix url. * PMM-7883 Add more log. Supress some errors. * PMM-7883 Fix comment and parsing args. * PMM-7883 Simplify gathering info. * PMM-7883 Align output suppresing with posix. Use ip for ubuntu. * PMM-7883 Supress error in if. Fix IP parsing for ubuntu 16.04. * PMM-7883 Group messages. Fix syntax.
- Loading branch information
1 parent
10060a9
commit a4754fe
Showing
1 changed file
with
257 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,257 @@ | ||
#!/usr/bin/env bash | ||
# | ||
# ############################### | ||
# Script to run PMM 2. | ||
# If docker is not installed, this script will try to install it as root user. | ||
# | ||
# Usage example: | ||
# curl -fsSL https://raw.githubusercontent.com/percona/pmm/PMM-2.0/get-pmm.sh -o get-pmm2.sh; chmod +x get-pmm2.sh; ./get-pmm2.sh | ||
# | ||
################################# | ||
|
||
set -Eeuo pipefail | ||
trap cleanup SIGINT SIGTERM ERR EXIT | ||
|
||
# Set defaults. | ||
tag=${PMM_TAG:-"latest"} | ||
repo=${PMM_REPO:-"percona/pmm-server"} | ||
port=${PMM_PORT:-443} | ||
container_name=${CONTAINER_NAME:-"pmm-server"} | ||
interactive=0 | ||
root_is_needed='no' | ||
|
||
####################################### | ||
# Show script usage info. | ||
####################################### | ||
usage() { | ||
cat <<EOF | ||
Usage: $(basename "${BASH_SOURCE[0]}") [-h] [-v] [-i] [-t] [-n] [-p] | ||
Script description here. | ||
Available options: | ||
-h, --help Print this help and exit | ||
-v, --verbose Print script debug info | ||
-i, --interactive Run script in inteactive mode | ||
-t, --tag="$tag" | ||
PMM server container tag (default: latest - PMM server version) | ||
-r, --repo="$repo" | ||
PMM server container repo (default percona/pmm-server) | ||
-p, --port=${port} | ||
Port number to start PMM server on (default: 443) | ||
-n, --name=${container_name} | ||
PMM server container name (default: pmm-server) | ||
EOF | ||
exit | ||
} | ||
|
||
####################################### | ||
# Clean up setup if interrupt. | ||
####################################### | ||
cleanup() { | ||
trap - SIGINT SIGTERM ERR EXIT | ||
} | ||
|
||
####################################### | ||
# Defines colours for output messages. | ||
####################################### | ||
setup_colors() { | ||
if [[ -t 2 ]] && [[ -z "${NO_COLOR-}" ]] && [[ "${TERM-}" != "dumb" ]]; then | ||
NOFORMAT='\033[0m' RED='\033[0;31m' GREEN='\033[0;32m' ORANGE='\033[0;33m' | ||
BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' YELLOW='\033[1;33m' | ||
else | ||
NOFORMAT='' RED='' GREEN='' ORANGE='' BLUE='' PURPLE='' CYAN='' YELLOW='' | ||
fi | ||
} | ||
|
||
####################################### | ||
# Prints message to stderr with new line at the end. | ||
####################################### | ||
msg() { | ||
echo >&2 -e "${1-}" | ||
} | ||
|
||
####################################### | ||
# Prints message and exit with code. | ||
# Arguments: | ||
# message string; | ||
# exit code. | ||
# Outputs: | ||
# writes message to stderr. | ||
####################################### | ||
die() { | ||
local msg=$1 | ||
local code=${2-1} # default exit status 1 | ||
msg "$msg" | ||
exit "$code" | ||
} | ||
|
||
####################################### | ||
# Accept and parse script's params. | ||
####################################### | ||
parse_params() { | ||
while :; do | ||
case "${1-}" in | ||
-h | --help) usage ;; | ||
-v | --verbose) set -x ;; | ||
--no-color) NO_COLOR=1 ;; | ||
-i | --interactive) interactive=1 ;; | ||
-t | --tag) | ||
tag="${2-}" | ||
shift | ||
;; | ||
-r | --repo) | ||
repo="${2-}" | ||
shift | ||
;; | ||
-p | --port) | ||
port="${2-}" | ||
shift | ||
;; | ||
-?*) die "Unknown option: $1" ;; | ||
*) break ;; | ||
esac | ||
shift | ||
done | ||
|
||
args=("$@") | ||
|
||
return 0 | ||
} | ||
|
||
####################################### | ||
# Gathers PMM setup param in interactive mode. | ||
####################################### | ||
gather_info() { | ||
msg "${GREEN}PMM Server Wizard Install${NOFORMAT}" | ||
read -p " Port Number to start PMM Server on (default: 443): " port | ||
read -p " PMM Server Container Name (default: pmm-server): " container_name | ||
read -p " Override specific version (container tag) (default: latest in 2.x series) format: 2.x.y: " tag | ||
} | ||
|
||
check_command() { | ||
command -v "$@" 1>/dev/null | ||
} | ||
|
||
####################################### | ||
# Runs command as root. | ||
####################################### | ||
run_root() { | ||
sh='sh -c' | ||
if [ "$(id -un)" != 'root' ]; then | ||
if check_command sudo; then | ||
sh='sudo -E sh -c' | ||
elif check_command su; then | ||
sh='su -c' | ||
else | ||
die "${RED}ERROR: root rights needed to run "$*" command${NOFORMAT}" | ||
fi | ||
fi | ||
${sh} "$@" | ||
} | ||
|
||
####################################### | ||
# Installs docker if needed. | ||
####################################### | ||
install_docker() { | ||
printf "Checking docker installation" | ||
if ! check_command docker; then | ||
printf " - not installed. Installing...\n\n" | ||
curl -fsSL get.docker.com -o /tmp/get-docker.sh || | ||
wget -qO /tmp/get-docker.sh get.docker.com | ||
sh /tmp/get-docker.sh | ||
run_root 'service docker start' || : | ||
else | ||
printf " - installed.\n\n" | ||
fi | ||
|
||
if ! docker ps 1>/dev/null; then | ||
root_is_needed='yes' | ||
if ! run_root 'docker ps > /dev/null'; then | ||
die "${RED}ERROR: cannot run "docker ps" command${NOFORMAT}" | ||
fi | ||
fi | ||
} | ||
|
||
####################################### | ||
# Runs docker command as root if required. | ||
####################################### | ||
run_docker() { | ||
if [ "${root_is_needed}" = 'yes' ]; then | ||
run_root "docker $*" | ||
else | ||
sh -c "docker $*" | ||
fi | ||
} | ||
|
||
####################################### | ||
# Starts PMM server container with give repo, tag, name and port. | ||
# If any PMM server instance is run - stop and backup it. | ||
####################################### | ||
start_pmm() { | ||
msg "Starting PMM server..." | ||
run_docker "pull $repo:$tag 1> /dev/null" | ||
|
||
if ! run_docker "inspect pmm-data 1> /dev/null 2> /dev/null"; then | ||
run_docker "create -v /srv/ --name pmm-data percona/pmm-server:$tag /bin/true 1> /dev/null" | ||
msg "Created PMM Data Volume: pmm-data" | ||
fi | ||
|
||
if run_docker "inspect pmm-server 1> /dev/null 2> /dev/null"; then | ||
pmm_archive="pmm-server-$(date "+%F-%H%M%S")" | ||
msg "\tExisting PMM Server found, renaming to $pmm_archive\n" | ||
run_docker 'stop pmm-server' || : | ||
run_docker "rename pmm-server $pmm_archive\n" | ||
fi | ||
run_pmm="run -d -p $port:443 --volumes-from pmm-data --name $container_name --restart always $repo:$tag" | ||
|
||
run_docker "$run_pmm 1> /dev/null" | ||
msg "Created PMM Server: $container_name" | ||
msg "\tUse the following command if you ever need to update your container by hand:" | ||
msg "\tdocker $run_pmm \n" | ||
} | ||
|
||
####################################### | ||
# Shows final message. | ||
# Shows a list of addresses on which PMM server available. | ||
####################################### | ||
show_message() { | ||
msg "PMM Server has been successfully setup on this system!\n" | ||
|
||
if check_command ifconfig; then | ||
ips=$(ifconfig | awk '/inet / {print $2}' | sed 's/addr://') | ||
elif check_command ip; then | ||
ips=$(ip -f inet a | awk -F"[/ ]+" '/inet / {print $3}') | ||
else | ||
die "${RED}ERROR: cannot detect PMM server address${NOFORMAT}" | ||
fi | ||
|
||
msg "You can access your new server using the one of following web addresses:" | ||
for ip in $ips; do | ||
msg "\t${BLUE}https://$ip:$port/${NOFORMAT}" | ||
done | ||
msg "\nThe default username is '${PURPLE}admin${NOFORMAT}' and the password is '${PURPLE}admin${NOFORMAT}' :)" | ||
msg "Note: Some browsers may not trust the default SSL certificate when you first open one of the urls above." | ||
msg "If this is the case, Chrome users may want to type '${PURPLE}thisisunsafe${NOFORMAT}' to bypass the warning.\n" | ||
} | ||
|
||
main() { | ||
setup_colors | ||
if [[ $interactive == 1 ]]; then | ||
gather_info | ||
fi | ||
msg "Gathering/downloading required components, this may take a moment\n" | ||
install_docker | ||
start_pmm | ||
show_message | ||
} | ||
|
||
parse_params "$@" | ||
|
||
main | ||
die "Enjoy Percona Monitoring and Management!" 0 |