#!/bin/bash
######################################################## made by yqqyjy ##############################################
IFS_OLD=${IFS}
IFS=$'\n'
getparam()
{
  writetolog "info:getparam read setupfile $1..."
  ################## motherboard ##################
  ls_temp="[host]"
  ls_originalline=`awk  -v var1=$ls_temp 'BEGIN {a=0}$0!~/^[[:blank:]]+$|^$/{if (a==1) if (!match($0,/\[/)) {print $0} else {exit} else if ($0==var1) {a=1}}' $1`
  for ls_templine in ${ls_originalline}
  do
     ls_line=${ls_templine%=*}
     if [[ ${ls_line} == "hostname" ]];then
        ls_hostname=${ls_templine#*=}
     elif [[ ${ls_line} == "arch" ]];then
        ls_arch=${ls_templine#*=}
     elif [[ ${ls_line} == "ip" ]];then
        ls_masterip=${ls_templine#*=}
     fi
  done
  ls_temp="[sharestorage]"
  ls_originalline=`awk  -v var1=$ls_temp 'BEGIN {a=0}$0!~/^[[:blank:]]+$|^$/{if (a==1) if (!match($0,/\[/)) {print $0} else {exit} else if ($0==var1) {a=1}}' $1`
  for ls_templine in ${ls_originalline}
  do
     ls_line=${ls_templine%=*}
     if [[ ${ls_line} == "sharepath" ]];then
        ls_sharepath=${ls_templine#*=}
     elif [[ ${ls_line} == "exportsips" ]];then
        ls_exportsips=${ls_templine#*=}
     elif [[ ${ls_line} == "sharestoragelabelname" ]];then
        ls_sharestoragelabelname=${ls_templine#*=}
     elif [[ ${ls_line} == "sharestoragelabelvalue" ]];then
        ls_sharestoragelabelvalue=${ls_templine#*=}
     elif [[ ${ls_line} == "sharestoragecapacity" ]];then
        ls_sharestoragecapacity=${ls_templine#*=}
     fi
  done
  ls_temp="[harbor]"
   ls_originalline=`awk  -v var1=$ls_temp 'BEGIN {a=0}$0!~/^[[:blank:]]+$|^$/{if (a==1) if (!match($0,/\[/)) {print $0} else {exit} else if ($0==var1) {a=1}}' $1`
  for ls_templine in ${ls_originalline}
  do
     ls_line=${ls_templine%=*}
     if [[ ${ls_line} == "harborregistry" ]];then
        ls_harborregistry=${ls_templine#*=}
     elif [[ ${ls_line} == "harborhostname" ]];then
        ls_harborhostname=${ls_templine#*=}
     elif [[ ${ls_line} == "harbornodename" ]];then
        ls_harbornodename=${ls_templine#*=}
     elif [[ ${ls_line} == "harborport" ]];then
        ls_harborport=${ls_templine#*=}
     elif [[ ${ls_line} == "harboruser" ]];then
        ls_haroboruser=${ls_templine#*=}
     elif [[ ${ls_line} == "harborpasswd" ]];then
        ls_harborpasswd=${ls_templine#*=}
     fi
  done
   ls_temp="[prometheus]"
   ls_originalline=`awk  -v var1=$ls_temp 'BEGIN {a=0}$0!~/^[[:blank:]]+$|^$/{if (a==1) if (!match($0,/\[/)) {print $0} else {exit} else if ($0==var1) {a=1}}' $1`
  for ls_templine in ${ls_originalline}
  do
     ls_line=${ls_templine%=*}
     if [[ ${ls_line} == "prometheuslabelname" ]];then
        ls_prometheuslabelname=${ls_templine#*=}
     elif [[ ${ls_line} == "prometheuslabelvalue" ]];then
        ls_prometheuslabelvalue=${ls_templine#*=}
     elif [[ ${ls_line} == "prometheusnodename" ]];then
        ls_prometheusnodename=${ls_templine#*=}
     elif [[ ${ls_line} == "prometheushostname" ]];then
        ls_prometheuhostname=${ls_templine#*=}
     elif [[ ${ls_line} == "prometheusport" ]];then
        ls_prometheusport=${ls_templine#*=}
     elif [[ ${ls_line} == "nodeexporterport" ]];then
        ls_nodeexporterport=${ls_templine#*=}
     elif [[ ${ls_line} == "prometheussetup" ]];then
        ls_prometheussetup=${ls_templine#*=}
     fi
  done
  ls_temp="[lighttpd]"
   ls_originalline=`awk  -v var1=$ls_temp 'BEGIN {a=0}$0!~/^[[:blank:]]+$|^$/{if (a==1) if (!match($0,/\[/)) {print $0} else {exit} else if ($0==var1) {a=1}}' $1`
  for ls_templine in ${ls_originalline}
  do
     ls_line=${ls_templine%=*}
     if [[ ${ls_line} == "lighttpdport" ]];then
        ls_lighttpdport=${ls_templine#*=}
     elif [[ ${ls_line} == "lighttpdbind" ]];then
        ls_lighttpdbind=${ls_templine#*=}
     elif [[ ${ls_line} == "lighttpdhostname" ]];then
        ls_lighttpdhostname=${ls_templine#*=}
     elif [[ ${ls_line} == "lighttpdnodename" ]];then
        ls_lighttpdnodename=${ls_templine#*=}
     fi
  done
  ls_temp="[rabbitmq]"
   ls_originalline=`awk  -v var1=$ls_temp 'BEGIN {a=0}$0!~/^[[:blank:]]+$|^$/{if (a==1) if (!match($0,/\[/)) {print $0} else {exit} else if ($0==var1) {a=1}}' $1`
  for ls_templine in ${ls_originalline}
  do
     ls_line=${ls_templine%=*}
     if [[ ${ls_line} == "rabbitmqhostname" ]];then
        ls_rabbitmqhostname=${ls_templine#*=}
     elif [[ ${ls_line} == "rabbitmqnodename" ]];then
        ls_rabbitmqnodename=${ls_templine#*=}
     elif [[ ${ls_line} == "rabbitmqlabelname" ]];then
        ls_rabbitmqlabelname=${ls_templine#*=}
     elif [[ ${ls_line} == "rabbitmqlabelvalue" ]];then
        ls_rabbitmqlabelvalue=${ls_templine#*=}
     fi
  done
  ls_temp="[ntp]"
   ls_originalline=`awk  -v var1=$ls_temp 'BEGIN {a=0}$0!~/^[[:blank:]]+$|^$/{if (a==1) if (!match($0,/\[/)) {print $0} else {exit} else if ($0==var1) {a=1}}' $1`
  for ls_templine in ${ls_originalline}
  do
     ls_line=${ls_templine%=*}
     if [[ ${ls_line} == "ntphostname" ]];then
        ls_ntphostname=${ls_templine#*=}
     elif [[ ${ls_line} == "ntpnodename" ]];then
        ls_ntpnodename=${ls_templine#*=}
     elif [[ ${ls_line} == "ntpstratum" ]];then
        ls_ntpstratum=${ls_templine#*=}
     fi
  done
  ls_temp="[docker]"
   ls_originalline=`awk  -v var1=$ls_temp 'BEGIN {a=0}$0!~/^[[:blank:]]+$|^$/{if (a==1) if (!match($0,/\[/)) {print $0} else {exit} else if ($0==var1) {a=1}}' $1`
  for ls_templine in ${ls_originalline}
  do
     ls_line=${ls_templine%=*}
     if [[ ${ls_line} == "dockerdataroot" ]];then
        ls_dockerdataroot=${ls_templine#*=}
     fi
  done
  ls_temp="[api]"
   ls_originalline=`awk  -v var1=$ls_temp 'BEGIN {a=0}$0!~/^[[:blank:]]+$|^$/{if (a==1) if (!match($0,/\[/)) {print $0} else {exit} else if ($0==var1) {a=1}}' $1`
  for ls_templine in ${ls_originalline}
  do
     ls_line=${ls_templine%=*}
     if [[ ${ls_line} == "mulip" ]];then
        ls_mulip=${ls_templine#*=}
     elif [[ ${ls_line} == "mulport" ]];then
        ls_mulport=${ls_templine#*=}
     elif [[ ${ls_line} == "masterboardapiversion" ]];then
        ls_masterboardapiversion=${ls_templine#*=}
     fi
  done
  ls_temp="[kuboard]"
   ls_originalline=`awk  -v var1=$ls_temp 'BEGIN {a=0}$0!~/^[[:blank:]]+$|^$/{if (a==1) if (!match($0,/\[/)) {print $0} else {exit} else if ($0==var1) {a=1}}' $1`
  for ls_templine in ${ls_originalline}
  do
     ls_line=${ls_templine%=*}
     if [[ ${ls_line} == "kuboardport" ]];then
        ls_kuboardport=${ls_templine#*=}
     elif [[ ${ls_line} == "kuboardpasswd" ]];then
        ls_kuboardpasswd=${ls_templine#*=}
     elif [[ ${ls_line} == "kuboarddatapath" ]];then
        ls_kuboarddatapath=${ls_templine#*=}
     elif [[ ${ls_line} == "kuboardendpointport" ]];then 
        ls_kuboardendpointport=${ls_templine#*=}
     fi
  done
  writetolog  "ok:read setupfile $1:${ls_hostname},${ls_sharepath},${ls_exportsips},${ls_sharestoragelabelname},${ls_sharestoragelabelvalue},${ls_harborregistry},${ls_harborhostname},${ls_harbornodename},${ls_harborport},${ls_haroboruser},${ls_harborpasswd},${ls_prometheuslabelname},${ls_prometheuslabelvalue},${ls_prometheusnodename},${ls_prometheuhostname},${ls_lighttpdport},${ls_lighttpdbind},${ls_lighttpdhostname},${ls_lighttpdnodename},${ls_rabbitmqhostname},${ls_rabbitmqnodename},${ls_rabbitmqlabelname},${ls_rabbitmqlabelvalue},${ls_ntphostname},${ls_ntpnodename}"
}

init()
{
 writetolog "info init..." 
 ############# firewalld and selinux ###################
  writetolog "init:stop firewalld..."
  systemctl disable firewalld
  systemctl stop firewalld
  writetolog "ok:init:stop firewalld"

  writetolog "init:setenforce 0"
  sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
  setenforce 0
  writetolog "ok:init:setenforce 0"
  ############# yum ####################
  writetolog "init:install nfs,chrony,socat"
  yum install nfs-utils chrony socat -y
  writetolog "ok:install nfs,chrony,socat"
  ############# hostname ###############
  hostnamectl set-hostname ${ls_hostname}
  writetolog "ok:set hostname ${ls_hostname}"
  ############# /etc/hosts #############
  
  if [[ -f /etc/hostsbk ]];then
     cp -f /etc/hostsbk /etc/hosts
  else
     cp /etc/hosts /etc/hostsbk
  fi
  echo "${ls_masterip} ${ls_hostname} ${ls_harborhostname} ${ls_prometheuhostname} ${ls_rabbitmqhostname} ${ls_ntphostname}">>/etc/hosts
  writetolog "ok:set /etc/hosts" 
}

installsharestorage()
{
  writetolog "info:installsharestorage..."
  mkdir -p ${ls_sharepath}/ztxycluster/share/prometheus
  mkdir -p ${ls_sharepath}/ztxycluster/share/grafana
  mkdir -p ${ls_sharepath}/ztxycluster/share/image
  mkdir -p ${ls_sharepath}/ztxycluster/share/rabbitmq
  mkdir -p ${ls_sharepath}/ztxycluster/share/chronyd
  mkdir -p ${ls_sharepath}/ztxycluster/share/image
  cp -f ${ls_rootpath}/setupfile/grafana/* ${ls_sharepath}/ztxycluster/share/grafana
  cp -f ${ls_rootpath}/setupfile/prometheus/* ${ls_sharepath}/ztxycluster/share/prometheus
  cp -f ${ls_rootpath}/setupfile/prometheus/* ${ls_rootpath}/lighttpd/cgi-bin/setup
  cp -f ${ls_rootpath}/setupfile/rabbitmq/* ${ls_sharepath}/ztxycluster/share/rabbitmq
  cp -f ${ls_rootpath}/setupfile/yaml/secrets/* ${ls_sharepath}/ztxycluster/share/secrets
  echo "${ls_sharepath} ${ls_exportsips}(rw,all_squash,sync,anonuid=0,anongid=0)">/etc/exports
  systemctl enable nfs
  systemctl restart nfs
  if [[ $? == 0 ]];then
     writetolog "ok:installsharestorage"
  else
     writetolog "error:installsharestorage"
  fi
}

installchrony()
{
  writetolog "info:installchrony..."
  export ls_ntphostname1=${ls_ntphostname}
  export ls_ntpstratum1=${ls_ntpstratum}
  envsubst '$ls_ntphostname1,$ls_ntpstratum1'<${ls_rootpath}/setupfile/chronyd/chrony-client.conf >${ls_sharepath}/ztxycluster/share/chronyd/chrony-client.conf
  envsubst '$ls_ntpstratum1'<${ls_rootpath}/setupfile/chronyd/chrony-server.conf >${ls_sharepath}/ztxycluster/share/chronyd/chrony-server.conf
  mv /etc/chrony.conf /etc/chrony.confbk
  cp ${ls_sharepath}/ztxycluster/share/chronyd/chrony-server.conf /etc/chrony.conf
  ########################### copy to api setup ################################
#  cp -f ${ls_sharepath}/ztxycluster/share/chronyd/* ${ls_rootpath}/lighttpd/cgi-bin/setup
#  cp -f ${ls_sharepath}/ztxycluster/share/prometheus/prometheus.yml ${ls_rootpath}/lighttpd/cgi-bin/setup
  systemctl enable chronyd
  systemctl restart chronyd
  if [[ $? == 0 ]];then
     writetolog "ok:installchrony"
  else
     writetolog "error:installchrony"
  fi
}

sshpub()
{
writetolog "info:sshpub..."
####################### StrictHostKeyChecking no ##########################
if [[ `grep "StrictHostKeyChecking no" /etc/ssh/ssh_config` == "" ]];then
   echo "StrictHostKeyChecking no" >>/etc/ssh/ssh_config
fi
####################### gen key #######################
if [[ ! -f /root/.ssh/id_rsa && ! -f /root/.ssh/id_rsa.pub ]];then
   ssh-keygen -t RSA -b 2048 -f /root/.ssh/id_rsa -P ""
fi
####################### authorized_keys ###############
if [[ -f /root/.ssh/authorized_keys ]];then
   touch /root/.ssh/authorized_keys
   chmod 600 /root/.ssh/authorized_keys
fi
###################### cp id_rsa.pub to authorized_keys ###################
cat /root/.ssh/id_rsa.pub >>/root/.ssh/authorized_keys
if [[ $? == 0 ]];then
   writetolog "ok:sshpub"
else
   writetolog "error:sshpub"
fi
}

installapi()
{
  writetolog "info:installapi"
  ################## init ####################
  export ls_mulbindip=${ls_masterip}
  export ls_mulip1=${ls_mulip}
  export ls_mulport1=${ls_mulport}
  export ls_masterboardapiversion1=${ls_masterboardapiversion}
  export ls_harborregistryurl="${ls_harborhostname}:${ls_harborport}/ztxy-x86"
  export ls_prometheussetup="${ls_sharepath}/ztxycluster/share/prometheus/prometheus.yml"
  export ls_imageroot="${ls_sharepath}/ztxycluster/share/image"
  export ls_nodeexporterport1=${ls_nodeexporterport}
  export ls_nodeinstallpath=/etc/lighttpd/root/htdocs/cgi-bin/setup
  ########################### copy to api setup ################################
  cp -f ${ls_sharepath}/ztxycluster/share/chronyd/* ${ls_rootpath}/lighttpd/cgi-bin/setup
  cp -f ${ls_sharepath}/ztxycluster/share/prometheus/prometheus.yml ${ls_rootpath}/lighttpd/cgi-bin/setup
  echo "      - targets: ['${ls_masterip}:${ls_nodeexporterport}']">>${ls_prometheussetup}
  ##############################################################################
  envsubst '$ls_mulbindip,$ls_mulip1,$ls_mulport1,$ls_masterboardapiversion1,$ls_harborregistryurl,$ls_prometheussetup,$ls_imageroot,$ls_nodeexporterport1,$ls_nodeinstallpath'<${ls_rootpath}/setupfile/api/setup.ini >${ls_rootpath}/lighttpd/cgi-bin/setup.ini
  if [[ $? == 0 ]];then
     writetolog "ok:installapi"
  else
     writetolog "error:installapi"
  fi
}

installlighttpd()
{
  writetolog "info:insalllighttpd..."
  systemctl stop lighttpd
  ################## init ####################
  export ls_lighttpdport1=${ls_lighttpdport}
  export ls_lighttpdbind1=${ls_lighttpdbind}
  envsubst '$ls_lighttpdport1,$ls_lighttpdbind1'<${ls_rootpath}/setupfile/lighttpd/lighttpd.conf >${ls_rootpath}/lighttpd/lighttpd.conf
  ls_temp=$(installapi)
  ################## install #################
  /bin/bash ${ls_rootpath}/lighttpd/install.sh
  systemctl enable lighttpd
  systemctl start lighttpd
  if [[ $? == 0 ]];then
     writetolog "ok:installlighttpd"
  else
     writetolog "error:installlighttpd"
  fi
}


installdocker()
{
  writetolog "info:installdocker..."
  systemctl stop docker
  ################## init ###################
  export ls_dockerdataroot1=${ls_dockerdataroot}
  export ls_harborhostname1=${ls_harborhostname}
  export ls_harborport1=${ls_harborport}
  envsubst '$ls_dockerdataroot1' <${ls_rootpath}/setupfile/docker/docker.service>${ls_rootpath}/docker/arm/docker.service
  envsubst '$ls_harborhostname1,$ls_harborport1' <${ls_rootpath}/setupfile/docker/daemon.json > ${ls_rootpath}/docker/arm/daemon.json
  cp -f ${ls_rootpath}/docker/arm/daemon.json ${ls_rootpath}/docker/x86/daemon.json
  cp -f ${ls_rootpath}/docker/arm/docker.service ${ls_rootpath}/docker/x86/docker.service
  ################## install ################
  /bin/bash ${ls_rootpath}/docker/dockerinstall.sh
  systemctl enable docker
  systemctl start docker
  if [[ $? == 0 ]];then
     writetolog "ok:installdocker"
  else
     writetolog "error:installdocker"
  fi
}

installharbor()
{
  writetolog "info:installharbor..."
  ################ init ########################
  export ls_harborregistry1=${ls_harborregistry}
  export ls_harborhostname1=${ls_harborhostname}
  export ls_harborport1=${ls_harborport}
  export ls_harboruser1=${ls_harboruser}
  export ls_harborpasswd1=${ls_harborpasswd}
  envsubst '$ls_harborregistry1,$ls_harborhostname1,$ls_harborport1,$ls_harboruser1,$ls_harborpasswd1' <${ls_rootpath}/setupfile/harbor/harbor.yml >${ls_rootpath}/harbor/x86/harbor/harbor.yml
  cp -f ${ls_rootpath}/harbor/x86/harbor/harbor.yml ${ls_rootpath}/harbor/arm/harbor/harbor.yml
  ################ install #####################
  docker network create harbor
  mkdir -p ${ls_harborregistry1}
  #/bin/bash ${ls_rootpath}/harbor/arm/harbor/install.sh
  #/bin/bash ${ls_rootpath}/harbor/x86/harbor/install.sh
  /bin/bash ${ls_rootpath}/harbor/install.sh
  if [[ $? == 0 ]];then
     writetolog "ok:installharbor"
  else
     writetolog "error:installharbor"
  fi  
}

installkuboard()
{
  writetolog "info:installkuboard..."
  export ls_hostname1=${ls_hostname}
  export ls_kuboardport1=${ls_kuboardport}
  export ls_kuboardendpointport1=${ls_kuboardendpointport}
  export ls_kuboarddatapath1=${ls_kuboarddatapath}
  export ls_kuboardpasswd1=${ls_kuboardpasswd}
  envsubst '$ls_hostname1,$ls_kuboardport1,$ls_kuboardendpointport1,$ls_kuboarddatapath1,$ls_kuboardpasswd1' <${ls_rootpath}/setupfile/kuboard/install.sh >${ls_rootpath}/kuboard/install.sh
  chmod +x ${ls_rootpath}/kuboard/install.sh
  /bin/bash ${ls_rootpath}/kuboard/install.sh
  if [[ $? == 0 ]];then
     writetolog "ok:installkuboard"
     writetolog "ok:the kuboard token is $(kubectl -n kuboard get secret $(kubectl -n kuboard get secret kuboard-admin-token | grep kuboard-admin-token | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)"
  else
     writetolog "error:installkuboard"
  fi
}

installk3smaster()
{
  writetolog "info:installk3smaster"
  /bin/bash ${ls_rootpath}/k3s/myinstall.sh ${ls_hostname} master
  cp /etc/rancher/k3s/k3s.yaml ${ls_sharepath}
  systemctl stop k3s
  systemctl start k3s
  if [[ $? == 0 ]];then
     writetolog "ok:installk3smaster"
  else
     writetolog "error:installk3smaster"
  fi
}

installyaml()
{
  writetolog "info:installyaml..."
  ##################### modify the setupfile #################
  export ls_hostname1=${ls_hostname}
  export ls_sharepath1=${ls_sharepath}
  export ls_sharestoragecapacity1=${ls_sharestoragecapacity}
  envsubst '$ls_hostname1,$ls_sharepath1'<${ls_rootpath}/setupfile/yaml/nfs/nfsdeploy.yaml>${ls_rootpath}/yaml/nfs/nfsdeploy.yaml
  envsubst '$ls_sharestoragecapacity1'<${ls_rootpath}/setupfile/yaml/nfs/nfsstoragepvc.yaml>${ls_rootpath}/yaml/nfs/nfsstoragepvc.yaml
  envsubst '$ls_hostname1'<${ls_rootpath}/setupfile/yaml/prometheus/prometheus.yaml >${ls_rootpath}/yaml/prometheus/prometheus.yaml
  envsubst '$ls_hostname1'<${ls_rootpath}/setupfile/yaml/prometheus/grafana.yaml >${ls_rootpath}/yaml/prometheus/grafana.yaml
  envsubst '$ls_hostname1'<${ls_rootpath}/setupfile/yaml/rabbitmq/rabbitmq.yaml >${ls_rootpath}/yaml/rabbitmq/rabbitmq.yaml
  envsubst '$ls_harborpasswd'<${ls_rootpath}/setupfile/yaml/secrets/harbor.sh >${ls_rootpath}/yaml/secrets/harbor.sh
  ##################### label ################################
  kubectl label node ${ls_hostname} ${ls_sharestoragelabelname}=${ls_sharestoragelabelvalue} ${ls_prometheuslabelname}=${ls_prometheuslabelvalue} ${ls_rabbitmqlabelname}=${ls_rabbitmqlabelvalue} 
  /bin/bash ${ls_rootpath}/yaml/install.sh
  if [[ $? == 0 ]];then
     writetolog "ok:installyaml"
  else
     writetolog "error:installyaml"
  fi
}

writetolog()
{
  echo "$(date) $1">>/var/log/ztxyclusterinstall.log
}

ls_rootpath=$(cd $(dirname $0);pwd)
getparam ${ls_rootpath}/setup.ini

sshpub

init

installsharestorage

installchrony

installlighttpd

installdocker

installharbor

installk3smaster

installkuboard

installyaml

echo "info:install over"
IFS=${IFS_OLD}
