#!/bin/sh

if [ $# -ne 3 ]
then
    echo "usage: $0 <linux user> <local IP> <cluster-name>"
    exit
fi

echo "#### Please make sure that the user you entered  ####"
echo "#### is consistenct with the old one used as the ####"
echo "#### owner to deploy EM service, which you can   ####"
echo "#### check from the genrated config.yaml         ####"
read -r -p "Do you want to continue? [y/N] " response
if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]; then
    echo "start do preparation for upgrade"
else
    echo "do nothing"
    exit 1
fi

USER=$1
IP=$2
EM_NAME=$3

script_dir=$(cd $(dirname $0) && pwd)
CONFIG_TEMPLATE_YAML=$script_dir/config_template.yaml
bin_dir=/home/${USER}/.tiup/bin
EM_TIUP_HOME=/home/${USER}/.em
EM_BACKUP_FOLDER=em-v1.0.0-backup
EM_BACKUP_FOLDER_FULL_PATH=/home/${USER}/${EM_BACKUP_FOLDER}
FILEBEAT_TOPO=${EM_BACKUP_FOLDER_FULL_PATH}/resource-filebeat-scale-out-topology.yaml

echo "##### backup em metadata started #####"
em_metadata_folder=metadata-$(date +%Y%m%d-%H%M%S)
em_metadata_path=${EM_BACKUP_FOLDER_FULL_PATH}/${em_metadata_folder}
su - $USER << EOF
mkdir -p ${em_metadata_path}
TIUP_HOME=${EM_TIUP_HOME} "${bin_dir}/tiup" em backup ${EM_NAME} ${em_metadata_path} -N ${IP}
EOF
echo "##### backup em metadata finished, location: ${em_metadata_path}/em.db #####"

echo "##### backup resource machine filebeat topology started #####"
su - $USER -c "TIUP_HOME=${EM_TIUP_HOME} ${bin_dir}/tiup em display ${EM_NAME}"  | grep filebeat | grep -v ${IP} | awk -F ':' '{print $1}' > ${EM_BACKUP_FOLDER_FULL_PATH}/rft.log
chmod 666 ${EM_BACKUP_FOLDER_FULL_PATH}/rft.log
chown ${USER}:${USER} ${EM_BACKUP_FOLDER_FULL_PATH}/rft.log
echo "filebeat_servers:" > ${FILEBEAT_TOPO}
echo >> ${FILEBEAT_TOPO}
while read -r line
do
   echo "  - host: $line" >> ${FILEBEAT_TOPO}
   echo "    ssh_port: 22" >> ${FILEBEAT_TOPO}
   echo >> ${FILEBEAT_TOPO}
done < ${EM_BACKUP_FOLDER_FULL_PATH}/rft.log
chown ${USER}:${USER} ${FILEBEAT_TOPO}
echo "##### backup resource machine filebeat topology finished, location: ${FILEBEAT_TOPO} #####"

echo "##### backup EM v1.0.0 meta.yaml started #####"
cp /home/${USER}/.em/storage/em/clusters/${EM_NAME}/meta.yaml /home/${USER}/${EM_BACKUP_FOLDER}/meta-1.0.0.yaml
chown ${USER}:${USER} /home/${USER}/${EM_BACKUP_FOLDER}/meta-1.0.0.yaml
echo "##### backup EM v1.0.0 meta.yaml finished, location: /home/${USER}/${EM_BACKUP_FOLDER}/meta-1.0.0.yaml #####"

echo "##### yank old EFK and Grafana started #####"
su - $USER << EOF
TIUP_HOME=${EM_TIUP_HOME} "${bin_dir}/tiup" mirror modify elasticsearch:v7.14.0 --yank
TIUP_HOME=${EM_TIUP_HOME} "${bin_dir}/tiup" mirror modify filebeat:v7.14.0 --yank
TIUP_HOME=${EM_TIUP_HOME} "${bin_dir}/tiup" mirror modify kibana:v7.14.0 --yank
TIUP_HOME=${EM_TIUP_HOME} "${bin_dir}/tiup" mirror modify grafana:v8.4.4 --yank
EOF
echo "##### yank old EFK and Grafana finished #####"

echo "##### generate new config $NEW_CONFIG_YAML started #####"
CONFIG_YAML=/home/$USER/config.yaml
NEW_CONFIG_YAML=/home/$USER/config-v1.0.1.yaml
cp $CONFIG_TEMPLATE_YAML $NEW_CONFIG_YAML
chmod 666 $NEW_CONFIG_YAML
sed -i "s/{ip}/$IP/g" $NEW_CONFIG_YAML
sed -i "s/# db_path:/  db_path:/" $NEW_CONFIG_YAML
sed -i "s/em_metadata_folder/${em_metadata_folder}/" $NEW_CONFIG_YAML
echo "##### generate new config $NEW_CONFIG_YAML finished #####"


echo "##### dynamically prepare TiUniManager cert started #####"
em_all_cert_dir=/em-data/em-cert
common_cert_dir=${em_all_cert_dir}/common
etcd_cert_dir=${em_all_cert_dir}/etcd
mkdir -p ${em_all_cert_dir}
mkdir -p ${common_cert_dir}
mkdir -p ${etcd_cert_dir}

cd ${common_cert_dir}
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -days 1024 -out rootCA.pem -subj '/CN=em-server/O=PingCAP/C=CN'
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr -subj '/CN=em-server/O=PingCAP/C=CN'
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 3650
echo $RANDOM | md5sum | head -c 32 > aes.key

cfsslBinPath=${script_dir}/tools
cfsslConfigPath=${script_dir}/configs
cd ${etcd_cert_dir}
${cfsslBinPath}/cfssl gencert -initca ${cfsslConfigPath}/ca-csr.json | ${cfsslBinPath}/cfssljson -bare etcd-ca -
${cfsslBinPath}/cfssl gencert -ca=etcd-ca.pem -ca-key=etcd-ca-key.pem --config=${cfsslConfigPath}/ca-config.json \
-profile=server ${cfsslConfigPath}/server.json | ${cfsslBinPath}/cfssljson  -bare etcd-server

chown -R ${USER}:${USER} ${em_all_cert_dir}
em_cert_dir=/home/${USER}/em-cert
mkdir -p ${em_cert_dir}
cp ${common_cert_dir}/aes.key ${em_cert_dir}
cp ${common_cert_dir}/server.crt ${em_cert_dir}
cp ${common_cert_dir}/server.csr ${em_cert_dir}
cp ${common_cert_dir}/server.key ${em_cert_dir}
cp ${etcd_cert_dir}/etcd-ca.pem ${em_cert_dir}
cp ${etcd_cert_dir}/etcd-server-key.pem ${em_cert_dir}
cp ${etcd_cert_dir}/etcd-server.pem ${em_cert_dir}
chown -R ${USER}:${USER} ${em_cert_dir}
echo "##### dynamically prepare TiUniManager cert finished #####"
