#!/bin/bash

# need to change to the dedicated home directory
HOME=/home/prlab

check_root(){
    root=`whoami`
    if [[ "$root" == "root" ]]; then 
        return 0
    fi
    return 1
}

update_system(){
    eval "apt update && apt upgrade -y"
}


check_cgroup(){
# check the systeme is cgroup2 
cgroup=`ls  /sys/fs/cgroup/cgroup.controllers`
    if [ -n $cgroup ]; then
	    echo "cgroup2 found"
        return 0
    else
        echo "no cgroup2"
        return 1
    fi

}

#install_k8s(){

prerequisite(){
touch /etc/modules-load.d/k8s.conf
cat > /etc/modules-load.d/k8s.conf << EOF
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack

cri_file=/etc/sysctl.d/99-kubernetes-cri.conf
touch $cri_file
cat > $cri_file << EOF
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.conf.all.send_redirects = 0 
net.ipv4.conf.default.send_redirects = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
vm.swappiness = 0
EOF
}

install_cri(){
sysctl --system
echo 'deb http://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/backports.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6ED0E7B82643E131
eval "apt update -y"
eval "apt install -y -t buster-backports libseccomp2 || apt update -y -t buster-backports libseccomp2"


export OS=xUbuntu_22.04
export VERSION=1.28


echo "deb [signed-by=/usr/share/keyrings/libcontainers-archive-keyring.gpg] https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list

echo "deb [signed-by=/usr/share/keyrings/libcontainers-crio-archive-keyring.gpg] https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list

mkdir -p /usr/share/keyrings

eval "curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | gpg --dearmor -o /usr/share/keyrings/libcontainers-archive-keyring.gpg"

eval "curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/Release.key | gpg --dearmor -o /usr/share/keyrings/libcontainers-crio-archive-keyring.gpg"

# install cri-o

eval "apt-get update --force-yes"
eval "apt-get install cri-o cri-o-runc -y"
eval "systemctl daemon-reload"
eval "systemctl enable crio"
eval "systemctl start crio"

echo "Complete install CRI-O"
}

install_k8s(){
# install k8s 
export KUBE_VERSION=v1.28
eval "apt-get update -y"
# apt-transport-https may be a dummy package; if so, you can skip that package
eval "apt-get install -y apt-transport-https ca-certificates curl gpg"

eval "curl -fsSL https://pkgs.k8s.io/core:/stable:/$KUBE_VERSION/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg"

# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/$KUBE_VERSION/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
eval "apt-get update -y"
eval "apt-get install -y kubelet kubeadm kubectl"
eval "apt-mark hold kubelet kubeadm kubectl"

echo "Complete install K8S"


mkdir -p /opt/deploy/k8s/
cat > /opt/deploy/k8s/kubeadm-config.yaml << EOF
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
controlPlaneEndpoint: "dk8scp1:6443"
bootstrapTokens:
- token: "abcdef.0123456789abcdef"
  description: "kubeadm bootstrap token"
  ttl: "24h"
- token: "ghijkl.9876543210ghijkl"
  description: "another bootstrap token"
  usages:
  - signing
  - authentication
  groups:
  - system:bootstrappers:kubeadm:default-node-token
nodeRegistration:
  criSocket: unix:///var/run/crio/crio.sock
  name: dk8scp1
localAPIEndpoint:
  bindPort: 6443
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
etcd:
  local:
    dataDir: /var/lib/etcd
networking:
  serviceSubnet: "10.96.0.0/16"
  podSubnet: "172.16.0.1/16"
  dnsDomain: "cluster.local"
scheduler: {}
kubernetesVersion: "v1.28.4"
controlPlaneEndpoint: "dk8scp1:6443"
apiServer:
  extraArgs:
    feature-gates: "KubeletCgroupDriverFromCRI=true"
  timeoutForControlPlane: 4m0s
certificatesDir: /etc/kubernetes/pki
controllerManager: {}
imageRepository: "registry.k8s.io"
clusterName: dk8scluster1

---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 0s
    enabled: true
  x509:
    clientCAFile: /etc/kubernetes/pki/ca.crt
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 0s
    cacheUnauthorizedTTL: 0s
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
podCIDR: 172.16.0.1/16
cpuManagerReconcilePeriod: 0s
evictionPressureTransitionPeriod: 0s
fileCheckFrequency: 0s
healthzBindAddress: 127.0.0.1
healthzPort: 10248
httpCheckFrequency: 0s
imageMinimumGCAge: 0s
logging: {}
nodeStatusReportFrequency: 0s
nodeStatusUpdateFrequency: 0s
resolvConf: /run/systemd/resolve/resolv.conf
rotateCertificates: true
runtimeRequestTimeout: 0s
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /etc/kubernetes/manifests
streamingConnectionIdleTimeout: 0s
syncFrequency: 0s
volumeStatsAggPeriod: 0s
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
EOF

eval "systemctl enable --now kubelet"
eval "kubeadm init --v=5 --config=/opt/deploy/k8s/kubeadm-config.yaml \
    --skip-phases=addon/kube-proxy"
export HOME=/home/prlab


}
copy_k8s_config(){
  export HOME=/home/prlab
  export USER=prlab
  mkdir -p $HOME/.kube  
  cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  chown -R $USER:$USER $HOME/.kube/

}
copy_host_file(){
    if [[ -z $1 ]]; then
        exit
    else
        cat $1 | tee -a /etc/hosts
    fi 
}

add_to_master(){
    echo "Add node to CP cmd"
    cmd=$(kubeadm token create --print-join-command)
    echo $cmd
}

main(){


    if check_root; then         
        #update_system
	echo "Installing"
        copy_host_file $1
    if [[ $2 == "cp" ]]; then
#	    prerequisite
#	    install_cri
#	    install_k8s
	    #echo "COPY K8S Config"
	    #copy_k8s_config
	    add_to_master
    else 
        add_to_master
    fi

	echo "Finish Setup K8S"
        exit

    else
        echo "Please execute the script with sudo"
        exit 1
    fi

}




main $@