Blame utils/getent.py

Packit 6bd9ab
#!/usr/bin/env python
Packit 6bd9ab
# coding: utf-8
Packit 6bd9ab
Packit 6bd9ab
# getent.py - program for querying nslcd
Packit 6bd9ab
#
Packit 6bd9ab
# Copyright (C) 2013-2017 Arthur de Jong
Packit 6bd9ab
#
Packit 6bd9ab
# This library is free software; you can redistribute it and/or
Packit 6bd9ab
# modify it under the terms of the GNU Lesser General Public
Packit 6bd9ab
# License as published by the Free Software Foundation; either
Packit 6bd9ab
# version 2.1 of the License, or (at your option) any later version.
Packit 6bd9ab
#
Packit 6bd9ab
# This library is distributed in the hope that it will be useful,
Packit 6bd9ab
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6bd9ab
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6bd9ab
# Lesser General Public License for more details.
Packit 6bd9ab
#
Packit 6bd9ab
# You should have received a copy of the GNU Lesser General Public
Packit 6bd9ab
# License along with this library; if not, write to the Free Software
Packit 6bd9ab
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit 6bd9ab
# 02110-1301 USA
Packit 6bd9ab
Packit 6bd9ab
import argparse
Packit 6bd9ab
import re
Packit 6bd9ab
import socket
Packit 6bd9ab
import struct
Packit 6bd9ab
import sys
Packit 6bd9ab
Packit 6bd9ab
from cmdline import VersionAction
Packit 6bd9ab
from nslcd import NslcdClient
Packit 6bd9ab
import constants
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
epilog = '''
Packit 6bd9ab
supported databases:
Packit 6bd9ab
  aliases, ethers, group, group.bymember, hosts, hostsv4, hostsv6,
Packit 6bd9ab
  netgroup, netgroup.norec, networks, networksv4, networksv6, passwd,
Packit 6bd9ab
  protocols, rpc, services, shadow
Packit 6bd9ab
Packit 6bd9ab
Report bugs to <%s>.
Packit 6bd9ab
'''.strip() % constants.PACKAGE_BUGREPORT
Packit 6bd9ab
Packit 6bd9ab
# set up command line parser
Packit 6bd9ab
parser = argparse.ArgumentParser(
Packit 6bd9ab
    formatter_class=argparse.RawDescriptionHelpFormatter,
Packit 6bd9ab
    description='Query information in %s via nslcd.' %
Packit 6bd9ab
    constants.MODULE_NAME.upper(),
Packit 6bd9ab
    epilog=epilog)
Packit 6bd9ab
parser.add_argument('-V', '--version', action=VersionAction)
Packit 6bd9ab
parser.add_argument('database', metavar='DATABASE',
Packit 6bd9ab
                    help='any database supported by nslcd')
Packit 6bd9ab
parser.add_argument('keys', metavar='KEY', nargs='*',
Packit 6bd9ab
                    help='filter returned database values by key')
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def write_aliases(con):
Packit 6bd9ab
    while con.get_response() == constants.NSLCD_RESULT_BEGIN:
Packit 6bd9ab
        print('%-16s%s' % (
Packit 6bd9ab
                con.read_string() + ': ',
Packit 6bd9ab
                ', '.join(con.read_stringlist()),
Packit 6bd9ab
            ))
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def getent_aliases(database, keys=None):
Packit 6bd9ab
    if not keys:
Packit 6bd9ab
        write_aliases(NslcdClient(constants.NSLCD_ACTION_ALIAS_ALL))
Packit 6bd9ab
        return
Packit 6bd9ab
    for key in keys:
Packit 6bd9ab
        con = NslcdClient(constants.NSLCD_ACTION_ALIAS_BYNAME)
Packit 6bd9ab
        con.write_string(key)
Packit 6bd9ab
        write_aliases(con)
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def write_ethers(con):
Packit 6bd9ab
    while con.get_response() == constants.NSLCD_RESULT_BEGIN:
Packit 6bd9ab
        name = con.read_string()
Packit 6bd9ab
        ether = con.read_ether()
Packit 6bd9ab
        print('%s %s' % (ether, name))
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def getent_ethers(database, keys=None):
Packit 6bd9ab
    if not keys:
Packit 6bd9ab
        write_ethers(NslcdClient(constants.NSLCD_ACTION_ETHER_ALL))
Packit 6bd9ab
        return
