#!/usr/bin/python3
#
# Univention S4 Connector
#  List all rejected objects
#
# SPDX-FileCopyrightText: 2004-2025 Univention GmbH
# SPDX-License-Identifier: AGPL-3.0-only


import sys

import ldap

import univention
import univention.config_registry
import univention.s4connector
import univention.s4connector.s4


CONFIGBASENAME = "connector"


def usage():
    print("")
    print("This is univention-connector-list-rejected")
    print("")
    print("Univention-connector-list-rejected tries to summarize the objects which are rejected due to sync failures")
    print("")
    print("Usage:")
    print("univention-connector-list-rejected [-c configbase]")
    print("")
    print("The default configbase is \"s4connector\".")


if len(sys.argv) > 1:
    if sys.argv[1] in ['-h', '--help', '-?']:
        usage()
        sys.exit(0)
    if sys.argv[1] == '-c':
        if len(sys.argv) != 3:
            print("ERROR: option \"-c\" needs an argument!")
            usage()
            sys.exit(1)
        else:
            CONFIGBASENAME = sys.argv[2]
            print("use configbase %s" % CONFIGBASENAME)


def main():
    configRegistry = univention.config_registry.ConfigRegistry()
    configRegistry.load()

    s4 = univention.s4connector.s4.s4.main(configRegistry, CONFIGBASENAME)
    try:
        s4.init_ldap_connections()
    except ldap.SERVER_DOWN as exc:
        print('WARNING: LDAP server could not be reached: %s' % (exc,), file=sys.stderr)

    found_rejected = False
    i = 1
    print("\nUCS rejected\n")
    for filename, dn in s4.list_rejected_ucs():
        found_rejected = True
        print("%5d:   UCS DN: %s" % (i, dn))
        s4_dn = s4.get_dn_by_ucs(dn)
        if s4_dn:
            print("          S4 DN: %s" % s4_dn)
        else:
            print("          S4 DN: <not found>")
        print("         Filename: %s\n" % filename)
        i += 1

    i = 1
    print("\nS4 rejected\n")
    for _id, dn in s4.list_rejected():
        found_rejected = True
        print("%5d:    S4 DN: %s" % (i, dn))
        ucs_dn = s4.get_dn_by_con(dn)
        if ucs_dn:
            print("         UCS DN: %s" % ucs_dn)
        else:
            print("         UCS DN: <not found>")
        i += 1

    if not found_rejected:
        print("\nThere may be no rejected DNs if the connector is in progress, to be\nsure stop the connector before running this script.\n")

    print("\n\tlast synced USN: %s" % s4.get_lastUSN())


if __name__ == "__main__":
    main()
