| Current File : //sbin/nscfg |
#!/usr/bin/python2.7 -SE
#
# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
#
"""
nscfg - The Name Service Switch Administration tool. Use this CLI to
manage name service switch configuration.
"""
import os
import sys
#
# don't import site.py (-S), but do include the desired paths
# Need to avoid unnecessary getpwuid calls in site.py
#
try:
version = (sys.version_info.major, sys.version_info.minor)
sys.path.append(
'/usr/lib/python%s.%s/site-packages' % version)
sys.path.append(
'/usr/lib/python%s.%s/vendor-packages' % version)
except:
pass
import getopt
import gettext
import shutil
import traceback
import time
import subprocess
import optparse
from nss import *
import nss.messages as msg
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def nscfg_usage():
'''Defines parameters and options of the command nscfg.'''
print >> sys.stderr, _("""
Usage:
nscfg subcommand cmd_options
subcommands:
nscfg import [-fnvq] FMRI
nscfg export [-nvq] FMRI
nscfg unconfig [-vq] FMRI
nscfg validate [-vq] FMRI
""")
sys.exit(1)
class NscfgOptionParser(optparse.OptionParser):
def exit(self, status=0, msg=None):
if msg:
sys.stderr.write(msg)
sys.exit(2)
def print_usage(self, file=None):
nscfg_usage()
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Public Command Line functions described in nscfg(1m)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def import_cmd(opts):
"""
Function: import
Description: Populate SMF FMRI properties from legacy Name
Service Switch configuration files.
Parameters:
FMRI - A SMF FMRI representing a name service component
Returns:
0 - Success
1 - Failure
3 - No Configuration
"""
op = NscfgOptionParser()
op.add_option('-f', action='store_true', dest='force', \
default=False, help=optparse.SUPPRESS_HELP)
op.add_option('-n', action='store_true', dest='nowrite', \
default=False, help=optparse.SUPPRESS_HELP)
op.add_option('-v', action='count', dest='verbose', \
default=0, help=optparse.SUPPRESS_HELP)
op.add_option('-q', action='store_true', dest='quiet', \
default=False, help=optparse.SUPPRESS_HELP)
(opt, args) = op.parse_args(opts)
if opt.quiet:
msg.quiet()
if len(args) != 1:
msg.printMsg(msg.Msgs.NSCFG_ERR_OPT_ARGS, None, -1)
nscfg_usage()
fmri = args[0]
obj = create_nss_object(fmri)
if obj == None:
msg.printMsg(msg.Msgs.NSCFG_ERR_ILL_FMRI, fmri, -1)
return 1
if opt.verbose:
obj.verbose(opt.verbose)
if opt.nowrite:
obj.nowrite()
if obj.is_configured() and not opt.force:
return 0
try:
ret = obj.import_to_smf()
if ret == 0:
return 0
if ret > 0:
if opt.verbose:
msg.printMsg(msg.Msgs.NSCFG_ERR_NO_CONFIG, fmri, -1)
return 3
except:
pass
msg.printMsg(msg.Msgs.NSCFG_ERR_IMPORT, fmri, -1)
return 1
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def export_cmd(opts):
"""
Function: export
Description: Export SMF FMRI properties into legacy Name
Service Switch files given an SMF FMRI.
Parameters:
FMRI - A SMF FMRI representing a name service component
Returns:
0 - Success
1 - Failure
2 - No change necessary
"""
op = NscfgOptionParser()
op.add_option('-n', action='store_true', dest='nowrite', \
default=False, help=optparse.SUPPRESS_HELP)
op.add_option('-v', action='count', dest='verbose', \
default=0, help=optparse.SUPPRESS_HELP)
op.add_option('-q', action='store_true', dest='quiet', \
default=False, help=optparse.SUPPRESS_HELP)
(opt, args) = op.parse_args(opts)
if opt.quiet:
msg.quiet()
if len(args) != 1:
msg.printMsg(msg.Msgs.NSCFG_ERR_OPT_ARGS, None, -1)
nscfg_usage()
fmri = args[0]
obj = create_nss_object(fmri)
if obj == None:
msg.printMsg(msg.Msgs.NSCFG_ERR_ILL_FMRI, fmri, -1)
return 1
if opt.verbose:
obj.verbose(opt.verbose)
if opt.nowrite:
return 0
try:
if obj.is_populated():
ret = obj.export_from_smf()
if ret == 0:
return 0
if ret > 0:
if opt.verbose:
msg.printMsg(msg.Msgs.NSCFG_ERR_NO_CHANGE, fmri, -1)
return 2
else:
if opt.verbose:
msg.printMsg(msg.Msgs.NSCFG_OUT_NO_CONFIG, fmri, -1)
except:
pass
msg.printMsg(msg.Msgs.NSCFG_ERR_EXPORT, fmri, -1)
return 2
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def unconfig_cmd(opts):
"""
Function: unconfig
Description: Unconfigure all SMF FMRI properties for the
given SMF FMRI.
Parameters:
FMRI - A SMF FMRI representing a name service component
Returns:
0 - Success
1 - Failure
"""
op = NscfgOptionParser()
op.add_option('-n', action='store_true', dest='nowrite', \
default=False, help=optparse.SUPPRESS_HELP)
op.add_option('-v', action='count', dest='verbose', \
default=0, help=optparse.SUPPRESS_HELP)
op.add_option('-q', action='store_true', dest='quiet', \
default=False, help=optparse.SUPPRESS_HELP)
(opt, args) = op.parse_args(opts)
if opt.quiet:
msg.quiet()
if len(args) != 1:
msg.printMsg(msg.Msgs.NSCFG_ERR_OPT_ARGS, None, -1)
nscfg_usage()
fmri = args[0]
obj = create_nss_object(fmri)
if obj == None:
msg.printMsg(msg.Msgs.NSCFG_ERR_ILL_FMRI, fmri, -1)
return 1
if opt.verbose:
obj.verbose(opt.verbose)
if opt.nowrite:
return 0
try:
ret = obj.unconfig_smf()
if ret == 0:
return 0
except:
pass
msg.printMsg(msg.Msgs.NSCFG_ERR_UNCONFIG, fmri, -1)
return 1
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def validate_cmd(opts):
"""
Function: validate
Description: Validate the configuration of a given SMF FMRI.
Parameters:
FMRI - A SMF FMRI representing a name service component
Returns:
0 - Success
1 - Failure
"""
op = NscfgOptionParser()
op.add_option('-v', action='count', dest='verbose', \
default=0, help=optparse.SUPPRESS_HELP)
op.add_option('-q', action='store_true', dest='quiet', \
default=False, help=optparse.SUPPRESS_HELP)
(opt, args) = op.parse_args(opts)
if opt.quiet:
msg.quiet()
if len(args) != 1:
msg.printMsg(msg.Msgs.NSCFG_ERR_OPT_ARGS, None, -1)
nscfg_usage()
fmri = args[0]
obj = create_nss_object(fmri)
if obj == None:
msg.printMsg(msg.Msgs.NSCFG_ERR_ILL_FMRI, fmri, -1)
return 1
if opt.verbose:
obj.verbose(opt.verbose)
try:
ret = obj.validate(num_tries=1)
if ret == True:
return 0
except:
pass
msg.printMsg(msg.Msgs.NSCFG_ERR_VALIDATE, fmri, -1)
return 1
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# End of CLI public functions
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def parseCLI(cli_opts_args):
"""Parse command line interface arguments."""
gettext.install("nscfg", "/usr/lib/locale")
if len(cli_opts_args) == 0:
nscfg_usage()
subcommand = cli_opts_args[0]
opts_args = cli_opts_args[1:]
if subcommand == "import":
rc = import_cmd(opts_args)
elif subcommand == "export":
rc = export_cmd(opts_args)
elif subcommand == "unconfig":
rc = unconfig_cmd(opts_args)
elif subcommand == "validate":
rc = validate_cmd(opts_args)
else:
msg.printMsg(msg.Msgs.NSCFG_ERR_ILL_SUBCOMMAND,
subcommand, -1)
nscfg_usage()
return(rc)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def main():
"""main function."""
gettext.install("nscfg", "/usr/lib/locale")
return(parseCLI(sys.argv[1:]))
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if __name__ == "__main__":
try:
RC = main()
except SystemExit, e:
raise e
except:
traceback.print_exc()
sys.exit(1)
sys.exit(RC)