Packit 6bd9ab
    for key in keys:
Packit 6bd9ab
        if re.match('^[0-9a-fA-F]{1,2}(:[0-9a-fA-F]{1,2}){5}$', key):
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_ETHER_BYETHER)
Packit 6bd9ab
            con.write_ether(key)
Packit 6bd9ab
        else:
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_ETHER_BYNAME)
Packit 6bd9ab
            con.write_string(key)
Packit 6bd9ab
        write_ethers(con)
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def write_group(con):
Packit 6bd9ab
    while con.get_response() == constants.NSLCD_RESULT_BEGIN:
Packit 6bd9ab
        print('%s:%s:%d:%s' % (
Packit 6bd9ab
                con.read_string(),
Packit 6bd9ab
                con.read_string(),
Packit 6bd9ab
                con.read_int32(),
Packit 6bd9ab
                ','.join(con.read_stringlist()),
Packit 6bd9ab
            ))
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def getent_group(database, keys=None):
Packit 6bd9ab
    if not keys:
Packit 6bd9ab
        write_group(NslcdClient(constants.NSLCD_ACTION_GROUP_ALL))
Packit 6bd9ab
        return
Packit 6bd9ab
    for key in keys:
Packit 6bd9ab
        if database == 'group.bymember':
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_GROUP_BYMEMBER)
Packit 6bd9ab
            con.write_string(key)
Packit 6bd9ab
        elif re.match('^\d+$', key):
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_GROUP_BYGID)
Packit 6bd9ab
            con.write_int32(int(key))
Packit 6bd9ab
        else:
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_GROUP_BYNAME)
Packit 6bd9ab
            con.write_string(key)
Packit 6bd9ab
        write_group(con)
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def _get_ipv4(value):
Packit 6bd9ab
    try:
Packit 6bd9ab
        return socket.inet_pton(socket.AF_INET, value)
Packit 6bd9ab
    except socket.error:
Packit 6bd9ab
        return None
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def _get_ipv6(value):
Packit 6bd9ab
    try:
Packit 6bd9ab
        return socket.inet_pton(socket.AF_INET6, value)
Packit 6bd9ab
    except socket.error:
Packit 6bd9ab
        return None
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def _get_af(database):
Packit 6bd9ab
    if database.endswith('v4'):
Packit 6bd9ab
        return socket.AF_INET
Packit 6bd9ab
    elif database.endswith('v6'):
Packit 6bd9ab
        return socket.AF_INET6
Packit 6bd9ab
    else:
Packit 6bd9ab
        return None
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def write_hosts(con, db_af):
Packit 6bd9ab
    while con.get_response() == constants.NSLCD_RESULT_BEGIN:
Packit 6bd9ab
        names = ' '.join([con.read_string()] + con.read_stringlist())
Packit 6bd9ab
        for af, address in con.read_addresslist():
Packit 6bd9ab
            if db_af in (af, None):
Packit 6bd9ab
                print('%-15s %s' % (address, names))
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def getent_hosts(database, keys=None):
Packit 6bd9ab
    db_af = _get_af(database)
Packit 6bd9ab
    if not keys:
Packit 6bd9ab
        write_hosts(NslcdClient(constants.NSLCD_ACTION_HOST_ALL), db_af)
Packit 6bd9ab
        return
Packit 6bd9ab
    for key in keys:
Packit 6bd9ab
        ipv4_addr = _get_ipv4(key)
Packit 6bd9ab
        ipv6_addr = _get_ipv6(key)
Packit 6bd9ab
        if ipv4_addr and db_af in (socket.AF_INET, None):
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_HOST_BYADDR)
Packit 6bd9ab
            con.write_address(socket.AF_INET, ipv4_addr)
Packit 6bd9ab
        elif ipv6_addr and db_af in (socket.AF_INET6, None):
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_HOST_BYADDR)
Packit 6bd9ab
            con.write_address(socket.AF_INET6, ipv6_addr)
Packit 6bd9ab
        else:
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_HOST_BYNAME)
Packit 6bd9ab
            con.write_string(key)
Packit 6bd9ab
        write_hosts(con, db_af)
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def _read_netgroup(con):
Packit 6bd9ab
    """Read netgroup name, members and tripples from stream."""
Packit 6bd9ab
    name = con.read_string()
Packit 6bd9ab
    members = []
Packit 6bd9ab
    tripples = []
Packit 6bd9ab
    while True:
