#!/bin/sh
source podsec-u7s-functions


format() {
  echo -ne "Формат:\n$0 [-v [0-9]] [init|join] [<init|join-параметр> ...]" >&2
}

debugLevel=0
if [ ${1} = '-v' ]
then
  if [ $# -lt 2 ]
  then
    echo "Неверное число параметров"
    format
  fi
  debugLevel=$2
  if [ $n -ge 0 -a $n -lt 10 ] 2>/dev/null
  then
    echo "Неверный уровень отладки"
    format
  fi
  shift;shift
fi

if [ $# -eq 0 ]
then
  echo "Неверное число параметров"
  format
fi

cmd=$1

shift
controlPlane=
token=
caCertHash=
extIP=
serviceCidr=
apiServer=
ifs=$IFS
case $cmd in
  init)
    controlPlane="initMaster"
    pars=$@
    while [ $# -gt 0 ]
    do
      par=$1
      if [ "${par:0:2}" != '--' ]
      then
        echo "Подкоманда init '$par' не поддерживается" >&2
        echo "Попытка выполнить ее в команде kubeadm kubernetes..." >&2
        machinectl shell u7s-admin@ /usr/libexec/podsec/u7s/bin/nsenter_u7s /usr/bin/kubeadm $cmd $pars
        exit $?
      fi
      par=${par:2}
      case $par in
        'apiserver-advertise-address')
          extIP=$2
          shift; shift
          extDev=$(getExtDev $extIP)
          if [ -z "$extDev" ]
          then
            echo "Для IP-адреса '$extIP' нет интерфейса" >&2
            exit
          fi
        ;;
        'control-plane-endpoint')
          apiServer=$2
          shift;shift
        ;;
        'service-cidr')
          serviceCidr=$2
          shift;shift
          set -- $(getCidr $serviceCidr)
          serviceCidrIP=$1
          serviceMask=$2
        ;;
        'pod-network-cidr')
          podNetworkCidr=$2
          shift;shift
          set -- $(getCidr $podNetworkCidr)
          podNetworkCidr=$1
          podNetworkMask=$2
        ;;
        *)
          echo "Параметр '$par' команды '$cmd' не поддерживается" >&2
          echo "Попытка выполнить ее в команде kubeadm kubernetes..." >&2
          machinectl shell u7s-admin@ /usr/libexec/podsec/u7s/bin/nsenter_u7s /usr/bin/kubeadm $cmd $pars
          exit $?
          ;;
      esac
    done
    ;;
  join)
    if [ $# -eq 0 ]
    then
      echo "Команда join не имеет параметров" >&2
      format
      exit 1
    fi
    pars=$@
    apiServer=$1
    shift
    while [ $# -gt 0 ]
    do
      par=$1
      if [ "${par:0:2}" != '--' ]
      then
        echo "Неверный параметр '--$par' в операции 'join'" >&1
        exit
      fi
      par=${par:2}
      case $par in
        'control-plane')
          controlPlane="master"
          shift
          ;;
        'token')
          token=$2
          shift;shift
          ;;
        'discovery-token-ca-cert-hash')
          caCertHash=$2
          shift;shift
          ;;
        'apiserver-advertise-address')
          extIP=$2
          shift; shift
          extDev=$(getExtDev $extIP)
          if [ -z "$extDev" ]
          then
            echo "Для IP-адреса '$extIP' нет интерфейса" >&2
            exit
          fi
          ;;
        'certificate-key')
          certificateKey=$2
          shift;shift
          ;;
        'service-cidr')
          serviceCidr=$2
          shift;shift
          set -- $(getCidr $serviceCidr)
          serviceCidrIP=$1
          serviceMask=$2
          ;;
        *)
          echo "Параметр '$par' команды '$cmd' не поддерживается" >&2
          echo "Попытка выполнить ее в команде kubeadm kubernetes..." >&2
          machinectl shell u7s-admin@ /usr/libexec/podsec/u7s/bin/nsenter_u7s /usr/bin/kubeadm $cmd $pars
          exit $?
          ;;
      esac
    done
    if [ -z "$token" ]
    then
      echo "В операции join отсутствуют флаг token";
      exit 1
    fi
    if [ -z "$caCertHash" ]
    then
      echo "В операции join отсутствуют флаг discovery-token-ca-cert-hash";
      exit 1
    fi
    ;;
  *)
    echo "Команда '$cmd' не поддерживается" >&2
    echo "Попытка выполнить ее в команде kubeadm kubernetes..." >&2
    machinectl shell u7s-admin@ /usr/libexec/podsec/u7s/bin/nsenter_u7s /usr/bin/kubeadm $cmd $pars
    exit $?
esac

uid=`id -u u7s-admin`

if [ -z "$serviceCidr" ]
then
  serviceCidrIP='10.96.0.0'
  serviceMask='12'
  serviceCidr="$serviceCidrIP/$serviceMask"
