#!/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)