#!/bin/bash

# Creates a jenkins instance

# Exit on any errors
set -e

cartridge_type="jenkins-1.4"
source "/etc/openshift/node.conf"
source ${CARTRIDGE_BASE_PATH}/abstract/info/lib/util

function print_help {
    echo "Usage: $0 app-name namespace uuid git-url"

    echo "$0 $@" | logger -p local0.notice -t openshift_origin_jenkins_configure
    exit 1
}

function create_repo {
    application="$1"
    user_id=$2
    group_id=$3
    uuid=$4

    if [ ! -d $APP_HOME ]; then echo "ERROR: Application ${uuid} not found!  Please create." 1>&2; exit 2; fi

    GIT_DIR=$APP_HOME/git/$application.git
    mkdir -p "$APP_HOME/git"
    
    cp -ad ${CARTRIDGE_BASE_PATH}/$cartridge_type/template $APP_HOME/git
    
    pushd $APP_HOME/git/template > /dev/null
    git init > /dev/null
    git add *
    git commit -m 'Creating template' > /dev/null
    popd > /dev/null
    pushd $APP_HOME/git > /dev/null
    git clone --bare --no-hardlinks template $application.git > /dev/null
    rm -rf template
    popd > /dev/null

    setup_git_repo $application $user_id $group_id $uuid "jenkins 1.4"
}

function obfuscate_password {
    password="$1"
    acegi_security_path=`find ${APP_HOME}/app-root/data/war/WEB-INF/lib/ -name acegi-security-*.jar`
    commons_codec_path=`find ${APP_HOME}/app-root/data/war/WEB-INF/lib/ -name commons-codec-*.jar`

    java -classpath "${acegi_security_path}:${commons_codec_path}:${CARTRIDGE_BASE_PATH}/jenkins-1.4/info/lib/password-encoder.jar" com.redhat.openshift.PasswordEncoder $password
}

function generate_ssh_keys {
    /bin/mkdir -p $APP_HOME/app-root/data/.ssh/
    /usr/bin/ssh-keygen -N '' -f $APP_HOME/app-root/data/.ssh/jenkins_id_rsa > /dev/null

    /bin/chown root.$uuid -R "$APP_HOME/app-root/data/.ssh/"
    chmod 0750 "$APP_HOME/app-root/data/.ssh/"
    chmod 0640 "$APP_HOME/app-root/data/.ssh/jenkins_id_rsa"
    chmod 0640 "$APP_HOME/app-root/data/.ssh/jenkins_id_rsa.pub"
    observe_setup_var_lib_dir "$APP_HOME/app-root/data/.ssh/"
}

function generate_ssh_keys {
    /bin/mkdir -p $APP_DIR/data/.ssh/
    /usr/bin/ssh-keygen -N '' -f $APP_DIR/data/.ssh/jenkins_id_rsa > /dev/null

    /bin/chown root.$uuid -R "$APP_DIR/data/.ssh/"
    chmod 0750 "$APP_DIR/data/.ssh/"
    chmod 0640 "$APP_DIR/data/.ssh/jenkins_id_rsa"
    chmod 0640 "$APP_DIR/data/.ssh/jenkins_id_rsa.pub"
    observe_setup_var_lib_dir "$APP_DIR/data/.ssh/"
}


while getopts 'd' OPTION
do
    case $OPTION in
        d) set -x
        ;;
        ?) print_help
        ;;
    esac
done

[ $# -eq 4 -o $# -eq 3 ] || print_help

setup_configure "$1" $2 $3 $4
disable_cgroups
check_cartridge_dir_doesnt_exist


#
# Setup the base of the application
#
create_cartridge_instance_dir "$cartridge_type"
JENKINS_INSTANCE_DIR=$(get_cartridge_instance_dir "$cartridge_type")

pushd "$JENKINS_INSTANCE_DIR" > /dev/null
create_standard_app_dirs
mkdir logs
popd > /dev/null

#
# Generate key pair
#
generate_ssh_keys

public_key=$(cat $APP_HOME/app-root/data/.ssh/jenkins_id_rsa.pub)
set -- $public_key
add_ssh_key "$2"

add_broker_auth_key

admin_password=$(generate_password)
system_builder_password=$(generate_password)

cp -ad "$CART_INFO_DIR/configuration/jenkins-pre-deploy/"* "$APP_HOME/app-root/data/"
openshift_server=`echo "${BROKER_HOST}" | sed -e "s/\/*$//" `
sed -i "s,OPENSHIFT_SERVER,$openshift_server,g" "$APP_HOME/app-root/data/config.xml"
unzip -q /usr/lib/jenkins/jenkins.war -d "$APP_HOME/app-root/data/war/"
admin_password_hash=`obfuscate_password $admin_password`
sed -i "s,PASSWORD,$admin_password_hash,g" "$APP_HOME/app-root/data/users/admin/config.xml"
system_builder_password_hash=`obfuscate_password $system_builder_password`
sed -i "s,PASSWORD,$system_builder_password_hash,g" "$APP_HOME/app-root/data/users/system_builder/config.xml"
echo $system_builder_password > $APP_HOME/.jenkins_password

export JENKINS_USERNAME=system_builder
export JENKINS_PASSWORD=$system_builder_password

# Repo
if [ ! -d $git_url ]; then
	clone_external_git_repo $application $user_id $group_id $uuid $git_url
else
	create_repo $application $user_id $group_id $uuid
fi

#
# Find an open localhost IP
#
IP=`find_open_ip $uid $uuid`

populate_repo_dir

secure_app_dir

secure_cart_instance_dir

observe_setup_app_and_git_dirs

observe_setup_cart_instance_dir

#
# Create environment variables
#
create_standard_cart_env_vars
create_standard_env_uservars
create_standard_network_env_vars $IP
create_cart_network_env_vars $IP
create_standard_repo_dir_env_var
create_standard_path_env_var

observe_setup_env_uservars_dir

#
# Import environment vars so they can be used:
#
import_env_vars

#
# Start the server
#
start_app

#
# Create virtualhost definition for apache
#
export CART_INFO_DIR
$CART_INFO_DIR/bin/deploy_httpd_proxy.sh $application $namespace $uuid $IP

restart_httpd_graceful

client_result ""
client_result "Jenkins created successfully.  Please make note of these credentials:"
client_result ""
client_result "   User: admin"
client_result "   Password: $admin_password"
client_result ""
client_result "Note:  You can change your password at: https://${application}-${namespace}.${CLOUD_DOMAIN}/me/configure"
client_result ""

cart_props "username=system_builder"
cart_props "password=$system_builder_password"

add_env_var "JENKINS_URL=https://${application}-${namespace}.${CLOUD_DOMAIN}/"
add_env_var "JENKINS_USERNAME=system_builder"
add_env_var "JENKINS_PASSWORD=$system_builder_password"
enable_cgroups
