Files
freeipa/ipa-admintools/ipa-radiusclientmod
T
John Dennis d98686e967 Add radius profile implementations:
get_radius_profile_by_uid
  add_radius_profile
  update_radius_profile
  delete_radius_profile
  find_radius_profiles

Rewrite command line arg handling, now support pair entry, interactive
mode with auto completion, reading pairs from a file, better handling
of mandatory values, better help, long arg names now match attribute
name in pairs

Establish mappings for all attributes and names used in clients and
profiles

Add notion of containers to radius clients and profiles in LDAP

Move common code, variables, constants, and strings into the files
radius_client.py, radius_util.py, ipautil.py to eliminate redundant
elements which could get out of sync if modified and to provide access
to other code which might benefit from using these items in the
future.

Add utility functions:
  format_list()
  parse_key_value_pairs()

Add utility class:
  AttributeValueCompleter

Unify attribute usage in radius ldap schema
2007-11-21 13:11:10 -05:00

160 lines
5.4 KiB
Python

#! /usr/bin/python -E
# Authors: John Dennis <jdennis@redhat.com>
#
# Copyright (C) 2007 Red Hat
# see file 'COPYING' for use and warranty information
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; version 2 only
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
import sys
import os
from optparse import OptionParser
from ipa.radius_client import *
import ipa.ipaclient as ipaclient
import ipa.ipautil as ipautil
import ipa.config
import ipa.ipaerror
import ipa.radius_util as radius_util
import xmlrpclib
import kerberos
import ldap
#------------------------------------------------------------------------------
attrs = radius_util.client_name_to_ldap_attr.keys()
mandatory_attrs = ['Client-IP-Address']
#------------------------------------------------------------------------------
def help_option_callback(option, opt_str, value, parser, *args, **kwargs):
parser.print_help()
print
print "Valid interative attributes are:"
print ipautil.format_list(attrs, quote='"')
print
print "Required attributes are:"
print ipautil.format_list(mandatory_attrs, quote='"')
sys.exit(0)
#------------------------------------------------------------------------------
def main():
opt_parser = OptionParser(add_help_option=False)
opt_parser.add_option("-h", "--help", action="callback", callback=help_option_callback,
help="detailed help information")
opt_parser.add_option("-i", "--interactive", dest="interactive", action='store_true', default=False,
help="interactive mode, prompts with auto-completion")
opt_parser.add_option("-n", "--name", dest="name",
help="RADIUS client name")
opt_parser.add_option("-t", "--type", dest="nastype",
help="RADIUS client NAS Type")
opt_parser.add_option("-d", "--description", dest="desc",
help="description of the RADIUS client")
#FIXME interactive vs. non-interactive usage
opt_parser.set_usage("Usage: %s [options] %s" % (os.path.basename(sys.argv[0]), ' '.join(mandatory_attrs)))
#FIXME, map options name to our name?
#FIXME if mandatory is on command line remove it from mandatory passed to completer
args = ipa.config.init_config(sys.argv)
options, args = opt_parser.parse_args(args)
if options.interactive:
c = ipautil.AttributeValueCompleter(attrs)
c.open()
pairs = c.get_pairs("Enter: ", mandatory_attrs, validate)
c.close()
else:
pairs = {}
if False and len(args) != 2:
print "wrong number of arguments"
opt_parser.print_help()
sys.exit(1)
pairs['Client-IP-Address'] = args[1]
pairs['Secret'] = args[2]
if options.name: pairs['Name'] = options.name
if options.nastype: pairs['NAS-Type'] = options.nastype
if options.desc: pairs['Description'] = options.desc
for name,value in pairs.items():
if not validate(name, value): return 1
ip_addr = args[1]
radius_client = ipa.radius_client.RadiusClient()
ipa_client = ipaclient.IPAClient()
try:
#radius_client = ipa_client.get_radius_client_by_ip_addr(ip_addr)
dn = radius_util.radius_client_dn(ip_addr, 'dc=ipatest,dc=jrd')
print dn
radius_client = ipa_client.get_entry_by_dn(dn)
pass
except ipa.ipaerror.exception_for(ipa.ipaerror.LDAP_NOT_FOUND):
print "client %s not found" % ip_addr
return 1
except ipa.ipaerror.IPAError, e:
print "%s" % e.message
return 1
except kerberos.GSSError, e:
print "Could not initialize GSSAPI: %s/%s" % (e[0][0][0], e[0][1][0])
return 1
sys.exit(0)
if options.secret:
secret = options.secret
if not validate_secret(secret): return 1
radius_client.setValue('radiusClientSecret', secret)
if options.name:
name = options.name
if not validate_name(name): return 1
radius_client.setValue('radiusClientShortName', name)
if options.nastype:
nastype = options.nastype
if not validate_nastype(nastype): return 1
radius_client.setValue('radiusClientNASType', nastype)
if options.desc:
desc = options.desc
if not validate_desc(desc): return 1
radius_client.setValue('description', desc)
try:
ipa_client.update_radius_client(radius_client)
print "successfully modified"
except xmlrpclib.Fault, f:
print f.faultString
return 1
except kerberos.GSSError, e:
print "Could not initialize GSSAPI: %s/%s" % (e[0][0][0], e[0][1][0])
return 1
except xmlrpclib.ProtocolError, e:
print "Unable to connect to IPA server: %s" % (e.errmsg)
return 1
except ipa.ipaerror.IPAError, e:
print "%s" % (e.message)
return 1
return 0
if __name__ == "__main__":
sys.exit(main())