293 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			293 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
#!/bin/bash
 | 
						|
####
 | 
						|
 # Pterodactyl - Panel
 | 
						|
 # Copyright (c) 2015 - 2016 Dane Everitt <dane@daneeveritt.com>
 | 
						|
 #
 | 
						|
 # Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
						|
 # of this software and associated documentation files (the "Software"), to deal
 | 
						|
 # in the Software without restriction, including without limitation the rights
 | 
						|
 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
						|
 # copies of the Software, and to permit persons to whom the Software is
 | 
						|
 # furnished to do so, subject to the following conditions:
 | 
						|
 #
 | 
						|
 # The above copyright notice and this permission notice shall be included in all
 | 
						|
 # copies or substantial portions of the Software.
 | 
						|
 #
 | 
						|
 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
						|
 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
						|
 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
						|
 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
						|
 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
						|
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
						|
 # SOFTWARE.
 | 
						|
####
 | 
						|
set +e
 | 
						|
export DEBIAN_FRONTEND=noninteractive
 | 
						|
 | 
						|
INSTALL_DIR="/srv/daemon"
 | 
						|
DATA_DIR="{{ $node->daemonBase }}"
 | 
						|
CURRENT_SYSTEM_KERNEL="$(uname -r)"
 | 
						|
DL_VERSION="0.0.1"
 | 
						|
 | 
						|
command_exists() {
 | 
						|
    command -v "$@" > /dev/null 2>&1
 | 
						|
}
 | 
						|
 | 
						|
error_message() {
 | 
						|
    echo -e "\e[1m\e[97m\e[41m$1\e[0m"
 | 
						|
    exit 1
 | 
						|
}
 | 
						|
 | 
						|
warning_message() {
 | 
						|
    echo -e "\e[43m\e[30m$1\e[0m"
 | 
						|
}
 | 
						|
 | 
						|
success_message() {
 | 
						|
    echo -e "\e[32m$1\e[0m"
 | 
						|
}
 | 
						|
 | 
						|
running_command() {
 | 
						|
    echo -e " ;; \e[47m\e[30m$1\e[0m"
 | 
						|
}
 | 
						|
 | 
						|
for i in "$@"
 | 
						|
do
 | 
						|
    case $i in
 | 
						|
        -d|--directory)
 | 
						|
            INSTALL_DIR="$2"
 | 
						|
            ;;
 | 
						|
        -a|--datadir)
 | 
						|
            DATA_DIR="$2"
 | 
						|
            ;;
 | 
						|
        -g|--git)
 | 
						|
            USE_GIT=true
 | 
						|
            ;;
 | 
						|
        -u|--unstable)
 | 
						|
            USE_UNSTABLE=true
 | 
						|
            USE_GIT=true
 | 
						|
            ;;
 | 
						|
        -v|--version)
 | 
						|
            DL_VERSION="$2"
 | 
						|
            ;;
 | 
						|
        -h|--help)
 | 
						|
            echo "./installer [opts]"
 | 
						|
            echo "     -d | --directory    The directory to install the daemon into. (default: /srv/daemon)"
 | 
						|
            echo "     -a | --datadir      The directory that daemon users will be stored in. (default: /srv/daemon-data)"
 | 
						|
            echo "     -g | --git          Use this flag to download the daemon using a git clone. (default: false)"
 | 
						|
            echo "     -u | --unstable     Install unstable version of the daemon, automatically uses --git flag. (default: false)"
 | 
						|
            echo "     -v | --version      The version of the daemon to download."
 | 
						|
            exit
 | 
						|
            ;;
 | 
						|
    esac
 | 
						|
shift
 | 
						|
done
 | 
						|
 | 
						|
warning_message "This program will automatically configure your system to run the Pterodactyl Daemon."
 | 
						|
warning_message "      - Install Location: $INSTALL_DIR"
 | 
						|
warning_message "      -    Data Location: $DATA_DIR"
 | 
						|
warning_message "This script will continue in 10 seconds. Press CRTL+C to exit now."
 | 
						|
sleep 10
 | 
						|
 | 
						|
# Super basic system detection
 | 
						|
if command_exists apt-get; then
 | 
						|
    INSTALL_CMD="apt-get -y"
 | 
						|
elif command_exists yum; then
 | 
						|
    INSTALL_CMD="yum -y"
 | 
						|
