#!/bin/bash
# shellcheck disable=SC1091
. /usr/share/debconf/confmodule
# Zimbra Talk - fetch domain data from ldap-host
# by Stefan Sänger <stefan.saenger@vnc.biz>
#set -x

# ToDO:
# # change from single ini file to ini files per domain in /etc/zimbra-talk/dconfig.d/$DOMAIN.cfg
# # test performance

function print_usage() {
   echo "
update / generate prosody configs from zimbra ldap
usage: update-prosody-conf

   "
   exit 1
}

function die_err() {
        echo "$0: $*" >&2
        exit 1
}

touch /etc/ztalk/domains.cfg

function initfetch() {
   [ "$(whoami)" = "root" ] || die_err "please run as root or with sudo"
   [ "$(which crudini)" ] || die_err "crudini not found in path - please install crudini (apt-get install crudini)"
   [ "$(which perl)" ] || die_err "perl not found in path - please install perl (apt-get install perl)"
   [ "$(which ldapsearch)" ] || die_err "ldapsearch not found in path - please install ldap-utils (apt-get install ldap-utils)"
   ldapproto=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'LDAPPROTO')
   [ "$ldapproto" ] || die_err "ldap protocol not configured"

   ldapport=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'LDAPPORT')
   [ "$ldapport" ] || die_err "ldap port not configured"

   ldaphost=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'LDAPHOST')
   [ "$ldaphost" ] || die_err "ldap hostname not configured"

   ldappw=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'LDAPBINDPASS')
   [ "$ldappw" ] || die_err "ldap bind password not configured"

   ldapdn=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'LDAPBINDDN')
   [ "$ldapdn" ] || die_err "ldap BIND DN not configured"

   if ! ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(objectClass=zimbraGlobalConfig)" | grep "zimbraDefaultDomainName:"
   then
      die_err "could not connect to LDAP - aborting..."
   fi

   TURN_HOST=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'TURN_HOST')
   TURN_PORT=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'TURN_PORT')
   EXTERNAL_LOGIN_FULL_DOMAIN=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'EXTERNAL_LOGIN_FULL_DOMAIN')
   PROSODY_FULL_HOSTNAME=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'PROSODY_FULL_HOSTNAME')
   PROSODY_AUTH_FULL_HOSTNAME=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'PROSODY_AUTH_FULL_HOSTNAME')
   PROSODY_CONFERENCE_FULL_HOSTNAME=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'PROSODY_CONFERENCE_FULL_HOSTNAME')
   PROSODY_FOCUS_FULL_HOSTNAME=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'PROSODY_FOCUS_FULL_HOSTNAME')
   PROSODY_JITSIVIDEOBRIGE_FULL_HOSTNAME=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'PROSODY_JITSIVIDEOBRIGE_FULL_HOSTNAME')
   MIDDLEWARE_MIDDLEWARE_ZIMBRA_HOST=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'MIDDLEWARE_MIDDLEWARE_ZIMBRA_HOST')
   MIDDLEWARE_ZIMBRA_ADMIN_PASSWD=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'MIDDLEWARE_ZIMBRA_ADMIN_PASSWD')
   MIDDLEWARE_APPNAME=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'MIDDLEWARE_APPNAME')
   PROSODY_ADMIN1=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'PROSODY_ADMIN1')
   PROSODY_ADMIN2=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'PROSODY_ADMIN2')
   EXTERNAL_PROSODY_CONFERENCE_FULL_HOSTNAME=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'EXTERNAL_PROSODY_CONFERENCE_FULL_HOSTNAME')
   PROSODY_MESSAGE_EXPIRY=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'PROSODY_MESSAGE_EXPIRY')
   if [ "$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'PROSODY_MESSAGE_EXPIRY' | egrep -c "([0-9]+[dmwy]?|never)")" = "0" ]; then
      echo "ERROR: invalid setting for PROSODY_MESSAGE_EXPIRY found in /etc/zimbra-talk/talk.defaults.cfg - falling back to default (1m)"
      PROSODY_MESSAGE_EXPIRY="1m"
   fi

   MIDDLEWARE_URL="http://$MIDDLEWARE_MIDDLEWARE_ZIMBRA_HOST/VNCMiddleware/rest"

   TalkServerDomain=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'TalkServerDomain')
   zimbraDefaultDomainName=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'zimbraDefaultDomainName')
   AUTHENTICATION_SHARED_SECRET=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'AUTHENTICATION_SHARED_SECRET')
   MUC_COMPONENT_SECRET=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'MUC_COMPONENT_SECRET')
   FOCUS_COMPONENT_SECRET=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'FOCUS_COMPONENT_SECRET')
   JITSI_VIDEOBRIDGE_COMPONENT_SECRET=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'JITSI_VIDEOBRIDGE_COMPONENT_SECRET')
   TURN_CREDENTIALS=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'TURN_CREDENTIALS')
   GlobalSOAPURL=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'ZIMBRA_URL')
   CDefaultDomain=$(crudini --get /etc/ztalk/domains.cfg "global" "$DefaultDomain")

   DomainBlack=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'DOMAIN_BLACK' 2>/dev/null)
   if [ -z "$DomainBlack" ]; then
      DomainBlack="(@)"
   fi
   DomainWhite=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'DOMAIN_WHITE' 2>/dev/null)

}

