1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*
  23  * ident        "%Z%%M% %I%     %E% SMI"
  24  *
  25  * Copyright (c) 2001 by Sun Microsystems, Inc.
  26  * All rights reserved.
  27  */
  28 package com.sun.dhcpmgr.cli.common;
  29 
  30 import com.sun.dhcpmgr.data.DhcpDatastore;
  31 import com.sun.dhcpmgr.data.Option;
  32 import com.sun.dhcpmgr.data.StandardOptions;
  33 import com.sun.dhcpmgr.server.DhcpMgr;
  34 import com.sun.dhcpmgr.server.DhcpMgrImpl;
  35 import com.sun.dhcpmgr.server.DhcpServiceMgr;
  36 import com.sun.dhcpmgr.server.DhcpNetMgr;
  37 import com.sun.dhcpmgr.server.DhcptabMgr;
  38 import com.sun.dhcpmgr.bridge.*;
  39 
  40 import java.lang.IllegalArgumentException;
  41 
  42 /**
  43  * This class is the base class extended by the DHCP CLI subcommand classes.
  44  */
  45 public abstract class DhcpCliFunction {
  46 
  47     /**
  48      * The options for the function.
  49      */
  50     protected DhcpCliOptions options = null;
  51     protected int validOptions[];
  52 
  53     /**
  54      * Handles to the managers.
  55      */
  56     static private DhcpMgr dhcpMgr = null;
  57     static private DhcpNetMgr netMgr = null;
  58     static private DhcptabMgr dhcptabMgr = null;
  59     static private DhcpServiceMgr svcMgr = null;
  60 
  61     /**
  62      * The DhcpDatastore to be used for this function. A value of 'null'
  63      * means to just use DHCP defaults.
  64      */
  65     private DhcpDatastore datastore = null;
  66 
  67     /**
  68      * Constructor.
  69      */
  70     public DhcpCliFunction() {
  71         dhcpMgr = new DhcpMgrImpl();
  72     } // constructor
  73 
  74     /**
  75      * Get a handle to the DhcpNetMgr
  76      * @return an instance of DhcpNetMgr
  77      */
  78     public static DhcpMgr getDhcpMgr() {
  79         return dhcpMgr;
  80     } // getDhcpMgr
  81 
  82     /**
  83      * Get a handle to the DhcpNetMgr
  84      * @return an instance of DhcpNetMgr
  85      */
  86     public static DhcpNetMgr getNetMgr() {
  87         if (netMgr == null) {
  88             netMgr = dhcpMgr.getNetMgr();
  89         }
  90         return netMgr;
  91     } // getNetMgr
  92 
  93     /**
  94      * Get a handle to the DhcptabMgr
  95      * @return an instance of DhcptabMgr
  96      */
  97     public static DhcptabMgr getDhcptabMgr() {
  98         if (dhcptabMgr == null) {
  99             dhcptabMgr = dhcpMgr.getDhcptabMgr();
 100         }
 101         return dhcptabMgr;
 102     } // getDhcptabMgr
 103 
 104     /**
 105      * Get a handle to the DhcpServiceMgr
 106      * @return an instance of DhcpServiceMgr
 107      */
 108     public static DhcpServiceMgr getSvcMgr() {
 109         if (svcMgr == null) {
 110             svcMgr = dhcpMgr.getDhcpServiceMgr();
 111         }
 112         return svcMgr;
 113     } // getSvcMgr
 114 
 115     /**
 116      * Used to execute the subcommand functionality.
 117      */
 118     public abstract int execute()
 119         throws IllegalArgumentException;
 120 
 121     /**
 122      * Returns the option flag for this function.
 123      * @returns the option flag for this function.
 124      */
 125     public abstract int getFunctionFlag();
 126 
 127     /**
 128      * Returns the DhcpDatastore associated with this function.
 129      * @returns the DhcpDatastore associated with this function.
 130      */
 131     public DhcpDatastore getDhcpDatastore() {
 132         return datastore;
 133     } // getDhcpDatastore
 134 
 135     /**
 136      * Sets the DhcpDatastore associated with this function.
 137      * @param ds the data store
 138      */
 139     public void setDhcpDatastore(DhcpDatastore ds) {
 140         datastore = ds;
 141     } // setDhcpDatastore
 142 
 143     /**
 144      * Sets the DhcpDatastore associated with this function.
 145      * @param r the data store resource
 146      * @param l the data store location
 147      * @param a the data store config
 148      */
 149     public void setDhcpDatastore(String r, String l, String a) {
 150         datastore = createDhcpDatastore(r, l, a);
 151     } // setDhcpDatastore
 152 
 153     /**
 154      * Create a DhcpDatastore with the given argument values as attributes.
 155      * @param r the data store resource
 156      * @param l the data store location
 157      * @param a the data store config
 158      * @returns a DhcpDatastore with the given argument values as attributes
 159      * or null if all arguments are null.
 160      */
 161     public DhcpDatastore createDhcpDatastore(String r, String l, String a) {
 162         return this.createDhcpDatastore(r, l, a, -1);
 163     } // createDhcpDatastore
 164 
 165     /**
 166      * Create a DhcpDatastore with the given argument values as attributes.
 167      * @param r the data store resource
 168      * @param l the data store location
 169      * @param a the data store config
 170      * @param v the data store resource version
 171      * @returns a DhcpDatastore with the given argument values as attributes
 172      * or null if all arguments are null.
 173      */
 174     public DhcpDatastore createDhcpDatastore(String r, String l, String a,
 175         int v) {
 176 
 177         DhcpDatastore datastore = null;
 178 
 179         if (r != null || l != null || a != null || v != -1) {
 180             datastore = new DhcpDatastore(r, l, a, v);
 181         }
 182 
 183         return datastore;
 184     } // createDhcpDatastore
 185 
 186     /**
 187      * Used to determine whether or not the data store version is valid.
 188      */
 189     public boolean isVersionValid(boolean ignoreAbsentDefaults) {
 190 
 191         boolean isValid = false;
 192         try {
 193             isValid = getSvcMgr().isVersionCurrent();
 194         
 195             if (!isValid) {
 196                 printCmnErrMessage("need_to_convert_datastore");
 197             }
 198         } catch (NoDefaultsException e) {
 199             if (!ignoreAbsentDefaults) {
 200                 printCmnErrMessage("no_conf_warning");
 201             }
 202             isValid = true;
 203         } catch (Throwable e) {
 204             printCmnErrMessage(e.getMessage());
 205         }
 206 
 207         return isValid;
 208 
 209     } // isVersionValid
 210 
 211     /**
 212      * Used to set the read the STANDARD options from the DHCP inittab and
 213      * to initialize the StandardOptions table with these options.
 214      */
 215     public void setStandardOptions() {
 216         try {
 217            StandardOptions.setAllOptions(getSvcMgr().getInittabOptions(
 218                 Option.ctxts[Option.STANDARD].getCode()));
 219         } catch (Throwable e) {
 220             printCmnErrMessage(e.getMessage());
 221         }
 222     } // setStandardOptions
 223 
 224     /**
 225      * Used to set the options for this function. Validates that the options
 226      * received were only options that are legitimate for this subcommand.
 227      * @param options the options object built as a result of parsing
 228      * command line input.
 229      */
 230     public void setOptions(DhcpCliOptions options)
 231         throws IllegalArgumentException {
 232 
 233         options.validate(validOptions);
 234         this.options = options;
 235 
 236     } // setOptions
 237 
 238     /**
 239      * Uses the resourceKey to retrieve a string from a ResourceBundle (if
 240      * one exists) and prints the string to the console.
 241      * @param resourceKey the ResourceBundle key value.
 242      */
 243     public void printCmnMessage(String resourceKey) {
 244         DhcpCliPrint.printMessage(ResourceStrings.getString(resourceKey));
 245     } // printMessage
 246 
 247     /**
 248      * Uses the resourceKey to retrieve a string from a ResourceBundle (if
 249      * one exists) and prints the string to the console error stream.
 250      * @param resourceKey the ResourceBundle key value.
 251      */
 252     public void printCmnErrMessage(String resourceKey) {
 253         DhcpCliPrint.printErrMessage(ResourceStrings.getString(resourceKey));
 254     } // printErrMessage
 255 
 256     /**
 257      * Given a Throwable object, returns a message for it.
 258      * @param e the Throwable object.
 259      * @returns a message.
 260      */
 261     public static String getMessage(Throwable e) {
 262         String message = e.getMessage();
 263         if (message == null) {
 264             message = e.toString();
 265         }
 266         return message;
 267     } // getMessage
 268 
 269 } // DhcpCliFunction