else
 | 
						|
    error_message "No supported repository manager was found."
 | 
						|
fi
 | 
						|
 | 
						|
if ! command_exists curl; then
 | 
						|
    warning_message "No file retrieval method found, installing curl now..."
 | 
						|
    running_command "$INSTALL_CMD -y install curl"
 | 
						|
    $INSTALL_CMD -y install curl
 | 
						|
    if [ "$?" -ne "0" ]; then
 | 
						|
        error_message "Unable to install curl and no other method was found for retrieving files."
 | 
						|
    fi
 | 
						|
fi
 | 
						|
 | 
						|
# Determine if the kernel is high enough version.
 | 
						|
if command_exists awk; then
 | 
						|
    PROCESSED_KERNEL_VERSION=$(awk -F. '{print $1$2}' <<< $CURRENT_SYSTEM_KERNEL)
 | 
						|
elif command_exists cut; then
 | 
						|
    PROCESSED_KERNEL_VERSION=$(cut -d. -f1-2 --output-delimiter='' <<< $CURRENT_SYSTEM_KERNEL)
 | 
						|
else
 | 
						|
    error_message "You seem to be missing some core tools that this script needs: awk (or) cut"
 | 
						|
fi
 | 
						|
 | 
						|
if [ "$PROCESSED_KERNEL_VERSION" -lt "310" ]; then
 | 
						|
    error_message "Your kernel version must be at least 3.10 or higher for the daemon to work. You are using $CURRENT_SYSTEM_KERNEL"
 | 
						|
fi
 | 
						|
 | 
						|