Packit 6bd9ab
        member_type = con.read_int32()
Packit 6bd9ab
        if member_type == constants.NSLCD_NETGROUP_TYPE_NETGROUP:
Packit 6bd9ab
            members.append(con.read_string())
Packit 6bd9ab
        elif member_type == constants.NSLCD_NETGROUP_TYPE_TRIPLE:
Packit 6bd9ab
            tripples.append((
Packit 6bd9ab
                    con.read_string(), con.read_string(),
Packit 6bd9ab
                    con.read_string()
Packit 6bd9ab
                ))
Packit 6bd9ab
        else:
Packit 6bd9ab
            break
Packit 6bd9ab
    return name, members, tripples
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def _get_getgroups(con, recurse, netgroups=None):
Packit 6bd9ab
    if netgroups is None:
Packit 6bd9ab
        netgroups = {}
Packit 6bd9ab
    while con.get_response() == constants.NSLCD_RESULT_BEGIN:
Packit 6bd9ab
        name, members, tripples = _read_netgroup(con)
Packit 6bd9ab
        if not recurse:
Packit 6bd9ab
            yield (name, members, tripples)
Packit 6bd9ab
        else:
Packit 6bd9ab
            netgroups[name] = None
Packit 6bd9ab
            for netgroup in members:
Packit 6bd9ab
                if netgroup not in netgroups:
Packit 6bd9ab
                    con2 = NslcdClient(constants.NSLCD_ACTION_NETGROUP_BYNAME)
Packit 6bd9ab
                    con2.write_string(netgroup)
Packit 6bd9ab
                    all(_get_getgroups(con2, recurse, netgroups))
Packit 6bd9ab
                if netgroups.get(netgroup, None) is not None:
Packit 6bd9ab
                    tripples += netgroups[netgroup][1]
Packit 6bd9ab
            netgroups[name] = (members, tripples)
Packit 6bd9ab
            yield (name, [], tripples)
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def write_netgroup(con, recurse):
Packit 6bd9ab
    for name, members, tripples in _get_getgroups(con, recurse):
Packit 6bd9ab
        print('%-15s %s' % (name, ' '.join(
Packit 6bd9ab
                members +
Packit 6bd9ab
                ['(%s, %s, %s)' % (host, user, domain)
Packit 6bd9ab
                 for host, user, domain in tripples]
Packit 6bd9ab
            )))
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def getent_netgroup(database, keys=None):
Packit 6bd9ab
    recurse = database == 'netgroup'
Packit 6bd9ab
    if not keys:
Packit 6bd9ab
        write_netgroup(
Packit 6bd9ab
            NslcdClient(constants.NSLCD_ACTION_NETGROUP_ALL), recurse)
Packit 6bd9ab
        return
Packit 6bd9ab
    for key in keys:
Packit 6bd9ab
        con = NslcdClient(constants.NSLCD_ACTION_NETGROUP_BYNAME)
Packit 6bd9ab
        con.write_string(key)
Packit 6bd9ab
        write_netgroup(con, recurse)
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def write_networks(con, db_af):
Packit 6bd9ab
    while con.get_response() == constants.NSLCD_RESULT_BEGIN:
Packit 6bd9ab
        names = ' '.join([con.read_string()] + con.read_stringlist())
Packit 6bd9ab
        for af, address in con.read_addresslist():
Packit 6bd9ab
            if db_af in (af, None):
Packit 6bd9ab
                print('%-22s %s' % (names, address))
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def getent_networks(database, keys=None):
Packit 6bd9ab
    db_af = _get_af(database)
Packit 6bd9ab
    if not keys:
Packit 6bd9ab
        write_networks(NslcdClient(constants.NSLCD_ACTION_NETWORK_ALL), db_af)
Packit 6bd9ab
        return
Packit 6bd9ab
    for key in keys:
Packit 6bd9ab
        ipv4_addr = _get_ipv4(key)
Packit 6bd9ab
        ipv6_addr = _get_ipv6(key)
Packit 6bd9ab
        if ipv4_addr and db_af in (socket.AF_INET, None):
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_NETWORK_BYADDR)
Packit 6bd9ab
            con.write_address(socket.AF_INET, ipv4_addr)
Packit 6bd9ab
        elif ipv6_addr and db_af in (socket.AF_INET6, None):
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_NETWORK_BYADDR)
Packit 6bd9ab
            con.write_address(socket.AF_INET6, ipv6_addr)
