#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

PROPS_FILE="$1"
KS_FILE="$2"
KS_PASS="$3"
KS_VALIDITY="$4"
CSR_FILE="$5"

ALIAS="cloud"
LIBVIRTD_FILE="/etc/libvirt/libvirtd.conf"

# Re-use existing password or use the one provided
if [ -f "$PROPS_FILE" ]; then
    OLD_PASS=$(sed -n '/keystore.passphrase/p' "$PROPS_FILE" 2>/dev/null  | sed 's/keystore.passphrase=//g' 2>/dev/null)
    if [ ! -z "${OLD_PASS// }" ]; then
        KS_PASS="$OLD_PASS"
    else
        sed -i "/keystore.passphrase.*/d" $PROPS_FILE 2> /dev/null || true
        echo "keystore.passphrase=$KS_PASS" >> $PROPS_FILE
    fi
fi

if [ -f "$KS_FILE" ]; then
    keytool -delete -noprompt -alias "$ALIAS" -keystore "$KS_FILE" -storepass "$KS_PASS" > /dev/null 2>&1 || true
fi

CN=$(hostname --fqdn)
keytool -genkey -storepass "$KS_PASS" -keypass "$KS_PASS" -alias "$ALIAS" -keyalg RSA -validity "$KS_VALIDITY" -dname cn="$CN",ou="cloudstack",o="cloudstack",c="cloudstack" -keystore "$KS_FILE" > /dev/null 2>&1

# Generate CSR
rm -f "$CSR_FILE"
addresses=$(ip address | grep inet | awk '{print $2}' | sed 's/\/.*//g' | grep -v '^169.254.' | grep -v '^127.0.0.1' | egrep -v '^::1|^fe80' | grep -v '^::1' | sed 's/^/ip:/g' | tr '\r\n' ',')
keytool -certreq -storepass "$KS_PASS" -alias "$ALIAS" -file $CSR_FILE -keystore "$KS_FILE" -ext san="$addresses" > /dev/null 2>&1

if [ $? -ne 0 ];then
    echo "Failed to generate CSR file, retrying after removing existing settings"

    if [ -f "$LIBVIRTD_FILE" ]; then
        echo "Reverting libvirtd to not listen on TLS"
        sed -i "s,^listen_tls=1,listen_tls=0,g" $LIBVIRTD_FILE
        systemctl restart libvirtd
    fi

    echo "Removing cloud.* files in /etc/cloudstack/agent"
    rm -f /etc/cloudstack/agent/cloud.*

    echo "Retrying to generate CSR file"
    keytool -certreq -storepass "$KS_PASS" -alias "$ALIAS" -file $CSR_FILE -keystore "$KS_FILE" -ext san="$addresses" >/dev/null 2>&1
    if [ $? -ne 0 ];then
        echo "Failed to generate CSR file while retrying"
        exit 1
    fi
fi

cat "$CSR_FILE"

# Fix file permissions
chmod 600 $KS_FILE
chmod 600 $PROPS_FILE
chmod 600 $CSR_FILE
