#!/bin/bash
#
# k8s_get_tcp_ingress
#
# Author        : Nohaj
# Contact       : johan@slashroot.fr
# Date          : 20/10/20
# Version       : 1.0 
# Description   : Script qui permet de lister les ingress TCP/UDP configures sur nos clusters K8S
# Require       : kubectl et un acces au namespace ingress-nginx
#

#
# Variables et checks
#
type kubectl &> /dev/null || { echo >&2 "ERREUR - Ce script a besoin de kubectl pour fonctionner"; exit 1; }

kubectl get services -n ingress-nginx &> /dev/null || { echo >&2 "ERREUR - Etes vous sur de disposer d'un access au cluster Kubernetes ?"; exit 1; }

all=0
global=0

if [[ $1 == "all" ]] ; then
    service="all"
    all=1
elif [[ $1 == "global" ]] ; then
    service="all"
    global=1
elif [[ -z $1 ]] || ( ! kubectl get services $1 -n ingress-nginx &> /dev/null ) ; then
    echo ""
    echo "ERREUR - Merci de choisir une option possible"
    echo ""
    echo "Liste des VIPs :"
    echo ""
    kubectl get services -n ingress-nginx --no-headers | awk '{print $1}' | grep -v default-http-backend
    echo ""
    echo 'Option "all" pour lister toutes les VIPs'
    echo 'Option "global" pour afficher la synthese au niveau du cluster'
    echo ""
    exit 1
else
    service=$1
fi

#
# Fonction get_services : liste tous les ingress TCP/UDP d'une VIP ($service) donnee
#
function get_services() {
    service=$1
    service_info=$(mktemp)
    kubectl describe services $service -n ingress-nginx | grep -w 'Port:' | grep -v 443 | grep -v 80 | awk '{print $2,$3}' > $service_info
    
    ip=$(kubectl get services $service -n ingress-nginx -o jsonpath="{.spec.loadBalancerIP}")
    dns_name=$(host $ip | awk '/name pointer/ { print $5 }')
  
    echo ""
    echo "--- $dns_name / $ip ---"
    echo ""

    if [[ -s $service_info ]] ; then
        ok=$(mktemp)
        err=$(mktemp)
    
        while read line ; do
            name=$(echo $line | cut -d " " -f 1)
            port_protocol=$(echo $line | cut -d " " -f 2)
            port=$(echo $port_protocol | cut -d "/" -f 1)
            protocol=$(echo $port_protocol | cut -d "/" -f 2 | tr '[:upper:]' '[:lower:]')
            configmap=$(kubectl get configmap $protocol-services -n ingress-nginx -o jsonpath="{.data.$port}")
            if [[ -z $configmap ]] ; then
                echo "Pas d'ingress pour $name sur le port $port/$protocol" >> $err
            else
                namespace=$(echo $configmap | cut -d "/" -f 1)
                service=$(echo $configmap | cut -d "/" -f 2 | cut -d ":" -f 1)
                port_cible=$(echo $configmap | cut -d "/" -f 2 | cut -d ":" -f 2)
                echo "$port => $namespace/$service:$port_cible" >> $ok
            fi
        done < $service_info
        
        sort -k 1 $ok
        echo ""
        cat $err
        echo ""

        if [[ $global -eq 1 ]] ; then
            cat $ok >> $synthese
        fi

        rm -f $ok
        rm -f $err
    else
        echo "Aucun Ingress TCP/UDP sur cette VIP"
        echo ""
    fi
    rm -f $service_info
}

# On affiche ce que l'utilisateur a demande
if [[ $all -eq 1 ]] || [[ $global -eq 1 ]] ; then
    synthese=$(mktemp)
    for service in $(kubectl get services -n ingress-nginx --no-headers | awk '{print $1}' | grep -v default-http-backend) ; do
        if [[ $global -eq 1 ]] ; then
            get_services $service > /dev/null
        else
            get_services $service
        fi
    done
    if [[ $global -eq 1 ]] ; then
        echo ""
        echo "-- Global --"
        echo ""
        sort -k 1 $synthese
        echo ""
        rm -f $synthese
    fi
else
    get_services $service
fi