function fetchDefaultDomain() {

   if ! DefaultDomain=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(objectClass=zimbraGlobalConfig)" | perl -p00e 's/\r?\n //g' | grep "zimbraDefaultDomainName:" | awk '{print $2}')
   then
      die_err "could not connect to LDAP - aborting..."
   fi
   if [ "$DefaultDomain" = "$CDefaultDomain" ]; then
      echo "dafult domain is still: $DefaultDomain"
   fi
   if [ -z "$CDefaultDomain" ]; then
      touch /etc/ztalk/domains.cfg
      crudini --set /etc/ztalk/domains.cfg "GLOBAL" "$DefaultDomain"
   fi
}

function update-ini-domains() {
   GlobalINIZURL=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'ZIMBRA_URL')

   zimbraPublicServiceHostname=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(objectClass=zimbraGlobalConfig)" | perl -p00e 's/\r?\n //g' | grep "zimbraPublicServiceHostname" | awk '{print $2}')
   if [ -n "$zimbraPublicServiceHostname" ]; then
      zimbraPublicServiceProtocol=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(objectClass=zimbraGlobalConfig)" | perl -p00e 's/\r?\n //g' | grep "zimbraPublicServiceProtocol" | awk '{print tolower($2)}')
      [ -n "$zimbraPublicServiceProtocol" ] || zimbraPublicServiceProtocol="https"
      zimbraPublicServicePort=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(objectClass=zimbraGlobalConfig)" | perl -p00e 's/\r?\n //g' | grep "zimbraPublicServicePort" | awk '{print $2}')
   else
      zimbraPublicServiceHostname=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(&(objectClass=zimbraServer)(zimbraReverseProxyHttpEnabled=TRUE))" | perl -p00e 's/\r?\n //g' | grep "^cn:" | awk '{print $2}' | head -1)
      zimbraPublicServiceProtocol="https"
   fi

   if [ -z "$zimbraPublicServicePort" ]; then
      GlobalZURL="$zimbraPublicServiceProtocol://$zimbraPublicServiceHostname"
   else
      GlobalZURL="$zimbraPublicServiceProtocol://$zimbraPublicServiceHostname:$zimbraPublicServicePort"
   fi

   if [ "$GlobalINIZURL" != "$GlobalZURL" ]; then
      crudini --set /etc/zimbra-talk/talk.defaults.cfg 'global' 'ZIMBRA_URL' "$GlobalZURL"
   fi

   DefaultRosterFilter=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg "global" "DefaultRosterFilter")
   # shellcheck disable=SC2012
   INIDOMAINS=$(ls -1 /etc/zimbra-talk/dconfig.d/ | sed 's/\.cfg$//g')
   LDAPDOMAINS=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(objectClass=zimbraDomain)" | perl -p00e 's/\r?\n //g' | grep "^zimbraDomainName:" |  awk '{print $2}' | cat -s | egrep "$DomainWhite" | egrep -v "$DomainBlack")

   for TDOMAIN in $INIDOMAINS; do
      ShouldExist=$(echo "$LDAPDOMAINS" | egrep -c "^$TDOMAIN$" )
      #echo "$TDOMAIN should exist: $ShouldExist"
      if [ "$ShouldExist" -eq 0 ]; then
      #      #delete domain from ini file
         echo "removing config from ini for domain: $TDOMAIN"
         rm "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg"
      else
         touch "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg"
      fi
   done

   echo "updating domains in ini from ldap"
   echo "$LDAPDOMAINS" | cat -s  | while IFS= read -r  TDOMAIN
   do
      echo "updating settings for $TDOMAIN"
      touch "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg"
      rosterfilter=$(crudini --get "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" "RosterFilter" 2>/dev/null)
      if [ -z "$rosterfilter" ]; then
         rosterfilter="$DefaultRosterFilter"
      fi
      crudini --set "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" "RosterFilter" "$rosterfilter"
      echo "updated Rosterfilter for Domain $TDOMAIN"
      ZTEST=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(&(objectClass=zimbraDomain)(zimbraDomainName=$TDOMAIN))" | perl -p00e 's/\r?\n //g' | grep "^zimbraPreAuthKey:" | awk '{print $2}')
      if [ -n "$ZTEST" ]; then
         crudini --set "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" 'zimbraPreAuthKey' "$ZTEST"
         crudini --set "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" 'RosterFilter' "$rosterfilter"
      else
         crudini --set "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" 'zimbraPreAuthKey' ""
         crudini --set "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" 'RosterFilter' "$rosterfilter"
      fi

      IniDomainURL=$(crudini --get "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" 'ZIMBRA_URL' 2>/dev/null)
      IniDomainURLMode=$(crudini --get "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" 'ZIMBRA_URL_MODE' 2>/dev/null)
      if [ -z "$IniDomainURLMode" ]; then
         IniDomainURLMode="auto"
      fi
      zimbraPublicServiceHostname=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(&(objectClass=zimbraDomain)(zimbraDomainName=$TDOMAIN))" | perl -p00e 's/\r?\n //g' | grep "zimbraPublicServiceHostname" | awk '{print $2}')
      if [ -n "$zimbraPublicServiceHostname" ]; then
         zimbraPublicServiceProtocol=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(&(objectClass=zimbraDomain)(zimbraDomainName=$TDOMAIN))" | perl -p00e 's/\r?\n //g' | grep "zimbraPublicServiceProtocol" | awk '{print tolower($2)}')
         if [ -z "$zimbraPublicServiceProtocol" ]; then zimbraPublicServiceProtocol="https" ; fi
         zimbraPublicServicePort=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(&(objectClass=zimbraDomain)(zimbraDomainName=$TDOMAIN))" | perl -p00e 's/\r?\n //g' | grep "zimbraPublicServicePort" | awk '{print $2}')
         if [ -n "$zimbraPublicServicePort" ]; then
            LDZURL="$zimbraPublicServiceProtocol://$zimbraPublicServiceHostname:$zimbraPublicServicePort"
         else
            LDZURL="$zimbraPublicServiceProtocol://$zimbraPublicServiceHostname"
         fi
      else
         LDZURL="$GlobalSOAPURL"
      fi
      if [ "$IniDomainURLMode" = "auto" ]; then
         if [ "$IniDomainURL" != "$LDZURL" ]; then
            crudini --set "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" 'ZIMBRA_URL' "$LDZURL"
         fi
      fi
   done
}