Packit 6bd9ab
        else:
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_NETWORK_BYNAME)
Packit 6bd9ab
            con.write_string(key)
Packit 6bd9ab
        write_networks(con, db_af)
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def write_passwd(con):
Packit 6bd9ab
    while con.get_response() == constants.NSLCD_RESULT_BEGIN:
Packit 6bd9ab
        print('%s:%s:%d:%d:%s:%s:%s' % (
Packit 6bd9ab
                con.read_string(),
Packit 6bd9ab
                con.read_string(),
Packit 6bd9ab
                con.read_int32(),
Packit 6bd9ab
                con.read_int32(),
Packit 6bd9ab
                con.read_string(),
Packit 6bd9ab
                con.read_string(),
Packit 6bd9ab
                con.read_string(),
Packit 6bd9ab
            ))
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def getent_passwd(database, keys=None):
Packit 6bd9ab
    if not keys:
Packit 6bd9ab
        write_passwd(NslcdClient(constants.NSLCD_ACTION_PASSWD_ALL))
Packit 6bd9ab
        return
Packit 6bd9ab
    for key in keys:
Packit 6bd9ab
        if re.match('^\d+$', key):
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_PASSWD_BYUID)
Packit 6bd9ab
            con.write_int32(int(key))
Packit 6bd9ab
        else:
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_PASSWD_BYNAME)
Packit 6bd9ab
            con.write_string(key)
Packit 6bd9ab
        write_passwd(con)
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def write_protocols(con):
Packit 6bd9ab
    while con.get_response() == constants.NSLCD_RESULT_BEGIN:
Packit 6bd9ab
        name = con.read_string()
Packit 6bd9ab
        aliases = con.read_stringlist()
Packit 6bd9ab
        number = con.read_int32()
Packit 6bd9ab
        print('%-21s %d %s' % (name, number, ' '.join(aliases)))
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def getent_protocols(database, keys=None):
Packit 6bd9ab
    if not keys:
Packit 6bd9ab
        write_protocols(NslcdClient(constants.NSLCD_ACTION_PROTOCOL_ALL))
Packit 6bd9ab
        return
Packit 6bd9ab
    for key in keys:
Packit 6bd9ab
        if re.match('^\d+$', key):
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_PROTOCOL_BYNUMBER)
Packit 6bd9ab
            con.write_int32(int(key))
Packit 6bd9ab
        else:
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_PROTOCOL_BYNAME)
Packit 6bd9ab
            con.write_string(key)
Packit 6bd9ab
        write_protocols(con)
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def write_rpc(con):
Packit 6bd9ab
    while con.get_response() == constants.NSLCD_RESULT_BEGIN:
Packit 6bd9ab
        name = con.read_string()
Packit 6bd9ab
        aliases = con.read_stringlist()
Packit 6bd9ab
        number = con.read_int32()
Packit 6bd9ab
        print('%-15s %d  %s' % (name, number, ' '.join(aliases)))
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def getent_rpc(database, keys=None):
Packit 6bd9ab
    if not keys:
Packit 6bd9ab
        write_rpc(NslcdClient(constants.NSLCD_ACTION_RPC_ALL))
Packit 6bd9ab
        return
Packit 6bd9ab
    for key in keys:
Packit 6bd9ab
        if re.match('^\d+$', key):
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_RPC_BYNUMBER)
Packit 6bd9ab
            con.write_int32(int(key))
Packit 6bd9ab
        else:
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_RPC_BYNAME)
Packit 6bd9ab
            con.write_string(key)
Packit 6bd9ab
        write_rpc(con)
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def write_services(con):
Packit 6bd9ab
    while con.get_response() == constants.NSLCD_RESULT_BEGIN:
Packit 6bd9ab
        name = con.read_string()
Packit 6bd9ab
        aliases = con.read_stringlist()
Packit 6bd9ab
        number = con.read_int32()
Packit 6bd9ab
        protocol = con.read_string()
Packit 6bd9ab
        print('%-21s %d/%s %s' % (name, number, protocol, ' '.join(aliases)))
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def getent_services(database, keys=None):
Packit 6bd9ab
    if not keys:
Packit 6bd9ab
        write_services(NslcdClient(constants.NSLCD_ACTION_SERVICE_ALL))
Packit 6bd9ab
        return
Packit 6bd9ab
    for key in keys:
