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 (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 package com.sun.dhcpmgr.cli.dhcpconfig;
  26 
  27 import com.sun.dhcpmgr.cli.common.DhcpCliFunction;
  28 import com.sun.dhcpmgr.data.IPAddress;
  29 import com.sun.dhcpmgr.data.Network;
  30 import com.sun.dhcpmgr.data.ValidationException;
  31 import com.sun.dhcpmgr.data.StandardOptions;
  32 
  33 /**
  34  * The main class for the "configure network" functionality of dhcpconfig.
  35  */
  36 public class ConfigureNetwork extends DhcpCfgFunction {
  37 
  38     /**
  39      * The valid options associated with configuring a network.
  40      */
  41     static final int supportedOptions[] = {
  42         DhcpCfg.SUBNET_MASK,
  43         DhcpCfg.POINT_TO_POINT,
  44         DhcpCfg.ROUTER_ADDRESSES,
  45         DhcpCfg.NIS_DOMAIN,
  46         DhcpCfg.NIS_ADDRESSES,
  47         DhcpCfg.SIGHUP
  48     };
  49 
  50     /**
  51      * The address of the network to configure.
  52      */
  53     String address;
  54 
  55     /**
  56      * Constructs a ConfigureNetwork object.
  57      * @param address the address of the network to configure
  58      */
  59     public ConfigureNetwork(String address) {
  60 
  61         validOptions = supportedOptions;
  62         this.address = address;
  63 
  64     } // constructor
  65 
  66     /**
  67      * Returns the option flag for this function.
  68      * @returns the option flag for this function.
  69      */
  70     public int getFunctionFlag() {
  71         return (DhcpCfg.CONFIGURE_NETWORK);
  72     }
  73 
  74     /**
  75      * Executes the "configure network" functionality.
  76      * @return DhcpCfg.SUCCESS or DhcpCfg.FAILURE
  77      */
  78     public int execute() {
  79 
  80         // Make sure that server is configured as a DHCP server.
  81         //
  82         if (!isServerConfigured()) {
  83             return (DhcpCfg.FAILURE);
  84         }
  85 
  86         // Check the validity of the data store version.
  87         //
  88         if (!isVersionValid(false)) {
  89             return (DhcpCfg.FAILURE);
  90         }
  91 
  92         // Validate the network address
  93         //
  94         Network network;
  95         try {
  96             network = getNetMgr().getNetwork(address);
  97         } catch (Throwable e) {
  98             Object [] arguments = new Object[1];
  99             arguments[0] = address;
 100             printErrMessage(getString("cfgnet_invalid_network_error"),
 101                 arguments);
 102             return (DhcpCfg.FAILURE);
 103         }
 104 
 105         // Determine/validate the subnet mask.
 106         //
 107         IPAddress netmask = null;
 108         String mask = options.valueOf(DhcpCfg.SUBNET_MASK);
 109         if (mask != null) {
 110             try {
 111                 netmask = new IPAddress(mask);
 112                 network.setMask(netmask);
 113             } catch (ValidationException e) {
 114                 Object [] arguments = new Object[1];
 115                 arguments[0] = address;
 116                 printErrMessage(getString("cfgnet_invalid_ip_error"),
 117                     arguments);
 118                 return (DhcpCfg.FAILURE);
 119             }
 120         }
 121 
 122         boolean isLan = !options.isSet(DhcpCfg.POINT_TO_POINT);
 123 
 124         // Get the list of router addresses
 125         //
 126         IPAddressList routers = null;
 127         if (options.isSet(DhcpCfg.ROUTER_ADDRESSES)) {
 128             try {
 129                 String addrs = options.valueOf(DhcpCfg.ROUTER_ADDRESSES);
 130                 routers = new IPAddressList(addrs);
 131             } catch (ValidationException e) {
 132                 printErrMessage(getMessage(e));
 133                 return (DhcpCfg.FAILURE);
 134             }
 135         }
 136 
 137         // Get the NIS info.
 138         //
 139         String nisDomain = options.valueOf(DhcpCfg.NIS_DOMAIN);
 140         String nisServers = options.valueOf(DhcpCfg.NIS_ADDRESSES);
 141         if ((nisDomain == null) != (nisServers == null)) {
 142             String msg = getString("cfgnet_nis_error");
 143             throw new IllegalArgumentException(msg);
 144         }
 145 
 146         IPAddressList nisAddresses = null;
 147         try {
 148             if (nisDomain == null) {
 149                 nisDomain = getSvcMgr().getStringOption(
 150                     StandardOptions.CD_NIS_DOMAIN, "");
 151             }
 152             if (nisServers != null) {
 153                 nisAddresses = new IPAddressList(nisServers);
 154             } else {
 155                 nisAddresses = new IPAddressList(
 156                     getSvcMgr().getIPOption(StandardOptions.CD_NIS_SERV, ""));
 157             }
 158         } catch (ValidationException e) {
 159             Object [] arguments = new Object[1];
 160             arguments[0] = getMessage(e);
 161             printErrMessage(getString("cfgnet_nis_server_error"), arguments);
 162             return (DhcpCfg.FAILURE);
 163         } catch (Throwable e) {
 164             // Ignore, NIS info will not be configured in the network macro.
 165         }
 166 
 167         // Create the network macro in the dhcptab
 168         //
 169         try {
 170             IPAddress[] routersArray = null;
 171             if (routers != null) {
 172                 routersArray = routers.toIPAddressArray();
 173             }
 174             getDhcptabMgr().createNetworkMacro(network, routersArray,
 175                 isLan, nisDomain, nisAddresses);
 176             Object [] arguments = new Object[1];
 177             arguments[0] = network.toString();
 178             printMessage(getString("cfgnet_network_macro_progress"),
 179                 arguments);
 180         } catch (Throwable e) {
 181             Object [] arguments = new Object[1];
 182             arguments[0] = getMessage(e);
 183             printErrMessage(getString("cfgnet_network_macro_error"),
 184                 arguments);
 185             return (DhcpCfg.FAILURE);
 186         }
 187 
 188 
 189         // Create the network table for this network
 190         //
 191         try {
 192             getNetMgr().createNetwork(network.toString());
 193             printMessage(getString("cfgnet_network_table_progress"));
 194         } catch (Throwable e) {
 195             Object [] arguments = new Object[1];
 196             arguments[0] = getMessage(e);
 197             printErrMessage(getString("cfgnet_network_table_error"),
 198                 arguments);
 199             return (DhcpCfg.FAILURE);
 200         }
 201 
 202         // Signal the server if the user asked us to
 203         try {
 204             if (options.isSet(DhcpCfg.SIGHUP)) {
 205                 getSvcMgr().reload();
 206             }
 207         } catch (Throwable e) {
 208             printErrMessage(getString("sighup_failed"));
 209             return (DhcpCfg.FAILURE);
 210         }
 211 
 212         return (DhcpCfg.SUCCESS);
 213 
 214     } // execute
 215 
 216 } // ConfigureNetwork