function update-prosody-from-ini() {
   #handle default domain
   echo "generating config for $zimbraDefaultDomainName"
   rosterfilter=$(crudini --get "/etc/zimbra-talk/dconfig.d/$zimbraDefaultDomainName.cfg" "domain:$zimbraDefaultDomainName" "RosterFilter")
   if [ "$rosterfilter" = "manual" ]
   then
      cp /usr/share/ztalk/conf.templates/prosody-virtual-host.cfg.lua.template "/tmp/$zimbraDefaultDomainName.cfg.lua"
   else
      cp /usr/share/ztalk/conf.templates/prosody-virtual-host-auto.cfg.lua.template "/tmp/$zimbraDefaultDomainName.cfg.lua"
   fi
   sed -i "s/XMPP_FULL_DOMAIN/$zimbraDefaultDomainName/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
   sed -i "s/PROSODY_ADMIN1/$PROSODY_ADMIN1/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
   sed -i "s/PROSODY_ADMIN2/$PROSODY_ADMIN2/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
   sed -i "s/LDAP_SERVER/$ldaphost/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
   sed -i "s/LDAP_BINDPASS/$ldappw/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
   sed -i "s/LDAP_BINDDN/$ldapdn/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
   sed -i "s/LDAP_FILTER/$rosterfilter/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
   sed -i "s/LDAP_FILTER/\&/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
   sed -i "s/TURN_CREDENTIALS/$TURN_CREDENTIALS/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
   sed -i "s/TURN_HOST/$TURN_HOST/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
   sed -i "s/TURN_PORT/$TURN_PORT/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
   sed -i "s/EXTERNAL_LOGIN_FULL_DOMAIN/$EXTERNAL_LOGIN_FULL_DOMAIN/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
   sed -i "s/PROSODY_AUTH_FULL_HOSTNAME/$PROSODY_AUTH_FULL_HOSTNAME/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
   sed -i "s/PROSODY_FOCUS_FULL_HOSTNAME/$PROSODY_FOCUS_FULL_HOSTNAME/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
   sed -i "s/PROSODY_CONFERENCE_FULL_HOSTNAME/$PROSODY_CONFERENCE_FULL_HOSTNAME/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
   sed -i "s/MUC_COMPONENT_SECRET/$MUC_COMPONENT_SECRET/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
   cp "/tmp/$zimbraDefaultDomainName.cfg.lua" "/etc/prosody/conf.d/$zimbraDefaultDomainName.cfg.lua"

   cp /usr/share/ztalk/conf.templates/prosody-jitsi-meet-virtual-host.cfg.lua.template /tmp/vnctalk-jitsi-meet.cfg.lua
   sed -i "s/EXTERNAL_LOGIN_FULL_DOMAIN/$EXTERNAL_LOGIN_FULL_DOMAIN/g" /tmp/vnctalk-jitsi-meet.cfg.lua
   sed -i "s/TURN_CREDENTIALS/$TURN_CREDENTIALS/g" /tmp/vnctalk-jitsi-meet.cfg.lua
   sed -i "s/TURN_HOST/$TURN_HOST/g" /tmp/vnctalk-jitsi-meet.cfg.lua
   sed -i "s/TURN_PORT/$TURN_PORT/g" /tmp/vnctalk-jitsi-meet.cfg.lua
   sed -i "s/XMPP_FULL_DOMAIN/$zimbraDefaultDomainName/g" /tmp/vnctalk-jitsi-meet.cfg.lua
   sed -i "s/PROSODY_ADMIN1/$PROSODY_ADMIN1/g" /tmp/vnctalk-jitsi-meet.cfg.lua
   sed -i "s/PROSODY_ADMIN2/$PROSODY_ADMIN2/g" /tmp/vnctalk-jitsi-meet.cfg.lua
   sed -i "s/PROSODY_AUTH_FULL_HOSTNAME/$PROSODY_AUTH_FULL_HOSTNAME/g" /tmp/vnctalk-jitsi-meet.cfg.lua
   sed -i "s/PROSODY_FOCUS_FULL_HOSTNAME/$PROSODY_FOCUS_FULL_HOSTNAME/g" /tmp/vnctalk-jitsi-meet.cfg.lua
   sed -i "s/PROSODY_CONFERENCE_FULL_HOSTNAME/$PROSODY_CONFERENCE_FULL_HOSTNAME/g" /tmp/vnctalk-jitsi-meet.cfg.lua
   sed -i "s/MUC_COMPONENT_SECRET/$MUC_COMPONENT_SECRET/g" /tmp/vnctalk-jitsi-meet.cfg.lua
   sed -i "s/FOCUS_COMPONENT_SECRET/$FOCUS_COMPONENT_SECRET/g" /tmp/vnctalk-jitsi-meet.cfg.lua
   sed -i "s/XMPP_FULL_DOMAIN/$XMPP_FULL_DOMAIN/g" /tmp/vnctalk-jitsi-meet.cfg.lua
   sed -i "s/PROSODY_JITSIVIDEOBRIGE_FULL_HOSTNAME/$PROSODY_JITSIVIDEOBRIGE_FULL_HOSTNAME/g" /tmp/vnctalk-jitsi-meet.cfg.lua
   sed -i "s/JITSI_VIDEOBRIDGE_COMPONENT_SECRET/$JITSI_VIDEOBRIDGE_COMPONENT_SECRET/g" /tmp/vnctalk-jitsi-meet.cfg.lua
   EXTCONFERENCEFULLHOSTNAME=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'EXTERNAL_PROSODY_CONFERENCE_FULL_HOSTNAME')
   sed -i "s/EXTCONFERENCEFULLHOSTNAME/$EXTCONFERENCEFULLHOSTNAME/g" /tmp/vnctalk-jitsi-meet.cfg.lua
   cp /tmp/vnctalk-jitsi-meet.cfg.lua /etc/prosody/conf.d/vnctalk-jitsi-meet.cfg.lua

   cp /usr/share/ztalk/conf.templates/vnc_hybrid_authenticator.cfg.template "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg"
   crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'AUTH' 'UserAuthentication_Shared_Secret' "$AUTHENTICATION_SHARED_SECRET"
   zimbraPreAuthKey=$(crudini --get "/etc/zimbra-talk/dconfig.d/$zimbraDefaultDomainName.cfg" "domain:$zimbraDefaultDomainName" 'zimbraPreAuthKey') 2>/dev/null
   crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'ZIMBRA_SOAP' 'zimbra_soap_preauth_key' "$zimbraPreAuthKey"
   ZURL=$(crudini --get "/etc/zimbra-talk/dconfig.d/$zimbraDefaultDomainName.cfg" "domain:$zimbraDefaultDomainName" 'ZIMBRA_URL') 2>/dev/null
   crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'ZIMBRA_SOAP' 'zimbra_soap_url' "$ZURL/service/soap"

   crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'LDAP' 'Server' "$ldaphost"
   DLdapBase=$(echo "ou=people,dc=$zimbraDefaultDomainName" | sed 's/\./,dc=/g' )
   crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'LDAP' 'Base' "$DLdapBase"
   crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'LDAP' 'BindPass' "$ldappw"
   crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'LDAP' 'BindDN' "$ldapdn"

   crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'MIDDLEWARE' 'middleware_url' "$ZURL/VNCMiddleware/rest"
   crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'MIDDLEWARE' 'middleware_appname' "$MIDDLEWARE_APPNAME"
   crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'MIDDLEWARE' 'zimbra_admin_passwd' "$MIDDLEWARE_ZIMBRA_ADMIN_PASSWD"
   crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'MIDDLEWARE' 'zimbra_host' "$MIDDLEWARE_MIDDLEWARE_ZIMBRA_HOST"
   crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'EXTERNAL_USER' 'external_domain' "$EXTERNAL_LOGIN_FULL_DOMAIN"
   sed -i "s/ = /=/g" "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg"
   cp "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" /etc/zimbra-talk/

   # shellcheck disable=SC2012
   INIDOMAINS=$(ls -1 /etc/zimbra-talk/dconfig.d/ | sed 's/\.cfg$//g'| grep -v "^$zimbraDefaultDomainName$")
   for domain in $INIDOMAINS; do
      echo "generating configs for $domain"
      rosterfilter=$(crudini --get "/etc/zimbra-talk/dconfig.d/$domain.cfg" "domain:$domain" "RosterFilter")
      if [ "$rosterfilter" = "manual" ]
      then
        cp /usr/share/ztalk/conf.templates/prosody-virtual-host.cfg.lua.template "/tmp/$domain.cfg.lua"
      else
         cp /usr/share/ztalk/conf.templates/prosody-virtual-host-auto.cfg.lua.template "/tmp/$domain.cfg.lua"
      fi
      sed -i "s/XMPP_FULL_DOMAIN/$domain/g" "/tmp/$domain.cfg.lua"
      sed -i "s/PROSODY_ADMIN1/$PROSODY_ADMIN1/g" "/tmp/$domain.cfg.lua"
      sed -i "s/PROSODY_ADMIN2/$PROSODY_ADMIN2/g" "/tmp/$domain.cfg.lua"
      sed -i "s/LDAP_SERVER/$ldaphost/g" "/tmp/$domain.cfg.lua"
      sed -i "s/LDAP_BINDPASS/$ldappw/g" "/tmp/$domain.cfg.lua"
      sed -i "s/LDAP_BINDDN/$ldapdn/g" "/tmp/$domain.cfg.lua"
      sed -i "s/LDAP_FILTER/$rosterfilter/g" "/tmp/$domain.cfg.lua"
      sed -i "s/LDAP_FILTER/\&/g" "/tmp/$domain.cfg.lua"
      sed -i "s/TURN_CREDENTIALS/$TURN_CREDENTIALS/g" "/tmp/$domain.cfg.lua"
      sed -i "s/TURN_HOST/$TURN_HOST/g" "/tmp/$domain.cfg.lua"
      sed -i "s/TURN_PORT/$TURN_PORT/g" "/tmp/$domain.cfg.lua"
      sed -i "s/EXTERNAL_LOGIN_FULL_DOMAIN/$EXTERNAL_LOGIN_FULL_DOMAIN/g" "/tmp/$domain.cfg.lua"
      sed -i "s/PROSODY_AUTH_FULL_HOSTNAME/$PROSODY_AUTH_FULL_HOSTNAME/g" "/tmp/$domain.cfg.lua"
      sed -i "s/PROSODY_FOCUS_FULL_HOSTNAME/$PROSODY_FOCUS_FULL_HOSTNAME/g" "/tmp/$domain.cfg.lua"
      sed -i "s/PROSODY_CONFERENCE_FULL_HOSTNAME/conference.$domain/g" "/tmp/$domain.cfg.lua"
      sed -i "s/MUC_COMPONENT_SECRET/$MUC_COMPONENT_SECRET/g" "/tmp/$domain.cfg.lua"
      cp "/tmp/$domain.cfg.lua" "/etc/prosody/conf.d/$domain.cfg.lua"

      cp /usr/share/ztalk/conf.templates/vnc_hybrid_authenticator.cfg.template "/tmp/$domain-vnc_hybrid_authenticator.cfg"
      crudini --set "/tmp/$domain-vnc_hybrid_authenticator.cfg" 'AUTH' 'UserAuthentication_Shared_Secret' "$AUTHENTICATION_SHARED_SECRET"
      zimbraPreAuthKey=$(crudini --get "/etc/zimbra-talk/dconfig.d/$domain.cfg" "domain:$domain" 'zimbraPreAuthKey') 2>/dev/null
      crudini --set "/tmp/$domain-vnc_hybrid_authenticator.cfg" 'ZIMBRA_SOAP' 'zimbra_soap_preauth_key' "$zimbraPreAuthKey"
      ZURL=$(crudini --get "/etc/zimbra-talk/dconfig.d/$domain.cfg" "domain:$domain" 'ZIMBRA_URL') 2>/dev/null
      crudini --set "/tmp/$domain-vnc_hybrid_authenticator.cfg" 'ZIMBRA_SOAP' 'zimbra_soap_url' "$ZURL/service/soap"

      crudini --set "/tmp/$domain-vnc_hybrid_authenticator.cfg" 'LDAP' 'Server' "$ldaphost"
      DLdapBase=$(echo "ou=people,dc=$domain" | sed 's/\./,dc=/g' )
      crudini --set "/tmp/$domain-vnc_hybrid_authenticator.cfg" 'LDAP' 'Base' "$DLdapBase"
      crudini --set "/tmp/$domain-vnc_hybrid_authenticator.cfg" 'LDAP' 'BindPass' "$ldappw"
      crudini --set "/tmp/$domain-vnc_hybrid_authenticator.cfg" 'LDAP' 'BindDN' "$ldapdn"

      crudini --set "/tmp/$domain-vnc_hybrid_authenticator.cfg" 'MIDDLEWARE' 'middleware_url' "$ZURL/VNCMiddleware/rest"
      crudini --set "/tmp/$domain-vnc_hybrid_authenticator.cfg" 'MIDDLEWARE' 'middleware_appname' "$MIDDLEWARE_APPNAME"
      crudini --set "/tmp/$domain-vnc_hybrid_authenticator.cfg" 'MIDDLEWARE' 'zimbra_admin_passwd' "$MIDDLEWARE_ZIMBRA_ADMIN_PASSWD"
      crudini --set "/tmp/$domain-vnc_hybrid_authenticator.cfg" 'MIDDLEWARE' 'zimbra_host' "$MIDDLEWARE_MIDDLEWARE_ZIMBRA_HOST"
      crudini --set "/tmp/$domain-vnc_hybrid_authenticator.cfg" 'EXTERNAL_USER' 'external_domain' "$EXTERNAL_LOGIN_FULL_DOMAIN"
      cp "/tmp/$domain-vnc_hybrid_authenticator.cfg" /etc/zimbra-talk/

      mkdir -p /etc/zimbra-talk/dns.d

      echo "txt-record=_xmppconnect.$domain,\"_xmpp-client-xbosh=https://$PROSODY_FULL_HOSTNAME:443/http-bind\"