Packit 6bd9ab
        value = key
Packit 6bd9ab
        protocol = ''
Packit 6bd9ab
        if '/' in value:
Packit 6bd9ab
            value, protocol = value.split('/', 1)
Packit 6bd9ab
        if re.match('^\d+$', value):
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_SERVICE_BYNUMBER)
Packit 6bd9ab
            con.write_int32(int(value))
Packit 6bd9ab
            con.write_string(protocol)
Packit 6bd9ab
        else:
Packit 6bd9ab
            con = NslcdClient(constants.NSLCD_ACTION_SERVICE_BYNAME)
Packit 6bd9ab
            con.write_string(value)
Packit 6bd9ab
            con.write_string(protocol)
Packit 6bd9ab
        write_services(con)
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def _shadow_value2str(number):
Packit 6bd9ab
    return str(number) if number != -1 else ''
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def write_shadow(con):
Packit 6bd9ab
    while con.get_response() == constants.NSLCD_RESULT_BEGIN:
Packit 6bd9ab
        print('%s:%s:%s:%s:%s:%s:%s:%s:%s' % (
Packit 6bd9ab
                con.read_string(),
Packit 6bd9ab
                con.read_string(),
Packit 6bd9ab
                _shadow_value2str(con.read_int32()),
Packit 6bd9ab
                _shadow_value2str(con.read_int32()),
Packit 6bd9ab
                _shadow_value2str(con.read_int32()),
Packit 6bd9ab
                _shadow_value2str(con.read_int32()),
Packit 6bd9ab
                _shadow_value2str(con.read_int32()),
Packit 6bd9ab
                _shadow_value2str(con.read_int32()),
Packit 6bd9ab
                _shadow_value2str(con.read_int32()),
Packit 6bd9ab
            ))
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
def getent_shadow(database, keys=None):
Packit 6bd9ab
    if not keys:
Packit 6bd9ab
        write_shadow(NslcdClient(constants.NSLCD_ACTION_SHADOW_ALL))
Packit 6bd9ab
        return
Packit 6bd9ab
    for key in keys:
Packit 6bd9ab
        con = NslcdClient(constants.NSLCD_ACTION_SHADOW_BYNAME)
Packit 6bd9ab
        con.write_string(key)
Packit 6bd9ab
        write_shadow(con)
Packit 6bd9ab
Packit 6bd9ab
Packit 6bd9ab
if __name__ == '__main__':
Packit 6bd9ab
    args = parser.parse_args()
Packit 6bd9ab
    try:
Packit 6bd9ab
        if args.database == 'aliases':
Packit 6bd9ab
            getent_aliases(args.database, args.keys)
Packit 6bd9ab
        elif args.database == 'ethers':
Packit 6bd9ab
            getent_ethers(args.database, args.keys)
Packit 6bd9ab
        elif args.database in ('group', 'group.bymember'):
Packit 6bd9ab
            getent_group(args.database, args.keys)
Packit 6bd9ab
        elif args.database in ('hosts', 'hostsv4', 'hostsv6'):
Packit 6bd9ab
            getent_hosts(args.database, args.keys)
Packit 6bd9ab
        elif args.database in ('netgroup', 'netgroup.norec'):
Packit 6bd9ab
            getent_netgroup(args.database, args.keys)
Packit 6bd9ab
        elif args.database in ('networks', 'networksv4', 'networksv6'):
Packit 6bd9ab
            getent_networks(args.database, args.keys)
Packit 6bd9ab
        elif args.database == 'passwd':
Packit 6bd9ab
            getent_passwd(args.database, args.keys)
Packit 6bd9ab
        elif args.database == 'protocols':
Packit 6bd9ab
            getent_protocols(args.database, args.keys)
Packit 6bd9ab
        elif args.database == 'rpc':
Packit 6bd9ab
            getent_rpc(args.database, args.keys)
Packit 6bd9ab
        elif args.database == 'services':
Packit 6bd9ab
            getent_services(args.database, args.keys)
Packit 6bd9ab
        elif args.database == 'shadow':
Packit 6bd9ab
            getent_shadow(args.database, args.keys)
Packit 6bd9ab
        else:
Packit 6bd9ab
            parser.error('Unknown database: %s' % args.database)
Packit 6bd9ab
    except struct.error:
Packit 6bd9ab
        print('Problem communicating with nslcd')
Packit 6bd9ab
        sys.exit(1)