enm.c revision 6ba597c56d749c61b4f783157f63196d7b2445f0
1N/A * The contents of this file are subject to the terms of the 1N/A * Common Development and Distribution License (the "License"). 1N/A * You may not use this file except in compliance with the License. 1N/A * See the License for the specific language governing permissions 1N/A * and limitations under the License. 1N/A * When distributing Covered Code, include this CDDL HEADER in each 1N/A * If applicable, add the following below this CDDL HEADER, with the 1N/A * fields enclosed by brackets "[]" replaced with your own identifying 1N/A * information: Portions Copyright [yyyy] [name of copyright owner] 1N/A * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 1N/A * Use is subject to license terms. 1N/A * enm.c - contains routines which handle ENM (external network modifier) 1N/A * abstraction. ENMs represent scripts or services that can be activated either 1N/A * manually or in response to network conditions. 1N/A * Walk all ENMs, creating init events for each. 1N/A * Walk all ENMs, creating fini events for each. 1N/A /* It's legal for a conditional ENM to not specify "enabled" */ 1N/A "activation mode value");
1N/A "activation mode value");
1N/A /* object_name was malloc() before this thread was created, free() it */ 1N/A * We're starting if current state is offline* and stopping otherwise. 1N/A * If we're stopping, it's not an error for no script to 1N/A "nwamd_enm_activate_deactivate_thread: " 1N/A "no script specified for enm %s",
1N/A * The script may take a number of arguments. We need to 1N/A * create a string array consisting of the wrapper command 1N/A * (ctrun), ENM script name, arguments and NULL array 1N/A * terminator. Start with an array of size equal to the 1N/A * string length (since the number of arguments will always 1N/A * be less than this) and shrink array to the actual number 1N/A * of arguments when we have parsed the string. 1N/A * If script execution fails and we're not destroying the 1N/A * object, go to maintenance. 1N/A "execution of '%s' failed for ENM %s",
1N/A * If aux state is "manual disable", we know 1N/A * this was a disable request, otherwise it was 1N/A * _fini request or a condition satisfaction 1N/A * Run start/stop method for ENM in a separate thread. The object lock is not 1N/A * held across threads, so we duplicate the object name for the method 1N/A * execution thread. Returns true if thread is successfully launched. 1N/A * Launch separate thread to wait for execution of script 1N/A * to complete. Do not hold object lock across threads. 1N/A /* "name" will be freed by the newly-created thread. */ 1N/A /* detach thread so that it doesn't become a zombie */ 1N/A * Activate the ENM, either in response to an enable event or conditions 1N/A "FMRI string for ENM %s",
1N/A * Must be a method-based ENM with start (and stop) script(s). 1N/A /* Could not launch method execution thread */ 1N/A * If the method thread was created, we drop the lock to the ENM 1N/A * object without decreasing the reference count, ensuring it will not 1N/A * be destroyed until method execution has completed. 1N/A/* Deactivates the ENM. */ 1N/A * Must be a method-based ENM with start (and stop) script(s). 1N/A * Script execution thread will take care of the rest. 1N/A * If the method thread was created, we drop the lock to the ENM 1N/A * object without decreasing the reference count, ensuring it 1N/A * will not be destroyed until method execution has completed. 1N/A /* Could not launch method execution thread */ 1N/A "nwamd_enm_deactivate: could not retrieve " 1N/A "FMRI string for ENM %s",
1N/A "smf_disable_instance(%s) failed for " 1N/A * If aux state is "manual disable", we know 1N/A * this was a disable request, otherwise it was 1N/A * a _fini request or a condition satisfaction 1N/A /* Only change state if we aren't destroying the ENM */ 1N/A * Determine whether an ENM should be (de)activated. 1N/A "nwamd_enm_check: enable failed " 1N/A "disable failed for enm %s",
1N/A * Event handling functions. 1N/A * If this ENM is ONLINE, and not manual and disabled (since in 1N/A * that case it was online but we've just set enabled = false as part 1N/A * of a disable action), then it is still active but refreshing. 1N/A * Change states to re-activate itself. 1N/A/* Handle ENM finish event */ 1N/A * Simulate a state event so that the state machine can correctly 1N/A * deactivate the ENM and free up the handle. 1N/A * Do not free the handle and object. 1N/A * nwamd_enm_activate_deactivate_thread() and 1N/A * nwamd_enm_deactivate() does this after running the stop script 1N/A * and disabling the FMRI respectively. 1N/A "enm %s already online, nothing to do",
1N/A "enm %s already disabled, nothing to do",
1N/A "unexpected action");
1N/A "ENM %s already in state (%s , %s)",
1N/A * State machine for ENMs.