|
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)
|