txt-record=_xmppconnect.external.$domain,\"_xmpp-client-xbosh=https://$PROSODY_FULL_HOSTNAME:443/http-bind\"
srv-host=_xmpp-client._tcp.$domain,$PROSODY_FULL_HOSTNAME,5222
srv-host=_xmpp-server._tcp.$domain,$PROSODY_FULL_HOSTNAME,5269
" > "/etc/zimbra-talk/dns.d/$domain.dnsmasq.conf"

      echo "_xmppconnect.$domain.       300     IN      TXT     \"_xmpp-client-xbosh=https://$PROSODY_FULL_HOSTNAME:443/http-bind\"
_xmppconnect.external.$domain.            300     IN      TXT     \"_xmpp-client-xbosh=https://$PROSODY_FULL_HOSTNAME:443/http-bind\"
_xmpp-client._tcp.$domain.                   300     IN      SRV 0       5       5222    $PROSODY_FULL_HOSTNAME.
_xmpp-server._tcp.$domain.                   300     IN      SRV 0       5       5269    $PROSODY_FULL_HOSTNAME.
" > "/etc/zimbra-talk/dns.d/$domain.bind.conf"

   done

}

function remove_unused_configs() {
   PROSODYCFGS=$(find /etc/prosody/conf.d/ -iname "*cfg.lua" -printf '%f\n' | grep -v "vnctalk-jitsi-meet.cfg.lua" | grep -v "localhost.cfg.lua")
   echo "$PROSODYCFGS" | sed 's/\.cfg.lua//g'| while IFS= read -r cfgfiledomain
   do
      if [ ! -e "/etc/zimbra-talk/dconfig.d/$cfgfiledomain.cfg" ]; then
         echo "removing configs for undesired domain $cfgfiledomain"
         rm "/etc/prosody/conf.d/$cfgfiledomain.cfg.lua"
         rm "/etc/zimbra-talk/$cfgfiledomain-vnc_hybrid_authenticator.cfg"
         rm "/etc/zimbra-talk/dns.d/$cfgfiledomain.bind.conf"
         rm "/etc/zimbra-talk/dns.d/$cfgfiledomain.dnsmasq.conf"
      fi
   done
}

initfetch
update-ini-domains
OLD_MESSAGE_EXPIRY=$(grep "archive_expires_after" /etc/prosody/prosody.cfg.lua | awk -F "\"" '{print $2}')
OLD_MESSAGE_EXPIRYLINE=$(grep "archive_expires_after" /etc/prosody/prosody.cfg.lua)
# shellcheck disable=SC2001
NEW_MESSAGE_EXPIRYLINE=$(echo "$OLD_MESSAGE_EXPIRYLINE" | sed "s/$OLD_MESSAGE_EXPIRY/$PROSODY_MESSAGE_EXPIRY/g")
sed -i "s/$OLD_MESSAGE_EXPIRYLINE/$NEW_MESSAGE_EXPIRYLINE/g"  /etc/prosody/prosody.cfg.lua
update-prosody-from-ini
remove_unused_configs
if [ -f "/etc/security/limits.d/talk.limits.conf" ]; then
   MAXFD=$(awk '{print $4}' /etc/security/limits.d/talk.limits.conf | sort | tail -1)
fi

cat -s /etc/zimbra-talk/talk.defaults.cfg > /tmp/talk.defaults.swap
mv /tmp/talk.defaults.swap /etc/zimbra-talk/talk.defaults.cfg
