#!/bin/sh

cmdname=$0
. podsec-k8s-rbac-functions

if [ $# -lt 4 -o $# -gt 5 ]
then
  echo -ne "Формат:\n$0 имя_пользователя role|clusterrole|role=clusterrole роль имя_связки_роли [namespace]"
  exit 1
fi

user=$1
bindedRoleType=$2
roleName=$3
bindName=$4
namespace=
if [ $# -eq 5 ]
then
  namespace="-n $5"
fi

isSystem=
if [ ${user:0:7} = 'system:' ]
then
  user=${user:7}
  isSystem=1
fi

if [ -z "$isSystem" -a ! -d /home/$user  ]
then
  echo "Пользователь $user не существует"
  exit 1
fi

case $bindedRoleType in
  role|clusterrole) roleType=$bindedRoleType;
    break;;
  role=clusterrole)
    roleType="role"
    bindedRoleType='clusterrole'
    break;;
  *) echo "Неверный тип кластерной роли $bindedRoleType";
    echo -ne "Формат:\n$0 имя_пользователя role|clusterrole|role=clusterrole роль имя_связки_роли [namespace]";
esac

if [ -n "$namespace" -a $roleType == 'clusterrole' ]
then
  echo "namespace неприменимо к кластерной роли"
  exit 1
fi

if ! roleNameDesc=$(kubectl $namespace get ${roleType}binding $bindName -o json 2>/dev/null)
then
  if [ $roleType == 'clusterrole' ]
  then
    roleTxt="Кластерная роль"
  else
    roleTxt="Роль"
  fi
  echo "$roleTxt '$roleName' отсутствует"
  exit 1
fi

deletedSubjects=$(echo $roleNameDesc | jq '[.subjects[] | select(.name!="'$user'")]')
if [ -z "$deletedSubjects" ]
then
  echo "Пользователь $user отсутствует в связке роли $bindName"
  exit 1
else
  if [ "$deletedSubjects" == '[]' ]
  then
    # roleBinding после удаления пуст -> удалить его
    kubectl $namespace delete ${roleType}binding $bindName
  else
    # Модифицировать роль
    echo $roleNameDesc | jq ".subjects=$deletedSubjects" | kubectl apply -f -
  fi
fi
exit 0