check_cgroups() {
 | 
						|
    # Check CGroups
 | 
						|
    CGROUP_DIRECTORY_LISTING="$(awk '/[, ](cpu|cpuacct|cpuset|devices|freezer|memory)[, ]/ && $3 == "cgroup" { print $2 }' /proc/mounts | head -n1)"
 | 
						|
    if [ ! -z $CGROUP_DIRECTORY_LISTING -a -d $CGROUP_DIRECTORY_LISTING ]; then
 | 
						|
        CGROUP_DIRECTORY="$(dirname $CGROUP_DIRECTORY_LISTING 2>&1)"
 | 
						|
        if [ -d "$CGROUP_DIRECTORY/cpu" -a -d "$CGROUP_DIRECTORY/cpuacct" -a -d "$CGROUP_DIRECTORY/cpuset" -a -d "$CGROUP_DIRECTORY/devices" -a -d "$CGROUP_DIRECTORY/freezer" -a -d "$CGROUP_DIRECTORY/memory" ]; then
 | 
						|
            success_message "cgroups enabled and are valid on this machine."
 | 
						|
        else
 | 
						|
            error_message "You appear to be missing some important cgroups on this machine."
 | 
						|
        fi
 | 
						|
    else
 | 
						|
        if [ ! -e "/proc/cgroups" ]; then
 | 
						|
            error_message "This kernel does not appear to support cgroups! Please see https://gist.github.com/DaneEveritt/0f071f481b4d3fa637d4 for more information."
 | 
						|
        elif [ ! -d "/sys/fs/cgroup" ]; then
 | 
						|
            error_message "This kernel does not appear to support cgroups! Please see https://gist.github.com/DaneEveritt/0f071f481b4d3fa637d4 for more information."
 | 
						|
        fi
 | 
						|
 | 
						|
        if [ ! -f "/tmp/mount_cgroup.sh" ]; then
 | 
						|
            # Try to enable cgroups
 | 
						|
            warning_message "Attempting to enable cgroups on this machine..."
 | 
						|
            running_command "curl -L https://raw.githubusercontent.com/tianon/cgroupfs-mount/master/cgroupfs-mount > /tmp/mount_cgroup.sh"
 | 
						|
            curl -L https://raw.githubusercontent.com/tianon/cgroupfs-mount/master/cgroupfs-mount > /tmp/mount_cgroup.sh
 | 
						|
 | 
						|
            running_command "chmod +x /tmp/mount_cgroup.sh"
 | 
						|
            chmod +x /tmp/mount_cgroup.sh
 | 
						|
 | 
						|
            running_command "bash /tmp/mount_cgroup.sh"
 | 
						|
            bash /tmp/mount_cgroup.sh
 | 
						|
            check_cgroups
 | 
						|
        else
 | 
						|
            rm -rf /tmp/mount_cgroup.sh > /dev/null 2>&1
 | 
						|
            error_message "Failed to enable cgroups on this machine."
 | 
						|
        fi
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
# Check those groups.
 | 
						|
check_cgroups
 | 
						|
 | 
						|
# Lets install the dependencies.
 | 
						|
$INSTALL_CMD install linux-image-extra-$CURRENT_SYSTEM_KERNEL
 | 
						|
if [ "$?" -ne "0" ]; then
 | 
						|
    warning_message "You appear to have a non-generic kernel meaning we could not install extra kernel tools."
 | 
						|
    warning_message "We will continue to install, but some docker enhancements might not work as expected."
 | 
						|
    warning_message "Continuing in 10 seconds, press CTRL+C to cancel this script."
 | 
						|
    sleep 10
 | 
						|
fi
 | 
						|
 | 
						|
success_message "Installing Docker..."
 | 
						|
running_command "curl -L https://get.docker.com/ | sh"
 | 
						|
curl -L https://get.docker.com/ | sh
 | 
						|
if [ "$?" -ne "0" ]; then
 | 
						|
    error_message "Unable to install docker, an error occured!"
 | 
						|
fi;
 | 
						|
 | 
						|
success_message "Installing NodeJS 5.x..."
 | 
						|
running_command "curl -L https://deb.nodesource.com/setup_5.x | sudo -E bash -"
 | 
						|
curl -L https://deb.nodesource.com/setup_5.x | sudo -E bash -
 | 
						|
if [ "$?" -ne "0" ]; then
 | 
						|
    error_message "Unable to configure NodeJS, an error occured!"
 | 
						|
fi;
 | 
						|
 | 
						|
running_command "$INSTALL_CMD install tar nodejs"
 | 
						|
$INSTALL_CMD install tar nodejs
 | 
						|
if [ "$?" -ne "0" ]; then
 | 
						|
    error_message "Unable to install NodeJS or Tar, an error occured!"
 | 
						|
fi;
 | 
						|
 | 
						|
running_command "mkdir -p $INSTALL_DIR $DATA_DIR"
 | 
						|
mkdir -p $INSTALL_DIR $DATA_DIR
 | 
						|
cd $INSTALL_DIR
 | 
						|
 | 
						|
if [ -z $USE_UNSTABLE -a -z $USE_GIT ]; then
 | 
						|
    CLEANUP_PROGRAMS="nodejs docker-engine"
 | 
						|
 | 
						|
    running_command "curl -sI https://github.com/Pterodactyl/Daemon/archive/$DL_VERSION.tar.gz | head -n1 | cut -d$' ' -f2"
 | 
						|
    GITHUB_STATUS="$(curl -sI https://github.com/Pterodactyl/Daemon/archive/$DL_VERSION.tar.gz | head -n1 | cut -d$' ' -f2)"
 | 
						|
    if [ $GITHUB_STATUS -ne "200" ]; then
 | 
						|
        $INSTALL_CMD remove $CLEANUP_PROGRAMS 2>&1
 | 
						|
        error_message "Github returned a non-200 response code ($GITHUB_STATUS)"
 | 
						|
    fi
 | 
						|
 | 
						|
    running_command "curl -L \"https://github.com/Pterodactyl/Daemon/archive/$DL_VERSION.tar.gz\" > daemon.tar.gz"
 | 
						|
    curl -L "https://github.com/Pterodactyl/Daemon/archive/$DL_VERSION.tar.gz" > daemon.tar.gz
 | 
						|
 | 
						|
    running_command "tar --strip-components=1 -xzvf daemon.tar.gz"
 | 
						|
    tar --strip-components=1 -xzvf daemon.tar.gz 2>&1
 | 
						|
    if [ "$?" -ne "0" ]; then
 | 
						|
        $INSTALL_CMD remove $CLEANUP_PROGRAMS 2>&1
 | 
						|
        cd ~ && rm -rf $INSTALL_DIR 2>&1
 | 
						|
        error_message "Unable to install the daemon due to an error while attempting to unpack files."
 | 
						|
    fi
 | 
						|
elif [ $USE_GIT ]; then
 | 
						|
    CLEANUP_PROGRAMS="nodejs docker-engine git"
 | 
						|
    running_command "$INSTALL_CMD install git"
 | 
						|
    $INSTALL_CMD install git
 | 
						|
 | 
						|
    running_command "git clone https://github.com/Pterodactyl/Daemon.git ."
 | 
						|
    git clone https://github.com/Pterodactyl/Daemon.git .
 | 
						|
    if [ -z $USE_UNSTABLE ]; then
 | 
						|
        running_command "git checkout tags/$DL_VERSION"
 | 
						|
        git checkout tags/$DL_VERSION
 | 
						|
    fi
 | 
						|
    if [ "$?" -ne "0" ]; then
 | 
						|
        $INSTALL_CMD remove $CLEANUP_PROGRAMS 2>&1
 | 
						|
        cd ~ && rm -rf $INSTALL_DIR 2>&1
 | 
						|
        error_message "Unable to install the daemon due to an error while attempting to clone files to the server."
 | 
						|
    fi
 | 
						|
else
 | 
						|
    error_message "Could not match an install method!"
 | 
						|
fi
 | 
						|
 | 
						|
running_command "npm install --production"
 | 
						|
npm install --production
 | 
						|
if [ "$?" -ne "0" ]; then
 | 
						|
    $INSTALL_CMD remove $CLEANUP_PROGRAMS 2>&1
 | 
						|
    cd ~ && rm -rf $INSTALL_DIR 2>&1
 | 
						|
    error_message "Unable to install the daemon due to an error that occured while running npm install."
 | 
						|
fi
 | 
						|
 | 
						|
running_command "docker run -d --name ptdl-sftp -p 2022:22 -v $DATA_DIR:/sftp-root -v $INSTALL_DIR/config/credentials:/creds quay.io/pterodactyl/scrappy"
 | 
						|
docker run -d --name ptdl-sftp -p 2022:22 -v $DATA_DIR:/sftp-root -v $INSTALL_DIR/config/credentials:/creds quay.io/pterodactyl/scrappy
 | 
						|
if [ "$?" -ne "0" ]; then
 | 
						|
    $INSTALL_CMD remove $CLEANUP_PROGRAMS 2>&1
 | 
						|
    cd ~ && rm -rf $INSTALL_DIR 2>&1
 | 
						|
    error_message "Unable to install the daemon due to an error while creating a SFTP container."
 | 
						|
fi
 | 
						|
 | 
						|
echo '{
 | 
						|
    "web": {
 | 
						|
        "listen": {{ $node->daemonListen }},
 | 
						|
        "ssl": {
 | 
						|
            "enabled": {{ $node->sceheme === 'https' ? 'true' : 'false' }},
 | 
						|
            "certificate": "/etc/letsencrypt/live/{{ $node->fqdn }}/fullchain.pem",
 | 
						|
            "key": "/etc/letsencrypt/live/{{ $node->fqdn }}/privkey.pem"
 | 
						|
        }
 | 
						|
    },
 | 
						|
    "docker": {
 | 
						|
        "socket": "/var/run/docker.sock"
 | 
						|
    },
 | 
						|
    "sftp": {
 | 
						|
        "path": "{{ $node->daemonBase }}",
 | 
						|
        "port": {{ $node->daemonSFTP }},
 | 
						|
        "container": "ptdl-sftp"
 | 
						|
    },
 | 
						|
    "logger": {
 | 
						|
        "path": "logs/",
 | 
						|
        "src": false,
 | 
						|
        "level": "info",
 | 
						|
        "period": "1d",
 | 
						|
        "count": 3
 | 
						|
    },
 | 
						|
    "remote": {
 | 
						|
        "download": "{{ route('remote.download') }}",
 | 
						|
        "installed": "{{ route('remote.install') }}"
 | 
						|
    },
 | 
						|
    "uploads": {
 | 
						|
        "maximumSize": 100000000
 | 
						|
    },
 | 
						|
    "keys": [
 | 
						|
        "{{ $node->daemonSecret }}"
 | 
						|
    ]
 | 
						|
}' > config/core.json
 | 
						|
if [ "$?" -ne "0" ]; then
 | 
						|
    $INSTALL_CMD remove $CLEANUP_PROGRAMS
 | 
						|
    cd ~ && rm -rf $INSTALL_DIR 2>&1
 | 
						|
    error_message "An error occured while attempting to save the JSON file."
 | 
						|
fi
 | 
						|
 | 
						|
success_message "Congratulations, the daemon is now installed."
 | 
						|
exit
 |