fi

if [ -z "$podNetworkCidr" ]
then
  podNetworkCidrIP='10.244.0.0'
  podNetworkMask='16'
  podNetworkCidr="$podNetworkCidrIP/$podNetworkMask"
fi

if [ -z "$extIP" ]
then
  extIP=$(getExtIP)
  extDev=$(getExtDev $extIP)
fi

if [ "$controlPlane" = 'initMaster' ]
then
  tapIP=$(getKubernetesClusterIP $serviceCidr)
else
  tapIP=$(getStaticClusterIP $extIP $serviceCidr)
fi

if [ -z "$apiServer" ]
then
  apiServer="$extIP:6443"
fi

kubernetesClusterIP=$(getKubernetesClusterIP $serviceCidr)
kubernetesClusterDNS="${kubernetesClusterIP}0"
slirp4IP="${kubernetesClusterIP}00"

ifs=$IFS
IFS=:
set -- $apiServer
IFS=$ifs
apiServerIP=$1
apiServerPort=$2

# cp ~u7s-admin/.config/usernetes/ENV ~u7s-admin/.config/usernetes/env
envDir="$XDG_CONFIG_HOME=/var/lib/u7s-admin/.config/usernetes"
cp /etc/podsec/u7s/config/ENV /etc/podsec/u7s/config/env
echo  "
U7S_UID=$uid
U7S_EXTIP=$extIP
U7S_EXTDEV=$extDev
U7S_TAPIP=$tapIP
U7S_DEBUGLEVEL=$debugLevel
U7S_CONTROLPLANE=$controlPlane
U7S_APISERVER=$apiServer
U7S_APISERVERIP=$apiServerIP
U7S_APISERVERPORT=$apiServerPort
U7S_TOKEN=$token
U7S_CACERTHASH=$caCertHash
U7S_CERIFICATEKEY=$certificateKey
U7S_SERVICECIDR=$serviceCidr
U7S_SERVICECIDRIP=$serviceCidrIP
U7S_SERVICEMASK=$serviceMask
U7S_PODNETWORKCIDR=$podNetworkCidr
U7S_PODNETWORKCIDRIP=$podNetworkCidrIP
U7S_PODNETWORKMASK=$podNetworkMask
U7S_ROOTLESSKIT_FLAGS=--cidr=$serviceCidr
U7S_KUBERNETESCLUSTERIP=$kubernetesClusterIP
U7S_KUBERNETESCLUSTERDNS=$kubernetesClusterDNS
U7S_SLIRP4IP=$slirp4IP
U7S_CONTROLPLANEENDPOINT=$controlPlaneEndpoint
" >> /etc/podsec/u7s/config/env

if ! /bin/grep u7s-admin /etc/subuid >/dev/null 2>&1
then
  # Сформровать /etc/subuid, /etc/subgid для системного user путем временного создания обчного пользователя
  /usr/sbin/useradd -M u7s_admin_temp
  /bin/sed -e 's/u7s_admin_temp/u7s-admin/' -i /etc/subuid
  /bin/sed -e 's/u7s_admin_temp/u7s-admin/' -i /etc/subgid
  /usr/sbin/userdel u7s_admin_temp
fi

mkdir -p /var/lib/crio/

# Чистим предыдещий конфиг kuber
rm -f /etc/kubernetes/*.conf \
  /etc/kubernetes/manifests/*.yaml \
  /etc/kubernetes/pki/*.??? \
  /etc/kubernetes/pki/etcd/*.??? 2>/dev/null

if ! machinectl shell u7s-admin@ /bin/sh /usr/libexec/podsec/u7s/bin/kubeadm.sh $cmd 2>/dev/null
then
  echo "Разворачивание кластера закончилось неудачно.
  Посмотрите в пользователе u7s-admin статус командой 'systemctl --user u7s.target' и системные логи командами journalctl"
  pstree -pal
  exit 1
fi

machinectl shell u7s-admin@ /sbin/systemctl --user start u7s.target 2>/dev/null
/sbin/systemctl enable  u7s.service
/sbin/systemctl start u7s.service

if [ -z "$controlPlane" ] # WORKER node
then
  exit 0
fi

# Настроить в /kubernetes/manifests/kube-apiserver.yaml аудит API-запросов
tuneAudit

adminConf="/etc/kubernetes/admin.conf"

if [ ! -s $adminConf ]
then
  echo "Конфигурацонный файл администратора кластера не сформирован!"
  exit 2
fi

mkdir -p /root/.kube/
cp -f $adminConf /root/.kube/config
chmod 600 /root/.kube/config
chmod 700 /root/.kube/

mkdir -p ~u7s-admin/.kube/
cp -f $adminConf ~u7s-admin/.kube/config
chmod 600 ~u7s-admin/.kube/config
chmod 700 ~u7s-admin/.kube/
chown -R u7s-admin:u7s-admin ~u7s-admin/.kube
